@g1cloud/bpmn-modeler-next 5.0.0-beta.9 → 5.0.0-beta.91

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.
@@ -1,5 +1,37 @@
1
+ import { Connection } from 'bpmn-js/lib/model/Types';
1
2
  import { GeometryEdge, GeometryLabel, GeometryPoint, GeometryScene, GeometryShape } from '../geometryAudit';
2
- import { ResolverServices } from './lower';
3
+ import { ResolverServices, VacatedBox } from './lower';
4
+ /**
5
+ * ── B-185 ⓐ. 막힌 곧은 메시지의 「도킹 편이 곧은 2점」 후보(순수) ──
6
+ *
7
+ * 송신 노드 바로 아래 위성 저장소처럼 **가운데 곧은 길만** 막힌 메시지를 우회를 까는 두 생성기(관통 보정 `planEdgeRepair` ·
8
+ * 풀 횡단 재경로 `planCrossPoolRoute`)가 각자 ㄷ 으로 감쌌다 — 🔁 「후보 생성기 공백」(B-64 꼴): 둘 다 양 끝 도킹을 고정하고
9
+ * 우회만 내서 곧은 대안을 아무도 안 냈다(N22 · 도킹 편이 `dockShiftCandidates` 는 겹침 보정에만 있다).
10
+ * 🔴 **N20** — 막힌 흐름에 대한 사람의 수단에 ㄷ 이 없다(레거시 + Downloads 막힌 시퀀스 66 · 메시지 4 → 굽힘 4 이상 **0** ·
11
+ * 사람의 굽힘 2 는 계단이 아니라 막는 것 너머를 넘는 같은 쪽 면 U 다 — ⓓ1) · 우리 산출 ㄷ 11 · 사람은 저장 산출의 ㄷ **2/2** 를 막는
12
+ * 것을 옮겨 곧게 폈다.
13
+ * 🔴 **메시지 한정** — 곧은 메시지의 도킹 편이는 사람 관례다(491 중 84 = 17% · 대개 10~24) · 시퀀스는 **2/3,236**.
14
+ *
15
+ * 편이 범위 = 두 끝점 면의 교집합(모서리 10 안쪽 · 끝점이 판정 대상이 아닌 풀이면 그쪽은 제약 없음) · 가운데에서 가까운 편이
16
+ * 순(5px) · 관통 0 · 끝점 아닌 도형과 틈 ≥ `clear`. 채택은 호출부가 `pickDockShiftStraight` 로 대조 경로와 비교해 정한다.
17
+ */
18
+ export declare function dockShiftStraightCandidates(edge: GeometryEdge, targets: readonly GeometryShape[], clear?: number): GeometryPoint[][];
19
+ /**
20
+ * ── B-185 ⓓ1. 같은 행 정방향 시퀀스가 막히면 같은 쪽 면 U(순수 후보) ──
21
+ *
22
+ * 같은 행에서 노드를 건너뛰는 정방향 시퀀스가 사이 노드에 막히면 관통 보정이 그 노드를 끼고 도는 ㄷ(굽힘 4)을 깔았다.
23
+ * 🔴 **N20** — 사람 막힌 시퀀스 66 중 **U 59**(윗면 → 윗면 39 · 아랫면 → 아랫면 20 · 양 끝 가운데 52 · 정방향 49) · ㄷ **0** ·
24
+ * 계단(Z) **0** · 우리 역방향 건너뛰기는 이미 U 를 냈다(역방향 후보 생성기) — 🔁 「후보 생성기 공백」(B-64 꼴): U 를 역방향에만 냈다.
25
+ * 사람 U 의 채널은 자기 풀 밖으로 나간 것이 0/59 이고 풀 · 레인 경계와 30 미만인 것이 7 ⇒ 부모 풀 안 · `BOUNDARY_CLEARANCE` 를
26
+ * 지킨다(30 미만을 일괄로 열면 U 가 늘지만 교차 이득이 줄었다 — 시제품 v2).
27
+ *
28
+ * 후보 순서 = 가운데 도킹 → 한쪽 ±25 · 채널이 가까운 순(끝점 바깥 `DETOUR_MARGIN` → `FORWARD_SKIP_CHANNEL_MAX`) · 윗면 · 아랫면.
29
+ * 관통 0 · 자기 끝점 되짚기 0 · 부모 풀 안 · 끝점 아닌 도형과 틈 ≥ `DETOUR_MARGIN` · 채널이 경계에 붙지 않는다.
30
+ *
31
+ * `hugAllowance` 를 주면 **경계 예외 후보만** 낸다(B-185 ⓔ) — 채널이 경계에 붙되(`BOUNDARY_CLEARANCE` 미만) 그 거리가 `hugAllowance`
32
+ * 이상인 것. 나머지 조건은 같다. 쓰는 자리와 이유는 `pickForwardSkipU`.
33
+ */
34
+ export declare function forwardSkipUCandidates(edge: GeometryEdge, targets: readonly GeometryShape[], containers: readonly GeometryShape[], bounds: Bounds | undefined, hugAllowance?: number): GeometryPoint[][];
3
35
  /**
4
36
  * 축 정렬 구간이 장애물을 **완전히 가로지를 때** 그것을 우회하는 4점을 만든다(순수).
5
37
  *
@@ -35,6 +67,10 @@ export declare function planMergedSegmentDetour(a: GeometryPoint, b: GeometryPoi
35
67
  * 폭 안). 해법은 우회가 아니라 **중간 구간을 장애물 옆으로 옮기는 것** — 점 수는 그대로 4 다.
36
68
  * 두 후보(장애물 왼쪽/오른쪽 또는 위/아래)를 돌려주고 채택은 호출자가 판정기로 한다.
37
69
  *
70
+ * 🔴 **B-214 — 꺾임점이 장애물 밖이어도 이 후보를 구간 우회보다 먼저 본다**(`planEdgeRepair`). 종전엔 구간 우회가
71
+ * `null` 일 때만 도는 폴백이라, 라우터의 Z 가 가운데 x 로 도형 하나를 지나면 구간 우회가 줄 중간 덧댐(S자 8점)을
72
+ * 붙였다 — 사람 문서의 줄 중간 덧댐은 **0/4,244 흐름**이고 사람은 도구 덧댐 11 중 7 을 폈다.
73
+ *
38
74
  * `null` = 4점 직각 경로가 아니다.
39
75
  */
