feat: finalize corrected-route planning and Rerun recording review
This commit is contained in:
+23
-9
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user