@flowgram.ai/free-layout-core 0.2.26 → 0.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -2,8 +2,8 @@ import { PlaygroundConfigEntity, CommandService, PlaygroundDragEvent, EntityData
2
2
  export { bindConfigEntity, useConfigEntity, useEntities, useEntityDataFromContext, useEntityFromContext, useListenEvents, usePlayground, usePlaygroundContainer, usePlaygroundContext, usePlaygroundLatest, useRefresh, useService } from '@flowgram.ai/core';
3
3
  import { NodeFormProps } from '@flowgram.ai/node';
4
4
  import { FlowOperationBaseService, FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
- import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowPortEntity, g as WorkflowLineEntity, O as OnDragLineEnd, h as WorkflowPorts, i as WorkflowPortType, j as WorkflowPort, k as LineRenderType, l as WorkflowLineRenderContribution, m as LinePosition } from './workflow-line-entity-BmfC83KK.mjs';
6
- export { K as HoverPosition, C as LINE_HOVER_DISTANCE, v as LineColor, w as LineColors, u as LineType, z as NodesDragEndEvent, y as NodesDragStartEvent, A as NodesDraggingEvent, P as POINT_RADIUS, H as PORT_SIZE, o as WORKFLOW_LINE_ENTITY, M as WorkfloEntityHoverable, s as WorkflowContentChangeEvent, r as WorkflowContentChangeType, R as WorkflowDocumentOptionsDefault, Q as WorkflowDocumentProvider, J as WorkflowEntityHoverable, q as WorkflowJSON, E as WorkflowLineEntityOpts, F as WorkflowLineInfo, D as WorkflowLinePortInfo, x as WorkflowLineRenderContributionFactory, G as WorkflowLineUIState, t as WorkflowNodeMeta, I as WorkflowPortEntityOpts, p as domReactToBounds, n as getPortEntityId, B as onDragLineEndParams } from './workflow-line-entity-BmfC83KK.mjs';
5
+ import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowPortEntity, g as WorkflowLineEntity, O as OnDragLineEnd, h as WorkflowJSON, i as WorkflowPorts, j as WorkflowPortType, k as WorkflowPort, l as LineRenderType, m as WorkflowLineRenderContribution, n as LinePosition } from './workflow-line-entity-JyclGGfq.mjs';
6
+ export { K as HoverPosition, C as LINE_HOVER_DISTANCE, v as LineColor, w as LineColors, u as LineType, z as NodesDragEndEvent, y as NodesDragStartEvent, A as NodesDraggingEvent, P as POINT_RADIUS, H as PORT_SIZE, p as WORKFLOW_LINE_ENTITY, M as WorkfloEntityHoverable, s as WorkflowContentChangeEvent, r as WorkflowContentChangeType, R as WorkflowDocumentOptionsDefault, Q as WorkflowDocumentProvider, J as WorkflowEntityHoverable, E as WorkflowLineEntityOpts, F as WorkflowLineInfo, D as WorkflowLinePortInfo, x as WorkflowLineRenderContributionFactory, G as WorkflowLineUIState, t as WorkflowNodeMeta, I as WorkflowPortEntityOpts, q as domReactToBounds, o as getPortEntityId, B as onDragLineEndParams } from './workflow-line-entity-JyclGGfq.mjs';
7
7
  import { W as WorkflowNodeEntity } from './workflow-sub-canvas-IQzlYvPD.mjs';
8
8
  export { a as WorkflowSubCanvas } from './workflow-sub-canvas-IQzlYvPD.mjs';
9
9
  import * as _flowgram_ai_utils from '@flowgram.ai/utils';
@@ -323,6 +323,13 @@ declare function useWorkflowDocument(): WorkflowDocument;
323
323
  */
324
324
  declare function usePlaygroundReadonlyState(listenChange?: boolean): boolean;
325
325
 