40
76
  export declare function planMiddleSegmentShifts(waypoints: readonly GeometryPoint[], rect: GeometryShape, margin?: number): [GeometryPoint[], GeometryPoint[]] | null;
@@ -54,8 +90,23 @@ export declare function forwardThreePointCandidates(edge: GeometryEdge, shapes:
54
90
  * 목표 열은 목표 중심에 도킹 편이 0/±25/±40 — 그 열에 다른 메시지가 이미 중심 도킹해 있으면(같은 방향·같은
55
91
  * 종류라 finding 은 아니지만 두 화살표가 한 선으로 합쳐 보인다 — 사용자도 -19 비껴 놓았다) 편이 후보가 피한다.
56
92
  * 채택은 호출자 몫: 관통 0 을 먼저, 그다음 다른 간선과의 공선 공유가 없는 후보를 고른다.
93
+ *
94
+ * 🔴 B-141. 목표 도킹 열이 **출발 도형 폭 안**이면(같은 열 메시지) 후보를 내지 않는다 — 되돌아오는 세로 구간이
95
+ * 출발 도형을 관통하고, 도킹 편이(최대 ±40)로는 반폭을 못 벗어난다. 그 관통은 호출자의 관통 셈과 판정이 둘 다
96
+ * **자기 끝점을 빼서** 보이지 않아 그대로 채택됐다(표본 93 갈고리 · 계보 102 재하강 = 8회차 10간선 · 전부 이 후보 ·
97
+ * 사람 문서 0/1040 · 사람은 6/7 을 고쳤다). 위 전례는 목표 열 ≠ 출발 열이었다 — 같은 열이면 ㄷ 우회(B-9 ②)로 넘긴다.
57
98
  */
58
99
  export declare function farSideChannelCandidates(edge: GeometryEdge, shapes: readonly GeometryShape[]): GeometryPoint[][];
100
+ /** B-214. 다른 흐름의 화살표 끝에서 이 거리 안을 닿거나 건너면 「화살표 끝 곁」이다(덧댐 · 이동의 장애물 여백과 같은 축척). */
101
+ export declare const ARROW_TIP_CLEARANCE = 25;
102
+ /**
103
+ * B-214. 이 경로가 **다른 흐름의 화살표 끝 곁**(마지막 구간 위 · 끝점에서 `ARROW_TIP_CLEARANCE` 안)을 닿거나 건너는 흐름 수.
104
+ * 같은 목표로 드는 흐름은 뺀다 — 합류는 끝에서 모이는 것이 정상이다.
105
+ *
106
+ * 판정 kind 가 아니다 — 관통이 같은 후보 사이를 가르는 **순서 기준**으로만 쓴다(정방향 본선에서 장애물 왼쪽 = 본선이
107
+ * 들어오는 쪽이라, 고정 순서 [왼쪽, 오른쪽] 은 들어오는 화살표 끝 20px 에 선다 — 원격 C1 사전 실행 · 합성).
108
+ */
109
+ export declare function arrowTipNearCount(points: readonly GeometryPoint[], edge: GeometryEdge, others: readonly GeometryEdge[]): number;
59
110
  /**
60
111
  * 한 간선의 관통을 없애는 웨이포인트를 찾는다(순수). 못 찾으면 `null`.
61
112
  *
@@ -69,6 +120,21 @@ export declare function planEdgeRepair(edge: GeometryEdge, targets: readonly Geo
69
120
  width: number;
70
121
  height: number;
71
122
  }, others?: readonly GeometryEdge[]): GeometryPoint[] | null;
123
+ /**
124
+ * ── B-198. 관통 우회의 줄기를 같은 목표 형제 줄기에 맞춘다(순수) ──
125
+ *
126
+ * 관통 보정이 고른 4점 경로(h-v-h · v-h-v)의 줄기는 막는 것의 변 ± `DETOUR_MARGIN` 이라, 같은 목표의 같은 도킹점으로 드는
127
+ * 형제 선(bpmn-js 기본 중점)과 20 떨어져 평행하고 **합류점이 둘**이 된다(외부 BSP 문서 9 · 검토자 *"다른 선들과 동일한
128
+ * 지점에서 합류해야 보기가 편할 것 같아"*). 어느 후보 생성기도 형제 줄기를 내지 않는다(N22 — 3점 · 병합 우회 · 왼쪽 이동은 관통).
129
+ *
130
+ * 🔴 **사람은 이 꼴을 안 만든다** — 같은 진입선 짝의 합류점 간격 0 < Δ ≤ 60 이 사람 0/188(레거시 161 · 실무 26 문서)이고
131
+ * 사람은 줄기를 공유하거나(Δ 0) 멀리 합류한다(> 100). 그래서 **가까울 때만** 맞춘다 — 먼 합류는 사람에게도 정상이다.
132
+ * 채택 = 관통 0 · 판독 불가 겹침 · 교차 비증가 · 형제 라벨이 새 공유 구간에 앉지 않는다.
133
+ * ⚠ **자기 라벨이 있는 선은 맞추지 않는다** — 경로가 바뀌면 bpmn-js 가 라벨을 옮겨 그 자리를 미리 알 수 없다(코퍼스 0).
134
+ *
135
+ * `null` = 맞출 형제가 없다.
136
+ */
137
+ export declare function snapToSiblingTrunk(edge: GeometryEdge, points: readonly GeometryPoint[], edges: readonly GeometryEdge[], targets: readonly GeometryShape[]): GeometryPoint[] | null;
72
138
  /**
73
139
  * 이 배치가 **새로 만든** 관통을 고친다(하강 직후, undo 에피소드 안에서 호출된다).
74
140
  *
@@ -77,8 +143,38 @@ export declare function planEdgeRepair(edge: GeometryEdge, targets: readonly Geo
77
143
  * "고쳤는데 여전히 깨져 있다"가 되어 보고와 실물이 어긋난다.
78
144
  */
79
145
  export declare function repairIntroducedCrossings(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeKeys: ReadonlySet<string>,
146
+ /** B-223 — 이 배치 전 도형(같은 행 정방향 U 의 자기 라벨 비킴 판정). */
147
+ beforeShapeIds: ReadonlySet<string>,
80
148
  /** 2차 호출 전용 — 이 간선들만 본다(B-90. 1차가 돌려준 «주석 때문에 포기» 집합). */
81
149
  only?: ReadonlySet<string>): Set<string>;
150
+ /**
151
+ * ── B-188 ⓑ. 행 이동이 떠난 자리를 감싸던 ⊓ 를 접는다 ──
152
+ *
153
+ * 7단계 `node.update{band|lane}` 가 노드를 이어지지 않은 선 위로 옮기면 위 관통 보정이 **선을** 비켜 깐다(ⓐ). 그 노드가 다음
154
+ * 배치에서 떠나도 그 선은 끝점이 아니라 다시 깔리지 않아 빈자리를 감싼 우회가 남는다(ⓑ — 외부 검토 네 문서가 지목 · 빈 ⊓
155
+ * 사람 2/3,783 ↔ 외부 6/1,063). 같은 노드가 같은 선 위 다른 행으로 가면 ⊓ 가 둘로 쌓인다(B-195 *"두번 ㄷ"*).
156
+ *
157
+ * 🔴 **⊓ 하나만 접는다 — 선 전체를 다시 깔지 않는다.** 기본 경로로 다시 깔면 도킹 오프셋 같은 기존 결정까지 버려 이웃 선과
158
+ * 겹쳤다(시제품 v2). 대상 = 배치 전부터 있던 시퀀스 · 메시지 중 떠난 노드와 이어지지 않고 끝점을 이 배치가 안 바꾼 선의
159
+ * 4점 ⊓(p0 → p1 → p2 → p3 · p0 · p3 가 같은 축)인데 밑변 p0 → p3 가 **떠난 자리를 지나고 지금 아무 도형도 안 지나는** 것.
160
+ * 채택 = `relayFresh`(B-114 ⓔ)와 같은 규칙(그 선 자기 라벨을 뺀 판정 — 새로 생긴 수 ≤ 해소) + 교차(끝점 공유 포함) 비증가 —
161
+ * 아니면 점과 라벨을 되돌린다.
162
+ * ⚠ **이 배치가 떠난 자리만 본다** — 이미 남아 있는 옛 빈 ⊓ 은 원인을 모른다(사람이 둔 것일 수 있다).
163
+ * ⚠ **라벨** — bpmn-js 가 경로 변화에 맞춰 라벨을 옮긴다. 라벨이 붙은 구간(라벨 중심에서 가장 가까운 구간)이 접힌 세 구간
164
+ * 밖이면 제자리로 되돌린다(다른 도형 위로 옮겨졌다 — 합성 실측). 안이면 그대로 두고 호출자가 라벨-선 보정에 넘긴다(B-178 과
165
+ * 같은 이유 · 안 넘기면 선재 라벨로 취급돼 자기 선 위에 남는다).
166
+ *
167
+ * 반환 = 실제로 접은 선 id.
168
+ */
169
+ export declare function foldVacatedDetours(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, vacated: readonly VacatedBox[], beforeEdgeIds: ReadonlySet<string>, reroutedEdgeIds: ReadonlySet<string>): Set<string>;
170
+ type Bounds = {
171
+ x: number;
172
+ y: number;
173
+ width: number;
174
+ height: number;
175
+ };
176
+ /** 연결의 부모 컨테이너 bounds — 프로세스 평면(루트)이면 `undefined`. */
177
+ export declare function parentBoundsOf(connection: Connection): Bounds | undefined;
82
178
  /**
83
179
  * 🔴 **이 배치가 새로 만든 간선 × 간선 교차 중 「대가 없이 없앨 수 있는 것」만 없앤다**(B-90 ⓑ).
84
180
  *
@@ -99,16 +195,75 @@ only?: ReadonlySet<string>): Set<string>;
99
195
  * 읽을 수 없는 중첩이 늘지 않을 때만 채택(🔁 「채택 조건에 대가가 없다」 클래스를 미리 막는다).
100
196
  */
101
197
  export declare function repairIntroducedEdgeCrossings(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforePairs: ReadonlySet<string>, beforeEdgeIds: ReadonlySet<string>): void;
198
+ /**
199
+ * 공유 노드 `node` 쪽 끝을 네 변 중심으로 옮긴 경로 후보(순수). 반대쪽 끝은 **지금 도킹점 · 그 변 그대로** 둔다 —
200
+ * 그 끝은 이 쌍의 교차와 무관하고, 옮기면 그쪽 이웃과의 관계가 새로 생긴다. 반대쪽 도킹점이 변 위가 아니면 후보 없음.
201
+ */
202
+ export declare function redockCandidates(edge: GeometryEdge, node: GeometryShape, shapesById: ReadonlyMap<string, GeometryShape>): GeometryPoint[][];
203
+ /**
204
+ * 🔴 **이 배치가 만든 「끝점을 공유하는」 시퀀스 플로우 교차를 공유 노드의 출입 변을 바꿔 없앤다**(B-146 ⓑ).
205
+ *
206
+ * 표본 98 의 사람 수정 형태 그대로다 — 실패 갈래(게이트웨이 → 오류 노드)가 오류 노드 왼쪽 면으로, 되돌아감(오류 노드 →
207
+ * 상류)이 윗면에서 나가 서로 가로질렀고, 사람은 **실패 갈래를 윗면으로 · 되돌아감을 왼쪽 면에서** 내도록 맞바꿨다
208
+ * (도형 무이동 · 간선 직접 2). 🔴 **한 간선만 옮겨서는 안 풀린다** — 어느 쪽만 옮겨도 다른 쪽과 공선으로 마주 달린다.
209
+ * 그래서 B-90 ⓑ(한 간선씩)와 달리 **쌍을 함께** 고른다.
210
+ *
211
+ * **범위**(B-146 수단 결정) — 시퀀스 × 시퀀스(노드 루프)만 · 블랙박스 풀을 함께 끝점으로 가진 메시지는 보류(사람 기저 0 ·
212
+ * 증언 없음) · 이 배치가 만든 쌍만(`beforeSharedPairs` 밖) · **이 배치가 만든 간선만 움직인다**(B-90 ⓑ 규약 — 기존 간선은
213
+ * 지금 경로 하나만 후보다). 도형은 옮기지 않는다 — 경로로 안 풀리는 형상(g39 = 새 게이트웨이가 기존 우회선 아래)은 남는다.
214
+ *
215
+ * **대가 판정**(B-90 ⓑ 와 같은 자세 — 계산이 곧 판별) — 이 쌍이 더는 교차하지 않고 · 둘이 공선으로 겹치지 않고 · 컨테이너
216
+ * 안이고 · 끝점 공유 교차 총수가 줄고 · **종전 교차 쌍이 새로 생기지 않고** · 문서 판정에 **새 키가 0** 일 때만. 통과한
217
+ * 조합 중 **길이 + 꺾임** 이 가장 작은 것을 고른다(사람 수정본은 도구 산출과 길이가 같고 꺾임만 달랐다).
218
+ */
219
+ export declare function repairIntroducedSharedEndpointCrossings(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeSharedPairs: ReadonlySet<string>, beforeEdgeIds: ReadonlySet<string>): void;
220
+ /**
221
+ * 🔴 **이 배치가 만든 메시지 중 선재 블랙박스 풀로 가고 짝 열이 풀 가로 범위 밖인 것을 짝 쪽 가장자리에 다시 도킹한다**(B-150).
222
+ * `beforeEdgeIds` · `beforeShapeIds` = 하강 전 간선 · 도형 id(선재 풀 판별 · 새 메시지 판별).
223
+ */
224
+ export declare function redockIntroducedBlackboxMessages(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>, beforeShapeIds: ReadonlySet<string>): void;
102
225
  /**
103
226
  * 풀 횡단 메시지플로우의 6점 경로 계획(순수). `null` = 이 간선은 대상이 아니거나(중간 풀 없음 ·
104
227
  * 끝점 해소 불가) 더 나은 열이 없다.
105
228
  */
106
229
  export declare function planCrossPoolRoute(edge: GeometryEdge, scene: GeometryScene): GeometryPoint[] | null;
230
+ /**
231
+ * ── 승객 간선의 base 경로 평행이동 (B-133 ⓒ) ──
232
+ *
233
+ * 하강 전에 있던 간선 중 **양 끝 도형이 같은 델타로 움직였는데 경로는 다시 깔린 것**을 base 경로 + 델타로
234
+ * 되돌린다. 한 짝의 끝점이 **서로 다른 단계**에서 옮겨지면(밀기 `createSpace` 는 노드 쪽만 · B-75 추종은 풀
235
+ * 쪽만 · 짝 동반은 짝 쪽만) 단계마다 bpmn-js `connection.layout` 이 사람이 그린 경로를 버리고 다시 깐다. 순
236
+ * 변위가 같으므로 평행이동이면 사람 경로가 그대로 산다. 실측(표본 103 · 사람 문서 + 증언 *"선이 껶여있는
237
+ * 부분이 걸렸어"*) = 쌓인 송신 노드의 **옆면 출발 3점**이 위 노드를 관통하는 2점으로 다시 깔리고, 우회 보정이
238
+ * 그것을 **8점 지그재그**로 감싸 이웃 메시지와 130px 겹쳤다(`edge-overlap-unrelated`).
239
+ *
240
+ * 안전 성질 2(선재 경로 불가침)의 **복원판**이다 — 선재 경로를 이 배치가 이미 지운 자리에서, 사람이 그린 것을
241
+ * 되살린다. 자리 = 도형을 옮기는 패스(lower · 풀 · 그룹) **전부 뒤**, 경로 보정 **앞** — 되살린 경로도 뒤
242
+ * 보정의 입력이 된다.
243
+ *
244
+ * 조건(전부) — ① 하강 전에 있던 **시퀀스 · 메시지 흐름**(연관은 뺀다 — N20 에서 base 의 끊긴 주석 연관만 되살려
245
+ * 판정을 늘렸고 이득은 0 이었다) ② 이 배치가 끝점을 바꾸지 않았다(재배선 · 끝점 id) ③ 양 끝 도형 **크기 불변** ·
246
+ * 이동 델타가 **같고 0 이 아니다** ④ 지금 경로 ≠ base + 델타 ⑤ 지금 경로가 이미 **관통 없는 2점 축 직선이면
247
+ * 둔다**(N20 — 다시 깐 직선을 사람의 꺾인 경로로 되돌리면 2점 메시지만 잃었다) ⑥ base + 델타 경로가 도형을
248
+ * 관통하지 않는다(관통하면 뒤 우회 보정에 맡긴다).
249
+ *
250
+ * N20(합성 재고 = 풀 안 시퀀스 전량 끼우기 3 op · 사람 문서 183 → 3,884 · 저장본 109 → 4,466) — 사람: 배치가 만든
251
+ * 판정 **−50** · 새 판정 4(전부 교환) · 교차 −25 · 2점 메시지 무변 · 순악화 **0** / 저장본: **−58** · 교차 감소 ·
252
+ * 2점 메시지 무변 · 순악화 **0**(교차 +1 4건은 종류 다름 중첩 해소와 교환).
253
+ */
254
+ export declare function restorePassengerEdgeRoutes(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, sceneBefore: GeometryScene, reroutedEdgeIds: ReadonlySet<string>): void;
107
255
  /**
108
256
  * 이 배치가 **새로 만든** 메시지플로우 중 풀을 횡단하는 것을 재경로한다(하강 직후, undo 에피소드
109
257
  * 안). `beforeEdgeIds` = 하강 전 간선 id — 그 밖의 것만 대상(안전 성질 2: 선재 경로 불가침).
110
258
  */
111
259
  export declare function rerouteIntroducedCrossPoolEdges(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>): void;
260
+ /**
261
+ * 🔴 **이 배치가 만들었거나 경로를 바꾼 메시지가 관계없는 풀 안을 가로로 지나면 그 가로를 끝점의 풀 안으로 옮긴다**(B-151) — 끝점 풀 안이
262
+ * 막히면 풀 밖 채널(풀 사이 틈 · 더미 바깥)로(B-151 ⓐ) · 채택이 없던 메시지는 한 번 더 본다.
263
+ * 선재 메시지는 base 보다 그 길이가 `UNRELATED_POOL_RUN_MIN` 이상 **는** 것만 — base 의 가로는 사람이 둔 것이다.
264
+ * `beforeEdgeIds` = 하강 전 간선 id · `sceneBefore` = 하강 전 장면(선재 경로 · 풀).
265
+ */
266
+ export declare function repairIntroducedUnrelatedPoolRuns(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>, sceneBefore: GeometryScene): void;
112
267
  /** 안쪽 구간(첫·끝 도킹 구간 제외)이 컨테이너 경계선과 나란히 이 거리 안에서 달리면 "경계에 붙었다"고 본다. */
113
268
  export declare const BOUNDARY_CLEARANCE = 30;
114
269
  /** 웨이포인트의 **안쪽 구간**(도킹 구간 제외)이 어느 컨테이너의 경계선과 나란히 `BOUNDARY_CLEARANCE` 안에서 겹쳐 달리는가. */
@@ -126,6 +281,19 @@ export declare function nearPassCount(pts: readonly GeometryPoint[], shapes: rea
126
281
  * 같은 레인 안에서 되돌아가는 간선(r2 `Flow_o14`)은 A2 채널이 경계에서 멀어 발동하지 않는다. 없으면 `null`.
127
282
  */
128
283
  export declare function planBackEdgeBoundaryClearance(edge: GeometryEdge, scene: GeometryScene): GeometryPoint[] | null;
284
+ /**
285
+ * ── B-202. 다른 행으로 가는 갈래가 곧은 형제 갈래의 출구를 함께 쓰는가(순수) ──
286
+ *
287
+ * 게이트웨이의 위 · 아래 갈래가 주 갈래(곧은 2점)와 **같은 꼭짓점에서 같은 방향**으로 나가 첫 구간을 공유한 뒤 꺾이면,
288
+ * 라벨을 각 고유 구간으로 갈라도(B-15 ⓐ) 어느 선이 어디로 가는지 *"내용을 봐야"* 안다(외부 BSP 문서 15 검토자).
289
+ * 🔴 **사람은 이 꼴을 안 만든다** — 곧은 주 갈래 + 다른 행 갈래 짝에서 둘째 갈래가 주 갈래 출구를 공유하는 것은 사람
290
+ * **1/380**(레거시 161 · 실무 26 문서)이고 나머지는 전부 그쪽 꼭짓점(윗면 · 아랫면)으로 나간다. 「같은 방향 팬아웃 겹침은
291
+ * 문제 아님」(B-14 ⓒ1 · B-15 ⓐ)은 이 짝에서 반증됐다 — 같은 쪽 갈래끼리(둘 다 위 · 둘 다 아래)의 공유는 사람도 흔하다(B-192).
292
+ *
293
+ * 판별 = 시퀀스 · 출발이 게이트웨이 · `points` 의 첫 구간이 같은 출발의 곧은 2점 형제 시퀀스와 같은 점 · 같은 축 · 같은 방향.
294
+ * 반환 = 공유하는 형제 id · 없으면 `null`.
295
+ */
296
+ export declare function sharedSiblingExit(points: readonly GeometryPoint[], edge: GeometryEdge, scene: GeometryScene): string | null;
129
297
  /**
130
298
  * 배치가 만든 정방향 간선의 **불필요한 꺾임을 줄인다**(B-34 ⓑ) — bpmn-js 기본 맨해튼 라우팅은 출발 직후
131
299
  * 꺾어 목표 행으로 올라간 뒤 가로로 가는 4점을 낸다. 사람은 두 회차 연속(표본 30·31, 같은 간선 같은 변환)
@@ -154,15 +322,42 @@ export declare function planBackEdgeBoundaryClearance(edge: GeometryEdge, scene:
154
322
  * 직접 근거는 표본 89 하나이고 원본은 짝의 **대칭**을 지지할 뿐이다. 짝 판정은 신규 · 재배선 간선에 똑같이 건다
155
323
  * (한쪽만 걸면 🔁 add/update 경로 갈림이다). 우회가 아니면 순서는 그대로다 — 새 행의 흐름 머리로 들어가는 태스크 출발은
156
324
  * 사람 원본이 가로 → 세로 **63/68**(세로 → 가로 0)이다.
325
+ *
326
+ * ── B-202. **곧은 형제 갈래와 출구를 공유하는 후보는 끝으로 미룬다** ──
327
+ *
328
+ * 가로 → 세로 후보는 출발 오른쪽 면에서 나간다. 출발이 게이트웨이고 그 꼭짓점에서 곧은 형제 갈래가 이미 같은 방향으로
329
+ * 나가면 두 선이 첫 구간을 공유한다(`sharedSiblingExit`) — 판독 불가 겹침은 같은 방향 · 같은 출발을 합류로 빼서 게이트가
330
+ * 못 본다. 이 패스로 오는 그 4점은 시험 이동 되돌림의 잔여였다(`tryShiftGroups` 가 게이트웨이를 목표 밑으로 옮긴 순간 bpmn-js 가
331
+ * 목표 아랫면으로 다시 깔고 되돌림은 도형만 돌린다 — 🔁 B-123 · N22). 공유 후보는 **지우지 않는다** — 다른 후보가 다 막히면
332
+ * 종전대로 쓴다. ⚠ 반대 중첩 보정(`planOppositeOverlapRepair`)에는 넣지 않았다 — 그쪽 실례(주문 이행 fixture)는 후보가 전부
333
+ * 오른 꼭짓점 출발이라 순서로는 못 피하고 코퍼스 효과가 0 이었다(시제품).
157
334
  */
158
- export declare function repairIntroducedDetours(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>, reroutedEdgeIds: ReadonlySet<string>): void;
335
+ export declare function repairIntroducedDetours(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>, reroutedEdgeIds: ReadonlySet<string>,
336
+ /** B-223 — 이 배치 전 도형(뒤늦은 U 의 자기 라벨 비킴 판정). */
337
+ beforeShapeIds: ReadonlySet<string>): void;
159
338
  export declare function repairIntroducedBoundaryHugging(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>): void;
339
+ /**
340
+ * 🔴 **B-211 — 경로가 끝점 아닌 게이트웨이의 꼭짓점에 닿고, 그 꼭짓점에 도킹한 다른 흐름의 끝점을 지나는가.**
341
+ *
342
+ * 후보 게이트 둘이 이 형상을 각자 면책한다 — `crossedShapesOf` 는 bbox 를 `CROSS_INSET` 만큼 줄인 상자에 **들어와야**
343
+ * 관통이라 마름모 꼭짓점 접촉(실형상 거리 0)이 빠지고, `crossingCost` 는 진성 교차만 세서 도킹점을 **정확히 지나는** 선이
344
+ * 빠진다(N1307). 둘이 겹치면 꼭짓점을 지나는 후보가 「관통 0 · 교차 0」 으로 1등이 된다 — 원격 반품 문서의 재시도 루프가
345
+ * 「환불 결과?」 왼쪽 꼭짓점 = 들어오는 화살표 끝을 지나 선이 게이트웨이로 드는 것처럼 읽혔다(판정 0). 구조적이다: 게이트웨이
346
+ * (폭 50)가 같은 열에 중심 정렬되면 도킹 편이 25 가 곧 꼭짓점 x 다.
347
+ *
348
+ * 🔴 **N20** — 사람 문서(레거시 161 · 실무 26)에 이 형상 0 · 끝점 아닌 게이트웨이에 20px 안으로 다가간 선조차 0.
349
+ * ⚠ 꼭짓점 **접촉만**(도킹한 흐름이 없는 꼭짓점)은 세지 않는다 — 측정한 얼굴(P3)보다 넓히지 않는다.
350
+ * 호출자 = 반대 중첩 보정(B-211) · 경계 비킴(B-220) — 같은 생성기(`backEdgeCandidates`)를 쓰는 가짜 합류 · 연쇄 보정은 아니다.
351
+ */
352
+ export declare function passesGatewayVertexDock(points: readonly GeometryPoint[], edge: GeometryEdge, scene: GeometryScene): boolean;
160
353
  /**
161
354
  * 한 간선의 **읽을 수 없는 중첩**(반대 방향 · 종류 다름)을 없애거나 줄이는 경로(순수). 못 찾으면 `null`.
162
355
  * 종류 다른 중첩(B-17 ⓐ)의 보정 = 도킹 편이 — "가급적 중심에 도킹하되 어쩔 수 없을 땐 약간 비껴서"
163
356
  * (사용자 프레이밍). 기본은 중심이고, finding 이 났을 때만, 최소 편이(±25)부터 본다.
164
357
  */
165
- export declare function planOppositeOverlapRepair(edge: GeometryEdge, scene: GeometryScene): GeometryPoint[] | null;
358
+ export declare function planOppositeOverlapRepair(edge: GeometryEdge, scene: GeometryScene, options?: {
359
+ sideEntry?: boolean;
360
+ }): GeometryPoint[] | null;
166
361
  /**
167
362
  * 이 간선의 **가짜 합류**(B-77)를 없애는 경로(순수). 못 찾으면 `null`.
168
363
  *
@@ -201,7 +396,13 @@ export declare function planChainOverlapRepair(edge: GeometryEdge, scene: Geomet
201
396
  * 짝 중 **새 간선만** 손댄다(안전 성질 2).
202
397
  */
203
398
  export declare function repairIntroducedChainOverlaps(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeKeys: ReadonlySet<string>, beforeEdgeIds: ReadonlySet<string>): void;
204
- export declare function repairIntroducedOppositeOverlaps(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeKeys: ReadonlySet<string>, beforeEdgeIds: ReadonlySet<string>): void;
399
+ /**
400
+ * B-14 ⓒ1 — 이 배치가 새로 낸 읽을 수 없는 중첩을 고친다. `beforeEdgeIds` 에 든 간선(배치 전부터 있던 것)은 손대지 않는다.
401
+ * 🔴 **B-178** — `sideEntryEdgeIds` 에 든 간선에만 빈 옆면 진입 후보를 연다(호출자 = 「이 배치가 경로를 다시 깐 기존 간선」).
402
+ * 🔴 **반환 = 실제로 경로를 바꾼 간선** — 뒤의 라벨-선 보정이 그 간선의 라벨을 이 배치 몫으로 다뤄야 한다(안 그러면
403
+ * 다시 깐 기존 간선의 라벨이 새 경로 위에 남는다 — N20 실측 +9).
404
+ */
405
+ export declare function repairIntroducedOppositeOverlaps(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeKeys: ReadonlySet<string>, beforeEdgeIds: ReadonlySet<string>, sideEntryEdgeIds?: ReadonlySet<string>): ReadonlySet<string>;
205
406
  /**
206
407
  * 라벨의 새 bounds(순수). 라벨이 공유 구간 위에 없으면 `null`(옮길 이유가 없다). 고유 구간을 못
207
408
  * 찾거나 옮긴 자리가 도형과 겹치면 `null`(손대지 않고 보고에 맡긴다).
@@ -298,13 +499,24 @@ export declare function planLabelBesideOwnLine(edge: GeometryEdge, scene: Geomet
298
499
  * 반사실(합성 5,002 · lineage 93) = 해소 9 · lineage 는 표본 78 한 회차(사람 값과 3px) · 새 판정 0.
299
500
  * ⚠ **못 닫는 것** — 라벨이 선보다 넓다(🔁 B-31 「틈 40」) · 고른 자리가 다른 선과 공유 구간이다(`label-on-shared-segment`
300
501
  * — 공유 구간 검사 + 미끄럼 후보를 더한 판도 이득 0) · base 에서 이미 표류한 라벨(선 기하가 안 바뀌어 이 가지에 안 온다).
502
+ *
503
+ * ── B-119 ⓒ′. **착지가 라벨 뒤로 비켜 선 간선(`labelLandingFlowIds`)은 겹침 없이도 base 로 되돌린다** ──
504
+ *
505
+ * 새 노드가 base 라벨 오른끝 + 10 에 서도 bpmn-js 가 착지 뒤 라벨을 비례 위치로 옮겨 노드 왼변에 **닿게** 둔다(합성 발동 167 중
506
+ * 22 · 여유 5 미만 · 표본 144 = 1px — 사람은 여유 30 으로 고쳤다). 1px 은 위 「겹칠 때만」 문턱(kind 깊이 3)에 안 걸려 아무도
507
+ * 안 본다. 그 자리는 하강이 **일부러 비워 둔** 자리라 되돌리면 여유가 정확히 그 10 이다. ⚠ 「겹칠 때만」(2026-09-28 결정)은
508
+ * 일반 재배선 라벨의 규칙이라 그대로 둔다 — 넓히는 것은 이 간선들뿐이다. 자리 · 거리 · 채택 게이트는 ⓑ 와 같다.
301
509
  */
302
- export declare function followMovedEdgeLabels(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, before: ReadonlyMap<string, EdgeLabelSnapshot>): void;
510
+ export declare function followMovedEdgeLabels(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, before: ReadonlyMap<string, EdgeLabelSnapshot>, labelLandingFlowIds?: ReadonlySet<string>): void;
303
511
  /**
304
512
  * 이 배치가 **새로 만든** 간선의 라벨을 선·경계선에서 뗀다(맨 마지막 — 라벨 귀속 보정 뒤). 선재 라벨은 불가침 —
305
513
  * 단 `reroutedEdgeIds`(이 배치가 끝점을 바꿔 경로를 다시 깐 선재 간선)는 대상이다(B-114 ⓔ ⓑ).
514
+ *
515
+ * B-196 — `besideOwnLineIds`(4.5 ⓔ 가 막는 도형 왼쪽으로 비킨 메시지)는 위 자리(없으면 지금 자리)가 흐름 노드 위면 자기 선 곁
516
+ * 빈자리({@link planLabelBesideOwnLine})로 — 「세로 = 오른쪽 먼저」 후보가 방금 비킨 막는 도형 위다(후보는 선만 본다 · 판정
517
+ * `label-over-shape` 는 메시지 라벨을 안 본다 — 지표 0 인 채 보이는 겹침). 곁 자리가 없으면 위 자리 그대로다.
306
518
  */
307
- export declare function repairIntroducedLabelLines(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>, reroutedEdgeIds?: ReadonlySet<string>): void;
519
+ export declare function repairIntroducedLabelLines(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeEdgeIds: ReadonlySet<string>, reroutedEdgeIds?: ReadonlySet<string>, besideOwnLineIds?: ReadonlySet<string>): void;
308
520
  /**
309
521
  * 이 배치가 **새로 만든** 간선의 라벨 귀속 문제를 고친다(하강 직후, undo 에피소드 안, 경로 보정들 뒤).
310
522
  * 선재 간선의 라벨은 사람이 놓았을 수 있어 손대지 않는다(안전 성질 2).
@@ -342,3 +554,4 @@ export declare function repairIntroducedShapeLabelLines(services: Pick<ResolverS
342
554
  * `scene` 으로 하고 통과한 간선만 실제로 옮긴다 · 새 키가 생기면 **그 간선만** 두고 간다(🔁 B-61).
343
555
  */
344
556
  export declare function redockIntroducedDetachedEndpoints(services: Pick<ResolverServices, 'elementRegistry' | 'modeling'>, beforeKeys: ReadonlySet<string>): void;
557
+ export {};