c78661efb5
Adds the Region Export API (GET /api/export/:serverId/:dimension/ :x1/:z1/:x2/:z2, chunk-coordinate range, capped at 64 chunks server- side) streaming raw chunkSections rows for a footprint, plus a fully client-side pipeline that turns that into a downloadable glTF (.glb): a JS port of the Rust worker's greedy mesher (voxel-mesh.js, mirrored test-for-test against worker/src/mesh.rs) and block-color palette (block-colors.js, mirrored against worker/src/palette.rs), a base64 section decoder, mesh merging with per-section world offsets, and a hand-rolled minimal GLB writer (gltf-export.js) — hand-rolled rather than Babylon's GLTF2Export since this project's Babylon usage never meshes client-side (only renders pre-built buffers) and a live Scene/Engine isn't needed or unit-testable. The whole mesh+export pipeline runs inside a Web Worker (export-worker.js) so a multi-chunk export doesn't block the UI thread. The map UI gets a drag-to-select region tool (chunk-snapped, live rectangle preview, cap enforced client-side too) and an Export glTF button. Built test-first per the project's TDD workflow; the exported .glb was independently validated with @gltf-transform/cli against real seeded terrain data (correct triangle count, vertex count, and bounding box for the selected area). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015tKdPZt78zbPUZMXWzKEKt