gps-plus-slam-app-framework 1.3.0 → 1.7.0

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 (247) hide show
  1. package/dist/absolute-orientation-CAEh840t.d.ts +54 -0
  2. package/dist/{app-selectors-B8VQoMDY.d.ts → app-selectors-ikTUQZpe.d.ts} +1 -1
  3. package/dist/ar/bresenham3d.d.ts +1 -1
  4. package/dist/ar/camera-blit-capture.d.ts +2 -2
  5. package/dist/ar/camera-blit-capture.js +74 -9
  6. package/dist/ar/capability-checker.d.ts +1 -1
  7. package/dist/ar/capture-failure-tracker.d.ts +1 -1
  8. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  9. package/dist/ar/depth-grid-lookup.d.ts +2 -0
  10. package/dist/ar/depth-grid-lookup.js +43 -0
  11. package/dist/ar/depth-sampler.d.ts +2 -2
  12. package/dist/ar/depth-sampler.js +2 -4
  13. package/dist/ar/depth-unprojection.d.ts +1 -1
  14. package/dist/ar/enable-gps-ar.d.ts +1 -1
  15. package/dist/ar/enable-gps-ar.js +26 -1
  16. package/dist/ar/frame-loop.d.ts +1 -1
  17. package/dist/ar/image-capture.d.ts +2 -2
  18. package/dist/ar/image-capture.js +1 -154
  19. package/dist/ar/image-quality.d.ts +2 -0
  20. package/dist/ar/image-quality.js +168 -0
  21. package/dist/ar/index.d.ts +31 -19
  22. package/dist/ar/index.js +17 -5
  23. package/dist/ar/occupancy-grid.d.ts +1 -1
  24. package/dist/ar/occupancy-grid.js +29 -2
  25. package/dist/ar/planar-pnp.d.ts +2 -0
  26. package/dist/ar/planar-pnp.js +425 -0
  27. package/dist/ar/qr-debug-view.d.ts +2 -0
  28. package/dist/ar/qr-debug-view.js +89 -0
  29. package/dist/ar/qr-derived-pose.d.ts +2 -0
  30. package/dist/ar/qr-derived-pose.js +114 -0
  31. package/dist/ar/qr-detection-controller.d.ts +2 -0
  32. package/dist/ar/qr-detection-controller.js +2 -0
  33. package/dist/ar/qr-frontend.d.ts +2 -0
  34. package/dist/ar/qr-frontend.js +60 -0
  35. package/dist/ar/qr-pose.d.ts +2 -0
  36. package/dist/ar/qr-pose.js +267 -0
  37. package/dist/ar/qr-size-depth-context.d.ts +3 -0
  38. package/dist/ar/qr-size-depth-context.js +42 -0
  39. package/dist/ar/qr-size-measurer.d.ts +2 -0
  40. package/dist/ar/qr-size-measurer.js +2 -0
  41. package/dist/ar/replay-scene.d.ts +1 -1
  42. package/dist/ar/replay-scene.js +1 -1
  43. package/dist/ar/scene-node-names.d.ts +1 -1
  44. package/dist/ar/webxr-nue-basis.d.ts +1 -1
  45. package/dist/ar/webxr-session.d.ts +4 -4
  46. package/dist/ar/webxr-session.js +2 -2
  47. package/dist/ar/xr-camera-texture.d.ts +1 -1
  48. package/dist/ar/xr-error-handler.d.ts +1 -1
  49. package/dist/ar/xr-frame-loop.d.ts +1 -1
  50. package/dist/ar-MFpFlV7j.js +382 -0
  51. package/dist/{ar-world-group-alignment-C9lwwIyI.d.ts → ar-world-group-alignment-69fgnB39.d.ts} +1 -1
  52. package/dist/{camera-blit-capture-CnxUDbKx.d.ts → camera-blit-capture-NKT9H5-e.d.ts} +57 -4
  53. package/dist/capture-motion-gate-0Yl2NpQG.d.ts +24 -0
  54. package/dist/capture-motion-gate-4EscNZCw.js +94 -0
  55. package/dist/concurrency-By0oOTZt.d.ts +50 -0
  56. package/dist/core/index.d.ts +2 -2
  57. package/dist/core/index.js +2 -2
  58. package/dist/create-slam-app-store-DkCHOpvb.js +149 -0
  59. package/dist/{create-slam-app-store-BljusOua.d.ts → create-slam-app-store-n_VF63D5.d.ts} +50 -40
  60. package/dist/depth-grid-lookup-DQ-IYhO3.d.ts +21 -0
  61. package/dist/{depth-sampler-Bhanfwla.d.ts → depth-sampler-asc8exHt.d.ts} +1 -1
  62. package/dist/{depth-unprojection-Y6i_mJuT.d.ts → depth-unprojection-DjsbJW9L.d.ts} +1 -1
  63. package/dist/{enable-gps-ar-BfUJOgpW.d.ts → enable-gps-ar-DkNhFv4Y.d.ts} +4 -4
  64. package/dist/{frame-conversions-BfsafGWR.d.ts → frame-conversions-DObhj8Wf.d.ts} +1 -1
  65. package/dist/{fused-path-DJoVu98b.d.ts → fused-path-v6eOmLl3.d.ts} +1 -1
  66. package/dist/geo/h3-proximity.d.ts +2 -2
  67. package/dist/geo/h3-proximity.js +61 -2
  68. package/dist/geo/index.d.ts +2 -2
  69. package/dist/geo/index.js +2 -2
  70. package/dist/geodesic-angle-BTldfFgs.js +39 -0
  71. package/dist/{gps-anchor-dYeCvvp5.d.ts → gps-anchor-BeFO2RYa.d.ts} +1 -1
  72. package/dist/{gps-ar-pose-sampler-DVb96iOy.d.ts → gps-ar-pose-sampler-DHMZmYAc.d.ts} +1 -1
  73. package/dist/{gps-event-coordinator-CWIDOk4U.d.ts → gps-event-coordinator-CjWW636x.d.ts} +21 -11
  74. package/dist/{gps-event-markers-Dc9FT-q1.d.ts → gps-event-markers-Cz9RMA2k.d.ts} +18 -0
  75. package/dist/{h3-proximity-I1msGPgE.d.ts → h3-proximity-C-j0pw1j.d.ts} +39 -1
  76. package/dist/image-capture-B2-b6tKK.js +374 -0
  77. package/dist/{image-capture-qAZ5Fh5X.d.ts → image-capture-CNZDrQXG.d.ts} +103 -3
  78. package/dist/image-quality-smCBoFj1.d.ts +158 -0
  79. package/dist/index-BAPokxMb.d.ts +22 -0
  80. package/dist/{index-BYYUdf9v.d.ts → index-BODDUTvD.d.ts} +1 -1
  81. package/dist/index-BneSj4_5.d.ts +399 -0
  82. package/dist/index-_Rhgoqkh.d.ts +2 -0
  83. package/dist/index.d.ts +80 -67
  84. package/dist/index.js +24 -12
  85. package/dist/{leaflet-map-overlay-6CJC-E1l.d.ts → leaflet-map-overlay-CmIyiE8n.d.ts} +1 -1
  86. package/dist/{map-data-CkloBxIl.d.ts → map-data-B4oEehUh.d.ts} +1 -1
  87. package/dist/{map-overlay-draw-krOKwDAq.d.ts → map-overlay-draw-ymz1s7fG.d.ts} +1 -1
  88. package/dist/{null-storage-backend-uKQE8tl7.d.ts → null-storage-backend-B9rtyDfG.d.ts} +2 -2
  89. package/dist/{occupancy-grid-BRNRaPyT.d.ts → occupancy-grid-DnOc-6PU.d.ts} +12 -2
  90. package/dist/{opfs-storage-D5zAn_lx.d.ts → opfs-storage-3VZh-qH6.d.ts} +23 -4
  91. package/dist/{opfs-storage-backend-6aYMUZlJ.d.ts → opfs-storage-backend-JJiUJo-3.d.ts} +3 -3
  92. package/dist/{persistence-middleware-B9ei4Nhx.d.ts → persistence-middleware-DAPTTwB2.d.ts} +1 -1
  93. package/dist/planar-pnp-my9bqULS.d.ts +67 -0
  94. package/dist/qr-debug-view-Brl73HGO.d.ts +29 -0
  95. package/dist/qr-derived-pose-CmxTP2m4.d.ts +122 -0
  96. package/dist/qr-detected-slice-VQssZmQJ.d.ts +166 -0
  97. package/dist/qr-detection-controller-B-tLVd-S.js +119 -0
  98. package/dist/qr-detection-controller-CDurHv8E.d.ts +48 -0
  99. package/dist/qr-frontend--fFX25mV.d.ts +58 -0
  100. package/dist/qr-pose-D2rfu5DA.d.ts +138 -0
  101. package/dist/qr-pose-aggregation-B7tWJq7j.d.ts +90 -0
  102. package/dist/qr-pose-aggregation-DBiaLW0O.js +191 -0
  103. package/dist/qr-size-depth-context-CeAG53fy.d.ts +13 -0
  104. package/dist/qr-size-measurer-DLb33geH.js +596 -0
  105. package/dist/qr-size-measurer-DQdAsid1.d.ts +165 -0
  106. package/dist/recording-options-BPCpMHLK.d.ts +514 -0
  107. package/dist/{recording-replayer-r0DZ9ALp.d.ts → recording-replayer-DQKpAGyQ.d.ts} +2 -2
  108. package/dist/recording-slice-DaxHZvNu.d.ts +55 -0
  109. package/dist/{replay-engine-XpDa0dy1.d.ts → replay-engine-CmKh_4wf.d.ts} +7 -4
  110. package/dist/{replay-scene-Bw58VL6p.d.ts → replay-scene-DBlDrV_x.d.ts} +3 -3
  111. package/dist/sensors/absolute-orientation.d.ts +2 -0
  112. package/dist/sensors/absolute-orientation.js +145 -0
  113. package/dist/sensors/gps-error-handler.d.ts +1 -1
  114. package/dist/sensors/gps.d.ts +1 -1
  115. package/dist/sensors/index.d.ts +5 -4
  116. package/dist/sensors/index.js +2 -1
  117. package/dist/sensors/permission-checker.d.ts +1 -1
  118. package/dist/sensors/permission-checker.js +1 -1
  119. package/dist/state/app-selectors.d.ts +1 -1
  120. package/dist/state/combined-root-state.d.ts +1 -1
  121. package/dist/state/create-slam-app-store.d.ts +1 -1
  122. package/dist/state/create-slam-app-store.js +1 -74
  123. package/dist/state/gps-ar-pose-sampler.d.ts +3 -3
  124. package/dist/state/gps-event-coordinator.d.ts +2 -2
  125. package/dist/state/gps-event-coordinator.js +27 -17
  126. package/dist/state/index.d.ts +20 -17
  127. package/dist/state/index.js +5 -4
  128. package/dist/state/persistence-middleware.d.ts +1 -1
  129. package/dist/state/persistence-middleware.js +30 -19
  130. package/dist/state/qr-detected-slice.d.ts +4 -0
  131. package/dist/state/qr-detected-slice.js +311 -0
  132. package/dist/state/recording-options.d.ts +2 -2
  133. package/dist/state/recording-options.js +273 -7
  134. package/dist/state/recording-replayer.d.ts +2 -2
  135. package/dist/state/recording-replayer.js +1 -1
  136. package/dist/state/recording-slice.d.ts +1 -1
  137. package/dist/state/recording-slice.js +5 -1
  138. package/dist/state/replay-engine.d.ts +1 -1
  139. package/dist/state/replay-engine.js +7 -3
  140. package/dist/state/store-subscribers.d.ts +2 -2
  141. package/dist/state/subscribe-to-selector.d.ts +1 -1
  142. package/dist/state/tracking-quality.d.ts +2 -2
  143. package/dist/state/tracking-quality.js +40 -128
  144. package/dist/state/tracking-slice.d.ts +1 -1
  145. package/dist/{state-BkIfpiyA.js → state-E51QT_-j.js} +2 -1
  146. package/dist/storage/file-system-utils.d.ts +1 -1
  147. package/dist/storage/index.d.ts +9 -9
  148. package/dist/storage/index.js +4 -4
  149. package/dist/storage/null-storage-backend.d.ts +1 -1
  150. package/dist/storage/opfs-storage-backend.d.ts +1 -1
  151. package/dist/storage/opfs-storage-backend.js +3 -3
  152. package/dist/storage/opfs-storage.d.ts +1 -1
  153. package/dist/storage/opfs-storage.js +5 -4
  154. package/dist/storage/storage-backend.d.ts +1 -1
  155. package/dist/storage/zip-coverage-embed.d.ts +2 -0
  156. package/dist/storage/zip-coverage-embed.js +88 -0
  157. package/dist/storage/zip-export.d.ts +2 -2
  158. package/dist/storage/zip-export.js +37 -59
  159. package/dist/storage/zip-reader.d.ts +1 -1
  160. package/dist/{storage-backend-Do6YDpNo.d.ts → storage-backend-BdVLD0dU.d.ts} +1 -1
  161. package/dist/{store-subscribers-0YWyOLvV.d.ts → store-subscribers-CA6AJH_8.d.ts} +2 -2
  162. package/dist/{subscribe-to-selector-CZ6k1NFP.d.ts → subscribe-to-selector-B6EUmQ3I.d.ts} +1 -1
  163. package/dist/test-utils/browser-mocks.d.ts +7 -1
  164. package/dist/test-utils/browser-mocks.js +6 -0
  165. package/dist/test-utils/zip-round-trip-helpers.d.ts +9 -1
  166. package/dist/test-utils/zip-round-trip-helpers.js +5 -1
  167. package/dist/{tracking-slice-CdK8c-8P.d.ts → tracking-slice-BuAZxXZ5.d.ts} +1 -1
  168. package/dist/types/ar-types.d.ts +1 -1
  169. package/dist/types/geo-types.d.ts +1 -1
  170. package/dist/types/index.d.ts +2 -2
  171. package/dist/utils/concurrency.d.ts +2 -2
  172. package/dist/utils/concurrency.js +66 -2
  173. package/dist/utils/failure-tracker.d.ts +1 -1
  174. package/dist/utils/format-file-size.d.ts +1 -1
  175. package/dist/utils/fused-path.d.ts +1 -1
  176. package/dist/utils/index.d.ts +8 -7
  177. package/dist/utils/index.js +2 -1
  178. package/dist/utils/list-formatter.d.ts +1 -1
  179. package/dist/utils/logger.d.ts +1 -1
  180. package/dist/visualization/accuracy-circles.d.ts +1 -1
  181. package/dist/visualization/alignment-lerper.d.ts +1 -1
  182. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  183. package/dist/visualization/ar-world-group-alignment.js +1 -1
  184. package/dist/visualization/camera-follower.d.ts +1 -1
  185. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  186. package/dist/visualization/frame-conversions.d.ts +1 -1
  187. package/dist/visualization/frustum-visibility.d.ts +1 -1
  188. package/dist/visualization/gps-anchor.d.ts +1 -1
  189. package/dist/visualization/gps-compass-cubes.d.ts +1 -1
  190. package/dist/visualization/gps-event-markers.d.ts +1 -1
  191. package/dist/visualization/gps-event-markers.js +40 -5
  192. package/dist/visualization/hit-test-reticle.d.ts +1 -1
  193. package/dist/visualization/hit-test-reticle.js +1 -0
  194. package/dist/visualization/index.d.ts +18 -18
  195. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  196. package/dist/visualization/leaflet-map-overlay.js +15 -3
  197. package/dist/visualization/lerp-utils.d.ts +1 -1
  198. package/dist/visualization/map-data.d.ts +1 -1
  199. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  200. package/dist/visualization/map-overlay.d.ts +1 -1
  201. package/dist/visualization/three-dispose.d.ts +1 -1
  202. package/dist/visualization/vis-colors.d.ts +1 -1
  203. package/dist/{webxr-session-TIaD883f.js → webxr-session-DG-eNfny.js} +244 -11
  204. package/dist/{webxr-session-GjZ2BIpS.d.ts → webxr-session-Do5L6G3B.d.ts} +86 -8
  205. package/dist/zip-coverage-embed-DCAREVmw.d.ts +41 -0
  206. package/dist/{zip-export-G14hkSPG.d.ts → zip-export-ol0S_Ofd.d.ts} +27 -23
  207. package/package.json +2 -2
  208. package/dist/concurrency-CO1FQvs3.d.ts +0 -24
  209. package/dist/file-system-CwXTNHmB.d.ts +0 -114
  210. package/dist/index-CF05QV2m.d.ts +0 -2
  211. package/dist/recording-options-DJBXuMxV.d.ts +0 -182
  212. package/dist/recording-slice-89O07ebs.d.ts +0 -36
  213. package/dist/storage/file-system.d.ts +0 -2
  214. package/dist/storage/file-system.js +0 -289
  215. /package/dist/{accuracy-circles-BpwWAs8G.d.ts → accuracy-circles-BtqOP_v1.d.ts} +0 -0
  216. /package/dist/{alignment-lerper-Dm9G7JJO.d.ts → alignment-lerper-Bil6vbVw.d.ts} +0 -0
  217. /package/dist/{ar-types-Dan1MVTi.d.ts → ar-types-BFX2r1wk.d.ts} +0 -0
  218. /package/dist/{bresenham3d-CFfd7n6B.d.ts → bresenham3d-CU1Gv2W4.d.ts} +0 -0
  219. /package/dist/{camera-follower-C2mwEn7c.d.ts → camera-follower-CqJJ7zRj.d.ts} +0 -0
  220. /package/dist/{capability-checker-CQXJHxXg.d.ts → capability-checker-DUQLg6gq.d.ts} +0 -0
  221. /package/dist/{capture-failure-tracker-CUeU3L_M.d.ts → capture-failure-tracker-gsm8q7yi.d.ts} +0 -0
  222. /package/dist/{chromium-camera-access-workaround-Jqbn0apH.d.ts → chromium-camera-access-workaround-D4K2uwwQ.d.ts} +0 -0
  223. /package/dist/{css3d-renderer-manager-ptu_t3B3.d.ts → css3d-renderer-manager-B3kGNtcn.d.ts} +0 -0
  224. /package/dist/{failure-tracker-Cn8Fo9D4.d.ts → failure-tracker-BO7M7jF_.d.ts} +0 -0
  225. /package/dist/{file-system-utils-CXIoL-DM.d.ts → file-system-utils-DOajnMm-.d.ts} +0 -0
  226. /package/dist/{format-file-size-CLCZz3lC.d.ts → format-file-size-Dc98ulzB.d.ts} +0 -0
  227. /package/dist/{frame-loop-CMewS8cY.d.ts → frame-loop-CpVjQ1dH.d.ts} +0 -0
  228. /package/dist/{frustum-visibility-CmI96ESS.d.ts → frustum-visibility-CeoCZchO.d.ts} +0 -0
  229. /package/dist/{geo-types-SaPnIEUM.d.ts → geo-types-3Ip1NzVR.d.ts} +0 -0
  230. /package/dist/{gps-VuezJWK3.d.ts → gps-BBO3hKfT.d.ts} +0 -0
  231. /package/dist/{gps-compass-cubes-BM1uGiYV.d.ts → gps-compass-cubes-DSN87L8p.d.ts} +0 -0
  232. /package/dist/{gps-error-handler-CJl_2MVm.d.ts → gps-error-handler-BbPsfw-_.d.ts} +0 -0
  233. /package/dist/{hit-test-reticle-BEzEybxZ.d.ts → hit-test-reticle-DV-2TpB9.d.ts} +0 -0
  234. /package/dist/{lerp-utils-BpV-0Dtk.d.ts → lerp-utils-BLmHhkVe.d.ts} +0 -0
  235. /package/dist/{list-formatter-RRcBe8Vg.d.ts → list-formatter-KNMS0ay2.d.ts} +0 -0
  236. /package/dist/{logger-BEHXsnnq.d.ts → logger-CLnPrHiD.d.ts} +0 -0
  237. /package/dist/{map-overlay-bcogY5fK.d.ts → map-overlay-Dh2B97MP.d.ts} +0 -0
  238. /package/dist/{permission-checker-GpAiSCwd.d.ts → permission-checker-CDuI8BwC.d.ts} +0 -0
  239. /package/dist/{scene-node-names-Bu0S66H1.d.ts → scene-node-names-BiShOQDB.d.ts} +0 -0
  240. /package/dist/{session-disposers-M-oashRH.js → session-disposers-zv9OGXPB.js} +0 -0
  241. /package/dist/{three-dispose-D950t71B.d.ts → three-dispose-Bt1k7WKh.d.ts} +0 -0
  242. /package/dist/{vis-colors-D6omC64K.d.ts → vis-colors-Obw2pLqT.d.ts} +0 -0
  243. /package/dist/{webxr-nue-basis-CqKQmZzT.d.ts → webxr-nue-basis-3nfjDJJp.d.ts} +0 -0
  244. /package/dist/{xr-camera-texture-DBwCaKTd.d.ts → xr-camera-texture-Cva1q3Qj.d.ts} +0 -0
  245. /package/dist/{xr-error-handler-C0AQRmxs.d.ts → xr-error-handler-CtvHpjfm.d.ts} +0 -0
  246. /package/dist/{xr-frame-loop-BtYytZJg.d.ts → xr-frame-loop-DIYtRcUa.d.ts} +0 -0
  247. /package/dist/{zip-reader-DSEXt7K6.d.ts → zip-reader-D9iPQwdQ.d.ts} +0 -0
