@digitalsee-ai/rcs 1.1.7 → 1.1.9

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 (32) hide show
  1. package/dist/components/digitalsee/workflow/Canvas/FlowVersionManager.d.ts +2 -1
  2. package/dist/components/digitalsee/workflow/Canvas/NextWorkflowCanvasHeader.d.ts +3 -1
  3. package/dist/components/digitalsee/workflow/Canvas/WorkflowCanvasHeader.d.ts +2 -1
  4. package/dist/components/digitalsee/workflow/Canvas/hooks/useCanvasApi.d.ts +1 -1
  5. package/dist/components/digitalsee/workflow/Canvas/hooks/useSaveFlowAfterNodeAdd.d.ts +7 -4
  6. package/dist/components/digitalsee/workflow/Canvas/hooks/useWorkflowCanvasState.d.ts +1 -1
  7. package/dist/components/digitalsee/workflow/Canvas/types.d.ts +15 -1
  8. package/dist/components/digitalsee/workflow/Handles/customHandleConnectable.d.ts +9 -3
  9. package/dist/components/digitalsee/workflow/Nodes/AISubNode.d.ts +1 -1
  10. package/dist/components/digitalsee/workflow/Nodes/AgentNode.d.ts +2 -2
  11. package/dist/components/digitalsee/workflow/Nodes/BrowserNode.d.ts +2 -2
  12. package/dist/components/digitalsee/workflow/enums/handle.d.ts +9 -0
  13. package/dist/components/digitalsee/workflow/index.d.ts +3 -0
  14. package/dist/components/digitalsee/workflow/utils/legacyAiHandles.d.ts +23 -0
  15. package/dist/components/digitalsee/workflow/utils/mcpCanvas.d.ts +7 -4
  16. package/dist/components/dynamic-form/components/ValueModeWrapper/ValueModeFieldScope.d.ts +17 -0
  17. package/dist/components/dynamic-form/components/ValueModeWrapper/ValueModePolicyContext.d.ts +26 -0
  18. package/dist/components/dynamic-form/components/ValueModeWrapper/ValueModeSwitch.d.ts +16 -0
  19. package/dist/components/dynamic-form/components/ValueModeWrapper/index.d.ts +6 -5
  20. package/dist/components/dynamic-form/components/ValueModeWrapper/valueModeConfig.d.ts +11 -0
  21. package/dist/components/dynamic-form/context/VariableSelectorContext.d.ts +17 -16
  22. package/dist/components/dynamic-form/index.d.ts +2 -2
  23. package/dist/{index-DgHUyAIK.mjs → index-BnE-Ea2s.mjs} +2 -2
  24. package/dist/{index-DgHUyAIK.mjs.map → index-BnE-Ea2s.mjs.map} +1 -1
  25. package/dist/{index-B3ZrjegL.mjs → index-CqZ6Y0AC.mjs} +15174 -14947
  26. package/dist/index-CqZ6Y0AC.mjs.map +1 -0
  27. package/dist/rcs.css +1 -1
  28. package/dist/rcs.es.js +56 -50
  29. package/dist/rcs.umd.js +57 -57
  30. package/dist/rcs.umd.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/index-B3ZrjegL.mjs.map +0 -1
@@ -1,11 +1,12 @@
1
1
  import { CanvasAPI } from '../types/engine';
2
2
  import { FlowDraftPayload } from '../types/flowVersion';
