gps-plus-slam-app-framework 1.9.0 → 1.10.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 (244) hide show
  1. package/dist/{alignment-lerper-gD70k7Fq.d.ts → alignment-lerper-B4COh_0p.d.ts} +0 -6
  2. package/dist/{app-selectors-BbAiCRUT.d.ts → app-selectors-CV7ggGoo.d.ts} +23 -13
  3. package/dist/ar/bresenham3d.d.ts +1 -1
  4. package/dist/ar/camera-blit-capture.d.ts +1 -1
  5. package/dist/ar/capability-checker.d.ts +1 -1
  6. package/dist/ar/capture-failure-tracker.d.ts +1 -1
  7. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  8. package/dist/ar/depth-grid-lookup.d.ts +1 -1
  9. package/dist/ar/depth-occluder.d.ts +1 -1
  10. package/dist/ar/depth-sampler.d.ts +2 -2
  11. package/dist/ar/depth-sampler.js +16 -5
  12. package/dist/ar/depth-unprojection.d.ts +1 -1
  13. package/dist/ar/enable-gps-ar.d.ts +1 -1
  14. package/dist/ar/enable-gps-ar.js +1 -1
  15. package/dist/ar/frame-loop.d.ts +1 -1
  16. package/dist/ar/image-capture.d.ts +1 -1
  17. package/dist/ar/image-capture.js +1 -1
  18. package/dist/ar/image-quality.d.ts +1 -1
  19. package/dist/ar/image-quality.js +28 -9
  20. package/dist/ar/index.d.ts +32 -32
  21. package/dist/ar/index.js +7 -7
  22. package/dist/ar/occlusion-mesh-worker.d.ts +2 -2
  23. package/dist/ar/occlusion-mesh-worker.js +1 -1
  24. package/dist/ar/occupancy-grid.d.ts +1 -1
  25. package/dist/ar/occupancy-grid.js +1 -1
  26. package/dist/ar/occupancy-mesher.d.ts +1 -1
  27. package/dist/ar/occupancy-mesher.js +3 -4
  28. package/dist/ar/planar-pnp.d.ts +1 -1
  29. package/dist/ar/qr-debug-view.d.ts +1 -1
  30. package/dist/ar/qr-derived-pose.d.ts +1 -1
  31. package/dist/ar/qr-derived-pose.js +1 -1
  32. package/dist/ar/qr-detection-controller.d.ts +1 -1
  33. package/dist/ar/qr-detection-controller.js +1 -1
  34. package/dist/ar/qr-frontend.d.ts +1 -1
  35. package/dist/ar/qr-pose.d.ts +1 -1
  36. package/dist/ar/qr-size-depth-context.d.ts +2 -2
  37. package/dist/ar/qr-size-measurer.d.ts +1 -1
  38. package/dist/ar/qr-size-measurer.js +1 -1
  39. package/dist/ar/replay-scene.d.ts +1 -1
  40. package/dist/ar/replay-scene.js +1 -1
  41. package/dist/ar/scene-node-names.d.ts +1 -1
  42. package/dist/ar/webxr-nue-basis.d.ts +1 -1
  43. package/dist/ar/webxr-session.d.ts +3 -3
  44. package/dist/ar/webxr-session.js +1 -1
  45. package/dist/ar/xr-camera-texture.d.ts +1 -1
  46. package/dist/ar/xr-error-handler.d.ts +1 -1
  47. package/dist/ar/xr-frame-loop.d.ts +1 -1
  48. package/dist/{ar-BqCudtqE.js → ar-D-03Kso-.js} +18 -14
  49. package/dist/{ar-types-Cc5yvBwn.d.ts → ar-types-CBafnxhE.d.ts} +16 -1
  50. package/dist/{ar-world-group-alignment-Cfg0trC3.d.ts → ar-world-group-alignment-B6XiA1cT.d.ts} +1 -1
  51. package/dist/core/index.d.ts +1 -1
  52. package/dist/{create-slam-app-store-D1QSMuKu.d.ts → create-slam-app-store-CH31erpP.d.ts} +4 -4
  53. package/dist/{create-slam-app-store-DXiAnJwR.js → create-slam-app-store-DLv5ZwqU.js} +2 -2
  54. package/dist/{depth-grid-lookup-D5atpNZ3.d.ts → depth-grid-lookup-DY6zYTLx.d.ts} +1 -1
  55. package/dist/{depth-sampler-CwObAwEA.d.ts → depth-sampler-txG8evgQ.d.ts} +14 -4
  56. package/dist/{depth-unprojection-DRdBU90S.d.ts → depth-unprojection-JKkeqJrV.d.ts} +1 -1
  57. package/dist/device-orientation-cache-BjEaEAmh.js +20 -0
  58. package/dist/{enable-gps-ar-BBtRO2FJ.d.ts → enable-gps-ar-BbNWyqp5.d.ts} +4 -4
  59. package/dist/{frame-conversions-DDcNHkTb.d.ts → frame-conversions-CH7E2Iv_.d.ts} +1 -1
  60. package/dist/{fused-path-C5pp0PJU.d.ts → fused-path-DOKzVMiO.d.ts} +1 -1
  61. package/dist/geo/h3-proximity.d.ts +1 -1
  62. package/dist/geo/index.d.ts +1 -1
  63. package/dist/{gps-CDKDQokE.d.ts → gps-CX5b9g3s.d.ts} +8 -1
  64. package/dist/{gps-anchor-CEjGqEVD.d.ts → gps-anchor-BaqyRsPC.d.ts} +14 -4
  65. package/dist/{gps-ar-pose-sampler-DEGNk2CI.d.ts → gps-ar-pose-sampler-BOOV0jJk.d.ts} +1 -1
  66. package/dist/{gps-event-coordinator-BWpgBrHq.d.ts → gps-event-coordinator-03rVh_us.d.ts} +16 -29
  67. package/dist/{image-capture-DVcuqMtX.js → image-capture-BUqqsOi3.js} +11 -9
  68. package/dist/{image-capture-Bp6Pd4Md.d.ts → image-capture-Cr_rljeV.d.ts} +3 -3
  69. package/dist/{index-cCQWuYqy.d.ts → index-C2Bo0buN.d.ts} +4 -6
  70. package/dist/{index-B6iBnO_K.d.ts → index-CuHaGY0F.d.ts} +1 -1
  71. package/dist/index.d.ts +82 -82
  72. package/dist/index.js +16 -14
  73. package/dist/{leaflet-map-overlay-C8GS4cUy.d.ts → leaflet-map-overlay-QhF199BW.d.ts} +1 -1
  74. package/dist/{map-data-CUnTzRIC.d.ts → map-data-D8sSxpOr.d.ts} +1 -1
  75. package/dist/{map-overlay-draw-6WJeq0Kg.d.ts → map-overlay-draw-1E61FLKs.d.ts} +1 -1
  76. package/dist/median-Bla_W50f.js +44 -0
  77. package/dist/{null-storage-backend-B1-jlpin.d.ts → null-storage-backend-DXXuwG8T.d.ts} +2 -2
  78. package/dist/{occlusion-mesh-kXCQ2FM1.d.ts → occlusion-mesh-CZ4i_SW2.d.ts} +3 -11
  79. package/dist/{occupancy-grid-BV7RhB7I.d.ts → occupancy-grid-f0I07UxI.d.ts} +2 -2
  80. package/dist/{occupancy-mesher-C2ecWhNp.d.ts → occupancy-mesher-BqnRd10x.d.ts} +4 -9
  81. package/dist/{opfs-storage-backend-D6Z03fML.d.ts → opfs-storage-backend-D1ZpeNEL.d.ts} +2 -2
  82. package/dist/{persistence-middleware-CG-t08X4.d.ts → persistence-middleware-CI4Cetnl.d.ts} +1 -1
  83. package/dist/{planar-pnp-D7bc_rLX.d.ts → planar-pnp-CPLhg5MX.d.ts} +1 -1
  84. package/dist/{qr-debug-view-BJooqbiP.d.ts → qr-debug-view-BmbWo06j.d.ts} +1 -1
  85. package/dist/{qr-derived-pose-BwNWn8oV.d.ts → qr-derived-pose-DEYT85ul.d.ts} +2 -2
  86. package/dist/{qr-detected-slice-TzVb8bij.d.ts → qr-detected-slice-CPEkGbxh.d.ts} +4 -4
  87. package/dist/{qr-detection-controller-Bo4XfQTP.d.ts → qr-detection-controller-IcMRpTjV.d.ts} +3 -3
  88. package/dist/{qr-frontend-BPURlh3S.d.ts → qr-frontend-61SKPSyU.d.ts} +1 -1
  89. package/dist/{qr-pose-aggregation-CypnmjA-.d.ts → qr-pose-aggregation-BL6gfl0s.d.ts} +1 -1
  90. package/dist/{qr-pose-aggregation-DBiaLW0O.js → qr-pose-aggregation-H-O_Jjz9.js} +5 -10
  91. package/dist/{qr-size-depth-context-apAOmbrZ.d.ts → qr-size-depth-context-DJsYqbqY.d.ts} +2 -2
  92. package/dist/{qr-size-measurer-DLb33geH.js → qr-size-measurer-BVOIg-He.js} +6 -12
  93. package/dist/{qr-size-measurer-DxiMqRUw.d.ts → qr-size-measurer-Bl_i-umk.d.ts} +3 -3
  94. package/dist/{recording-options-DYKWVI93.d.ts → recording-options-Cai9D14V.d.ts} +16 -9
  95. package/dist/{recording-replayer-BJ8Lf0QY.d.ts → recording-replayer-DyIN13nG.d.ts} +2 -2
  96. package/dist/{recording-slice-BW8SiLo1.d.ts → recording-slice-DziOl7P5.d.ts} +2 -2
  97. package/dist/{replay-engine-DmCAc7WM.d.ts → replay-engine-DAymjsd1.d.ts} +1 -1
  98. package/dist/{replay-scene-zJ8SFDjE.d.ts → replay-scene-CZdWgcpc.d.ts} +3 -3
  99. package/dist/sensors/absolute-orientation.d.ts +1 -1
  100. package/dist/sensors/gps-error-handler.d.ts +1 -1
  101. package/dist/sensors/gps.d.ts +1 -1
  102. package/dist/sensors/gps.js +10 -8
  103. package/dist/sensors/index.d.ts +4 -4
  104. package/dist/sensors/index.js +1 -1
  105. package/dist/sensors/permission-checker.d.ts +1 -1
  106. package/dist/sensors/permission-checker.js +71 -40
  107. package/dist/state/app-selectors.d.ts +1 -1
  108. package/dist/state/combined-root-state.d.ts +1 -1
  109. package/dist/state/create-slam-app-store.d.ts +1 -1
  110. package/dist/state/create-slam-app-store.js +1 -1
  111. package/dist/state/gps-ar-pose-sampler.d.ts +2 -3
  112. package/dist/state/gps-ar-pose-sampler.js +1 -1
  113. package/dist/state/gps-event-coordinator.d.ts +2 -1
  114. package/dist/state/gps-event-coordinator.js +4 -46
  115. package/dist/state/index.d.ts +19 -19
  116. package/dist/state/index.js +5 -3
  117. package/dist/state/persistence-middleware.d.ts +1 -1
  118. package/dist/state/qr-detected-slice.d.ts +3 -3
  119. package/dist/state/qr-detected-slice.js +5 -9
  120. package/dist/state/recording-options.d.ts +1 -1
  121. package/dist/state/recording-options.js +74 -45
  122. package/dist/state/recording-replayer.d.ts +2 -2
  123. package/dist/state/recording-replayer.js +1 -1
  124. package/dist/state/recording-slice.d.ts +1 -1
  125. package/dist/state/replay-engine.d.ts +1 -1
  126. package/dist/state/store-subscribers.d.ts +2 -2
  127. package/dist/state/store-subscribers.js +23 -6
  128. package/dist/state/subscribe-to-selector.d.ts +1 -1
  129. package/dist/state/tracking-quality.d.ts +1 -1
  130. package/dist/state/tracking-quality.js +14 -11
  131. package/dist/state/tracking-slice.d.ts +1 -1
  132. package/dist/{state-BeKvn4B-.js → state-U45ioVyB.js} +2 -3
  133. package/dist/storage/file-system-utils.d.ts +1 -1
  134. package/dist/storage/index.d.ts +8 -8
  135. package/dist/storage/null-storage-backend.d.ts +1 -1
  136. package/dist/storage/opfs-storage-backend.d.ts +1 -1
  137. package/dist/storage/opfs-storage.d.ts +1 -1
  138. package/dist/storage/storage-backend.d.ts +1 -1
  139. package/dist/storage/zip-coverage-embed.d.ts +1 -1
  140. package/dist/storage/zip-export.d.ts +1 -1
  141. package/dist/storage/zip-export.js +10 -4
  142. package/dist/storage/zip-reader.d.ts +1 -1
  143. package/dist/{storage-backend-sEtmM4yW.d.ts → storage-backend-BX7egQKi.d.ts} +1 -1
  144. package/dist/{store-subscribers-DJUErW-o.d.ts → store-subscribers-DtwakLrQ.d.ts} +2 -2
  145. package/dist/{subscribe-to-selector-dQV8SpsO.d.ts → subscribe-to-selector-Cgo9JTfS.d.ts} +1 -1
  146. package/dist/test-utils/browser-mocks.d.ts +1 -1
  147. package/dist/test-utils/zip-round-trip-helpers.d.ts +1 -1
  148. package/dist/{tracking-slice-DMkHlbny.d.ts → tracking-slice-Bt2OEQhA.d.ts} +1 -1
  149. package/dist/types/ar-types.d.ts +2 -2
  150. package/dist/types/ar-types.js +31 -1
  151. package/dist/types/geo-types.d.ts +1 -1
  152. package/dist/types/index.d.ts +3 -3
  153. package/dist/types/index.js +2 -1
  154. package/dist/utils/concurrency.d.ts +1 -1
  155. package/dist/utils/failure-tracker.d.ts +1 -1
  156. package/dist/utils/format-file-size.d.ts +1 -1
  157. package/dist/utils/fused-path.d.ts +1 -1
  158. package/dist/utils/fused-path.js +1 -1
  159. package/dist/utils/index.d.ts +7 -7
  160. package/dist/utils/index.js +1 -1
  161. package/dist/utils/list-formatter.d.ts +1 -1
  162. package/dist/utils/logger.d.ts +1 -1
  163. package/dist/utils/logger.js +30 -20
  164. package/dist/visualization/accuracy-circles.d.ts +1 -1
  165. package/dist/visualization/alignment-lerper.d.ts +1 -1
  166. package/dist/visualization/alignment-lerper.js +20 -5
  167. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  168. package/dist/visualization/ar-world-group-alignment.js +1 -1
  169. package/dist/visualization/camera-follower.d.ts +1 -1
  170. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  171. package/dist/visualization/frame-conversions.d.ts +1 -1
  172. package/dist/visualization/frustum-visibility.d.ts +1 -1
  173. package/dist/visualization/gps-anchor.d.ts +1 -1
  174. package/dist/visualization/gps-anchor.js +43 -18
  175. package/dist/visualization/gps-compass-cubes.d.ts +1 -1
  176. package/dist/visualization/gps-event-markers.d.ts +1 -1
  177. package/dist/visualization/gps-event-markers.js +1 -1
  178. package/dist/visualization/hit-test-reticle.d.ts +1 -1
  179. package/dist/visualization/index.d.ts +19 -19
  180. package/dist/visualization/index.js +2 -2
  181. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  182. package/dist/visualization/leaflet-map-overlay.js +1 -1
  183. package/dist/visualization/lerp-utils.d.ts +1 -1
  184. package/dist/visualization/map-data.d.ts +1 -1
  185. package/dist/visualization/map-data.js +1 -1
  186. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  187. package/dist/visualization/map-overlay.d.ts +1 -1
  188. package/dist/visualization/occluder-mesh-driver.d.ts +2 -2
  189. package/dist/visualization/occlusion-mesh.d.ts +1 -1
  190. package/dist/visualization/occlusion-mesh.js +1 -11
  191. package/dist/visualization/three-dispose.d.ts +1 -1
  192. package/dist/visualization/vis-colors.d.ts +1 -1
  193. package/dist/{webxr-session-BWCpGd-2.d.ts → webxr-session-CGFZ429B.d.ts} +8 -8
  194. package/dist/{webxr-session-BCP2XK7k.js → webxr-session-DWKUsCN9.js} +7 -7
  195. package/package.json +4 -4
  196. /package/dist/{absolute-orientation-BAxc15J6.d.ts → absolute-orientation-C_IxDR_j.d.ts} +0 -0
  197. /package/dist/{accuracy-circles-DkWBkF5g.d.ts → accuracy-circles-BE7tbvYV.d.ts} +0 -0
  198. /package/dist/{bresenham3d-DGc4nIb-.d.ts → bresenham3d-D-t9i_b5.d.ts} +0 -0
  199. /package/dist/{camera-blit-capture-BimSdyih.d.ts → camera-blit-capture-BlC-arRb.d.ts} +0 -0
  200. /package/dist/{camera-follower-DfBm2J5i.d.ts → camera-follower-B6zA3dy9.d.ts} +0 -0
  201. /package/dist/{capability-checker-BTTpygvZ.d.ts → capability-checker-DEo-ktWI.d.ts} +0 -0
  202. /package/dist/{capture-failure-tracker-_BVfhpxv.d.ts → capture-failure-tracker-BAUKjtXU.d.ts} +0 -0
  203. /package/dist/{capture-motion-gate-BGoAMkmf.d.ts → capture-motion-gate-BmjiWUJv.d.ts} +0 -0
  204. /package/dist/{capture-motion-gate-_NdTSwKi.js → capture-motion-gate-D1eyGC_o.js} +0 -0
  205. /package/dist/{cell-key-DIB4rOTV.js → cell-key-Bj-eYTLA.js} +0 -0
  206. /package/dist/{chromium-camera-access-workaround-C6yJLXz9.d.ts → chromium-camera-access-workaround-DCd8SP2N.d.ts} +0 -0
  207. /package/dist/{concurrency-DPeGBH0X.d.ts → concurrency-DW0jQo3G.d.ts} +0 -0
  208. /package/dist/{css3d-renderer-manager-CPpVtvgs.d.ts → css3d-renderer-manager-DbrSY7Mh.d.ts} +0 -0
  209. /package/dist/{failure-tracker-CeKf5HIc.d.ts → failure-tracker-B7fzPfZo.d.ts} +0 -0
  210. /package/dist/{file-system-utils-DueXHxo9.d.ts → file-system-utils-CfLTj5Ra.d.ts} +0 -0
  211. /package/dist/{format-file-size-DxN-EBLc.d.ts → format-file-size-Da8rZgfs.d.ts} +0 -0
  212. /package/dist/{frame-loop-7GBMBu68.d.ts → frame-loop-7HigCj7m.d.ts} +0 -0
  213. /package/dist/{frustum-visibility-CokkgS_i.d.ts → frustum-visibility-COPfzruF.d.ts} +0 -0
  214. /package/dist/{geo-types-DrGVu8nS.d.ts → geo-types-BfDK8kJu.d.ts} +0 -0
  215. /package/dist/{geodesic-angle-BTldfFgs.js → geodesic-angle-HXBWiXiI.js} +0 -0
  216. /package/dist/{gps-compass-cubes-1mooS3BS.d.ts → gps-compass-cubes-CT3TWctJ.d.ts} +0 -0
  217. /package/dist/{gps-error-handler-C34GQuTu.d.ts → gps-error-handler-DjVuLXve.d.ts} +0 -0
  218. /package/dist/{gps-event-markers-Di2nBzx-.d.ts → gps-event-markers-BsC2Ynlh.d.ts} +0 -0
  219. /package/dist/{h3-proximity-D0GTHQmr.d.ts → h3-proximity-pFluGfwL.d.ts} +0 -0
  220. /package/dist/{hit-test-reticle-CaQbrhbk.d.ts → hit-test-reticle-DhnCMOsc.d.ts} +0 -0
  221. /package/dist/{image-quality-BMx2ko9-.d.ts → image-quality-BjBLoTec.d.ts} +0 -0
  222. /package/dist/{index-DXPVzOpP.d.ts → index-CjxbDm8W.d.ts} +0 -0
  223. /package/dist/{index-D74JTX4I.d.ts → index-Nr3qg4IH.d.ts} +0 -0
  224. /package/dist/{leaflet-map-overlay-CBWPvaX9.js → leaflet-map-overlay-BRkUhZMD.js} +0 -0
  225. /package/dist/{lerp-utils-Qs8OhumS.d.ts → lerp-utils-bwMwVCpU.d.ts} +0 -0
  226. /package/dist/{list-formatter-DLFDnS70.d.ts → list-formatter-1ttG18MQ.d.ts} +0 -0
  227. /package/dist/{logger-CqTd5Kpk.d.ts → logger-B4StJUDb.d.ts} +0 -0
  228. /package/dist/{map-data-1tF5gcYV.js → map-data-D3oE8AQP.js} +0 -0
  229. /package/dist/{map-overlay-BCQgvIgU.d.ts → map-overlay-0yJOcEVO.d.ts} +0 -0
  230. /package/dist/{opfs-storage-CTkxvxN4.d.ts → opfs-storage-S_odkCk1.d.ts} +0 -0
  231. /package/dist/{permission-checker-B-VtjnBA.d.ts → permission-checker-D1C5zvo-.d.ts} +0 -0
  232. /package/dist/{qr-detection-controller-B-tLVd-S.js → qr-detection-controller-bRTJXC6G.js} +0 -0
  233. /package/dist/{qr-pose-y3vaEd6x.d.ts → qr-pose-CCTF1PP0.d.ts} +0 -0
  234. /package/dist/{scene-node-names-CGb-ylBd.d.ts → scene-node-names-DWzhE7Ro.d.ts} +0 -0
  235. /package/dist/{session-disposers-BPrMplIC.js → session-disposers-BZS-hi8u.js} +0 -0
  236. /package/dist/{three-dispose-BMOAmPhb.d.ts → three-dispose-C9mdpSRX.d.ts} +0 -0
  237. /package/dist/{vis-colors-C7HI0u9_.d.ts → vis-colors-DjStl_tD.d.ts} +0 -0
  238. /package/dist/{webxr-nue-basis-CaCnYxuq.d.ts → webxr-nue-basis-C3vTqkE2.d.ts} +0 -0
  239. /package/dist/{xr-camera-texture-q0eIDSRg.d.ts → xr-camera-texture-C6Z4d7RR.d.ts} +0 -0
  240. /package/dist/{xr-error-handler-uVGDu9IX.d.ts → xr-error-handler-D9y5r8ok.d.ts} +0 -0
  241. /package/dist/{xr-frame-loop-DX3JPpAU.d.ts → xr-frame-loop-25gM4B0K.d.ts} +0 -0
  242. /package/dist/{zip-coverage-embed-ncVbaZAz.d.ts → zip-coverage-embed-BrodRLq0.d.ts} +0 -0
  243. /package/dist/{zip-export-CtiUnAlJ.d.ts → zip-export-CuBimX1J.d.ts} +0 -0
  244. /package/dist/{zip-reader-BzENzMH6.d.ts → zip-reader-BHc_b_iA.d.ts} +0 -0