@@ -1,4 +1,6 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
+ import { t as DEFAULT_MOTION_FILTER } from "../capture-motion-gate-4EscNZCw.js";
3
+ import { DEFAULT_QUALITY_FILTER } from "../ar/image-quality.js";
2
4
  //#region ../src/state/recording-options.ts
3
5
  /**
4
6
  * Recording Options - User-configurable settings for data capture.
@@ -31,7 +33,9 @@ const DEFAULT_RECORDING_OPTIONS = {
31
33
  enabled: true,
32
34
  intervalMs: 2e3,
33
35
  quality: .7,
34
- resolutionDivisor: 1
36
+ resolutionDivisor: 1,
37
+ motionFilter: { ...DEFAULT_MOTION_FILTER },
38
+ qualityFilter: { ...DEFAULT_QUALITY_FILTER }
35
39
  },
36
40
  arCrashIsolation: {
37
41
  enableDomOverlay: true,
@@ -40,6 +44,27 @@ const DEFAULT_RECORDING_OPTIONS = {
40
44
  enableCss3dRenderer: true,
41
45
  enableCameraTextureAcquisition: true,
42
46
  applyChromiumProjectionLayerWorkaround: true
47
+ },
48
+ occupancy: {
49
+ cellSizeM: .15,
50
+ minConfidence: 3
51
+ },
52
+ frameTileDisplay: { divisor: 2 },
53
+ visualization: {
54
+ frameTiles: true,
55
+ occupancyCubes: true,
56
+ gpsAlignmentMarkers: true,
57
+ compassCubes: true
58
+ },
59
+ qr: {
60
+ enabled: false,
61
+ intervalMs: 125,
62
+ captureSize: 1024
63
+ },
64
+ compassDebug: {
65
+ coldStartOverride: true,
66
+ rotationPrior: false,
67
+ webXRConsistency: false
43
68
  }
44
69
  };
45
70
  /** Validation constraints for depth options */
