"""Memory capsule: zero-backend shareable export (spec M17, lane G). STUB — lane G fills. Contract: :func:`build_capsule` writes a self-contained bundle to ``out_dir`` (default ``config.CAPSULE_DIR``): - copy ``frontend/dist`` (error clearly if missing — tell the user to ``npm run build``); - copy media from ``config.RAW_DIR``; - bake every read-only API response to files at the *same relative paths* (``api/manifest``, ``api/events``, ``api/anchors``, ``api/beats``, ``api/videos/{id}/poses``, ``api/pointcloud``, ``api/splat``, ``api/audio/{id}`` — extracting audio via ``ingest.extract_audio_hq`` if not yet cached); - inject ```` into the copied ``index.html``; - set ``"capsule": true`` in the baked manifest (the frontend hides all write UI); - ship a stdlib ``serve.py`` in the bundle root that serves with HTTP Range support (video seeking needs 206s; plain ``http.server`` can't — pitfall #4). Skip what doesn't exist (no splat -> no ``api/splat``) — degrade, don't block. Returns a summary dict (bundle path, file count, bytes) for the CLI log. """ from __future__ import annotations from pathlib import Path def build_capsule(out_dir: str | Path | None = None) -> dict: """Build the static shareable bundle (see module doc).""" raise NotImplementedError("memory capsule (lane G / M17)")