3
+ import { SaveFlowFn } from './types';
3
4
  interface FlowVersionManagerProps {
4
5
  flowId: string;
5
6
  flowName?: string;
6
7
  dirty: boolean;
7
8
  canManage: boolean;
8
- onSave?: () => Promise<FlowDraftPayload | undefined>;
9
+ onSave?: SaveFlowFn;
9
10
  getFlowPayload?: () => FlowDraftPayload;
10
11
  canvasApi?: CanvasAPI;
11
12
  offlineApi?: (flowId: string) => Promise<void>;
@@ -2,7 +2,9 @@ import { default as React } from 'react';
2
2
  import { SaveStatus } from '../enums/workflow';
3
3
  import { CanvasAPI } from '../types/engine';
4
4
  interface NextWorkflowCanvasHeaderProps {
5
- onSave?: () => void;
5
+ onSave?: (options?: {
6
+ notifyHost?: boolean;
7
+ }) => void;
6
8
  readOnly?: boolean;
7
9
  unSave?: boolean;
8
10
  preview?: boolean;
@@ -2,8 +2,9 @@ import { default as React } from 'react';
2
2
  import { SaveStatus } from '../enums/workflow';
3
3
  import { CanvasAPI } from '../types/engine';
4
4
  import { FlowDraftPayload } from '../types/flowVersion';
5
+ import { SaveFlowFn } from './types';
5
6
  interface WorkflowCanvasHeaderProps {
6
- onSave?: () => Promise<FlowDraftPayload | undefined>;
7
+ onSave?: SaveFlowFn;
7
8
  getFlowPayload?: () => FlowDraftPayload;
8
9
  readOnly?: boolean;
9
10
  unSave?: boolean;
@@ -10,7 +10,7 @@ interface UseCanvasApiParams {
10
10
  getState: () => any;
11
11
  };
12
12
  setNodeConfigVisible: (nodeId: string | null) => void;
13
- saveFlowRef: React.RefObject<() => Promise<import('../../types/flowVersion').FlowDraftPayload | undefined>>;
13
+ saveFlowRef: React.RefObject<(options?: import('../types').SaveFlowCallOptions) => Promise<import('../../types/flowVersion').FlowDraftPayload | undefined>>;
14
14
  }
15
15
  /**
16
16
  * 构造对外 Canvas API
@@ -1,9 +1,12 @@
1
- import { FlowDraftPayload } from '../../types/flowVersion';
2
- /** 将画布保存返回值收敛为节点新增流程需要的 Promise<void>。 */
3
- export declare const createSaveFlowAfterNodeAdd: (saveFlow: () => Promise<FlowDraftPayload | undefined>) => () => Promise<void>;
1
+ import { SaveFlowFn } from '../types';
2
+ /**
3
+ * 将画布保存适配为节点新增流程需要的 Promise<void>。
4
+ * 不传 notifyHost,避免内部自动保存触发宿主 onSave / toast。
5
+ */
6
+ export declare const createSaveFlowAfterNodeAdd: (saveFlow: SaveFlowFn) => () => Promise<void>;
4
7
  /**
5
8
  * 将带返回值的画布保存函数适配为节点新增回调需要的 Promise<void>。
6
9
  *
7
10
  * 必须保持引用稳定,否则 useNodeAddCallback 的 effect 会反复清理并 dispatch,造成无限更新。
8
11
  */
9
- export declare const useSaveFlowAfterNodeAdd: (saveFlow: () => Promise<FlowDraftPayload | undefined>) => () => Promise<void>;
12
+ export declare const useSaveFlowAfterNodeAdd: (saveFlow: SaveFlowFn) => () => Promise<void>;
@@ -69,7 +69,7 @@ export interface WorkflowCanvasStateResult {
69
69
  openNodeSelector: ReturnType<typeof usePanel>['openNodeSelector'];
70
70
  handleManualAdd: ReturnType<typeof usePanel>['handleManualAdd'];
71
71
  restNativeProps: Record<string, any>;
72
- saveFlowRef: React.RefObject<() => Promise<import('../../types/flowVersion').FlowDraftPayload | undefined>>;
72
+ saveFlowRef: React.RefObject<(options?: import('../types').SaveFlowCallOptions) => Promise<import('../../types/flowVersion').FlowDraftPayload | undefined>>;
73
73
  }
74
74
  /**
75
75
  * 工作流画布共享状态 Hook
@@ -6,8 +6,22 @@ import { ExecutionControlState } from '../store/workflowSlice';
6
6
  import { CanvasAPI } from '../types/engine';
7
7
  import { FlowDraftPayload } from '../types/flowVersion';
8
8
  import { Edge, Node, NodeTypes } from '@xyflow/react';
9
+ /**
10
+ * 画布 saveFlow 调用选项。
11
+ *
12
+ * 节点新增等内部自动保存默认不通知宿主;用户主动保存(工具栏、发布前落草稿、canvasApi)应传 notifyHost: true。
13
+ */
14
+ export interface SaveFlowCallOptions {
15
+ /**
16
+ * 是否回调宿主 DigitalseeWorkFlow.onSave。
17
+ * @default false
18
+ */
19
+ notifyHost?: boolean;
20
+ }
21
+ /** 画布内部保存函数签名 */
22
+ export type SaveFlowFn = (options?: SaveFlowCallOptions) => Promise<FlowDraftPayload | undefined>;
9
23
  export interface CanvasHeaderProps {
10
- onSave?: () => Promise<FlowDraftPayload | undefined>;
24
+ onSave?: SaveFlowFn;
11
25
  getFlowPayload?: () => FlowDraftPayload;
12
26
  readOnly?: boolean;
13
27
  unSave?: boolean;
@@ -2,6 +2,7 @@ import { NodeAddInfo } from '../types/NodeAddContext';
2
2
  import { Node } from '@xyflow/react';
3
3
  interface HandleExtenderVisibilityOptions {
4
4
  type: 'source' | 'target';
5
+ handleId?: string;
5
6
  isFull: boolean;
6
7
  connectionInProgress: boolean;
7
8
  canEdit: boolean;
@@ -9,8 +10,8 @@ interface HandleExtenderVisibilityOptions {
9
10
  /**
10
11
  * 判断连接桩是否展示快捷新增入口。
11
12
  *
12
- * 画布连线始终由 output/source 发起,input/target 只接收连线,
13
- * 因此快捷新增入口只允许展示在输出桩。连接数达到上限时隐藏入口。
13
+ * 默认仅输出桩展示;旧版 AI 孤独入桩(ai_model/ai_memory/ai_tool)虽是 target
14
+ * 仍需要半线入口以便按 target_id/target_handle 查询可连接节点。
14
15
  */
15
16
  export declare function shouldShowHandleExtender(options: HandleExtenderVisibilityOptions): boolean;
16
17
  /** output 只能发起连线,input 只能接收连线;空间布局不改变端口语义。 */
@@ -30,6 +31,11 @@ interface BuildHandleNodeAddInfoOptions {
30
31
  anchorNode?: Node;
31
32
  refresh: boolean;
32
33
  }
33
- /** 构造连接桩快捷新增上下文,避免输入桩误带 source/protocol 语义。 */
34
+ /**
35
+ * 构造连接桩快捷新增上下文。
36
+ *
37
+ * AI 孤独入桩走 target 半组(不带 protocol),以便 connectable 接口使用
38
+ * target_id/target_handle;其余 source 桩保留 protocol 专项入口语义。
39
+ */
34
40
  export declare function buildHandleNodeAddInfo(options: BuildHandleNodeAddInfoOptions): NodeAddInfo;
35
41
  export {};
@@ -1,7 +1,7 @@
1
1
  import { NodeProps } from '@xyflow/react';
2
2
  import { default as React } from 'react';
3
3
  /**
4
- * @description AI 子节点,渲染垂直布局下的 300×72px 卡片样式。
4
+ * @description AI 子节点,顶部 SOURCE 连入父节点的 ai_* 孤独入桩。
5
5
  * @param {NodeProps} props React Flow 传入的节点参数。
6
6
  * @returns {JSX.Element} 渲染后的节点。
7
7
  */
@@ -1,8 +1,8 @@
1
+ import { NodeData } from '../types/Node';
1
2
  import { Node, NodeProps } from '@xyflow/react';
2
3
  import { default as React } from 'react';
3
- import { NodeData } from '../types/Node';
4
4
  /**
5
- * @description Agent 节点,包含底部三个菱形子插槽与主输出。
5
+ * @description Agent 节点,包含底部三个孤独 AI 入桩与主输出。
6
6
  * @param {NodeProps<NodeData>} props React Flow 代理节点参数。
7
7
  * @returns {JSX.Element} 渲染后的 Agent 节点。
8
8
  */
@@ -1,8 +1,8 @@
1
+ import { NodeData } from '../types/Node';
1
2
  import { Node, NodeProps } from '@xyflow/react';
2
3
  import { default as React } from 'react';
3
- import { NodeData } from '../types/Node';
4
4
  /**
5
- * @description 浏览器节点,提供模型接入与右侧主输出的卡片布局。
5
+ * @description 浏览器节点,提供底部模型孤独入桩与右侧主输出。
6
6
  * @param {NodeProps<NodeData>} props React Flow 浏览器节点参数。
7
7
  * @returns {JSX.Element} 渲染后的浏览器节点。
8
8
  */
@@ -14,13 +14,22 @@ export declare enum HandleType {
14
14
  export declare enum HandleConnectionType {
15
15
  INPUT = "input",
16
16
  OUTPUT = "output",
17
+ /** @deprecated 旧版 Agent/Browser SOURCE 半线,加载时升级为 AI_MODEL */
17
18
  CHAT_MODEL = "chat_model",
18
19
  DONE = "done",
19
20
  LOOP = "loop",
20
21
  FALSE = "false",
21
22
  TRUE = "true",
23
+ /** @deprecated 旧版 Agent SOURCE 半线,加载时升级为 AI_MEMORY */
22
24
  MEMORY = "memory",
25
+ /** @deprecated 旧版 Agent SOURCE 半线,加载时升级为 AI_TOOL */
23
26
  TOOLS = "tools",
27
+ /** 高级 AI / 浏览器节点底部模型入桩(孤独 target) */
28
+ AI_MODEL = "ai_model",
29
+ /** 高级 AI 节点底部记忆入桩(孤独 target) */
30
+ AI_MEMORY = "ai_memory",
31
+ /** 高级 AI 节点底部工具入桩(孤独 target) */
32
+ AI_TOOL = "ai_tool",
24
33
  BUILTIN_MCP = "builtin_mcp"
25
34
  }
26
35
  /**
@@ -43,6 +43,9 @@ export interface DigitalseeWorkFlowProps {
43
43
  /**
44
44
  * 保存回调
45
45
  *
46
+ * 仅在用户主动保存时触发(工具栏保存、发布前落草稿、canvasApi.saveFlow),
47
+ * 节点新增等内部自动保存不会调用,避免宿主 toast 刷屏。
48
+ *
46
49
  * @param workflow 当前工作流数据
47
50
  */
48
51
  onSave?: (workflow: FlowDraftPayload) => void | Promise<void>;
@@ -0,0 +1,23 @@
1
+ import { HandleConnectionType } from '../types/Handle';
2
+ import { NodeProtocol } from '../types/NodeProtocol';
3
+ import { Edge, Node } from '@xyflow/react';
4
+ /** 旧版高级 AI / 浏览器节点底部孤独入桩(connectable 查询用 target_handle)。 */
5
+ export declare const LEGACY_AI_LONELY_TARGET_HANDLES: readonly [HandleConnectionType.AI_MODEL, HandleConnectionType.AI_MEMORY, HandleConnectionType.AI_TOOL];
6
+ export type LegacyAiLonelyTargetHandle = (typeof LEGACY_AI_LONELY_TARGET_HANDLES)[number];
7
+ export declare function isLegacyAiLonelyTargetHandle(handleId?: string | null): handleId is LegacyAiLonelyTargetHandle;
8
+ /** 将历史 chat_model/memory/tools(及已是 ai_*)映射为固定 target_handle。 */
9
+ export declare function resolveLegacyAiLonelyTargetHandle(handleId?: string | null): LegacyAiLonelyTargetHandle | undefined;
10
+ export declare function getProtocolForLegacyAiLonelyTargetHandle(handleId?: string | null): NodeProtocol | undefined;
11
+ /**
12
+ * 校验 AI 子节点连入 Agent/Browser 孤独入桩:
13
+ * 由 AI 子节点 SOURCE 发起,Agent/Browser 的 ai_* TARGET 接收。
14
+ */
15
+ export declare function isValidLegacyAiLonelyConnection(options: {
16
+ sourceProtocol?: NodeProtocol | string | null;
17
+ targetHandle?: string | null;
18
+ }): boolean;
19
+ /**
20
+ * 将历史「Agent SOURCE(chat_model) → AISub TARGET(input)」边升级为
21
+ * 「AISub SOURCE(output) → Agent TARGET(ai_model)」。
22
+ */
23
+ export declare function upgradeLegacyAiCanvasEdges<T extends Pick<Edge, 'source' | 'target' | 'sourceHandle' | 'targetHandle'>>(nodes: Array<Pick<Node, 'id' | 'type'>>, edges: T[]): T[];
@@ -34,11 +34,14 @@ export declare const resolveMcpCanvasTargetHandle: (_nodes: McpNodeIdentity[], f
34
34
  /** 保存前不得把 Schema 端口改写成视觉方向名称。 */
35
35
  export declare const normalizeMcpCanvasEdge: <T extends Pick<Edge, "targetHandle">>(_nodes: McpNodeIdentity[], edge: T) => T;
36
36
  export declare const normalizeMcpCanvasEdges: <T extends Pick<Edge, "targetHandle">>(nodes: McpNodeIdentity[], edges: T[]) => T[];
37
+ /** 旧版 MCP 画布把视觉方向写成了 targetHandle(以及部分 NodeSchema inputs.name)。 */
38
+ export declare const LEGACY_MCP_CANVAS_TARGET_HANDLE = "top";
39
+ type McpCanvasEdgeNode = Pick<Node, 'id' | 'type'> & Partial<Pick<Node, 'data'>>;
37
40
  /**
38
- * 升级旧版 MCP 画布的虚拟方向端口。
41
+ * 升级旧版 MCP 画布的虚拟方向 targetHandle。
39
42
  *
40
- * 旧实现会在 MCP Server 画布中把 output/top builtin_mcp/top 当作真实端口保存;
41
- * 新版必须恢复为 NodeSchema main/main,下一次保存时写回正确数据。
43
+ * 旧实现会把 MCP Server 画布上所有边的 targetHandle 写成 `top`。
44
+ * MCP 网关相关节点 Schema 仍声明 top,需保留;经典 Action 等节点入桩是 input,需改回。
42
45
  */
43
- export declare const upgradeLegacyMcpCanvasEdges: <T extends Pick<Edge, "sourceHandle" | "targetHandle">>(nodes: McpNodeIdentity[], edges: T[]) => T[];
46
+ export declare const upgradeLegacyMcpCanvasEdges: <T extends Pick<Edge, "source" | "target" | "sourceHandle" | "targetHandle">>(nodes: McpCanvasEdgeNode[], edges: T[]) => T[];
44
47
  export {};
@@ -0,0 +1,17 @@
1
+ import { FieldDef, ValueModePolicy } from '../../types/form-schema';
2
+ import type * as React from 'react';
3
+ /**
4
+ * 将父级 valueModePolicy 注入到子字段;父级未配置时保留子字段自身策略。
5
+ */
6
+ export declare function withInheritedValueModePolicy<T extends FieldDef>(child: T, parentPolicy?: ValueModePolicy): T;
7
+ type ValueModeFieldScopeProps = {
8
+ policy?: ValueModePolicy;
9
+ disabled?: boolean;
10
+ readOnly?: boolean;
11
+ children: React.ReactNode;
12
+ };
13
+ /**
14
+ * 复杂字段第一层值模式作用域:渲染顶层切换器,抑制子级递归切换器。
15
+ */
16
+ export declare const ValueModeFieldScope: React.FC<ValueModeFieldScopeProps>;
17
+ export {};
@@ -0,0 +1,26 @@
1
+ import { ValueModePolicy } from '../../types/form-schema';
2
+ /** 与 ValueModeWrapper 保持一致的值模式 */
3
+ export type ValueModePolicyScopeMode = 'normal' | 'expression' | 'code';
4
+ /**
5
+ * 父级表单项的值模式作用域。
6
+ * 复杂字段(KEY_VALUE / OBJECT / ARRAY 等)在第一层挂载后,
7
+ * 子输入只消费 mode/policy,不再各自渲染右上角切换器。
8
+ */
9
+ export type ValueModePolicyContextValue = {
10
+ policy: ValueModePolicy;
11
+ mode: ValueModePolicyScopeMode;
12
+ onModeChange: (mode: ValueModePolicyScopeMode) => void;
13
+ /** 子级 ValueModeWrapper 隐藏模式切换器 */
14
+ suppressNestedSwitch: true;
15
+ };
16
+ export declare function useValueModePolicyOptional(): ValueModePolicyContextValue | null;
17
+ export type ValueModePolicyScopeProps = {
18
+ policy: ValueModePolicy;
19
+ mode: ValueModePolicyScopeMode;
20
+ onModeChange: (mode: ValueModePolicyScopeMode) => void;
21
+ children: React.ReactNode;
22
+ };
23
+ /**
24
+ * 在表单项第一层建立值模式作用域,向下传递 mode,抑制子级切换器。
25
+ */
26
+ export declare const ValueModePolicyScope: React.FC<ValueModePolicyScopeProps>;
@@ -0,0 +1,16 @@
1
+ import { ValueMode } from './valueModeConfig';
2
+ import { ValueModePolicy } from '../../types/form-schema';
3
+ import type * as React from 'react';
4
+ export type ValueModeSwitchProps = {
5
+ valueModePolicy: ValueModePolicy;
6
+ mode: ValueMode;
7
+ onModeChange?: (mode: ValueMode) => void;
8
+ disabled?: boolean;
9
+ readOnly?: boolean;
10
+ modeSwitchPosition?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
11
+ };
12
+ /**
13
+ * 右上角模式指示/切换器。
14
+ * BOTH 可切换;TEXT / EXPRESSION 渲染单个选中态选项,便于肉眼识别当前输入模式。
15
+ */
16
+ export declare const ValueModeSwitch: React.FC<ValueModeSwitchProps>;
@@ -1,10 +1,11 @@
1
+ import { ValueMode } from './valueModeConfig';
1
2
  import { ValueModePolicy } from '../../types/form-schema';
2
3
  import * as React from 'react';
3
- export type ValueMode = 'normal' | 'expression' | 'code';
4
- export declare function getValueModePolicyConfig(policy: ValueModePolicy): {
5
- availableModes: ValueMode[];
6
- defaultMode: ValueMode;
7
- };
4
+ export { ValueModeFieldScope, withInheritedValueModePolicy, } from './ValueModeFieldScope';
5
+ export { useValueModePolicyOptional, type ValueModePolicyContextValue, ValueModePolicyScope, type ValueModePolicyScopeProps, } from './ValueModePolicyContext';
6
+ export { ValueModeSwitch, type ValueModeSwitchProps, } from './ValueModeSwitch';
7
+ export type { ValueMode } from './valueModeConfig';
8
+ export { getValueModePolicyConfig } from './valueModeConfig';
8
9
  export declare function isEncodedExpressionValue(value: unknown): value is string;
9
10
  /**
10
11
  * 将节点配置中的历史值统一转换为输入组件可消费的字符串。
@@ -0,0 +1,11 @@
1
+ import { ValueModePolicy } from '../../types/form-schema';
2
+ export type ValueMode = 'normal' | 'expression' | 'code';
3
+ export declare const DEFAULT_AVAILABLE_MODES: ValueMode[];
4
+ export declare const VALUE_MODE_POLICY_CONFIG: Record<ValueModePolicy, {
5
+ availableModes: ValueMode[];
6
+ defaultMode: ValueMode;
7
+ }>;
8
+ export declare function getValueModePolicyConfig(policy: ValueModePolicy): {
9
+ availableModes: ValueMode[];
10
+ defaultMode: ValueMode;
11
+ };
@@ -11,40 +11,34 @@ export interface VariableInfo {
11
11
  /** 图标 URL 或 React 节点 */
12
12
  icon?: string | React.ReactNode;
13
13
  }
14
- export type ValueMode = 'normal' | 'expression' | 'code' | 'fixValue';
14
+ export type ValueMode = 'normal' | 'expression' | 'code' | 'formValue';
15
15
  interface RegisteredField {
16
16
  id: string;
17
17
  insertVariable: (variable: string, formatted: boolean) => void;
18
18
  focus: () => void;
19
19
  }
20
- export interface VariableSelectorContextValue {
21
- /** 当前激活的字段 ID */
20
+ /** 会随焦点/可见性变化的状态;仅真正需要订阅的组件应使用 */
21
+ export interface VariableSelectorStateValue {
22
22
  activeFieldId: string | null;
23
- /** 变量选择器是否可见 */
24
23
  selectorVisible: boolean;
25
- /** 可用变量列表 */
26
24
  availableVariables: VariableInfo[];
27
- /** 注册字段 */
25
+ }
26
+ /** 稳定操作接口;VariableInput 只消费这份,避免焦点切换拖垮整树 Slate 重渲染 */
27
+ export interface VariableSelectorActionsValue {
28
28
  registerField: (field: RegisteredField) => void;
29
- /** 注销字段 */
30
29
  unregisterField: (id: string) => void;
31
- /** 激活字段(获得焦点时调用) */
32
30
  activateField: (id: string) => void;
33
- /** 取消激活 */
34
31
  deactivateField: () => void;
35
- /** 显示/隐藏变量选择器 */
36
32
  setSelectorVisible: (visible: boolean) => void;
37
- /** 插入变量到当前激活的字段 */
38
33
  insertVariableToActiveField: (variable: string, wrapWithBraces?: boolean) => void;
39
- /** 设置可用变量列表 */
40
34
  setAvailableVariables: (variables: VariableInfo[]) => void;
41
- /** 验证变量是否有效 */
42
35
  validateVariable: (variable: string) => boolean;
43
- /** 格式化变量为 {{variable}} 格式 */
44
36
  formatVariable: (variable: string) => string;
45
- /** 从格式化字符串中提取变量 */
46
37
  extractVariable: (formatted: string) => string | null;
38
+ /** 读取当前激活字段(不触发订阅,供桥接插入使用) */
39
+ getActiveFieldId: () => string | null;
47
40
  }
41
+ export type VariableSelectorContextValue = VariableSelectorStateValue & VariableSelectorActionsValue;
48
42
  export interface VariableSelectorProviderProps {
49
43
  children: React.ReactNode;
50
44
  /** 初始可用变量列表 */
@@ -57,11 +51,18 @@ export interface VariableSelectorProviderProps {
57
51
  onValidateVariable?: (variable: string) => boolean;
58
52
  }
59
53
  export declare const VariableSelectorProvider: React.FC<VariableSelectorProviderProps>;
54
+ /** 完整读写(状态 + 操作)。焦点切换时会重渲染,仅桥接/面板使用 */
60
55
  export declare const useVariableSelector: () => VariableSelectorContextValue;
56
+ /**
57
+ * 注册字段:只订阅稳定 Actions,不因 activeFieldId 变化而重渲染。
58
+ * 这是创建账号弹窗内多个 Slate 与节点配置表单并存时避免假死的关键路径。
59
+ */
61
60
  export declare const useRegisterVariableField: (id: string, insertVariable: (variable: string, formatted: boolean) => void, focus: () => void) => {
62
61
  activate: () => void;
63
62
  deactivate: () => void;
64
- isActive: boolean;
65
63
  };
64
+ /** 仅订阅稳定操作,不因焦点切换重渲染 */
65
+ export declare const useVariableSelectorActionsOptional: () => VariableSelectorActionsValue | null;
66
+ /** 可选订阅:同时拿状态与操作;无 Provider 时返回 null */
66
67
  export declare const useVariableSelectorOptional: () => VariableSelectorContextValue | null;
67
68
  export {};
@@ -1,10 +1,10 @@
1
1
  export * from './AntdProvider';
2
2
  export { AI_FILL_VALUE, AIFieldWrapper, type AIFieldWrapperProps, } from './components/AIFieldWrapper';
3
3
  export { type SelectValueMode, SelectWithExpression, type SelectWithExpressionProps, } from './components/SelectWithExpression';
4
- export { type ValueMode, ValueModeWrapper, type ValueModeWrapperProps, } from './components/ValueModeWrapper';
4
+ export { useValueModePolicyOptional, type ValueMode, ValueModeFieldScope, ValueModePolicyScope, ValueModeSwitch, type ValueModeSwitchProps, ValueModeWrapper, type ValueModeWrapperProps, withInheritedValueModePolicy, } from './components/ValueModeWrapper';
5
5
  export { VariableInput, type VariableInputProps, } from './components/VariableInput';
6
6
  export { VariableTextarea, type VariableTextareaProps, } from './components/VariableTextarea';
7
- export { useRegisterVariableField, useVariableSelector, useVariableSelectorOptional, type VariableInfo, type VariableSelectorContextValue, VariableSelectorProvider, type VariableSelectorProviderProps, } from './context/VariableSelectorContext';
7
+ export { useRegisterVariableField, useVariableSelector, useVariableSelectorActionsOptional, useVariableSelectorOptional, type VariableInfo, type VariableSelectorActionsValue, type VariableSelectorContextValue, VariableSelectorProvider, type VariableSelectorProviderProps, type VariableSelectorStateValue, } from './context/VariableSelectorContext';
8
8
  export * from './DynamicForm';
9
9
  export * from './DynamicFormContext';
10
10
  export * from './FieldRenderer';
@@ -1,5 +1,5 @@
1
1
  import { jsx as n, jsxs as C } from "react/jsx-runtime";
2
- import { D as F, V as R, e as V, i as T, t as l, f as P, d as L } from "./index-B3ZrjegL.mjs";
2
+ import { D as F, V as R, e as V, i as T, t as l, f as P, d as L } from "./index-CqZ6Y0AC.mjs";
3
3
  import { useEventEmitter as O, useReactive as B, useSize as W } from "ahooks";
4
4
  import { FormattedMessage as $ } from "react-intl";
5
5
  import { CloseCircleFilled as z, CheckCircleFilled as A } from "@ant-design/icons";
@@ -309,4 +309,4 @@ function $e(e) {
309
309
  export {
310
310
  $e as default
311
311
  };
312
- //# sourceMappingURL=index-DgHUyAIK.mjs.map
312
+ //# sourceMappingURL=index-BnE-Ea2s.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DgHUyAIK.mjs","sources":["../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/IDEVariableModal/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/sider/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/title/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/toolbar/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/index.tsx"],"sourcesContent":["import styles from '@workflow/NodesConfig/components/online-ide/components/IDEVariableModal/variableModal.module.less';\nimport { VariableModal } from '@workflow/NodesConfig/components/VariableModal';\nimport { DrawerContext } from '@workflow/NodesConfig/context';\nimport { useEventEmitter } from 'ahooks';\n\ntype VariableModalProps = {\n nodeId: string;\n onInsert: (values: any) => void;\n open: boolean;\n};\n\nexport const IDEVariableModal: React.FC<VariableModalProps> = (props) => {\n const { nodeId, onInsert, open } = props;\n const event$ = useEventEmitter<any>();\n\n event$.useSubscription((value: any) => {\n if (value.type === 'insert') {\n onInsert(value.expression);\n }\n });\n\n return (\n <DrawerContext.Provider value={{ event$ }}>\n <div className={styles.ideWrapper}>\n <VariableModal nodeId={nodeId} onInsert={onInsert} open={open} />\n </div>\n </DrawerContext.Provider>\n );\n};\n","import { IDEVariableModal } from '@workflow/NodesConfig/components/online-ide/components/IDEVariableModal';\nimport styles from '@workflow/NodesConfig/components/online-ide/components/sider/sider.module.less';\n\ninterface ISiderProps {\n onFinish: () => void;\n onCancel: () => void;\n editor: any;\n open: boolean;\n onInsert: (values) => void;\n nodeId: string;\n}\nexport function Sider(props: ISiderProps) {\n return (\n <div className={styles.siderContainer}>\n <div>\n <IDEVariableModal open={props.open} nodeId={props.nodeId} onInsert={props.onInsert} />\n </div>\n <div style={{ textAlign: 'center' }}></div>\n </div>\n );\n}\n","import { FormattedMessage } from '@workflow/migration/umi';\n\ninterface TitleControlProps {\n language?: string;\n}\n\nexport function TitleControl({ language = 'javascript' }: TitleControlProps) {\n return (\n <h3 style={{ color: '#999', fontSize: 16, margin: '6px 0' }}>\n <FormattedMessage id=\"link.flow.code_editor\" /> ({language.toUpperCase()})\n </h3>\n );\n}\n","import { CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons';\nimport { Button } from 'antd';\nimport { FormattedMessage } from '@workflow/migration/umi';\n\ninterface IToolBarProps {\n onFinish: () => void;\n onCancel: () => void;\n}\nexport function ToolBar(props: IToolBarProps) {\n return (\n <div\n style={{\n color: 'white',\n display: 'flex',\n paddingRight: 30,\n alignItems: 'center',\n height: '100%',\n fontSize: 16,\n }}\n >\n <Button\n type=\"primary\"\n size=\"small\"\n style={{ marginRight: 10 }}\n disabled={false}\n danger\n onClick={props.onCancel}\n icon={<CloseCircleFilled onClick={props.onCancel} />}\n >\n <FormattedMessage id=\"app.common.word.cancel\" />\n </Button>\n <Button\n type=\"primary\"\n size=\"small\"\n style={{ marginRight: 10 }}\n onClick={props.onFinish}\n icon={<CheckCircleFilled />}\n >\n <FormattedMessage id=\"app.common.word.finish\" />\n </Button>\n </div>\n );\n}\n","// cspell:ignore jssnippets\nimport styles from '@workflow/NodesConfig/components/online-ide/onlineIDE.module.less';\nimport '@workflow/NodesConfig/components/online-ide/ide.token.less';\nimport { Sider } from '@workflow/NodesConfig/components/online-ide/components/sider';\nimport { TitleControl } from '@workflow/NodesConfig/components/online-ide/components/title';\nimport { ToolBar } from '@workflow/NodesConfig/components/online-ide/components/toolbar';\nimport type { FlowVariableMatch } from '@workflow/NodesConfig/components/online-ide/helper/flowVariables';\nimport {\n doesRangeIntersectFlowVariable,\n extractFlowVariables,\n isPositionInFlowVariable,\n} from '@workflow/NodesConfig/components/online-ide/helper/flowVariables';\nimport jsSnippets from '@workflow/NodesConfig/components/online-ide/helper/jssnippets.json';\nimport { t } from '@workflow/utils/common';\nimport { flowDesignerDAO } from '@workflow/utils/glob';\nimport { useReactive, useSize } from 'ahooks';\nimport * as monaco from 'monaco-editor';\nimport { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { EditorDidMount } from 'react-monaco-editor';\nimport MonacoEditor from 'react-monaco-editor';\n\ntype Writable<T> = {\n -readonly [K in keyof T]: T[K];\n};\ntype Options = Parameters<typeof MonacoEditor>['0']['options'];\n\ntype EditorInstance = Writable<Parameters<EditorDidMount>['0']>;\ntype MonacoInstance = Parameters<EditorDidMount>['1'];\n\nconst OPTIONS: Options = {\n selectOnLineNumbers: true,\n automaticLayout: true,\n padding: {\n top: 10,\n },\n};\n\nfunction formatFlowVariableHover(variable: FlowVariableMatch) {\n if (variable.type === 'global') {\n return [\n `**${t('link.flow.variable_type_global')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n `${t('link.flow.variable_name')}:\\`${variable.path}\\``,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n if (variable.type === 'builtin') {\n const builtinTips = flowDesignerDAO.getBuiltinVariableTips(variable.firstPart);\n return [\n `**${t('link.flow.variable_type_builtin')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n builtinTips,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n if (variable.type === 'node') {\n return [\n `**${t('link.flow.variable_type_node')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n variable.path ? `${t('link.flow.variable_field')}:\\`${variable.path}\\`` : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n return [\n `**${t('link.flow.variable_type_platform')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n ].join('\\n\\n');\n}\n\nconst toMarkerData = (marker: monaco.editor.IMarker): monaco.editor.IMarkerData => ({\n code: marker.code,\n severity: marker.severity,\n message: marker.message,\n source: marker.source,\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n modelVersionId: marker.modelVersionId,\n relatedInformation: marker.relatedInformation,\n tags: marker.tags,\n});\n\nfunction filterFlowVariableMarkers(\n monacoInstance: MonacoInstance,\n model: monaco.editor.ITextModel,\n) {\n const variables = extractFlowVariables(model.getValue());\n if (!variables.length) {\n return;\n }\n\n const markers = monacoInstance.editor.getModelMarkers({ resource: model.uri });\n const markersByOwner = new Map<string, monaco.editor.IMarker[]>();\n\n markers.forEach((marker) => {\n const ownerMarkers = markersByOwner.get(marker.owner) ?? [];\n ownerMarkers.push(marker);\n markersByOwner.set(marker.owner, ownerMarkers);\n });\n\n markersByOwner.forEach((ownerMarkers, owner) => {\n const nextMarkers = ownerMarkers.filter(\n (marker) => !variables.some((variable) => doesRangeIntersectFlowVariable(variable, marker)),\n );\n\n if (nextMarkers.length !== ownerMarkers.length) {\n monacoInstance.editor.setModelMarkers(model, owner, nextMarkers.map(toMarkerData));\n }\n });\n}\n\nfunction initPrompt(monaco, language: 'javascript' | 'json') {\n const suggestions = [].map((item) => {\n return {\n insertText: item,\n kind: monaco.languages.CompletionItemKind.Function, // 对应提示图标的不同\n label: item,\n };\n });\n return monaco.languages.registerCompletionItemProvider(language, {\n provideCompletionItems() {\n return {\n suggestions,\n };\n },\n quickSuggestions: true, // 默认提示关闭\n triggerCharacters: ['{', '.', '=', ':'], // 触发提示的字符 可以定义多个\n });\n}\nfunction initLanguageAndHoverSettings(monaco) {\n monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: true,\n noSyntaxValidation: false,\n });\n\n // compiler options\n monaco.languages.typescript.javascriptDefaults.setCompilerOptions({\n target: monaco.languages.typescript.ScriptTarget.ES2015,\n allowNonTsExtensions: true,\n });\n return monaco.languages.registerCompletionItemProvider('javascript', {\n provideCompletionItems: () => {\n const snippets = jsSnippets as any;\n\n return {\n suggestions: snippets.snippets.map((snippet) => ({\n label: snippet.trigger,\n kind: monaco.languages.CompletionItemKind.Method,\n detail: snippet.desc ?? '',\n insertText: snippet.content,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n })),\n };\n },\n });\n}\n\nexport interface IOnlineIDEProps {\n initialValue?: string;\n\n nodeId?: string;\n\n onChange?: (value: string) => void;\n\n onFinish: (value: string) => void;\n\n onCancel: () => void;\n\n open?: boolean;\n\n language?: 'javascript' | 'json';\n\n showVariableSidebar?: boolean;\n}\n\nexport default function OnlineIDE(props: IOnlineIDEProps) {\n const { open, nodeId, initialValue, language = 'javascript', showVariableSidebar = true } = props;\n\n const editorInstance = useRef<EditorInstance>(null);\n const languageDisposables = useRef<monaco.IDisposable[]>([]);\n const state = useReactive({\n code: '',\n range: new monaco.Range(1, 1, 1, 1) as any,\n });\n const editorDidMount: EditorDidMount = (editor, monaco) => {\n editor.onDidChangeCursorPosition((event) => {\n // 获取当前光标的位置\n const position = event.position;\n // 保存光标位置,可以将其存储在一个变量或者其他地方\n const { lineNumber = 0, column = 0 } = position;\n state.range = new monaco.Range(lineNumber, column, lineNumber, column);\n });\n editorInstance.current = editor as EditorInstance;\n\n // 注册鼠标hover事件\n editor.focus();\n state.code = editor.getValue();\n const hoverDisposable = monaco.languages.registerHoverProvider(language, {\n provideHover: (model, position) => {\n // 根据鼠标位置和文本内容,计算需要显示的自定义 hover 内容\n // 这里可以使用你的位置信息和内容信息进行逻辑处理和自定义展示\n // 返回一个包含自定义 hover 内容的 Promise 对象\n\n // 示例:返回一个包含位置信息和内容信息的字符串\n\n return new Promise((resolve) => {\n const matches = extractFlowVariables(model.getValue());\n const locatedVariable = matches.find((item) =>\n isPositionInFlowVariable(item, position.lineNumber, position.column),\n );\n\n if (!locatedVariable) {\n resolve(null);\n return;\n }\n\n resolve({\n range: new monaco.Range(\n locatedVariable.startLine,\n locatedVariable.startColumn,\n locatedVariable.endLine,\n locatedVariable.endColumn,\n ),\n contents: [{ value: formatFlowVariableHover(locatedVariable) }],\n });\n });\n },\n });\n\n const model = editor.getModel();\n if (model) {\n let filteringMarkers = false;\n const markerDisposable = monaco.editor.onDidChangeMarkers((uris) => {\n if (filteringMarkers || !uris.some((uri) => uri.toString() === model.uri.toString())) {\n return;\n }\n\n filteringMarkers = true;\n window.setTimeout(() => {\n try {\n filterFlowVariableMarkers(monaco, model);\n } finally {\n filteringMarkers = false;\n }\n }, 0);\n });\n\n filterFlowVariableMarkers(monaco, model);\n editor.onDidDispose(() => markerDisposable.dispose());\n }\n editor.onDidDispose(() => hoverDisposable.dispose());\n };\n const beforeMount = (monaco) => {\n languageDisposables.current.forEach((disposable) => {\n disposable.dispose();\n });\n languageDisposables.current = [initPrompt(monaco, language)];\n if (language === 'javascript') {\n languageDisposables.current.push(initLanguageAndHoverSettings(monaco));\n }\n };\n\n useEffect(\n () => () => {\n languageDisposables.current.forEach((disposable) => {\n disposable.dispose();\n });\n languageDisposables.current = [];\n },\n [],\n );\n\n const onInsert = (nodeVariableText: string) => {\n const content = [\n {\n range: state.range,\n text: nodeVariableText,\n forceMoveMarkers: true,\n },\n ];\n if (editorInstance.current && state.range) {\n editorInstance.current.executeEdits('my-source', content);\n }\n };\n const onFinish = () => {\n props.onFinish?.(state.code);\n };\n const ideContainerRef = useRef(null);\n const size = useSize(ideContainerRef);\n return createPortal(\n <div\n className={styles.modalContainer}\n ref={ideContainerRef}\n style={{ display: open ? 'flex' : 'none' }}\n >\n <div className={styles.editorContainer} id=\"javascript-code-editor\">\n {showVariableSidebar ? (\n <div className={styles.sider}>\n <Sider\n onCancel={props.onCancel}\n onFinish={onFinish}\n editor={editorInstance.current}\n nodeId={nodeId as string}\n open={open!}\n onInsert={onInsert}\n />\n </div>\n ) : null}\n\n <div className={styles.main}>\n <div className={styles.header}>\n <TitleControl language={language} />\n\n <ToolBar onCancel={props.onCancel} onFinish={onFinish} />\n </div>\n <div className={styles.editor}>\n <MonacoEditor\n width=\"100%\"\n key={nodeId}\n height={(size?.height ?? 0) - 40}\n language={language}\n theme=\"vs-dark\"\n value={initialValue}\n options={OPTIONS}\n onChange={(value) => {\n state.code = value;\n }}\n editorWillMount={beforeMount}\n editorDidMount={editorDidMount}\n />\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"names":["IDEVariableModal","props","nodeId","onInsert","open","event$","useEventEmitter","value","DrawerContext","jsx","styles","VariableModal","Sider","jsxs","TitleControl","language","FormattedMessage","ToolBar","Button","CloseCircleFilled","CheckCircleFilled","OPTIONS","formatFlowVariableHover","variable","t","builtinTips","flowDesignerDAO","toMarkerData","marker","filterFlowVariableMarkers","monacoInstance","model","variables","extractFlowVariables","markers","markersByOwner","ownerMarkers","owner","nextMarkers","doesRangeIntersectFlowVariable","initPrompt","monaco","suggestions","item","initLanguageAndHoverSettings","jsSnippets","snippet","OnlineIDE","initialValue","showVariableSidebar","editorInstance","useRef","languageDisposables","state","useReactive","editorDidMount","editor","event","position","lineNumber","column","hoverDisposable","resolve","locatedVariable","isPositionInFlowVariable","filteringMarkers","markerDisposable","uris","uri","beforeMount","disposable","useEffect","nodeVariableText","content","onFinish","_a","ideContainerRef","size","useSize","createPortal","MonacoEditor"],"mappings":"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"}
1
+ {"version":3,"file":"index-BnE-Ea2s.mjs","sources":["../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/IDEVariableModal/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/sider/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/title/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/components/toolbar/index.tsx","../src/lib/components/digitalsee/workflow/NodesConfig/components/online-ide/index.tsx"],"sourcesContent":["import styles from '@workflow/NodesConfig/components/online-ide/components/IDEVariableModal/variableModal.module.less';\nimport { VariableModal } from '@workflow/NodesConfig/components/VariableModal';\nimport { DrawerContext } from '@workflow/NodesConfig/context';\nimport { useEventEmitter } from 'ahooks';\n\ntype VariableModalProps = {\n nodeId: string;\n onInsert: (values: any) => void;\n open: boolean;\n};\n\nexport const IDEVariableModal: React.FC<VariableModalProps> = (props) => {\n const { nodeId, onInsert, open } = props;\n const event$ = useEventEmitter<any>();\n\n event$.useSubscription((value: any) => {\n if (value.type === 'insert') {\n onInsert(value.expression);\n }\n });\n\n return (\n <DrawerContext.Provider value={{ event$ }}>\n <div className={styles.ideWrapper}>\n <VariableModal nodeId={nodeId} onInsert={onInsert} open={open} />\n </div>\n </DrawerContext.Provider>\n );\n};\n","import { IDEVariableModal } from '@workflow/NodesConfig/components/online-ide/components/IDEVariableModal';\nimport styles from '@workflow/NodesConfig/components/online-ide/components/sider/sider.module.less';\n\ninterface ISiderProps {\n onFinish: () => void;\n onCancel: () => void;\n editor: any;\n open: boolean;\n onInsert: (values) => void;\n nodeId: string;\n}\nexport function Sider(props: ISiderProps) {\n return (\n <div className={styles.siderContainer}>\n <div>\n <IDEVariableModal open={props.open} nodeId={props.nodeId} onInsert={props.onInsert} />\n </div>\n <div style={{ textAlign: 'center' }}></div>\n </div>\n );\n}\n","import { FormattedMessage } from '@workflow/migration/umi';\n\ninterface TitleControlProps {\n language?: string;\n}\n\nexport function TitleControl({ language = 'javascript' }: TitleControlProps) {\n return (\n <h3 style={{ color: '#999', fontSize: 16, margin: '6px 0' }}>\n <FormattedMessage id=\"link.flow.code_editor\" /> ({language.toUpperCase()})\n </h3>\n );\n}\n","import { CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons';\nimport { Button } from 'antd';\nimport { FormattedMessage } from '@workflow/migration/umi';\n\ninterface IToolBarProps {\n onFinish: () => void;\n onCancel: () => void;\n}\nexport function ToolBar(props: IToolBarProps) {\n return (\n <div\n style={{\n color: 'white',\n display: 'flex',\n paddingRight: 30,\n alignItems: 'center',\n height: '100%',\n fontSize: 16,\n }}\n >\n <Button\n type=\"primary\"\n size=\"small\"\n style={{ marginRight: 10 }}\n disabled={false}\n danger\n onClick={props.onCancel}\n icon={<CloseCircleFilled onClick={props.onCancel} />}\n >\n <FormattedMessage id=\"app.common.word.cancel\" />\n </Button>\n <Button\n type=\"primary\"\n size=\"small\"\n style={{ marginRight: 10 }}\n onClick={props.onFinish}\n icon={<CheckCircleFilled />}\n >\n <FormattedMessage id=\"app.common.word.finish\" />\n </Button>\n </div>\n );\n}\n","// cspell:ignore jssnippets\nimport styles from '@workflow/NodesConfig/components/online-ide/onlineIDE.module.less';\nimport '@workflow/NodesConfig/components/online-ide/ide.token.less';\nimport { Sider } from '@workflow/NodesConfig/components/online-ide/components/sider';\nimport { TitleControl } from '@workflow/NodesConfig/components/online-ide/components/title';\nimport { ToolBar } from '@workflow/NodesConfig/components/online-ide/components/toolbar';\nimport type { FlowVariableMatch } from '@workflow/NodesConfig/components/online-ide/helper/flowVariables';\nimport {\n doesRangeIntersectFlowVariable,\n extractFlowVariables,\n isPositionInFlowVariable,\n} from '@workflow/NodesConfig/components/online-ide/helper/flowVariables';\nimport jsSnippets from '@workflow/NodesConfig/components/online-ide/helper/jssnippets.json';\nimport { t } from '@workflow/utils/common';\nimport { flowDesignerDAO } from '@workflow/utils/glob';\nimport { useReactive, useSize } from 'ahooks';\nimport * as monaco from 'monaco-editor';\nimport { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { EditorDidMount } from 'react-monaco-editor';\nimport MonacoEditor from 'react-monaco-editor';\n\ntype Writable<T> = {\n -readonly [K in keyof T]: T[K];\n};\ntype Options = Parameters<typeof MonacoEditor>['0']['options'];\n\ntype EditorInstance = Writable<Parameters<EditorDidMount>['0']>;\ntype MonacoInstance = Parameters<EditorDidMount>['1'];\n\nconst OPTIONS: Options = {\n selectOnLineNumbers: true,\n automaticLayout: true,\n padding: {\n top: 10,\n },\n};\n\nfunction formatFlowVariableHover(variable: FlowVariableMatch) {\n if (variable.type === 'global') {\n return [\n `**${t('link.flow.variable_type_global')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n `${t('link.flow.variable_name')}:\\`${variable.path}\\``,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n if (variable.type === 'builtin') {\n const builtinTips = flowDesignerDAO.getBuiltinVariableTips(variable.firstPart);\n return [\n `**${t('link.flow.variable_type_builtin')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n builtinTips,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n if (variable.type === 'node') {\n return [\n `**${t('link.flow.variable_type_node')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n variable.path ? `${t('link.flow.variable_field')}:\\`${variable.path}\\`` : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n }\n return [\n `**${t('link.flow.variable_type_platform')}**`,\n `${t('link.flow.variable_path')}:\\`${variable.value}\\``,\n ].join('\\n\\n');\n}\n\nconst toMarkerData = (marker: monaco.editor.IMarker): monaco.editor.IMarkerData => ({\n code: marker.code,\n severity: marker.severity,\n message: marker.message,\n source: marker.source,\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n modelVersionId: marker.modelVersionId,\n relatedInformation: marker.relatedInformation,\n tags: marker.tags,\n});\n\nfunction filterFlowVariableMarkers(\n monacoInstance: MonacoInstance,\n model: monaco.editor.ITextModel,\n) {\n const variables = extractFlowVariables(model.getValue());\n if (!variables.length) {\n return;\n }\n\n const markers = monacoInstance.editor.getModelMarkers({ resource: model.uri });\n const markersByOwner = new Map<string, monaco.editor.IMarker[]>();\n\n markers.forEach((marker) => {\n const ownerMarkers = markersByOwner.get(marker.owner) ?? [];\n ownerMarkers.push(marker);\n markersByOwner.set(marker.owner, ownerMarkers);\n });\n\n markersByOwner.forEach((ownerMarkers, owner) => {\n const nextMarkers = ownerMarkers.filter(\n (marker) => !variables.some((variable) => doesRangeIntersectFlowVariable(variable, marker)),\n );\n\n if (nextMarkers.length !== ownerMarkers.length) {\n monacoInstance.editor.setModelMarkers(model, owner, nextMarkers.map(toMarkerData));\n }\n });\n}\n\nfunction initPrompt(monaco, language: 'javascript' | 'json') {\n const suggestions = [].map((item) => {\n return {\n insertText: item,\n kind: monaco.languages.CompletionItemKind.Function, // 对应提示图标的不同\n label: item,\n };\n });\n return monaco.languages.registerCompletionItemProvider(language, {\n provideCompletionItems() {\n return {\n suggestions,\n };\n },\n quickSuggestions: true, // 默认提示关闭\n triggerCharacters: ['{', '.', '=', ':'], // 触发提示的字符 可以定义多个\n });\n}\nfunction initLanguageAndHoverSettings(monaco) {\n monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: true,\n noSyntaxValidation: false,\n });\n\n // compiler options\n monaco.languages.typescript.javascriptDefaults.setCompilerOptions({\n target: monaco.languages.typescript.ScriptTarget.ES2015,\n allowNonTsExtensions: true,\n });\n return monaco.languages.registerCompletionItemProvider('javascript', {\n provideCompletionItems: () => {\n const snippets = jsSnippets as any;\n\n return {\n suggestions: snippets.snippets.map((snippet) => ({\n label: snippet.trigger,\n kind: monaco.languages.CompletionItemKind.Method,\n detail: snippet.desc ?? '',\n insertText: snippet.content,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n })),\n };\n },\n });\n}\n\nexport interface IOnlineIDEProps {\n initialValue?: string;\n\n nodeId?: string;\n\n onChange?: (value: string) => void;\n\n onFinish: (value: string) => void;\n\n onCancel: () => void;\n\n open?: boolean;\n\n language?: 'javascript' | 'json';\n\n showVariableSidebar?: boolean;\n}\n\nexport default function OnlineIDE(props: IOnlineIDEProps) {\n const { open, nodeId, initialValue, language = 'javascript', showVariableSidebar = true } = props;\n\n const editorInstance = useRef<EditorInstance>(null);\n const languageDisposables = useRef<monaco.IDisposable[]>([]);\n const state = useReactive({\n code: '',\n range: new monaco.Range(1, 1, 1, 1) as any,\n });\n const editorDidMount: EditorDidMount = (editor, monaco) => {\n editor.onDidChangeCursorPosition((event) => {\n // 获取当前光标的位置\n const position = event.position;\n // 保存光标位置,可以将其存储在一个变量或者其他地方\n const { lineNumber = 0, column = 0 } = position;\n state.range = new monaco.Range(lineNumber, column, lineNumber, column);\n });\n editorInstance.current = editor as EditorInstance;\n\n // 注册鼠标hover事件\n editor.focus();\n state.code = editor.getValue();\n const hoverDisposable = monaco.languages.registerHoverProvider(language, {\n provideHover: (model, position) => {\n // 根据鼠标位置和文本内容,计算需要显示的自定义 hover 内容\n // 这里可以使用你的位置信息和内容信息进行逻辑处理和自定义展示\n // 返回一个包含自定义 hover 内容的 Promise 对象\n\n // 示例:返回一个包含位置信息和内容信息的字符串\n\n return new Promise((resolve) => {\n const matches = extractFlowVariables(model.getValue());\n const locatedVariable = matches.find((item) =>\n isPositionInFlowVariable(item, position.lineNumber, position.column),\n );\n\n if (!locatedVariable) {\n resolve(null);\n return;\n }\n\n resolve({\n range: new monaco.Range(\n locatedVariable.startLine,\n locatedVariable.startColumn,\n locatedVariable.endLine,\n locatedVariable.endColumn,\n ),\n contents: [{ value: formatFlowVariableHover(locatedVariable) }],\n });\n });\n },\n });\n\n const model = editor.getModel();\n if (model) {\n let filteringMarkers = false;\n const markerDisposable = monaco.editor.onDidChangeMarkers((uris) => {\n if (filteringMarkers || !uris.some((uri) => uri.toString() === model.uri.toString())) {\n return;\n }\n\n filteringMarkers = true;\n window.setTimeout(() => {\n try {\n filterFlowVariableMarkers(monaco, model);\n } finally {\n filteringMarkers = false;\n }\n }, 0);\n });\n\n filterFlowVariableMarkers(monaco, model);\n editor.onDidDispose(() => markerDisposable.dispose());\n }\n editor.onDidDispose(() => hoverDisposable.dispose());\n };\n const beforeMount = (monaco) => {\n languageDisposables.current.forEach((disposable) => {\n disposable.dispose();\n });\n languageDisposables.current = [initPrompt(monaco, language)];\n if (language === 'javascript') {\n languageDisposables.current.push(initLanguageAndHoverSettings(monaco));\n }\n };\n\n useEffect(\n () => () => {\n languageDisposables.current.forEach((disposable) => {\n disposable.dispose();\n });\n languageDisposables.current = [];\n },\n [],\n );\n\n const onInsert = (nodeVariableText: string) => {\n const content = [\n {\n range: state.range,\n text: nodeVariableText,\n forceMoveMarkers: true,\n },\n ];\n if (editorInstance.current && state.range) {\n editorInstance.current.executeEdits('my-source', content);\n }\n };\n const onFinish = () => {\n props.onFinish?.(state.code);\n };\n const ideContainerRef = useRef(null);\n const size = useSize(ideContainerRef);\n return createPortal(\n <div\n className={styles.modalContainer}\n ref={ideContainerRef}\n style={{ display: open ? 'flex' : 'none' }}\n >\n <div className={styles.editorContainer} id=\"javascript-code-editor\">\n {showVariableSidebar ? (\n <div className={styles.sider}>\n <Sider\n onCancel={props.onCancel}\n onFinish={onFinish}\n editor={editorInstance.current}\n nodeId={nodeId as string}\n open={open!}\n onInsert={onInsert}\n />\n </div>\n ) : null}\n\n <div className={styles.main}>\n <div className={styles.header}>\n <TitleControl language={language} />\n\n <ToolBar onCancel={props.onCancel} onFinish={onFinish} />\n </div>\n <div className={styles.editor}>\n <MonacoEditor\n width=\"100%\"\n key={nodeId}\n height={(size?.height ?? 0) - 40}\n language={language}\n theme=\"vs-dark\"\n value={initialValue}\n options={OPTIONS}\n onChange={(value) => {\n state.code = value;\n }}\n editorWillMount={beforeMount}\n editorDidMount={editorDidMount}\n />\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"names":["IDEVariableModal","props","nodeId","onInsert","open","event$","useEventEmitter","value","DrawerContext","jsx","styles","VariableModal","Sider","jsxs","TitleControl","language","FormattedMessage","ToolBar","Button","CloseCircleFilled","CheckCircleFilled","OPTIONS","formatFlowVariableHover","variable","t","builtinTips","flowDesignerDAO","toMarkerData","marker","filterFlowVariableMarkers","monacoInstance","model","variables","extractFlowVariables","markers","markersByOwner","ownerMarkers","owner","nextMarkers","doesRangeIntersectFlowVariable","initPrompt","monaco","suggestions","item","initLanguageAndHoverSettings","jsSnippets","snippet","OnlineIDE","initialValue","showVariableSidebar","editorInstance","useRef","languageDisposables","state","useReactive","editorDidMount","editor","event","position","lineNumber","column","hoverDisposable","resolve","locatedVariable","isPositionInFlowVariable","filteringMarkers","markerDisposable","uris","uri","beforeMount","disposable","useEffect","nodeVariableText","content","onFinish","_a","ideContainerRef","size","useSize","createPortal","MonacoEditor"],"mappings":";;;;;;;;;;;;;;;;;;;GAWaA,KAAiD,CAACC,MAAU;AACvE,QAAM,EAAE,QAAAC,GAAQ,UAAAC,GAAU,MAAAC,EAAA,IAASH,GAC7BI,IAASC,EAAA;AAEf,SAAAD,EAAO,gBAAgB,CAACE,MAAe;AACrC,IAAIA,EAAM,SAAS,YACjBJ,EAASI,EAAM,UAAU;AAAA,EAE7B,CAAC,qBAGEC,EAAc,UAAd,EAAuB,OAAO,EAAE,QAAAH,KAC/B,UAAA,gBAAAI,EAAC,SAAI,WAAWC,GAAO,YACrB,UAAA,gBAAAD,EAACE,GAAA,EAAc,QAAAT,GAAgB,UAAAC,GAAoB,MAAAC,EAAA,CAAY,GACjE,GACF;AAEJ;;;ACjBO,SAASQ,GAAMX,GAAoB;AACxC,SACE,gBAAAY,EAAC,OAAA,EAAI,WAAWH,GAAO,gBACrB,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EACC,UAAA,gBAAAA,EAACT,IAAA,EAAiB,MAAMC,EAAM,MAAM,QAAQA,EAAM,QAAQ,UAAUA,EAAM,SAAA,CAAU,GACtF;AAAA,sBACC,OAAA,EAAI,OAAO,EAAE,WAAW,WAAS,CAAG;AAAA,EAAA,GACvC;AAEJ;ACdO,SAASa,GAAa,EAAE,UAAAC,IAAW,gBAAmC;AAC3E,SACE,gBAAAF,EAAC,MAAA,EAAG,OAAO,EAAE,OAAO,QAAQ,UAAU,IAAI,QAAQ,QAAA,GAChD,UAAA;AAAA,IAAA,gBAAAJ,EAACO,GAAA,EAAiB,IAAG,wBAAA,CAAwB;AAAA,IAAE;AAAA,IAAGD,EAAS,YAAA;AAAA,IAAc;AAAA,EAAA,GAC3E;AAEJ;ACJO,SAASE,GAAQhB,GAAsB;AAC5C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,UAAU;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,QAAA,gBAAAJ;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO,EAAE,aAAa,GAAA;AAAA,YACtB,UAAU;AAAA,YACV,QAAM;AAAA,YACN,SAASjB,EAAM;AAAA,YACf,MAAM,gBAAAQ,EAACU,GAAA,EAAkB,SAASlB,EAAM,UAAU;AAAA,YAElD,UAAA,gBAAAQ,EAACO,GAAA,EAAiB,IAAG,yBAAA,CAAyB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEhD,gBAAAP;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO,EAAE,aAAa,GAAA;AAAA,YACtB,SAASjB,EAAM;AAAA,YACf,wBAAOmB,GAAA,EAAkB;AAAA,YAEzB,UAAA,gBAAAX,EAACO,GAAA,EAAiB,IAAG,yBAAA,CAAyB;AAAA,UAAA;AAAA,QAAA;AAAA,MAChD;AAAA,IAAA;AAAA,EAAA;AAGN;;;;;GCZMK,KAAmB;AAAA,EACvB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,SAAS;AAAA,IACP,KAAK;AAAA,EAAA;AAET;AAEA,SAASC,GAAwBC,GAA6B;AAC5D,MAAIA,EAAS,SAAS;AACpB,WAAO;AAAA,MACL,KAAKC,EAAE,gCAAgC,CAAC;AAAA,MACxC,GAAGA,EAAE,yBAAyB,CAAC,MAAMD,EAAS,KAAK;AAAA,MACnD,GAAGC,EAAE,yBAAyB,CAAC,MAAMD,EAAS,IAAI;AAAA,IAAA,EAEjD,OAAO,OAAO,EACd,KAAK;AAAA;AAAA,CAAM;AAEhB,MAAIA,EAAS,SAAS,WAAW;AAC/B,UAAME,IAAcC,EAAgB,uBAAuBH,EAAS,SAAS;AAC7E,WAAO;AAAA,MACL,KAAKC,EAAE,iCAAiC,CAAC;AAAA,MACzC,GAAGA,EAAE,yBAAyB,CAAC,MAAMD,EAAS,KAAK;AAAA,MACnDE;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK;AAAA;AAAA,CAAM;AAAA,EAChB;AACA,SAAIF,EAAS,SAAS,SACb;AAAA,IACL,KAAKC,EAAE,8BAA8B,CAAC;AAAA,IACtC,GAAGA,EAAE,yBAAyB,CAAC,MAAMD,EAAS,KAAK;AAAA,IACnDA,EAAS,OAAO,GAAGC,EAAE,0BAA0B,CAAC,MAAMD,EAAS,IAAI,OAAO;AAAA,EAAA,EAEzE,OAAO,OAAO,EACd,KAAK;AAAA;AAAA,CAAM,IAET;AAAA,IACL,KAAKC,EAAE,kCAAkC,CAAC;AAAA,IAC1C,GAAGA,EAAE,yBAAyB,CAAC,MAAMD,EAAS,KAAK;AAAA,EAAA,EACnD,KAAK;AAAA;AAAA,CAAM;AACf;AAEA,MAAMI,KAAe,CAACC,OAA8D;AAAA,EAClF,MAAMA,EAAO;AAAA,EACb,UAAUA,EAAO;AAAA,EACjB,SAASA,EAAO;AAAA,EAChB,QAAQA,EAAO;AAAA,EACf,iBAAiBA,EAAO;AAAA,EACxB,aAAaA,EAAO;AAAA,EACpB,eAAeA,EAAO;AAAA,EACtB,WAAWA,EAAO;AAAA,EAClB,gBAAgBA,EAAO;AAAA,EACvB,oBAAoBA,EAAO;AAAA,EAC3B,MAAMA,EAAO;AACf;AAEA,SAASC,EACPC,GACAC,GACA;AACA,QAAMC,IAAYC,EAAqBF,EAAM,SAAA,CAAU;AACvD,MAAI,CAACC,EAAU;AACb;AAGF,QAAME,IAAUJ,EAAe,OAAO,gBAAgB,EAAE,UAAUC,EAAM,KAAK,GACvEI,wBAAqB,IAAA;AAE3B,EAAAD,EAAQ,QAAQ,CAACN,MAAW;AAC1B,UAAMQ,IAAeD,EAAe,IAAIP,EAAO,KAAK,KAAK,CAAA;AACzD,IAAAQ,EAAa,KAAKR,CAAM,GACxBO,EAAe,IAAIP,EAAO,OAAOQ,CAAY;AAAA,EAC/C,CAAC,GAEDD,EAAe,QAAQ,CAACC,GAAcC,MAAU;AAC9C,UAAMC,IAAcF,EAAa;AAAA,MAC/B,CAACR,MAAW,CAACI,EAAU,KAAK,CAACT,MAAagB,EAA+BhB,GAAUK,CAAM,CAAC;AAAA,IAAA;AAG5F,IAAIU,EAAY,WAAWF,EAAa,UACtCN,EAAe,OAAO,gBAAgBC,GAAOM,GAAOC,EAAY,IAAIX,EAAY,CAAC;AAAA,EAErF,CAAC;AACH;AAEA,SAASa,GAAWC,GAAQ1B,GAAiC;AAC3D,QAAM2B,IAAc,CAAA,EAAG,IAAI,CAACC,OACnB;AAAA,IACL,YAAYA;AAAA,IACZ,MAAMF,EAAO,UAAU,mBAAmB;AAAA;AAAA,IAC1C,OAAOE;AAAA,EAAA,EAEV;AACD,SAAOF,EAAO,UAAU,+BAA+B1B,GAAU;AAAA,IAC/D,yBAAyB;AACvB,aAAO;AAAA,QACL,aAAA2B;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,kBAAkB;AAAA;AAAA,IAClB,mBAAmB,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA;AAAA,EAAA,CACvC;AACH;AACA,SAASE,GAA6BH,GAAQ;AAC5CA,SAAAA,EAAO,UAAU,WAAW,mBAAmB,sBAAsB;AAAA,IACnE,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,EAAA,CACrB,GAGDA,EAAO,UAAU,WAAW,mBAAmB,mBAAmB;AAAA,IAChE,QAAQA,EAAO,UAAU,WAAW,aAAa;AAAA,IACjD,sBAAsB;AAAA,EAAA,CACvB,GACMA,EAAO,UAAU,+BAA+B,cAAc;AAAA,IACnE,wBAAwB,OAGf;AAAA,MACL,aAHeI,GAGO,SAAS,IAAI,CAACC,OAAa;AAAA,QAC/C,OAAOA,EAAQ;AAAA,QACf,MAAML,EAAO,UAAU,mBAAmB;AAAA,QAC1C,QAAQK,EAAQ,QAAQ;AAAA,QACxB,YAAYA,EAAQ;AAAA,QACpB,iBAAiBL,EAAO,UAAU,6BAA6B;AAAA,MAAA,EAC/D;AAAA,IAAA;AAAA,EAEN,CACD;AACH;AAoBA,SAAwBM,GAAU9C,GAAwB;AACxD,QAAM,EAAE,MAAAG,GAAM,QAAAF,GAAQ,cAAA8C,GAAc,UAAAjC,IAAW,cAAc,qBAAAkC,IAAsB,OAAShD,GAEtFiD,IAAiBC,EAAuB,IAAI,GAC5CC,IAAsBD,EAA6B,EAAE,GACrDE,IAAQC,EAAY;AAAA,IACxB,MAAM;AAAA,IACN,OAAO,IAAIb,EAAO,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,EAAA,CACnC,GACKc,IAAiC,CAACC,GAAQf,MAAW;AACzD,IAAAe,EAAO,0BAA0B,CAACC,MAAU;AAE1C,YAAMC,IAAWD,EAAM,UAEjB,EAAE,YAAAE,IAAa,GAAG,QAAAC,IAAS,MAAMF;AACvC,MAAAL,EAAM,QAAQ,IAAIZ,EAAO,MAAMkB,GAAYC,GAAQD,GAAYC,CAAM;AAAA,IACvE,CAAC,GACDV,EAAe,UAAUM,GAGzBA,EAAO,MAAA,GACPH,EAAM,OAAOG,EAAO,SAAA;AACpB,UAAMK,IAAkBpB,EAAO,UAAU,sBAAsB1B,GAAU;AAAA,MACvE,cAAc,CAACgB,GAAO2B,MAOb,IAAI,QAAQ,CAACI,MAAY;AAE9B,cAAMC,IADU9B,EAAqBF,EAAM,SAAA,CAAU,EACrB;AAAA,UAAK,CAACY,MACpCqB,EAAyBrB,GAAMe,EAAS,YAAYA,EAAS,MAAM;AAAA,QAAA;AAGrE,YAAI,CAACK,GAAiB;AACpB,UAAAD,EAAQ,IAAI;AACZ;AAAA,QACF;AAEA,QAAAA,EAAQ;AAAA,UACN,OAAO,IAAIrB,EAAO;AAAA,YAChBsB,EAAgB;AAAA,YAChBA,EAAgB;AAAA,YAChBA,EAAgB;AAAA,YAChBA,EAAgB;AAAA,UAAA;AAAA,UAElB,UAAU,CAAC,EAAE,OAAOzC,GAAwByC,CAAe,GAAG;AAAA,QAAA,CAC/D;AAAA,MACH,CAAC;AAAA,IACH,CACD,GAEKhC,IAAQyB,EAAO,SAAA;AACrB,QAAIzB,GAAO;AACT,UAAIkC,IAAmB;AACvB,YAAMC,IAAmBzB,EAAO,OAAO,mBAAmB,CAAC0B,MAAS;AAClE,QAAIF,KAAoB,CAACE,EAAK,KAAK,CAACC,MAAQA,EAAI,SAAA,MAAerC,EAAM,IAAI,SAAA,CAAU,MAInFkC,IAAmB,IACnB,OAAO,WAAW,MAAM;AACtB,cAAI;AACF,YAAApC,EAA0BY,GAAQV,CAAK;AAAA,UACzC,UAAA;AACE,YAAAkC,IAAmB;AAAA,UACrB;AAAA,QACF,GAAG,CAAC;AAAA,MACN,CAAC;AAED,MAAApC,EAA0BY,GAAQV,CAAK,GACvCyB,EAAO,aAAa,MAAMU,EAAiB,QAAA,CAAS;AAAA,IACtD;AACA,IAAAV,EAAO,aAAa,MAAMK,EAAgB,QAAA,CAAS;AAAA,EACrD,GACMQ,IAAc,CAAC5B,MAAW;AAC9B,IAAAW,EAAoB,QAAQ,QAAQ,CAACkB,MAAe;AAClD,MAAAA,EAAW,QAAA;AAAA,IACb,CAAC,GACDlB,EAAoB,UAAU,CAACZ,GAAWC,GAAQ1B,CAAQ,CAAC,GACvDA,MAAa,gBACfqC,EAAoB,QAAQ,KAAKR,GAA6BH,CAAM,CAAC;AAAA,EAEzE;AAEA,EAAA8B;AAAA,IACE,MAAM,MAAM;AACV,MAAAnB,EAAoB,QAAQ,QAAQ,CAACkB,MAAe;AAClD,QAAAA,EAAW,QAAA;AAAA,MACb,CAAC,GACDlB,EAAoB,UAAU,CAAA;AAAA,IAChC;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMjD,IAAW,CAACqE,MAA6B;AAC7C,UAAMC,IAAU;AAAA,MACd;AAAA,QACE,OAAOpB,EAAM;AAAA,QACb,MAAMmB;AAAA,QACN,kBAAkB;AAAA,MAAA;AAAA,IACpB;AAEF,IAAItB,EAAe,WAAWG,EAAM,SAClCH,EAAe,QAAQ,aAAa,aAAauB,CAAO;AAAA,EAE5D,GACMC,IAAW,MAAM;;AACrB,KAAAC,IAAA1E,EAAM,aAAN,QAAA0E,EAAA,KAAA1E,GAAiBoD,EAAM;AAAA,EACzB,GACMuB,IAAkBzB,EAAO,IAAI,GAC7B0B,IAAOC,EAAQF,CAAe;AACpC,SAAOG;AAAA,IACL,gBAAAtE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAO;AAAA,QAClB,KAAKkE;AAAA,QACL,OAAO,EAAE,SAASxE,IAAO,SAAS,OAAA;AAAA,QAElC,4BAAC,OAAA,EAAI,WAAWM,EAAO,iBAAiB,IAAG,0BACxC,UAAA;AAAA,UAAAuC,IACC,gBAAAxC,EAAC,OAAA,EAAI,WAAWC,EAAO,OACrB,UAAA,gBAAAD;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,UAAUX,EAAM;AAAA,cAChB,UAAAyE;AAAA,cACA,QAAQxB,EAAe;AAAA,cACvB,QAAAhD;AAAA,cACA,MAAAE;AAAA,cACA,UAAAD;AAAA,YAAA;AAAA,UAAA,GAEJ,IACE;AAAA,UAEJ,gBAAAU,EAAC,OAAA,EAAI,WAAWH,EAAO,MACrB,UAAA;AAAA,YAAA,gBAAAG,EAAC,OAAA,EAAI,WAAWH,EAAO,QACrB,UAAA;AAAA,cAAA,gBAAAD,EAACK,MAAa,UAAAC,GAAoB;AAAA,cAElC,gBAAAN,EAACQ,IAAA,EAAQ,UAAUhB,EAAM,UAAU,UAAAyE,EAAA,CAAoB;AAAA,YAAA,GACzD;AAAA,YACA,gBAAAjE,EAAC,OAAA,EAAI,WAAWC,EAAO,QACrB,UAAA,gBAAAD;AAAA,cAACuE;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBAEN,UAASH,KAAA,gBAAAA,EAAM,WAAU,KAAK;AAAA,gBAC9B,UAAA9D;AAAA,gBACA,OAAM;AAAA,gBACN,OAAOiC;AAAA,gBACP,SAAS3B;AAAA,gBACT,UAAU,CAACd,MAAU;AACnB,kBAAA8C,EAAM,OAAO9C;AAAA,gBACf;AAAA,gBACA,iBAAiB8D;AAAA,gBACjB,gBAAAd;AAAA,cAAA;AAAA,cAVKrD;AAAA,YAAA,EAWP,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA;AAEb;"}