@@ -74,6 +99,125 @@ const IMAGE_CONSTRAINTS = {
74
99
  }
75
100
  };
76
101
  /**
102
+ * Validation constraints for the motion-filter (blurry-frame gate) thresholds.
103
+ *
104
+ * The velocity ranges (0.05–5) bracket the plausible scanning regime: below
105
+ * ~0.05 the gate would reject almost everything; above ~5 rad/s ≈ 286°/s (or
106
+ * 5 m/s) it would never reject, so the gate would be inert. `maxWaitMs` is
107
+ * clamped to 0.5–20 s — the never-calm fallback must always be able to fire.
108
+ * All three back a (currently advanced/hidden) settings slider, so a corrupt
109
+ * stored value can never disable capture. The default thresholds themselves are
110
+ * placeholders pending on-device field tuning (plan §7).
111
+ */
112
+ const MOTION_FILTER_CONSTRAINTS = {
113
+ maxAngularVelocity: {
114
+ min: .05,
115
+ max: 5,
116
+ step: .05
117
+ },
118
+ maxLinearVelocity: {
119
+ min: .05,
120
+ max: 5,
121
+ step: .05
122
+ },
123
+ maxWaitMs: {
124
+ min: 500,
125
+ max: 2e4,
126
+ step: 500
127
+ }
128
+ };
129
+ /**
130
+ * Validation constraints for the image-quality (blur/blackness) gate thresholds.
131
+ *
132
+ * `blurRelativeThreshold` (`k` in `sharpness < k·median`) is clamped to
133
+ * 0.05–0.95: it is a fraction of the recent sharpness median, so values must sit
134
+ * strictly inside (0, 1) — at ~0 the blur check never rejects, near 1 it rejects
135
+ * almost everything. `minMeanLuminance` (the absolute black cutoff on a 0–255
136
+ * luma scale) is clamped to 0–128: 0 disables the black check, and a cutoff
137
+ * above mid-grey would reject normally-lit frames. `maxWaitMs` mirrors the motion
138
+ * gate's range (0.5–20 s) so the never-good fallback can always fire. All back a
139
+ * (currently advanced/hidden) settings slider, so a corrupt stored value can
140
+ * never disable capture. The default thresholds are placeholders pending
141
+ * on-device field tuning (plan §5, §10).
142
+ */
143
+ const QUALITY_FILTER_CONSTRAINTS = {
144
+ blurRelativeThreshold: {
145
+ min: .05,
146
+ max: .95,
147
+ step: .05
148
+ },
149
+ minMeanLuminance: {
150
+ min: 0,
151
+ max: 128,
152
+ step: 1
153
+ },
154
+ maxWaitMs: {
155
+ min: 500,
156
+ max: 2e4,
157
+ step: 500
158
+ }
159
+ };
160
+ /**
161
+ * Validation constraints for occupancy options.
162
+ *
163
+ * `cellSizeM` is clamped to 1–20 cm. The floor exists because cell count (and
164
+ * therefore the cube `InstancedMesh`, the grid `Map`, and the COLMAP
165
+ * `points3D` row count) scales as 1/cellSize³ — sub-centimetre voxels are both
166
+ * a memory/perf cliff on a phone and below the depth sensor's noise floor.
167
+ * Step is 1 cm (the settings slider operates in cm).
168
+ *
169
+ * `minConfidence` is clamped to 1–10 (integer). 1 disables the filter (legacy
170
+ * behaviour: a single observation counts as occupied); the ceiling exists
171
+ * because real surfaces accumulate only a handful of observations per second
172
+ * of dwell, so a floor above ~10 would start hiding genuine geometry.
173
+ */
174
+ const OCCUPANCY_CONSTRAINTS = {
175
+ cellSizeM: {
176
+ min: .01,
177
+ max: .2,
178
+ step: .01
179
+ },
180
+ minConfidence: {
181
+ min: 1,
182
+ max: 10,
183
+ step: 1
184
+ }
185
+ };
186
+ /**
187
+ * Validation constraints for the frame-tile display-resolution divisor.
188
+ *
189
+ * Clamped to 1–8 (full down to one-eighth per dimension), mirroring the capture
190
+ * `IMAGE_CONSTRAINTS.resolutionDivisor` range so the settings slider behaves the
191
+ * same. The intended stops are 1, 2, 4, 8 (full / half / quarter / eighth); the
192
+ * divisor is rounded to an integer so the resize target dimensions stay clean.
193
+ */
194
+ const FRAME_TILE_DISPLAY_CONSTRAINTS = { divisor: {
195
+ min: 1,
196
+ max: 8,
197
+ step: 1
198
+ } };
199
+ /**
200
+ * Validation constraints for QR-capture options.
201
+ *
202
+ * `intervalMs` is clamped to 50–1000 ms (20 Hz down to 1 Hz): below ~50 ms the
203
+ * detector cannot keep up and frames just queue; above 1 s tracking feels dead.
204
+ * `captureSize` is clamped to 256–2048 px: under 256 even a near QR loses its
205
+ * modules; over 2048 the blit + decode cost is not worth it on a phone. Both
206
+ * back a settings slider so a corrupt stored value can never break capture.
207
+ */
208
+ const QR_CONSTRAINTS = {
209
+ intervalMs: {
210
+ min: 50,
211
+ max: 1e3,
212
+ step: 25
213
+ },
214
+ captureSize: {
215
+ min: 256,
216
+ max: 2048,
217
+ step: 128
218
+ }
219
+ };
220
+ /**
77
221
  * Validate and normalize AR crash isolation flags.
78
222
  * Missing or invalid values fall back to defaults.
79
223
  */