326
+ /**
327
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
328
+ * SPDX-License-Identifier: MIT
329
+ */
330
+
331
+ declare const buildGroupJSON: (json: WorkflowJSON) => WorkflowJSON;
332
+
326
333
  /**
327
334
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
328
335
  * SPDX-License-Identifier: MIT
@@ -562,4 +569,4 @@ declare class WorkflowSimpleLineContribution implements WorkflowLineRenderContri
562
569
  private projectPointOnLine;
563
570
  }
564
571
 
565
- export { EditorCursorState, InteractiveType, LineEventProps, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, type StraightData, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, type WorkflowNodeLines, WorkflowNodeLinesData, WorkflowNodePortsData, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPort, WorkflowPortEntity, WorkflowPortType, WorkflowPorts, WorkflowResetLayoutService, WorkflowSelectService, WorkflowSimpleLineContribution, fitView, getAntiOverlapPosition, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
572
+ export { EditorCursorState, InteractiveType, LineEventProps, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, type StraightData, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowJSON, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, type WorkflowNodeLines, WorkflowNodeLinesData, WorkflowNodePortsData, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPort, WorkflowPortEntity, WorkflowPortType, WorkflowPorts, WorkflowResetLayoutService, WorkflowSelectService, WorkflowSimpleLineContribution, buildGroupJSON, fitView, getAntiOverlapPosition, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ import { PlaygroundConfigEntity, CommandService, PlaygroundDragEvent, EntityData
2
2
  export { bindConfigEntity, useConfigEntity, useEntities, useEntityDataFromContext, useEntityFromContext, useListenEvents, usePlayground, usePlaygroundContainer, usePlaygroundContext, usePlaygroundLatest, useRefresh, useService } from '@flowgram.ai/core';
3
3
  import { NodeFormProps } from '@flowgram.ai/node';
4
4
  import { FlowOperationBaseService, FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
- import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowPortEntity, g as WorkflowLineEntity, O as OnDragLineEnd, h as WorkflowPorts, i as WorkflowPortType, j as WorkflowPort, k as LineRenderType, l as WorkflowLineRenderContribution, m as LinePosition } from './workflow-line-entity-pkRs4Hgt.js';
6
- export { K as HoverPosition, C as LINE_HOVER_DISTANCE, v as LineColor, w as LineColors, u as LineType, z as NodesDragEndEvent, y as NodesDragStartEvent, A as NodesDraggingEvent, P as POINT_RADIUS, H as PORT_SIZE, o as WORKFLOW_LINE_ENTITY, M as WorkfloEntityHoverable, s as WorkflowContentChangeEvent, r as WorkflowContentChangeType, R as WorkflowDocumentOptionsDefault, Q as WorkflowDocumentProvider, J as WorkflowEntityHoverable, q as WorkflowJSON, E as WorkflowLineEntityOpts, F as WorkflowLineInfo, D as WorkflowLinePortInfo, x as WorkflowLineRenderContributionFactory, G as WorkflowLineUIState, t as WorkflowNodeMeta, I as WorkflowPortEntityOpts, p as domReactToBounds, n as getPortEntityId, B as onDragLineEndParams } from './workflow-line-entity-pkRs4Hgt.js';
5
+ import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowPortEntity, g as WorkflowLineEntity, O as OnDragLineEnd, h as WorkflowJSON, i as WorkflowPorts, j as WorkflowPortType, k as WorkflowPort, l as LineRenderType, m as WorkflowLineRenderContribution, n as LinePosition } from './workflow-line-entity-A940oVos.js';
6
+ export { K as HoverPosition, C as LINE_HOVER_DISTANCE, v as LineColor, w as LineColors, u as LineType, z as NodesDragEndEvent, y as NodesDragStartEvent, A as NodesDraggingEvent, P as POINT_RADIUS, H as PORT_SIZE, p as WORKFLOW_LINE_ENTITY, M as WorkfloEntityHoverable, s as WorkflowContentChangeEvent, r as WorkflowContentChangeType, R as WorkflowDocumentOptionsDefault, Q as WorkflowDocumentProvider, J as WorkflowEntityHoverable, E as WorkflowLineEntityOpts, F as WorkflowLineInfo, D as WorkflowLinePortInfo, x as WorkflowLineRenderContributionFactory, G as WorkflowLineUIState, t as WorkflowNodeMeta, I as WorkflowPortEntityOpts, q as domReactToBounds, o as getPortEntityId, B as onDragLineEndParams } from './workflow-line-entity-A940oVos.js';
7
7
  import { W as WorkflowNodeEntity } from './workflow-sub-canvas-IQzlYvPD.js';
8
8
  export { a as WorkflowSubCanvas } from './workflow-sub-canvas-IQzlYvPD.js';
9
9
  import * as _flowgram_ai_utils from '@flowgram.ai/utils';
@@ -323,6 +323,13 @@ declare function useWorkflowDocument(): WorkflowDocument;
323
323
  */
324
324
  declare function usePlaygroundReadonlyState(listenChange?: boolean): boolean;
325
325
 
