@digitalsee-ai/rcs 1.1.0 → 1.1.1

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 (83) hide show
  1. package/dist/components/digitalsee/workflow/Canvas/actionItemToNodeData.d.ts +14 -0
  2. package/dist/components/digitalsee/workflow/Canvas/constants.d.ts +1 -15
  3. package/dist/components/digitalsee/workflow/Canvas/constants.test.d.ts +1 -0
  4. package/dist/components/digitalsee/workflow/Canvas/hooks/classicNodeAddConnection.d.ts +31 -0
  5. package/dist/components/digitalsee/workflow/Canvas/hooks/classicNodeAddConnection.test.d.ts +1 -0
  6. package/dist/components/digitalsee/workflow/Canvas/hooks/createNodeAddHandlerNext.d.ts +1 -16
  7. package/dist/components/digitalsee/workflow/Canvas/hooks/useNodeAddCallback.d.ts +4 -17
  8. package/dist/components/digitalsee/workflow/Canvas/hooks/useWorkflowCanvasState.d.ts +3 -1
  9. package/dist/components/digitalsee/workflow/Handles/CustomHandle.d.ts +3 -0
  10. package/dist/components/digitalsee/workflow/Handles/customHandleConnectable.d.ts +35 -0
  11. package/dist/components/digitalsee/workflow/Handles/customHandleConnectable.test.d.ts +1 -0
  12. package/dist/components/digitalsee/workflow/Nodes/ConditionNode.d.ts +1 -1
  13. package/dist/components/digitalsee/workflow/Nodes/SuperBaseNode.d.ts +6 -1
  14. package/dist/components/digitalsee/workflow/Nodes/SwitchNode.d.ts +1 -1
  15. package/dist/components/digitalsee/workflow/Nodes/classicNodePackageNodes.test.d.ts +1 -0
  16. package/dist/components/digitalsee/workflow/Nodes/classicNodePackagePortLayout.d.ts +23 -0
  17. package/dist/components/digitalsee/workflow/Nodes/classicNodePackagePortLayout.test.d.ts +1 -0
  18. package/dist/components/digitalsee/workflow/Nodes/useClassicNodePackagePorts.d.ts +26 -0
  19. package/dist/components/digitalsee/workflow/Nodes/useClassicNodePackagePorts.test.d.ts +1 -0
  20. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/components/EntryTypeSelector.d.ts +8 -0
  21. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/components/NodeCardList.d.ts +19 -0
  22. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/hooks/useCategories.d.ts +5 -2
  23. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/hooks/useConnectableNodeSelector.d.ts +40 -0
  24. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/hooks/useNavigation.d.ts +4 -2
  25. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/hooks/useNavigation.test.d.ts +1 -0
  26. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/hooks/useNodeActionState.d.ts +30 -0
  27. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/hooks/useNodeSelectorPresentation.d.ts +24 -0
  28. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/types.d.ts +19 -1
  29. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableActionLoader.d.ts +16 -0
  30. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableActionLoader.test.d.ts +1 -0
  31. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableFallback.d.ts +2 -0
  32. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableFallback.test.d.ts +1 -0
  33. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableQuery.d.ts +40 -0
  34. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableQuery.test.d.ts +1 -0
  35. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableResponse.d.ts +35 -0
  36. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/connectableResponse.test.d.ts +1 -0
  37. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/dataTransformers.d.ts +13 -2
  38. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/filterEdgeInsertActions.d.ts +62 -0
  39. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/filterEdgeInsertActions.test.d.ts +1 -0
  40. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/nodeAddContext.d.ts +26 -0
  41. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/nodeAddContext.test.d.ts +1 -0
  42. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/queryParams.d.ts +18 -0
  43. package/dist/components/digitalsee/workflow/Panels/ModernNodeSelectorPanel/utils/queryParams.test.d.ts +1 -0
  44. package/dist/components/digitalsee/workflow/api/connectable.test.d.ts +1 -0
  45. package/dist/components/digitalsee/workflow/api/connectable.types.d.ts +75 -0
  46. package/dist/components/digitalsee/workflow/api/dip.types.d.ts +30 -0
  47. package/dist/components/digitalsee/workflow/api/index.d.ts +6 -1
  48. package/dist/components/digitalsee/workflow/config/defaultCanvasEngineConfig.test.d.ts +1 -0
  49. package/dist/components/digitalsee/workflow/config/defaultNodeSelectorConfig.d.ts +9 -0
  50. package/dist/components/digitalsee/workflow/events/eventBus.d.ts +2 -12
  51. package/dist/components/digitalsee/workflow/hooks/usePanel.d.ts +3 -17
  52. package/dist/components/digitalsee/workflow/store/panelSlice.d.ts +118 -41
  53. package/dist/components/digitalsee/workflow/types/Node.d.ts +1 -1
  54. package/dist/components/digitalsee/workflow/types/NodeAddContext.d.ts +31 -0
  55. package/dist/components/digitalsee/workflow/types/engine.d.ts +15 -0
  56. package/dist/components/digitalsee/workflow/utils/classicNodeActionIdentity.d.ts +7 -0
  57. package/dist/components/digitalsee/workflow/utils/classicNodeActionIdentity.test.d.ts +1 -0
  58. package/dist/components/digitalsee/workflow/utils/classicNodePackageConnection.d.ts +28 -0
  59. package/dist/components/digitalsee/workflow/utils/classicNodePackageConnection.test.d.ts +1 -0
  60. package/dist/components/digitalsee/workflow/utils/classicNodePackageGraphValidation.d.ts +29 -0
  61. package/dist/components/digitalsee/workflow/utils/classicNodePackageGraphValidation.test.d.ts +1 -0
  62. package/dist/components/digitalsee/workflow/utils/compatiblePortSelection.d.ts +79 -0
  63. package/dist/components/digitalsee/workflow/utils/compatiblePortSelection.test.d.ts +1 -0
  64. package/dist/components/digitalsee/workflow/utils/nextNodeSchemaCache.d.ts +8 -0
  65. package/dist/components/digitalsee/workflow/utils/nodeDataFormatter.test.d.ts +1 -0
  66. package/dist/components/digitalsee/workflow/utils/portConnectionValidationMessages.d.ts +48 -0
  67. package/dist/components/digitalsee/workflow/utils/portConnectionValidationMessages.test.d.ts +1 -0
  68. package/dist/components/digitalsee/workflow/utils/portConnectionValidator.d.ts +66 -0
  69. package/dist/components/digitalsee/workflow/utils/portConnectionValidator.test.d.ts +1 -0
  70. package/dist/components/digitalsee/workflow/utils/workflowConnectionValidator.d.ts +20 -0
  71. package/dist/components/digitalsee/workflow/utils/workflowConnectionValidator.test.d.ts +1 -0
  72. package/dist/locales/en-US/link/flow.d.ts +22 -0
  73. package/dist/locales/en-US.d.ts +22 -0
  74. package/dist/locales/zh-CN/link/flow.d.ts +22 -0
  75. package/dist/locales/zh-CN.d.ts +22 -0
  76. package/dist/locales/zh-TW/link/flow.d.ts +22 -0
  77. package/dist/locales/zh-TW.d.ts +22 -0
  78. package/dist/rcs.css +1 -1
  79. package/dist/rcs.es.js +19150 -17210
  80. package/dist/rcs.es.js.map +1 -1
  81. package/dist/rcs.umd.js +59 -59
  82. package/dist/rcs.umd.js.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ import { NodeData as NodeFactoryData } from '../Nodes/NodeFactory';
