@digitalsee-ai/rcs 2.0.4-beta → 2.0.4-beta10

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.
@@ -2,7 +2,7 @@ import { WorkflowCanvasProps } from '../constants';
2
2
  import { SaveStatus } from '../../enums/workflow';
3
3
  import { useEdgesInteraction } from '../../hooks/use-edges-interaction';
4
4
  import { useFlowDataOperation } from '../../hooks/use-flow-data-operation';
5
- import { useNodesInteraction } from '../../hooks/use-nodes-interaction';
5
+ import { useNodeHoverHandlers } 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';
@@ -63,8 +63,8 @@ export interface WorkflowCanvasStateResult {
63
63
  handleTidy: () => void;
64
64
  onEdgeMouseEnter: ReturnType<typeof useEdgesInteraction>['onEdgeMouseEnter'];
65
65
  onEdgeMouseLeave: ReturnType<typeof useEdgesInteraction>['onEdgeMouseLeave'];
66
- onNodeMouseEnter: ReturnType<typeof useNodesInteraction>['onNodeMouseEnter'];
67
- onNodeMouseLeave: ReturnType<typeof useNodesInteraction>['onNodeMouseLeave'];
66
+ onNodeMouseEnter: ReturnType<typeof useNodeHoverHandlers>['onNodeMouseEnter'];
67
+ onNodeMouseLeave: ReturnType<typeof useNodeHoverHandlers>['onNodeMouseLeave'];
68
68
  onNodeContextMenu: (event: React.MouseEvent, node: Node) => void;
69
69
  onPaneContextMenu: (event: React.MouseEvent) => void;
70
70
  updateSaveStatus: (status: SaveStatus, error?: Error) => void;
@@ -15,6 +15,7 @@ interface TextFieldProps extends IFieldSuperProps {
15
15
  lang?: CodeEditorLanguage;
16
16
  onFocus?: () => void;
17
17
  onBlur?: () => void;
18
+ required?: boolean;
18
19
  }
19
20
  export declare const TextField: (props: TextFieldProps) => import("react/jsx-runtime").JSX.Element;
20
21
  export {};
@@ -1,3 +1,9 @@
1
1
  import { CanvasEngineConfig } from '../types/engine';
2
+ /**
3
+ * 判断当前是否处于工作流画布内(画布入口同时挂载 redux、CanvasConfig、ReactFlow 三个 Provider)。
4
+ *
5
+ * 仅用于区分「画布内组件」与「独立使用的表单组件」;业务组件取配置请用 useCanvasConfig。
6
+ */
7
+ export declare const useHasCanvasConfig: () => boolean;
2
8
  export declare const useCanvasConfig: () => CanvasEngineConfig;
3
9
  export declare const CanvasConfigProvider: import('react').Provider<CanvasEngineConfig>;
@@ -1,8 +1,21 @@
1
1
  import { NodeType } from '../types/Node';
2
- import { NodeMouseHandler, OnNodesChange } from '@xyflow/react';
3
- export declare const useNodesInteraction: () => {
2
+ import { Node, NodeMouseHandler } from '@xyflow/react';
3
+ /** 受控画布 setNodes 的函数式签名(hover 只用函数式更新,保证不读到滞后快照)。 */
4
+ type SetNodesFn = (updater: (nodes: Node[]) => Node[]) => void;
5
+ type NodeHoverHandlersOptions = {
6
+ /**
7
+ * 受控画布的 React state 写入器(useNodesState 的 setNodes)。
8
+ * hover 等改动必须写受控 state:直写 RF store 会被 StoreUpdater 在下一次
9
+ * 同步时覆盖,且与 store 快照互写会放大选中态的代际差(双选中 bug 根因之一)。
10
+ */
11
+ setNodes: SetNodesFn;
12
+ };
13
+ /** 节点 hover 高亮:写受控 React state,不直写 RF store。 */
14
+ export declare const useNodeHoverHandlers: ({ setNodes }: NodeHoverHandlersOptions) => {
4
15
  onNodeMouseEnter: NodeMouseHandler;
5
16
  onNodeMouseLeave: NodeMouseHandler;
6
- handleNodesChange: OnNodesChange;
17
+ };
18
+ export declare const useNodesInteraction: () => {
7
19
  handleNodesDelete: (nodeIds: string[], nodeType: NodeType) => void;
8
20
  };
21
+ export {};
@@ -252,6 +252,8 @@ export interface CanvasAPI {
252
252
  getNode(id: string): NodeConfig | null;
253
253
  selectNode(id: string): void;
254
254
  clearSelection(): void;
255
+ /** 清除单个节点的选中/悬停高亮(写受控 state,避免直写 RF store 被 StoreUpdater 覆盖)。 */
256
+ clearNodeHighlight(id: string): void;
255
257
  moveNode(id: string, pos: {
256
258
  x: number;
257
259
  y: number;
@@ -1,8 +1,9 @@
1
+ import { PortNodeKeyAccessCode } from './portConnectionValidator';
1
2
  import { Node } from '@xyflow/react';
2
3
  /**
3
- * 统一连线检查的结果码,命名对齐 portConnectionValidator 的 code 风格。
4
+ * 统一连线检查的结果码,端口黑白名单部分复用 PortNodeKeyAccessCode。
4
5
  */
5
- export type ConnectionCheckCode = 'VALID' | 'SOURCE_NODE_NOT_FOUND' | 'TARGET_NODE_NOT_FOUND' | 'SOURCE_PORT_NOT_FOUND' | 'TARGET_PORT_NOT_FOUND' | 'PROTOCOL_MISMATCH' | 'SELF_CONNECTION_NOT_ALLOWED';
6
+ export type ConnectionCheckCode = 'VALID' | 'SOURCE_NODE_NOT_FOUND' | 'TARGET_NODE_NOT_FOUND' | 'SOURCE_PORT_NOT_FOUND' | 'TARGET_PORT_NOT_FOUND' | 'PROTOCOL_MISMATCH' | 'SELF_CONNECTION_NOT_ALLOWED' | PortNodeKeyAccessCode;
6
7
  export interface ConnectionCheckResult {
7
8
  valid: boolean;
8
9
  code: ConnectionCheckCode;
@@ -22,7 +23,8 @@ export interface ConnectionCheckConnection {
22
23
  * 范围(与手动拖线今天的实际行为一致,再叠自连规则门):
23
24
  * 1. 节点存在性;
24
25
  * 2. 协议一致性(大小写不敏感;双侧均无法解析协议时放行,保留旧 `?? ''` 行为);
25
- * 3. 自连(source === target)必须命中节点声明的 auto_connect 规则。
26
+ * 3. 自连(source === target)必须命中节点声明的 auto_connect 规则;
27
+ * 4. NodePackage schema.input / schema.output 的 node key 黑白名单(放在最后验证)。
26
28
  *
27
29
  * workflowConnectionValidator 的重链(edgeRules / connectable / native 校验)
28
30
  * 有意不在本检查内,仍由各自的既有入口负责。
@@ -1,5 +1,5 @@
1
1
  import { DipNodeSchema } from '../api/dip';
2
- import { PortConnectionEdge, PortConnectionValidationCode } from './portConnectionValidator';
2
+ import { NormalizedDipPortSchema, PortConnectionEdge, PortConnectionValidationCode } from './portConnectionValidator';
3
3
  import { Node } from '@xyflow/react';
4
4
  export type NodePackageConnectionCode = PortConnectionValidationCode | 'NOT_APPLICABLE' | 'SCHEMA_NOT_READY';
5
5
  export interface NodePackageConnectionResult {
@@ -19,6 +19,11 @@ export interface ValidateNodePackageConnectionInput {
19
19
  /** 同步解析已预加载的 NodePackage Schema。 */
20
20
  export declare function resolveNodePackageSchema(node?: Node | null): DipNodeSchema | null;
21
21
  export declare function isNodePackageConnectionNode(node?: Node | null): boolean;
22
+ /**
23
+ * 读取 NodePackage 节点 schema 指定方向的端口定义(schema.inputs / schema.outputs)。
24
+ * 非 NodePackage 节点、Schema 未预热或端口未声明时返回 null,视为无黑白名单约束。
25
+ */
26
+ export declare function findNodePackagePort(node: Node | undefined, handle: string | null | undefined, side: 'inputs' | 'outputs'): NormalizedDipPortSchema | null;
22
27
  /**
23
28
  * 校验两个 NodePackage 节点之间的端口连接。
24
29
  *
@@ -57,6 +57,28 @@ export interface PortConnectionValidationResult {
57
57
  export declare const normalizePortSchema: (port: DipPortSchema) => NormalizedDipPortSchema;
58
58
  /** 从 ReactFlow 节点 data 中解析用于黑白名单判断的 NodePackage schema key。 */
59
59
  export declare const getPortConnectionNodeIdentity: (node?: PortConnectionNode | null) => string | null;
60
+ /** 端口 node key 黑白名单校验失败的返回码。 */
61
+ export type PortNodeKeyAccessCode = 'SOURCE_NODE_DENIED' | 'TARGET_NODE_DENIED' | 'SOURCE_NODE_NOT_ALLOWED' | 'TARGET_NODE_NOT_ALLOWED';
62
+ export interface PortNodeKeyAccessViolation {
63
+ code: PortNodeKeyAccessCode;
64
+ /** 中文兜底原因,便于 console 调试。 */
65
+ reason: string;
66
+ }
67
+ /** 黑白名单校验的单侧输入:本侧端口 Schema 约束匹配的是对端节点的身份。 */
68
+ export interface PortNodeKeyAccessSide {
69
+ port: NormalizedDipPortSchema | null;
70
+ identity: string | null;
71
+ }
72
+ /**
73
+ * 按连接方向校验端口 node key 黑白名单(schema.input / schema.output):
74
+ * - 未配置(缺失或为空)不限制;
75
+ * - 黑名单命中即拒绝;
76
+ * - 白名单非空时,过滤完黑名单后必须命中白名单;
77
+ * - 不在黑名单且未配置白名单则允许。
78
+ *
79
+ * 双侧 port 均可为 null(该侧无 Schema 约束,仅跳过该侧规则);返回 null 表示放行。
80
+ */
81
+ export declare const checkPortNodeKeyAccess: (source: PortNodeKeyAccessSide, target: PortNodeKeyAccessSide) => PortNodeKeyAccessViolation | null;
60
82
  /**
61
83
  * 按 NodePackage PortSchema 校验一条准备创建的连接。
62
84
  *
@@ -84,6 +84,8 @@ export interface ValueModeWrapperProps {
84
84
  * 代码编辑器语言(json / javascript)
85
85
  */
86
86
  lang?: CodeEditorLanguage;
87
+ /** 是否必填 */
88
+ required?: boolean;
87
89
  }
88
90
  export declare const ValueModeWrapper: React.FC<ValueModeWrapperProps>;
89
91
  export default ValueModeWrapper;
@@ -66,6 +66,8 @@ export interface FieldComponentProps<T extends FieldDef = FieldDef, K = unknown>
66
66
  onChange?: (value: unknown) => void;
67
67
  /** 字段 ID(由 Form.Item 注入) */
68
68
  id?: string;
69
+ /** 是否必填 */
70
+ required?: boolean;
69
71
  }
70
72
  /**
71
73
  * 字段组件元数据