@@ -1,20 +1,20 @@
1
- import { i as DepthSample, r as DepthPoint } from "../ar-types-Cc5yvBwn.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
- 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
- import { d as QrSizeStatus, l as QrSizeEstimate } from "../qr-size-measurer-DxiMqRUw.js";
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-BW8SiLo1.js";
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
- import { n as SessionMetadata } from "../opfs-storage-CTkxvxN4.js";
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-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
- 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-BJ8Lf0QY.js";
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-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";
1
+ import { c as extractOdomPosition, i as DepthSample, l as extractOdomRotation, r as DepthPoint } from "../ar-types-CBafnxhE.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-Cai9D14V.js";
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-Bt2OEQhA.js";
4
+ import { d as QrSizeStatus, l as QrSizeEstimate } from "../qr-size-measurer-Bl_i-umk.js";
5
+ import { a as QrPoseStability, o as QrPoseStabilityOptions, s as QrPoseStabilityStatus } from "../qr-pose-aggregation-BL6gfl0s.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-DziOl7P5.js";
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-CPEkGbxh.js";
8
+ import { n as SessionMetadata } from "../opfs-storage-S_odkCk1.js";
9
+ import { n as StorageBackend } from "../storage-backend-BX7egQKi.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-CH31erpP.js";
11
+ import { a as eulerToQuaternion, c as getLastDeviceOrientation, i as createGpsPositionHandler, l as updateDeviceOrientation, n as buildRawGpsPoint, o as resetCoordinatorState, r as buildRecordGpsEventPayload, t as RecordingCoordinatorConfig } from "../gps-event-coordinator-03rVh_us.js";
12
+ import { i as captureGpsAnchorSample, n as GpsAnchorSample, r as GpsAnchorSampleGpsPoint, t as CaptureGpsAnchorSampleOptions } from "../gps-ar-pose-sampler-BOOV0jJk.js";
13
+ import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-DyIN13nG.js";
14
+ import { n as createPersistenceMiddleware, r as slicePrefixOf, t as PersistenceMiddlewareOptions } from "../persistence-middleware-CI4Cetnl.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-DAymjsd1.js";
16
+ import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-Cgo9JTfS.js";
17
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DtwakLrQ.js";
18
+ import { a as selectOdometryRotations, i as selectOdometryPositions, n as selectFrameTilesInWebXR, o as selectZeroReference, r as selectGpsPositions, t as selectAlignmentMatrix } from "../app-selectors-CV7ggGoo.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-CuHaGY0F.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,16 +1,18 @@
1
- import { buildRawGpsPoint, buildRecordGpsEventPayload, createGpsPositionHandler, eulerToQuaternion, extractOdomPosition, extractOdomRotation, getLastDeviceOrientation, resetCoordinatorState, updateDeviceOrientation } from "./gps-event-coordinator.js";
1
+ import { extractOdomPosition, extractOdomRotation } from "../types/ar-types.js";
2
2
  import { clearLastRestartedPayload, originReset, poseLost, poseReceived, resetTracking, selectLastRestartedPayload, selectLastSensorOrientation, selectLastValidPose, selectLostFrameCount, selectTrackingPhase, trackingReducer } from "./tracking-slice.js";
