@uipath/apollo-react 6.26.0 → 6.28.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 (67) hide show
  1. package/dist/canvas/components/AgentCanvas/AgentFlow.cjs +4 -3
  2. package/dist/canvas/components/AgentCanvas/AgentFlow.d.ts.map +1 -1
  3. package/dist/canvas/components/AgentCanvas/AgentFlow.js +4 -3
  4. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.cjs +13 -9
  5. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.d.ts.map +1 -1
  6. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.js +13 -9
  7. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.cjs +1 -1
  8. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.d.ts +2 -0
  9. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.d.ts.map +1 -1
  10. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.js +1 -1
  11. package/dist/canvas/components/BaseCanvas/BaseCanvas.cjs +27 -3
  12. package/dist/canvas/components/BaseCanvas/BaseCanvas.d.ts.map +1 -1
  13. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.cjs +21 -3
  14. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.d.ts +1 -0
  15. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.d.ts.map +1 -1
  16. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.js +18 -3
  17. package/dist/canvas/components/BaseCanvas/BaseCanvas.js +28 -4
  18. package/dist/canvas/components/BaseCanvas/BaseCanvas.stories.fixtures.cjs +87 -0
  19. package/dist/canvas/components/BaseCanvas/BaseCanvas.stories.fixtures.d.ts +4 -0
  20. package/dist/canvas/components/BaseCanvas/BaseCanvas.stories.fixtures.d.ts.map +1 -0
  21. package/dist/canvas/components/BaseCanvas/BaseCanvas.stories.fixtures.js +53 -0
  22. package/dist/canvas/components/BaseCanvas/BaseCanvas.types.d.ts.map +1 -1
  23. package/dist/canvas/components/BaseCanvas/ReadOnlyNodesContext.cjs +30 -3
  24. package/dist/canvas/components/BaseCanvas/ReadOnlyNodesContext.d.ts +3 -0
  25. package/dist/canvas/components/BaseCanvas/ReadOnlyNodesContext.d.ts.map +1 -1
  26. package/dist/canvas/components/BaseCanvas/ReadOnlyNodesContext.js +21 -3
  27. package/dist/canvas/components/BaseCanvas/index.cjs +43 -32
  28. package/dist/canvas/components/BaseCanvas/index.d.ts +1 -1
  29. package/dist/canvas/components/BaseCanvas/index.d.ts.map +1 -1
  30. package/dist/canvas/components/BaseCanvas/index.js +2 -2
  31. package/dist/canvas/components/BaseCanvas/useReadOnlyConnectionCallbacks.cjs +87 -0
  32. package/dist/canvas/components/BaseCanvas/useReadOnlyConnectionCallbacks.d.ts +13 -0
  33. package/dist/canvas/components/BaseCanvas/useReadOnlyConnectionCallbacks.d.ts.map +1 -0
  34. package/dist/canvas/components/BaseCanvas/useReadOnlyConnectionCallbacks.js +53 -0
  35. package/dist/canvas/components/BaseNode/BaseNode.cjs +2 -14
  36. package/dist/canvas/components/BaseNode/BaseNode.d.ts.map +1 -1
  37. package/dist/canvas/components/BaseNode/BaseNode.js +2 -14
  38. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.cjs +2 -1
  39. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts +1 -0
  40. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts.map +1 -1
  41. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.js +2 -1
  42. package/dist/canvas/components/LoopNode/LoopNode.cjs +13 -5
  43. package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -1
  44. package/dist/canvas/components/LoopNode/LoopNode.js +13 -5
  45. package/dist/canvas/components/StageNode/StageNode.cjs +15 -11
  46. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  47. package/dist/canvas/components/StageNode/StageNode.js +15 -11
  48. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.cjs +29 -6
  49. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.d.ts.map +1 -1
  50. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.js +29 -6
  51. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.cjs +21 -3
  52. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts.map +1 -1
  53. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.js +21 -3
  54. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.cjs +18 -2
  55. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.d.ts +2 -0
  56. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.d.ts.map +1 -1
  57. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.js +14 -1
  58. package/dist/canvas/storybook-utils/components/StoryPage.d.ts +15 -1
  59. package/dist/canvas/storybook-utils/components/StoryPage.d.ts.map +1 -1
  60. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  61. package/dist/canvas/types.d.ts +1 -0
  62. package/dist/canvas/types.d.ts.map +1 -1
  63. package/dist/canvas/utils/createPreviewGraph.cjs +13 -8
  64. package/dist/canvas/utils/createPreviewGraph.d.ts +5 -2
  65. package/dist/canvas/utils/createPreviewGraph.d.ts.map +1 -1
  66. package/dist/canvas/utils/createPreviewGraph.js +13 -8
  67. package/package.json +1 -1
@@ -43,10 +43,12 @@ const react_cjs_namespaceObject = require("../../xyflow/react.cjs");
43
43
  const external_lucide_react_namespaceObject = require("lucide-react");
44
44
  const external_react_namespaceObject = require("react");
45
45
  const external_BaseCanvas_index_cjs_namespaceObject = require("../BaseCanvas/index.cjs");
46
+ const NodeRegistryProvider_cjs_namespaceObject = require("../../core/NodeRegistryProvider.cjs");
46
47
  const external_types_cjs_namespaceObject = require("../../types.cjs");
47
48
  const props_helpers_cjs_namespaceObject = require("../../utils/props-helpers.cjs");
48
49
  const external_CanvasPositionControls_cjs_namespaceObject = require("../CanvasPositionControls.cjs");
49
50
  const external_StickyNoteNode_index_cjs_namespaceObject = require("../StickyNoteNode/index.cjs");
51
+ const external_agent_flow_manifest_cjs_namespaceObject = require("./agent-flow.manifest.cjs");
50
52
  const PaneContextMenu_cjs_namespaceObject = require("./components/PaneContextMenu.cjs");
51
53
  const SuggestionGroupPanel_cjs_namespaceObject = require("./components/SuggestionGroupPanel.cjs");
52
54
  const TimelinePlayer_cjs_namespaceObject = require("./components/TimelinePlayer.cjs");
@@ -55,8 +57,6 @@ const Edge_cjs_namespaceObject = require("./edges/Edge.cjs");
55
57
  const AgentNode_cjs_namespaceObject = require("./nodes/AgentNode.cjs");
56
58
  const ResourceNode_cjs_namespaceObject = require("./nodes/ResourceNode.cjs");
57
59
  const agent_flow_store_cjs_namespaceObject = require("./store/agent-flow-store.cjs");