@@ -89,12 +233,56 @@ function validateArCrashIsolationOptions(options) {
89
233
  };
90
234
  }
91
235
  /**
236
+ * Validate and normalize the compass alignment debug toggles. Boolean-or-default
237
+ * per field; a missing/corrupted/pre-feature value falls back to the OFF default
238
+ * so a bad persisted value can never silently turn an alignment override ON.
239
+ */
240
+ function validateCompassDebugOptions(options) {
241
+ const defaults = DEFAULT_RECORDING_OPTIONS.compassDebug;
242
+ return {
243
+ coldStartOverride: typeof options.coldStartOverride === "boolean" ? options.coldStartOverride : defaults.coldStartOverride,
244
+ rotationPrior: typeof options.rotationPrior === "boolean" ? options.rotationPrior : defaults.rotationPrior,
245
+ webXRConsistency: typeof options.webXRConsistency === "boolean" ? options.webXRConsistency : defaults.webXRConsistency
246
+ };
247
+ }
248
+ /**
249
+ * Validate and normalize the live debug-overlay visibility toggles.
250
+ * Each field is boolean-or-default (same policy as the AR-crash-isolation
251
+ * flags): a missing, corrupted, or pre-feature persisted value falls back to
252
+ * the ON default so an overlay is never silently disabled by bad input.
253
+ */
254
+ function validateVisualizationOptions(options) {
255
+ const defaults = DEFAULT_RECORDING_OPTIONS.visualization;
256
+ return {
257
+ frameTiles: typeof options.frameTiles === "boolean" ? options.frameTiles : defaults.frameTiles,
258
+ occupancyCubes: typeof options.occupancyCubes === "boolean" ? options.occupancyCubes : defaults.occupancyCubes,
259
+ gpsAlignmentMarkers: typeof options.gpsAlignmentMarkers === "boolean" ? options.gpsAlignmentMarkers : defaults.gpsAlignmentMarkers,
260
+ compassCubes: typeof options.compassCubes === "boolean" ? options.compassCubes : defaults.compassCubes
261
+ };
262
+ }
263
+ /**
92
264
  * Clamp a value to the specified constraints.
93
265
  */