3
+ import { r as updateDeviceOrientation, t as getLastDeviceOrientation } from "../device-orientation-cache-BjEaEAmh.js";
3
4
  import { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, IMAGE_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateDepthOptions, validateImageOptions, validateRecordingOptions } from "./recording-options.js";
4
5
  import { endSession, recordDepthSample, recordWriteFailure, recordingReducer, startSession } from "./recording-slice.js";
5
6
  import { DEFAULT_QR_MAX_HISTORY, clearAllQrMarkers, clearQrMarker, medianQrPosition, pruneQrDetections, qrDetectedReducer, recordQrDetection, recordQrSizeEstimate, selectDerivedQrPlacement, selectLatestQrDetection, selectQrMarker, selectQrMarkers, selectQrPoseStability, selectQrRawObservations, selectQrSize, selectResolvedQrSizeM, selectSolvedQrPose, selectStableQrPose, setQrMaxHistory } from "./qr-detected-slice.js";
7
+ import { buildRawGpsPoint, buildRecordGpsEventPayload, createGpsPositionHandler, eulerToQuaternion, resetCoordinatorState } from "./gps-event-coordinator.js";
6
8
  import { captureGpsAnchorSample } from "./gps-ar-pose-sampler.js";
7
9
  import { selectAlignmentMatrix, selectFrameTilesInWebXR, selectGpsPositions, selectOdometryPositions, selectOdometryRotations, selectZeroReference } from "./app-selectors.js";
