feat: finalize corrected-route planning and Rerun recording review

This commit is contained in:
DCCONSTRUCTIONS
2026-09-22 10:10:03 +03:00
parent c804d89b18
commit 2e5d52521f
132 changed files with 14141 additions and 898 deletions
+23 -9
View File
@@ -12,7 +12,6 @@ from fastapi import FastAPI, HTTPException, Request, WebSocket, WebSocketDisconn
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import ValidationError
from starlette.middleware.gzip import GZipMiddleware
from k1link import __version__
from k1link.artifact_gateway import configured_artifact_gateway
@@ -146,6 +145,7 @@ from k1link.web.e46j_raw_fisheye_realtime_api import (
from k1link.web.e47_semantic_slam_api import build_e47_semantic_slam_router
from k1link.web.environment_api import build_environment_router
from k1link.web.frontend_assets import ControlStationStaticFiles, frontend_build_id
from k1link.web.response_compression import ResponseCompressionMiddleware
from k1link.web.l3_pointpillars_visual_api import (
build_l3_pointpillars_visual_router,
)
@@ -470,14 +470,25 @@ session_recording_materializer = SessionRecordingMaterializer(
exporters=plugin_environment.recording_exporters,
artifact_gateway=session_artifact_gateway,
)
session_overview_service = SessionOverviewService(session_store, plugin_environment.overview_exporters)
mission_drafts = MissionDrafts(session_store.data_dir / 'missions', PlanningSources(
from k1link.reconstruction.session_versions import SessionMapVersions
from k1link.sessions.map_recording import MapReplaySessionStore
from k1link.missions.default_sources import DefaultPlanningSources
session_map_versions = SessionMapVersions(session_store.data_dir)
operator_session_store = MapReplaySessionStore(session_store, session_map_versions)
session_overview_service = SessionOverviewService(session_store, plugin_environment.overview_exporters,
map_versions=session_map_versions)
original_planning_sources = PlanningSources(
session_store, plugin_environment.planning_exporters, plugin_environment.submap_extractors,
plugin_environment.scene_submap_extractors))
plugin_environment.scene_submap_extractors)
mission_drafts = MissionDrafts(session_store.data_dir / 'missions',
DefaultPlanningSources(original_planning_sources, session_map_versions))
mission_registration_runs = RegistrationRuns(mission_drafts)
from k1link.missions.live_tests import PlanningLiveTests
from k1link.web.planning_live_api import build_planning_live_router
planning_live_tests = PlanningLiveTests(mission_drafts, plugin_environment.live_planning_sources, mission_registration_runs.lock)
planning_live_tests = PlanningLiveTests(mission_drafts, plugin_environment.live_planning_sources,
mission_registration_runs.lock,
capture_recorder=session_store.record_planning_capture)
session_recorded_media_inspector = RecordedMediaInspector(
session_store.data_dir / "recorded-media-preparations"
)
@@ -744,7 +755,7 @@ def _m48_recorded_camera_playback_source(
if session_recorded_camera_frame_service is None:
raise RuntimeError("recorded camera playback is unavailable")
command = session_store.prepare_replay(session_id, speed=1.0, loop=False)
command = operator_session_store.prepare_replay(session_id, speed=1.0, loop=False)
snapshot = session_recording_preparation_manager.restore_published(command)
if snapshot is None or snapshot.state != "ready" or snapshot.recorded_media is None:
raise RuntimeError("recorded camera playback package is not published")
@@ -757,6 +768,8 @@ def _canonical_lab_recording_source(session_id: str) -> tuple[Path, str] | None:
snapshot = session_recording_preparation_manager.status(session_id)
if snapshot is None or snapshot.state != "ready" or snapshot.recording is None:
return None
if snapshot.command.map_version is not None:
return None # Original-frame LAB overlays cannot consume corrected operator geometry.
return snapshot.recording.path, snapshot.recording.sha256
@@ -798,7 +811,7 @@ def enqueue_replayable_recordings(session_ids: Iterable[str]) -> tuple[str, ...]
enqueued: list[str] = []
for session_id in dict.fromkeys(session_ids):
try:
command = session_store.prepare_replay(session_id)
command = operator_session_store.prepare_replay(session_id)
session_recording_preparation_manager.enqueue(
command,
retry_interrupted=True,
@@ -986,7 +999,7 @@ app = FastAPI(
openapi_url="/api/openapi.json",
lifespan=app_lifespan,
)
app.add_middleware(GZipMiddleware, minimum_size=1_024, compresslevel=5)
app.add_middleware(ResponseCompressionMiddleware, minimum_size=1_024, compresslevel=5)
app.include_router(fleet_router)
@@ -1153,7 +1166,7 @@ app.include_router(build_mission_registration_router(mission_registration_runs,
app.include_router(
build_session_router(
session_store,
operator_session_store,
# Production discovery belongs to the startup/background reconciler.
# HTTP list/replay paths must never rescan evidence roots inline.
catalog_refresher=None,
@@ -1163,6 +1176,7 @@ app.include_router(
perception_overlay_provider=session_perception_overlay_store,
perception_media_provider=session_perception_epoch_store,
point_color_renderers=plugin_environment.point_color_renderers,
point_display_renderers=plugin_environment.point_display_renderers,
lab_calculation_profile_resolver=(
None
if (