merge(511-B B-5 follow 합치기): origin/sub_laptop_3(follow 줄 엶 · /calc follow 서버 맥락) 받음 — 공유 파일 충돌 풂

- /calc 창구 차례 = 격자 경로 막기 → 단계 · 화면 길 서버 맥락(B-4) → follow 저장 정본 맥락(B-5 · stages 다시 짬)
- 까닭 글 = cross 그대로 · pair_B5 걷음(follow 엶)
- 시험 511_b1 · 309_2 · 309_2_browser = 잠긴 단계 줄 없음 · 잠금 예시 = form_default · 화면 열린 줄에 P5 P6 F1 F2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-22 16:02:25 +09:00
co-authored by Claude Opus 5.5
14 changed files with 493 additions and 59 deletions
@@ -184,6 +184,24 @@ const plusAt = new WeakMap<object, FollowingStructure[]>();
/** follow 출력마다 따라가기만 한 자리(id → 자리 누가거리들) — planline 이 427 세움에 씀(459). */
const followedAt = new WeakMap<object, ReadonlyMap<string, number[]>>();
/** follow 출력 곁 자료(추가 측점 땅 자리 · 따라가기만 한 자리) — JSON 꼴(서버 follow · 511-B B-5). */
export interface FollowSides {
plus: FollowingStructure[] | null;
followed: Array<[string, number[]]> | null;
}
export function followSides(patch: object): FollowSides {
const followed = followedAt.get(patch);
return { plus: plusAt.get(patch) ?? null, followed: followed ? [...followed] : null };
}
/** 서버가 낸 follow 출력에 곁 자료를 다시 붙임 — 다음 걸음 · planline 이 화면 셈과 같은 값을 봄. */
export function withFollowSides<T extends object>(patch: T, sides: FollowSides): T {
if (sides.plus) plusAt.set(patch, sides.plus);
if (sides.followed) followedAt.set(patch, new Map(sides.followed));
return patch;
}
type Facility = FollowingStructure & { id?: string | null; structure_id?: string | null };
/** 땅 위 자리 — 좌표가 있으면 그대로(따라가기만 한 시설 = 정본 좌표 · 초안 둔 채 열기도) · 없으면 누가거리의