8
10
  import { DEFAULT_TRACKING_QUALITY_OPTIONS, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeResidualConsensus, computeTrackingQualityReport, createTrackingQualityListenerMiddleware, degradedCountUpdated, matrixDelta, reportUpdated, resetTrackingQuality, selectRecentAlignments, selectTrackingQuality, snapshotPushed, snapshotsTrimmed, trackingQualityReducer } from "./tracking-quality.js";
9
11
  import { createPersistenceMiddleware, slicePrefixOf } from "./persistence-middleware.js";
10
- import { t as createSlamAppStore } from "../create-slam-app-store-DXiAnJwR.js";
12
+ import { t as createSlamAppStore } from "../create-slam-app-store-DLv5ZwqU.js";
11
13
  import { replayRecording } from "./recording-replayer.js";
12
14
  import { DEFAULT_MAX_DELAY_MS, ReplayEngine, computeInterActionDelay, extractActionTimestamp } from "./replay-engine.js";
13
15
  import { subscribeToSelector } from "./subscribe-to-selector.js";
14
16
  import { wireStoreSubscribers } from "./store-subscribers.js";
15
- import { a as computeOnboardingGuidance, i as setZeroPos, n as calcRelativeCoordsInMeters, o as selectOnboardingGuidance, r as recordGpsEvent, t as add2dImage } from "../state-BeKvn4B-.js";
17
+ import { a as computeOnboardingGuidance, i as setZeroPos, n as calcRelativeCoordsInMeters, o as selectOnboardingGuidance, r as recordGpsEvent, t as add2dImage } from "../state-U45ioVyB.js";
16
18
  export { DEFAULT_MAX_DELAY_MS, DEFAULT_QR_MAX_HISTORY, DEFAULT_RECORDING_OPTIONS, DEFAULT_TRACKING_QUALITY_OPTIONS, DEPTH_CONSTRAINTS, IMAGE_CONSTRAINTS, ReplayEngine, STORAGE_KEY, 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 { n as createPersistenceMiddleware, r as slicePrefixOf, t as PersistenceMiddlewareOptions } from "../persistence-middleware-CG-t08X4.js";
1
+ import { n as createPersistenceMiddleware, r as slicePrefixOf, t as PersistenceMiddlewareOptions } from "../persistence-middleware-CI4Cetnl.js";
2
2
  export { PersistenceMiddlewareOptions, createPersistenceMiddleware, slicePrefixOf };
@@ -1,4 +1,4 @@
1
- import { d as QrSizeStatus, l as QrSizeEstimate } from "../qr-size-measurer-DxiMqRUw.js";
2
- import { a as QrPoseStability, o as QrPoseStabilityOptions, s as QrPoseStabilityStatus } from "../qr-pose-aggregation-CypnmjA-.js";
3
- 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";
1
+ import { d as QrSizeStatus, l as QrSizeEstimate } from "../qr-size-measurer-Bl_i-umk.js";
2
+ import { a as QrPoseStability, o as QrPoseStabilityOptions, s as QrPoseStabilityStatus } from "../qr-pose-aggregation-BL6gfl0s.js";
3
+ 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-CPEkGbxh.js";
4
4
  export { DEFAULT_QR_MAX_HISTORY, QrDetectedState, QrDetectionEntry, QrMarkerState, QrPoseStability, QrPoseStabilityOptions, QrPoseStabilityStatus, QrSizeEstimate, QrSizeStatus, RootWithQrDetected, clearAllQrMarkers, clearQrMarker, medianQrPosition, pruneQrDetections, qrDetectedReducer, recordQrDetection, recordQrSizeEstimate, selectDerivedQrPlacement, selectLatestQrDetection, selectQrMarker, selectQrMarkers, selectQrPoseStability, selectQrRawObservations, selectQrSize, selectResolvedQrSizeM, selectSolvedQrPose, selectStableQrPose, setQrMaxHistory };
@@ -1,5 +1,6 @@
1
+ import { n as lowerMedian } from "../median-Bla_W50f.js";
1
2
  import { deriveQrPlacement, deriveSolvedQrPose } from "../ar/qr-derived-pose.js";
2
- import { i as evaluateQrPoseStability } from "../qr-pose-aggregation-DBiaLW0O.js";
3
+ import { i as evaluateQrPoseStability } from "../qr-pose-aggregation-H-O_Jjz9.js";
3
4
  import { createSlice } from "@reduxjs/toolkit";
4
5
  //#region ../src/state/qr-detected-slice.ts
5
6
  /**
@@ -201,11 +202,6 @@ function selectResolvedQrSizeM(state, text) {
201
202
  const size = state.qrDetected.markers[text]?.size;
202
203
  return size?.status === "estimated" ? size.estimateM : null;
203
204
  }
204
- /** Per-axis median of a numeric list (returns the lower-middle for even n). */
205
- function medianOf(values) {
206
- const sorted = [...values].sort((a, b) => a - b);
207
- return sorted[Math.floor((sorted.length - 1) / 2)];
208
- }
209
205
  /**
210
206
  * Robust per-axis median of the world positions across a marker's detection
211
207
  * window — the "running estimate" the bounded buffer enables (Note 3). Outliers
@@ -220,9 +216,9 @@ function medianQrPosition(entries) {
220
216
  const ys = poses.map((p) => p.position[1]);
221
217
  const zs = poses.map((p) => p.position[2]);
222
218
  return [
223
- medianOf(xs),
224
- medianOf(ys),
225
- medianOf(zs)
219
+ lowerMedian(xs),
220
+ lowerMedian(ys),
221
+ lowerMedian(zs)
226
222
  ];
227
223
  }
228
224
  /**
@@ -1,2 +1,2 @@
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";
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-Cai9D14V.js";
2
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 };
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
- import { t as DEFAULT_MOTION_FILTER } from "../capture-motion-gate-_NdTSwKi.js";
2
+ import { t as DEFAULT_MOTION_FILTER } from "../capture-motion-gate-D1eyGC_o.js";
3
3
  import { DEFAULT_QUALITY_FILTER } from "../ar/image-quality.js";
4
4
  //#region ../src/state/recording-options.ts
5
5
  /**
@@ -140,12 +140,23 @@ const DEPTH_CONSTRAINTS = {
140
140
  step: 1
141
141
  }
142
142
  };
143
- /** Validation constraints for image options */
143
+ /**
144
+ * Validation constraints for image options.
145
+ *
146
+ * `intervalMs` min/step lowered 1000/500 → 250/250 (2026-07-10) so
147
+ * splat-style object scans can capture up to 4 Hz — at the old 1 Hz floor a
148
+ * slow orbit yields ~1 frame/m, too sparse for Gaussian-splat reconstruction
149
+ * (50–150+ frames/object). An interval faster than the readback+encode path
150
+ * cannot overlap captures: `captureInProgress` serialises them and the
151
+ * interval is measured from the actual capture time, so the pipeline
152
+ * self-limits. See
153
+ * GpsPlusSlamJs_Docs/docs/2026-07-10-splat-orbit-capture-rate-finding.md.
154
+ */
144
155
  const IMAGE_CONSTRAINTS = {
145
156
  intervalMs: {
146
- min: 1e3,
157
+ min: 250,
147
158
  max: 1e4,
148
- step: 500
159
+ step: 250
149
160
  },
150
161
  quality: {
151
162
  min: .3,
@@ -293,15 +304,33 @@ const QR_CONSTRAINTS = {
293
304
  * Validate and normalize AR crash isolation flags.
294
305
  * Missing or invalid values fall back to defaults.
295
306
  */
307
+ /**
308
+ * Boolean-or-default (quality-review C-1): persisted/external values are
309
+ * untrusted, so anything that is not a real boolean falls back to the
310
+ * default. Shared by every validator below — the ~30 hand-rolled copies of
311
+ * this ternary are exactly the drift a helper prevents.
312
+ */
313
+ function boolOr(value, fallback) {
314
+ return typeof value === "boolean" ? value : fallback;
315
+ }
316
+ /**
317
+ * Finite-number-or-default (quality-review C-1): anything that is not a
318
+ * FINITE number falls back to the default. The finiteness guard was applied
319
+ * inconsistently across the hand-rolled validators; it is now uniform.
320
+ * Range/step constraints beyond finiteness stay at the call sites.
321
+ */
322
+ function numOr(value, fallback) {
323
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
324
+ }
296
325
  function validateArCrashIsolationOptions(options) {
297
326
  const defaults = DEFAULT_RECORDING_OPTIONS.arCrashIsolation;
298
327
  return {
299
- enableDomOverlay: typeof options.enableDomOverlay === "boolean" ? options.enableDomOverlay : defaults.enableDomOverlay,
300
- enableCameraAccess: typeof options.enableCameraAccess === "boolean" ? options.enableCameraAccess : defaults.enableCameraAccess,
301
- enableDepthSensingFeature: typeof options.enableDepthSensingFeature === "boolean" ? options.enableDepthSensingFeature : defaults.enableDepthSensingFeature,
302
- enableCss3dRenderer: typeof options.enableCss3dRenderer === "boolean" ? options.enableCss3dRenderer : defaults.enableCss3dRenderer,
303
- enableCameraTextureAcquisition: typeof options.enableCameraTextureAcquisition === "boolean" ? options.enableCameraTextureAcquisition : defaults.enableCameraTextureAcquisition,
304
- applyChromiumProjectionLayerWorkaround: typeof options.applyChromiumProjectionLayerWorkaround === "boolean" ? options.applyChromiumProjectionLayerWorkaround : defaults.applyChromiumProjectionLayerWorkaround
328
+ enableDomOverlay: boolOr(options.enableDomOverlay, defaults.enableDomOverlay),
329
+ enableCameraAccess: boolOr(options.enableCameraAccess, defaults.enableCameraAccess),
330
+ enableDepthSensingFeature: boolOr(options.enableDepthSensingFeature, defaults.enableDepthSensingFeature),
331
+ enableCss3dRenderer: boolOr(options.enableCss3dRenderer, defaults.enableCss3dRenderer),
332
+ enableCameraTextureAcquisition: boolOr(options.enableCameraTextureAcquisition, defaults.enableCameraTextureAcquisition),
333
+ applyChromiumProjectionLayerWorkaround: boolOr(options.applyChromiumProjectionLayerWorkaround, defaults.applyChromiumProjectionLayerWorkaround)
305
334
  };
306
335
  }
307
336
  /**
@@ -312,9 +341,9 @@ function validateArCrashIsolationOptions(options) {
312
341
  function validateCompassDebugOptions(options) {
313
342
  const defaults = DEFAULT_RECORDING_OPTIONS.compassDebug;
314
343
  return {
315
- coldStartOverride: typeof options.coldStartOverride === "boolean" ? options.coldStartOverride : defaults.coldStartOverride,
316
- rotationPrior: typeof options.rotationPrior === "boolean" ? options.rotationPrior : defaults.rotationPrior,
317
- webXRConsistency: typeof options.webXRConsistency === "boolean" ? options.webXRConsistency : defaults.webXRConsistency
344
+ coldStartOverride: boolOr(options.coldStartOverride, defaults.coldStartOverride),
345
+ rotationPrior: boolOr(options.rotationPrior, defaults.rotationPrior),
346
+ webXRConsistency: boolOr(options.webXRConsistency, defaults.webXRConsistency)
318
347
  };
319
348
  }
320
349
  /**
@@ -324,7 +353,7 @@ function validateCompassDebugOptions(options) {
324
353
  */
325
354
  function validateLoopClosureDebugOptions(options) {
326
355
  const defaults = DEFAULT_RECORDING_OPTIONS.loopClosureDebug;
327
- return { detectorEnabled: typeof options.detectorEnabled === "boolean" ? options.detectorEnabled : defaults.detectorEnabled };
356
+ return { detectorEnabled: boolOr(options.detectorEnabled, defaults.detectorEnabled) };
328
357
  }
329
358
  /**
330
359
  * Validate and normalize the live debug-overlay visibility toggles.
@@ -335,12 +364,12 @@ function validateLoopClosureDebugOptions(options) {
335
364
  function validateVisualizationOptions(options) {
336
365
  const defaults = DEFAULT_RECORDING_OPTIONS.visualization;
337
366
  return {
338
- frameTiles: typeof options.frameTiles === "boolean" ? options.frameTiles : defaults.frameTiles,
339
- occupancyCubes: typeof options.occupancyCubes === "boolean" ? options.occupancyCubes : defaults.occupancyCubes,
340
- gpsAlignmentMarkers: typeof options.gpsAlignmentMarkers === "boolean" ? options.gpsAlignmentMarkers : defaults.gpsAlignmentMarkers,
341
- compassCubes: typeof options.compassCubes === "boolean" ? options.compassCubes : defaults.compassCubes,
342
- headingUpMap: typeof options.headingUpMap === "boolean" ? options.headingUpMap : defaults.headingUpMap,
343
- statsOverlay: typeof options.statsOverlay === "boolean" ? options.statsOverlay : defaults.statsOverlay
367
+ frameTiles: boolOr(options.frameTiles, defaults.frameTiles),
368
+ occupancyCubes: boolOr(options.occupancyCubes, defaults.occupancyCubes),
369
+ gpsAlignmentMarkers: boolOr(options.gpsAlignmentMarkers, defaults.gpsAlignmentMarkers),
370
+ compassCubes: boolOr(options.compassCubes, defaults.compassCubes),
371
+ headingUpMap: boolOr(options.headingUpMap, defaults.headingUpMap),
372
+ statsOverlay: boolOr(options.statsOverlay, defaults.statsOverlay)
344
373
  };
345
374
  }
346
375
  /**
@@ -360,9 +389,9 @@ function clamp(value, min, max) {
360
389
  function validateQrOptions(options) {
361
390
  const defaults = DEFAULT_RECORDING_OPTIONS.qr;
362
391
  return {
363
- enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
364
- intervalMs: clamp(typeof options.intervalMs === "number" && Number.isFinite(options.intervalMs) ? options.intervalMs : defaults.intervalMs, QR_CONSTRAINTS.intervalMs.min, QR_CONSTRAINTS.intervalMs.max),
365
- captureSize: clamp(typeof options.captureSize === "number" && Number.isFinite(options.captureSize) ? options.captureSize : defaults.captureSize, QR_CONSTRAINTS.captureSize.min, QR_CONSTRAINTS.captureSize.max)
392
+ enabled: boolOr(options.enabled, defaults.enabled),
393
+ intervalMs: clamp(numOr(options.intervalMs, defaults.intervalMs), QR_CONSTRAINTS.intervalMs.min, QR_CONSTRAINTS.intervalMs.max),
394
+ captureSize: clamp(numOr(options.captureSize, defaults.captureSize), QR_CONSTRAINTS.captureSize.min, QR_CONSTRAINTS.captureSize.max)
366
395
  };
367
396
  }
368
397
  /**
@@ -372,10 +401,10 @@ function validateQrOptions(options) {
372
401
  function validateDepthOptions(options) {
373
402
  const defaults = DEFAULT_RECORDING_OPTIONS.depth;
374
403
  return {
375
- enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
376
- intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, DEPTH_CONSTRAINTS.intervalMs.min, DEPTH_CONSTRAINTS.intervalMs.max),
377
- gridSize: clamp(typeof options.gridSize === "number" && Number.isFinite(options.gridSize) ? Math.round(options.gridSize) : defaults.gridSize, DEPTH_CONSTRAINTS.gridSize.min, DEPTH_CONSTRAINTS.gridSize.max),
378
- rgb: typeof options.rgb === "boolean" ? options.rgb : defaults.rgb
404
+ enabled: boolOr(options.enabled, defaults.enabled),
405
+ intervalMs: clamp(numOr(options.intervalMs, defaults.intervalMs), DEPTH_CONSTRAINTS.intervalMs.min, DEPTH_CONSTRAINTS.intervalMs.max),
406
+ gridSize: clamp(Math.round(numOr(options.gridSize, defaults.gridSize)), DEPTH_CONSTRAINTS.gridSize.min, DEPTH_CONSTRAINTS.gridSize.max),
407
+ rgb: boolOr(options.rgb, defaults.rgb)
379
408
  };
380
409
  }
381
410
  /**
@@ -389,10 +418,10 @@ function validateDepthOptions(options) {
389
418
  function validateMotionFilterOptions(options) {
390
419
  const defaults = DEFAULT_RECORDING_OPTIONS.images.motionFilter;
391
420
  return {
392
- enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
393
- maxAngularVelocity: clamp(typeof options.maxAngularVelocity === "number" && Number.isFinite(options.maxAngularVelocity) ? options.maxAngularVelocity : defaults.maxAngularVelocity, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.min, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.max),
394
- maxLinearVelocity: clamp(typeof options.maxLinearVelocity === "number" && Number.isFinite(options.maxLinearVelocity) ? options.maxLinearVelocity : defaults.maxLinearVelocity, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.min, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.max),
395
- maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, MOTION_FILTER_CONSTRAINTS.maxWaitMs.min, MOTION_FILTER_CONSTRAINTS.maxWaitMs.max)
421
+ enabled: boolOr(options.enabled, defaults.enabled),
422
+ maxAngularVelocity: clamp(numOr(options.maxAngularVelocity, defaults.maxAngularVelocity), MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.min, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.max),
423
+ maxLinearVelocity: clamp(numOr(options.maxLinearVelocity, defaults.maxLinearVelocity), MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.min, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.max),
424
+ maxWaitMs: clamp(numOr(options.maxWaitMs, defaults.maxWaitMs), MOTION_FILTER_CONSTRAINTS.maxWaitMs.min, MOTION_FILTER_CONSTRAINTS.maxWaitMs.max)
396
425
  };
397
426
  }
398
427
  /**
@@ -407,10 +436,10 @@ function validateMotionFilterOptions(options) {
407
436
  function validateQualityFilterOptions(options) {
408
437
  const defaults = DEFAULT_RECORDING_OPTIONS.images.qualityFilter;
409
438
  return {
410
- enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
411
- blurRelativeThreshold: clamp(typeof options.blurRelativeThreshold === "number" && Number.isFinite(options.blurRelativeThreshold) ? options.blurRelativeThreshold : defaults.blurRelativeThreshold, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.min, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.max),
412
- minMeanLuminance: clamp(typeof options.minMeanLuminance === "number" && Number.isFinite(options.minMeanLuminance) ? options.minMeanLuminance : defaults.minMeanLuminance, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.min, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.max),
413
- maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.min, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.max)
439
+ enabled: boolOr(options.enabled, defaults.enabled),
440
+ blurRelativeThreshold: clamp(numOr(options.blurRelativeThreshold, defaults.blurRelativeThreshold), QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.min, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.max),
441
+ minMeanLuminance: clamp(numOr(options.minMeanLuminance, defaults.minMeanLuminance), QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.min, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.max),
442
+ maxWaitMs: clamp(numOr(options.maxWaitMs, defaults.maxWaitMs), QUALITY_FILTER_CONSTRAINTS.maxWaitMs.min, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.max)
414
443
  };
415
444
  }
416
445
  /**
@@ -420,10 +449,10 @@ function validateQualityFilterOptions(options) {
420
449
  function validateImageOptions(options) {
421
450
  const defaults = DEFAULT_RECORDING_OPTIONS.images;
422
451
  return {
423
- enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
424
- intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, IMAGE_CONSTRAINTS.intervalMs.min, IMAGE_CONSTRAINTS.intervalMs.max),
425
- quality: clamp(typeof options.quality === "number" ? options.quality : defaults.quality, IMAGE_CONSTRAINTS.quality.min, IMAGE_CONSTRAINTS.quality.max),
426
- resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max),
452
+ enabled: boolOr(options.enabled, defaults.enabled),
453
+ intervalMs: clamp(numOr(options.intervalMs, defaults.intervalMs), IMAGE_CONSTRAINTS.intervalMs.min, IMAGE_CONSTRAINTS.intervalMs.max),
454
+ quality: clamp(numOr(options.quality, defaults.quality), IMAGE_CONSTRAINTS.quality.min, IMAGE_CONSTRAINTS.quality.max),
455
+ resolutionDivisor: clamp(numOr(options.resolutionDivisor, defaults.resolutionDivisor), IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max),
427
456
  motionFilter: validateMotionFilterOptions(options.motionFilter ?? {}),
428
457
  qualityFilter: validateQualityFilterOptions(options.qualityFilter ?? {})
429
458
  };
@@ -478,13 +507,13 @@ function validateOccupancyOptions(options) {
478
507
  const legacyOcclusionMeshEnabled = options.occlusionMeshEnabled;
479
508
  const legacyOccluderDebugViz = options.occluderDebugViz;
480
509
  return {
481
- cellSizeM: clamp(typeof options.cellSizeM === "number" && Number.isFinite(options.cellSizeM) ? options.cellSizeM : defaults.cellSizeM, OCCUPANCY_CONSTRAINTS.cellSizeM.min, OCCUPANCY_CONSTRAINTS.cellSizeM.max),
482
- minConfidence: clamp(typeof options.minConfidence === "number" && Number.isFinite(options.minConfidence) ? Math.round(options.minConfidence) : defaults.minConfidence, OCCUPANCY_CONSTRAINTS.minConfidence.min, OCCUPANCY_CONSTRAINTS.minConfidence.max),
510
+ cellSizeM: clamp(numOr(options.cellSizeM, defaults.cellSizeM), OCCUPANCY_CONSTRAINTS.cellSizeM.min, OCCUPANCY_CONSTRAINTS.cellSizeM.max),
511
+ minConfidence: clamp(Math.round(numOr(options.minConfidence, defaults.minConfidence)), OCCUPANCY_CONSTRAINTS.minConfidence.min, OCCUPANCY_CONSTRAINTS.minConfidence.max),
483
512
  persistentOcclusion: resolvePersistentOcclusion(options, legacyOcclusionMeshEnabled, defaults.persistentOcclusion),
484
- liveOcclusion: typeof options.liveOcclusion === "boolean" ? options.liveOcclusion : defaults.liveOcclusion,
513
+ liveOcclusion: boolOr(options.liveOcclusion, defaults.liveOcclusion),
485
514
  occluderDebugStyle: resolveOccluderDebugStyle(options, legacyOccluderDebugViz, defaults.occluderDebugStyle),
486
515
  occluderMeshMode: OCCLUDER_MESH_MODES.includes(options.occluderMeshMode) ? options.occluderMeshMode : defaults.occluderMeshMode,
487
- occluderRadiusM: clamp(typeof options.occluderRadiusM === "number" && Number.isFinite(options.occluderRadiusM) ? Math.round(options.occluderRadiusM) : defaults.occluderRadiusM, OCCUPANCY_CONSTRAINTS.occluderRadiusM.min, OCCUPANCY_CONSTRAINTS.occluderRadiusM.max)
516
+ occluderRadiusM: clamp(Math.round(numOr(options.occluderRadiusM, defaults.occluderRadiusM)), OCCUPANCY_CONSTRAINTS.occluderRadiusM.min, OCCUPANCY_CONSTRAINTS.occluderRadiusM.max)
488
517
  };
489
518
  }
490
519
  /**
@@ -497,8 +526,8 @@ function validateOccupancyOptions(options) {
497
526
  function validateFrameTileDisplayOptions(options) {
498
527
  const defaults = DEFAULT_RECORDING_OPTIONS.frameTileDisplay;
499
528
  return {
500
- 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),
501
- maxTiles: clamp(typeof options.maxTiles === "number" && Number.isFinite(options.maxTiles) ? Math.round(options.maxTiles) : defaults.maxTiles, FRAME_TILE_DISPLAY_CONSTRAINTS.maxTiles.min, FRAME_TILE_DISPLAY_CONSTRAINTS.maxTiles.max)
529
+ divisor: clamp(Math.round(numOr(options.divisor, defaults.divisor)), FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.min, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.max),
530
+ maxTiles: clamp(Math.round(numOr(options.maxTiles, defaults.maxTiles)), FRAME_TILE_DISPLAY_CONSTRAINTS.maxTiles.min, FRAME_TILE_DISPLAY_CONSTRAINTS.maxTiles.max)
502
531
  };
503
532
  }
504
533
  /**
@@ -1,3 +1,3 @@
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";
1
+ import { N as CombinedRootState } from "../create-slam-app-store-CH31erpP.js";
2
+ import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-DyIN13nG.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 { t as createSlamAppStore } from "../create-slam-app-store-DXiAnJwR.js";
3
+ import { t as createSlamAppStore } from "../create-slam-app-store-DLv5ZwqU.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-BW8SiLo1.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-DziOl7P5.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-DmCAc7WM.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-DAymjsd1.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-dQV8SpsO.js";
2
- import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DJUErW-o.js";
1
+ import { t as SubscribableStore } from "../subscribe-to-selector-Cgo9JTfS.js";
2
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DtwakLrQ.js";
3
3
  export { StoreSubscriberDeps, SubscribableStore, wireStoreSubscribers };
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
2
  import { selectAlignmentMatrix, selectGpsPositions, selectOdometryPositions, selectOdometryRotations, selectZeroReference } from "./app-selectors.js";
3
- import { t as buildMapData } from "../map-data-1tF5gcYV.js";
3
+ import { t as buildMapData } from "../map-data-D3oE8AQP.js";
4
4
  import { subscribeToSelector } from "./subscribe-to-selector.js";
5
- import { calcGpsCoords } from "gps-plus-slam-js";
6
5
  import { mat4, vec3 } from "gl-matrix";
6
+ import { calcGpsCoords } from "gps-plus-slam-js";
7
7
  //#region ../src/state/store-subscribers.ts
8
8
  const log = createLogger("StoreSubscribers");
9
9
  /**
@@ -42,21 +42,38 @@ function wireStoreSubscribers(store, deps) {
42
42
  * fused-dot feedback, Slice B), or `null` when there is no overlay or it
43
43
  * has no `render` (the minimal `setGpsPosition`-only dep shape).
44
44
  */
45
+ let lastGpsPositionsRef = null;
46
+ let lastOdomPositionsRef = null;
47
+ let lastMatrixRef = null;
48
+ let lastZeroRef = null;
49
+ let lastSnapshotCount = -1;
50
+ let lastMapData = null;
45
51
  function rebuildMap() {
46
52
  if (!deps.mapOverlay?.render) return null;
47
53
  const state = store.getState();
54
+ const gpsPositions = selectGpsPositions(state);
55
+ const odometryPositions = selectOdometryPositions(state);
56
+ const alignmentMatrix = selectAlignmentMatrix(state);
57
+ const zeroRef = selectZeroReference(state);
58
+ if (gpsPositions === lastGpsPositionsRef && odometryPositions === lastOdomPositionsRef && alignmentMatrix === lastMatrixRef && zeroRef === lastZeroRef && alignmentSnapshotGps.length === lastSnapshotCount) return lastMapData;
48
59
  const data = buildMapData({
49
- rawGpsPath: selectGpsPositions(state).map((p) => ({
60
+ rawGpsPath: gpsPositions.map((p) => ({
50
61
  lat: p.latitude,
51
62
  lng: p.longitude,
52
63
  accuracy: p.latLongAccuracy
53
64
  })),
54
- odometryPositions: selectOdometryPositions(state),
65
+ odometryPositions,
55
66
  odometryRotations: selectOdometryRotations(state),
56
- alignmentMatrix: selectAlignmentMatrix(state),
57
- zeroRef: selectZeroReference(state),
67
+ alignmentMatrix,
68
+ zeroRef,
58
69
  alignmentSnapshots: alignmentSnapshotGps
59
70
  });
71
+ lastGpsPositionsRef = gpsPositions;
72
+ lastOdomPositionsRef = odometryPositions;
73
+ lastMatrixRef = alignmentMatrix;
74
+ lastZeroRef = zeroRef;
75
+ lastSnapshotCount = alignmentSnapshotGps.length;
76
+ lastMapData = data;
60
77
  try {
61
78
  deps.mapOverlay.render(data);
62
79
  } catch (err) {
@@ -1,2 +1,2 @@
1
- import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-dQV8SpsO.js";
1
+ import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-Cgo9JTfS.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-D1QSMuKu.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-CH31erpP.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 };
@@ -1,8 +1,9 @@
1
- import { t as geodesicAngleRad } from "../geodesic-angle-BTldfFgs.js";
1
+ import { t as interpolatingMedian } from "../median-Bla_W50f.js";
2
+ import { t as geodesicAngleRad } from "../geodesic-angle-HXBWiXiI.js";
2
3
  import { selectTrackingPhase } from "./tracking-slice.js";
3
4
  import { selectAlignmentMatrix, selectGpsPositions, selectOdometryPositions, selectZeroReference } from "./app-selectors.js";
4
- import { calcGpsCoords, distanceInMeters } from "gps-plus-slam-js";
5
5
  import { mat4, quat, vec3 } from "gl-matrix";
6
+ import { calcGpsCoords, distanceInMeters } from "gps-plus-slam-js";
6
7
  import { createListenerMiddleware, createSlice } from "@reduxjs/toolkit";
7
8
  //#region ../src/state/tracking-quality.ts
8
9
  const DEFAULT_TRACKING_QUALITY_OPTIONS = {
@@ -19,7 +20,7 @@ const DEFAULT_TRACKING_QUALITY_OPTIONS = {
19
20
  residualConfidenceTargetM: 3,
20
21
  gpsAccuracyFloorM: 1,
21
22
  degradedHoldoff: 3,
22
- convergenceEmaAlpha: .3
23
+ convergenceEmaAlpha: .25
23
24
  };
24
25
  const initialState = {
25
26
  recentAlignments: [],
@@ -49,12 +50,6 @@ function bearingDeg(north, east) {
49
50
  if (deg < 0) deg += 360;
50
51
  return deg;
51
52
  }
52
- function median(values) {
53
- if (values.length === 0) return 0;
54
- const sorted = [...values].sort((a, b) => a - b);
55
- const mid = Math.floor(sorted.length / 2);
56
- return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
57
- }
58
53
  /**
59
54
  * Linear ramp: `value ≤ low` → 1, `value ≥ high` → 0, linear between.
60
55
  * Used by sub-scores whose underlying physical quantity grows as
@@ -238,7 +233,7 @@ function computeResidualConsensus(alignmentMatrix, gpsPositions, odometryPositio
238
233
  medianResidualM: rawResidualCount > 0 ? rawResidualSum / rawResidualCount : 0,
239
234
  count: normalised.length
240
235
  };
241
- const medianNorm = median(normalised);
236
+ const medianNorm = interpolatingMedian(normalised);
242
237
  const medianResidualM = rawResidualSum / rawResidualCount;
243
238
  return {
244
239
  score: clamp01(1 / (1 + medianNorm / options.residualConfidenceTargetM)),
@@ -280,7 +275,7 @@ function computeGpsAccuracy(gpsPositions, options = {}) {
280
275
  countAccurate: 0,
281
276
  countTotal: gpsPositions.length - start
282
277
  };
283
- const medianM = median(accs);
278
+ const medianM = interpolatingMedian(accs);
284
279
  return {
285
280
  score: rampDown(medianM, goodMedianM, badMedianM),
286
281
  medianM,
@@ -597,15 +592,23 @@ function createTrackingQualityListenerMiddleware(options = {}) {
597
592
  ...options
598
593
  };
599
594
  const listenerMiddleware = createListenerMiddleware();
595
+ let lastPoseActionPhase = null;
600
596
  listenerMiddleware.startListening({
601
597
  predicate: (action) => inputActionPredicate(action),
602
598
  effect: (action, api) => {
603
599
  const state = api.getState();
604
600
  if (action.type === TRACKING_QUALITY_INPUT_ACTIONS.startSession || action.type === TRACKING_QUALITY_INPUT_ACTIONS.resetTracking) {
601
+ lastPoseActionPhase = null;
605
602
  const tq = state.trackingQuality;
606
603
  if (tq && (tq.recentAlignments.length > 0 || tq.report !== null || tq.degradedConsecutiveCount > 0)) api.dispatch(resetTrackingQuality());
607
604
  return;
608
605
  }
606
+ if (action.type === TRACKING_QUALITY_INPUT_ACTIONS.poseReceived || action.type === TRACKING_QUALITY_INPUT_ACTIONS.poseLost) {
607
+ const phase = selectTrackingPhase(state);
608
+ const existingReport = state.trackingQuality?.report ?? null;
609
+ if (phase === lastPoseActionPhase && existingReport !== null) return;
610
+ lastPoseActionPhase = phase;
611
+ }
609
612
  if (action.type === TRACKING_QUALITY_INPUT_ACTIONS.gpsRecorded || action.type === TRACKING_QUALITY_INPUT_ACTIONS.setZeroPos) {
610
613
  const alignment = selectAlignmentMatrix(state);
611
614
  if (alignment) {
@@ -1,2 +1,2 @@
1
- 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";
1
+ 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-Bt2OEQhA.js";
2
2
  export { DeviceOrientation, PoseReceivedPayload, ResetTransformData, TrackingPhase, TrackingSliceState, clearLastRestartedPayload, originReset, poseLost, poseReceived, resetTracking, selectLastRestartedPayload, selectLastSensorOrientation, selectLastValidPose, selectLostFrameCount, selectTrackingPhase, trackingReducer };
@@ -1,13 +1,12 @@
1
- import "./state/gps-event-coordinator.js";
2
1
  import "./state/tracking-slice.js";
3
2
  import "./state/recording-options.js";
4
3
  import "./state/recording-slice.js";
5
4
  import "./state/qr-detected-slice.js";
6
- import "./state/gps-ar-pose-sampler.js";
5
+ import "./state/gps-event-coordinator.js";
7
6
  import "./state/app-selectors.js";
8
7
  import { selectTrackingQuality } from "./state/tracking-quality.js";
9
8
  import "./state/persistence-middleware.js";
10
- import "./create-slam-app-store-DXiAnJwR.js";
9
+ import "./create-slam-app-store-DLv5ZwqU.js";
11
10
  import "./state/recording-replayer.js";
12
11
  import "./state/store-subscribers.js";
13
12
  import { add2dImage, calcRelativeCoordsInMeters, recordGpsEvent as recordGpsEvent$1, setZeroPos as setZeroPos$1 } from "gps-plus-slam-js";
@@ -1,2 +1,2 @@
1
- import { a as formatTimestamp, i as formatFrameFilename, n as SESSION_IMAGES_DIR, r as formatActionFilename, t as LEGACY_SESSION_IMAGES_DIR } from "../file-system-utils-DueXHxo9.js";
1
+ import { a as formatTimestamp, i as formatFrameFilename, n as SESSION_IMAGES_DIR, r as formatActionFilename, t as LEGACY_SESSION_IMAGES_DIR } from "../file-system-utils-CfLTj5Ra.js";
2
2
  export { LEGACY_SESSION_IMAGES_DIR, SESSION_IMAGES_DIR, formatActionFilename, formatFrameFilename, formatTimestamp };
@@ -1,9 +1,9 @@
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
- import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-sEtmM4yW.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
- import { t as NullStorageBackend } from "../null-storage-backend-B1-jlpin.js";
5
- import { t as OpfsStorageBackend } from "../opfs-storage-backend-D6Z03fML.js";
6
- import { a as formatTimestamp, i as formatFrameFilename, r as formatActionFilename } from "../file-system-utils-DueXHxo9.js";
7
- 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";
8
- import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-ncVbaZAz.js";
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-S_odkCk1.js";
2
+ import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-BX7egQKi.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-BHc_b_iA.js";
4
+ import { t as NullStorageBackend } from "../null-storage-backend-DXXuwG8T.js";
5
+ import { t as OpfsStorageBackend } from "../opfs-storage-backend-D1ZpeNEL.js";
6
+ import { a as formatTimestamp, i as formatFrameFilename, r as formatActionFilename } from "../file-system-utils-CfLTj5Ra.js";
7
+ 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-CuBimX1J.js";
8
+ import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-BrodRLq0.js";
9
9
  export { type CreateSessionResult, type Entry, type ExportSessionAsZipOptions, type GpsPathCoord, MAX_ACTION_FILE_SIZE, NullStorageBackend, OpfsStorageBackend, type RecordedAction, type SessionMetadata, type StorageBackend, type ZipActionEntry, type ZipContributorAddFile, type ZipExportContributor, type ZipExportResult, type ZipSubdirEntry, checkStorageQuota, createSession, downloadZip, embedCoverageInSessionJson, exportSessionAsZip, exportSessionHandleAsZip, formatActionFilename, formatFrameFilename, formatTimestamp, getAppRootHandle, getSessionHandle, getSessionsRootHandle, initOpfsStorage, listSessions, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadataFromBlob, loadSessionMetadata as loadSessionMetadataFromZip, readZipEntries, resetOpfsStorage, resetSessionHandles, syncToExternalZip, writeSessionMetadata };