94
266
  function clamp(value, min, max) {
95
267
  return Math.max(min, Math.min(max, value));
96
268
  }
97
269
  /**
270
+ * Validate and normalize QR-capture options. `enabled` is boolean-or-default
271
+ * (a corrupt/pre-feature value falls back to the OFF default so QR never
272
+ * silently turns ON); `intervalMs`/`captureSize` are clamped to
273
+ * {@link QR_CONSTRAINTS}, with a `Number.isFinite` guard so a stored `NaN`
274
+ * (which is `typeof 'number'` and survives `clamp`) falls back to the default
275
+ * rather than breaking the camera-frame source.
276
+ */
277
+ function validateQrOptions(options) {
278
+ const defaults = DEFAULT_RECORDING_OPTIONS.qr;
279
+ return {
280
+ enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
281
+ intervalMs: clamp(typeof options.intervalMs === "number" && Number.isFinite(options.intervalMs) ? options.intervalMs : defaults.intervalMs, QR_CONSTRAINTS.intervalMs.min, QR_CONSTRAINTS.intervalMs.max),
282
+ captureSize: clamp(typeof options.captureSize === "number" && Number.isFinite(options.captureSize) ? options.captureSize : defaults.captureSize, QR_CONSTRAINTS.captureSize.min, QR_CONSTRAINTS.captureSize.max)
283
+ };
284
+ }
285
+ /**
98
286
  * Validate and normalize depth options.
99
287
  * Invalid values are clamped to valid ranges.
100
288
  */
