wechen-agent-editor-v1 1.2.0 → 1.2.2

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 (46) hide show
  1. package/README.md +20 -4
  2. package/dist/WechenAgentEditor.d.ts.map +1 -1
  3. package/dist/backendWorkflowJson.d.ts +7 -1
  4. package/dist/backendWorkflowJson.d.ts.map +1 -1
  5. package/dist/flow/autoLayoutBalance.d.ts +19 -0
  6. package/dist/flow/autoLayoutBalance.d.ts.map +1 -0
  7. package/dist/flow/autoLayoutNodes.d.ts +43 -0
  8. package/dist/flow/autoLayoutNodes.d.ts.map +1 -0
  9. package/dist/flow/branchSubtreeLayout.d.ts +24 -0
  10. package/dist/flow/branchSubtreeLayout.d.ts.map +1 -0
  11. package/dist/flow/complexAgentDemoFlow.d.ts +5 -0
  12. package/dist/flow/complexAgentDemoFlow.d.ts.map +1 -0
  13. package/dist/flow/edgeLayoutSnapshot.d.ts +28 -12
  14. package/dist/flow/edgeLayoutSnapshot.d.ts.map +1 -1
  15. package/dist/flow/edgeOrthogonalPath.d.ts +55 -0
  16. package/dist/flow/edgeOrthogonalPath.d.ts.map +1 -0
  17. package/dist/flow/edgePathLayout.d.ts +6 -0
  18. package/dist/flow/edgePathLayout.d.ts.map +1 -1
  19. package/dist/flow/edgeRouteGeometry.d.ts +26 -0
  20. package/dist/flow/edgeRouteGeometry.d.ts.map +1 -0
  21. package/dist/flow/integratedAutoLayout.d.ts +17 -0
  22. package/dist/flow/integratedAutoLayout.d.ts.map +1 -0
  23. package/dist/flow/layoutRoutingCost.d.ts +17 -0
  24. package/dist/flow/layoutRoutingCost.d.ts.map +1 -0
  25. package/dist/flow/nodeChangeSyncAttachSides.d.ts +2 -2
  26. package/dist/flow/nodeChangeSyncAttachSides.d.ts.map +1 -1
  27. package/dist/flow/nodes/ZoneHandles.d.ts +4 -4
  28. package/dist/flow/nodes/ZoneHandles.d.ts.map +1 -1
  29. package/dist/flow/syncEdgeLayout.d.ts +7 -1
  30. package/dist/flow/syncEdgeLayout.d.ts.map +1 -1
  31. package/dist/flow/wechenAgentEdgeTypes.d.ts +18 -7
  32. package/dist/flow/wechenAgentEdgeTypes.d.ts.map +1 -1
  33. package/dist/flow/zoneConnectionAttach.d.ts +10 -7
  34. package/dist/flow/zoneConnectionAttach.d.ts.map +1 -1
  35. package/dist/flow/zoneHandleLayout.d.ts +9 -22
  36. package/dist/flow/zoneHandleLayout.d.ts.map +1 -1
  37. package/dist/flow/zoneStripHandleLayout.d.ts +16 -0
  38. package/dist/flow/zoneStripHandleLayout.d.ts.map +1 -0
  39. package/dist/flowTypes.d.ts +25 -2
  40. package/dist/flowTypes.d.ts.map +1 -1
  41. package/dist/index.d.ts +16 -4
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +14032 -7932
  44. package/dist/index.js.map +1 -1
  45. package/dist/style.css +1 -1
  46. package/package.json +4 -2
package/README.md CHANGED
@@ -150,8 +150,24 @@ WechenAgentEditor(编排) → onSave / exportBackendWorkflowJson → 宿主
150
150
 
151
151
  - **`onTestRun` / `ref.testRun()`**:仅触发宿主回调,具体执行由宿主实现。
152
152
  - **`validateWechenAgentFlow(flow)`**:纯函数图校验(默认不阻断保存);可在 `onBeforeSave` 内返回 `false` 拦截。
153
- - **ref 增删改查**:`getSnapshot` / **`getFlow` / `getInitialFlow`**(与 **`initialFlow` 同形**)/ **`replaceFlow` / `setInitialFlow`** / `patchNodeData` / `removeNode` / **`removeEdge` / `deleteEdge`** / `addNode` / `addNodeFromLibrary` / `addEdge` / `connect` / `relayoutEdges`(见 `WechenAgentEditorRef`)。
154
- - **回显后连线布局**:`getSnapshot` / `flowJson` 会保存 **`wechenSourceAttachSide` / `wechenTargetAttachSide` / `wechenPathOptions`**;`initialFlow` 与 `replaceFlow` **优先恢复** 存盘布局。无快照的旧数据仍会自动推导;`ref.relayoutEdges()` 可按当前几何 **强制重算并写回**(`readOnly` / `readingMode` no-op)。
153
+ - **ref 增删改查**:`getSnapshot` / **`getFlow` / `getInitialFlow`**(与 **`initialFlow` 同形**)/ **`replaceFlow` / `setInitialFlow`** / `patchNodeData` / `removeNode` / **`removeEdge` / `deleteEdge`** / `addNode` / `addNodeFromLibrary` / `addEdge` / `connect`(见 `WechenAgentEditorRef`)。
154
+ - **布局相关 ref**(`readOnly` / `readingMode` 下均为 no-op):
155
+
156
+ | 方法 | 作用 |
157
+ |------|------|
158
+ | **`relayoutEdges()`** | **连线自动布局**:按当前节点位置重算锚边与路径,**不移动节点** |
159
+ | **`autoLayoutNodes(options?)`** | **节点自动排版**(默认 **一体化**:Dagre + 子树分列 + 连线规划);`layoutStrategy: 'dagre-only'` 回退两段式;`balance: false` / `compact` 紧凑左对齐 |
160
+ | **`autoLayout(options?)`** | 等同默认选项的 `autoLayoutNodes`;可选 `fitView: true` |
161
+ | **`fitView()`** | 仅适配视口,不改节点与连线布局 |
162
+
163
+ ```tsx
164
+ editorRef.current?.autoLayout({ direction: "TB", fitView: true });
165
+ editorRef.current?.relayoutEdges(); // 仅重算连线
166
+ ```
167
+
168
+ - **回显后连线布局**:`getSnapshot` / `flowJson` 会保存 **`wechenSourceAttachSide` / `wechenTargetAttachSide` / `wechenPathOptions`**;`initialFlow` 与 `replaceFlow` **优先恢复** 存盘布局。无快照的旧数据仍会自动推导;`ref.relayoutEdges()` 可按当前几何 **强制重算并写回**。
169
+ - **路径避让**:`relayoutEdges` / 默认 `autoLayoutNodes` 布线时,底→顶竖通道与扇出共干会绕开同列 **第三方节点**,避免线穿节点盒。
170
+ - **一体化排版**:默认 `autoLayout` 在 TB 下同时精炼节点分列与连线路径(`computeIntegratedAutoLayout`);`refineIterations` 默认 **3**、上限 **10**(精确轮次,保留迄今最优布局);`layoutStrategy: 'dagre-only'` 可对比旧两段式。
155
171
 
