gps-plus-slam-app-framework 1.8.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/{app-selectors-JqydaUMN.d.ts → app-selectors-BbAiCRUT.d.ts} +1 -1
  2. package/dist/ar/enable-gps-ar.d.ts +1 -1
  3. package/dist/ar/index.d.ts +2 -2
  4. package/dist/ar/webxr-session.d.ts +1 -1
  5. package/dist/{ar-world-group-alignment-BlvGcIAk.d.ts → ar-world-group-alignment-Cfg0trC3.d.ts} +1 -1
  6. package/dist/core/index.d.ts +2 -2
  7. package/dist/core/index.js +2 -2
  8. package/dist/{create-slam-app-store-D3nzh9Wb.d.ts → create-slam-app-store-D1QSMuKu.d.ts} +5 -6
  9. package/dist/{enable-gps-ar-DvGzBOrp.d.ts → enable-gps-ar-BBtRO2FJ.d.ts} +2 -2
  10. package/dist/{frame-conversions-C4bnNOEY.d.ts → frame-conversions-DDcNHkTb.d.ts} +1 -1
  11. package/dist/{gps-anchor-BjECcYnD.d.ts → gps-anchor-CEjGqEVD.d.ts} +1 -1
  12. package/dist/{gps-event-coordinator-CHtIkhb7.d.ts → gps-event-coordinator-BWpgBrHq.d.ts} +1 -1
  13. package/dist/{index-DlsOo2IB.d.ts → index-B6iBnO_K.d.ts} +1 -1
  14. package/dist/index-DXPVzOpP.d.ts +2 -0
  15. package/dist/index.d.ts +19 -19
  16. package/dist/index.js +1 -1
  17. package/dist/{leaflet-map-overlay-BOZFW5kT.d.ts → leaflet-map-overlay-C8GS4cUy.d.ts} +1 -1
  18. package/dist/{map-data-D7rpMC6f.js → map-data-1tF5gcYV.js} +5 -1
  19. package/dist/{map-data-PNfGKGWx.d.ts → map-data-CUnTzRIC.d.ts} +12 -3
  20. package/dist/{map-overlay-draw-DiroaJed.d.ts → map-overlay-draw-6WJeq0Kg.d.ts} +1 -1
  21. package/dist/{occlusion-mesh-b28lRJ6S.d.ts → occlusion-mesh-kXCQ2FM1.d.ts} +1 -1
  22. package/dist/{recording-options-vASCFzc5.d.ts → recording-options-DYKWVI93.d.ts} +27 -1
  23. package/dist/{recording-replayer-D0V9WkmY.d.ts → recording-replayer-BJ8Lf0QY.d.ts} +2 -2
  24. package/dist/{recording-slice-DTUtSVgd.d.ts → recording-slice-BW8SiLo1.d.ts} +1 -1
  25. package/dist/{replay-engine-xdrUgWJi.d.ts → replay-engine-DmCAc7WM.d.ts} +1 -1
  26. package/dist/state/app-selectors.d.ts +1 -1
  27. package/dist/state/combined-root-state.d.ts +1 -1
  28. package/dist/state/create-slam-app-store.d.ts +1 -1
  29. package/dist/state/gps-ar-pose-sampler.d.ts +1 -1
  30. package/dist/state/gps-event-coordinator.d.ts +1 -1
  31. package/dist/state/index.d.ts +10 -10
  32. package/dist/state/recording-options.d.ts +2 -2
  33. package/dist/state/recording-options.js +16 -4
  34. package/dist/state/recording-replayer.d.ts +2 -2
  35. package/dist/state/recording-slice.d.ts +1 -1
  36. package/dist/state/replay-engine.d.ts +1 -1
  37. package/dist/state/store-subscribers.d.ts +2 -2
  38. package/dist/state/store-subscribers.js +25 -12
  39. package/dist/state/subscribe-to-selector.d.ts +1 -1
  40. package/dist/state/tracking-quality.d.ts +1 -1
  41. package/dist/state/tracking-quality.js +4 -5
  42. package/dist/storage/index.d.ts +1 -1
  43. package/dist/storage/opfs-storage.js +10 -5
  44. package/dist/storage/zip-reader.d.ts +2 -2
  45. package/dist/storage/zip-reader.js +20 -7
  46. package/dist/{store-subscribers-DScA7tdT.d.ts → store-subscribers-DJUErW-o.d.ts} +6 -3
  47. package/dist/{subscribe-to-selector-B9ylM5Oh.d.ts → subscribe-to-selector-dQV8SpsO.d.ts} +1 -1
  48. package/dist/test-utils/browser-mocks.js +2 -0
  49. package/dist/test-utils/zip-round-trip-helpers.d.ts +1 -1
  50. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  51. package/dist/visualization/frame-conversions.d.ts +1 -1
  52. package/dist/visualization/gps-anchor.d.ts +1 -1
  53. package/dist/visualization/index.d.ts +7 -7
  54. package/dist/visualization/index.js +1 -1
  55. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  56. package/dist/visualization/map-data.d.ts +1 -1
  57. package/dist/visualization/map-data.js +1 -1
  58. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  59. package/dist/visualization/occlusion-mesh.d.ts +1 -1
  60. package/dist/{webxr-session-cRG2SYAQ.d.ts → webxr-session-BWCpGd-2.d.ts} +1 -1
  61. package/dist/{zip-reader-CvruaGvD.d.ts → zip-reader-BzENzMH6.d.ts} +36 -10
  62. package/package.json +7 -3
  63. package/dist/index-D4vrgV4b.d.ts +0 -2
@@ -1,4 +1,4 @@
1
- import { N as CombinedRootState, r as SlamAppRootState } from "./create-slam-app-store-D3nzh9Wb.js";
1
+ import { N as CombinedRootState, r as SlamAppRootState } from "./create-slam-app-store-D1QSMuKu.js";
2
2
  import * as _$gps_plus_slam_js0 from "gps-plus-slam-js";
3
3
  import { ArImageCapture, GpsPoint, LatLong, Matrix4, Quaternion, Vector3 } from "gps-plus-slam-js";
4
4
  import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
@@ -1,2 +1,2 @@
1
- import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-DvGzBOrp.js";
1
+ import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-BBtRO2FJ.js";
2
2
  export { EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, createEnableGpsArController };