@@ -103,11 +291,46 @@ function validateDepthOptions(options) {
103
291
  return {
104
292
  enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
105
293
  intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, DEPTH_CONSTRAINTS.intervalMs.min, DEPTH_CONSTRAINTS.intervalMs.max),
106
- gridSize: clamp(typeof options.gridSize === "number" ? options.gridSize : defaults.gridSize, DEPTH_CONSTRAINTS.gridSize.min, DEPTH_CONSTRAINTS.gridSize.max),
294
+ gridSize: clamp(typeof options.gridSize === "number" && Number.isFinite(options.gridSize) ? Math.round(options.gridSize) : defaults.gridSize, DEPTH_CONSTRAINTS.gridSize.min, DEPTH_CONSTRAINTS.gridSize.max),
107
295
  rgb: typeof options.rgb === "boolean" ? options.rgb : defaults.rgb
108
296
  };
109
297
  }
110
298
  /**
299
+ * Validate and normalize the motion-filter (blurry-frame gate) options.
300
+ * `enabled` is boolean-or-default; the three numeric thresholds are clamped to
301
+ * {@link MOTION_FILTER_CONSTRAINTS} with a `Number.isFinite` guard (a stored
302
+ * `NaN` is `typeof 'number'` and would survive `clamp`). A missing group
303
+ * default-fills entirely — a pre-feature persisted options object that lacks
304
+ * `motionFilter` therefore loads with the gate enabled rather than crashing.
305
+ */
306
+ function validateMotionFilterOptions(options) {
307
+ const defaults = DEFAULT_RECORDING_OPTIONS.images.motionFilter;
308
+ return {
309
+ enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
310
+ maxAngularVelocity: clamp(typeof options.maxAngularVelocity === "number" && Number.isFinite(options.maxAngularVelocity) ? options.maxAngularVelocity : defaults.maxAngularVelocity, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.min, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.max),
311
+ maxLinearVelocity: clamp(typeof options.maxLinearVelocity === "number" && Number.isFinite(options.maxLinearVelocity) ? options.maxLinearVelocity : defaults.maxLinearVelocity, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.min, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.max),
312
+ maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, MOTION_FILTER_CONSTRAINTS.maxWaitMs.min, MOTION_FILTER_CONSTRAINTS.maxWaitMs.max)
313
+ };
314
+ }
315
+ /**
316
+ * Validate and normalize the image-quality (blur/blackness gate) options. Same
317
+ * policy as {@link validateMotionFilterOptions}: `enabled` is boolean-or-default;
318
+ * the three numeric thresholds are clamped to {@link QUALITY_FILTER_CONSTRAINTS}
319
+ * with a `Number.isFinite` guard (a stored `NaN` is `typeof 'number'` and would
320
+ * survive `clamp`). A missing group default-fills entirely — a pre-feature
321
+ * persisted options object that lacks `qualityFilter` loads with the gate
322
+ * disabled (the safe default) rather than crashing.
323
+ */
324
+ function validateQualityFilterOptions(options) {
325
+ const defaults = DEFAULT_RECORDING_OPTIONS.images.qualityFilter;
326
+ return {
327
+ enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
328
+ blurRelativeThreshold: clamp(typeof options.blurRelativeThreshold === "number" && Number.isFinite(options.blurRelativeThreshold) ? options.blurRelativeThreshold : defaults.blurRelativeThreshold, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.min, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.max),
329
+ minMeanLuminance: clamp(typeof options.minMeanLuminance === "number" && Number.isFinite(options.minMeanLuminance) ? options.minMeanLuminance : defaults.minMeanLuminance, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.min, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.max),
330
+ maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.min, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.max)
331
+ };
332
+ }
333
+ /**
111
334
  * Validate and normalize image options.
112
335
  * Invalid values are clamped to valid ranges.
113
336
  */