156
172
  ```tsx
157
173
  import { validateWechenAgentFlow } from "wechen-agent-editor-v1";
@@ -382,9 +398,9 @@ validateLocaleMessagesCompleteness(enPack);
382
398
 
383
399
  L1 工厂同样支持:`buildWechenAgentEditorProps({ onBeforeRemoveNode: ... })`。
384
400
 
385
- ### 四边感应区连线(默认)
401
+ ### 顶底感应区连线(默认,上进下出)
386
402
 
387
- 内置 **`pill` / `card` / `mainAgent`** 在未使用 **`renderFlowNode`**、且未启用下文 **legacy `flowHandles`** 时,采用 **上 / / / 左** 周界窄条(**四条始终挂载**,无上/下连线锚点时仍保留空条带便于发现):**输入池 = 上**(`target`)、**输出池 = 下**(`source`);边稳定排序后 **前半入左、后半入上**,出边 **前半出右、后半出下**;**`in-new-{nodeId}`** 默认在 **左侧**,**`out-new-{nodeId}`** 在 **右侧**;角区留白避免相邻带重叠命中。透明 **`Handle`**、无固定圆点桩 UI。新边 **`sourceHandle` / `targetHandle`** 仍为 **`out-${edgeId}`** / **`in-${edgeId}`**;**`normalizeWechenAgentFlowJson`** 归一化旧桩 id,并将遗留 **`data.wechenFlowDirection: 'reverse'`** 归一为 **交换 `source`/`target`** 后清除该键。新建连线会写入 **`edge.data.wechenSourceAttachSide` / `wechenTargetAttachSide`**(默认 **右→左**),用于稳定落回感应带;亦可手写 **`top`/`bottom`** 等偏好。**`ConnectionMode.Strict`**、**`isValidConnection`**(禁自环)。默认边 **平滑阶梯 + 终点箭头**(箭头在 **target** 端)。
403
+ 内置 **`pill` / `card` / `mainAgent`** 在未使用 **`renderFlowNode`**、且未启用下文 **legacy `flowHandles`** 时,采用 **顶 / 底** 周界窄条:**输入池 = 顶边**(`target`)、**输出池 = 底边**(`source`),符合 Agent **自上而下** 阅读;多条入/出边沿顶/底边按邻居 **水平坐标** 分列槽位;**整条感应条**均可拖拽拉出连线(十字光标),几何锚点仍在 **条带中心** stub。新建连接桩:**`in-new-top-{nodeId}`**(顶)、**`out-new-bottom-{nodeId}`**(底)。透明 **`Handle`**、无固定圆点桩 UI。新边 **`sourceHandle` / `targetHandle`** 仍为 **`out-${edgeId}`** / **`in-${edgeId}`**;**`normalizeWechenAgentFlowJson`** 归一化旧桩 id。新建连线写入 **`edge.data.wechenSourceAttachSide` / `wechenTargetAttachSide`**(默认 **底→顶**)。旧图 **`left`/`right`** 锚边在加载/同步时迁移为 **`top`/`bottom`**。**`ConnectionMode.Strict`**、**`isValidConnection`**(禁自环)。默认边 **平滑阶梯 + 终点箭头**(箭头在 **target** 端)。与 **`autoLayoutNodes` / `relayoutEdges`**、底边扇出 **共干** 路径配合。
388
404
 
389
405
  周界四向感应的 **完整方案说明(交互、角区、数据字段、代码映射)** 见仓库 **`openspec/changes/node-perimeter-sensing-scheme/design.md`**。
390
406
 
@@ -1 +1 @@
1
- {"version":3,"file":"WechenAgentEditor.d.ts","sourceRoot":"","sources":["../src/WechenAgentEditor.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAa,SAAS,EAAE,MAAM,OAAO,CAAC;AAcjE,OAAO,KAAK,EACV,qBAAqB,EACrB,+BAA+B,EAChC,MAAM,iCAAiC,CAAC;AA6BzC,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,qCAAqC,EACrC,qCAAqC,EACrC,mBAAmB,EAEnB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAK/E,OAAO,KAAK,EACV,+BAA+B,EAC/B,kCAAkC,EACnC,MAAM,8BAA8B,CAAC;AAMtC,iEAAiE;AAEjE,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,6BAA6B,KAAK,MAAM,CAAC;AAEtF,MAAM,WAAW,sBAAsB;IACrC,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,6EAA6E;IAC7E,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,CACxB,IAAI,EAAE,+BAA+B,KAClC,+BAA+B,CAAC;IACrC;;;OAGG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;IAC7C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,6BAA6B,CAAC;IACjD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,8BAA8B,CAAC;IACnD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,qCAAqC,KAAK,SAAS,CAAC;IAChF;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,qCAAqC,KAAK,SAAS,CAAC;IAChF,iEAAiE;IACjE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACjD,wEAAwE;IACxE,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpD;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,+BAA+B,CAAC;IACjD,kEAAkE;IAClE,eAAe,CAAC,EAAE,kCAAkC,CAAC;IACrD,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,GAAG,wBAAwB,CAAC;CACtD;AAED,YAAY,EACV,+BAA+B,EAC/B,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AAq2BtC,eAAO,MAAM,iBAAiB,yHA2F7B,CAAC"}
1
+ {"version":3,"file":"WechenAgentEditor.d.ts","sourceRoot":"","sources":["../src/WechenAgentEditor.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAa,SAAS,EAAE,MAAM,OAAO,CAAC;AAcjE,OAAO,KAAK,EACV,qBAAqB,EACrB,+BAA+B,EAChC,MAAM,iCAAiC,CAAC;AAoCzC,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,qCAAqC,EACrC,qCAAqC,EACrC,mBAAmB,EAEnB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAK/E,OAAO,KAAK,EACV,+BAA+B,EAC/B,kCAAkC,EACnC,MAAM,8BAA8B,CAAC;AAMtC,iEAAiE;AAEjE,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,6BAA6B,KAAK,MAAM,CAAC;AAEtF,MAAM,WAAW,sBAAsB;IACrC,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,6EAA6E;IAC7E,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,CACxB,IAAI,EAAE,+BAA+B,KAClC,+BAA+B,CAAC;IACrC;;;OAGG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;IAC7C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,6BAA6B,CAAC;IACjD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,8BAA8B,CAAC;IACnD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,qCAAqC,KAAK,SAAS,CAAC;IAChF;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,qCAAqC,KAAK,SAAS,CAAC;IAChF,iEAAiE;IACjE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACjD,wEAAwE;IACxE,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpD;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,+BAA+B,CAAC;IACjD,kEAAkE;IAClE,eAAe,CAAC,EAAE,kCAAkC,CAAC;IACrD,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,GAAG,wBAAwB,CAAC;CACtD;AAED,YAAY,EACV,+BAA+B,EAC/B,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AA08BtC,eAAO,MAAM,iBAAiB,yHA2F7B,CAAC"}
@@ -14,7 +14,7 @@ export interface WechenBackendWorkflowNode {
14
14
  /** 执行侧参数;由导出映射写入,导入时再映射回 `node.data` */
15
15
  config: Record<string, unknown>;
16
16
  }
17
- /** 感应连线布局快照(与 `edge.data` 中 `wechen*` 字段对应) */
17
+ /** 感应连线布局快照(与 `edge.path` / `edge.data` 中 `wechen*` 字段对应) */
18
18
  export interface WechenBackendWorkflowEdgeLayout {
19
19
  sourceAttach?: "right" | "bottom";
20
20
  targetAttach?: "left" | "top";
@@ -23,6 +23,12 @@ export interface WechenBackendWorkflowEdgeLayout {
23
23
  borderRadius: number;
24
24
  };
25
25
  layoutVersion?: number;
26
+ /** 直角阶梯折线顶点:起点桩 → 拐点 → 终点桩 */
27
+ path?: Array<{
28
+ x: number;
29
+ y: number;
30
+ }>;
31
+ pathMode?: "auto" | "manual";
26
32
  }
27
33
  export interface WechenBackendWorkflowEdge {
28
34
  source: string;
@@ -1 +1 @@
1
- {"version":3,"file":"backendWorkflowJson.d.ts","sourceRoot":"","sources":["../src/backendWorkflowJson.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAI/G;;GAEG;AACH,eAAO,MAAM,sCAAsC,MAAM,CAAC;AAE1D,2CAA2C;AAC3C,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,OAAO,GACP,MAAM,GACN,WAAW,GACX,KAAK,GACL,QAAQ,CAAC;AA6Gb,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,6BAA6B,CAAC;IACpC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,+CAA+C;AAC/C,MAAM,WAAW,+BAA+B;IAC9C,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,+BAA+B,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyMD,oCAAoC;AACpC,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,yBAAyB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GACnB,MAAM,CAcR;AAmCD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,EAChD,IAAI,EAAE,yBAAyB,GAC9B,yBAAyB,CAY3B;AAmFD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,yBAAyB,GAAG,mBAAmB,CAgB/F;AAED,sCAAsC;AACtC,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAyC9F"}
1
+ {"version":3,"file":"backendWorkflowJson.d.ts","sourceRoot":"","sources":["../src/backendWorkflowJson.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAI/G;;GAEG;AACH,eAAO,MAAM,sCAAsC,MAAM,CAAC;AAE1D,2CAA2C;AAC3C,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,OAAO,GACP,MAAM,GACN,WAAW,GACX,KAAK,GACL,QAAQ,CAAC;AA6Gb,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,6BAA6B,CAAC;IACpC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,6DAA6D;AAC7D,MAAM,WAAW,+BAA+B;IAC9C,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,+BAA+B,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmOD,oCAAoC;AACpC,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,yBAAyB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GACnB,MAAM,CAcR;AAwCD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,EAChD,IAAI,EAAE,yBAAyB,GAC9B,yBAAyB,CAY3B;AAmFD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,yBAAyB,GAAG,mBAAmB,CAgB/F;AAED,sCAAsC;AACtC,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAyC9F"}
@@ -0,0 +1,19 @@
1
+ import { Edge, Node } from '@xyflow/react';
2
+ import { WechenAgentNodeAutoLayoutDirection } from './autoLayoutNodes';
3
+ /** 父中心与子组中心允许偏差(px),用于测试与规格 */
4
+ export declare const BALANCE_CENTER_TOLERANCE_PX = 8;
5
+ export interface BalanceLayoutOptions {
6
+ direction?: WechenAgentNodeAutoLayoutDirection;
7
+ /** 同层推开最小水平间隙,默认 24 或 `nodeSpacing * 0.25` */
8
+ minGap?: number;
9
+ nodeSpacing?: number;
10
+ /** 为 true 时跳过同层重叠推开(分列后由 assignBranchColumns 负责水平间距) */
11
+ skipRankOverlapResolve?: boolean;
12
+ }
13
+ /**
14
+ * TB 布局后水平均衡:父节点中心对齐直接子节点组中心;同层重叠时推开子树。
15
+ */
16
+ export declare function balanceLayoutPositions(nodes: Node[], edges: Edge[], options?: BalanceLayoutOptions): Node[];
17
+ /** 父中心与子 bbox 中心水平偏差(供测试) */
18
+ export declare function parentChildCenterDeltaX(parent: Node, children: Node[]): number;
19
+ //# sourceMappingURL=autoLayoutBalance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoLayoutBalance.d.ts","sourceRoot":"","sources":["../../src/flow/autoLayoutBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AAM5E,+BAA+B;AAC/B,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,kCAAkC,CAAC;IAC/C,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAkJD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,CAAC,EAAE,oBAAoB,GAC7B,IAAI,EAAE,CA6DR;AAED,6BAA6B;AAC7B,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,IAAI,EAAE,GACf,MAAM,CAeR"}
@@ -0,0 +1,43 @@
1
+ import { Edge, Node } from '@xyflow/react';
2
+ export type WechenAgentNodeAutoLayoutDirection = "TB" | "BT" | "LR" | "RL";
3
+ export type WechenAgentNodeAutoLayoutPreset = "balanced" | "compact";
4
+ export type WechenAgentLayoutStrategy = "integrated" | "dagre-only";
5
+ export interface WechenAgentNodeAutoLayoutOptions {
6
+ /** 布局方向,默认 TB(自上而下) */
7
+ direction?: WechenAgentNodeAutoLayoutDirection;
8
+ /** 同层节点间距,默认 110 */
9
+ nodeSpacing?: number;
10
+ /** 层间距,默认 150 */
11
+ rankSpacing?: number;
12
+ /** 排版后是否重算连线(默认 true;传 false 仅更新节点) */
13
+ relayoutEdges?: boolean;
14
+ /** 完成后 fitView(仅 `autoLayout` 使用) */
15
+ fitView?: boolean;
16
+ /**
17
+ * 排版后水平居中父节点于子节点组(默认 true)。
18
+ * `layoutPreset: 'compact'` 时默认为 false。
19
+ */
20
+ balance?: boolean;
21
+ /** `balanced`:默认均衡;`compact`:更紧间距且默认不做均衡后处理 */
22
+ layoutPreset?: WechenAgentNodeAutoLayoutPreset;
23
+ /**
24
+ * `integrated`(默认):Dagre + 路由感知子树分列精炼 + 连线快照;
25
+ * `dagre-only`:仅 Dagre + 均衡 + relayoutEdges。
26
+ */
27
+ layoutStrategy?: WechenAgentLayoutStrategy;
28
+ /** 一体化精炼最大轮次,默认 3,上限 10(不含 Dagre 初排) */
29
+ refineIterations?: number;
30
+ }
31
+ export interface ResolvedAutoLayoutOptions {
32
+ direction: WechenAgentNodeAutoLayoutDirection;
33
+ nodeSpacing: number;
34
+ rankSpacing: number;
35
+ balance: boolean;
36
+ }
37
+ export declare function resolveAutoLayoutOptions(options?: WechenAgentNodeAutoLayoutOptions): ResolvedAutoLayoutOptions;
38
+ /**
39
+ * 使用 Dagre 对有向图计算节点 position(React Flow 左上角坐标)。
40
+ * 默认在 TB 下再做父节点居中均衡;不修改 id / data / edges。
41
+ */
42
+ export declare function computeAutoLayoutPositions(nodes: Node[], edges: Edge[], options?: WechenAgentNodeAutoLayoutOptions): Node[];
43
+ //# sourceMappingURL=autoLayoutNodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoLayoutNodes.d.ts","sourceRoot":"","sources":["../../src/flow/autoLayoutNodes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIhD,MAAM,MAAM,kCAAkC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3E,MAAM,MAAM,+BAA+B,GAAG,UAAU,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,yBAAyB,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE,MAAM,WAAW,gCAAgC;IAC/C,uBAAuB;IACvB,SAAS,CAAC,EAAE,kCAAkC,CAAC;IAC/C,oBAAoB;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,+BAA+B,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,yBAAyB,CAAC;IAC3C,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAaD,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,kCAAkC,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,gCAAgC,GACzC,yBAAyB,CAa3B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,CAAC,EAAE,gCAAgC,GACzC,IAAI,EAAE,CA0DR"}
@@ -0,0 +1,24 @@
1
+ import { Edge, Node } from '@xyflow/react';
2
+ export interface SubtreeBox {
3
+ rootId: string;
4
+ ids: Set<string>;
5
+ left: number;
6
+ right: number;
7
+ centerX: number;
8
+ width: number;
9
+ }
10
+ /** 从 root 向下收集子树(不含父节点) */
11
+ export declare function collectSubtreeIds(rootId: string, childrenMap: Map<string, string[]>): Set<string>;
12
+ export declare function shiftSubtreeX(nodeById: Map<string, Node>, childrenMap: Map<string, string[]>, rootId: string, deltaX: number): void;
13
+ export interface AssignBranchColumnsOptions {
14
+ columnGap: number;
15
+ }
16
+ export interface AssignBranchColumnsResult {
17
+ nodes: Node[];
18
+ changed: boolean;
19
+ }
20
+ /**
21
+ * 对每个 ≥2 扇出的父节点,将各直接子节点的子树水平分列到独立走廊。
22
+ */
23
+ export declare function assignBranchColumns(nodes: Node[], edges: Edge[], options: AssignBranchColumnsOptions): AssignBranchColumnsResult;
24
+ //# sourceMappingURL=branchSubtreeLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branchSubtreeLayout.d.ts","sourceRoot":"","sources":["../../src/flow/branchSubtreeLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAKhD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAwBD,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACjC,GAAG,CAAC,MAAM,CAAC,CAYb;AAiCD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CAoBN;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,0BAA0B,GAClC,yBAAyB,CAoE3B"}
@@ -0,0 +1,5 @@
1
+ import { WechenAgentFlowJson } from '../flowTypes';
2
+ /** Playground / 测试用:多扇出 + 再分叉 Agent 图(类用户复杂截图) */
3
+ export declare const complexAgentDemoFlow: WechenAgentFlowJson;
4
+ export declare function withMeasuredNodes(flow: WechenAgentFlowJson): WechenAgentFlowJson;
5
+ //# sourceMappingURL=complexAgentDemoFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexAgentDemoFlow.d.ts","sourceRoot":"","sources":["../../src/flow/complexAgentDemoFlow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,kDAAkD;AAClD,eAAO,MAAM,oBAAoB,EAAE,mBAkElC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,CAWhF"}
@@ -1,13 +1,17 @@
1
1
  import { Position, Edge, Node } from '@xyflow/react';
2
- import { WechenAgentEdgeData, WechenAttachSideIn, WechenAttachSideOut, WechenEdgePathOptions } from './wechenAgentEdgeTypes';
2
+ import { WechenAgentEdgeData, WechenAttachSideIn, WechenAttachSideOut, WechenEdgePathMode, WechenEdgePathOptions } from './wechenAgentEdgeTypes';
3
3
  import { SmoothStepPathOptions } from './edgePathLayout';
4
- /** 布局快照算法版本;升级算法时可递增并选择性重算旧图 */
5
- export declare const WECHEN_EDGE_LAYOUT_VERSION = 1;
4
+ import { WechenEdgePathPoint } from './edgeOrthogonalPath';
5
+ import { EdgeRouteContext } from './edgeRouteGeometry';
6
+ /** 布局快照算法版本;v2 起以 `edge.path` 为权威路径 */
7
+ export declare const WECHEN_EDGE_LAYOUT_VERSION = 2;
6
8
  export declare function isValidWechenPathOptions(v: unknown): v is WechenEdgePathOptions;
7
9
  export declare function isValidAttachSideOut(v: unknown): v is WechenAttachSideOut;
8
10
  export declare function isValidAttachSideIn(v: unknown): v is WechenAttachSideIn;
9
- /** 锚边 + pathOptions 均有效,回显时可跳过几何覆盖 */
10
- export declare function isCompleteEdgeLayoutSnapshot(data: WechenAgentEdgeData | undefined): boolean;
11
+ export declare function isManualEdge(edge: Edge): boolean;
12
+ export declare function hasPersistedEdgePath(edge: Edge): boolean;
13
+ /** 锚边 + 有效 `edge.path` 时回显可跳过几何重算 */
14
+ export declare function isCompleteEdgeLayoutSnapshot(edge: Edge): boolean;
11
15
  export interface EdgeHandleEndpoints {
12
16
  sourceX: number;
13
17
  sourceY: number;
@@ -16,14 +20,26 @@ export interface EdgeHandleEndpoints {
16
20
  sourcePosition: Position;
17
21
  targetPosition: Position;
18
22
  }
19
- /** 由节点包围盒与锚边估算 Handle 端点(用于离屏写回 pathOptions) */
23
+ /** 由节点包围盒与锚边估算 Handle 端点(用于离屏写回 path) */
20
24
  export declare function computeEdgeHandleEndpoints(sourceNode: Node, targetNode: Node, attach: Pick<WechenAgentEdgeData, "wechenSourceAttachSide" | "wechenTargetAttachSide">): EdgeHandleEndpoints | null;
21
- export declare function resolvePathOptionsForEdge(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[]): SmoothStepPathOptions | null;
22
- export declare function mergeEdgeLayoutSnapshot(edge: Edge, snapshot: Partial<WechenAgentEdgeData>): Edge;
23
- /** 将当前几何下的锚边 + pathOptions 写入 `edge.data` */
24
- export declare function persistEdgeLayoutSnapshot(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[]): Edge;
25
+ export declare function resolvePathOptionsForEdge(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[], routeCtx?: EdgeRouteContext): SmoothStepPathOptions | null;
26
+ export declare function mergeEdgeLayoutSnapshot(edge: Edge, snapshot: Partial<WechenAgentEdgeData>, path?: WechenEdgePathPoint[], pathMode?: WechenEdgePathMode): Edge;
27
+ /** 手动边:节点移动后仅对齐首尾桩 */
28
+ export declare function realignManualEdgePath(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[], routeCtx?: EdgeRouteContext): Edge;
29
+ /** 将当前几何下的锚边 + path 写入边对象 */
30
+ export declare function persistEdgeLayoutSnapshot(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[], routeCtx?: EdgeRouteContext): Edge;
25
31
  export declare function patchEdgesRespectingSnapshots(edges: Edge[], getNode: (id: string) => Node | undefined, forceRelayout: boolean): Edge[];
26
- export declare function enrichEdgesWithLayoutSnapshots(edges: Edge[], getNode: (id: string) => Node | undefined, nodes: Node[], options: {
32
+ export interface EnrichEdgesLayoutOptions {
27
33
  forceRelayout: boolean;
28
- }): Edge[];
34
+ /** 为 true 时手动边仅对齐端点;默认 true */
35
+ respectManual?: boolean;
36
+ /**
37
+ * 节点拖动等实时几何变化:即使已有完整快照也更新 path
38
+ *(manual 仅对齐端点,auto 重算 path)。
39
+ */
40
+ liveGeometry?: boolean;
41
+ }
42
+ export declare function enrichEdgesWithLayoutSnapshots(edges: Edge[], getNode: (id: string) => Node | undefined, nodes: Node[], options: EnrichEdgesLayoutOptions): Edge[];
43
+ /** 清除手动标记并重算单条边 path */
44
+ export declare function resetEdgePathSnapshot(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[], routeCtx?: EdgeRouteContext): Edge;
29
45
  //# sourceMappingURL=edgeLayoutSnapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edgeLayoutSnapshot.d.ts","sourceRoot":"","sources":["../../src/flow/edgeLayoutSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAO1B,gCAAgC;AAChC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAK5C,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,OAAO,GACT,CAAC,IAAI,qBAAqB,CAa5B;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,mBAAmB,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAEvE;AAED,sCAAsC;AACtC,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,mBAAmB,GAAG,SAAS,GACpC,OAAO,CAST;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;CAC1B;AAED,gDAAgD;AAChD,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,IAAI,EAChB,MAAM,EAAE,IAAI,CACV,mBAAmB,EACnB,wBAAwB,GAAG,wBAAwB,CACpD,GACA,mBAAmB,GAAG,IAAI,CAqC5B;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,KAAK,EAAE,IAAI,EAAE,GACZ,qBAAqB,GAAG,IAAI,CAkC9B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACrC,IAAI,CAUN;AAED,6CAA6C;AAC7C,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,KAAK,EAAE,IAAI,EAAE,GACZ,IAAI,CAsBN;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,aAAa,EAAE,OAAO,GACrB,IAAI,EAAE,CAWR;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,GAClC,IAAI,EAAE,CAUR"}
1
+ {"version":3,"file":"edgeLayoutSnapshot.d.ts","sourceRoot":"","sources":["../../src/flow/edgeLayoutSnapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { AxisSegment } from './edgePathLayout';
2
+ import { EdgeHandleEndpoints } from './edgeLayoutSnapshot';
3
+ /** 阶梯折线顶点(画布坐标) */
4
+ export interface WechenEdgePathPoint {
5
+ x: number;
6
+ y: number;
7
+ }
8
+ export type WechenEdgePathMode = "auto" | "manual";
9
+ /** 校验 path:≥2 点、坐标有限、相邻段轴对齐 */
10
+ export declare function isValidEdgePath(path: unknown): path is WechenEdgePathPoint[];
11
+ /** 轴段序列 → 顶点 path(含起点,去重共线点) */
12
+ export declare function axisSegmentsToPath(segments: AxisSegment[]): WechenEdgePathPoint[];
13
+ /**
14
+ * 由端点 + SmoothStep 参数生成直角阶梯 path(borderRadius 取 0 用于折点)。
15
+ * 典型底→顶为 4 点:起点 → 水平段左端 → 水平段右端 → 终点。
16
+ */
17
+ export declare function buildAutoEdgePath(endpoints: EdgeHandleEndpoints, offset: number): WechenEdgePathPoint[];
18
+ /** SVG path d(直角折线) */
19
+ export declare function edgePathToSvgD(points: WechenEdgePathPoint[]): string;
20
+ /** 水平中段两端控制点下标(默认 2 个拐点) */
21
+ export declare function getHorizontalSegmentHandleIndices(path: WechenEdgePathPoint[]): [number, number] | null;
22
+ export interface HorizontalSegmentGeometry {
23
+ left: number;
24
+ right: number;
25
+ y: number;
26
+ xMin: number;
27
+ xMax: number;
28
+ }
29
+ export declare function getHorizontalSegmentGeometry(path: WechenEdgePathPoint[]): HorizontalSegmentGeometry | null;
30
+ /** 拖拽水平段:整段升降(Y) */
31
+ export declare function dragHorizontalBusY(path: WechenEdgePathPoint[], newY: number): WechenEdgePathPoint[];
32
+ /** @deprecated 使用 dragHorizontalCorner / dragHorizontalBusY */
33
+ export declare function dragHorizontalBusYAtHandle(path: WechenEdgePathPoint[], handleIndex: number, newY: number): WechenEdgePathPoint[];
34
+ /** 拖拽水平段端点沿 X,并联动相邻竖干保持正交 */
35
+ export declare function dragHorizontalCornerX(path: WechenEdgePathPoint[], handleIndex: number, newX: number): WechenEdgePathPoint[];
36
+ /** 按主轴拖拽拐点:x 调竖干位置,y 调水平段高度 */
37
+ export declare function dragPathHandle(path: WechenEdgePathPoint[], handleIndex: number, pointer: {
38
+ x: number;
39
+ y: number;
40
+ }, axis: "x" | "y"): WechenEdgePathPoint[];
41
+ /** 手动边:节点移动后仅对齐首尾桩,保留中间拐点 */
42
+ export declare function realignPathEndpoints(path: WechenEdgePathPoint[], source: WechenEdgePathPoint, target: WechenEdgePathPoint): WechenEdgePathPoint[];
43
+ export declare function isManualEdgePathMode(mode: unknown): boolean;
44
+ export declare function readPathMode(data: unknown): WechenEdgePathMode;
45
+ /** 从边对象读取 path(边根 `path` 为权威字段) */
46
+ export declare function readEdgePath(edge: {
47
+ path?: WechenEdgePathPoint[];
48
+ }): WechenEdgePathPoint[] | undefined;
49
+ export declare function mergeEdgeWithPath(edge: {
50
+ path?: WechenEdgePathPoint[];
51
+ data?: Record<string, unknown>;
52
+ }, path: WechenEdgePathPoint[], mode: WechenEdgePathMode): typeof edge;
53
+ /** 底→顶是否以竖向为主(用于拖拽轴约束提示) */
54
+ export declare function isVerticalPrimaryEdge(endpoints: EdgeHandleEndpoints): boolean;
55
+ //# sourceMappingURL=edgeOrthogonalPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgeOrthogonalPath.d.ts","sourceRoot":"","sources":["../../src/flow/edgeOrthogonalPath.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,12 @@ export interface AxisSegment {
14
14
  y2: number;
15
15
  }
16
16
  export declare function attachSideToPosition(side: WechenAttachSideOut | WechenAttachSideIn): Position;
17
+ /** 收集非端点节点的障碍矩形(含 clearance 外扩) */
18
+ export declare function collectThirdPartyObstacles(nodes: Node[], excludeIds: ReadonlySet<string>, clearance?: number): FlowNodeRect[];
19
+ /**
20
+ * 将竖直通道 X 平移到不与 [yMin, yMax] 内障碍相交的位置(迭代避让多障碍)。
21
+ */
22
+ export declare function resolveVerticalChannelX(preferredX: number, yMin: number, yMax: number, obstacles: FlowNodeRect[]): number;
17
23
  export declare function segmentIntersectsRect(seg: AxisSegment, rect: FlowNodeRect): boolean;
18
24
  /**
19
25
  * SmoothStep 轴对齐主干折线(忽略圆角,用于保守相交检测)。
@@ -1 +1 @@
1
- {"version":3,"file":"edgePathLayout.d.ts","sourceRoot":"","sources":["../../src/flow/edgePathLayout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edgePathLayout.d.ts","sourceRoot":"","sources":["../../src/flow/edgePathLayout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Edge, Node } from '@xyflow/react';
2
+ import { WechenAgentEdgeData } from './wechenAgentEdgeTypes';
3
+ import { EdgeHandleEndpoints } from './edgeLayoutSnapshot';
4
+ import { SmoothStepPathOptions } from './edgePathLayout';
5
+ import { FlowNodeRect } from './flowNodeBBox';
6
+ /** 底↔顶对向边视为「共线」的最大横向偏差(px) */
7
+ export declare const COLLINEAR_X_EPS_PX = 12;
8
+ export interface BottomFanOutBusGroup {
9
+ sourceId: string;
10
+ trunkX: number;
11
+ edgeIds: string[];
12
+ }
13
+ export interface EdgeRouteContext {
14
+ fanOutByEdgeId: Map<string, BottomFanOutBusGroup>;
15
+ groupPathBySourceId: Map<string, SmoothStepPathOptions>;
16
+ }
17
+ /** 底→顶且几何为父上子下扇出 */
18
+ export declare function isBottomTopFanOutEdge(sourceNode: Node | undefined, targetNode: Node | undefined, attach: Pick<WechenAgentEdgeData, "wechenSourceAttachSide" | "wechenTargetAttachSide">): boolean;
19
+ export declare function applyCollinearEndpointSnap(endpoints: EdgeHandleEndpoints, sourceNode: Node | undefined, targetNode: Node | undefined, channelObstacles?: FlowNodeRect[]): EdgeHandleEndpoints;
20
+ export declare function buildBottomFanOutBusGroups(edges: Edge[], getNode: (id: string) => Node | undefined, nodes?: Node[]): Map<string, BottomFanOutBusGroup>;
21
+ export declare function resolveLayoutRouteEndpoints(edge: Edge, getNode: (id: string) => Node | undefined, fanOutByEdgeId: Map<string, BottomFanOutBusGroup>, nodes?: Node[]): EdgeHandleEndpoints | null;
22
+ export declare function buildEdgeRouteContext(edges: Edge[], getNode: (id: string) => Node | undefined, nodes: Node[]): EdgeRouteContext;
23
+ export declare function resolvePathOptionsWithRouteContext(edge: Edge, getNode: (id: string) => Node | undefined, nodes: Node[], ctx: EdgeRouteContext): SmoothStepPathOptions | null;
24
+ /** 底边扇出组内所有出边共用中心槽位,路径共干 */
25
+ export declare function isFanOutBottomHandleGroup(bottomOut: Edge[], nodeId: string, getNode: (id: string) => Node | undefined): boolean;
26
+ //# sourceMappingURL=edgeRouteGeometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgeRouteGeometry.d.ts","sourceRoot":"","sources":["../../src/flow/edgeRouteGeometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMpE,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAClD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACzD;AAWD,oBAAoB;AACpB,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,IAAI,GAAG,SAAS,EAC5B,UAAU,EAAE,IAAI,GAAG,SAAS,EAC5B,MAAM,EAAE,IAAI,CACV,mBAAmB,EACnB,wBAAwB,GAAG,wBAAwB,CACpD,GACA,OAAO,CAeT;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,IAAI,GAAG,SAAS,EAC5B,UAAU,EAAE,IAAI,GAAG,SAAS,EAC5B,gBAAgB,CAAC,EAAE,YAAY,EAAE,GAChC,mBAAmB,CA4BrB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAgEnC;AAwBD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACjD,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,mBAAmB,GAAG,IAAI,CA0B5B;AA6CD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,KAAK,EAAE,IAAI,EAAE,GACZ,gBAAgB,CAiBlB;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,KAAK,EAAE,IAAI,EAAE,EACb,GAAG,EAAE,gBAAgB,GACpB,qBAAqB,GAAG,IAAI,CAgC9B;AAED,4BAA4B;AAC5B,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,IAAI,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,GACxC,OAAO,CAaT"}
@@ -0,0 +1,17 @@
1
+ import { Edge, Node } from '@xyflow/react';
2
+ import { WechenAgentNodeAutoLayoutOptions } from './autoLayoutNodes';
3
+ export declare const DEFAULT_REFINE_ITERATIONS = 3;
4
+ export declare const MAX_REFINE_ITERATIONS = 10;
5
+ export type WechenAgentLayoutStrategy = "integrated" | "dagre-only";
6
+ export interface IntegratedAutoLayoutResult {
7
+ nodes: Node[];
8
+ edges: Edge[];
9
+ }
10
+ /** 一体化精炼轮次:默认 3,限制在 1..10 */
11
+ export declare function clampRefineIterations(value?: number): number;
12
+ export declare function graphXSpan(nodes: Node[]): number;
13
+ /**
14
+ * 一体化自动布局:Dagre + 均衡 + 路由代价驱动的子树分列精炼 + 连线快照。
15
+ */
16
+ export declare function computeIntegratedAutoLayout(nodes: Node[], edges: Edge[], options?: WechenAgentNodeAutoLayoutOptions): IntegratedAutoLayoutResult;
17
+ //# sourceMappingURL=integratedAutoLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integratedAutoLayout.d.ts","sourceRoot":"","sources":["../../src/flow/integratedAutoLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAGL,KAAK,gCAAgC,EACtC,MAAM,mBAAmB,CAAC;AAS3B,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAKxC,MAAM,MAAM,yBAAyB,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AASD,6BAA6B;AAC7B,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAYhD;AAwED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,CAAC,EAAE,gCAAgC,GACzC,0BAA0B,CA+D5B"}
@@ -0,0 +1,17 @@
1
+ import { Edge, Node } from '@xyflow/react';
2
+ export interface LayoutRoutingCost {
3
+ thirdPartyHits: number;
4
+ rankOverlap: number;
5
+ balanceViolations: number;
6
+ total: number;
7
+ ok: boolean;
8
+ }
9
+ /** 全图连线路由代价(轴段与第三方节点相交 + 辅助项) */
10
+ export declare function layoutRoutingCost(nodes: Node[], edges: Edge[], getNode: (id: string) => Node | undefined, options?: {
11
+ balanceTolerance?: number;
12
+ }): LayoutRoutingCost;
13
+ /** 比较两轮布局代价(优先 hits,其次 total,最后水平跨度) */
14
+ export declare function isBetterLayoutCost(next: LayoutRoutingCost, prev: LayoutRoutingCost, nextSpan: number, prevSpan: number): boolean;
15
+ /** 单条边轴段与第三方障碍相交数(测试用) */
16
+ export declare function edgeThirdPartyHits(edge: Edge, nodes: Node[], getNode: (id: string) => Node | undefined): number;
17
+ //# sourceMappingURL=layoutRoutingCost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutRoutingCost.d.ts","sourceRoot":"","sources":["../../src/flow/layoutRoutingCost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAoBhD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;CACb;AAkFD,iCAAiC;AACjC,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,iBAAiB,CA8CnB;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAQT;AAED,0BAA0B;AAC1B,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,GACxC,MAAM,CA0BR"}
@@ -8,8 +8,8 @@ export type NodeChangeLike = {
8
8
  dragging?: boolean;
9
9
  };
10
10
  /**
11
- * 尺寸变化或拖动结束(`position` `dragging === false`)时,应重算边上的
12
- * `wechenSourceAttachSide` / `wechenTargetAttachSide`。
11
+ * 尺寸变化或 **任意** `position` 变更(含拖动中 `dragging === true`)时,
12
+ * 应同步关联边的 path / 锚边。
13
13
  */
14
14
  export declare function shouldSyncEdgeAttachSidesAfterNodeChanges(changes: ReadonlyArray<NodeChangeLike>): boolean;
15
15
  //# sourceMappingURL=nodeChangeSyncAttachSides.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodeChangeSyncAttachSides.d.ts","sourceRoot":"","sources":["../../src/flow/nodeChangeSyncAttachSides.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qDAAqD;AACrD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,GACrC,OAAO,CAUT"}
1
+ {"version":3,"file":"nodeChangeSyncAttachSides.d.ts","sourceRoot":"","sources":["../../src/flow/nodeChangeSyncAttachSides.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qDAAqD;AACrD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,GACrC,OAAO,CAKT"}
@@ -1,8 +1,8 @@
1
- /** 感应带宽度;与左右 / 上下 inset 一致用于角区留白 */
2
- export declare const ZONE_STRIP_PX = 11;
1
+ import { ZONE_STRIP_PX } from '../zoneStripHandleLayout';
2
+ export { ZONE_STRIP_PX };
3
3
  /**
4
- * 四边感应区:左/上为输入池(target),右/下为输出池(source)。
5
- * 角区留白(左带不占左上角/左下角矩形),避免与上/下带重叠命中。
4
+ * 顶底感应区:顶边为输入池(target),底边为输出池(source)。
5
+ * 条带全长可拖拽连线;几何锚点仍在中心 stub / 槽位中心。
6
6
  */
7
7
  export declare function ZoneHandles({ nodeId }: {
8
8
  nodeId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ZoneHandles.d.ts","sourceRoot":"","sources":["../../../src/flow/nodes/ZoneHandles.tsx"],"names":[],"mappings":"AA0BA,oCAAoC;AACpC,eAAO,MAAM,aAAa,KAAK,CAAC;AAuBhC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,2CAyNzD"}
1
+ {"version":3,"file":"ZoneHandles.d.ts","sourceRoot":"","sources":["../../../src/flow/nodes/ZoneHandles.tsx"],"names":[],"mappings":"AAuBA,OAAO,EACL,aAAa,EAKd,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,CAAC;AAczB;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,2CAoKzD"}
@@ -2,7 +2,13 @@ import { Edge, Node } from '@xyflow/react';
2
2
  export interface ApplyEdgeLayoutOptions {
3
3
  /** 为 false 时保留完整布局快照的边(用于 replaceFlow / initialFlow 回显) */
4
4
  forceRelayout?: boolean;
5
- /** 用于 pathOptions 障碍避让计算 */
5
+ /** true 时手动边仅对齐端点;默认 true */
6
+ respectManual?: boolean;
7
+ /** 节点拖动等实时几何变化时重算 path(见 `enrichEdgesWithLayoutSnapshots`) */
8
+ liveGeometry?: boolean;
9
+ /** 为 true 时跳过 `updateNodeInternals`(拖动中减轻开销) */
10
+ skipNodeInternals?: boolean;
11
+ /** 用于 path 障碍避让计算 */
6
12
  nodes?: Node[];
7
13
  }
8
14
  export declare function collectNodesFromEdges(edges: Edge[], getNode: (id: string) => Node | undefined): Node[];
@@ -1 +1 @@
1
- {"version":3,"file":"syncEdgeLayout.d.ts","sourceRoot":"","sources":["../../src/flow/syncEdgeLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAMhD,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,GACxC,IAAI,EAAE,CAcR;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAW9D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAYtC;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EACzB,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GACxC,IAAI,CAUN;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAGlF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EACzC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,IAAI,EAAE,CAIR"}
1
+ {"version":3,"file":"syncEdgeLayout.d.ts","sourceRoot":"","sources":["../../src/flow/syncEdgeLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAMhD,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qBAAqB;IACrB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,GACxC,IAAI,EAAE,CAcR;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAW9D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBtC;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EACzB,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GACxC,IAAI,CAaN;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAGlF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACzC,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EACzC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,IAAI,EAAE,CAMR"}
@@ -1,4 +1,5 @@
1
- import { EdgeProps } from '@xyflow/react';
1
+ import { Edge, EdgeProps } from '@xyflow/react';
2
+ import { WechenEdgePathPoint } from './edgeOrthogonalPath';
2
3
  /**
3
4
  * 历史字段:曾用于「仅反转 dash 动画」。新语义下 **不应再持久化为 `reverse`**;
4
5
  * `normalizeWechenAgentFlowJson` 会将遗留 `reverse` 归一为交换端点并清除该键。
@@ -8,27 +9,37 @@ export type WechenAgentEdgeFlowDirection = "forward" | "reverse";
8
9
  export type WechenAttachSideIn = "left" | "top";
9
10
  /** 四边感应:源端落在输出池的哪一侧(右 / 下) */
10
11
  export type WechenAttachSideOut = "right" | "bottom";
11
- /** 与 `WechenAgentDefaultEdge` / SmoothStep 一致的运行时路径参数 */
12
+ /** 与 SmoothStep 一致的运行时路径参数(自动布局元数据;渲染以 `edge.path` 为准) */
12
13
  export interface WechenEdgePathOptions {
13
14
  offset: number;
14
15
  borderRadius: number;
15
16
  }
16
- /** 连线在边对象 `data` 上的可选字段(感应边偏好等) */
17
+ export type WechenEdgePathMode = "auto" | "manual";
18
+ /** 阶梯折线顶点(持久化在边根 `path` 字段) */
19
+ export type { WechenEdgePathPoint } from './edgeOrthogonalPath';
20
+ /** 连线在边对象上的可选字段 */
17
21
  export interface WechenAgentEdgeData {
18
22
  /** @deprecated 新图请通过交换 `source`/`target` 表达执行反向;遗留值由 normalize 迁移 */
19
23
  wechenFlowDirection?: WechenAgentEdgeFlowDirection;
20
24
  wechenTargetAttachSide?: WechenAttachSideIn;
21
25
  wechenSourceAttachSide?: WechenAttachSideOut;
22
- /** 持久化布局快照:回显时优先用于渲染 */
26
+ /** 自动布局元数据;回显时与 `edge.path` 一并保留 */
23
27
  wechenPathOptions?: WechenEdgePathOptions;
28
+ /** `auto`:随 relayout 重算 path;`manual`:保留用户拐点,仅对齐端点 */
29
+ wechenPathMode?: WechenEdgePathMode;
24
30
  /** 生成快照时的布局算法版本 */
25
31
  wechenLayoutVersion?: number;
26
32
  }
33
+ /** 带持久化 path 的边类型 */
34
+ export interface WechenAgentEdge extends Edge {
35
+ path?: WechenEdgePathPoint[];
36
+ data?: WechenAgentEdgeData;
37
+ }
27
38
  /**
28
- * 默认边:平滑阶梯线;箭头在 **几何 target 端**(执行进入下游节点)。
29
- * 默认描边/选中色由 `.wechen-agent-edge` CSS 控制;宿主 `style.stroke` 仍优先。
39
+ * 默认边:优先按 `edge.path` 绘制直角阶梯折线;选中时显示水平段两端控制点。
40
+ * 描边/选中色由 `.wechen-agent-edge` CSS 控制;宿主 `style.stroke` 仍优先。
30
41
  */
31
- export declare function WechenAgentDefaultEdge(props: EdgeProps): import("react/jsx-runtime").JSX.Element;
42
+ export declare function WechenAgentDefaultEdge(props: EdgeProps): import("react/jsx-runtime").JSX.Element | null;
32
43
  export declare const wechenAgentEdgeTypes: {
33
44
  default: typeof WechenAgentDefaultEdge;
34
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"wechenAgentEdgeTypes.d.ts","sourceRoot":"","sources":["../../src/flow/wechenAgentEdgeTypes.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAkB,MAAM,eAAe,CAAC;AAM7F;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjE,+BAA+B;AAC/B,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,8BAA8B;AAC9B,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,4BAA4B,CAAC;IACnD,sBAAsB,CAAC,EAAE,kBAAkB,CAAC;IAC5C,sBAAsB,CAAC,EAAE,mBAAmB,CAAC;IAC7C,wBAAwB;IACxB,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C,mBAAmB;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAoCD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,2CAmCtD;AAED,eAAO,MAAM,oBAAoB;;CAEZ,CAAC"}
1
+ {"version":3,"file":"wechenAgentEdgeTypes.d.ts","sourceRoot":"","sources":["../../src/flow/wechenAgentEdgeTypes.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,IAAI,EACT,KAAK,SAAS,EAEf,MAAM,eAAe,CAAC;AAQvB,OAAO,EASL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAG9B;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjE,+BAA+B;AAC/B,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,8BAA8B;AAC9B,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,0DAA0D;AAC1D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnD,+BAA+B;AAC/B,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,mBAAmB;AACnB,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,4BAA4B,CAAC;IACnD,sBAAsB,CAAC,EAAE,kBAAkB,CAAC;IAC5C,sBAAsB,CAAC,EAAE,mBAAmB,CAAC;IAC7C,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C,sDAAsD;IACtD,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,mBAAmB;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAqB;AACrB,MAAM,WAAW,eAAgB,SAAQ,IAAI;IAC3C,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC5B;AA0KD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,kDAsKtD;AAED,eAAO,MAAM,oBAAoB;;CAEZ,CAAC"}