326
+ /**
327
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
328
+ * SPDX-License-Identifier: MIT
329
+ */
330
+
331
+ declare const buildGroupJSON: (json: WorkflowJSON) => WorkflowJSON;
332
+
326
333
  /**
327
334
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
328
335
  * SPDX-License-Identifier: MIT
@@ -562,4 +569,4 @@ declare class WorkflowSimpleLineContribution implements WorkflowLineRenderContri
562
569
  private projectPointOnLine;
563
570
  }
564
571
 
565
- export { EditorCursorState, InteractiveType, LineEventProps, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, type StraightData, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, type WorkflowNodeLines, WorkflowNodeLinesData, WorkflowNodePortsData, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPort, WorkflowPortEntity, WorkflowPortType, WorkflowPorts, WorkflowResetLayoutService, WorkflowSelectService, WorkflowSimpleLineContribution, fitView, getAntiOverlapPosition, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
572
+ export { EditorCursorState, InteractiveType, LineEventProps, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, type StraightData, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowJSON, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, type WorkflowNodeLines, WorkflowNodeLinesData, WorkflowNodePortsData, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPort, WorkflowPortEntity, WorkflowPortType, WorkflowPorts, WorkflowResetLayoutService, WorkflowSelectService, WorkflowSimpleLineContribution, buildGroupJSON, fitView, getAntiOverlapPosition, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
package/dist/index.js CHANGED
@@ -59,6 +59,7 @@ __export(src_exports, {
59
59
  WorkflowSelectService: () => WorkflowSelectService,
60
60
  WorkflowSimpleLineContribution: () => WorkflowSimpleLineContribution,
61
61
  bindConfigEntity: () => import_core3.bindConfigEntity,
62
+ buildGroupJSON: () => buildGroupJSON,
62
63
  compose: () => import_utils.compose,
63
64
  composeAsync: () => import_utils.composeAsync,
64
65
  delay: () => import_utils4.delay,
@@ -105,7 +106,7 @@ var import_core25 = require("@flowgram.ai/core");
105
106
  var import_react2 = require("react");
106
107
  var import_reactive = require("@flowgram.ai/reactive");
107
108
  var import_node = require("@flowgram.ai/node");
108
- var import_document12 = require("@flowgram.ai/document");
109
+ var import_document13 = require("@flowgram.ai/document");
109
110
  var import_core21 = require("@flowgram.ai/core");
110
111
 
111
112
  // src/service/workflow-select-service.ts
@@ -117,6 +118,34 @@ var import_utils9 = require("@flowgram.ai/utils");
117
118
  var import_core3 = require("@flowgram.ai/core");
118
119
  var import_utils4 = require("@flowgram.ai/utils");
119
120
 
121
+ // src/utils/build-group-json.ts
122
+ var import_document = require("@flowgram.ai/document");
123
+ var buildGroupJSON = (json) => {
124
+ const { nodes, edges } = json;
125
+ const groupJSONs = nodes.filter(
126
+ (nodeJSON) => nodeJSON.type === import_document.FlowNodeBaseType.GROUP
127
+ );
128
+ const nodeJSONMap = new Map(nodes.map((n) => [n.id, n]));
129
+ const groupNodeJSONs = groupJSONs.map((groupJSON) => {
130
+ const groupBlocks = (groupJSON.data.blockIDs ?? []).map((blockID) => nodeJSONMap.get(blockID)).filter(Boolean);
131
+ const groupEdges = edges?.filter(
132
+ (edge) => groupBlocks.some((block) => block.id === edge.sourceNodeID || block.id === edge.targetNodeID)
133
+ );
134
+ const groupNodeJSON = {
135
+ ...groupJSON,
136
+ blocks: groupBlocks,
137
+ edges: groupEdges
138
+ };
139
+ return groupNodeJSON;
140
+ });
141
+ const groupBlockSet = new Set(groupJSONs.map((groupJSON) => groupJSON.data.blockIDs).flat());
142
+ const processedNodes = nodes.filter((nodeJSON) => !groupBlockSet.has(nodeJSON.id)).concat(groupNodeJSONs);
143
+ return {
144
+ nodes: processedNodes,
145
+ edges
146
+ };
147
+ };
148
+
120
149
  // src/utils/nanoid.ts
121
150
  var import_nanoid = require("nanoid");
122
151
  function nanoid(n) {
@@ -170,8 +199,8 @@ function domReactToBounds(react) {
170
199
  }
171
200
 
172
201
  // src/entities/workflow-node-entity.ts
173
- var import_document = require("@flowgram.ai/document");
174
- var WorkflowNodeEntity = import_document.FlowNodeEntity;
202
+ var import_document2 = require("@flowgram.ai/document");
203
+ var WorkflowNodeEntity = import_document2.FlowNodeEntity;
175
204
 
176
205
  // src/entities/workflow-line-entity.ts
177
206
  var import_lodash_es2 = require("lodash-es");
@@ -180,12 +209,12 @@ var import_core8 = require("@flowgram.ai/core");
180
209
 
181
210
  // src/entity-datas/workflow-node-ports-data.ts
182
211
  var import_lodash_es = require("lodash-es");
183
- var import_document3 = require("@flowgram.ai/document");
212
+ var import_document4 = require("@flowgram.ai/document");
184
213
  var import_core5 = require("@flowgram.ai/core");
185
214
 
186
215
  // src/entities/workflow-port-entity.ts
187
216
  var import_utils5 = require("@flowgram.ai/utils");
188
- var import_document2 = require("@flowgram.ai/document");
217
+ var import_document3 = require("@flowgram.ai/document");
189
218
  var import_core4 = require("@flowgram.ai/core");
190
219
  var PORT_SIZE = 24;
191
220
  var WorkflowPortEntity = class extends import_core4.Entity {
@@ -233,7 +262,7 @@ var WorkflowPortEntity = class extends import_core4.Entity {
233
262
  }
234
263
  get point() {
235
264
  const { targetElement } = this;
236
- const { bounds } = this.node.getData(import_document2.FlowNodeTransformData);
265
+ const { bounds } = this.node.getData(import_document3.FlowNodeTransformData);
237
266
  if (targetElement) {
238
267
  const pos = domReactToBounds(targetElement.getBoundingClientRect()).center;
239
268
  return this.entityManager.getEntity(import_core4.PlaygroundConfigEntity).getPosFromMouseEvent({
@@ -262,7 +291,7 @@ var WorkflowPortEntity = class extends import_core4.Entity {
262
291
  */