2
+ import { ActionItem } from '../Panels/ModernNodeSelectorPanel/types';
3
+ type ConvertibleActionItem = Partial<ActionItem> & {
4
+ status?: string;
5
+ protocol?: string;
6
+ } & Record<string, unknown>;
7
+ /** 将节点动作转换为 CLASSIC 画布节点数据。 */
8
+ export declare const convertActionItemToNodeData: (actionItem: ConvertibleActionItem) => NodeFactoryData;
9
+ /**
10
+ * NEXT 模式专用转换函数(暂废保留分支):额外保留 name 字段。
11
+ * 当前 nodepackage 节点仍走 CLASSIC 的 convertActionItemToNodeData。
12
+ */
13
+ export declare const convertActionItemToNodeDataNext: (actionItem: ConvertibleActionItem) => NodeFactoryData;
14
+ export {};
@@ -1,9 +1,8 @@
1
1
  import { EdgeType } from '../enums/edge';
2
- import { NodeData as NodeFactoryData } from '../Nodes/NodeFactory';
3
- import { ActionItem } from '../Panels/ModernNodeSelectorPanel/types';
4
2
  import { CanvasAPI } from '../types/engine';
5
3
  import { NodeType } from '../types/Node';
6
4
  import { Edge, MarkerType, Node, Viewport } from '@xyflow/react';
5
+ export { convertActionItemToNodeData, convertActionItemToNodeDataNext, } from './actionItemToNodeData';
7
6
  export declare const startNode: {
8
7
  type: NodeType;
9
8
  id: string;
@@ -19,19 +18,6 @@ export declare const startNode: {
19
18
  description: string;
20
19
  };
21
20
  };
22
- export declare const convertActionItemToNodeData: (actionItem: Partial<ActionItem> & {
23
- status?: string;
24
- protocol?: string;
25
- } & Record<string, any>) => NodeFactoryData;
26
- /**
27
- * NEXT 模式专用转换函数(暂废保留分支):在 convertActionItemToNodeData 基础上额外保留 name 字段
28
- * name 在 NEXT 模式下作为节点实例的唯一显示名称
29
- * 当前 nodepackage 节点仍走 CLASSIC 的 convertActionItemToNodeData。
30
- */
31
- export declare const convertActionItemToNodeDataNext: (actionItem: Partial<ActionItem> & {
32
- status?: string;
33
- protocol?: string;
34
- } & Record<string, any>) => NodeFactoryData;
35
21
  export declare const nodeTypes: Record<NodeType, import('react').ComponentType<any>>;