58
- const NodeRegistryProvider_cjs_namespaceObject = require("../../core/NodeRegistryProvider.cjs");
59
- const external_agent_flow_manifest_cjs_namespaceObject = require("./agent-flow.manifest.cjs");
60
60
  const ToolbarContainer = styled_default().div`
61
61
  display: flex;
62
62
  align-items: center;
@@ -166,7 +166,7 @@ const createResourceNodeWrapper = (opts)=>(props)=>{
166
166
  suggestionGroupVersion: opts.suggestionGroupVersion
167
167
  });
168
168
  };
169
- const AgentFlowInner = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(({ children, mode, spans, onEnable, onDisable, onAddBreakpoint, onRemoveBreakpoint, onAddGuardrail, onGoToSource, onErrorAction, onAddResource: _onAddResource, onSelectResource, setSpanForSelectedNode, getNodeFromSelectedSpan, onExpandResource, onCollapseResource, agentNodeTranslations, resourceNodeTranslations, stickyNoteNodeTranslations, canvasTranslations, enableTimelinePlayer, canvasRef, enableMcpTools, enableMemory, enableA2a, enableStickyNotes, enableInstructions, healthScore, onHealthScoreClick, suggestionTranslations, suggestionGroup, onAgentNodePositionChange, onResourceNodePositionChange, onOrganize, onUpdateStickyNote, zoomLevel, onZoomLevelChange })=>{
169
+ const AgentFlowInner = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(({ children, mode, readOnlyNodeIds, spans, onEnable, onDisable, onAddBreakpoint, onRemoveBreakpoint, onAddGuardrail, onGoToSource, onErrorAction, onAddResource: _onAddResource, onSelectResource, setSpanForSelectedNode, getNodeFromSelectedSpan, onExpandResource, onCollapseResource, agentNodeTranslations, resourceNodeTranslations, stickyNoteNodeTranslations, canvasTranslations, enableTimelinePlayer, canvasRef, enableMcpTools, enableMemory, enableA2a, enableStickyNotes, enableInstructions, healthScore, onHealthScoreClick, suggestionTranslations, suggestionGroup, onAgentNodePositionChange, onResourceNodePositionChange, onOrganize, onUpdateStickyNote, zoomLevel, onZoomLevelChange })=>{
170
170
  const { nodes, edges, onNodesChange, onEdgesChange, onConnect, autoArrange, setSelectedNodeId, selectedNodeId, setDragging, expandAgent, collapseAgent, createResourcePlaceholder, actOnSuggestionGroup, currentSuggestionIndex, navigateToNextSuggestion, navigateToPreviousSuggestion, addStickyNote, paneContextMenu, openPaneContextMenu, closePaneContextMenu } = (0, agent_flow_store_cjs_namespaceObject.useAgentFlowStore)();
171
171
  const nodeTypesBase = (0, external_react_namespaceObject.useMemo)(()=>({
172
172
  stickyNote: (props)=>/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StickyNoteNode_index_cjs_namespaceObject.StickyNoteNode, {
@@ -449,6 +449,7 @@ const AgentFlowInner = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(({
449
449
  nodeTypes: nodeTypes,
450
450
  edgeTypes: edgeTypes,
451
451
  mode: mode,
452
+ readOnlyNodeIds: readOnlyNodeIds,
452
453
  initialAutoLayout: autoArrange,
453
454
  fitViewOptions: adjustedFitViewOptions,
454
455
  defaultViewport: defaultViewport,
@@ -1 +1 @@
1
- {"version":3,"file":"AgentFlow.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/AgentCanvas/AgentFlow.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI/C,OAAO,EAIL,KAAK,cAAc,EAcpB,MAAM,aAAa,CAAC;AAqsBrB,eAAO,MAAM,SAAS,GAAI,OAAO,iBAAiB,CAAC,cAAc,CAAC,4CAQjE,CAAC"}
1
+ {"version":3,"file":"AgentFlow.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/AgentCanvas/AgentFlow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI/C,OAAO,EAIL,KAAK,cAAc,EAcpB,MAAM,aAAa,CAAC;AAssBrB,eAAO,MAAM,SAAS,GAAI,OAAO,iBAAiB,CAAC,cAAc,CAAC,4CAQjE,CAAC"}
@@ -5,10 +5,12 @@ import { Panel, useReactFlow } from "../../xyflow/react.js";
5
5
  import { StickyNote } from "lucide-react";
6
6
  import { memo, useCallback, useEffect, useMemo, useRef } from "react";
7
7
  import { BaseCanvas } from "../BaseCanvas/index.js";
8
+ import { NodeRegistryProvider } from "../../core/NodeRegistryProvider.js";
8
9
  import { DefaultAgentNodeTranslations, DefaultCanvasTranslations, DefaultResourceNodeTranslations, DefaultStickyNoteNodeTranslations, DefaultSuggestionTranslations, isAgentFlowAgentNode, isAgentFlowResourceNode, isStickyNoteNode } from "../../types.js";
9
10
  import { hasAgentRunning } from "../../utils/props-helpers.js";
10
11
  import { CanvasPositionControls } from "../CanvasPositionControls.js";
11
12
  import { StickyNoteNode } from "../StickyNoteNode/index.js";
13
+ import { agentFlowManifest } from "./agent-flow.manifest.js";
12
14
  import { PaneContextMenu } from "./components/PaneContextMenu.js";
13
15
  import { SuggestionGroupPanel } from "./components/SuggestionGroupPanel.js";
14
16
  import { TimelinePlayer } from "./components/TimelinePlayer.js";
@@ -17,8 +19,6 @@ import { Edge } from "./edges/Edge.js";
17
19
  import { AgentNodeElement } from "./nodes/AgentNode.js";
18
20
  import { ResourceNode } from "./nodes/ResourceNode.js";
19
21
  import { AgentFlowProvider, useAgentFlowStore } from "./store/agent-flow-store.js";
20
- import { NodeRegistryProvider } from "../../core/NodeRegistryProvider.js";
21
- import { agentFlowManifest } from "./agent-flow.manifest.js";
22
22
  const ToolbarContainer = styled.div`
23
23
  display: flex;
24
24
  align-items: center;
@@ -128,7 +128,7 @@ const createResourceNodeWrapper = (opts)=>(props)=>{
128
128
  suggestionGroupVersion: opts.suggestionGroupVersion
129
129
  });
130
130
  };