@@ -11,8 +11,8 @@ import { a as ImageCaptureCallbacks, c as MIN_VALID_IMAGE_BYTES, i as FrameQuali
11
11
  import { _ as solveQrPose, a as QrPoseSolution, c as SolveQrPoseInput, d as intrinsicsFromProjection, f as invertPose, g as signedQuadArea, h as reprojectionErrorPx, i as Pose, l as buildObjectPoints, m as qrInCameraFromOpenCv, n as OpenCvPnpResult, o as QuadValidation, p as projectViewPoint, r as Point2, s as SolvePnpSquare, t as CameraIntrinsics, u as composePose, v as transformPoint, y as validateQuad } from "../qr-pose-y3vaEd6x.js";
12
12
  import { a as QrFrontEnd, c as createBarcodeDetectorFrontEnd, i as QrDetection, n as BarcodeDetectorLike, o as RgbaImage, r as DetectedBarcodeLike, s as ToImageBitmapSource, t as BarcodeDetectorFrontEnd } from "../qr-frontend-BPURlh3S.js";
13
13
  import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-q0eIDSRg.js";
14
- import { $ as stopImageCapture, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, b as getCurrentArPose, f as endARSession, g as getArWorldGroup, i as CameraFrameCaptureConfig, o as SessionEndInfo, s as SessionFeatureOptions, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "../webxr-session-cRG2SYAQ.js";
15
- import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-DvGzBOrp.js";
14
+ import { $ as stopImageCapture, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, b as getCurrentArPose, f as endARSession, g as getArWorldGroup, i as CameraFrameCaptureConfig, o as SessionEndInfo, s as SessionFeatureOptions, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "../webxr-session-BWCpGd-2.js";
15
+ import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-BBtRO2FJ.js";
16
16
  import { r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-7GBMBu68.js";
17
17
  import { c as QrSizeAccumulatorOptions, d as QrSizeStatus, f as createQrSizeAccumulator, i as QrSizeMeasurer, l as QrSizeEstimate, n as QrSizeDepthContext, o as createQrSizeMeasurer, p as estimateQrSizeFromDepth, r as QrSizeMeasurement, s as QrSizeAccumulator, t as ImageSize, u as QrSizeObservation } from "../qr-size-measurer-DxiMqRUw.js";
18
18
  import { t as createQrSizeDepthContext } from "../qr-size-depth-context-apAOmbrZ.js";
@@ -1,4 +1,4 @@
1
1
  import { i as DepthSample, t as ARPose } from "../ar-types-Cc5yvBwn.js";
2
2
  import { n as CapturedImage } from "../image-capture-Bp6Pd4Md.js";
3
- import { $ as stopImageCapture, A as nuePositionToWebXR, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, E as getXrCameraFromPose, F as setCamera, G as setTrackingRecoveredCallback, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, M as resetWebXRState, N as setArPose, O as isWebXRSupported, P as setArWorldGroup, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, V as setScene, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, a as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, b as getCurrentArPose, c as TrackingSubscribableStore, d as createSceneHierarchy, f as endARSession, g as getArWorldGroup, h as getArPose, i as CameraFrameCaptureConfig, j as nueQuaternionToWebXR, k as isXRCameraLike, l as applyAlignmentMatrix, m as extractResetTransformData, n as AR_CAMERA_FOV, o as SessionEndInfo, p as extractPoseFromViewer, q as shouldLogCameraAccessDiagnostic, r as AR_CAMERA_NEAR, s as SessionFeatureOptions, t as AR_CAMERA_FAR, u as buildSessionOptions, v as getCameraFrameCaptureSize, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "../webxr-session-cRG2SYAQ.js";
3
+ import { $ as stopImageCapture, A as nuePositionToWebXR, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, E as getXrCameraFromPose, F as setCamera, G as setTrackingRecoveredCallback, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, M as resetWebXRState, N as setArPose, O as isWebXRSupported, P as setArWorldGroup, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, V as setScene, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, a as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, b as getCurrentArPose, c as TrackingSubscribableStore, d as createSceneHierarchy, f as endARSession, g as getArWorldGroup, h as getArPose, i as CameraFrameCaptureConfig, j as nueQuaternionToWebXR, k as isXRCameraLike, l as applyAlignmentMatrix, m as extractResetTransformData, n as AR_CAMERA_FOV, o as SessionEndInfo, p as extractPoseFromViewer, q as shouldLogCameraAccessDiagnostic, r as AR_CAMERA_NEAR, s as SessionFeatureOptions, t as AR_CAMERA_FAR, u as buildSessionOptions, v as getCameraFrameCaptureSize, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "../webxr-session-BWCpGd-2.js";
4
4
  export { ARPose, AR_CAMERA_FAR, AR_CAMERA_FOV, AR_CAMERA_NEAR, CameraFrameCaptureConfig, CapturedImage, DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, DepthSample, SessionEndInfo, SessionFeatureOptions, TrackingSubscribableStore, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArPose, getArWorldGroup, getCamera, getCameraFrameCaptureSize, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, resetWebXRState, setArPose, setArWorldGroup, setCamera, setCameraFrameCallback, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setImageQualityAnalyzer, setScene, setSessionEndCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingRecoveredCallback, setTrackingStore, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
@@ -1,4 +1,4 @@
1
- import { t as SubscribableStore } from "./subscribe-to-selector-B9ylM5Oh.js";
1
+ import { t as SubscribableStore } from "./subscribe-to-selector-dQV8SpsO.js";
2
2
  import * as THREE from "three";
3
3
 
4
4
  //#region ../src/visualization/ar-world-group-alignment.d.ts
@@ -1,2 +1,2 @@
1
- import { _ as odometryTrackingRestarted, a as LibraryRootState, c as RootState, d as bearingDeltaDeg, f as calcGpsCoords, g as magneticHeadingFromEnuQuat, h as isIdentityMatrix4, i as LatLongAlt, l as Vector3, m as createGpsSlamStore, n as GpsPoint, o as Matrix4, p as calcRelativeCoordsInMeters, r as LatLong, s as Quaternion, t as ArImageCapture, u as arNorthBearingDeg, v as validateLicenseKey, y as webxrToNUE } from "../index-D4vrgV4b.js";
2
- export { ArImageCapture, GpsPoint, LatLong, LatLongAlt, LibraryRootState, Matrix4, Quaternion, RootState, Vector3, arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE };
1
+ import { S as webxrToNUE, _ as createLoopClosureHandler, a as LibraryRootState, b as odometryTrackingRestarted, c as Matrix4, d as Vector3, f as arNorthBearingDeg, g as createGpsSlamStore, h as calcRelativeCoordsInMeters, i as LatLongAlt, l as Quaternion, m as calcGpsCoords, n as GpsPoint, o as LoopClosureHandler, p as bearingDeltaDeg, r as LatLong, s as LoopClosureHandlerConfig, t as ArImageCapture, u as RootState, v as isIdentityMatrix4, x as validateLicenseKey, y as magneticHeadingFromEnuQuat } from "../index-DXPVzOpP.js";
2
+ export { ArImageCapture, GpsPoint, LatLong, LatLongAlt, LibraryRootState, LoopClosureHandler, LoopClosureHandlerConfig, Matrix4, Quaternion, RootState, Vector3, arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, createLoopClosureHandler, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE };
@@ -1,2 +1,2 @@
1
- import { arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE } from "gps-plus-slam-js";
2
- export { arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE };
1
+ import { arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, createLoopClosureHandler, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE } from "gps-plus-slam-js";
2
+ export { arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, createLoopClosureHandler, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE };
@@ -1,5 +1,5 @@
1
1
  import { a as TrackingSliceState } from "./tracking-slice-DMkHlbny.js";
2
- import { t as RecordingState } from "./recording-slice-DTUtSVgd.js";
2
+ import { t as RecordingState } from "./recording-slice-BW8SiLo1.js";
3
3
  import { n as SessionMetadata } from "./opfs-storage-CTkxvxN4.js";
4
4
  import { n as StorageBackend } from "./storage-backend-sEtmM4yW.js";
5
5
  import { GpsPoint, LatLong, Matrix4, RootState, Vector3 } from "gps-plus-slam-js";
@@ -138,11 +138,10 @@ declare function computeConvergence(snapshots: readonly AlignmentSnapshot[], opt
138
138
  * compute the Euclidean distance.
139
139
  *
140
140
  * This is the **single shared kernel** for the AppFramework reporter and
141
- * the Investigation harness (see §11 (a) of the tracking-quality plan).
142
- * `GpsPlusSlamJs_Investigation/src/investigation-helpers.ts` re-exports
143
- * `computeStabilityDelta` as a thin wrapper around this function so the
144
- * §6.1 corpus sweep and the runtime convergence score share one numeric
145
- * definition.
141
+ * the downstream corpus-analysis harness (see §11 (a) of the
142
+ * tracking-quality plan), which re-exports it as `computeStabilityDelta` —
143
+ * a thin wrapper around this function so the §6.1 corpus sweep and the
144
+ * runtime convergence score share one numeric definition.
146
145
  */
147
146
  declare function matrixDelta(prev: readonly number[], curr: readonly number[]): {
148
147
  rotationDeltaDeg: number;
@@ -1,7 +1,7 @@
1
- import { t as ArCrashIsolationOptions } from "./recording-options-vASCFzc5.js";
1
+ import { t as ArCrashIsolationOptions } from "./recording-options-DYKWVI93.js";
2
2
  import { n as RawDeviceOrientation, t as GpsPosition } from "./gps-CDKDQokE.js";
3
3
  import { n as PermissionStatus } from "./permission-checker-B-VtjnBA.js";
4
- import { s as SessionFeatureOptions } from "./webxr-session-cRG2SYAQ.js";
4
+ import { s as SessionFeatureOptions } from "./webxr-session-BWCpGd-2.js";
5
5
 
6
6
  //#region ../src/ar/enable-gps-ar.d.ts
7
7
  /**
@@ -1,4 +1,4 @@
1
- import { i as LatLongAlt, r as LatLong } from "./index-D4vrgV4b.js";
1
+ import { i as LatLongAlt, r as LatLong } from "./index-DXPVzOpP.js";
2
2
  import * as THREE from "three";
3
3
 
4
4
  //#region ../src/visualization/frame-conversions.d.ts
@@ -1,4 +1,4 @@
1
- import { i as LatLongAlt, r as LatLong } from "./index-D4vrgV4b.js";
1
+ import { i as LatLongAlt, r as LatLong } from "./index-DXPVzOpP.js";
2
2
  import * as THREE from "three";
3
3
 
4
4
  //#region ../src/visualization/gps-anchor.d.ts
@@ -1,7 +1,7 @@
1
1
  import { t as ARPose } from "./ar-types-Cc5yvBwn.js";
2
2
  import { n as RawDeviceOrientation, t as GpsPosition } from "./gps-CDKDQokE.js";
3
3
  import { t as AbsoluteOrientationReading } from "./absolute-orientation-BAxc15J6.js";
4
- import { i as SlamAppStore } from "./create-slam-app-store-D3nzh9Wb.js";
4
+ import { i as SlamAppStore } from "./create-slam-app-store-D1QSMuKu.js";
5
5
  import { Quaternion, RawAbsoluteOrientation, RawGpsPoint, RecordGpsEventPayload, Vector3, eulerToQuaternion } from "gps-plus-slam-js";
6
6
  import { ReducersMapObject } from "@reduxjs/toolkit";
7
7
 
@@ -1,4 +1,4 @@
1
- import { N as CombinedRootState, m as TrackingQualityReport } from "./create-slam-app-store-D3nzh9Wb.js";
1
+ import { N as CombinedRootState, m as TrackingQualityReport } from "./create-slam-app-store-D1QSMuKu.js";
2
2
  import { Add2dImagePayload, GpsPoint as GpsPoint$1, LatLong as LatLong$1, RawDeviceOrientation, RawGpsPoint as RawGpsPoint$1, RecordGpsEventPayload as RecordGpsEventPayload$1, add2dImage, calcRelativeCoordsInMeters, recordGpsEvent as recordGpsEvent$1, setZeroPos as setZeroPos$1 } from "gps-plus-slam-js";
3
3
 
4
4
  //#region ../src/state/onboarding-guidance.d.ts
@@ -0,0 +1,2 @@
1
+ import { ArImageCapture as ArImageCapture$1, GpsPoint as GpsPoint$1, LatLong as LatLong$1, LatLongAlt, LoopClosureHandler, LoopClosureHandlerConfig, Matrix4 as Matrix4$1, Quaternion as Quaternion$1, RootState as LibraryRootState, RootState as RootState$1, Vector3 as Vector3$1, arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords as calcGpsCoords$1, calcRelativeCoordsInMeters, createGpsSlamStore, createLoopClosureHandler, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey as validateLicenseKey$1, webxrToNUE } from "gps-plus-slam-js";
2
+ export { webxrToNUE as S, createLoopClosureHandler as _, LibraryRootState as a, odometryTrackingRestarted as b, Matrix4$1 as c, Vector3$1 as d, arNorthBearingDeg as f, createGpsSlamStore as g, calcRelativeCoordsInMeters as h, LatLongAlt as i, Quaternion$1 as l, calcGpsCoords$1 as m, GpsPoint$1 as n, LoopClosureHandler as o, bearingDeltaDeg as p, LatLong$1 as r, LoopClosureHandlerConfig as s, ArImageCapture$1 as t, RootState$1 as u, isIdentityMatrix4 as v, validateLicenseKey$1 as x, magneticHeadingFromEnuQuat as y };
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ import { n as createDepthGridLookup, t as DepthGridLookup } from "./depth-grid-l
8
8
  import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "./depth-sampler-CwObAwEA.js";
9
9
  import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "./depth-unprojection-DRdBU90S.js";
10
10
  import { a as QualityFilterConfig, c as meanLuminance, i as ImageQualityGate, l as rgbaToGrayscale, n as DEFAULT_SHARPNESS_HISTORY_SIZE, o as QualityRejectReason, r as DEFAULT_SHARPNESS_MIN_SAMPLES, s as QualityVerdict, t as DEFAULT_QUALITY_FILTER, u as sharpnessScore } from "./image-quality-BMx2ko9-.js";
11
- import { A as validateImageOptions, C as loadRecordingOptions, F as validateRecordingOptions, O as validateDepthOptions, S as cloneRecordingOptions, T as saveRecordingOptions, a as DepthCaptureOptions, b as STORAGE_KEY, c as IMAGE_CONSTRAINTS, i as DEPTH_CONSTRAINTS, l as ImageCaptureOptions, r as DEFAULT_RECORDING_OPTIONS, w as resetRecordingOptions, y as RecordingOptionsInput } from "./recording-options-vASCFzc5.js";
11
+ import { C as cloneRecordingOptions, E as saveRecordingOptions, L as validateRecordingOptions, T as resetRecordingOptions, a as DepthCaptureOptions, b as RecordingOptionsInput, c as IMAGE_CONSTRAINTS, i as DEPTH_CONSTRAINTS, j as validateImageOptions, k as validateDepthOptions, l as ImageCaptureOptions, r as DEFAULT_RECORDING_OPTIONS, w as loadRecordingOptions, x as STORAGE_KEY } from "./recording-options-DYKWVI93.js";
12
12
  import { a as startOrientationWatch, i as startGpsWatch, n as RawDeviceOrientation, o as stopGpsWatch, r as requestOrientationPermission, s as stopOrientationWatch, t as GpsPosition } from "./gps-CDKDQokE.js";
13
13
  import { a as checkCameraPermission, c as checkOrientationPermission, d as requestCameraPermission, f as requestGeolocationPermission, g as setFileSystemState, h as resetFileSystemState, i as checkAllPermissions, l as checkWebXRSupport, m as requestWebXRWithDepthPermission, n as PermissionStatus, o as checkFileSystemPermission, p as requestOrientationPermission$1, s as checkGeolocationPermission, t as PermissionCheckResult, u as requestAllPermissions } from "./permission-checker-B-VtjnBA.js";
14
14
  import { a as ImageCaptureCallbacks, c as MIN_VALID_IMAGE_BYTES, i as FrameQualityVerdict, n as CapturedImage, o as ImageCaptureConfig, r as DEFAULT_CAPTURE_CONFIG, s as ImageCaptureManager, t as CapturedFrame } from "./image-capture-Bp6Pd4Md.js";
@@ -17,8 +17,8 @@ import { _ as solveQrPose, a as QrPoseSolution, c as SolveQrPoseInput, d as intr
17
17
  import { a as QrFrontEnd, c as createBarcodeDetectorFrontEnd, i as QrDetection, n as BarcodeDetectorLike, o as RgbaImage, r as DetectedBarcodeLike, s as ToImageBitmapSource, t as BarcodeDetectorFrontEnd } from "./qr-frontend-BPURlh3S.js";
18
18
  import { n as createCss3dRendererManager, t as Css3dRendererManager } from "./css3d-renderer-manager-CPpVtvgs.js";
19
19
  import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "./xr-camera-texture-q0eIDSRg.js";
20
- import { $ as stopImageCapture, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, b as getCurrentArPose, f as endARSession, g as getArWorldGroup, i as CameraFrameCaptureConfig, o as SessionEndInfo, s as SessionFeatureOptions, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "./webxr-session-cRG2SYAQ.js";
21
- import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "./enable-gps-ar-DvGzBOrp.js";
20
+ import { $ as stopImageCapture, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, b as getCurrentArPose, f as endARSession, g as getArWorldGroup, i as CameraFrameCaptureConfig, o as SessionEndInfo, s as SessionFeatureOptions, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "./webxr-session-BWCpGd-2.js";
21
+ import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "./enable-gps-ar-BBtRO2FJ.js";
22
22
  import { r as registerFrameUpdate, t as FrameUpdate } from "./frame-loop-7GBMBu68.js";
23
23
  import { c as QrSizeAccumulatorOptions, d as QrSizeStatus, f as createQrSizeAccumulator, i as QrSizeMeasurer, l as QrSizeEstimate, n as QrSizeDepthContext, o as createQrSizeMeasurer, p as estimateQrSizeFromDepth, r as QrSizeMeasurement, s as QrSizeAccumulator, t as ImageSize, u as QrSizeObservation } from "./qr-size-measurer-DxiMqRUw.js";
24
24
  import { t as createQrSizeDepthContext } from "./qr-size-depth-context-apAOmbrZ.js";
@@ -48,34 +48,34 @@ import { n as mapWithConcurrencyLimit } from "./concurrency-DPeGBH0X.js";
48
48
  import { t as geodesicAngleRad } from "./index-D74JTX4I.js";
49
49
  import { t as formatFileSize } from "./format-file-size-DxN-EBLc.js";
50
50
  import { t as listFormatter } from "./list-formatter-DLFDnS70.js";
51
- import { a as recordWriteFailure, i as recordDepthSample, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "./recording-slice-DTUtSVgd.js";
51
+ import { a as recordWriteFailure, i as recordDepthSample, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "./recording-slice-BW8SiLo1.js";
52
52
  import { a as getAppRootHandle, c as initOpfsStorage, d as resetSessionHandles, i as createSession, l as listSessions, o as getSessionHandle, r as checkStorageQuota, s as getSessionsRootHandle, u as resetOpfsStorage } from "./opfs-storage-CTkxvxN4.js";
53
53
  import { n as StorageBackend, t as CreateSessionResult } from "./storage-backend-sEtmM4yW.js";
54
- import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, a as SlamAppStoreOptions, b as computeGpsVsFusedDivergence, g as TrackingQualityState, h as TrackingQualitySliceState, i as SlamAppStore, j as snapshotsTrimmed, k as selectTrackingQuality, m as TrackingQualityReport, n as SlamAppMiddleware, o as createSlamAppStore, p as TrackingQualityOptions, r as SlamAppRootState, s as AlignmentSnapshot, t as SlamAppCombinedState, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, x as computeResidualConsensus, y as computeGpsAccuracy } from "./create-slam-app-store-D3nzh9Wb.js";
55
- import { a as eulerToQuaternion, c as getLastDeviceOrientation, d as updateDeviceOrientation, i as createGpsPositionHandler, l as resetCoordinatorState, n as buildRawGpsPoint, o as extractOdomPosition, r as buildRecordGpsEventPayload, s as extractOdomRotation, t as RecordingCoordinatorConfig } from "./gps-event-coordinator-CHtIkhb7.js";
56
- import { a as ZipActionEntry, d as loadSessionMetadataFromBlob, f as readZipEntries, i as RecordedAction, l as loadGpsPathFromBlob, n as GpsPathCoord, r as MAX_ACTION_FILE_SIZE, s as loadActionsFromZip } from "./zip-reader-CvruaGvD.js";
57
- import { n as replayRecording } from "./recording-replayer-D0V9WkmY.js";
58
- import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "./replay-engine-xdrUgWJi.js";
59
- import { n as MapDataInput, r as buildMapData, t as MapData } from "./map-data-PNfGKGWx.js";
60
- import { t as SubscribableStore } from "./subscribe-to-selector-B9ylM5Oh.js";
61
- import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "./store-subscribers-DScA7tdT.js";
62
- import { c as calcRelativeCoordsInMeters, d as OnboardingGuidance, f as OnboardingPhase, l as recordGpsEvent, m as selectOnboardingGuidance, p as computeOnboardingGuidance, s as add2dImage, u as setZeroPos } from "./index-DlsOo2IB.js";
54
+ import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, a as SlamAppStoreOptions, b as computeGpsVsFusedDivergence, g as TrackingQualityState, h as TrackingQualitySliceState, i as SlamAppStore, j as snapshotsTrimmed, k as selectTrackingQuality, m as TrackingQualityReport, n as SlamAppMiddleware, o as createSlamAppStore, p as TrackingQualityOptions, r as SlamAppRootState, s as AlignmentSnapshot, t as SlamAppCombinedState, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, x as computeResidualConsensus, y as computeGpsAccuracy } from "./create-slam-app-store-D1QSMuKu.js";
55
+ import { a as eulerToQuaternion, c as getLastDeviceOrientation, d as updateDeviceOrientation, i as createGpsPositionHandler, l as resetCoordinatorState, n as buildRawGpsPoint, o as extractOdomPosition, r as buildRecordGpsEventPayload, s as extractOdomRotation, t as RecordingCoordinatorConfig } from "./gps-event-coordinator-BWpgBrHq.js";
56
+ import { a as ZipActionEntry, c as loadActionsFromZip, f as loadSessionMetadataFromBlob, i as RecordedAction, n as GpsPathCoord, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, u as loadGpsPathFromBlob } from "./zip-reader-BzENzMH6.js";
57
+ import { n as replayRecording } from "./recording-replayer-BJ8Lf0QY.js";
58
+ import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "./replay-engine-DmCAc7WM.js";
59
+ import { n as MapDataInput, r as buildMapData, t as MapData } from "./map-data-CUnTzRIC.js";
60
+ import { t as SubscribableStore } from "./subscribe-to-selector-dQV8SpsO.js";
61
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "./store-subscribers-DJUErW-o.js";
62
+ import { c as calcRelativeCoordsInMeters, d as OnboardingGuidance, f as OnboardingPhase, l as recordGpsEvent, m as selectOnboardingGuidance, p as computeOnboardingGuidance, s as add2dImage, u as setZeroPos } from "./index-B6iBnO_K.js";
63
63
  import { t as NullStorageBackend } from "./null-storage-backend-B1-jlpin.js";
64
64
  import { t as OpfsStorageBackend } from "./opfs-storage-backend-D6Z03fML.js";
65
65
  import { a as formatTimestamp, i as formatFrameFilename, r as formatActionFilename } from "./file-system-utils-DueXHxo9.js";
66
66
  import { a as downloadZip, c as syncToExternalZip, i as ZipExportResult, n as ZipContributorAddFile, o as exportSessionAsZip, r as ZipExportContributor, s as exportSessionHandleAsZip, t as ExportSessionAsZipOptions } from "./zip-export-CtiUnAlJ.js";
67
- import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "./ar-world-group-alignment-BlvGcIAk.js";
67
+ import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "./ar-world-group-alignment-Cfg0trC3.js";
68
68
  import { i as createGpsCompassCubes, n as COMPASS_CUBE_SIZE, r as GpsCompassCubes, t as COMPASS_CUBE_DISTANCE } from "./gps-compass-cubes-1mooS3BS.js";
69
69
  import { i as isSphereInCameraFrustum, n as isObjectInCameraFrustum, r as isPointInCameraFrustum, t as buildCameraFrustum } from "./frustum-visibility-CokkgS_i.js";
70
- import { n as worldNueToGps, t as nueToArLocal } from "./frame-conversions-C4bnNOEY.js";
70
+ import { n as worldNueToGps, t as nueToArLocal } from "./frame-conversions-DDcNHkTb.js";
71
71
  import { n as createReticleMesh, r as updateReticle, t as HitMatrix } from "./hit-test-reticle-CaQbrhbk.js";
72
- import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "./gps-anchor-BjECcYnD.js";
72
+ import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "./gps-anchor-CEjGqEVD.js";
73
73
  import { n as GpsEventVisualizer, r as gpsEventVisualizer } from "./gps-event-markers-Di2nBzx-.js";
74
- import { n as OcclusionMesh, r as OcclusionMeshOptions } from "./occlusion-mesh-b28lRJ6S.js";
75
- import { a as DEFAULT_Z_OFFSET, n as DEFAULT_LEAFLET_MAP_SIZE_PX, o as LeafletMapOverlay, r as DEFAULT_WORLD_SIZE, s as LeafletMapOverlayOptions } from "./leaflet-map-overlay-BOZFW5kT.js";
74
+ import { n as OcclusionMesh, r as OcclusionMeshOptions } from "./occlusion-mesh-kXCQ2FM1.js";
75
+ import { a as DEFAULT_Z_OFFSET, n as DEFAULT_LEAFLET_MAP_SIZE_PX, o as LeafletMapOverlay, r as DEFAULT_WORLD_SIZE, s as LeafletMapOverlayOptions } from "./leaflet-map-overlay-C8GS4cUy.js";
76
76
  import { n as clampedAlpha, t as DEFAULT_LERP_RATE } from "./lerp-utils-Qs8OhumS.js";
77
77
  import { a as addAccuracyCircles, i as AccuracyCircleSample, n as ACCURACY_CIRCLE_STROKE_OPACITY, r as ACCURACY_CIRCLE_WEIGHT, t as ACCURACY_CIRCLE_FILL_OPACITY } from "./accuracy-circles-DkWBkF5g.js";
78
- import { a as MAP_PATH_POLYLINE_OPACITY, c as USER_POSITION_COLOR, i as FUSED_PATH_COLOR, l as drawMapData, n as DrawMapDataOptions, o as MAP_PATH_POLYLINE_WEIGHT, r as DrawnMapData, s as RAW_GPS_COLOR, t as ALIGNMENT_SNAPSHOT_COLOR } from "./map-overlay-draw-DiroaJed.js";
78
+ import { a as MAP_PATH_POLYLINE_OPACITY, c as USER_POSITION_COLOR, i as FUSED_PATH_COLOR, l as drawMapData, n as DrawMapDataOptions, o as MAP_PATH_POLYLINE_WEIGHT, r as DrawnMapData, s as RAW_GPS_COLOR, t as ALIGNMENT_SNAPSHOT_COLOR } from "./map-overlay-draw-6WJeq0Kg.js";
79
79
  import { a as MapOverlayOptions, c as tileXYToLatLon, i as MapOverlay, n as DEFAULT_MAP_SIZE, o as TextureLoaderInterface, r as DEFAULT_ZOOM, s as latLonToTileXY, t as DEFAULT_HEIGHT_OFFSET } from "./map-overlay-BCQgvIgU.js";
80
80
  import { n as disposeMeshArray, r as disposeObject3D, t as DisposeOptions } from "./three-dispose-BMOAmPhb.js";
81
81
  import { t as VIS_COLORS } from "./vis-colors-C7HI0u9_.js";
package/dist/index.js CHANGED
@@ -63,7 +63,7 @@ import { DEFAULT_TRACKING_QUALITY_OPTIONS, computeConvergence, computeCoverage,
63
63
  import { t as createSlamAppStore } from "./create-slam-app-store-DXiAnJwR.js";
64
64
  import { replayRecording } from "./state/recording-replayer.js";
65
65
  import { DEFAULT_MAX_DELAY_MS, ReplayEngine, computeInterActionDelay, extractActionTimestamp } from "./state/replay-engine.js";
66
- import { t as buildMapData } from "./map-data-D7rpMC6f.js";
66
+ import { t as buildMapData } from "./map-data-1tF5gcYV.js";
67
67
  import { wireStoreSubscribers } from "./state/store-subscribers.js";
68
68
  import { a as computeOnboardingGuidance, i as setZeroPos, n as calcRelativeCoordsInMeters, o as selectOnboardingGuidance, r as recordGpsEvent, t as add2dImage } from "./state-BeKvn4B-.js";
69
69
  import { checkStorageQuota, createSession, getAppRootHandle, getSessionHandle, getSessionsRootHandle, initOpfsStorage, listSessions, resetOpfsStorage, resetSessionHandles } from "./storage/opfs-storage.js";
@@ -1,4 +1,4 @@
1
- import { t as MapData } from "./map-data-PNfGKGWx.js";
1
+ import { t as MapData } from "./map-data-CUnTzRIC.js";
2
2
  import * as THREE from "three";
3
3
  import { LatLong } from "gps-plus-slam-js";
4
4
  import L from "leaflet";
@@ -99,8 +99,12 @@ function buildMapData(input) {
99
99
  alignmentMatrix: input.alignmentMatrix ?? null,
100
100
  zeroRef: input.zeroRef ?? null
101
101
  });
102
+ const lastFused = fusedPath[fusedPath.length - 1];
102
103
  const lastRaw = rawGpsPath[rawGpsPath.length - 1];
103
- const userPosition = input.userPosition !== void 0 ? input.userPosition : lastRaw ? {
104
+ const userPosition = input.userPosition !== void 0 ? input.userPosition : lastFused ? {
105
+ lat: lastFused.lat,
106
+ lng: lastFused.lng
107
+ } : lastRaw ? {
104
108
  lat: lastRaw.lat,
105
109
  lng: lastRaw.lng
106
110
  } : null;
@@ -4,7 +4,14 @@ import { LatLong, Matrix4, Quaternion, Vector3 } from "gps-plus-slam-js";
4
4
  //#region ../src/visualization/map-data.d.ts
5
5
  /** Fully-resolved trajectory data ready to be drawn onto a Leaflet map. */
6
6
  interface MapData {
7
- /** Latest user GPS position (blue dot), or null when unknown. */
7
+ /**
8
+ * User position for the blue dot, or null when unknown/hidden. Unless the
9
+ * caller provided an explicit value, this is the latest FUSED pose
10
+ * (GPS-converted tip of `fusedPath`), so the dot keeps moving indoors where
11
+ * the raw fix freezes; the last raw GPS fix is only the pre-alignment
12
+ * fallback. See
13
+ * gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-07-06-recorder-live-map-user-dot-fused-pose-user-feedback.md.
14
+ */
8
15
  userPosition: GpsCoord | null;
9
16
  /** Raw GPS samples (yellow polyline + per-event accuracy circles). */
10
17
  rawGpsPath: RawGpsSample[];
@@ -49,8 +56,10 @@ interface MapDataInput {
49
56
  /** Alignment-snapshot GPS positions. */
50
57
  alignmentSnapshots?: readonly GpsCoord[];
51
58
  /**
52
- * Explicit user position. When omitted, defaults to the last entry of
53
- * `rawGpsPath` (or null when there is none).
59
+ * Explicit user position including `null` to hide the dot (summary map).
60
+ * When omitted, defaults to the last `fusedPath` point when the fused path
61
+ * is non-empty, else the last `rawGpsPath` entry, else null (2026-07-06
62
+ * fused-dot feedback).
54
63
  */
55
64
  userPosition?: GpsCoord | null;
56
65
  }
@@ -1,4 +1,4 @@
1
- import { t as MapData } from "./map-data-PNfGKGWx.js";
1
+ import { t as MapData } from "./map-data-CUnTzRIC.js";
2
2
  import L from "leaflet";
3
3
 
4
4
  //#region ../src/visualization/map-overlay-draw.d.ts
@@ -1,5 +1,5 @@
1
1
  import { t as GridCell } from "./bresenham3d-DGc4nIb-.js";
2
- import { f as OccluderDebugStyle } from "./recording-options-vASCFzc5.js";
2
+ import { p as OccluderDebugStyle } from "./recording-options-DYKWVI93.js";
3
3
  import { n as MeshMode, t as Aabb } from "./occupancy-mesher-C2ecWhNp.js";
4
4
  import * as THREE from "three";
5
5
  import { Vector3 } from "gps-plus-slam-js";
@@ -15,6 +15,7 @@ interface RecordingOptionsInput {
15
15
  visualization?: Partial<VisualizationOptions>;
16
16
  qr?: Partial<QrCaptureOptions>;
17
17
  compassDebug?: Partial<CompassDebugOptions>;
18
+ loopClosureDebug?: Partial<LoopClosureDebugOptions>;
18
19
  }
19
20
  /**
20
21
  * Toggles for the library's Phase-4 compass alignment features (closed/internal
@@ -43,6 +44,23 @@ interface CompassDebugOptions {
43
44
  /** GPS-free compass↔WebXR consistency gate (`setCompassWebXRConsistencyEnabled`). */
44
45
  webXRConsistency: boolean;
45
46
  }
47
+ /**
48
+ * Live loop-closure capture toggles (experimental, default OFF).
49
+ *
50
+ * When `detectorEnabled` is on, the recorder feeds every AR frame's raw WebXR
51
+ * pose into the library's `createLoopClosureHandler`, so an AR relocalization
52
+ * jump (>1 m between consecutive frames) dispatches `arLoopClosureDetected`
53
+ * into the session store — and therefore into the recording. This is the
54
+ * missing producer that has kept the whole corpus loop-closure-free (the
55
+ * pair-refresh T5 verdict is blocked on such recordings). It also changes the
56
+ * LIVE alignment (each closure Bézier-deforms the stored trajectory), which is
57
+ * why it stays an operator opt-in. See
58
+ * GpsPlusSlamJs_Docs/docs/2026-07-06-recorder-loop-closure-detector-wiring-plan.md.
59
+ */
60
+ interface LoopClosureDebugOptions {
61
+ /** Wire the live loop-closure handler into the AR frame loop. Default OFF. */
62
+ detectorEnabled: boolean;
63
+ }
46
64
  /**
47
65
  * Diagnostic flags for isolating pre-recording AR startup crashes.
48
66
  * These gates affect XR session negotiation and frame-loop behavior,
@@ -394,6 +412,8 @@ interface RecordingOptions {
394
412
  qr: QrCaptureOptions;
395
413
  /** Compass alignment debug toggles (Stage 0 / Stage C / consistency gate) */
396
414
  compassDebug: CompassDebugOptions;
415
+ /** Live loop-closure capture toggles (experimental, default OFF) */
416
+ loopClosureDebug: LoopClosureDebugOptions;
397
417
  }
398
418
  /**
399
419
  * localStorage key for persisted options.
@@ -580,6 +600,12 @@ declare function validateArCrashIsolationOptions(options: Partial<ArCrashIsolati
580
600
  * so a bad persisted value can never silently turn an alignment override ON.
581
601
  */
582
602
  declare function validateCompassDebugOptions(options: Partial<CompassDebugOptions>): CompassDebugOptions;
603
+ /**
604
+ * Validate and normalize the loop-closure capture toggles. Boolean-or-default
605
+ * per field; a missing/corrupted/pre-feature value falls back to the OFF
606
+ * default so a bad persisted value can never silently wire the detector in.
607
+ */
608
+ declare function validateLoopClosureDebugOptions(options: Partial<LoopClosureDebugOptions>): LoopClosureDebugOptions;
583
609
  /**
584
610
  * Validate and normalize the live debug-overlay visibility toggles.
585
611
  * Each field is boolean-or-default (same policy as the AR-crash-isolation
@@ -664,4 +690,4 @@ declare function resetRecordingOptions(storageKey?: string): RecordingOptions;
664
690
  */
665
691
  declare function cloneRecordingOptions(options: RecordingOptions): RecordingOptions;
666
692
  //#endregion
667
- export { validateImageOptions as A, loadRecordingOptions as C, validateCompassDebugOptions as D, validateArCrashIsolationOptions as E, validateRecordingOptions as F, validateVisualizationOptions as I, validateOccupancyOptions as M, validateQrOptions as N, validateDepthOptions as O, validateQualityFilterOptions as P, cloneRecordingOptions as S, saveRecordingOptions as T, QrCaptureOptions as _, DepthCaptureOptions as a, STORAGE_KEY as b, IMAGE_CONSTRAINTS as c, OCCUPANCY_CONSTRAINTS as d, OccluderDebugStyle as f, QUALITY_FILTER_CONSTRAINTS as g, QR_CONSTRAINTS as h, DEPTH_CONSTRAINTS as i, validateMotionFilterOptions as j, validateFrameTileDisplayOptions as k, ImageCaptureOptions as l, OccupancyOptions as m, CompassDebugOptions as n, FRAME_TILE_DISPLAY_CONSTRAINTS as o, OccluderMeshMode as p, DEFAULT_RECORDING_OPTIONS as r, FrameTileDisplayOptions as s, ArCrashIsolationOptions as t, MOTION_FILTER_CONSTRAINTS as u, RecordingOptions as v, resetRecordingOptions as w, VisualizationOptions as x, RecordingOptionsInput as y };
693
+ export { validateFrameTileDisplayOptions as A, cloneRecordingOptions as C, validateArCrashIsolationOptions as D, saveRecordingOptions as E, validateQrOptions as F, validateQualityFilterOptions as I, validateRecordingOptions as L, validateLoopClosureDebugOptions as M, validateMotionFilterOptions as N, validateCompassDebugOptions as O, validateOccupancyOptions as P, validateVisualizationOptions as R, VisualizationOptions as S, resetRecordingOptions as T, QUALITY_FILTER_CONSTRAINTS as _, DepthCaptureOptions as a, RecordingOptionsInput as b, IMAGE_CONSTRAINTS as c, MOTION_FILTER_CONSTRAINTS as d, OCCUPANCY_CONSTRAINTS as f, QR_CONSTRAINTS as g, OccupancyOptions as h, DEPTH_CONSTRAINTS as i, validateImageOptions as j, validateDepthOptions as k, ImageCaptureOptions as l, OccluderMeshMode as m, CompassDebugOptions as n, FRAME_TILE_DISPLAY_CONSTRAINTS as o, OccluderDebugStyle as p, DEFAULT_RECORDING_OPTIONS as r, FrameTileDisplayOptions as s, ArCrashIsolationOptions as t, LoopClosureDebugOptions as u, QrCaptureOptions as v, loadRecordingOptions as w, STORAGE_KEY as x, RecordingOptions as y };
@@ -1,5 +1,5 @@
1
- import { N as CombinedRootState } from "./create-slam-app-store-D3nzh9Wb.js";
2
- import { i as RecordedAction } from "./zip-reader-CvruaGvD.js";
1
+ import { N as CombinedRootState } from "./create-slam-app-store-D1QSMuKu.js";
2
+ import { i as RecordedAction } from "./zip-reader-BzENzMH6.js";
3
3
 
4
4
  //#region ../src/state/recording-replayer.d.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { i as DepthSample } from "./ar-types-Cc5yvBwn.js";
2
- import { v as RecordingOptions } from "./recording-options-vASCFzc5.js";
2
+ import { y as RecordingOptions } from "./recording-options-DYKWVI93.js";
3
3
  import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
4
4
 
5
5
  //#region ../src/state/recording-slice.d.ts
@@ -1,4 +1,4 @@
1
- import { i as SlamAppStore } from "./create-slam-app-store-D3nzh9Wb.js";
1
+ import { i as SlamAppStore } from "./create-slam-app-store-D1QSMuKu.js";
2
2
  import { ReducersMapObject } from "@reduxjs/toolkit";
3
3
 
4
4
  //#region ../src/state/replay-engine.d.ts
@@ -1,2 +1,2 @@
1
- import { a as selectOdometryRotations, i as selectOdometryPositions, n as selectFrameTilesInWebXR, o as selectZeroReference, r as selectGpsPositions, t as selectAlignmentMatrix } from "../app-selectors-JqydaUMN.js";
1
+ import { a as selectOdometryRotations, i as selectOdometryPositions, n as selectFrameTilesInWebXR, o as selectZeroReference, r as selectGpsPositions, t as selectAlignmentMatrix } from "../app-selectors-BbAiCRUT.js";
2
2
  export { selectAlignmentMatrix, selectFrameTilesInWebXR, selectGpsPositions, selectOdometryPositions, selectOdometryRotations, selectZeroReference };
@@ -1,2 +1,2 @@
1
- import { N as CombinedRootState } from "../create-slam-app-store-D3nzh9Wb.js";
1
+ import { N as CombinedRootState } from "../create-slam-app-store-D1QSMuKu.js";
2
2
  export { CombinedRootState };
@@ -1,2 +1,2 @@
1
- import { a as SlamAppStoreOptions, i as SlamAppStore, n as SlamAppMiddleware, o as createSlamAppStore, r as SlamAppRootState, t as SlamAppCombinedState } from "../create-slam-app-store-D3nzh9Wb.js";
1
+ import { a as SlamAppStoreOptions, i as SlamAppStore, n as SlamAppMiddleware, o as createSlamAppStore, r as SlamAppRootState, t as SlamAppCombinedState } from "../create-slam-app-store-D1QSMuKu.js";
2
2
  export { SlamAppCombinedState, SlamAppMiddleware, SlamAppRootState, SlamAppStore, SlamAppStoreOptions, createSlamAppStore };
@@ -1,4 +1,4 @@
1
1
  import { t as ARPose } from "../ar-types-Cc5yvBwn.js";
2
- import { o as extractOdomPosition, s as extractOdomRotation } from "../gps-event-coordinator-CHtIkhb7.js";
2
+ import { o as extractOdomPosition, s as extractOdomRotation } from "../gps-event-coordinator-BWpgBrHq.js";
3
3
  import { i as captureGpsAnchorSample, n as GpsAnchorSample, r as GpsAnchorSampleGpsPoint, t as CaptureGpsAnchorSampleOptions } from "../gps-ar-pose-sampler-DEGNk2CI.js";
4
4
  export { ARPose, CaptureGpsAnchorSampleOptions, GpsAnchorSample, GpsAnchorSampleGpsPoint, captureGpsAnchorSample, extractOdomPosition, extractOdomRotation };
@@ -1,2 +1,2 @@
1
- import { a as eulerToQuaternion, c as getLastDeviceOrientation, d as updateDeviceOrientation, i as createGpsPositionHandler, l as resetCoordinatorState, n as buildRawGpsPoint, o as extractOdomPosition, r as buildRecordGpsEventPayload, s as extractOdomRotation, t as RecordingCoordinatorConfig, u as toRawAbsoluteOrientation } from "../gps-event-coordinator-CHtIkhb7.js";
1
+ import { a as eulerToQuaternion, c as getLastDeviceOrientation, d as updateDeviceOrientation, i as createGpsPositionHandler, l as resetCoordinatorState, n as buildRawGpsPoint, o as extractOdomPosition, r as buildRecordGpsEventPayload, s as extractOdomRotation, t as RecordingCoordinatorConfig, u as toRawAbsoluteOrientation } from "../gps-event-coordinator-BWpgBrHq.js";
2
2
  export { RecordingCoordinatorConfig, buildRawGpsPoint, buildRecordGpsEventPayload, createGpsPositionHandler, eulerToQuaternion, extractOdomPosition, extractOdomRotation, getLastDeviceOrientation, resetCoordinatorState, toRawAbsoluteOrientation, updateDeviceOrientation };
@@ -1,20 +1,20 @@
1
1
  import { i as DepthSample, r as DepthPoint } from "../ar-types-Cc5yvBwn.js";
2
- import { A as validateImageOptions, C as loadRecordingOptions, F as validateRecordingOptions, O as validateDepthOptions, S as cloneRecordingOptions, T as saveRecordingOptions, a as DepthCaptureOptions, b as STORAGE_KEY, c as IMAGE_CONSTRAINTS, i as DEPTH_CONSTRAINTS, l as ImageCaptureOptions, r as DEFAULT_RECORDING_OPTIONS, w as resetRecordingOptions, y as RecordingOptionsInput } from "../recording-options-vASCFzc5.js";
2
+ import { C as cloneRecordingOptions, E as saveRecordingOptions, L as validateRecordingOptions, T as resetRecordingOptions, a as DepthCaptureOptions, b as RecordingOptionsInput, c as IMAGE_CONSTRAINTS, i as DEPTH_CONSTRAINTS, j as validateImageOptions, k as validateDepthOptions, l as ImageCaptureOptions, r as DEFAULT_RECORDING_OPTIONS, w as loadRecordingOptions, x as STORAGE_KEY } from "../recording-options-DYKWVI93.js";
3
3
  import { a as TrackingSliceState, c as poseLost, d as selectLastRestartedPayload, f as selectLastSensorOrientation, g as trackingReducer, h as selectTrackingPhase, i as TrackingPhase, l as poseReceived, m as selectLostFrameCount, n as PoseReceivedPayload, o as clearLastRestartedPayload, p as selectLastValidPose, r as ResetTransformData, s as originReset, t as DeviceOrientation, u as resetTracking } from "../tracking-slice-DMkHlbny.js";
4
4
  import { d as QrSizeStatus, l as QrSizeEstimate } from "../qr-size-measurer-DxiMqRUw.js";
5
5
  import { a as QrPoseStability, o as QrPoseStabilityOptions, s as QrPoseStabilityStatus } from "../qr-pose-aggregation-CypnmjA-.js";
6
- import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata$1, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-DTUtSVgd.js";
6
+ import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata$1, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-BW8SiLo1.js";
7
7
  import { C as setQrMaxHistory, S as selectStableQrPose, _ as selectQrPoseStability, a as RootWithQrDetected, b as selectResolvedQrSizeM, c as medianQrPosition, d as recordQrDetection, f as recordQrSizeEstimate, g as selectQrMarkers, h as selectQrMarker, i as QrMarkerState, l as pruneQrDetections, m as selectLatestQrDetection, n as QrDetectedState, o as clearAllQrMarkers, p as selectDerivedQrPlacement, r as QrDetectionEntry, s as clearQrMarker, t as DEFAULT_QR_MAX_HISTORY, u as qrDetectedReducer, v as selectQrRawObservations, x as selectSolvedQrPose, y as selectQrSize } from "../qr-detected-slice-TzVb8bij.js";
8
8
  import { n as SessionMetadata } from "../opfs-storage-CTkxvxN4.js";
9
9
  import { n as StorageBackend } from "../storage-backend-sEtmM4yW.js";
10
- import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, a as SlamAppStoreOptions, b as computeGpsVsFusedDivergence, g as TrackingQualityState, h as TrackingQualitySliceState, i as SlamAppStore, j as snapshotsTrimmed, k as selectTrackingQuality, m as TrackingQualityReport, n as SlamAppMiddleware, o as createSlamAppStore, p as TrackingQualityOptions, r as SlamAppRootState, s as AlignmentSnapshot, t as SlamAppCombinedState, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-D3nzh9Wb.js";
11
- import { a as eulerToQuaternion, c as getLastDeviceOrientation, d as updateDeviceOrientation, i as createGpsPositionHandler, l as resetCoordinatorState, n as buildRawGpsPoint, o as extractOdomPosition, r as buildRecordGpsEventPayload, s as extractOdomRotation, t as RecordingCoordinatorConfig } from "../gps-event-coordinator-CHtIkhb7.js";
10
+ import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, a as SlamAppStoreOptions, b as computeGpsVsFusedDivergence, g as TrackingQualityState, h as TrackingQualitySliceState, i as SlamAppStore, j as snapshotsTrimmed, k as selectTrackingQuality, m as TrackingQualityReport, n as SlamAppMiddleware, o as createSlamAppStore, p as TrackingQualityOptions, r as SlamAppRootState, s as AlignmentSnapshot, t as SlamAppCombinedState, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-D1QSMuKu.js";
11
+ import { a as eulerToQuaternion, c as getLastDeviceOrientation, d as updateDeviceOrientation, i as createGpsPositionHandler, l as resetCoordinatorState, n as buildRawGpsPoint, o as extractOdomPosition, r as buildRecordGpsEventPayload, s as extractOdomRotation, t as RecordingCoordinatorConfig } from "../gps-event-coordinator-BWpgBrHq.js";
12
12
  import { i as captureGpsAnchorSample, n as GpsAnchorSample, r as GpsAnchorSampleGpsPoint, t as CaptureGpsAnchorSampleOptions } from "../gps-ar-pose-sampler-DEGNk2CI.js";
13
- import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-D0V9WkmY.js";
13
+ import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-BJ8Lf0QY.js";
14
14
  import { n as createPersistenceMiddleware, r as slicePrefixOf, t as PersistenceMiddlewareOptions } from "../persistence-middleware-CG-t08X4.js";
15
- import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-xdrUgWJi.js";
16
- import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-B9ylM5Oh.js";
17
- import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DScA7tdT.js";
18
- import { a as selectOdometryRotations, i as selectOdometryPositions, n as selectFrameTilesInWebXR, o as selectZeroReference, r as selectGpsPositions, t as selectAlignmentMatrix } from "../app-selectors-JqydaUMN.js";
19
- import { a as RawGpsPoint, c as calcRelativeCoordsInMeters, d as OnboardingGuidance, f as OnboardingPhase, i as RawDeviceOrientation, l as recordGpsEvent, m as selectOnboardingGuidance, n as GpsPoint, o as RecordGpsEventPayload, p as computeOnboardingGuidance, r as LatLong, s as add2dImage, t as Add2dImagePayload, u as setZeroPos } from "../index-DlsOo2IB.js";
15
+ import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-DmCAc7WM.js";
16
+ import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-dQV8SpsO.js";
17
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DJUErW-o.js";
18
+ import { a as selectOdometryRotations, i as selectOdometryPositions, n as selectFrameTilesInWebXR, o as selectZeroReference, r as selectGpsPositions, t as selectAlignmentMatrix } from "../app-selectors-BbAiCRUT.js";
19
+ import { a as RawGpsPoint, c as calcRelativeCoordsInMeters, d as OnboardingGuidance, f as OnboardingPhase, i as RawDeviceOrientation, l as recordGpsEvent, m as selectOnboardingGuidance, n as GpsPoint, o as RecordGpsEventPayload, p as computeOnboardingGuidance, r as LatLong, s as add2dImage, t as Add2dImagePayload, u as setZeroPos } from "../index-B6iBnO_K.js";
20
20
  export { Add2dImagePayload, AlignmentSnapshot, CaptureGpsAnchorSampleOptions, CompleteCallback, DEFAULT_MAX_DELAY_MS, DEFAULT_QR_MAX_HISTORY, DEFAULT_RECORDING_OPTIONS, DEFAULT_TRACKING_QUALITY_OPTIONS, DEPTH_CONSTRAINTS, DepthCaptureOptions, DepthPoint, DepthSample, DeviceOrientation, ErrorCallback, GpsAnchorSample, GpsAnchorSampleGpsPoint, GpsPoint, IMAGE_CONSTRAINTS, ImageCaptureOptions, LatLong, OnboardingGuidance, OnboardingPhase, SessionMetadata as OpfsSessionMetadata, PersistenceMiddlewareOptions, PoseReceivedPayload, ProgressCallback, QrDetectedState, QrDetectionEntry, QrMarkerState, QrPoseStability, QrPoseStabilityOptions, QrPoseStabilityStatus, QrSizeEstimate, QrSizeStatus, RawDeviceOrientation, RawGpsPoint, RecordGpsEventPayload, RecordingCoordinatorConfig, RecordingOptionsInput, RecordingState, ReplayAction, ReplayEngine, ReplayRecordingOptions, ReplayState, ResetTransformData, RootWithQrDetected, STORAGE_KEY, SessionMetadata$1 as SessionMetadata, SlamAppCombinedState, SlamAppMiddleware, SlamAppRootState, SlamAppStore, SlamAppStoreOptions, StorageBackend, StoreSubscriberDeps, SubscribableStore, TrackingPhase, TrackingQualityOptions, TrackingQualityReport, TrackingQualitySliceState, TrackingQualityState, TrackingSliceState, add2dImage, buildRawGpsPoint, buildRecordGpsEventPayload, calcRelativeCoordsInMeters, captureGpsAnchorSample, clearAllQrMarkers, clearLastRestartedPayload, clearQrMarker, cloneRecordingOptions, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeInterActionDelay, computeOnboardingGuidance, computeResidualConsensus, computeTrackingQualityReport, createGpsPositionHandler, createPersistenceMiddleware, createSlamAppStore, createTrackingQualityListenerMiddleware, degradedCountUpdated, endSession, eulerToQuaternion, extractActionTimestamp, extractOdomPosition, extractOdomRotation, getLastDeviceOrientation, loadRecordingOptions, matrixDelta, medianQrPosition, originReset, poseLost, poseReceived, pruneQrDetections, qrDetectedReducer, recordDepthSample, recordGpsEvent, recordQrDetection, recordQrSizeEstimate, recordWriteFailure, recordingReducer, replayRecording, reportUpdated, resetCoordinatorState, resetRecordingOptions, resetTracking, resetTrackingQuality, saveRecordingOptions, selectAlignmentMatrix, selectDerivedQrPlacement, selectFrameTilesInWebXR, selectGpsPositions, selectLastRestartedPayload, selectLastSensorOrientation, selectLastValidPose, selectLatestQrDetection, selectLostFrameCount, selectOdometryPositions, selectOdometryRotations, selectOnboardingGuidance, selectQrMarker, selectQrMarkers, selectQrPoseStability, selectQrRawObservations, selectQrSize, selectRecentAlignments, selectResolvedQrSizeM, selectSolvedQrPose, selectStableQrPose, selectTrackingPhase, selectTrackingQuality, selectZeroReference, setQrMaxHistory, setZeroPos, slicePrefixOf, snapshotPushed, snapshotsTrimmed, startSession, subscribeToSelector, trackingQualityReducer, trackingReducer, updateDeviceOrientation, validateDepthOptions, validateImageOptions, validateRecordingOptions, wireStoreSubscribers };
@@ -1,2 +1,2 @@
1
- import { A as validateImageOptions, C as loadRecordingOptions, D as validateCompassDebugOptions, E as validateArCrashIsolationOptions, F as validateRecordingOptions, I as validateVisualizationOptions, M as validateOccupancyOptions, N as validateQrOptions, O as validateDepthOptions, P as validateQualityFilterOptions, S as cloneRecordingOptions, T as saveRecordingOptions, _ as QrCaptureOptions, a as DepthCaptureOptions, b as STORAGE_KEY, c as IMAGE_CONSTRAINTS, d as OCCUPANCY_CONSTRAINTS, f as OccluderDebugStyle, g as QUALITY_FILTER_CONSTRAINTS, h as QR_CONSTRAINTS, i as DEPTH_CONSTRAINTS, j as validateMotionFilterOptions, k as validateFrameTileDisplayOptions, l as ImageCaptureOptions, m as OccupancyOptions, n as CompassDebugOptions, o as FRAME_TILE_DISPLAY_CONSTRAINTS, p as OccluderMeshMode, r as DEFAULT_RECORDING_OPTIONS, s as FrameTileDisplayOptions, t as ArCrashIsolationOptions, u as MOTION_FILTER_CONSTRAINTS, v as RecordingOptions, w as resetRecordingOptions, x as VisualizationOptions, y as RecordingOptionsInput } from "../recording-options-vASCFzc5.js";
2
- export { ArCrashIsolationOptions, CompassDebugOptions, DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, DepthCaptureOptions, FRAME_TILE_DISPLAY_CONSTRAINTS, FrameTileDisplayOptions, IMAGE_CONSTRAINTS, ImageCaptureOptions, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, OccluderDebugStyle, OccluderMeshMode, OccupancyOptions, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, QrCaptureOptions, RecordingOptions, RecordingOptionsInput, STORAGE_KEY, VisualizationOptions, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
1
+ import { A as validateFrameTileDisplayOptions, C as cloneRecordingOptions, D as validateArCrashIsolationOptions, E as saveRecordingOptions, F as validateQrOptions, I as validateQualityFilterOptions, L as validateRecordingOptions, M as validateLoopClosureDebugOptions, N as validateMotionFilterOptions, O as validateCompassDebugOptions, P as validateOccupancyOptions, R as validateVisualizationOptions, S as VisualizationOptions, T as resetRecordingOptions, _ as QUALITY_FILTER_CONSTRAINTS, a as DepthCaptureOptions, b as RecordingOptionsInput, c as IMAGE_CONSTRAINTS, d as MOTION_FILTER_CONSTRAINTS, f as OCCUPANCY_CONSTRAINTS, g as QR_CONSTRAINTS, h as OccupancyOptions, i as DEPTH_CONSTRAINTS, j as validateImageOptions, k as validateDepthOptions, l as ImageCaptureOptions, m as OccluderMeshMode, n as CompassDebugOptions, o as FRAME_TILE_DISPLAY_CONSTRAINTS, p as OccluderDebugStyle, r as DEFAULT_RECORDING_OPTIONS, s as FrameTileDisplayOptions, t as ArCrashIsolationOptions, u as LoopClosureDebugOptions, v as QrCaptureOptions, w as loadRecordingOptions, x as STORAGE_KEY, y as RecordingOptions } from "../recording-options-DYKWVI93.js";
2
+ export { ArCrashIsolationOptions, CompassDebugOptions, DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, DepthCaptureOptions, FRAME_TILE_DISPLAY_CONSTRAINTS, FrameTileDisplayOptions, IMAGE_CONSTRAINTS, ImageCaptureOptions, LoopClosureDebugOptions, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, OccluderDebugStyle, OccluderMeshMode, OccupancyOptions, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, QrCaptureOptions, RecordingOptions, RecordingOptionsInput, STORAGE_KEY, VisualizationOptions, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateLoopClosureDebugOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
@@ -124,7 +124,8 @@ const DEFAULT_RECORDING_OPTIONS = {
124
124
  coldStartOverride: true,
125
125
  rotationPrior: false,
126
126
  webXRConsistency: false
127
- }
127
+ },
128
+ loopClosureDebug: { detectorEnabled: false }
128
129
  };
129
130
  /** Validation constraints for depth options */
130
131
  const DEPTH_CONSTRAINTS = {
@@ -317,6 +318,15 @@ function validateCompassDebugOptions(options) {
317
318
  };
318
319
  }
319
320
  /**
321
+ * Validate and normalize the loop-closure capture toggles. Boolean-or-default
322
+ * per field; a missing/corrupted/pre-feature value falls back to the OFF
323
+ * default so a bad persisted value can never silently wire the detector in.
324
+ */
325
+ function validateLoopClosureDebugOptions(options) {
326
+ const defaults = DEFAULT_RECORDING_OPTIONS.loopClosureDebug;
327
+ return { detectorEnabled: typeof options.detectorEnabled === "boolean" ? options.detectorEnabled : defaults.detectorEnabled };
328
+ }
329
+ /**
320
330
  * Validate and normalize the live debug-overlay visibility toggles.
321
331
  * Each field is boolean-or-default (same policy as the AR-crash-isolation
322
332
  * flags): a missing, corrupted, or pre-feature persisted value falls back to
@@ -504,7 +514,8 @@ function validateRecordingOptions(options) {
504
514
  frameTileDisplay: validateFrameTileDisplayOptions(options.frameTileDisplay ?? {}),
505
515
  visualization: validateVisualizationOptions(options.visualization ?? {}),
506
516
  qr: validateQrOptions(options.qr ?? {}),
507
- compassDebug: validateCompassDebugOptions(options.compassDebug ?? {})
517
+ compassDebug: validateCompassDebugOptions(options.compassDebug ?? {}),
518
+ loopClosureDebug: validateLoopClosureDebugOptions(options.loopClosureDebug ?? {})
508
519
  };
509
520
  }
510
521
  /**
@@ -572,8 +583,9 @@ function cloneRecordingOptions(options) {
572
583
  frameTileDisplay: { ...options.frameTileDisplay },
573
584
  visualization: { ...options.visualization },
574
585
  qr: { ...options.qr },
575
- compassDebug: { ...options.compassDebug }
586
+ compassDebug: { ...options.compassDebug },
587
+ loopClosureDebug: { ...options.loopClosureDebug }
576
588
  };
577
589
  }
578
590
  //#endregion
579
- export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, FRAME_TILE_DISPLAY_CONSTRAINTS, IMAGE_CONSTRAINTS, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
591
+ export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, FRAME_TILE_DISPLAY_CONSTRAINTS, IMAGE_CONSTRAINTS, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateLoopClosureDebugOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
@@ -1,3 +1,3 @@
1
- import { N as CombinedRootState } from "../create-slam-app-store-D3nzh9Wb.js";
2
- import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-D0V9WkmY.js";
1
+ import { N as CombinedRootState } from "../create-slam-app-store-D1QSMuKu.js";
2
+ import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-BJ8Lf0QY.js";
3
3
  export { CombinedRootState, ReplayRecordingOptions, replayRecording };
@@ -1,2 +1,2 @@
1
- import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-DTUtSVgd.js";
1
+ import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-BW8SiLo1.js";
2
2
  export { RecordingState, SessionMetadata, endSession, recordDepthSample, recordWriteFailure, recordingReducer, startSession };
@@ -1,2 +1,2 @@
1
- import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-xdrUgWJi.js";
1
+ import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-DmCAc7WM.js";
2
2
  export { CompleteCallback, DEFAULT_MAX_DELAY_MS, ErrorCallback, ProgressCallback, ReplayAction, ReplayEngine, ReplayState, computeInterActionDelay, extractActionTimestamp };
@@ -1,3 +1,3 @@
1
- import { t as SubscribableStore } from "../subscribe-to-selector-B9ylM5Oh.js";
2
- import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DScA7tdT.js";
1
+ import { t as SubscribableStore } from "../subscribe-to-selector-dQV8SpsO.js";
2
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DJUErW-o.js";
3
3
  export { StoreSubscriberDeps, SubscribableStore, wireStoreSubscribers };
@@ -1,9 +1,11 @@
1
+ import { createLogger } from "../utils/logger.js";
1
2
  import { selectAlignmentMatrix, selectGpsPositions, selectOdometryPositions, selectOdometryRotations, selectZeroReference } from "./app-selectors.js";
2
- import { t as buildMapData } from "../map-data-D7rpMC6f.js";
3
+ import { t as buildMapData } from "../map-data-1tF5gcYV.js";
3
4
  import { subscribeToSelector } from "./subscribe-to-selector.js";
4
5
  import { calcGpsCoords } from "gps-plus-slam-js";
5
6
  import { mat4, vec3 } from "gl-matrix";
6
7
  //#region ../src/state/store-subscribers.ts
8
+ const log = createLogger("StoreSubscribers");
7
9
  /**
8
10
  * Wire store state-change subscriptions to visualization dependencies.
9
11
  *
@@ -34,23 +36,33 @@ function wireStoreSubscribers(store, deps) {
34
36
  * positions change — the change-gated subscriptions below provide the
35
37
  * throttling, so no extra debouncing is needed. The fused path is always
36
38
  * recomputed from the latest matrix inside `buildMapData` (D2).
39
+ *
40
+ * Returns the rendered `MapData` so the GPS subscription can center the map
41
+ * on the SAME coordinate the dot shows (fused when available — 2026-07-06
42
+ * fused-dot feedback, Slice B), or `null` when there is no overlay or it
43
+ * has no `render` (the minimal `setGpsPosition`-only dep shape).
37
44
  */
38
45
  function rebuildMap() {
39
- if (!deps.mapOverlay?.render) return;
46
+ if (!deps.mapOverlay?.render) return null;
40
47
  const state = store.getState();
41
- const rawGpsPath = selectGpsPositions(state).map((p) => ({
42
- lat: p.latitude,
43
- lng: p.longitude,
44
- accuracy: p.latLongAccuracy
45
- }));
46
- deps.mapOverlay.render(buildMapData({
47
- rawGpsPath,
48
+ const data = buildMapData({
49
+ rawGpsPath: selectGpsPositions(state).map((p) => ({
50
+ lat: p.latitude,
51
+ lng: p.longitude,
52
+ accuracy: p.latLongAccuracy
53
+ })),
48
54
  odometryPositions: selectOdometryPositions(state),
49
55
  odometryRotations: selectOdometryRotations(state),
50
56
  alignmentMatrix: selectAlignmentMatrix(state),
51
57
  zeroRef: selectZeroReference(state),
52
58
  alignmentSnapshots: alignmentSnapshotGps
53
- }));
59
+ });
60
+ try {
61
+ deps.mapOverlay.render(data);
62
+ } catch (err) {
63
+ log.warn("Map overlay render failed; continuing with centering:", err);
64
+ }
65
+ return data;
54
66
  }
55
67
  unsubs.push(subscribeToSelector(store, selectAlignmentMatrix, (matrix) => {
56
68
  if (!matrix) return;
@@ -102,11 +114,12 @@ function wireStoreSubscribers(store, deps) {
102
114
  if (odomRot) deps.onNewOdomPose?.(odomPos, odomRot);
103
115
  }
104
116
  }
105
- if (deps.mapOverlay && gpsPositions.length > 0) {
117
+ const mapData = rebuildMap();
118
+ if (deps.mapOverlay && gpsPositions.length > 0) if (mapData?.userPosition) deps.mapOverlay.setGpsPosition(mapData.userPosition.lat, mapData.userPosition.lng);
119
+ else {
106
120
  const lastGpsPoint = gpsPositions[gpsPositions.length - 1];
107
121
  deps.mapOverlay.setGpsPosition(lastGpsPoint.latitude, lastGpsPoint.longitude);
108
122
  }
109
- rebuildMap();
110
123
  }));
111
124
  return () => {
112
125
  for (const unsub of unsubs) unsub();
@@ -1,2 +1,2 @@
1
- import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-B9ylM5Oh.js";
1
+ import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-dQV8SpsO.js";
2
2
  export { SubscribableStore, subscribeToSelector };
@@ -1,2 +1,2 @@
1
- import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, b as computeGpsVsFusedDivergence, c as ConvergenceResult, d as GpsAccuracyResult, f as ResidualConsensusResult, g as TrackingQualityState, h as TrackingQualitySliceState, j as snapshotsTrimmed, k as selectTrackingQuality, l as CoverageResult, m as TrackingQualityReport, p as TrackingQualityOptions, s as AlignmentSnapshot, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-D3nzh9Wb.js";
1
+ import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, b as computeGpsVsFusedDivergence, c as ConvergenceResult, d as GpsAccuracyResult, f as ResidualConsensusResult, g as TrackingQualityState, h as TrackingQualitySliceState, j as snapshotsTrimmed, k as selectTrackingQuality, l as CoverageResult, m as TrackingQualityReport, p as TrackingQualityOptions, s as AlignmentSnapshot, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-D1QSMuKu.js";
2
2
  export { AlignmentSnapshot, ConvergenceResult, CoverageResult, DEFAULT_TRACKING_QUALITY_OPTIONS, GpsAccuracyResult, ResidualConsensusResult, TrackingQualityOptions, TrackingQualityReport, TrackingQualitySliceState, TrackingQualityState, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeResidualConsensus, computeTrackingQualityReport, createTrackingQualityListenerMiddleware, degradedCountUpdated, matrixDelta, reportUpdated, resetTrackingQuality, selectRecentAlignments, selectTrackingQuality, snapshotPushed, snapshotsTrimmed, trackingQualityReducer };
@@ -157,11 +157,10 @@ function computeConvergence(snapshots, options = {}) {
157
157
  * compute the Euclidean distance.
158
158
  *
159
159
  * This is the **single shared kernel** for the AppFramework reporter and
160
- * the Investigation harness (see §11 (a) of the tracking-quality plan).
161
- * `GpsPlusSlamJs_Investigation/src/investigation-helpers.ts` re-exports
162
- * `computeStabilityDelta` as a thin wrapper around this function so the
163
- * §6.1 corpus sweep and the runtime convergence score share one numeric
164
- * definition.
160
+ * the downstream corpus-analysis harness (see §11 (a) of the
161
+ * tracking-quality plan), which re-exports it as `computeStabilityDelta` —
162
+ * a thin wrapper around this function so the §6.1 corpus sweep and the
163
+ * runtime convergence score share one numeric definition.
165
164
  */
166
165
  function matrixDelta(prev, curr) {
167
166
  if (prev.length !== 16 || curr.length !== 16) return {
@@ -1,6 +1,6 @@
1
1
  import { a as getAppRootHandle, c as initOpfsStorage, d as resetSessionHandles, h as writeSessionMetadata, i as createSession, l as listSessions, n as SessionMetadata, o as getSessionHandle, r as checkStorageQuota, s as getSessionsRootHandle, u as resetOpfsStorage } from "../opfs-storage-CTkxvxN4.js";
2
2
  import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-sEtmM4yW.js";
3
- import { a as ZipActionEntry, c as loadEntriesFromSubdir, d as loadSessionMetadataFromBlob, f as readZipEntries, i as RecordedAction, l as loadGpsPathFromBlob, n as GpsPathCoord, o as ZipSubdirEntry, r as MAX_ACTION_FILE_SIZE, s as loadActionsFromZip, t as Entry, u as loadSessionMetadata } from "../zip-reader-CvruaGvD.js";
3
+ import { a as ZipActionEntry, c as loadActionsFromZip, d as loadSessionMetadata, f as loadSessionMetadataFromBlob, i as RecordedAction, l as loadEntriesFromSubdir, n as GpsPathCoord, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, s as ZipSubdirEntry, t as Entry, u as loadGpsPathFromBlob } from "../zip-reader-BzENzMH6.js";
4
4
  import { t as NullStorageBackend } from "../null-storage-backend-B1-jlpin.js";
5
5
  import { t as OpfsStorageBackend } from "../opfs-storage-backend-D6Z03fML.js";
6
6
  import { a as formatTimestamp, i as formatFrameFilename, r as formatActionFilename } from "../file-system-utils-DueXHxo9.js";
@@ -89,16 +89,21 @@ function getAppRootHandle() {
89
89
  return gpsPlusSlamDir;
90
90
  }
91
91
  /**
92
- * True when a session directory named `name` already exists under `dir`.
93
- * Used by {@link createSession} to avoid silently reusing a directory when two
94
- * recordings start within the same (second-resolution) timestamp.
92
+ * True when the name `name` is already taken under `dir` (by a session
93
+ * directory — or by a file, which the follow-up `{ create: true }` call could
94
+ * not replace either). Used by {@link createSession} to avoid silently reusing
95
+ * a directory when two recordings start within the same (second-resolution)
96
+ * timestamp. Rethrows unexpected probe errors (storage failures) so the caller
97
+ * fails loudly instead of mislabeling the name.
95
98
  */
96
99
  async function sessionDirExists(dir, name) {
97
100
  try {
98
101
  await dir.getDirectoryHandle(name, { create: false });
99
102
  return true;
100
- } catch {
101
- return false;
103
+ } catch (err) {
104
+ if (err instanceof DOMException && err.name === "NotFoundError") return false;
105
+ if (err instanceof DOMException && err.name === "TypeMismatchError") return true;
106
+ throw err;
102
107
  }
103
108
  }
104
109
  /**
@@ -1,2 +1,2 @@
1
- import { a as ZipActionEntry, c as loadEntriesFromSubdir, d as loadSessionMetadataFromBlob, f as readZipEntries, i as RecordedAction, l as loadGpsPathFromBlob, n as GpsPathCoord, o as ZipSubdirEntry, r as MAX_ACTION_FILE_SIZE, s as loadActionsFromZip, t as Entry, u as loadSessionMetadata } from "../zip-reader-CvruaGvD.js";
2
- export { Entry, GpsPathCoord, MAX_ACTION_FILE_SIZE, RecordedAction, ZipActionEntry, ZipSubdirEntry, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadata, loadSessionMetadataFromBlob, readZipEntries };
1
+ import { a as ZipActionEntry, c as loadActionsFromZip, d as loadSessionMetadata, f as loadSessionMetadataFromBlob, i as RecordedAction, l as loadEntriesFromSubdir, m as toZipReader, n as GpsPathCoord, o as ZipSource, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, s as ZipSubdirEntry, t as Entry, u as loadGpsPathFromBlob } from "../zip-reader-BzENzMH6.js";
2
+ export { Entry, GpsPathCoord, MAX_ACTION_FILE_SIZE, RecordedAction, ZipActionEntry, ZipSource, ZipSubdirEntry, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadata, loadSessionMetadataFromBlob, readZipEntries, toZipReader };
@@ -18,6 +18,19 @@ import { BlobReader, TextWriter, Uint8ArrayReader, ZipReader } from "@zip.js/zip
18
18
  */
19
19
  const log = createLogger("ZipReader");
20
20
  /**
21
+ * Wrap a {@link ZipSource} in a fresh zip.js ZipReader.
22
+ *
23
+ * Exported deliberately: consumers outside this workspace resolve this
24
+ * module from the published dist at runtime and probe
25
+ * `typeof toZipReader === 'function'` as the capability marker for lazy
26
+ * Reader support before passing anything other than Uint8Array (older
27
+ * published versions accept only Uint8Array). Do not rename or remove
28
+ * without treating it as a breaking API change.
29
+ */
30
+ function toZipReader(source) {
31
+ return new ZipReader(source instanceof Uint8Array ? new Uint8ArrayReader(source) : source);
32
+ }
33
+ /**
21
34
  * Maximum allowed uncompressed size (in bytes) for a single action or
22
35
  * metadata JSON file inside a recording zip. Entries exceeding this limit
23
36
  * are rejected before decompression to prevent out-of-memory conditions
@@ -29,11 +42,11 @@ const MAX_ACTION_FILE_SIZE = 1048576;
29
42
  /**
30
43
  * Read all entries from a zip file.
31
44
  *
32
- * @param data - The zip file content as a Uint8Array
45
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
33
46
  * @returns Array of zip entries (directories and files)
34
47
  */
35
48
  async function readZipEntries(data) {
36
- const reader = new ZipReader(new Uint8ArrayReader(data));
49
+ const reader = toZipReader(data);
37
50
  try {
38
51
  return await reader.getEntries();
39
52
  } finally {
@@ -57,7 +70,7 @@ function extractActionIndex(filename) {
57
70
  * Filters for JSON files in the actions/ directory, parses them, and returns
58
71
  * them sorted by their filename index (chronological order for replay).
59
72
  *
60
- * @param data - The zip file content as a Uint8Array
73
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
61
74
  * @param maxFileSize - Maximum allowed uncompressed size per entry (defaults to MAX_ACTION_FILE_SIZE)
62
75
  * @returns Array of action entries sorted by index
63
76
  */
@@ -116,12 +129,12 @@ async function extractSessionMetadataFromReader(reader, maxFileSize) {
116
129
  * Returns null if session.json is absent (graceful degradation for
117
130
  * recordings created before the metadata writing bug was fixed).
118
131
  *
119
- * @param data - The zip file content as a Uint8Array
132
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
120
133
  * @param maxFileSize - Maximum allowed uncompressed size per entry (defaults to MAX_ACTION_FILE_SIZE)
121
134
  * @returns Parsed session metadata, or null if not found
122
135
  */
123
136
  async function loadSessionMetadata(data, maxFileSize = MAX_ACTION_FILE_SIZE) {
124
- return extractSessionMetadataFromReader(new ZipReader(new Uint8ArrayReader(data)), maxFileSize);
137
+ return extractSessionMetadataFromReader(toZipReader(data), maxFileSize);
125
138
  }
126
139
  /**
127
140
  * Load session metadata from session.json in a zip file provided as a Blob.
@@ -200,7 +213,7 @@ async function loadGpsPathFromBlob(blob, maxFileSize = MAX_ACTION_FILE_SIZE) {
200
213
  * `relativePath` for deterministic iteration. Returns an empty array when
201
214
  * the subdir is absent (graceful degradation for older zips).
202
215
  *
203
- * @param data - The zip file content as a Uint8Array
216
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
204
217
  * @param subdir - Top-level subdir to scan (no leading or trailing `/`)
205
218
  */
206
219
  async function loadEntriesFromSubdir(data, subdir) {
@@ -214,4 +227,4 @@ async function loadEntriesFromSubdir(data, subdir) {
214
227
  }));
215
228
  }
216
229
  //#endregion
217
- export { MAX_ACTION_FILE_SIZE, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadata, loadSessionMetadataFromBlob, readZipEntries };
230
+ export { MAX_ACTION_FILE_SIZE, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadata, loadSessionMetadataFromBlob, readZipEntries, toZipReader };
@@ -1,5 +1,5 @@
1
- import { t as MapData } from "./map-data-PNfGKGWx.js";
2
- import { t as SubscribableStore } from "./subscribe-to-selector-B9ylM5Oh.js";
1
+ import { t as MapData } from "./map-data-CUnTzRIC.js";
2
+ import { t as SubscribableStore } from "./subscribe-to-selector-dQV8SpsO.js";
3
3
  import { LatLong, Matrix4, Quaternion, Vector3 } from "gps-plus-slam-js";
4
4
 
5
5
  //#region ../src/state/store-subscribers.d.ts
@@ -24,7 +24,10 @@ interface StoreSubscriberDeps {
24
24
  * Map overlay — renders the shared trajectory snapshot. Nullable (not
25
25
  * present in all modes).
26
26
  *
27
- * `setGpsPosition` centers the map on the latest fix; `render` draws the
27
+ * `setGpsPosition` centers the map on the same coordinate the blue dot
28
+ * shows — the rebuilt `MapData.userPosition` (fused tip when aligned, raw
29
+ * fix before the first solve; raw also for a render-less overlay, which
30
+ * has no rebuilt snapshot to follow); `render` draws the
28
31
  * full {@link MapData} snapshot (raw GPS + accuracy circles, fused path,
29
32
  * alignment snapshots, user dot) via the shared `drawMapData` routine — the
30
33
  * SAME one the 2D session-summary map uses, so the live and summary maps
@@ -1,4 +1,4 @@
1
- import { N as CombinedRootState } from "./create-slam-app-store-D3nzh9Wb.js";
1
+ import { N as CombinedRootState } from "./create-slam-app-store-D1QSMuKu.js";
2
2
 
3
3
  //#region ../src/state/subscribe-to-selector.d.ts
4
4
  /**
@@ -424,6 +424,7 @@ var MockOPFSDirectoryHandle = class MockOPFSDirectoryHandle {
424
424
  getDirectoryHandle(name, options) {
425
425
  const handle = this.contents.get(name);
426
426
  if (handle && handle.kind === "directory") return Promise.resolve(handle);
427
+ if (handle) return Promise.reject(new DOMException(`${name} is not a directory`, "TypeMismatchError"));
427
428
  if (options?.create) {
428
429
  const newHandle = new MockOPFSDirectoryHandle(name);
429
430
  this.contents.set(name, newHandle);
@@ -434,6 +435,7 @@ var MockOPFSDirectoryHandle = class MockOPFSDirectoryHandle {
434
435
  getFileHandle(name, options) {
435
436
  const handle = this.contents.get(name);
436
437
  if (handle && handle.kind === "file") return Promise.resolve(handle);
438
+ if (handle) return Promise.reject(new DOMException(`${name} is not a file`, "TypeMismatchError"));
437
439
  if (options?.create) {
438
440
  const newHandle = new MockOPFSFileHandle(name, this, name);
439
441
  this.contents.set(name, newHandle);
@@ -1,4 +1,4 @@
1
- import { i as RecordedAction } from "../zip-reader-CvruaGvD.js";
1
+ import { i as RecordedAction } from "../zip-reader-BzENzMH6.js";
2
2
  import { LatLong } from "gps-plus-slam-js";
3
3
 
4
4
  //#region ../src/test-utils/zip-round-trip-helpers.d.ts
@@ -1,2 +1,2 @@
1
- import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-BlvGcIAk.js";
1
+ import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-Cfg0trC3.js";
2
2
  export { ArWorldGroupAlignmentHandle, ArWorldGroupAlignmentOptions, enableArWorldGroupAlignment };
@@ -1,2 +1,2 @@
1
- import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-C4bnNOEY.js";
1
+ import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-DDcNHkTb.js";
2
2
  export { nueToArLocal, worldNueToGps };
@@ -1,2 +1,2 @@
1
- import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-BjECcYnD.js";
1
+ import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-CEjGqEVD.js";
2
2
  export { GpsAnchor, GpsAnchorMode, GpsAnchorOptions, GpsAnchorPhase, GpsAnchorSamplePoint, createGpsAnchor };
@@ -1,19 +1,19 @@
1
1
  import { n as createCss3dRendererManager, t as Css3dRendererManager } from "../css3d-renderer-manager-CPpVtvgs.js";
2
2
  import { n as createCameraFollower, t as CameraFollower } from "../camera-follower-DfBm2J5i.js";
3
3
  import { n as createAlignmentLerper, t as AlignmentLerper } from "../alignment-lerper-gD70k7Fq.js";
4
- import { n as MapDataInput, r as buildMapData, t as MapData } from "../map-data-PNfGKGWx.js";
5
- import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-BlvGcIAk.js";
4
+ import { n as MapDataInput, r as buildMapData, t as MapData } from "../map-data-CUnTzRIC.js";
5
+ import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-Cfg0trC3.js";
6
6
  import { i as createGpsCompassCubes, n as COMPASS_CUBE_SIZE, r as GpsCompassCubes, t as COMPASS_CUBE_DISTANCE } from "../gps-compass-cubes-1mooS3BS.js";
7
7
  import { i as isSphereInCameraFrustum, n as isObjectInCameraFrustum, r as isPointInCameraFrustum, t as buildCameraFrustum } from "../frustum-visibility-CokkgS_i.js";
8
- import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-C4bnNOEY.js";
8
+ import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-DDcNHkTb.js";
9
9
  import { n as createReticleMesh, r as updateReticle, t as HitMatrix } from "../hit-test-reticle-CaQbrhbk.js";
10
- import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-BjECcYnD.js";
10
+ import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-CEjGqEVD.js";
11
11
  import { n as GpsEventVisualizer, r as gpsEventVisualizer } from "../gps-event-markers-Di2nBzx-.js";
12
- import { n as OcclusionMesh, r as OcclusionMeshOptions } from "../occlusion-mesh-b28lRJ6S.js";
13
- import { a as DEFAULT_Z_OFFSET, n as DEFAULT_LEAFLET_MAP_SIZE_PX, o as LeafletMapOverlay, r as DEFAULT_WORLD_SIZE, s as LeafletMapOverlayOptions } from "../leaflet-map-overlay-BOZFW5kT.js";
12
+ import { n as OcclusionMesh, r as OcclusionMeshOptions } from "../occlusion-mesh-kXCQ2FM1.js";
13
+ import { a as DEFAULT_Z_OFFSET, n as DEFAULT_LEAFLET_MAP_SIZE_PX, o as LeafletMapOverlay, r as DEFAULT_WORLD_SIZE, s as LeafletMapOverlayOptions } from "../leaflet-map-overlay-C8GS4cUy.js";
14
14
  import { n as clampedAlpha, t as DEFAULT_LERP_RATE } from "../lerp-utils-Qs8OhumS.js";
15
15
  import { a as addAccuracyCircles, i as AccuracyCircleSample, n as ACCURACY_CIRCLE_STROKE_OPACITY, r as ACCURACY_CIRCLE_WEIGHT, t as ACCURACY_CIRCLE_FILL_OPACITY } from "../accuracy-circles-DkWBkF5g.js";
16
- import { a as MAP_PATH_POLYLINE_OPACITY, c as USER_POSITION_COLOR, i as FUSED_PATH_COLOR, l as drawMapData, n as DrawMapDataOptions, o as MAP_PATH_POLYLINE_WEIGHT, r as DrawnMapData, s as RAW_GPS_COLOR, t as ALIGNMENT_SNAPSHOT_COLOR } from "../map-overlay-draw-DiroaJed.js";
16
+ import { a as MAP_PATH_POLYLINE_OPACITY, c as USER_POSITION_COLOR, i as FUSED_PATH_COLOR, l as drawMapData, n as DrawMapDataOptions, o as MAP_PATH_POLYLINE_WEIGHT, r as DrawnMapData, s as RAW_GPS_COLOR, t as ALIGNMENT_SNAPSHOT_COLOR } from "../map-overlay-draw-6WJeq0Kg.js";
17
17
  import { a as MapOverlayOptions, c as tileXYToLatLon, i as MapOverlay, n as DEFAULT_MAP_SIZE, o as TextureLoaderInterface, r as DEFAULT_ZOOM, s as latLonToTileXY, t as DEFAULT_HEIGHT_OFFSET } from "../map-overlay-BCQgvIgU.js";
18
18
  import { n as disposeMeshArray, r as disposeObject3D, t as DisposeOptions } from "../three-dispose-BMOAmPhb.js";
19
19
  import { t as VIS_COLORS } from "../vis-colors-C7HI0u9_.js";
@@ -5,7 +5,7 @@ import { createCameraFollower } from "./camera-follower.js";
5
5
  import { createAlignmentLerper } from "./alignment-lerper.js";
6
6
  import { VIS_COLORS } from "./vis-colors.js";
7
7
  import { COMPASS_CUBE_DISTANCE, COMPASS_CUBE_SIZE, createGpsCompassCubes } from "./gps-compass-cubes.js";
8
- import { t as buildMapData } from "../map-data-D7rpMC6f.js";
8
+ import { t as buildMapData } from "../map-data-1tF5gcYV.js";
9
9
  import { enableArWorldGroupAlignment } from "./ar-world-group-alignment.js";
10
10
  import { buildCameraFrustum, isObjectInCameraFrustum, isPointInCameraFrustum, isSphereInCameraFrustum } from "./frustum-visibility.js";
11
11
  import { nueToArLocal, worldNueToGps } from "./frame-conversions.js";
@@ -1,2 +1,2 @@
1
- import { a as DEFAULT_Z_OFFSET, i as DEFAULT_ZOOM, n as DEFAULT_LEAFLET_MAP_SIZE_PX, o as LeafletMapOverlay, r as DEFAULT_WORLD_SIZE, s as LeafletMapOverlayOptions, t as DEFAULT_HEIGHT_OFFSET } from "../leaflet-map-overlay-BOZFW5kT.js";
1
+ import { a as DEFAULT_Z_OFFSET, i as DEFAULT_ZOOM, n as DEFAULT_LEAFLET_MAP_SIZE_PX, o as LeafletMapOverlay, r as DEFAULT_WORLD_SIZE, s as LeafletMapOverlayOptions, t as DEFAULT_HEIGHT_OFFSET } from "../leaflet-map-overlay-C8GS4cUy.js";
2
2
  export { DEFAULT_HEIGHT_OFFSET, DEFAULT_LEAFLET_MAP_SIZE_PX, DEFAULT_WORLD_SIZE, DEFAULT_ZOOM, DEFAULT_Z_OFFSET, LeafletMapOverlay, LeafletMapOverlayOptions };
@@ -1,2 +1,2 @@
1
- import { n as MapDataInput, r as buildMapData, t as MapData } from "../map-data-PNfGKGWx.js";
1
+ import { n as MapDataInput, r as buildMapData, t as MapData } from "../map-data-CUnTzRIC.js";
2
2
  export { MapData, MapDataInput, buildMapData };
@@ -1,2 +1,2 @@
1
- import { t as buildMapData } from "../map-data-D7rpMC6f.js";
1
+ import { t as buildMapData } from "../map-data-1tF5gcYV.js";
2
2
  export { buildMapData };
@@ -1,2 +1,2 @@
1
- import { a as MAP_PATH_POLYLINE_OPACITY, c as USER_POSITION_COLOR, i as FUSED_PATH_COLOR, l as drawMapData, n as DrawMapDataOptions, o as MAP_PATH_POLYLINE_WEIGHT, r as DrawnMapData, s as RAW_GPS_COLOR, t as ALIGNMENT_SNAPSHOT_COLOR } from "../map-overlay-draw-DiroaJed.js";
1
+ import { a as MAP_PATH_POLYLINE_OPACITY, c as USER_POSITION_COLOR, i as FUSED_PATH_COLOR, l as drawMapData, n as DrawMapDataOptions, o as MAP_PATH_POLYLINE_WEIGHT, r as DrawnMapData, s as RAW_GPS_COLOR, t as ALIGNMENT_SNAPSHOT_COLOR } from "../map-overlay-draw-6WJeq0Kg.js";
2
2
  export { ALIGNMENT_SNAPSHOT_COLOR, DrawMapDataOptions, DrawnMapData, FUSED_PATH_COLOR, MAP_PATH_POLYLINE_OPACITY, MAP_PATH_POLYLINE_WEIGHT, RAW_GPS_COLOR, USER_POSITION_COLOR, drawMapData };
@@ -1,2 +1,2 @@
1
- import { a as occluderDepthFade, i as buildOccluderDepthShadeSnippet, n as OcclusionMesh, o as occluderFresnelRim, r as OcclusionMeshOptions, t as OCCLUDER_DEPTH_SHADE } from "../occlusion-mesh-b28lRJ6S.js";
1
+ import { a as occluderDepthFade, i as buildOccluderDepthShadeSnippet, n as OcclusionMesh, o as occluderFresnelRim, r as OcclusionMeshOptions, t as OCCLUDER_DEPTH_SHADE } from "../occlusion-mesh-kXCQ2FM1.js";
2
2
  export { OCCLUDER_DEPTH_SHADE, OcclusionMesh, OcclusionMeshOptions, buildOccluderDepthShadeSnippet, occluderDepthFade, occluderFresnelRim };
@@ -1,6 +1,6 @@
1
1
  import { i as DepthSample, t as ARPose } from "./ar-types-Cc5yvBwn.js";
2
2
  import { i as DepthSamplerConfig, t as DepthInfo } from "./depth-sampler-CwObAwEA.js";
3
- import { t as ArCrashIsolationOptions } from "./recording-options-vASCFzc5.js";
3
+ import { t as ArCrashIsolationOptions } from "./recording-options-DYKWVI93.js";
4
4
  import { i as FrameQualityVerdict, n as CapturedImage, o as ImageCaptureConfig, t as CapturedFrame } from "./image-capture-Bp6Pd4Md.js";
5
5
  import { a as TrackingSliceState, r as ResetTransformData } from "./tracking-slice-DMkHlbny.js";
6
6
  import { o as RgbaImage } from "./qr-frontend-BPURlh3S.js";
@@ -1,6 +1,32 @@
1
- import { Entry, Entry as Entry$1 } from "@zip.js/zip.js";
1
+ import { Entry, Entry as Entry$1, Reader, ZipReader } from "@zip.js/zip.js";
2
2
 
3
3
  //#region ../src/storage/zip-reader.d.ts
4
+ /**
5
+ * Input accepted by the zip-reading helpers: either the full zip bytes
6
+ * (the original behavior) or any zip.js {@link Reader} — e.g. a ranged
7
+ * reader over a file descriptor — so callers scanning many large archives
8
+ * can read only the central directory + the entries they open instead of
9
+ * loading whole files into memory.
10
+ *
11
+ * Reader contract: a single Reader instance may back several helper calls
12
+ * concurrently (see `loadRecording` in gps-plus-slam-recorder, which fans
13
+ * out over three helpers via Promise.all), so `init()` must be idempotent
14
+ * and `readUint8Array(index, length)` must support interleaved ranged reads.
15
+ * The caller owns the underlying resource lifecycle (helpers close their
16
+ * ZipReader wrappers, never the Reader's resource).
17
+ */
18
+ type ZipSource = Uint8Array | Reader<unknown>;
19
+ /**
20
+ * Wrap a {@link ZipSource} in a fresh zip.js ZipReader.
21
+ *
22
+ * Exported deliberately: consumers outside this workspace resolve this
23
+ * module from the published dist at runtime and probe
24
+ * `typeof toZipReader === 'function'` as the capability marker for lazy
25
+ * Reader support before passing anything other than Uint8Array (older
26
+ * published versions accept only Uint8Array). Do not rename or remove
27
+ * without treating it as a breaking API change.
28
+ */
29
+ declare function toZipReader(source: ZipSource): ZipReader<unknown>;
4
30
  /**
5
31
  * Maximum allowed uncompressed size (in bytes) for a single action or
6
32
  * metadata JSON file inside a recording zip. Entries exceeding this limit
@@ -29,32 +55,32 @@ interface ZipActionEntry {
29
55
  /**
30
56
  * Read all entries from a zip file.
31
57
  *
32
- * @param data - The zip file content as a Uint8Array
58
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
33
59
  * @returns Array of zip entries (directories and files)
34
60
  */
35
- declare function readZipEntries(data: Uint8Array): Promise<Entry[]>;
61
+ declare function readZipEntries(data: ZipSource): Promise<Entry[]>;
36
62
  /**
37
63
  * Load all recorded Redux actions from a zip file.
38
64
  *
39
65
  * Filters for JSON files in the actions/ directory, parses them, and returns
40
66
  * them sorted by their filename index (chronological order for replay).
41
67
  *
42
- * @param data - The zip file content as a Uint8Array
68
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
43
69
  * @param maxFileSize - Maximum allowed uncompressed size per entry (defaults to MAX_ACTION_FILE_SIZE)
44
70
  * @returns Array of action entries sorted by index
45
71
  */
46
- declare function loadActionsFromZip(data: Uint8Array, maxFileSize?: number): Promise<ZipActionEntry[]>;
72
+ declare function loadActionsFromZip(data: ZipSource, maxFileSize?: number): Promise<ZipActionEntry[]>;
47
73
  /**
48
74
  * Load session metadata from session.json in the zip file.
49
75
  *
50
76
  * Returns null if session.json is absent (graceful degradation for
51
77
  * recordings created before the metadata writing bug was fixed).
52
78
  *
53
- * @param data - The zip file content as a Uint8Array
79
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
54
80
  * @param maxFileSize - Maximum allowed uncompressed size per entry (defaults to MAX_ACTION_FILE_SIZE)
55
81
  * @returns Parsed session metadata, or null if not found
56
82
  */
57
- declare function loadSessionMetadata(data: Uint8Array, maxFileSize?: number): Promise<Record<string, unknown> | null>;
83
+ declare function loadSessionMetadata(data: ZipSource, maxFileSize?: number): Promise<Record<string, unknown> | null>;
58
84
  /**
59
85
  * Load session metadata from session.json in a zip file provided as a Blob.
60
86
  *
@@ -126,9 +152,9 @@ interface ZipSubdirEntry {
126
152
  * `relativePath` for deterministic iteration. Returns an empty array when
127
153
  * the subdir is absent (graceful degradation for older zips).
128
154
  *
129
- * @param data - The zip file content as a Uint8Array
155
+ * @param data - The zip content as a Uint8Array, or a zip.js Reader for lazy access
130
156
  * @param subdir - Top-level subdir to scan (no leading or trailing `/`)
131
157
  */
132
- declare function loadEntriesFromSubdir(data: Uint8Array, subdir: string): Promise<ZipSubdirEntry[]>;
158
+ declare function loadEntriesFromSubdir(data: ZipSource, subdir: string): Promise<ZipSubdirEntry[]>;
133
159
  //#endregion
134
- export { ZipActionEntry as a, loadEntriesFromSubdir as c, loadSessionMetadataFromBlob as d, readZipEntries as f, RecordedAction as i, loadGpsPathFromBlob as l, GpsPathCoord as n, ZipSubdirEntry as o, MAX_ACTION_FILE_SIZE as r, loadActionsFromZip as s, Entry$1 as t, loadSessionMetadata as u };
160
+ export { ZipActionEntry as a, loadActionsFromZip as c, loadSessionMetadata as d, loadSessionMetadataFromBlob as f, RecordedAction as i, loadEntriesFromSubdir as l, toZipReader as m, GpsPathCoord as n, ZipSource as o, readZipEntries as p, MAX_ACTION_FILE_SIZE as r, ZipSubdirEntry as s, Entry$1 as t, loadGpsPathFromBlob as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gps-plus-slam-app-framework",
3
- "version": "1.8.0",
3
+ "version": "1.9.1",
4
4
  "description": "Reusable AR+GPS app framework layer — WebXR session management, Three.js visualization, GPS sensors, storage abstractions, replay engine, and store wiring for gps-plus-slam-js.",
5
5
  "type": "module",
6
6
  "files": [
@@ -31,12 +31,12 @@
31
31
  },
32
32
  "types": "./dist/index.d.ts",
33
33
  "engines": {
34
- "node": ">=20.19.0"
34
+ "node": ">=22.14.0"
35
35
  },
36
36
  "dependencies": {
37
37
  "@reduxjs/toolkit": "^2.11.2",
38
38
  "gl-matrix": "3.4.4",
39
- "gps-plus-slam-js": "^1.8.0"
39
+ "gps-plus-slam-js": "^1.9.1"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@sentry/browser": ">=10.0.0",
@@ -58,6 +58,7 @@
58
58
  "@sentry/browser": "^10.53.1",
59
59
  "@types/leaflet": "^1.9.21",
60
60
  "@types/node": "^25.7.0",
61
+ "@types/qrcode": "^1.5.6",
61
62
  "@types/three": "^0.184.1",
62
63
  "@vitest/coverage-v8": "^4.1.6",
63
64
  "@vitest/eslint-plugin": "^1.6.17",
@@ -71,6 +72,7 @@
71
72
  "jsdom": "^29.1.1",
72
73
  "leaflet": "^1.9.4",
73
74
  "prettier": "^3.8.3",
75
+ "qrcode": "^1.5.4",
74
76
  "three": "^0.184.0",
75
77
  "tsdown": "^0.22.0",
76
78
  "typescript": "^6.0.3",
@@ -109,6 +111,8 @@
109
111
  "typecheck:tests": "tsc -p tsconfig.vitest.json --noEmit",
110
112
  "lint": "eslint . --config config/eslint.config.mjs --max-warnings 37",
111
113
  "test:watch": "vitest --config config/vitest.config.ts",
114
+ "bench": "vitest bench --run --config config/vitest.bench.config.ts",
115
+ "bench:watch": "vitest bench --config config/vitest.bench.config.ts",
112
116
  "check:cycles": "dpdm -T --exit-code circular:1 --no-warning --no-tree ./src/index.ts",
113
117
  "setup": "bash ./scripts/setup.sh"
114
118
  }
@@ -1,2 +0,0 @@
1
- import { ArImageCapture as ArImageCapture$1, GpsPoint as GpsPoint$1, LatLong as LatLong$1, LatLongAlt, Matrix4 as Matrix4$1, Quaternion as Quaternion$1, RootState as LibraryRootState, RootState as RootState$1, Vector3 as Vector3$1, arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords as calcGpsCoords$1, calcRelativeCoordsInMeters, createGpsSlamStore, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey as validateLicenseKey$1, webxrToNUE } from "gps-plus-slam-js";
2
- export { odometryTrackingRestarted as _, LibraryRootState as a, RootState$1 as c, bearingDeltaDeg as d, calcGpsCoords$1 as f, magneticHeadingFromEnuQuat as g, isIdentityMatrix4 as h, LatLongAlt as i, Vector3$1 as l, createGpsSlamStore as m, GpsPoint$1 as n, Matrix4$1 as o, calcRelativeCoordsInMeters as p, LatLong$1 as r, Quaternion$1 as s, ArImageCapture$1 as t, arNorthBearingDeg as u, validateLicenseKey$1 as v, webxrToNUE as y };