@@ -117,10 +340,39 @@ function validateImageOptions(options) {
117
340
  enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
118
341
  intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, IMAGE_CONSTRAINTS.intervalMs.min, IMAGE_CONSTRAINTS.intervalMs.max),
119
342
  quality: clamp(typeof options.quality === "number" ? options.quality : defaults.quality, IMAGE_CONSTRAINTS.quality.min, IMAGE_CONSTRAINTS.quality.max),
120
- resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max)
343
+ resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max),
344
+ motionFilter: validateMotionFilterOptions(options.motionFilter ?? {}),
345
+ qualityFilter: validateQualityFilterOptions(options.qualityFilter ?? {})
121
346
  };
122
347
  }
123
348
  /**
349
+ * Validate and normalize occupancy options.
350
+ * Invalid values are clamped to valid ranges.
351
+ *
352
+ * Note the explicit `Number.isFinite` guard: `OccupancyGrid` throws a
353
+ * `RangeError` on a non-finite cell size, and `clamp(NaN, …)` would otherwise
354
+ * pass `NaN` straight through (it is `typeof 'number'`). Falling back to the
355
+ * default keeps a corrupted stored value from crashing grid construction.
356
+ */
357
+ function validateOccupancyOptions(options) {
358
+ const defaults = DEFAULT_RECORDING_OPTIONS.occupancy;
359
+ return {
360
+ cellSizeM: clamp(typeof options.cellSizeM === "number" && Number.isFinite(options.cellSizeM) ? options.cellSizeM : defaults.cellSizeM, OCCUPANCY_CONSTRAINTS.cellSizeM.min, OCCUPANCY_CONSTRAINTS.cellSizeM.max),
361
+ minConfidence: clamp(typeof options.minConfidence === "number" && Number.isFinite(options.minConfidence) ? Math.round(options.minConfidence) : defaults.minConfidence, OCCUPANCY_CONSTRAINTS.minConfidence.min, OCCUPANCY_CONSTRAINTS.minConfidence.max)
362
+ };
363
+ }
364
+ /**
365
+ * Validate and normalize frame-tile display options. `divisor` is clamped to
366
+ * {@link FRAME_TILE_DISPLAY_CONSTRAINTS} and rounded to an integer, with a
367
+ * `Number.isFinite` guard so a stored `NaN` (which is `typeof 'number'` and
368
+ * survives `clamp`) falls back to the default rather than producing a broken
369
+ * resize target.
370
+ */
371
+ function validateFrameTileDisplayOptions(options) {
372
+ const defaults = DEFAULT_RECORDING_OPTIONS.frameTileDisplay;
373
+ return { divisor: clamp(typeof options.divisor === "number" && Number.isFinite(options.divisor) ? Math.round(options.divisor) : defaults.divisor, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.min, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.max) };
374
+ }
375
+ /**
124
376
  * Validate and normalize a full RecordingOptions object.
125
377
  * Merges with defaults and clamps invalid values.
126
378
  */
@@ -128,7 +380,12 @@ function validateRecordingOptions(options) {
128
380
  return {
129
381
  depth: validateDepthOptions(options.depth ?? {}),
130
382
  images: validateImageOptions(options.images ?? {}),
131
- arCrashIsolation: validateArCrashIsolationOptions(options.arCrashIsolation ?? {})
383
+ arCrashIsolation: validateArCrashIsolationOptions(options.arCrashIsolation ?? {}),
384
+ occupancy: validateOccupancyOptions(options.occupancy ?? {}),
385
+ frameTileDisplay: validateFrameTileDisplayOptions(options.frameTileDisplay ?? {}),
386
+ visualization: validateVisualizationOptions(options.visualization ?? {}),
387
+ qr: validateQrOptions(options.qr ?? {}),
388
+ compassDebug: validateCompassDebugOptions(options.compassDebug ?? {})
132
389
  };
133
390
  }
