Worker prewarm, viewport-first stable batches, and adaptive reveal pacing
(default on, clamp 6–14ms). On drag settle force OVG rebuild and never drop
the last legal path when route/stretch fail.
Convert nodeRect {x,y,w,h} to {x,y,x2,y2} in dragPathStillClear so
corridor stickiness keeps anti-flicker while live avoidance fires when
a node body actually hits a link. Add contract tests; ignore local 進度.md.
- Web Worker routing — A* search runs in a background Worker thread,
keeping the UI responsive during large batch routes
- Worker watchdog — auto-falls back to main-thread routing on any failure
- Worker held-pause — drag-pause re-routes also run in worker
- stretch.js — extracted sticky-path logic, shared by main thread and worker
- Profiler disk export — POST /linkrouter/write_log endpoint saves reports
- Chunked worker processing — 8ms macrotask slices for cancel responsiveness
- New settings: Background worker routing, Held-pause in worker
Major features:
- Adaptive drag mode with 5 fixed modes (Normal, Freeze+Check, Freeze, Hide, Heavy Deferred)
- Heavy Deferred for lag-free dragging in large workflows (250+ nodes)
- Three drag phases: moving → held → released, with priority-based re-routing during pause
- Node hard-obstacle avoidance — links can never pass through nodes
Performance:
- Progressive routing with frame-budgeted progressive batches
- Fast graph signature for geometry-change detection
- OVG rebuild deferred during large drags
- Collision re-check limited to affected links only
Fixes:
- Hover no longer triggers full-workflow redraw
- Krea2 / Ultimate SD Upscale link disappearance during drag
- Stale sticky paths now validated before reuse
- Drag-endpoint dogleg for straight-line links
New modules: adaptive-policy, drag-policy, draw-policy, profiler, progressive, ui-policy
Tests: 39 automated tests covering routing, adaptive, drag, profiler
Floating bar: Adaptive 🧠 toggle, 5 fixed-mode buttons, debug row, Nodes 2.0 switch
- Bulk-change detection: skip drag logic when >60% nodes move in one
frame (workflow switch, undo) — fixes links disappearing after
switching workflow tabs when drag mode is adaptive.
- Mode 4 dragged links now participate in staggered unfreeze after
release (were previously excluded, causing instant reappearance).
- Staggered reveal now uses routeBatchPercent setting (default 10%,
configurable 2-100%) instead of hardcoded 25%/4-batches.
- Drag-dim separation: new dragDimAlpha setting (default 0.15) for
unrelated-link opacity while dragging, separate from select-dim
dimAlpha (0.06). Drag no longer makes canvas unreadable.
- collectLinks now separates ioUnresolved (subgraph IO nodes) from silently skipped stale links
- routeAll only falls back for IO link issues; broken regular links are skipped with continue
- This fixes multi-link workflows where a single stale/deleted link would disable the entire plugin