wechen-agent-editor-v1 1.1.9 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +40 -9
  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 +6 -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";
@@ -196,11 +212,25 @@ npm 7+ 会校验整棵依赖树的 peer。冲突常来自宿主已有包,未
196
212
  {
197
213
  "dependencies": {
198
214
  "@monaco-editor/react": "^4.6.0",
199
- "wechen-agent-editor-v1": "^1.1.0"
215
+ "wechen-agent-editor-v1": "^1.1.9"
200
216
  }
201
217
  }
202
218
  ```
203
219
 
220
+ ### 集成排错
221
+
222
+ | 现象 | 可能原因 | 处理 |
223
+ |------|----------|------|
224
+ | 代码编辑区空白 / 控制台 Monaco worker 报错 | 未配置 **Monaco worker** | 按 README「Monaco Worker」在应用入口引导 worker |
225
+ | 画布不可见或高度为 0 | 父级无 **定高** 或 flex 链缺 `minHeight: 0` | 使用「嵌入 flex 布局」示例;或传编辑器 **`minHeight`** |
226
+ | 连线异常、Handle 无响应、样式错乱 | **`@xyflow/react` 双实例** | `npm ls @xyflow/react`;保证宿主与编辑器共用 **单实例**(见上文 peer 说明) |
227
+ | `ref.deleteEdge(id)` 无效 | 持久化载体无稳定 **`edges[].id`** | 优先存 **`snapshot.flow` / `flowJson`**;仅存 DTO 时导出须含 **`edges[].id`**,回灌后用 **新** id |
228
+ | 存库后连线形状与编辑时不一致 | 仅存拓扑 DTO、缺 **layout** | 使用 **`flowJson`** 或 DTO **`edges[].layout`**(见「连线布局」) |
229
+
230
+ Playground **`?tab=overview`** 提供术语表与持久化对比;工程清单见 **`docs/ENGINEERING-BASELINE.md`**。
231
+
232
+ > **`package.json` 的 `repository` / `homepage` / `bugs`** 若为占位 URL,表示尚未绑定公开仓库;私有 fork 可忽略,发版前请改为真实地址。
233
+
204
234
  ---
205
235
 
206
236
  ## 使用
@@ -368,9 +398,9 @@ validateLocaleMessagesCompleteness(enPack);
368
398
 
369
399
  L1 工厂同样支持:`buildWechenAgentEditorProps({ onBeforeRemoveNode: ... })`。
370
400
 
371
- ### 四边感应区连线(默认)
401
+ ### 顶底感应区连线(默认,上进下出)
372
402
 
373
- 内置 **`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`**、底边扇出 **共干** 路径配合。
374
404
 
375
405
  周界四向感应的 **完整方案说明(交互、角区、数据字段、代码映射)** 见仓库 **`openspec/changes/node-perimeter-sensing-scheme/design.md`**。
376
406
 
@@ -617,6 +647,7 @@ npm install
617
647
  npm install --prefix playground
618
648
  npm run dev # Playground 文档站(分 Tab 演示;ref 全表见 ?tab=ref-api,见 playground/README.md)
619
649
  npm run dev:minimal # 仅最小宿主集成(对照 README「快速开始」)
650
+ npm run baseline # 工程基线:测试数、最大 LOC、dist 体积(见 docs/ENGINEERING-BASELINE.md)
620
651
  ```
621
652
 
622
653
  浏览器地址以终端输出为准(默认 `http://localhost:5173`)。
@@ -634,8 +665,8 @@ npm run dev:minimal # 仅最小宿主集成(对照 README「快速开始
634
665
 
635
666
  ### 发版清单
636
667
 
637
- 1. 确认 `package.json` **`version`** 已 bump(当前 **1.1.0**)。
638
- 2. 执行 **`npm install`**(同步 lock)→ **`npm run release:prep`**(`test` + `build` + `pack:check` + playground build),或分步执行。
668
+ 1. 确认 `package.json` **`version`** 已 bump(**以 `package.json` 为准**,当前 **1.1.9**)。
669
+ 2. 执行 **`npm install`**(同步 lock)→ **`npm run release:prep`**(`test` + `build` + `pack:check` + playground build + **基线摘要**),或分步执行;可单独运行 **`npm run baseline`** 查看 LOC/体积指标。
639
670
  3. **`npm whoami`** 确认已登录 **registry.npmjs.org**;scoped 包首次发布需 **`--access public`**(`publishConfig` 已配置)。
640
671
  4. 执行 **`npm run release`**(或 `npm publish`),发后验证:
641
672
 
@@ -644,6 +675,6 @@ npm view wechen-agent-editor-v1 version
644
675
  npm pack --dry-run # 确认 tarball 仅含 dist、LICENSE
645
676
  ```
646
677
 
647
- 5. 在空目录烟测:`npm install wechen-agent-editor-v1@1.1.0`,`import { WechenAgentEditor } from "wechen-agent-editor-v1"`。
678
+ 5. 在空目录烟测:`npm install wechen-agent-editor-v1@<version>`(`<version>` 与 `package.json` 一致),`import { WechenAgentEditor } from "wechen-agent-editor-v1"`。
648
679
 
649
- 发版前可将 `repository` / `bugs` / `homepage` 中的占位 URL 换成真实仓库地址。
680
+ 发版前可将 `repository` / `bugs` / `homepage` 中的占位 URL 换成真实仓库地址(私有仓库可仅在内部文档记录,见「集成排错」说明)。
@@ -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"}