134
391
  /**
@@ -186,9 +443,18 @@ function resetRecordingOptions(storageKey = STORAGE_KEY) {
186
443
  function cloneRecordingOptions(options) {
187
444
  return {
188
445
  depth: { ...options.depth },
189
- images: { ...options.images },
190
- arCrashIsolation: { ...options.arCrashIsolation }
446
+ images: {
447
+ ...options.images,
448
+ motionFilter: { ...options.images.motionFilter },
449
+ qualityFilter: { ...options.images.qualityFilter }
450
+ },
451
+ arCrashIsolation: { ...options.arCrashIsolation },
452
+ occupancy: { ...options.occupancy },
453
+ frameTileDisplay: { ...options.frameTileDisplay },
454
+ visualization: { ...options.visualization },
455
+ qr: { ...options.qr },
456
+ compassDebug: { ...options.compassDebug }
191
457
  };
192
458
  }
193
459
  //#endregion
194
- export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, IMAGE_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateDepthOptions, validateImageOptions, validateRecordingOptions };
460
+ 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 };
@@ -1,3 +1,3 @@
1
- import { L as CombinedRootState } from "../create-slam-app-store-BljusOua.js";
2
- import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-r0DZ9ALp.js";
1
+ import { N as CombinedRootState } from "../create-slam-app-store-n_VF63D5.js";
2
+ import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-DQKpAGyQ.js";
3
3
  export { CombinedRootState, ReplayRecordingOptions, replayRecording };
@@ -1,6 +1,6 @@
1
1
  import { loadActionsFromZip } from "../storage/zip-reader.js";
2
2
  import { NullStorageBackend } from "../storage/null-storage-backend.js";
3
- import { createSlamAppStore } from "./create-slam-app-store.js";
3
+ import { t as createSlamAppStore } from "../create-slam-app-store-DkCHOpvb.js";
4
4
  //#region ../src/state/recording-replayer.ts
5
5
  /**
6
6
  * Recording Replayer
@@ -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-89O07ebs.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-DaxHZvNu.js";
2
2
  export { RecordingState, SessionMetadata, endSession, recordDepthSample, recordWriteFailure, recordingReducer, startSession };
@@ -11,8 +11,12 @@ const recordingSlice = createSlice({
11
11
  },
12
12
  reducers: {
13
13
  startSession(state, action) {
14
+ const { scenarioName, contextTag, ...rest } = action.payload;
14
15
  state.isRecording = true;
15
- state.sessionMetadata = action.payload;
16
+ state.sessionMetadata = {
17
+ ...rest,
18
+ contextTag: contextTag ?? scenarioName ?? ""
19
+ };
16
20
  state.actionCount = 0;
17
21
  state.failedWriteCount = 0;
18
22
  state.latestDepthSample = null;
@@ -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-XpDa0dy1.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-CmKh_4wf.js";
2
2
  export { CompleteCallback, DEFAULT_MAX_DELAY_MS, ErrorCallback, ProgressCallback, ReplayAction, ReplayEngine, ReplayState, computeInterActionDelay, extractActionTimestamp };
@@ -7,9 +7,12 @@ const MAX_CONSECUTIVE_ERRORS = 10;
7
7
  * Extract an absolute epoch-ms timestamp from a Redux action, or null
8
8
  * if the action type doesn't carry one.
9
9
  *
10
- * IMPORTANT: depthSample uses performance.now() (relative to page load),
11
- * NOT epoch ms. Returning it here would mix clock domains and produce
12
- * garbage delays. It must return null. (Risk R4)
10
+ * IMPORTANT: the high-frequency sensor streams (depthSample, qrDetected) return
11
+ * null here ON PURPOSE they are NOT used to pace replay delays (they anchor to
12
+ * the GPS/image/session timeline by recorded ORDER instead). Their payload
13
+ * `timestamp` IS epoch ms (`performance.timeOrigin + frameTs`, see
14
+ * `ar/depth-sampler.ts`); the QR size as-of join reads those payload timestamps
15
+ * directly, independently of this pacing function. (Risk R4)
13
16
  *
14
17
  * @param action - A Redux action with type and optional payload
15
18
  * @returns Epoch milliseconds, or null if unavailable/unreliable
@@ -37,6 +40,7 @@ function extractActionTimestamp(action) {
37
40
  return null;
38
41
  }
39
42
  case "recording/recordDepthSample": return null;
43
+ case "qrDetected/recordQrDetection": return null;
40
44
  case "recording/endSession": return null;
41
45
  default: return null;
42
46
  }
@@ -1,3 +1,3 @@
1
- import { t as SubscribableStore } from "../subscribe-to-selector-CZ6k1NFP.js";
2
- import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-0YWyOLvV.js";
1
+ import { t as SubscribableStore } from "../subscribe-to-selector-B6EUmQ3I.js";
2
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-CA6AJH_8.js";
3
3
  export { StoreSubscriberDeps, SubscribableStore, wireStoreSubscribers };
@@ -1,2 +1,2 @@
1
- import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-CZ6k1NFP.js";
1
+ import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-B6EUmQ3I.js";
2
2
  export { SubscribableStore, subscribeToSelector };
@@ -1,2 +1,2 @@
1
- import { A as resetTrackingQuality, C as computeResidualConsensus, D as firstAgreementReached, E as degradedCountUpdated, F as snapshotsTrimmed, I as trackingQualityReducer, M as selectRecentAlignments, N as selectTrackingQuality, O as matrixDelta, P as snapshotPushed, S as computeGpsVsFusedDivergence, T as createTrackingQualityListenerMiddleware, _ as TrackingQualityState, b as computeCoverage, c as CompassAgreementResult, d as DEFAULT_TRACKING_QUALITY_OPTIONS, f as GpsAccuracyResult, g as TrackingQualitySliceState, h as TrackingQualityReport, j as selectFirstAgreementObservationIndex, k as reportUpdated, l as ConvergenceResult, m as TrackingQualityOptions, p as ResidualConsensusResult, s as AlignmentSnapshot, u as CoverageResult, v as computeCompassAgreement, w as computeTrackingQualityReport, x as computeGpsAccuracy, y as computeConvergence } from "../create-slam-app-store-BljusOua.js";
2
- export { AlignmentSnapshot, CompassAgreementResult, ConvergenceResult, CoverageResult, DEFAULT_TRACKING_QUALITY_OPTIONS, GpsAccuracyResult, ResidualConsensusResult, TrackingQualityOptions, TrackingQualityReport, TrackingQualitySliceState, TrackingQualityState, computeCompassAgreement, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeResidualConsensus, computeTrackingQualityReport, createTrackingQualityListenerMiddleware, degradedCountUpdated, firstAgreementReached, matrixDelta, reportUpdated, resetTrackingQuality, selectFirstAgreementObservationIndex, selectRecentAlignments, selectTrackingQuality, snapshotPushed, snapshotsTrimmed, trackingQualityReducer };
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-n_VF63D5.js";
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 };