36
22
  export declare const edgeTypes: {
37
23
  main: import('react').FC<import('../Edges/BaseEdge').CustomEdgeProps>;
@@ -0,0 +1,31 @@
1
+ import { NodeData as NodeFactoryData } from '../../Nodes/NodeFactory';
2
+ import { NodeAddInfo } from '../../types/NodeAddContext';
3
+ import { EdgeConfig } from '../../types/engine';
4
+ import { Edge, Node } from '@xyflow/react';
5
+ type ReportConnectable = (messageId: string, details: Record<string, unknown>) => void;
6
+ type ReportAmbiguousPorts = (details: Record<string, unknown>) => void;
7
+ export interface TryConnectClassicNodePackageParams {
8
+ info: NodeAddInfo;
9
+ newNode: Node<NodeFactoryData>;
10
+ currentNodes: Node[];
11
+ currentEdges: Edge[];
12
+ canUseConnectablePorts: boolean;
13
+ addEdges: (edges: Edge[]) => void;
14
+ removeEdges: (edgeIds: string[]) => void;
15
+ handleEdgeAddNode: (position: {
16
+ x: number;
17
+ y: number;
18
+ }, edge?: Edge) => void;
19
+ saveFlow: () => Promise<void>;
20
+ reportConnectableFallback: ReportConnectable;
21
+ reportAmbiguousPorts: ReportAmbiguousPorts;
22
+ validateConnectionAgainstSnapshot: (edge: EdgeConfig, nodes: Node[], edges: Edge[]) => boolean;
23
+ }
24
+ /**
25
+ * 尝试按 NodePackage Schema 连接新建节点。
26
+ *
27
+ * 返回 true 表示该上下文已完整处理(成功连线或保留独立节点并给出提示);
28
+ * 返回 false 时调用方继续 legacy 固定 handle 流程。
29
+ */
30
+ export declare function tryConnectClassicNodePackage({ info, newNode, currentNodes, currentEdges, canUseConnectablePorts, addEdges, removeEdges, handleEdgeAddNode, saveFlow, reportConnectableFallback, reportAmbiguousPorts, validateConnectionAgainstSnapshot, }: TryConnectClassicNodePackageParams): Promise<boolean>;
31
+ export {};
@@ -1,23 +1,8 @@
1
1
  import { WorkflowCanvasStrategy } from '../types';
2
2
  import { NodeData as NodeFactoryData } from '../../Nodes/NodeFactory';
3
3
  import { ActionItem } from '../../Panels/ModernNodeSelectorPanel/types';
4
+ import { NodeAddInfo } from '../../types/NodeAddContext';
4
5
  import { Edge, Node } from '@xyflow/react';
5
- interface NodeAddInfo {
6
- sourceNodeId?: string;
7
- sourceHandle?: string;
8
- targetNodeId?: string;
9
- targetHandle?: string;
10
- position?: {
11
- x: number;
12
- y: number;
13
- };
14
- trigger?: boolean;
15
- edge?: any;
16
- sourceNode?: any;
17
- targetNode?: any;
18
- protocol?: string;
19
- refresh?: boolean;
20
- }
21
6
  interface CreateNodeAddHandlerNextParams {
22
7
  workflowId?: string;
23
8
  strategy: WorkflowCanvasStrategy;
@@ -2,23 +2,9 @@ import { WorkflowCanvasStrategy } from '../types';
2
2
  import { EngineMode } from '../../enums/workflow';
3
3
  import { NodeData as NodeFactoryData } from '../../Nodes/NodeFactory';
4
4
  import { ActionItem } from '../../Panels/ModernNodeSelectorPanel/types';
5
+ import { EdgeConfig } from '../../types/engine';
6
+ import { NodeAddInfo } from '../../types/NodeAddContext';
5
7
  import { Edge, Node } from '@xyflow/react';
6
- interface NodeAddInfo {
7
- sourceNodeId?: string;
8
- sourceHandle?: string;
9
- targetNodeId?: string;
10
- targetHandle?: string;
11
- position?: {
12
- x: number;
13
- y: number;
14
- };
15
- trigger?: boolean;
16
- edge?: any;
17
- sourceNode?: any;
18
- targetNode?: any;
19
- protocol?: string;
20
- refresh?: boolean;
21
- }
22
8
  interface UseNodeAddCallbackParams {
23
9
  workflowId?: string;
24
10
  strategy: WorkflowCanvasStrategy;
@@ -38,8 +24,9 @@ interface UseNodeAddCallbackParams {
38
24
  }, edge?: Edge) => void;
39
25
  setNodeConfigVisible: (nodeId: string | null) => void;
40
26
  setNodeFitHumanView: (nodeId: string) => void;
27
+ validateConnectionAgainstSnapshot: (edge: EdgeConfig, nodes: Node[], edges: Edge[]) => boolean;
41
28
  saveFlow: () => Promise<void>;
42
29
  engineMode: EngineMode;
43
30
  }
44
- export declare function useNodeAddCallback({ workflowId, strategy, store, addNodes, addEdges, removeEdges, setNodeAddCallback, handleEdgeAddNode, setNodeConfigVisible, setNodeFitHumanView, saveFlow, engineMode, }: UseNodeAddCallbackParams): void;
31
+ export declare function useNodeAddCallback({ workflowId, strategy, store, addNodes, addEdges, removeEdges, setNodeAddCallback, handleEdgeAddNode, setNodeConfigVisible, setNodeFitHumanView, validateConnectionAgainstSnapshot, saveFlow, engineMode, }: UseNodeAddCallbackParams): void;
45
32
  export {};
@@ -6,7 +6,7 @@ import { useNodesInteraction } from '../../hooks/use-nodes-interaction';
6
6
  import { usePanel } from '../../hooks/usePanel';
7
7
  import { useWorkflow } from '../../hooks/useWorkflow';
8
8
  import { useAppDispatch } from '../../store';
9
- import { CanvasAPI } from '../../types/engine';
9
+ import { CanvasAPI, EdgeConfig as EngineEdgeConfig } from '../../types/engine';
10
10
  import { Connection, Edge, EdgeChange, Node, NodeChange, useEdgesState, useNodesState, useReactFlow, useStoreApi } from '@xyflow/react';
11
11
  import { default as React } from 'react';
12
12
  export interface WorkflowCanvasStateResult {
@@ -35,6 +35,8 @@ export interface WorkflowCanvasStateResult {
35
35
  onNodesChange: (changes: NodeChange[]) => void;
36
36
  handleEdgesChange: (changes: EdgeChange[]) => void;
37
37
  handleConnect: (params: Connection) => void;
38
+ isValidConnection: (params: Connection | Edge) => boolean;
39
+ validateConnectionAgainstSnapshot: (edge: EngineEdgeConfig, nodes: Node[], edges: Edge[]) => boolean;
38
40
  handleEdgeAddNode: (position: {
39
41
  x: number;
40
42
  y: number;
@@ -1,3 +1,4 @@
1
+ import { DipPortSchema } from '../api/dip';
1
2
  import { Connection, HandleType as FlowHandleType, Position, IsValidConnection as ReactFlowIsValidConnection } from '@xyflow/react';
2
3
  import { default as React } from 'react';
3
4
  import { NodeStatus } from '../types/Node';
@@ -20,6 +21,8 @@ interface CustomHandleProps {
20
21
  square?: boolean;
21
22
  shape?: 'square' | 'circle' | 'rhombus';
22
23
  protocol?: string;
24
+ /** NodePackage 真实端口 Schema;仅用于保留端口元数据,不改变 input 只接收连线的语义。 */
25
+ portSchema?: DipPortSchema;
23
26
  }
24
27
  /**
25
28
  * @description 自定义连接桩组件,统一输出 11×11px 菱形桩点并同步节点状态色。
@@ -0,0 +1,35 @@
1
+ import { Node } from '@xyflow/react';
2
+ import { NodeAddInfo } from '../types/NodeAddContext';
3
+ interface HandleExtenderVisibilityOptions {
4
+ type: 'source' | 'target';
5
+ isFull: boolean;
6
+ connectionInProgress: boolean;
7
+ canEdit: boolean;
8
+ }
9
+ /**
10
+ * 判断连接桩是否展示快捷新增入口。
11
+ *
12
+ * 画布连线始终由 output/source 发起,input/target 只接收连线,
13
+ * 因此快捷新增入口只允许展示在输出桩。连接数达到上限时隐藏入口。
14
+ */
15
+ export declare function shouldShowHandleExtender(options: HandleExtenderVisibilityOptions): boolean;
16
+ /** output 只能发起连线,input 只能接收连线;空间布局不改变端口语义。 */
17
+ export declare function getHandleConnectionPermissions(type: 'source' | 'target', canEdit: boolean): {
18
+ isConnectableStart: boolean;
19
+ isConnectableEnd: boolean;
20
+ };
21
+ interface BuildHandleNodeAddInfoOptions {
22
+ type: 'source' | 'target';
23
+ nodeId: string;
24
+ handleId: string;
25
+ position: {
26
+ x: number;
27
+ y: number;
28
+ };
29
+ protocol?: string;
30
+ anchorNode?: Node;
31
+ refresh: boolean;
32
+ }
33
+ /** 构造连接桩快捷新增上下文,避免输入桩误带 source/protocol 语义。 */
34
+ export declare function buildHandleNodeAddInfo(options: BuildHandleNodeAddInfoOptions): NodeAddInfo;
35
+ export {};
@@ -1,6 +1,6 @@
1
+ import { NodeStatus } from '../types/Node';
1
2
  import { NodeProps } from '@xyflow/react';
2
3
  import { default as React } from 'react';
3
- import { NodeStatus } from '../types/Node';
4
4
  interface ConditionNodeProps extends NodeProps {
5
5
  status?: NodeStatus;
6
6
  }
@@ -1,3 +1,4 @@
1
+ import { DipPortSchema } from '../api/dip';
1
2
  import { HandleType } from '../types/Handle';
2
3
  import { NodeData, NodeStatus, NodeType } from '../types/Node';
3
4
  import { Position } from '@xyflow/react';
@@ -7,8 +8,12 @@ export interface HandleConfig {
7
8
  position: Position;
8
9
  type: HandleType;
9
10
  isMain?: boolean;
10
- label?: string;
11
+ label?: React.ReactNode;
11
12
  maxConnections?: number;
13
+ /** NodePackage 端口的连接类型;与 legacy protocol 语义保持隔离。 */
14
+ connectionType?: string;
15
+ /** 原始端口 Schema,供统一连线校验器读取 type/required/黑白名单等约束。 */
16
+ portSchema?: DipPortSchema;
12
17
  style?: React.CSSProperties;
13
18
  category?: string;
14
19
  protocol?: string;
@@ -1,6 +1,6 @@
1
+ import { NodeStatus } from '../types/Node';
1
2
  import { NodeProps } from '@xyflow/react';
2
3
  import { default as React } from 'react';
3
- import { NodeStatus } from '../types/Node';
4
4
  interface SwitchNodeProps extends NodeProps {
5
5
  status?: NodeStatus;
6
6
  }
@@ -0,0 +1,23 @@
1
+ import { DipNodeSchema } from '../api/dip';
2
+ import { HandleConfig } from './SuperBaseNode';
3
+ export interface ClassicNodePackagePortLayout {
4
+ inputs: HandleConfig[];
5
+ outputs: HandleConfig[];
6
+ height: number;
7
+ compact: boolean;
8
+ }
9
+ /**
10
+ * 按端口较多的一侧计算 CLASSIC nodepackage 节点高度。
11
+ *
12
+ * 1–6 个端口保持 72px;7–12 个端口按 24px 递增;超过 12 个端口
13
+ * 使用 16px 紧凑步长,并在极端 Schema 下限制节点最大高度。
14
+ */
15
+ export declare function getClassicNodePackageHeight(portCount: number): {
16
+ height: number;
17
+ compact: boolean;
18
+ };
19
+ /**
20
+ * 将 NodeSchema 的 inputs/outputs 转为 SuperBaseNode 所需的 handle 配置。
21
+ * 不补造默认端口,空数组即代表该方向没有端口。
22
+ */
23
+ export declare function createClassicNodePackagePortLayout(schema: Pick<DipNodeSchema, 'inputs' | 'outputs'>): ClassicNodePackagePortLayout;
@@ -0,0 +1,26 @@
1
+ import { DipNodeSchema } from '../api/dip';
2
+ import { HandleConfig } from './SuperBaseNode';
3
+ import { NodeData, NodeType } from '../types/Node';
4
+ type PortLoadStatus = 'legacy' | 'loading' | 'ready' | 'error';
5
+ interface UseClassicNodePackagePortsOptions {
6
+ nodeType: NodeType;
7
+ data: NodeData;
8
+ legacyInputs: HandleConfig[];
9
+ legacyOutputs: HandleConfig[];
10
+ }
11
+ interface ClassicNodePackagePortsResult {
12
+ inputs: HandleConfig[];
13
+ outputs: HandleConfig[];
14
+ height?: number;
15
+ status: PortLoadStatus;
16
+ isNodePackage: boolean;
17
+ schema: DipNodeSchema | null;
18
+ }
19
+ /**
20
+ * 为 CLASSIC nodepackage 节点加载 NodeSchema 并生成动态端口。
21
+ *
22
+ * 仅当宿主开启 connectable 能力、引擎是 CLASSIC 且
23
+ * isClassicNextCompatibleNode 返回 true 时生效;其它节点完整保留 legacy 端口。
24
+ */
25
+ export declare function useClassicNodePackagePorts({ nodeType, data, legacyInputs, legacyOutputs, }: UseClassicNodePackagePortsOptions): ClassicNodePackagePortsResult;
26
+ export {};
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ export type EntryMode = 'automation' | 'mcp' | null;
3
+ interface EntryTypeSelectorProps {
4
+ onSelect: (mode: Exclude<EntryMode, null>) => void;
5
+ }
6
+ /** @description 首节点入口类型选择。 */
7
+ declare const EntryTypeSelector: React.FC<EntryTypeSelectorProps>;
8
+ export default EntryTypeSelector;
@@ -0,0 +1,19 @@
1
+ import { NodeActionMeta } from '../hooks/useNodeActionState';
2
+ import { ActionItem, NodeTypeItem } from '../types';
3
+ import { default as React } from 'react';
4
+ interface NodeCardListProps {
5
+ isSearching: boolean;
6
+ visibleNodes: NodeTypeItem[];
7
+ useConnectableDataSource: boolean;
8
+ expandedNodeIds: string[];
9
+ nodeActionsMap: Record<string, NodeActionMeta>;
10
+ searchText: string;
11
+ isLoadingNodes: boolean;
12
+ hasMore: boolean;
13
+ onNodeToggle: (node: NodeTypeItem) => void;
14
+ onActionSelect: (node: NodeTypeItem, action: ActionItem) => void;
15
+ onLoadAllActions: (node: NodeTypeItem) => void;
16
+ }
17
+ /** @description 节点卡片集合及其加载、空态和分页尾部。 */
18
+ declare const NodeCardList: React.FC<NodeCardListProps>;
19
+ export default NodeCardList;
@@ -1,13 +1,16 @@
1
1
  import { CategoryItem, CategoryRequestType } from '../types';
2
+ import { NodeAddInfo } from '../../../types/NodeAddContext';
2
3
  interface UseCategoriesProps {
3
4
  onFetchCategories: (type?: CategoryRequestType) => Promise<CategoryItem[]>;
4
5
  restrictToCategory?: string;
5
6
  nodeSelectorVisible: boolean;
6
- nodeAddInfo?: any;
7
+ nodeAddInfo?: NodeAddInfo | null;
7
8
  fallbackCategories?: CategoryItem[];
9
+ requestContextKey: string;
8
10
  }
9
- export declare const useCategories: ({ onFetchCategories, restrictToCategory, nodeSelectorVisible, nodeAddInfo, fallbackCategories, }: UseCategoriesProps) => {
11
+ export declare const useCategories: ({ onFetchCategories, restrictToCategory, nodeSelectorVisible, nodeAddInfo, fallbackCategories, requestContextKey, }: UseCategoriesProps) => {
10
12
  categories: CategoryItem[];
13
+ categoriesReady: boolean;
11
14
  isLoadingCategories: boolean;
12
15
  setCategories: import('react').Dispatch<import('react').SetStateAction<CategoryItem[]>>;
13
16
  };
@@ -0,0 +1,40 @@
1
+ import { ActionItem, LinkSearchParams, ModernNodeSelectorProps, NodeFetchResult, NodeTypeItem } from '../types';
2
+ import { NodeAddInfo } from '../../../types/NodeAddContext';
3
+ type SearchHandler = NonNullable<ModernNodeSelectorProps['onSearch']>;
4
+ type CategoryHandler = NonNullable<ModernNodeSelectorProps['onFetchCategories']>;
5
+ type NodeCategoryHandler = NonNullable<ModernNodeSelectorProps['onFetchNodesByCategory']>;
6
+ type EntryMode = 'automation' | 'mcp' | null;
7
+ interface FetchNodeActionOptions {
8
+ suppressLoading?: boolean;
9
+ }
10
+ interface UseConnectableNodeSelectorProps {
11
+ nodeSelectorVisible: boolean;
12
+ entryMode: EntryMode;
13
+ effectiveNodeAddInfo?: NodeAddInfo | null;
14
+ workflowId?: string;
15
+ onSearch?: SearchHandler;
16
+ onFetchCategories?: CategoryHandler;
17
+ onFetchNodesByCategory?: NodeCategoryHandler;
18
+ fetchLegacyNodeActions: (node: NodeTypeItem, options?: FetchNodeActionOptions) => Promise<ActionItem[]>;
19
+ }
20
+ /**
21
+ * @description 为 NodePackage 连线场景选择数据源,并封装查询、边中插入求交与旧接口回退。
22
+ */
23
+ export declare function useConnectableNodeSelector({ nodeSelectorVisible, entryMode, effectiveNodeAddInfo, workflowId, onSearch, onFetchCategories, onFetchNodesByCategory, fetchLegacyNodeActions, }: UseConnectableNodeSelectorProps): {
24
+ actionRequestContextKey: string;
25
+ connectableContext: import('../utils/connectableQuery').ConnectableQueryContext;
26
+ useConnectableDataSource: boolean;
27
+ onSearch: (params?: LinkSearchParams) => Promise<NodeFetchResult>;
28
+ onFetchCategories: (type?: import('../types').CategoryRequestType) => Promise<import('../types').CategoryItem[] | {
29
+ id: any;
30
+ name: any;
31
+ description: any;
32
+ icon: any;
33
+ search_action: any;
34
+ children: any;
35
+ nodes: any[];
36
+ }[]>;
37
+ onFetchNodesByCategory: (params?: LinkSearchParams) => Promise<NodeFetchResult>;
38
+ fetchNodeActions: (node: NodeTypeItem, options?: FetchNodeActionOptions) => Promise<ActionItem[]>;
39
+ };
40
+ export {};
@@ -1,14 +1,16 @@
1
1
  import { CategoryItem, LinkSearchParams, NodeFetchResult, NodeTypeItem } from '../types';
2
+ import { NodeAddInfo } from '../../../types/NodeAddContext';
2
3
  interface UseNavigationProps {
3
4
  categories: CategoryItem[];
5
+ categoriesReady: boolean;
4
6
  initialCategory?: string;
5
7
  nodeSelectorVisible: boolean;
6
- nodeAddInfo?: any;
8
+ nodeAddInfo?: NodeAddInfo | null;
7
9
  onFetchNodesByCategory: (params?: LinkSearchParams) => Promise<NodeFetchResult>;
8
10
  defaultPageSize?: number;
9
11
  flowId?: string;
10
12
  }
11
- export declare const useNavigation: ({ categories, initialCategory, nodeSelectorVisible, nodeAddInfo, onFetchNodesByCategory, defaultPageSize, flowId, }: UseNavigationProps) => {
13
+ export declare const useNavigation: ({ categories, categoriesReady, initialCategory, nodeSelectorVisible, nodeAddInfo, onFetchNodesByCategory, defaultPageSize, flowId, }: UseNavigationProps) => {
12
14
  categoryNodes: NodeTypeItem[];
13
15
  currentCategory: CategoryItem;
14
16
  isLoadingNodes: boolean;
@@ -0,0 +1,30 @@
1
+ import { ActionItem, NodeTypeItem } from '../types';
2
+ export interface NodeActionMeta {
3
+ actions: ActionItem[];
4
+ loading: boolean;
5
+ source?: 'search-partial' | 'full';
6
+ }
7
+ interface UseNodeActionStateProps {
8
+ actionRequestContextKey: string;
9
+ contextMode?: string;
10
+ fetchNodeActions: (node: NodeTypeItem, options?: {
11
+ suppressLoading?: boolean;
12
+ }) => Promise<ActionItem[]>;
13
+ isMcpServerEntryMode: boolean;
14
+ visibleNodes: NodeTypeItem[];
15
+ searchResults: NodeTypeItem[];
16
+ searchText: string;
17
+ activeCategoryId?: string;
18
+ }
19
+ /**
20
+ * @description 管理连接器的展开状态、动作缓存,以及异步动作请求的竞态保护。
21
+ */
22
+ export declare function useNodeActionState({ actionRequestContextKey, contextMode, fetchNodeActions, isMcpServerEntryMode, visibleNodes, searchResults, searchText, activeCategoryId, }: UseNodeActionStateProps): {
23
+ expandedNodeIds: string[];
24
+ nodeActionsMap: Record<string, NodeActionMeta>;
25
+ handleNodeToggle: (node: NodeTypeItem) => Promise<void>;
26
+ handleLoadAllActions: (node: NodeTypeItem) => Promise<void>;
27
+ resetNodeActionState: () => void;
28
+ setExpandedNodeIds: import('react').Dispatch<import('react').SetStateAction<string[]>>;
29
+ };
30
+ export {};
@@ -0,0 +1,24 @@
1
+ import { CategoryItem, LinkSearchParams, NodeTypeItem } from '../types';
2
+ import { NodeAddInfo } from '../../../types/NodeAddContext';
3
+ interface UseNodeSelectorPresentationProps {
4
+ effectiveNodeAddInfo?: NodeAddInfo | null;
5
+ isEntryTypeSelection: boolean;
6
+ activeCategoryId?: string;
7
+ currentCategory: CategoryItem | null;
8
+ categoryNodes: NodeTypeItem[];
9
+ searchResults: NodeTypeItem[];
10
+ searchText: string;
11
+ isRealTriggerMode: boolean;
12
+ workflowId?: string;
13
+ }
14
+ /**
15
+ * @description 汇总节点选择器的协议展示状态和列表/搜索派生参数。
16
+ */
17
+ export declare function useNodeSelectorPresentation({ effectiveNodeAddInfo, isEntryTypeSelection, activeCategoryId, currentCategory, categoryNodes, searchResults, searchText, isRealTriggerMode, workflowId, }: UseNodeSelectorPresentationProps): {
18
+ panelTitle: string;
19
+ searchPlaceholder: string;
20
+ visibleNodes: NodeTypeItem[];
21
+ buildSearchParams: () => LinkSearchParams;
22
+ isMcpServerEntryMode: boolean;
23
+ };
24
+ export {};
@@ -5,6 +5,9 @@ import { NodeType } from '../../types/Node';
5
5
  */
6
6
  export interface NodeTypeItem {
7
7
  id: string;
8
+ /** 后端返回稳定标识时才允许展开/选择。 */
9
+ selectable?: boolean;
10
+ identifierSource?: string;
8
11
  type: string;
9
12
  name: string;
10
13
  description: string;
@@ -41,6 +44,12 @@ export interface NodeFetchResult {
41
44
  */
42
45
  export interface ActionItem {
43
46
  id: string;
47
+ /** UI 列表使用稳定 id;创建 CLASSIC 节点时必须使用后端原始 Long action_id。 */
48
+ backendActionId?: string;
49
+ action_id?: string;
50
+ /** 后端返回稳定标识时才允许创建节点。 */
51
+ selectable?: boolean;
52
+ identifierSource?: string;
44
53
  type: NodeType;
45
54
  action_type: NodeType;
46
55
  action_key?: string;
@@ -89,6 +98,10 @@ export interface ConnectorInfo {
89
98
  */
90
99
  export interface CategoryItem {
91
100
  id: string;
101
+ /** connectable 接口需要的数值分类 ID。 */
102
+ categoryId?: string | number;
103
+ /** 缺少数值分类 ID 时仍展示,但不能作为服务端筛选条件。 */
104
+ filterable?: boolean;
92
105
  name: string;
93
106
  description: string;
94
107
  icon?: string;
@@ -101,12 +114,14 @@ export interface CategoryItem {
101
114
  */
102
115
  export interface ApiActionItem {
103
116
  id: string;
117
+ backendActionId?: string;
118
+ action_id?: string;
104
119
  action_key?: string;
105
120
  action_ver?: number;
106
121
  is_trigger: number;
107
122
  name: string;
108
123
  description: string | null;
109
- connector_id: string;
124
+ connector_id: string | null;
110
125
  status: number;
111
126
  protocol: string;
112
127
  config_schema: any;
@@ -134,6 +149,9 @@ export interface ModernNodeSelectorProps {
134
149
  */
135
150
  export interface LinkSearchParams {
136
151
  name?: string;
152
+ keyword?: string;
153
+ linkId?: string;
154
+ categoryId?: string | number;
137
155
  build_type?: string;
138
156
  deployment_type?: string;
139
157
  app_domain_category?: string;
@@ -0,0 +1,16 @@
1
+ import { QueryConnectableNodePackageDto } from '../../../api/connectable.types';
2
+ import { ActionItem, NodeFetchResult, NodeTypeItem } from '../types';
3
+ interface LoadConnectableNodeActionsOptions {
4
+ node: NodeTypeItem;
5
+ query: QueryConnectableNodePackageDto | null;
6
+ fallbackToLegacy: boolean;
7
+ fetchConnectablePage: (query: QueryConnectableNodePackageDto) => Promise<NodeFetchResult>;
8
+ fetchLegacyActions: () => Promise<ActionItem[]>;
9
+ filterPage?: (page: NodeFetchResult) => NodeFetchResult;
10
+ }
11
+ /**
12
+ * 加载连接器动作;connectable 查询不可用或明确未发布时回退旧 `/actions/v2`。
13
+ * 不能回退 `/links/search`,因为该接口在 linkId 场景不会加载 matchedActions。
14
+ */
15
+ export declare function loadConnectableNodeActions({ node, query, fallbackToLegacy, fetchConnectablePage, fetchLegacyActions, filterPage, }: LoadConnectableNodeActionsOptions): Promise<ActionItem[]>;
16
+ export {};
@@ -0,0 +1,2 @@
1
+ /** 只有接口未发布(404)或明确未实现(501)时才允许回退 legacy 数据源。 */
2
+ export declare function shouldFallbackConnectableRequest(error: unknown): boolean;
@@ -0,0 +1,40 @@
1
+ import { QueryConnectableNodePackageDto } from '../../../api/connectable.types';
2
+ type ConnectableNodeId = string | number;
3
+ export type ConnectableQueryContext = {
4
+ mode: 'independent';
5
+ } | {
6
+ mode: 'source';
7
+ sourceId: ConnectableNodeId;
8
+ sourceHandle: string;
9
+ } | {
10
+ mode: 'target';
11
+ targetId: ConnectableNodeId;
12
+ targetHandle: string;
13
+ } | {
14
+ mode: 'edge-insert';
15
+ sourceId: ConnectableNodeId;
16
+ sourceHandle: string;
17
+ targetId: ConnectableNodeId;
18
+ targetHandle: string;
19
+ };
20
+ export interface ConnectableQueryOptions {
21
+ scene: string;
22
+ trigger: boolean;
23
+ categoryId?: string | number | null;
24
+ linkId?: string | null;
25
+ keyword?: string | null;
26
+ page?: number | null;
27
+ size?: number | null;
28
+ }
29
+ /**
30
+ * 校验后端 Long 节点 ID,并保持字符串原值以避免 19 位雪花 ID 精度丢失。
31
+ * number 只接受 JS 安全正整数;临时 ReactFlow id 返回 undefined。
32
+ */
33
+ export declare const parsePersistedNodeId: (value: ConnectableNodeId) => string | number | undefined;
34
+ /**
35
+ * 将节点新增上下文转换为后端三种合法查询之一。
36
+ *
37
+ * `edge-insert` 暂按 source 查询,原 target 由调用方保留并在本地求交。
38
+ */
39
+ export declare const buildConnectableQuery: (context: ConnectableQueryContext, options: ConnectableQueryOptions) => QueryConnectableNodePackageDto | null;
40
+ export {};