263
292
  get relativePosition() {
264
293
  const { point } = this;
265
- const { bounds } = this.node.getData(import_document2.FlowNodeTransformData);
294
+ const { bounds } = this.node.getData(import_document3.FlowNodeTransformData);
266
295
  return {
267
296
  x: point.x - bounds.x,
268
297
  y: point.y - bounds.y
@@ -372,7 +401,7 @@ var WorkflowNodePortsData = class extends import_core5.EntityData {
372
401
  * 动态计算点位,通过 dom 的 data-port-key
373
402
  */
374
403
  updateDynamicPorts() {
375
- const domNode = this.entity.getData(import_document3.FlowNodeRenderData).node;
404
+ const domNode = this.entity.getData(import_document4.FlowNodeRenderData).node;
376
405
  const elements = domNode.querySelectorAll("[data-port-id]");
377
406
  const staticPorts = this._staticPorts;
378
407
  const dynamicPorts = [];
@@ -1215,20 +1244,20 @@ WorkflowHoverService = __decorateClass([
1215
1244
  var import_nanoid3 = require("nanoid");
1216
1245
  var import_inversify6 = require("inversify");
1217
1246
  var import_utils16 = require("@flowgram.ai/utils");
1218
- var import_document8 = require("@flowgram.ai/document");
1219
1247
  var import_document9 = require("@flowgram.ai/document");
1248
+ var import_document10 = require("@flowgram.ai/document");
1220
1249
  var import_core15 = require("@flowgram.ai/core");
1221
1250
 
1222
1251
  // src/workflow-lines-manager.ts
1223
1252
  var import_lodash_es3 = require("lodash-es");
1224
1253
  var import_inversify3 = require("inversify");
1225
1254
  var import_utils12 = require("@flowgram.ai/utils");
1226
- var import_document5 = require("@flowgram.ai/document");
1255
+ var import_document6 = require("@flowgram.ai/document");
1227
1256
  var import_core12 = require("@flowgram.ai/core");
1228
1257
 
1229
1258
  // src/workflow-document-option.ts
1230
1259
  var import_form_core2 = require("@flowgram.ai/form-core");
1231
- var import_document4 = require("@flowgram.ai/document");
1260
+ var import_document5 = require("@flowgram.ai/document");
1232
1261
  var import_core11 = require("@flowgram.ai/core");
1233
1262
 
1234
1263
  // src/utils/flow-node-form-data.ts
@@ -1320,7 +1349,7 @@ var WorkflowDocumentOptionsDefault = {
1320
1349
  const nodeMeta = node.getNodeMeta();
1321
1350
  const subCanvas = nodeMeta.subCanvas?.(node);
1322
1351
  if (subCanvas?.isCanvas === false) {
1323
- const canvasNodeTransform = subCanvas.canvasNode.getData(import_document4.FlowNodeTransformData);
1352
+ const canvasNodeTransform = subCanvas.canvasNode.getData(import_document5.FlowNodeTransformData);
1324
1353
  const { x, y } = canvasNodeTransform.transform.position;
1325
1354
  metaData.canvasPosition = { x, y };
1326
1355
  }
@@ -1652,7 +1681,7 @@ var WorkflowLinesManager = class {
1652
1681
  const allNodes = this.getSortedNodes();
1653
1682
  const zoom = this.entityManager.getEntity(import_core12.PlaygroundConfigEntity)?.config?.zoom || 1;
1654
1683
  const containNodes = allNodes.map((node) => {
1655
- const { bounds } = node.getData(import_document5.FlowNodeTransformData);
1684
+ const { bounds } = node.getData(import_document6.FlowNodeTransformData);
1656
1685
  if (bounds.clone().pad(4 / zoom).contains(pos.x, pos.y)) {
1657
1686
  return node;
1658
1687
  }
@@ -1660,7 +1689,7 @@ var WorkflowLinesManager = class {
1660
1689
  return containNodes;
1661
1690
  }
1662
1691
  getNodeIndex(node) {
1663
- const nodeRenderData = node.getData(import_document5.FlowNodeRenderData);
1692
+ const nodeRenderData = node.getData(import_document6.FlowNodeRenderData);
1664
1693
  return nodeRenderData.stackIndex;
1665
1694
  }
1666
1695
  };
@@ -1685,13 +1714,13 @@ var import_nanoid2 = require("nanoid");
1685
1714
  var import_inversify5 = require("inversify");
1686
1715
  var import_utils14 = require("@flowgram.ai/utils");
1687
1716
  var import_form_core3 = require("@flowgram.ai/form-core");
1688
- var import_document7 = require("@flowgram.ai/document");
1717
+ var import_document8 = require("@flowgram.ai/document");
1689
1718
  var import_core14 = require("@flowgram.ai/core");
1690
1719
 
1691
1720
  // src/layout/free-layout.ts
1692
1721
  var import_inversify4 = require("inversify");
1693
1722
  var import_utils13 = require("@flowgram.ai/utils");
1694
- var import_document6 = require("@flowgram.ai/document");
1723
+ var import_document7 = require("@flowgram.ai/document");
1695
1724
  var import_core13 = require("@flowgram.ai/core");
1696
1725
  var FREE_LAYOUT_KEY = "free-layout";
1697
1726
  var FreeLayout = class {
@@ -1705,12 +1734,12 @@ var FreeLayout = class {
1705
1734
  * 更新布局
1706
1735
  */
1707
1736
  update() {
1708
- if (this.document.root.getData(import_document6.FlowNodeTransformData)?.localDirty) {
1737
+ if (this.document.root.getData(import_document7.FlowNodeTransformData)?.localDirty) {
1709
1738
  this.document.root.clearMemoGlobal();
1710
1739
  }
1711
1740
  }
1712
1741
  syncTransform(node) {
1713
- const transform = node.getData(import_document6.FlowNodeTransformData);
1742
+ const transform = node.getData(import_document7.FlowNodeTransformData);
1714
1743
  if (!transform.localDirty) {
1715
1744
  return;
1716
1745
  }
@@ -1724,7 +1753,7 @@ var FreeLayout = class {
1724
1753
  }
1725
1754
  node.parent.clearMemoGlobal();
1726
1755
  node.parent.clearMemoLocal();
1727
- const parentTransform = node.parent.getData(import_document6.FlowNodeTransformData);
1756
+ const parentTransform = node.parent.getData(import_document7.FlowNodeTransformData);
1728
1757
  parentTransform.transform.fireChange();
1729
1758
  }
1730
1759
  /**
@@ -1748,7 +1777,7 @@ var FreeLayout = class {
1748
1777
  */
1749
1778
  getPadding(node) {
1750
1779
  const { padding } = node.getNodeMeta();
1751
- const transform = node.getData(import_document6.FlowNodeTransformData);
1780
+ const transform = node.getData(import_document7.FlowNodeTransformData);
1752
1781
  if (padding) {
1753
1782
  return typeof padding === "function" ? padding(transform) : padding;
1754
1783
  }
@@ -1816,7 +1845,7 @@ __decorateClass([
1816
1845
  (0, import_inversify4.inject)(import_core13.PlaygroundConfigEntity)
1817
1846
  ], FreeLayout.prototype, "playgroundConfig", 2);
1818
1847
  __decorateClass([
1819
- (0, import_inversify4.inject)(import_document6.FlowDocumentProvider)
1848
+ (0, import_inversify4.inject)(import_document7.FlowDocumentProvider)
1820
1849
  ], FreeLayout.prototype, "documentProvider", 2);
1821
1850
  FreeLayout = __decorateClass([
1822
1851
  (0, import_inversify4.injectable)()
@@ -1825,7 +1854,7 @@ FreeLayout = __decorateClass([
1825
1854
  // src/workflow-document.ts
1826
1855
  var nanoid2 = (0, import_nanoid2.customAlphabet)("1234567890", 5);
1827
1856
  var WorkflowDocumentProvider = Symbol("WorkflowDocumentProvider");
1828
- var WorkflowDocument = class extends import_document7.FlowDocument {
1857
+ var WorkflowDocument = class extends import_document8.FlowDocument {
1829
1858
  constructor() {
1830
1859
  super(...arguments);
1831
1860
  this._onContentChangeEmitter = new import_utils14.Emitter();
@@ -1922,7 +1951,7 @@ var WorkflowDocument = class extends import_document7.FlowDocument {
1922
1951
  const { formMeta } = registry;
1923
1952
  const meta = node.getNodeMeta();
1924
1953
  const formData = getFlowNodeFormData(node);
1925
- const transform = node.getData(import_document7.FlowNodeTransformData);
1954
+ const transform = node.getData(import_document8.FlowNodeTransformData);
1926
1955
  const freeLayout = this.layout;
1927
1956
  if (!isExistedNode) {
1928
1957
  transform.onDataChange(() => {
@@ -1964,10 +1993,10 @@ var WorkflowDocument = class extends import_document7.FlowDocument {
1964
1993
  toJSON: () => this.toNodeJSON(node)
1965
1994
  });
1966
1995
  node.onDispose(() => {
1967
- if (!node.parent || node.parent.flowNodeType === import_document7.FlowNodeBaseType.ROOT) {
1996
+ if (!node.parent || node.parent.flowNodeType === import_document8.FlowNodeBaseType.ROOT) {
1968
1997
  return;
1969
1998
  }
1970
- const parentTransform = node.parent.getData(import_document7.FlowNodeTransformData);
1999
+ const parentTransform = node.parent.getData(import_document8.FlowNodeTransformData);
1971
2000
  parentTransform.fireChange();
1972
2001
  });
1973
2002
  let lastDeleteNodeData;
@@ -2132,10 +2161,10 @@ var WorkflowDocument = class extends import_document7.FlowDocument {
2132
2161
  );
2133
2162
  }
2134
2163
  getAllNodes() {
2135
- return this.entityManager.getEntities(WorkflowNodeEntity).filter((n) => n.id !== import_document7.FlowNodeBaseType.ROOT);
2164
+ return this.entityManager.getEntities(WorkflowNodeEntity).filter((n) => n.id !== import_document8.FlowNodeBaseType.ROOT);
2136
2165
  }
2137
2166
  getAllPorts() {
2138
- return this.entityManager.getEntities(WorkflowPortEntity).filter((p) => p.node.id !== import_document7.FlowNodeBaseType.ROOT);
2167
+ return this.entityManager.getEntities(WorkflowPortEntity).filter((p) => p.node.id !== import_document8.FlowNodeBaseType.ROOT);
2139
2168
  }
2140
2169
  /**
2141
2170
  * 获取画布中的非游离节点
@@ -2290,10 +2319,11 @@ var WorkflowDocument = class extends import_document7.FlowDocument {
2290
2319
  */
2291
2320
  toJSON() {
2292
2321
  const rootJSON = this.toNodeJSON(this.root);
2293
- return {
2322
+ const json = {
2294
2323
  nodes: rootJSON.blocks ?? [],
2295
2324
  edges: rootJSON.edges ?? []
2296
2325
  };
2326
+ return json;
2297
2327
  }
2298
2328
  dispose() {
2299
2329
  super.dispose();
@@ -2305,10 +2335,11 @@ var WorkflowDocument = class extends import_document7.FlowDocument {
2305
2335
  renderJSON(json, options) {
2306
2336
  const { parent = this.root, isClone = false } = options ?? {};
2307
2337
  const containerID = this.getNodeSubCanvas(parent)?.canvasNode.id ?? parent.id;
2308
- const nodes = json.nodes.map(
2338
+ const processedJSON = buildGroupJSON(json);
2339
+ const nodes = processedJSON.nodes.map(
2309
2340
  (nodeJSON) => this.createWorkflowNode(nodeJSON, isClone, containerID)
2310
2341
  );
2311
- const edges = json.edges.map((edge) => this.createWorkflowLine(edge, containerID)).filter(Boolean);
2342
+ const edges = processedJSON.edges.map((edge) => this.createWorkflowLine(edge, containerID)).filter(Boolean);
2312
2343
  return { nodes, edges };
2313
2344
  }
2314
2345
  getNodeSubCanvas(node) {
@@ -2318,13 +2349,19 @@ var WorkflowDocument = class extends import_document7.FlowDocument {
2318
2349
  return subCanvas;
2319
2350
  }
2320
2351
  getNodeChildren(node) {
2321
- if (!node) return [];
2352
+ if (!node || node.flowNodeType === import_document8.FlowNodeBaseType.GROUP) return [];
2322
2353
  const subCanvas = this.getNodeSubCanvas(node);
2323
- const childrenWithCanvas = subCanvas ? subCanvas.canvasNode.collapsedChildren : node.collapsedChildren;
2324
- const children = childrenWithCanvas.filter((child) => {
2354
+ const realChildren = subCanvas ? subCanvas.canvasNode.blocks : node.blocks;
2355
+ const childrenWithoutSubCanvas = realChildren.filter((child) => {
2325
2356
  const childMeta = child.getNodeMeta();
2326
2357
  return !childMeta.subCanvas?.(node)?.isCanvas;
2327
2358
  }).filter(Boolean);
2359
+ const children = childrenWithoutSubCanvas.map((child) => {
2360
+ if (child.flowNodeType === import_document8.FlowNodeBaseType.GROUP) {
2361
+ return [child, ...child.blocks];
2362
+ }
2363
+ return child;
2364
+ }).flat();
2328
2365
  return children;
2329
2366
  }
2330
2367
  toLineJSON(line) {
@@ -2456,7 +2493,7 @@ var WorkflowDragService = class {
2456
2493
  }
2457
2494
  this.isDragging = true;
2458
2495
  const sameParent = this.childrenOfContainer(selectedNodes);
2459
- if (sameParent && sameParent.flowNodeType !== import_document9.FlowNodeBaseType.ROOT) {
2496
+ if (sameParent && sameParent.flowNodeType !== import_document10.FlowNodeBaseType.ROOT) {
2460
2497
  selectedNodes = [sameParent];
2461
2498
  }
2462
2499
  let startPosition = this.getNodesPosition(selectedNodes);
@@ -2626,7 +2663,7 @@ var WorkflowDragService = class {
2626
2663
  if (!mousePos) {
2627
2664
  return { x: 0, y: 0 };
2628
2665
  }
2629
- if (!subNodeType || !containerNode || containerNode.flowNodeType === import_document9.FlowNodeBaseType.ROOT) {
2666
+ if (!subNodeType || !containerNode || containerNode.flowNodeType === import_document10.FlowNodeBaseType.ROOT) {
2630
2667
  return mousePos;
2631
2668
  }
2632
2669
  const isParentEmpty = !containerNode.children || containerNode.children.length === 0;
@@ -2712,7 +2749,7 @@ var WorkflowDragService = class {
2712
2749
  return offset;
2713
2750
  }
2714
2751
  updateDroppableTransforms() {
2715
- this._droppableTransforms = this.document.getRenderDatas(import_document8.FlowNodeTransformData, false).filter((transform) => {
2752
+ this._droppableTransforms = this.document.getRenderDatas(import_document9.FlowNodeTransformData, false).filter((transform) => {
2716
2753
  const { entity } = transform;
2717
2754
  if (entity.originParent) {
2718
2755
  return this.nodeSelectable(entity) && this.nodeSelectable(entity.originParent);
@@ -2729,7 +2766,7 @@ var WorkflowDragService = class {
2729
2766
  */
2730
2767
  getNodesPosition(nodes) {
2731
2768
  const selectedBounds = import_utils16.Rectangle.enlarge(
2732
- nodes.map((n) => n.getData(import_document8.FlowNodeTransformData).bounds)
2769
+ nodes.map((n) => n.getData(import_document9.FlowNodeTransformData).bounds)
2733
2770
  );
2734
2771
  const position = {
2735
2772
  x: selectedBounds.x,
@@ -3009,7 +3046,7 @@ __decorateClass([
3009
3046
  (0, import_inversify6.inject)(WorkflowSelectService)
3010
3047
  ], WorkflowDragService.prototype, "selectService", 2);
3011
3048
  __decorateClass([
3012
- (0, import_inversify6.inject)(import_document8.FlowOperationBaseService)
3049
+ (0, import_inversify6.inject)(import_document9.FlowOperationBaseService)
3013
3050
  ], WorkflowDragService.prototype, "operationService", 2);
3014
3051
  __decorateClass([
3015
3052
  (0, import_inversify6.inject)(WorkflowDocumentOptions)
@@ -3028,13 +3065,13 @@ var import_core18 = require("@flowgram.ai/core");
3028
3065
  var import_utils17 = require("@flowgram.ai/utils");
3029
3066
 
3030
3067
  // src/utils/layout-to-positions.ts
3031
- var import_document10 = require("@flowgram.ai/document");
3068
+ var import_document11 = require("@flowgram.ai/document");
3032
3069
  var import_core16 = require("@flowgram.ai/core");
3033
3070
  var layoutToPositions = async (nodes, nodePositionMap) => {
3034
3071
  const newNodePositionMap = {};
3035
3072
  nodes.forEach((node) => {
3036
3073
  const transform = node.getData(import_core16.TransformData);
3037
- const nodeTransform = node.getData(import_document10.FlowNodeTransformData);
3074
+ const nodeTransform = node.getData(import_document11.FlowNodeTransformData);
3038
3075
  newNodePositionMap[node.id] = {
3039
3076
  x: transform.position.x,
3040
3077
  y: transform.position.y + nodeTransform.bounds.height / 2
@@ -3130,9 +3167,9 @@ WorkflowResetLayoutService = __decorateClass([
3130
3167
  // src/service/workflow-operation-base-service.ts
3131
3168
  var import_inversify8 = require("inversify");
3132
3169
  var import_utils19 = require("@flowgram.ai/utils");
3133
- var import_document11 = require("@flowgram.ai/document");
3170
+ var import_document12 = require("@flowgram.ai/document");
3134
3171
  var import_core19 = require("@flowgram.ai/core");
3135
- var WorkflowOperationBaseServiceImpl = class extends import_document11.FlowOperationBaseServiceImpl {
3172
+ var WorkflowOperationBaseServiceImpl = class extends import_document12.FlowOperationBaseServiceImpl {
3136
3173
  constructor() {
3137
3174
  super(...arguments);
3138
3175
  this.onNodePostionUpdateEmitter = new import_utils19.Emitter();
@@ -3184,7 +3221,7 @@ function checkTargetDraggable(el) {
3184
3221
  }
3185
3222
  function useNodeRender(nodeFromProps) {
3186
3223
  const node = nodeFromProps || (0, import_react2.useContext)(import_core21.PlaygroundEntityContext);
3187
- const renderData = node.getData(import_document12.FlowNodeRenderData);
3224
+ const renderData = node.getData(import_document13.FlowNodeRenderData);
3188
3225
  const portsData = node.getData(WorkflowNodePortsData);
3189
3226
  const readonly = usePlaygroundReadonlyState();
3190
3227
  const dragService = (0, import_core21.useService)(WorkflowDragService);
@@ -3351,11 +3388,11 @@ function useNodeRender(nodeFromProps) {
3351
3388
  }
3352
3389
 
3353
3390
  // src/hooks/use-current-dom-node.ts
3354
- var import_document13 = require("@flowgram.ai/document");
3391
+ var import_document14 = require("@flowgram.ai/document");
3355
3392
  var import_core22 = require("@flowgram.ai/core");
3356
3393
  function useCurrentDomNode() {
3357
3394
  const entity = (0, import_core22.useEntityFromContext)();
3358
- const renderData = entity.getData(import_document13.FlowNodeRenderData);
3395
+ const renderData = entity.getData(import_document14.FlowNodeRenderData);
3359
3396
  return renderData.node;
3360
3397
  }
3361
3398
 
@@ -3386,16 +3423,16 @@ var InteractiveType = /* @__PURE__ */ ((InteractiveType2) => {
3386
3423
  // src/workflow-document-container-module.ts
3387
3424
  var import_inversify10 = require("inversify");
3388
3425
  var import_utils20 = require("@flowgram.ai/utils");
3389
- var import_document15 = require("@flowgram.ai/document");
3426
+ var import_document16 = require("@flowgram.ai/document");
3390
3427
 
3391
3428
  // src/workflow-document-contribution.ts
3392
3429
  var import_inversify9 = require("inversify");
3393
- var import_document14 = require("@flowgram.ai/document");
3430
+ var import_document15 = require("@flowgram.ai/document");
3394
3431
  var WorkflowDocumentContribution = class {
3395
3432
  registerDocument(document2) {
3396
3433
  document2.registerNodeDatas(
3397
- import_document14.FlowNodeTransformData,
3398
- import_document14.FlowNodeRenderData,
3434
+ import_document15.FlowNodeTransformData,
3435
+ import_document15.FlowNodeRenderData,
3399
3436
  WorkflowNodePortsData,
3400
3437
  WorkflowNodeLinesData
3401
3438
  );
@@ -3430,11 +3467,11 @@ var WorkflowDocumentContainerModule = new import_inversify10.ContainerModule(
3430
3467
  bind(WorkflowResetLayoutService).toSelf().inSingletonScope();
3431
3468
  bind(WorkflowOperationBaseService).to(WorkflowOperationBaseServiceImpl).inSingletonScope();
3432
3469
  bind(URLParams).toDynamicValue(() => getUrlParams()).inSingletonScope();
3433
- (0, import_utils20.bindContributions)(bind, WorkflowDocumentContribution, [import_document15.FlowDocumentContribution]);
3470
+ (0, import_utils20.bindContributions)(bind, WorkflowDocumentContribution, [import_document16.FlowDocumentContribution]);
3434
3471
  bind(WorkflowDocumentOptions).toConstantValue({
3435
3472
  ...WorkflowDocumentOptionsDefault
3436
3473
  });
3437
- rebind(import_document15.FlowDocument).toService(WorkflowDocument);
3474
+ rebind(import_document16.FlowDocument).toService(WorkflowDocument);
3438
3475
  bind(WorkflowDocumentProvider).toDynamicValue((ctx) => () => ctx.container.get(WorkflowDocument)).inSingletonScope();
3439
3476
  }
3440
3477
  );
@@ -3546,6 +3583,7 @@ WorkflowSimpleLineContribution.type = "WorkflowSimpleLineContribution";
3546
3583
  WorkflowSelectService,
3547
3584
  WorkflowSimpleLineContribution,
3548
3585
  bindConfigEntity,
3586
+ buildGroupJSON,
3549
3587
  compose,
3550
3588
  composeAsync,
3551
3589
  delay,