131
- const AgentFlowInner = /*#__PURE__*/ memo(({ children, mode, spans, onEnable, onDisable, onAddBreakpoint, onRemoveBreakpoint, onAddGuardrail, onGoToSource, onErrorAction, onAddResource: _onAddResource, onSelectResource, setSpanForSelectedNode, getNodeFromSelectedSpan, onExpandResource, onCollapseResource, agentNodeTranslations, resourceNodeTranslations, stickyNoteNodeTranslations, canvasTranslations, enableTimelinePlayer, canvasRef, enableMcpTools, enableMemory, enableA2a, enableStickyNotes, enableInstructions, healthScore, onHealthScoreClick, suggestionTranslations, suggestionGroup, onAgentNodePositionChange, onResourceNodePositionChange, onOrganize, onUpdateStickyNote, zoomLevel, onZoomLevelChange })=>{
131
+ const AgentFlowInner = /*#__PURE__*/ memo(({ children, mode, readOnlyNodeIds, spans, onEnable, onDisable, onAddBreakpoint, onRemoveBreakpoint, onAddGuardrail, onGoToSource, onErrorAction, onAddResource: _onAddResource, onSelectResource, setSpanForSelectedNode, getNodeFromSelectedSpan, onExpandResource, onCollapseResource, agentNodeTranslations, resourceNodeTranslations, stickyNoteNodeTranslations, canvasTranslations, enableTimelinePlayer, canvasRef, enableMcpTools, enableMemory, enableA2a, enableStickyNotes, enableInstructions, healthScore, onHealthScoreClick, suggestionTranslations, suggestionGroup, onAgentNodePositionChange, onResourceNodePositionChange, onOrganize, onUpdateStickyNote, zoomLevel, onZoomLevelChange })=>{
132
132
  const { nodes, edges, onNodesChange, onEdgesChange, onConnect, autoArrange, setSelectedNodeId, selectedNodeId, setDragging, expandAgent, collapseAgent, createResourcePlaceholder, actOnSuggestionGroup, currentSuggestionIndex, navigateToNextSuggestion, navigateToPreviousSuggestion, addStickyNote, paneContextMenu, openPaneContextMenu, closePaneContextMenu } = useAgentFlowStore();
133
133
  const nodeTypesBase = useMemo(()=>({
134
134
  stickyNote: (props)=>/*#__PURE__*/ jsx(StickyNoteNode, {
@@ -411,6 +411,7 @@ const AgentFlowInner = /*#__PURE__*/ memo(({ children, mode, spans, onEnable, on
411
411
  nodeTypes: nodeTypes,
412
412
  edgeTypes: edgeTypes,
413
413
  mode: mode,
414
+ readOnlyNodeIds: readOnlyNodeIds,
414
415
  initialAutoLayout: autoArrange,
415
416
  fitViewOptions: adjustedFitViewOptions,
416
417
  defaultViewport: defaultViewport,
@@ -32,6 +32,7 @@ const react_cjs_namespaceObject = require("../../../xyflow/react.cjs");
32
32
  const external_react_namespaceObject = require("react");
33
33
  const external_types_cjs_namespaceObject = require("../../../types.cjs");
34
34
  const icon_registry_cjs_namespaceObject = require("../../../utils/icon-registry.cjs");
35
+ const ReadOnlyNodesContext_cjs_namespaceObject = require("../../BaseCanvas/ReadOnlyNodesContext.cjs");
35
36
  const BaseNode_cjs_namespaceObject = require("../../BaseNode/BaseNode.cjs");
36
37
  const BaseNodeConfigContext_cjs_namespaceObject = require("../../BaseNode/BaseNodeConfigContext.cjs");
37
38
  const external_FloatingCanvasPanel_index_cjs_namespaceObject = require("../../FloatingCanvasPanel/index.cjs");
@@ -118,6 +119,8 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
118
119
  hasSuccess,
119
120
  hasRunning
120
121
  ]);
122
+ const isNodeReadOnly = (0, ReadOnlyNodesContext_cjs_namespaceObject.useIsNodeReadOnly)(id);
123
+ const canEditNode = 'design' === mode && !isNodeReadOnly;
121
124
  const displayMemory = true === enableMemory && ('design' === mode || 'view' === mode && hasMemory);
122
125
  const displayContext = 'design' === mode || 'view' === mode && hasContext;
123
126
  const displayEscalation = 'design' === mode || 'view' === mode && hasEscalation;
@@ -135,7 +138,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
135
138
  type: 'source',
136
139
  handleType: 'artifact',
137
140
  label: translations.memory,
138
- showButton: 'design' === mode && !hasMemory,
141
+ showButton: canEditNode && !hasMemory,
139
142
  labelBackgroundColor: 'var(--canvas-background-secondary)',
140
143
  visible: displayMemory,
141
144
  onAction: (_e)=>{
@@ -147,7 +150,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
147
150
  type: 'source',
148
151
  handleType: 'artifact',
149
152
  label: translations.escalations,
150
- showButton: 'design' === mode,
153
+ showButton: canEditNode,
151
154
  labelBackgroundColor: 'var(--canvas-background-secondary)',
152
155
  visible: displayEscalation,
153
156
  onAction: (_e)=>{
@@ -165,7 +168,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
165
168
  type: 'source',
166
169
  handleType: 'artifact',
167
170
  label: translations.context,
168
- showButton: 'design' === mode,
171
+ showButton: canEditNode,
169
172
  labelBackgroundColor: 'var(--canvas-background-secondary)',
170
173
  visible: displayContext,
171
174
  onAction: (_e)=>{
@@ -176,7 +179,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
176
179
  type: 'source',
177
180
  handleType: 'artifact',
178
181
  label: translations.tools,
179
- showButton: 'design' === mode,
182
+ showButton: canEditNode,
180
183
  labelBackgroundColor: 'var(--canvas-background-secondary)',
181
184
  visible: displayTool || displayMcp || displayA2a,
182
185
  onAction: (_e)=>{
@@ -193,7 +196,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
193
196
  }
194
197
  return configs;
195
198
  }, [
196
- mode,
199
+ canEditNode,
197
200
  displayContext,
198
201
  displayMemory,
199
202
  displayMcp,
@@ -253,10 +256,11 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
253
256
  const hasContent = hasSystem || hasUser;
254
257
  if (hasContent) return {
255
258
  instructionsFooter: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_AgentNode_styles_cjs_namespaceObject.InstructionsPreview, {
256
- onClick: (e)=>{
259
+ $isInteractive: canEditNode,
260
+ onClick: canEditNode ? (e)=>{
257
261
  e.stopPropagation();
258
262
  onAddInstructions?.();
259
- },
263
+ } : void 0,
260
264
  children: [
261
265
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_AgentNode_styles_cjs_namespaceObject.InstructionsLabel, {
262
266
  children: translations.instructions
@@ -291,7 +295,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
291
295
  }),
292
296
  footerVariant: hasSystem && hasUser ? 'double' : 'single'
293
297
  };
294
- if ('design' !== mode || !onAddInstructions) return {
298
+ if (!canEditNode || !onAddInstructions) return {
295
299
  instructionsFooter: null,
296
300
  footerVariant: 'none'
297
301
  };
@@ -315,7 +319,7 @@ const AgentNodeComponent = /*#__PURE__*/ (0, external_react_namespaceObject.memo
315
319
  }, [
316
320
  enableInstructions,
317
321
  data.instructions,
318
- mode,
322
+ canEditNode,
319
323
  onAddInstructions,
320
324
  translations
321
325
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"AgentNode.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/AgentCanvas/nodes/AgentNode.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAIhF,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA8BlE,UAAU,aAAc,SAAQ,YAAY;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,aAAa,GAAG,KAAK,KAAK,IAAI,CAAC;IAClG,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAEhD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAujBD,eAAO,MAAM,gBAAgB,8CAxDI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,cAAc,6CAwD1B,CAAC;AAEvD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"AgentNode.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/AgentCanvas/nodes/AgentNode.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAIhF,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA8BlE,UAAU,aAAc,SAAQ,YAAY;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,aAAa,GAAG,KAAK,KAAK,IAAI,CAAC;IAClG,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAEhD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAikBD,eAAO,MAAM,gBAAgB,8CAxDI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,cAAc,6CAwD1B,CAAC;AAEvD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
@@ -4,6 +4,7 @@ import { Position } from "../../../xyflow/react.js";
4
4
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
  import { DefaultSuggestionTranslations } from "../../../types.js";
6
6
  import { CanvasIcon } from "../../../utils/icon-registry.js";
7
+ import { useIsNodeReadOnly } from "../../BaseCanvas/ReadOnlyNodesContext.js";
7
8
  import { BaseNode } from "../../BaseNode/BaseNode.js";
8
9
  import { BaseNodeOverrideConfigProvider } from "../../BaseNode/BaseNodeConfigContext.js";
9
10
  import { FloatingCanvasPanel } from "../../FloatingCanvasPanel/index.js";
@@ -90,6 +91,8 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
90
91
  hasSuccess,
91
92
  hasRunning
92
93
  ]);
94
+ const isNodeReadOnly = useIsNodeReadOnly(id);
95
+ const canEditNode = 'design' === mode && !isNodeReadOnly;
93
96
  const displayMemory = true === enableMemory && ('design' === mode || 'view' === mode && hasMemory);
94
97
  const displayContext = 'design' === mode || 'view' === mode && hasContext;
95
98
  const displayEscalation = 'design' === mode || 'view' === mode && hasEscalation;
@@ -107,7 +110,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
107
110
  type: 'source',
108
111
  handleType: 'artifact',
109
112
  label: translations.memory,
110
- showButton: 'design' === mode && !hasMemory,
113
+ showButton: canEditNode && !hasMemory,
111
114
  labelBackgroundColor: 'var(--canvas-background-secondary)',
112
115
  visible: displayMemory,
113
116
  onAction: (_e)=>{
@@ -119,7 +122,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
119
122
  type: 'source',
120
123
  handleType: 'artifact',
121
124
  label: translations.escalations,
122
- showButton: 'design' === mode,
125
+ showButton: canEditNode,
123
126
  labelBackgroundColor: 'var(--canvas-background-secondary)',
124
127
  visible: displayEscalation,
125
128
  onAction: (_e)=>{
@@ -137,7 +140,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
137
140
  type: 'source',
138
141
  handleType: 'artifact',
139
142
  label: translations.context,
140
- showButton: 'design' === mode,
143
+ showButton: canEditNode,
141
144
  labelBackgroundColor: 'var(--canvas-background-secondary)',
142
145
  visible: displayContext,
143
146
  onAction: (_e)=>{
@@ -148,7 +151,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
148
151
  type: 'source',
149
152
  handleType: 'artifact',
150
153
  label: translations.tools,
151
- showButton: 'design' === mode,
154
+ showButton: canEditNode,
152
155
  labelBackgroundColor: 'var(--canvas-background-secondary)',
153
156
  visible: displayTool || displayMcp || displayA2a,
154
157
  onAction: (_e)=>{
@@ -165,7 +168,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
165
168
  }
166
169
  return configs;
167
170
  }, [
168
- mode,
171
+ canEditNode,
169
172
  displayContext,
170
173
  displayMemory,
171
174
  displayMcp,
@@ -225,10 +228,11 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
225
228
  const hasContent = hasSystem || hasUser;
226
229
  if (hasContent) return {
227
230
  instructionsFooter: /*#__PURE__*/ jsxs(InstructionsPreview, {
228
- onClick: (e)=>{
231
+ $isInteractive: canEditNode,
232
+ onClick: canEditNode ? (e)=>{
229
233
  e.stopPropagation();
230
234
  onAddInstructions?.();
231
- },
235
+ } : void 0,
232
236
  children: [
233
237
  /*#__PURE__*/ jsx(InstructionsLabel, {
234
238
  children: translations.instructions
@@ -263,7 +267,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
263
267
  }),
264
268
  footerVariant: hasSystem && hasUser ? 'double' : 'single'
265
269
  };
266
- if ('design' !== mode || !onAddInstructions) return {
270
+ if (!canEditNode || !onAddInstructions) return {
267
271
  instructionsFooter: null,
268
272
  footerVariant: 'none'
269
273
  };
@@ -287,7 +291,7 @@ const AgentNodeComponent = /*#__PURE__*/ memo((props)=>{
287
291
  }, [
288
292
  enableInstructions,
289
293
  data.instructions,
290
- mode,
294
+ canEditNode,
291
295
  onAddInstructions,
292
296
  translations
293
297
  ]);
@@ -91,7 +91,7 @@ const InstructionsPreview = styled_default().div`
91
91
  font-size: 9px;
92
92
  line-height: 13px;
93
93
  color: var(--canvas-foreground-de-emp);
94
- cursor: pointer;
94
+ cursor: ${({ $isInteractive })=>$isInteractive ? 'pointer' : 'default'};
95
95
  `;
96
96
  const InstructionsLine = styled_default().div`
97
97
  white-space: nowrap;
@@ -9,6 +9,8 @@ export declare const InstructionsLabel: import("@emotion/styled").StyledComponen
9
9
  export declare const InstructionsPreview: import("@emotion/styled").StyledComponent<{
10
10
  theme?: import("@emotion/react").Theme;
11
11
  as?: React.ElementType;
12
+ } & {
13
+ $isInteractive: boolean;
12
14
  }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
13
15
  export declare const InstructionsLine: import("@emotion/styled").StyledComponent<{
14
16
  theme?: import("@emotion/react").Theme;
@@ -1 +1 @@
1
- {"version":3,"file":"AgentNode.styles.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/AgentCanvas/nodes/AgentNode.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB;;;qHAuBjC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;yGAK7B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;yGAS/B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;yGAQ5B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;yGAOpC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;yGAMjC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;yGAIhC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;yGAGnC,CAAC;AAEF,eAAO,MAAM,eAAe;;;yGAI3B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;yGAIhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;yGAGhC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;cAA0B,OAAO;yGA0B9D,CAAC;AAEF,eAAO,MAAM,WAAW;;;yGAKvB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;2GAE5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;2GAG5B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;2GAI7B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;2GAY5B,CAAC"}
1
+ {"version":3,"file":"AgentNode.styles.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/AgentCanvas/nodes/AgentNode.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB;;;qHAuBjC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;yGAK7B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;oBAAgC,OAAO;yGAStE,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;yGAQ5B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;yGAOpC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;yGAMjC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;yGAIhC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;yGAGnC,CAAC;AAEF,eAAO,MAAM,eAAe;;;yGAI3B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;yGAIhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;yGAGhC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;cAA0B,OAAO;yGA0B9D,CAAC;AAEF,eAAO,MAAM,WAAW;;;yGAKvB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;2GAE5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;2GAG5B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;2GAI7B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;2GAY5B,CAAC"}
@@ -37,7 +37,7 @@ const InstructionsPreview = styled.div`
37
37
  font-size: 9px;
38
38
  line-height: 13px;
39
39
  color: var(--canvas-foreground-de-emp);
40
- cursor: pointer;
40
+ cursor: ${({ $isInteractive })=>$isInteractive ? 'pointer' : 'default'};
41
41
  `;
42
42
  const InstructionsLine = styled.div`
43
43
  white-space: nowrap;
@@ -36,13 +36,15 @@ const external_CanvasBackground_cjs_namespaceObject = require("./CanvasBackgroun
36
36
  const external_CanvasProviders_cjs_namespaceObject = require("./CanvasProviders.cjs");
37
37
  const external_PanShortcutTeachingUI_cjs_namespaceObject = require("./PanShortcutTeachingUI.cjs");
38
38
  const external_ReadOnlyNodesContext_cjs_namespaceObject = require("./ReadOnlyNodesContext.cjs");
39
+ const external_useReadOnlyConnectionCallbacks_cjs_namespaceObject = require("./useReadOnlyConnectionCallbacks.cjs");
39
40
  const BaseCanvasInnerComponent = (props)=>{
40
41
  const { innerRef, fitViewOptions: fitViewOptionsProps, ...canvasProps } = props;
41
42
  const fitViewOptions = fitViewOptionsProps ?? external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.fitViewOptions;
42
- const { nodes = [], edges = [], nodeTypes, edgeTypes, children, mode = 'view', readOnlyNodeIds, showBackground = true, backgroundColor = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.color, backgroundSecondaryColor = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.bgColor, backgroundVariant = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.variant, backgroundGap = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.gap, backgroundSize = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.size, isDarkMode, locale, minZoom = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.zoom.min, maxZoom = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.zoom.max, defaultViewport = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.defaultViewport, defaultEdgeOptions = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.edge, stickyNoteOptions, onNodesChange, onEdgesChange, onConnect, onConnectStart, onConnectEnd, onNodeClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onPaneClick, onInit, onSelectionChange, onBeforeDelete, proOptions = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.pro, connectionMode = react_cjs_namespaceObject.ConnectionMode.Loose, connectionLineComponent, connectionLineStyle, deleteKeyCode = null, selectNodesOnDrag = true, nodesDraggable = true, nodesConnectable = true, elementsSelectable = true, onlyRenderVisibleElements = true, zoomOnDoubleClick = true, snapToGrid = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.snapToGrid, snapGrid = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.snapGrid, initialAutoLayout, maintainNodesInView, onToolbarAction, breakpoints, panShortcutTeachingUIMessage = 'Hold Space and drag to pan around the canvas!', ...reactFlowProps } = canvasProps;
43
+ const { nodes = [], edges = [], nodeTypes, edgeTypes, children, mode = 'view', readOnlyNodeIds, showBackground = true, backgroundColor = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.color, backgroundSecondaryColor = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.bgColor, backgroundVariant = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.variant, backgroundGap = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.gap, backgroundSize = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.background.size, isDarkMode, locale, minZoom = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.zoom.min, maxZoom = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.zoom.max, defaultViewport = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.defaultViewport, defaultEdgeOptions = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.edge, stickyNoteOptions, onNodesChange, onEdgesChange, onConnect, onReconnect, onReconnectStart, onReconnectEnd, onConnectStart, onConnectEnd, isValidConnection, onNodeClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onPaneClick, onInit, onSelectionChange, onBeforeDelete, proOptions = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.pro, connectionMode = react_cjs_namespaceObject.ConnectionMode.Loose, connectionLineComponent, connectionLineStyle, deleteKeyCode = null, selectNodesOnDrag = true, nodesDraggable = true, nodesConnectable = true, elementsSelectable = true, onlyRenderVisibleElements = true, zoomOnDoubleClick = true, snapToGrid = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.snapToGrid, snapGrid = external_BaseCanvas_constants_cjs_namespaceObject.BASE_CANVAS_DEFAULTS.snapGrid, initialAutoLayout, maintainNodesInView, onToolbarAction, breakpoints, panShortcutTeachingUIMessage = 'Hold Space and drag to pan around the canvas!', ...reactFlowProps } = canvasProps;
43
44
  const isInteractive = 'readonly' !== mode;
44
45
  const isDesignMode = 'design' === mode;
45
46
  const stableReadOnlyNodeIds = (0, external_ReadOnlyNodesContext_cjs_namespaceObject.useStableNodeIdSet)(readOnlyNodeIds);
47
+ const readOnlyEdgeIds = (0, external_BaseCanvas_hooks_cjs_namespaceObject.useReadOnlyEdgeIds)(edges, stableReadOnlyNodeIds);
46
48
  const guardedBeforeDelete = (0, external_BaseCanvas_hooks_cjs_namespaceObject.useReadOnlyBeforeDelete)(stableReadOnlyNodeIds, onBeforeDelete);
47
49
  const handleNodesChange = (0, external_react_namespaceObject.useMemo)(()=>{
48
50
  if (!onNodesChange || 0 === stableReadOnlyNodeIds.size) return onNodesChange;
@@ -55,6 +57,24 @@ const BaseCanvasInnerComponent = (props)=>{
55
57
  onNodesChange,
56
58
  stableReadOnlyNodeIds
57
59
  ]);
60
+ const handleEdgesChange = (0, external_react_namespaceObject.useMemo)(()=>{
61
+ if (!onEdgesChange || 0 === readOnlyEdgeIds.size) return onEdgesChange;
62
+ const guarded = (changes)=>{
63
+ const allowed = changes.filter((change)=>'remove' === change.type ? !readOnlyEdgeIds.has(change.id) : true);
64
+ if (allowed.length > 0) onEdgesChange(allowed);
65
+ };
66
+ return guarded;
67
+ }, [
68
+ onEdgesChange,
69
+ readOnlyEdgeIds
70
+ ]);
71
+ const { guardedIsValidConnection, guardedOnConnect, guardedOnReconnect, guardedOnReconnectEnd } = (0, external_useReadOnlyConnectionCallbacks_cjs_namespaceObject.useReadOnlyConnectionCallbacks)({
72
+ readOnlyNodeIds: stableReadOnlyNodeIds,
73
+ isValidConnection,
74
+ onConnect,
75
+ onReconnect,
76
+ onReconnectEnd
77
+ });
58
78
  const [reactFlowInstance, setReactFlowInstance] = (0, external_react_namespaceObject.useState)();
59
79
  const { isReady } = (0, external_BaseCanvas_hooks_cjs_namespaceObject.useAutoLayout)(nodes, initialAutoLayout, fitViewOptions);
60
80
  const { ensureNodesInView, ensureAllNodesInView, centerNode } = (0, external_BaseCanvas_hooks_cjs_namespaceObject.useEnsureNodesInView)();
@@ -96,6 +116,7 @@ const BaseCanvasInnerComponent = (props)=>{
96
116
  colorMode: '',
97
117
  nodes: nodes,
98
118
  edges: edges,
119
+ isValidConnection: guardedIsValidConnection,
99
120
  nodeTypes: nodeTypes,
100
121
  edgeTypes: edgeTypes,
101
122
  fitViewOptions: fitViewOptions,
@@ -121,9 +142,12 @@ const BaseCanvasInnerComponent = (props)=>{
121
142
  panOnDrag: isInteractive ? external_BaseCanvas_constants_cjs_namespaceObject.PAN_ON_DRAG : false,
122
143
  onInit: handleInit,
123
144
  onNodesChange: isInteractive ? handleNodesChange : void 0,
124
- onEdgesChange: isInteractive ? onEdgesChange : void 0,
145
+ onEdgesChange: isInteractive ? handleEdgesChange : void 0,
125
146
  onBeforeDelete: guardedBeforeDelete,
126
- onConnect: isDesignMode ? onConnect : void 0,
147
+ onConnect: isDesignMode ? guardedOnConnect : void 0,
148
+ onReconnect: isDesignMode ? guardedOnReconnect : void 0,
149
+ onReconnectStart: isDesignMode ? onReconnectStart : void 0,
150
+ onReconnectEnd: isDesignMode ? guardedOnReconnectEnd : void 0,
127
151
  onConnectStart: isDesignMode ? onConnectStart : void 0,
128
152
  onConnectEnd: isDesignMode ? onConnectEnd : void 0,
129
153
  onNodeClick: isInteractive ? onNodeClick : void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCanvas.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/BaseCanvas/BaseCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,IAAI,EACJ,IAAI,EAEL,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAIL,KAAK,YAAY,EAKlB,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAqOzE,eAAO,MAAM,UAAU,EAKjB,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,SAAS,IAAI,GAAG,IAAI,EAC/D,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG;IAC3C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;CACpD,KACE,YAAY,CAAC"}
1
+ {"version":3,"file":"BaseCanvas.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/BaseCanvas/BaseCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,IAAI,EACJ,IAAI,EAEL,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAIL,KAAK,YAAY,EAKlB,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAwQzE,eAAO,MAAM,UAAU,EAKjB,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,SAAS,IAAI,GAAG,IAAI,EAC/D,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG;IAC3C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;CACpD,KACE,YAAY,CAAC"}
@@ -28,11 +28,14 @@ __webpack_require__.d(__webpack_exports__, {
28
28
  useMaintainNodesInView: ()=>useMaintainNodesInView,
29
29
  useEnsureNodesInView: ()=>useEnsureNodesInView,
30
30
  useReadOnlyBeforeDelete: ()=>useReadOnlyBeforeDelete,
31
+ useReadOnlyEdgeIds: ()=>useReadOnlyEdgeIds,
31
32
  useFitView: ()=>useFitView
32
33
  });
33
34
  const react_cjs_namespaceObject = require("../../xyflow/react.cjs");
34
35
  const external_react_namespaceObject = require("react");
35
36
  const external_BaseCanvas_constants_cjs_namespaceObject = require("./BaseCanvas.constants.cjs");
37
+ const external_ReadOnlyNodesContext_cjs_namespaceObject = require("./ReadOnlyNodesContext.cjs");
38
+ const external_set_utils_cjs_namespaceObject = require("./set-utils.cjs");
36
39
  const waitForNodeMeasurements = (getNodes)=>new Promise((resolve)=>{
37
40
  const startTime = Date.now();
38
41
  const timeoutInMs = 500;
@@ -254,12 +257,14 @@ function useReadOnlyBeforeDelete(readOnlyNodeIds, onBeforeDelete) {
254
257
  const vetoedNodeIds = new Set();
255
258
  const deletedNodeIds = new Set();
256
259
  for (const node of candidate.nodes)(readOnlyNodeIds.has(node.id) ? vetoedNodeIds : deletedNodeIds).add(node.id);
257
- if (0 === vetoedNodeIds.size) return candidate;
258
260
  const touchesVetoedNode = (edge)=>vetoedNodeIds.has(edge.source) || vetoedNodeIds.has(edge.target);
259
261
  const touchesDeletedNode = (edge)=>deletedNodeIds.has(edge.source) || deletedNodeIds.has(edge.target);
262
+ const isFrozen = (edge)=>(0, external_ReadOnlyNodesContext_cjs_namespaceObject.isConnectionReadOnly)(readOnlyNodeIds, edge.source, edge.target);
263
+ const keptEdges = candidate.edges.filter((edge)=>!isFrozen(edge) && (!touchesVetoedNode(edge) || touchesDeletedNode(edge)));
264
+ if (0 === vetoedNodeIds.size && keptEdges.length === candidate.edges.length) return candidate;
260
265
  return {
261
266
  nodes: candidate.nodes.filter((node)=>!vetoedNodeIds.has(node.id)),
262
- edges: candidate.edges.filter((edge)=>!touchesVetoedNode(edge) || touchesDeletedNode(edge))
267
+ edges: keptEdges
263
268
  };
264
269
  };
265
270
  }, [
@@ -267,17 +272,30 @@ function useReadOnlyBeforeDelete(readOnlyNodeIds, onBeforeDelete) {
267
272
  onBeforeDelete
268
273
  ]);
269
274
  }
275
+ function useReadOnlyEdgeIds(edges, readOnlyNodeIds) {
276
+ return (0, external_react_namespaceObject.useMemo)(()=>{
277
+ if (0 === readOnlyNodeIds.size) return external_set_utils_cjs_namespaceObject.EMPTY_SET;
278
+ const frozen = new Set();
279
+ for (const edge of edges)if ((0, external_ReadOnlyNodesContext_cjs_namespaceObject.isConnectionReadOnly)(readOnlyNodeIds, edge.source, edge.target)) frozen.add(edge.id);
280
+ return 0 === frozen.size ? external_set_utils_cjs_namespaceObject.EMPTY_SET : frozen;
281
+ }, [
282
+ edges,
283
+ readOnlyNodeIds
284
+ ]);
285
+ }
270
286
  exports.useAutoLayout = __webpack_exports__.useAutoLayout;
271
287
  exports.useEnsureNodesInView = __webpack_exports__.useEnsureNodesInView;
272
288
  exports.useFitView = __webpack_exports__.useFitView;
273
289
  exports.useMaintainNodesInView = __webpack_exports__.useMaintainNodesInView;
274
290
  exports.useReadOnlyBeforeDelete = __webpack_exports__.useReadOnlyBeforeDelete;
291
+ exports.useReadOnlyEdgeIds = __webpack_exports__.useReadOnlyEdgeIds;
275
292
  for(var __rspack_i in __webpack_exports__)if (-1 === [
276
293
  "useAutoLayout",
277
294
  "useEnsureNodesInView",
278
295
  "useFitView",
279
296
  "useMaintainNodesInView",
280
- "useReadOnlyBeforeDelete"
297
+ "useReadOnlyBeforeDelete",
298
+ "useReadOnlyEdgeIds"
281
299
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
282
300
  Object.defineProperty(exports, '__esModule', {
283
301
  value: true
@@ -13,4 +13,5 @@ export declare const useEnsureNodesInView: () => {
13
13
  };
14
14
  export declare const useMaintainNodesInView: (nodeIds?: string[], fitViewOptions?: BaseCanvasFitViewOptions) => void;
15
15
  export declare function useReadOnlyBeforeDelete<NodeType extends Node, EdgeType extends Edge>(readOnlyNodeIds: ReadonlySet<string>, onBeforeDelete: OnBeforeDelete<NodeType, EdgeType> | undefined): OnBeforeDelete<NodeType, EdgeType> | undefined;
16
+ export declare function useReadOnlyEdgeIds<EdgeType extends Edge>(edges: EdgeType[], readOnlyNodeIds: ReadonlySet<string>): ReadonlySet<string>;
16
17
  //# sourceMappingURL=BaseCanvas.hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCanvas.hooks.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/BaseCanvas/BaseCanvas.hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAqB7F,eAAO,MAAM,aAAa,GACxB,OAAO,IAAI,EAAE,GAAG,SAAS,EACzB,oBAAoB,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAC9C,iBAAiB,wBAAwB;;CA+E1C,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,QAAQ,IAAI,EAAE,EACd,QAAQ,MAAM,EACd,iBAAiB,wBAAwB;;CAgC1C,CAAC;AAEF,eAAO,MAAM,oBAAoB;iCAInB,MAAM,EAAE,YAAY,wBAAwB;qCA4B3C,wBAAwB;yBAqB1B,MAAM,YAAY,wBAAwB;CAgCtD,CAAC;AAqCF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAAE,EAClB,iBAAiB,wBAAwB,SAuE1C,CAAC;AAiBF,wBAAgB,uBAAuB,CAAC,QAAQ,SAAS,IAAI,EAAE,QAAQ,SAAS,IAAI,EAClF,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,SAAS,GAC7D,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,SAAS,CA+BhD"}
1
+ {"version":3,"file":"BaseCanvas.hooks.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/BaseCanvas/BaseCanvas.hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAuB7F,eAAO,MAAM,aAAa,GACxB,OAAO,IAAI,EAAE,GAAG,SAAS,EACzB,oBAAoB,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAC9C,iBAAiB,wBAAwB;;CA+E1C,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,QAAQ,IAAI,EAAE,EACd,QAAQ,MAAM,EACd,iBAAiB,wBAAwB;;CAgC1C,CAAC;AAEF,eAAO,MAAM,oBAAoB;iCAInB,MAAM,EAAE,YAAY,wBAAwB;qCA4B3C,wBAAwB;yBAqB1B,MAAM,YAAY,wBAAwB;CAgCtD,CAAC;AAqCF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAAE,EAClB,iBAAiB,wBAAwB,SAuE1C,CAAC;AA2BF,wBAAgB,uBAAuB,CAAC,QAAQ,SAAS,IAAI,EAAE,QAAQ,SAAS,IAAI,EAClF,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,SAAS,GAC7D,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,SAAS,CAqChD;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,SAAS,IAAI,EACtD,KAAK,EAAE,QAAQ,EAAE,EACjB,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GACnC,WAAW,CAAC,MAAM,CAAC,CAWrB"}
@@ -1,6 +1,8 @@
1
1
  import { useReactFlow, useStoreApi } from "../../xyflow/react.js";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import { BASE_CANVAS_DEFAULTS, FIT_VIEW_DELAY_MS } from "./BaseCanvas.constants.js";
4
+ import { isConnectionReadOnly } from "./ReadOnlyNodesContext.js";
5
+ import { EMPTY_SET } from "./set-utils.js";
4
6
  const waitForNodeMeasurements = (getNodes)=>new Promise((resolve)=>{
5
7
  const startTime = Date.now();
6
8
  const timeoutInMs = 500;
@@ -222,12 +224,14 @@ function useReadOnlyBeforeDelete(readOnlyNodeIds, onBeforeDelete) {
222
224
  const vetoedNodeIds = new Set();
223
225
  const deletedNodeIds = new Set();
224
226
  for (const node of candidate.nodes)(readOnlyNodeIds.has(node.id) ? vetoedNodeIds : deletedNodeIds).add(node.id);
225
- if (0 === vetoedNodeIds.size) return candidate;
226
227
  const touchesVetoedNode = (edge)=>vetoedNodeIds.has(edge.source) || vetoedNodeIds.has(edge.target);
227
228
  const touchesDeletedNode = (edge)=>deletedNodeIds.has(edge.source) || deletedNodeIds.has(edge.target);
229
+ const isFrozen = (edge)=>isConnectionReadOnly(readOnlyNodeIds, edge.source, edge.target);
230
+ const keptEdges = candidate.edges.filter((edge)=>!isFrozen(edge) && (!touchesVetoedNode(edge) || touchesDeletedNode(edge)));
231
+ if (0 === vetoedNodeIds.size && keptEdges.length === candidate.edges.length) return candidate;
228
232
  return {
229
233
  nodes: candidate.nodes.filter((node)=>!vetoedNodeIds.has(node.id)),
230
- edges: candidate.edges.filter((edge)=>!touchesVetoedNode(edge) || touchesDeletedNode(edge))
234
+ edges: keptEdges
231
235
  };
232
236
  };
233
237
  }, [
@@ -235,4 +239,15 @@ function useReadOnlyBeforeDelete(readOnlyNodeIds, onBeforeDelete) {
235
239
  onBeforeDelete
236
240
  ]);
237
241
  }
238
- export { useAutoLayout, useEnsureNodesInView, useFitView, useMaintainNodesInView, useReadOnlyBeforeDelete };
242
+ function useReadOnlyEdgeIds(edges, readOnlyNodeIds) {
243
+ return useMemo(()=>{
244
+ if (0 === readOnlyNodeIds.size) return EMPTY_SET;
245
+ const frozen = new Set();
246
+ for (const edge of edges)if (isConnectionReadOnly(readOnlyNodeIds, edge.source, edge.target)) frozen.add(edge.id);
247
+ return 0 === frozen.size ? EMPTY_SET : frozen;
248
+ }, [
249
+ edges,
250
+ readOnlyNodeIds
251
+ ]);
252
+ }
253
+ export { useAutoLayout, useEnsureNodesInView, useFitView, useMaintainNodesInView, useReadOnlyBeforeDelete, useReadOnlyEdgeIds };
@@ -3,18 +3,20 @@ import { ConnectionMode, ReactFlow } from "../../xyflow/react.js";
3
3
  import { forwardRef, memo, useCallback, useImperativeHandle, useMemo, useState } from "react";
4
4
  import { useToolbarActionStore } from "../../hooks/ToolbarActionContext.js";
5
5
  import { BASE_CANVAS_DEFAULTS, PAN_ON_DRAG } from "./BaseCanvas.constants.js";
6
- import { useAutoLayout, useEnsureNodesInView, useMaintainNodesInView, useReadOnlyBeforeDelete } from "./BaseCanvas.hooks.js";
6
+ import { useAutoLayout, useEnsureNodesInView, useMaintainNodesInView, useReadOnlyBeforeDelete, useReadOnlyEdgeIds } from "./BaseCanvas.hooks.js";
7
7
  import { CanvasBackground } from "./CanvasBackground.js";
8
8
  import { CanvasProviders } from "./CanvasProviders.js";
9
9
  import { PanShortcutTeachingUI } from "./PanShortcutTeachingUI.js";
10
10
  import { useStableNodeIdSet } from "./ReadOnlyNodesContext.js";
11
+ import { useReadOnlyConnectionCallbacks } from "./useReadOnlyConnectionCallbacks.js";
11
12
  const BaseCanvasInnerComponent = (props)=>{
12
13
  const { innerRef, fitViewOptions: fitViewOptionsProps, ...canvasProps } = props;
13
14
  const fitViewOptions = fitViewOptionsProps ?? BASE_CANVAS_DEFAULTS.fitViewOptions;
14
- const { nodes = [], edges = [], nodeTypes, edgeTypes, children, mode = 'view', readOnlyNodeIds, showBackground = true, backgroundColor = BASE_CANVAS_DEFAULTS.background.color, backgroundSecondaryColor = BASE_CANVAS_DEFAULTS.background.bgColor, backgroundVariant = BASE_CANVAS_DEFAULTS.background.variant, backgroundGap = BASE_CANVAS_DEFAULTS.background.gap, backgroundSize = BASE_CANVAS_DEFAULTS.background.size, isDarkMode, locale, minZoom = BASE_CANVAS_DEFAULTS.zoom.min, maxZoom = BASE_CANVAS_DEFAULTS.zoom.max, defaultViewport = BASE_CANVAS_DEFAULTS.defaultViewport, defaultEdgeOptions = BASE_CANVAS_DEFAULTS.edge, stickyNoteOptions, onNodesChange, onEdgesChange, onConnect, onConnectStart, onConnectEnd, onNodeClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onPaneClick, onInit, onSelectionChange, onBeforeDelete, proOptions = BASE_CANVAS_DEFAULTS.pro, connectionMode = ConnectionMode.Loose, connectionLineComponent, connectionLineStyle, deleteKeyCode = null, selectNodesOnDrag = true, nodesDraggable = true, nodesConnectable = true, elementsSelectable = true, onlyRenderVisibleElements = true, zoomOnDoubleClick = true, snapToGrid = BASE_CANVAS_DEFAULTS.snapToGrid, snapGrid = BASE_CANVAS_DEFAULTS.snapGrid, initialAutoLayout, maintainNodesInView, onToolbarAction, breakpoints, panShortcutTeachingUIMessage = 'Hold Space and drag to pan around the canvas!', ...reactFlowProps } = canvasProps;
15
+ const { nodes = [], edges = [], nodeTypes, edgeTypes, children, mode = 'view', readOnlyNodeIds, showBackground = true, backgroundColor = BASE_CANVAS_DEFAULTS.background.color, backgroundSecondaryColor = BASE_CANVAS_DEFAULTS.background.bgColor, backgroundVariant = BASE_CANVAS_DEFAULTS.background.variant, backgroundGap = BASE_CANVAS_DEFAULTS.background.gap, backgroundSize = BASE_CANVAS_DEFAULTS.background.size, isDarkMode, locale, minZoom = BASE_CANVAS_DEFAULTS.zoom.min, maxZoom = BASE_CANVAS_DEFAULTS.zoom.max, defaultViewport = BASE_CANVAS_DEFAULTS.defaultViewport, defaultEdgeOptions = BASE_CANVAS_DEFAULTS.edge, stickyNoteOptions, onNodesChange, onEdgesChange, onConnect, onReconnect, onReconnectStart, onReconnectEnd, onConnectStart, onConnectEnd, isValidConnection, onNodeClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onPaneClick, onInit, onSelectionChange, onBeforeDelete, proOptions = BASE_CANVAS_DEFAULTS.pro, connectionMode = ConnectionMode.Loose, connectionLineComponent, connectionLineStyle, deleteKeyCode = null, selectNodesOnDrag = true, nodesDraggable = true, nodesConnectable = true, elementsSelectable = true, onlyRenderVisibleElements = true, zoomOnDoubleClick = true, snapToGrid = BASE_CANVAS_DEFAULTS.snapToGrid, snapGrid = BASE_CANVAS_DEFAULTS.snapGrid, initialAutoLayout, maintainNodesInView, onToolbarAction, breakpoints, panShortcutTeachingUIMessage = 'Hold Space and drag to pan around the canvas!', ...reactFlowProps } = canvasProps;
15
16
  const isInteractive = 'readonly' !== mode;
16
17
  const isDesignMode = 'design' === mode;
17
18
  const stableReadOnlyNodeIds = useStableNodeIdSet(readOnlyNodeIds);
19
+ const readOnlyEdgeIds = useReadOnlyEdgeIds(edges, stableReadOnlyNodeIds);
18
20
  const guardedBeforeDelete = useReadOnlyBeforeDelete(stableReadOnlyNodeIds, onBeforeDelete);
19
21
  const handleNodesChange = useMemo(()=>{
20
22
  if (!onNodesChange || 0 === stableReadOnlyNodeIds.size) return onNodesChange;
@@ -27,6 +29,24 @@ const BaseCanvasInnerComponent = (props)=>{
27
29
  onNodesChange,
28
30
  stableReadOnlyNodeIds
29
31
  ]);
32
+ const handleEdgesChange = useMemo(()=>{
33
+ if (!onEdgesChange || 0 === readOnlyEdgeIds.size) return onEdgesChange;
34
+ const guarded = (changes)=>{
35
+ const allowed = changes.filter((change)=>'remove' === change.type ? !readOnlyEdgeIds.has(change.id) : true);
36
+ if (allowed.length > 0) onEdgesChange(allowed);
37
+ };
38
+ return guarded;
39
+ }, [
40
+ onEdgesChange,
41
+ readOnlyEdgeIds
42
+ ]);
43
+ const { guardedIsValidConnection, guardedOnConnect, guardedOnReconnect, guardedOnReconnectEnd } = useReadOnlyConnectionCallbacks({
44
+ readOnlyNodeIds: stableReadOnlyNodeIds,
45
+ isValidConnection,
46
+ onConnect,
47
+ onReconnect,
48
+ onReconnectEnd
49
+ });
30
50
  const [reactFlowInstance, setReactFlowInstance] = useState();
31
51
  const { isReady } = useAutoLayout(nodes, initialAutoLayout, fitViewOptions);
32
52
  const { ensureNodesInView, ensureAllNodesInView, centerNode } = useEnsureNodesInView();
@@ -68,6 +88,7 @@ const BaseCanvasInnerComponent = (props)=>{
68
88
  colorMode: '',
69
89
  nodes: nodes,
70
90
  edges: edges,
91
+ isValidConnection: guardedIsValidConnection,
71
92
  nodeTypes: nodeTypes,
72
93
  edgeTypes: edgeTypes,
73
94
  fitViewOptions: fitViewOptions,
@@ -93,9 +114,12 @@ const BaseCanvasInnerComponent = (props)=>{
93
114
  panOnDrag: isInteractive ? PAN_ON_DRAG : false,
94
115
  onInit: handleInit,
95
116
  onNodesChange: isInteractive ? handleNodesChange : void 0,
96
- onEdgesChange: isInteractive ? onEdgesChange : void 0,
117
+ onEdgesChange: isInteractive ? handleEdgesChange : void 0,
97
118
  onBeforeDelete: guardedBeforeDelete,
98
- onConnect: isDesignMode ? onConnect : void 0,
119
+ onConnect: isDesignMode ? guardedOnConnect : void 0,
120
+ onReconnect: isDesignMode ? guardedOnReconnect : void 0,
121
+ onReconnectStart: isDesignMode ? onReconnectStart : void 0,
122
+ onReconnectEnd: isDesignMode ? guardedOnReconnectEnd : void 0,
99
123
  onConnectStart: isDesignMode ? onConnectStart : void 0,
100
124
  onConnectEnd: isDesignMode ? onConnectEnd : void 0,
101
125
  onNodeClick: isInteractive ? onNodeClick : void 0,