feat(mapillary): street-level layer core — coverage, sequences, viewer bridge, query engine

Camera-driven Mapillary coverage (z0–5 overview points from orbit, z11–14
ground-clamped sequence lines below 60 km), per-sequence image cones, an
embedded MapillaryJS viewer bridge with a camera-follow mode, sprite icons
for map features, and a query engine that turns a plan into a streamed
z14 tile fan-out. Registers an on-globe CC BY-SA 4.0 credit while enabled.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
Said TurkseverandClaude Fable 5.1 committed 2026-09-23 15:44:32 +01:00
1 parent 0d41b6be54
commit fa5710bcf2
46 files changed
+9935 -32

No files matched your search

+26 -2
View File
@@ -13,8 +13,8 @@
# externally and never touched. This file remains the reference for headless
# and self-hosted setups.
#
# NOTE ON CLIENT-EXPOSED KEYS: GOOGLE_MAPS_API_KEY and CESIUM_ION_TOKEN are
# injected into the browser bundle by design (they're used client-side) and
# NOTE ON CLIENT-EXPOSED KEYS: GOOGLE_MAPS_API_KEY, CESIUM_ION_TOKEN and
# MAPILLARY_CLIENT_TOKEN are injected into the browser bundle by design (they're used client-side) and
# WILL be visible in devtools. Restrict/scope them rather than trying to hide
# them (see SECURITY.md). All other keys below stay server-side.
@@ -52,6 +52,10 @@ GOOGLE_MAPS_SERVER_API_KEY=
# CLIENT-EXPOSED — use a public assets:read token with URL restrictions.
CESIUM_ION_TOKEN=
# Optional: switch the voice agent OFF entirely (no GEV MIC control, no
# Realtime session). Typed controls such as Mapillary AI keep working.
# Default is on. Restart the dev server after changing it.
# GEV_VOICE_UI=off
# Optional: OpenAI Realtime voice control. Do not prefix with VITE_.
OPENAI_API_KEY=
OPENAI_REALTIME_MODEL=gpt-realtime-2
@@ -75,6 +79,26 @@ OPENAI_HUD_SUMMARY_MODEL=gpt-5-nano
# provider-side budget: OpenAI platform -> Settings -> Limits (usage limits).
# GEV_RATELIMIT_OPENAI_PER_MIN=30
# Optional: Mapillary street-level imagery — coverage lines, detected objects
# and traffic signs, the embedded MapillaryJS viewer and the Mapillary AI query.
# Free client token: https://www.mapillary.com/dashboard/developers (register an
# application, copy the "Client Token"). CLIENT-EXPOSED by design: MapillaryJS
# fetches imagery straight from Mapillary in the browser, so this token is in
# the bundle like GOOGLE_MAPS_API_KEY. Mapillary client tokens are meant to be
# public; the dev server also uses it to fetch and cache vector tiles.
MAPILLARY_CLIENT_TOKEN=
# Optional: Anthropic key for Mapillary AI ("show me all fire hydrants in
# Sacramento" -> a query plan drawn on the globe). SERVER-SIDE ONLY: the
# browser posts the sentence to /api/mapillary/plan and never sees the key.
# The SDK also honours an `ant auth login` profile when this is unset.
ANTHROPIC_API_KEY=
# Planner model. Defaults to claude-opus-5 at low effort; model ids drift, so
# override here rather than editing server/providers/mapillary/constants.js.
# ANTHROPIC_PLANNER_MODEL=claude-opus-5
# Optional: opt-in per-IP rate limit for the planner endpoint (requests/min).
# DEFAULT IS UNLIMITED. Recommended whenever HOST is not localhost.
# GEV_RATELIMIT_ANTHROPIC_PER_MIN=20
# Optional: OpenSky auth mode (oauth | basic | auto | anon)
# Default: oauth — requires client credentials below
# Set to "anon" to skip aircraft auth (rate-limited but works)