gps-plus-slam-app-framework 1.9.1 → 1.11.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 (267) hide show
  1. package/README.md +14 -14
  2. package/dist/{absolute-orientation-BAxc15J6.d.ts → absolute-orientation-Dj1One3y.d.ts} +1 -1
  3. package/dist/{accuracy-circles-DkWBkF5g.d.ts → accuracy-circles-BHz7yVIL.d.ts} +1 -1
  4. package/dist/{alignment-lerper-gD70k7Fq.d.ts → alignment-lerper-DAHicRON.d.ts} +0 -6
  5. package/dist/{app-selectors-BbAiCRUT.d.ts → app-selectors-DG0ZqaeI.d.ts} +23 -13
  6. package/dist/ar/ar-crash-isolation.d.ts +2 -0
  7. package/dist/ar/ar-crash-isolation.js +40 -0
  8. package/dist/ar/bresenham3d.d.ts +1 -1
  9. package/dist/ar/camera-blit-capture.d.ts +1 -1
  10. package/dist/ar/capability-checker.d.ts +1 -1
  11. package/dist/ar/capture-failure-tracker.d.ts +1 -1
  12. package/dist/ar/capture-motion-gate.d.ts +2 -0
  13. package/dist/{capture-motion-gate-_NdTSwKi.js → ar/capture-motion-gate.js} +25 -2
  14. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  15. package/dist/ar/chromium-camera-access-workaround.js +1 -1
  16. package/dist/ar/depth-grid-lookup.d.ts +1 -1
  17. package/dist/ar/depth-occluder.d.ts +1 -1
  18. package/dist/ar/depth-occluder.js +1 -1
  19. package/dist/ar/depth-sampler.d.ts +2 -2
  20. package/dist/ar/depth-sampler.js +16 -5
  21. package/dist/ar/depth-unprojection.d.ts +1 -1
  22. package/dist/ar/enable-gps-ar.d.ts +1 -1
  23. package/dist/ar/enable-gps-ar.js +2 -2
  24. package/dist/ar/image-capture.d.ts +1 -1
  25. package/dist/ar/image-capture.js +1 -1
  26. package/dist/ar/image-quality.d.ts +2 -2
  27. package/dist/ar/image-quality.js +159 -8
  28. package/dist/ar/index.d.ts +32 -30
  29. package/dist/ar/index.js +15 -14
  30. package/dist/ar/occlusion-mesh-worker.d.ts +2 -2
  31. package/dist/ar/occlusion-mesh-worker.js +1 -1
  32. package/dist/ar/occupancy-grid.d.ts +1 -1
  33. package/dist/ar/occupancy-grid.js +2 -2
  34. package/dist/ar/occupancy-mesher.d.ts +1 -1
  35. package/dist/ar/occupancy-mesher.js +4 -5
  36. package/dist/ar/qr/index.d.ts +11 -0
  37. package/dist/ar/qr/index.js +11 -0
  38. package/dist/ar/{planar-pnp.d.ts → qr/planar-pnp.d.ts} +1 -1
  39. package/dist/ar/{planar-pnp.js → qr/planar-pnp.js} +1 -1
  40. package/dist/ar/qr/qr-debug-view.d.ts +2 -0
  41. package/dist/ar/{qr-debug-view.js → qr/qr-debug-view.js} +2 -2
  42. package/dist/ar/{qr-derived-pose.d.ts → qr/qr-derived-pose.d.ts} +1 -1
  43. package/dist/ar/{qr-derived-pose.js → qr/qr-derived-pose.js} +2 -2
  44. package/dist/ar/{qr-detection-controller.d.ts → qr/qr-detection-controller.d.ts} +1 -1
  45. package/dist/ar/qr/qr-detection-controller.js +2 -0
  46. package/dist/ar/{qr-frontend.d.ts → qr/qr-frontend.d.ts} +1 -1
  47. package/dist/ar/{qr-frontend.js → qr/qr-frontend.js} +1 -1
  48. package/dist/ar/{qr-pose.d.ts → qr/qr-pose.d.ts} +1 -1
  49. package/dist/ar/{qr-pose.js → qr/qr-pose.js} +1 -1
  50. package/dist/ar/qr/qr-size-depth-context.d.ts +3 -0
  51. package/dist/ar/{qr-size-depth-context.js → qr/qr-size-depth-context.js} +4 -4
  52. package/dist/ar/{qr-size-measurer.d.ts → qr/qr-size-measurer.d.ts} +1 -1
  53. package/dist/ar/qr/qr-size-measurer.js +2 -0
  54. package/dist/ar/replay-scene.d.ts +1 -1
  55. package/dist/ar/replay-scene.js +15 -13
  56. package/dist/ar/scene-node-names.d.ts +1 -1
  57. package/dist/ar/webxr-nue-basis.d.ts +1 -1
  58. package/dist/ar/webxr-session.d.ts +4 -4
  59. package/dist/ar/webxr-session.js +2 -2
  60. package/dist/ar/xr-error-handler.d.ts +1 -1
  61. package/dist/ar/xr-frame-loop.d.ts +1 -1
  62. package/dist/ar/xr-frame-loop.js +1 -1
  63. package/dist/ar-crash-isolation-DlXCGzMf.d.ts +52 -0
  64. package/dist/{ar-types-Cc5yvBwn.d.ts → ar-types-D6PYS4bc.d.ts} +16 -1
  65. package/dist/{ar-world-group-alignment-Cfg0trC3.d.ts → ar-world-group-alignment-BdS_h8Nf.d.ts} +2 -2
  66. package/dist/{capability-checker-BTTpygvZ.d.ts → capability-checker-BZ3_x1YL.d.ts} +1 -1
  67. package/dist/capture-motion-gate-CPwLekNf.d.ts +120 -0
  68. package/dist/{chromium-camera-access-workaround-C6yJLXz9.d.ts → chromium-camera-access-workaround-BHR4clTE.d.ts} +1 -1
  69. package/dist/core/index.d.ts +1 -1
  70. package/dist/{create-slam-app-store-D1QSMuKu.d.ts → create-slam-app-store-DFm5K9Ob.d.ts} +15 -6
  71. package/dist/{create-slam-app-store-DXiAnJwR.js → create-slam-app-store-oK9bnqyI.js} +10 -8
  72. package/dist/{depth-grid-lookup-D5atpNZ3.d.ts → depth-grid-lookup-CCuzlqUo.d.ts} +1 -1
  73. package/dist/{depth-sampler-CwObAwEA.d.ts → depth-sampler-CS2jAFw4.d.ts} +15 -5
  74. package/dist/{depth-unprojection-DRdBU90S.d.ts → depth-unprojection-ET3Gwedf.d.ts} +1 -1
  75. package/dist/device-orientation-cache-j-kLP8he.js +20 -0
  76. package/dist/{enable-gps-ar-BBtRO2FJ.d.ts → enable-gps-ar-D_xEHzh5.d.ts} +9 -4
  77. package/dist/{file-system-utils-DueXHxo9.d.ts → file-system-utils-BHI0rXr9.d.ts} +1 -1
  78. package/dist/{frame-conversions-DDcNHkTb.d.ts → frame-conversions-CH7E2Iv_.d.ts} +1 -1
  79. package/dist/{fused-path-C5pp0PJU.d.ts → fused-path-DOKzVMiO.d.ts} +1 -1
  80. package/dist/geo/h3-proximity.d.ts +1 -1
  81. package/dist/geo/h3-proximity.js +1 -1
  82. package/dist/geo/index.d.ts +1 -1
  83. package/dist/{geodesic-angle-BTldfFgs.js → geodesic-angle-CZ_Ow90I.js} +2 -2
  84. package/dist/{gps-CDKDQokE.d.ts → gps-CnhYrJCa.d.ts} +8 -1
  85. package/dist/{gps-anchor-CEjGqEVD.d.ts → gps-anchor-BaqyRsPC.d.ts} +14 -4
  86. package/dist/{gps-ar-pose-sampler-DEGNk2CI.d.ts → gps-ar-pose-sampler-BuuUuK-D.d.ts} +1 -1
  87. package/dist/{gps-event-coordinator-BWpgBrHq.d.ts → gps-event-coordinator-Cruoe5I-.d.ts} +16 -29
  88. package/dist/{gps-event-markers-Di2nBzx-.d.ts → gps-event-markers-y2b2aVl6.d.ts} +35 -1
  89. package/dist/{h3-proximity-D0GTHQmr.d.ts → h3-proximity-BaAulrnM.d.ts} +1 -1
  90. package/dist/{image-capture-Bp6Pd4Md.d.ts → image-capture-BevgKpoO.d.ts} +6 -6
  91. package/dist/{image-capture-DVcuqMtX.js → image-capture-C4DwxC10.js} +12 -10
  92. package/dist/{image-quality-BMx2ko9-.d.ts → image-quality--HLuyJ2r.d.ts} +44 -2
  93. package/dist/{index-cCQWuYqy.d.ts → index-BWVwd9Zw.d.ts} +10 -74
  94. package/dist/{index-B6iBnO_K.d.ts → index-ClmnNJ6-.d.ts} +1 -1
  95. package/dist/index-Dxb6ATNK.d.ts +64 -0
  96. package/dist/index.d.ts +79 -79
  97. package/dist/index.js +26 -24
  98. package/dist/{leaflet-map-overlay-CBWPvaX9.js → leaflet-map-overlay-CTcTVmL1.js} +1 -1
  99. package/dist/{leaflet-map-overlay-C8GS4cUy.d.ts → leaflet-map-overlay-CksetpTt.d.ts} +1 -1
  100. package/dist/{map-data-CUnTzRIC.d.ts → map-data-D8cCqpOM.d.ts} +3 -3
  101. package/dist/{map-data-1tF5gcYV.js → map-data-DkhsYDGM.js} +1 -1
  102. package/dist/{map-overlay-draw-6WJeq0Kg.d.ts → map-overlay-draw-Cy-klqoA.d.ts} +1 -1
  103. package/dist/median-DDBrZGP0.js +44 -0
  104. package/dist/{null-storage-backend-B1-jlpin.d.ts → null-storage-backend-DXXuwG8T.d.ts} +2 -2
  105. package/dist/{occlusion-mesh-kXCQ2FM1.d.ts → occlusion-mesh-BWe2PrVi.d.ts} +23 -12
  106. package/dist/{occupancy-grid-BV7RhB7I.d.ts → occupancy-grid-CYBdmMOo.d.ts} +3 -3
  107. package/dist/{occupancy-mesher-C2ecWhNp.d.ts → occupancy-mesher-B4Bv4BTk.d.ts} +4 -9
  108. package/dist/{opfs-storage-backend-D6Z03fML.d.ts → opfs-storage-backend-D1ZpeNEL.d.ts} +2 -2
  109. package/dist/{persistence-middleware-CG-t08X4.d.ts → persistence-middleware-Cun4aF5M.d.ts} +13 -3
  110. package/dist/{planar-pnp-D7bc_rLX.d.ts → planar-pnp-ByxwDEyM.d.ts} +2 -2
  111. package/dist/{ar-BqCudtqE.js → qr-CTp5xI83.js} +24 -34
  112. package/dist/{qr-debug-view-BJooqbiP.d.ts → qr-debug-view-CGlITU09.d.ts} +2 -2
  113. package/dist/{qr-derived-pose-BwNWn8oV.d.ts → qr-derived-pose-DZPxZd9C.d.ts} +3 -3
  114. package/dist/{qr-detected-slice-TzVb8bij.d.ts → qr-detected-slice-mfyxD2-M.d.ts} +9 -8
  115. package/dist/{qr-detection-controller-Bo4XfQTP.d.ts → qr-detection-controller-C5NII-vs.d.ts} +4 -4
  116. package/dist/{qr-detection-controller-B-tLVd-S.js → qr-detection-controller-DXc1yHRf.js} +3 -3
  117. package/dist/{qr-frontend-BPURlh3S.d.ts → qr-frontend-QzKZSqB-.d.ts} +2 -2
  118. package/dist/{qr-pose-y3vaEd6x.d.ts → qr-pose-21fRDcFO.d.ts} +1 -1
  119. package/dist/{qr-pose-aggregation-DBiaLW0O.js → qr-pose-aggregation-Cp0Mtg_j.js} +7 -12
  120. package/dist/{qr-pose-aggregation-CypnmjA-.d.ts → qr-pose-aggregation-mABSN0AW.d.ts} +2 -2
  121. package/dist/{qr-size-depth-context-apAOmbrZ.d.ts → qr-size-depth-context-CMDv6T29.d.ts} +3 -3
  122. package/dist/{qr-size-measurer-DxiMqRUw.d.ts → qr-size-measurer-rVFf4AdM.d.ts} +5 -5
  123. package/dist/{qr-size-measurer-DLb33geH.js → qr-size-measurer-zZB9S1va.js} +9 -15
  124. package/dist/{recording-replayer-BJ8Lf0QY.d.ts → recording-replayer-qT2EM1Qs.d.ts} +2 -2
  125. package/dist/{recording-slice-BW8SiLo1.d.ts → recording-slice-DXw5-UvO.d.ts} +10 -5
  126. package/dist/{replay-engine-DmCAc7WM.d.ts → replay-engine-B1H_kLhK.d.ts} +1 -1
  127. package/dist/{replay-scene-zJ8SFDjE.d.ts → replay-scene-BJeO36YT.d.ts} +12 -5
  128. package/dist/sensors/absolute-orientation.d.ts +1 -1
  129. package/dist/sensors/absolute-orientation.js +1 -1
  130. package/dist/sensors/gps-error-handler.d.ts +1 -1
  131. package/dist/sensors/gps.d.ts +1 -1
  132. package/dist/sensors/gps.js +10 -8
  133. package/dist/sensors/index.d.ts +3 -3
  134. package/dist/sensors/index.js +1 -1
  135. package/dist/sensors/permission-checker.js +71 -40
  136. package/dist/{session-disposers-BPrMplIC.js → session-disposers-B7hUN90w.js} +1 -1
  137. package/dist/state/app-selectors.d.ts +1 -1
  138. package/dist/state/combined-root-state.d.ts +1 -1
  139. package/dist/state/create-slam-app-store.d.ts +1 -1
  140. package/dist/state/create-slam-app-store.js +1 -1
  141. package/dist/state/gps-ar-pose-sampler.d.ts +2 -3
  142. package/dist/state/gps-ar-pose-sampler.js +1 -1
  143. package/dist/state/gps-event-coordinator.d.ts +2 -1
  144. package/dist/state/gps-event-coordinator.js +4 -46
  145. package/dist/state/index.d.ts +19 -20
  146. package/dist/state/index.js +6 -5
  147. package/dist/state/persistence-middleware.d.ts +2 -2
  148. package/dist/state/persistence-middleware.js +24 -15
  149. package/dist/state/qr-detected-slice.d.ts +3 -3
  150. package/dist/state/qr-detected-slice.js +11 -15
  151. package/dist/state/recording-replayer.d.ts +2 -2
  152. package/dist/state/recording-replayer.js +1 -1
  153. package/dist/state/recording-slice.d.ts +1 -1
  154. package/dist/state/replay-engine.d.ts +1 -1
  155. package/dist/state/store-subscribers.d.ts +2 -2
  156. package/dist/state/store-subscribers.js +23 -6
  157. package/dist/state/subscribe-to-selector.d.ts +1 -1
  158. package/dist/state/tracking-quality.d.ts +1 -1
  159. package/dist/state/tracking-quality.js +14 -11
  160. package/dist/state/tracking-slice.d.ts +1 -1
  161. package/dist/{state-BeKvn4B-.js → state-CDF5LvsO.js} +2 -4
  162. package/dist/storage/file-system-utils.d.ts +1 -1
  163. package/dist/storage/file-system-utils.js +1 -1
  164. package/dist/storage/index.d.ts +8 -8
  165. package/dist/storage/null-storage-backend.d.ts +1 -1
  166. package/dist/storage/opfs-storage-backend.d.ts +1 -1
  167. package/dist/storage/opfs-storage.d.ts +1 -1
  168. package/dist/storage/storage-backend.d.ts +1 -1
  169. package/dist/storage/zip-coverage-embed.d.ts +1 -1
  170. package/dist/storage/zip-coverage-embed.js +1 -1
  171. package/dist/storage/zip-export.d.ts +1 -1
  172. package/dist/storage/zip-export.js +10 -4
  173. package/dist/storage/zip-reader.d.ts +1 -1
  174. package/dist/{storage-backend-sEtmM4yW.d.ts → storage-backend-BX7egQKi.d.ts} +1 -1
  175. package/dist/{store-subscribers-DJUErW-o.d.ts → store-subscribers-CWHToX6N.d.ts} +2 -2
  176. package/dist/{subscribe-to-selector-dQV8SpsO.d.ts → subscribe-to-selector-j-eOYybQ.d.ts} +1 -1
  177. package/dist/test-utils/browser-mocks.d.ts +1 -1
  178. package/dist/test-utils/zip-round-trip-helpers.d.ts +1 -1
  179. package/dist/{tracking-slice-DMkHlbny.d.ts → tracking-slice-BAbcZK-Y.d.ts} +3 -2
  180. package/dist/types/ar-types.d.ts +2 -2
  181. package/dist/types/ar-types.js +31 -1
  182. package/dist/types/geo-types.d.ts +1 -1
  183. package/dist/types/index.d.ts +3 -3
  184. package/dist/types/index.js +2 -1
  185. package/dist/utils/concurrency.d.ts +1 -1
  186. package/dist/utils/failure-tracker.d.ts +1 -1
  187. package/dist/utils/format-file-size.d.ts +1 -1
  188. package/dist/utils/fused-path.d.ts +1 -1
  189. package/dist/utils/fused-path.js +1 -1
  190. package/dist/utils/index.d.ts +7 -7
  191. package/dist/utils/index.js +1 -1
  192. package/dist/utils/list-formatter.d.ts +1 -1
  193. package/dist/utils/logger.d.ts +1 -1
  194. package/dist/utils/logger.js +30 -20
  195. package/dist/visualization/accuracy-circles.d.ts +1 -1
  196. package/dist/visualization/accuracy-circles.js +1 -1
  197. package/dist/visualization/alignment-lerper.d.ts +1 -1
  198. package/dist/visualization/alignment-lerper.js +20 -5
  199. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  200. package/dist/visualization/ar-world-group-alignment.js +2 -2
  201. package/dist/visualization/camera-follower.d.ts +1 -1
  202. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  203. package/dist/visualization/frame-conversions.d.ts +1 -1
  204. package/dist/visualization/frustum-visibility.d.ts +1 -1
  205. package/dist/visualization/gps-anchor.d.ts +1 -1
  206. package/dist/visualization/gps-anchor.js +44 -19
  207. package/dist/visualization/gps-compass-cubes.d.ts +1 -1
  208. package/dist/visualization/gps-event-markers.d.ts +2 -2
  209. package/dist/visualization/gps-event-markers.js +27 -6
  210. package/dist/visualization/hit-test-reticle.d.ts +1 -1
  211. package/dist/visualization/index.d.ts +19 -20
  212. package/dist/visualization/index.js +4 -5
  213. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  214. package/dist/visualization/leaflet-map-overlay.js +1 -1
  215. package/dist/visualization/lerp-utils.d.ts +1 -1
  216. package/dist/visualization/map-data.d.ts +1 -1
  217. package/dist/visualization/map-data.js +1 -1
  218. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  219. package/dist/visualization/occluder-mesh-driver.d.ts +2 -2
  220. package/dist/visualization/occluder-mesh-driver.js +1 -1
  221. package/dist/visualization/occlusion-mesh.d.ts +2 -2
  222. package/dist/visualization/occlusion-mesh.js +29 -14
  223. package/dist/visualization/three-dispose.d.ts +1 -1
  224. package/dist/visualization/vis-colors.d.ts +1 -1
  225. package/dist/{webxr-session-BWCpGd-2.d.ts → webxr-session-DefwObIu.d.ts} +143 -193
  226. package/dist/{webxr-session-BCP2XK7k.js → webxr-session-OyR3YbTq.js} +154 -284
  227. package/dist/{xr-frame-loop-DX3JPpAU.d.ts → xr-frame-loop-BiZvgqP7.d.ts} +1 -1
  228. package/dist/{zip-coverage-embed-ncVbaZAz.d.ts → zip-coverage-embed-CyoX7XL7.d.ts} +1 -1
  229. package/package.json +5 -3
  230. package/dist/ar/qr-debug-view.d.ts +0 -2
  231. package/dist/ar/qr-detection-controller.js +0 -2
  232. package/dist/ar/qr-size-depth-context.d.ts +0 -3
  233. package/dist/ar/qr-size-measurer.js +0 -2
  234. package/dist/capture-motion-gate-BGoAMkmf.d.ts +0 -24
  235. package/dist/map-overlay-BCQgvIgU.d.ts +0 -153
  236. package/dist/recording-options-DYKWVI93.d.ts +0 -693
  237. package/dist/state/recording-options.d.ts +0 -2
  238. package/dist/state/recording-options.js +0 -591
  239. package/dist/visualization/map-overlay.d.ts +0 -2
  240. package/dist/visualization/map-overlay.js +0 -241
  241. /package/dist/{bresenham3d-DGc4nIb-.d.ts → bresenham3d-D-t9i_b5.d.ts} +0 -0
  242. /package/dist/{camera-blit-capture-BimSdyih.d.ts → camera-blit-capture-BlC-arRb.d.ts} +0 -0
  243. /package/dist/{camera-follower-DfBm2J5i.d.ts → camera-follower-CO_ibF2o.d.ts} +0 -0
  244. /package/dist/{capture-failure-tracker-_BVfhpxv.d.ts → capture-failure-tracker-BAUKjtXU.d.ts} +0 -0
  245. /package/dist/{cell-key-DIB4rOTV.js → cell-key-Bj-eYTLA.js} +0 -0
  246. /package/dist/{concurrency-DPeGBH0X.d.ts → concurrency-DW0jQo3G.d.ts} +0 -0
  247. /package/dist/{css3d-renderer-manager-CPpVtvgs.d.ts → css3d-renderer-manager-CJjHtCMT.d.ts} +0 -0
  248. /package/dist/{failure-tracker-CeKf5HIc.d.ts → failure-tracker-B7fzPfZo.d.ts} +0 -0
  249. /package/dist/{format-file-size-DxN-EBLc.d.ts → format-file-size-Da8rZgfs.d.ts} +0 -0
  250. /package/dist/{frustum-visibility-CokkgS_i.d.ts → frustum-visibility-COPfzruF.d.ts} +0 -0
  251. /package/dist/{geo-types-DrGVu8nS.d.ts → geo-types-BfDK8kJu.d.ts} +0 -0
  252. /package/dist/{gps-compass-cubes-1mooS3BS.d.ts → gps-compass-cubes-CT3TWctJ.d.ts} +0 -0
  253. /package/dist/{gps-error-handler-C34GQuTu.d.ts → gps-error-handler-DjVuLXve.d.ts} +0 -0
  254. /package/dist/{hit-test-reticle-CaQbrhbk.d.ts → hit-test-reticle-DhnCMOsc.d.ts} +0 -0
  255. /package/dist/{index-DXPVzOpP.d.ts → index-CjxbDm8W.d.ts} +0 -0
  256. /package/dist/{index-D74JTX4I.d.ts → index-Nr3qg4IH.d.ts} +0 -0
  257. /package/dist/{lerp-utils-Qs8OhumS.d.ts → lerp-utils-bwMwVCpU.d.ts} +0 -0
  258. /package/dist/{list-formatter-DLFDnS70.d.ts → list-formatter-1ttG18MQ.d.ts} +0 -0
  259. /package/dist/{logger-CqTd5Kpk.d.ts → logger-B4StJUDb.d.ts} +0 -0
  260. /package/dist/{opfs-storage-CTkxvxN4.d.ts → opfs-storage-S_odkCk1.d.ts} +0 -0
  261. /package/dist/{scene-node-names-CGb-ylBd.d.ts → scene-node-names-DWzhE7Ro.d.ts} +0 -0
  262. /package/dist/{three-dispose-BMOAmPhb.d.ts → three-dispose-C3mnKQR5.d.ts} +0 -0
  263. /package/dist/{vis-colors-C7HI0u9_.d.ts → vis-colors-CoSpbZEO.d.ts} +0 -0
  264. /package/dist/{webxr-nue-basis-CaCnYxuq.d.ts → webxr-nue-basis-C3vTqkE2.d.ts} +0 -0
  265. /package/dist/{xr-error-handler-uVGDu9IX.d.ts → xr-error-handler-D9y5r8ok.d.ts} +0 -0
  266. /package/dist/{zip-export-CtiUnAlJ.d.ts → zip-export-CuBimX1J.d.ts} +0 -0
  267. /package/dist/{zip-reader-BzENzMH6.d.ts → zip-reader-BHc_b_iA.d.ts} +0 -0
@@ -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-DXw5-UvO.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-B1H_kLhK.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-j-eOYybQ.js";
2
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-CWHToX6N.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-DkhsYDGM.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-j-eOYybQ.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-DFm5K9Ob.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-DDBrZGP0.js";
2
+ import { t as geodesicAngleRad } from "../geodesic-angle-CZ_Ow90I.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-BAbcZK-Y.js";
2
2
  export { DeviceOrientation, PoseReceivedPayload, ResetTransformData, TrackingPhase, TrackingSliceState, clearLastRestartedPayload, originReset, poseLost, poseReceived, resetTracking, selectLastRestartedPayload, selectLastSensorOrientation, selectLastValidPose, selectLostFrameCount, selectTrackingPhase, trackingReducer };
@@ -1,13 +1,11 @@
1
- import "./state/gps-event-coordinator.js";
2
1
  import "./state/tracking-slice.js";
3
- import "./state/recording-options.js";
4
2
  import "./state/recording-slice.js";
5
3
  import "./state/qr-detected-slice.js";
6
- import "./state/gps-ar-pose-sampler.js";
4
+ import "./state/gps-event-coordinator.js";
7
5
  import "./state/app-selectors.js";
8
6
  import { selectTrackingQuality } from "./state/tracking-quality.js";
9
7
  import "./state/persistence-middleware.js";
10
- import "./create-slam-app-store-DXiAnJwR.js";
8
+ import "./create-slam-app-store-oK9bnqyI.js";
11
9
  import "./state/recording-replayer.js";
12
10
  import "./state/store-subscribers.js";
13
11
  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-BHI0rXr9.js";
2
2
  export { LEGACY_SESSION_IMAGES_DIR, SESSION_IMAGES_DIR, formatActionFilename, formatFrameFilename, formatTimestamp };
@@ -33,7 +33,7 @@ function formatFrameFilename(index) {
33
33
  * is a textbook COLMAP tree (`images/frame-NNNNNN.jpg` next to `sparse/0/`).
34
34
  * Both the OPFS write path and the recorder's persisted `imageFile` value must
35
35
  * use THIS constant so a recording stays self-consistent (COLMAP export plan
36
- * Q5, gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-13-colmap-export-plan.md).
36
+ * Q5, gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-13-1205-colmap-export-plan.md).
37
37
  */
38
38
  const SESSION_IMAGES_DIR = "images";
39
39
  /**
@@ -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-BHI0rXr9.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-CyoX7XL7.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 };
@@ -1,2 +1,2 @@
1
- import { t as NullStorageBackend } from "../null-storage-backend-B1-jlpin.js";
1
+ import { t as NullStorageBackend } from "../null-storage-backend-DXXuwG8T.js";
2
2
  export { NullStorageBackend };
@@ -1,2 +1,2 @@
1
- import { t as OpfsStorageBackend } from "../opfs-storage-backend-D6Z03fML.js";
1
+ import { t as OpfsStorageBackend } from "../opfs-storage-backend-D1ZpeNEL.js";
2
2
  export { OpfsStorageBackend };
@@ -1,2 +1,2 @@
1
- import { a as getAppRootHandle, c as initOpfsStorage, d as resetSessionHandles, f as setSessionHandles, h as writeSessionMetadata, i as createSession, l as listSessions, m as writeFrame, n as SessionMetadata, o as getSessionHandle, p as writeAction, r as checkStorageQuota, s as getSessionsRootHandle, t as CreateSessionResult, u as resetOpfsStorage } from "../opfs-storage-CTkxvxN4.js";
1
+ import { a as getAppRootHandle, c as initOpfsStorage, d as resetSessionHandles, f as setSessionHandles, h as writeSessionMetadata, i as createSession, l as listSessions, m as writeFrame, n as SessionMetadata, o as getSessionHandle, p as writeAction, r as checkStorageQuota, s as getSessionsRootHandle, t as CreateSessionResult, u as resetOpfsStorage } from "../opfs-storage-S_odkCk1.js";
2
2
  export { CreateSessionResult, SessionMetadata, checkStorageQuota, createSession, getAppRootHandle, getSessionHandle, getSessionsRootHandle, initOpfsStorage, listSessions, resetOpfsStorage, resetSessionHandles, setSessionHandles, writeAction, writeFrame, writeSessionMetadata };
@@ -1,2 +1,2 @@
1
- import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-sEtmM4yW.js";
1
+ import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-BX7egQKi.js";
2
2
  export { CreateSessionResult, StorageBackend };
@@ -1,2 +1,2 @@
1
- import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-ncVbaZAz.js";
1
+ import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-CyoX7XL7.js";
2
2
  export { embedCoverageInSessionJson };
@@ -18,7 +18,7 @@ import { BlobReader, BlobWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8
18
18
  * protocol around it.
19
19
  *
20
20
  * @see ./zip-coverage-embed.ts.md
21
- * @see GpsPlusSlamJs_Docs/docs/2026-06-14-followup-progressive-map-browser-indexing-and-backfill.md (B3)
21
+ * @see GpsPlusSlamJs_Docs/docs/2026-06-14-1924-progressive-map-browser-indexing-and-backfill-followup.md (B3)
22
22
  */
23
23
  const log = createLogger("ZipCoverageEmbed");
24
24
  /**
@@ -1,2 +1,2 @@
1
- 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";
1
+ 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";
2
2
  export { ExportSessionAsZipOptions, ZipContributorAddFile, ZipExportContributor, ZipExportResult, downloadZip, exportSessionAsZip, exportSessionHandleAsZip, syncToExternalZip };
@@ -1,4 +1,5 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
+ import { getSessionsRootHandle } from "./opfs-storage.js";
2
3
  import { BlobReader, BlobWriter, ZipWriter } from "@zip.js/zip.js";
3
4
  //#region ../src/storage/zip-export.ts
4
5
  /**
@@ -20,10 +21,15 @@ import { BlobReader, BlobWriter, ZipWriter } from "@zip.js/zip.js";
20
21
  */
21
22
  const log = createLogger("ZipExport");
22
23
  /**
23
- * Get the OPFS sessions directory handle (flat layout).
24
+ * Get the OPFS sessions directory handle from the layout owner
25
+ * (quality-review G-9 — this used to re-derive the
26
+ * `'gps-plus-slam'/'sessions'` path itself, so a root re-nesting in
27
+ * `opfs-storage.ts` would have silently broken export only).
24
28
  */
25
- async function getSessionsHandle() {
26
- return (await (await navigator.storage.getDirectory()).getDirectoryHandle("gps-plus-slam")).getDirectoryHandle("sessions");
29
+ function getSessionsHandle() {
30
+ const sessions = getSessionsRootHandle();
31
+ if (!sessions) throw new Error("OPFS storage not initialized — call initOpfsStorage() before exporting");
32
+ return sessions;
27
33
  }
28
34
  /**
29
35
  * Stream all files from a directory recursively into a ZipWriter.
@@ -65,7 +71,7 @@ async function streamDirectoryToZip(dirHandle, zipWriter, basePath = "") {
65
71
  */
66
72
  async function exportSessionAsZip(sessionName, options) {
67
73
  log.info(`Exporting session: ${sessionName}`);
68
- const sessionsDir = await getSessionsHandle();
74
+ const sessionsDir = getSessionsHandle();
69
75
  let sessionHandle;
70
76
  try {
71
77
  sessionHandle = await sessionsDir.getDirectoryHandle(sessionName);
@@ -1,2 +1,2 @@
1
- import { a as ZipActionEntry, c as loadActionsFromZip, d as loadSessionMetadata, f as loadSessionMetadataFromBlob, i as RecordedAction, l as loadEntriesFromSubdir, m as toZipReader, n as GpsPathCoord, o as ZipSource, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, s as ZipSubdirEntry, t as Entry, u as loadGpsPathFromBlob } from "../zip-reader-BzENzMH6.js";
1
+ import { a as ZipActionEntry, c as loadActionsFromZip, d as loadSessionMetadata, f as loadSessionMetadataFromBlob, i as RecordedAction, l as loadEntriesFromSubdir, m as toZipReader, n as GpsPathCoord, o as ZipSource, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, s as ZipSubdirEntry, t as Entry, u as loadGpsPathFromBlob } from "../zip-reader-BHc_b_iA.js";
2
2
  export { Entry, GpsPathCoord, MAX_ACTION_FILE_SIZE, RecordedAction, ZipActionEntry, ZipSource, ZipSubdirEntry, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadata, loadSessionMetadataFromBlob, readZipEntries, toZipReader };
@@ -1,4 +1,4 @@
1
- import { n as SessionMetadata } from "./opfs-storage-CTkxvxN4.js";
1
+ import { n as SessionMetadata } from "./opfs-storage-S_odkCk1.js";
2
2
 
3
3
  //#region ../src/storage/storage-backend.d.ts
4
4
  interface CreateSessionResult {
@@ -1,5 +1,5 @@
1
- import { t as MapData } from "./map-data-CUnTzRIC.js";
2
- import { t as SubscribableStore } from "./subscribe-to-selector-dQV8SpsO.js";
1
+ import { t as MapData } from "./map-data-D8cCqpOM.js";
2
+ import { t as SubscribableStore } from "./subscribe-to-selector-j-eOYybQ.js";
3
3
  import { LatLong, Matrix4, Quaternion, Vector3 } from "gps-plus-slam-js";
4
4
 
5
5
  //#region ../src/state/store-subscribers.d.ts
@@ -1,4 +1,4 @@
1
- import { N as CombinedRootState } from "./create-slam-app-store-D1QSMuKu.js";
1
+ import { N as CombinedRootState } from "./create-slam-app-store-DFm5K9Ob.js";
2
2
 
3
3
  //#region ../src/state/subscribe-to-selector.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { o as WebXRQuaternion, s as WebXRVec3 } from "../ar-types-Cc5yvBwn.js";
1
+ import { o as WebXRQuaternion, s as WebXRVec3 } from "../ar-types-D6PYS4bc.js";
2
2
  import { Mock } from "vitest";
3
3
 
4
4
  //#region ../src/test-utils/browser-mocks.d.ts
@@ -1,4 +1,4 @@
1
- import { i as RecordedAction } from "../zip-reader-BzENzMH6.js";
1
+ import { i as RecordedAction } from "../zip-reader-BHc_b_iA.js";
2
2
  import { LatLong } from "gps-plus-slam-js";
3
3
 
4
4
  //#region ../src/test-utils/zip-round-trip-helpers.d.ts
@@ -1,6 +1,7 @@
1
- import { t as ARPose } from "./ar-types-Cc5yvBwn.js";
1
+ import { t as ARPose } from "./ar-types-D6PYS4bc.js";
2
2
  import { OdometryTrackingRestartedPayload, Quaternion, Vector3 } from "gps-plus-slam-js";
3
3
  import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
4
+ import * as _$redux from "redux";
4
5
 
5
6
  //#region ../src/state/tracking-slice.d.ts
6
7
  /**
@@ -60,7 +61,7 @@ interface PoseReceivedPayload {
60
61
  sensorOrientation: DeviceOrientation;
61
62
  }
62
63
  declare const poseReceived: _$_reduxjs_toolkit0.ActionCreatorWithPayload<PoseReceivedPayload, "tracking/poseReceived">, poseLost: _$_reduxjs_toolkit0.ActionCreatorWithoutPayload<"tracking/poseLost">, originReset: _$_reduxjs_toolkit0.ActionCreatorWithPreparedPayload<[transform?: ResetTransformData | null | undefined], ResetTransformData | null | undefined, "tracking/originReset", never, never>, resetTracking: _$_reduxjs_toolkit0.ActionCreatorWithoutPayload<"tracking/resetTracking">, clearLastRestartedPayload: _$_reduxjs_toolkit0.ActionCreatorWithoutPayload<"tracking/clearLastRestartedPayload">;
63
- declare const trackingReducer: _$_reduxjs_toolkit0.Reducer<TrackingSliceState>;
64
+ declare const trackingReducer: _$redux.Reducer<TrackingSliceState>;
64
65
  /**
65
66
  * Minimal root-state shape needed by the selectors. Avoids a hard import
66
67
  * cycle through `SlamAppRootState`.
@@ -1,2 +1,2 @@
1
- import { a as RgbTuple, i as DepthSample, n as ArPoseTuples, o as WebXRQuaternion, r as DepthPoint, s as WebXRVec3, t as ARPose } from "../ar-types-Cc5yvBwn.js";
2
- export { ARPose, ArPoseTuples, DepthPoint, DepthSample, RgbTuple, WebXRQuaternion, WebXRVec3 };
1
+ import { a as RgbTuple, c as extractOdomPosition, i as DepthSample, l as extractOdomRotation, n as ArPoseTuples, o as WebXRQuaternion, r as DepthPoint, s as WebXRVec3, t as ARPose } from "../ar-types-D6PYS4bc.js";
2
+ export { ARPose, ArPoseTuples, DepthPoint, DepthSample, RgbTuple, WebXRQuaternion, WebXRVec3, extractOdomPosition, extractOdomRotation };
@@ -1 +1,31 @@
1
- export {};
1
+ //#region ../src/types/ar-types.ts
2
+ /**
3
+ * Extract the raw odometry position tuple from an {@link ARPose}.
4
+ *
5
+ * Returns the raw WebXR position without coordinate conversion — the reducer
6
+ * applies the WebXR→NUE transform when storing into state (raw-storage
7
+ * pattern, see docs/2026-04-09-raw-storage-convert-on-read.md).
8
+ * WebXR local-floor frame: X=East, Y=Up, Z=South (toward viewer / backward).
9
+ *
10
+ * Lives next to the type (quality-review G-8 — it used to sit in
11
+ * `state/gps-event-coordinator.ts`, forcing an ar→state import in
12
+ * `ar/depth-sampler.ts`).
13
+ */
14
+ function extractOdomPosition(arPose) {
15
+ return [
16
+ arPose.position.x,
17
+ arPose.position.y,
18
+ arPose.position.z
19
+ ];
20
+ }
21
+ /** Extract the raw odometry rotation tuple from an {@link ARPose}. */
22
+ function extractOdomRotation(arPose) {
23
+ return [
24
+ arPose.orientation.x,
25
+ arPose.orientation.y,
26
+ arPose.orientation.z,
27
+ arPose.orientation.w
28
+ ];
29
+ }
30
+ //#endregion
31
+ export { extractOdomPosition, extractOdomRotation };
@@ -1,2 +1,2 @@
1
- import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-DrGVu8nS.js";
1
+ import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-BfDK8kJu.js";
2
2
  export { GpsCoord, RawGpsSample, RefPointMarker };
@@ -1,3 +1,3 @@
1
- import { a as RgbTuple, i as DepthSample, n as ArPoseTuples, o as WebXRQuaternion, r as DepthPoint, s as WebXRVec3, t as ARPose } from "../ar-types-Cc5yvBwn.js";
2
- import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-DrGVu8nS.js";
3
- export { ARPose, ArPoseTuples, DepthPoint, DepthSample, GpsCoord, RawGpsSample, RefPointMarker, RgbTuple, WebXRQuaternion, WebXRVec3 };
1
+ import { a as RgbTuple, c as extractOdomPosition, i as DepthSample, l as extractOdomRotation, n as ArPoseTuples, o as WebXRQuaternion, r as DepthPoint, s as WebXRVec3, t as ARPose } from "../ar-types-D6PYS4bc.js";
2
+ import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-BfDK8kJu.js";
3
+ export { ARPose, ArPoseTuples, DepthPoint, DepthSample, GpsCoord, RawGpsSample, RefPointMarker, RgbTuple, WebXRQuaternion, WebXRVec3, extractOdomPosition, extractOdomRotation };
@@ -1 +1,2 @@
1
- export {};
1
+ import { extractOdomPosition, extractOdomRotation } from "./ar-types.js";
2
+ export { extractOdomPosition, extractOdomRotation };
@@ -1,2 +1,2 @@
1
- import { n as mapWithConcurrencyLimit, t as forEachWithConcurrencyLimit } from "../concurrency-DPeGBH0X.js";
1
+ import { n as mapWithConcurrencyLimit, t as forEachWithConcurrencyLimit } from "../concurrency-DW0jQo3G.js";
2
2
  export { forEachWithConcurrencyLimit, mapWithConcurrencyLimit };
@@ -1,2 +1,2 @@
1
- import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-CeKf5HIc.js";
1
+ import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-B7fzPfZo.js";
2
2
  export { FailureTracker, FailureTrackerConfig, createFailureTracker };
@@ -1,2 +1,2 @@
1
- import { t as formatFileSize } from "../format-file-size-DxN-EBLc.js";
1
+ import { t as formatFileSize } from "../format-file-size-Da8rZgfs.js";
2
2
  export { formatFileSize };
@@ -1,2 +1,2 @@
1
- import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-C5pp0PJU.js";
1
+ import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-DOKzVMiO.js";
2
2
  export { FusedPathInput, computeFusedPath, fusedGpsFromOdom };
@@ -1,5 +1,5 @@
1
- import { calcGpsCoords, fusedGpsFromOdom } from "gps-plus-slam-js";
2
1
  import { mat4, vec3 } from "gl-matrix";
2
+ import { calcGpsCoords, fusedGpsFromOdom } from "gps-plus-slam-js";
3
3
  //#region ../src/utils/fused-path.ts
4
4
  /**
5
5
  * Fused Path Calculation
@@ -1,8 +1,8 @@
1
- import { a as createLogger, c as setGlobalLogLevel, i as clearLogBuffer, l as subscribeToLogs, n as LogLevel, o as getGlobalLogLevel, r as Logger, s as getLogBuffer, t as LogEntry } from "../logger-CqTd5Kpk.js";
2
- import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-C5pp0PJU.js";
3
- import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-CeKf5HIc.js";
4
- import { n as mapWithConcurrencyLimit } from "../concurrency-DPeGBH0X.js";
5
- import { t as geodesicAngleRad } from "../index-D74JTX4I.js";
6
- import { t as formatFileSize } from "../format-file-size-DxN-EBLc.js";
7
- import { t as listFormatter } from "../list-formatter-DLFDnS70.js";
1
+ import { a as createLogger, c as setGlobalLogLevel, i as clearLogBuffer, l as subscribeToLogs, n as LogLevel, o as getGlobalLogLevel, r as Logger, s as getLogBuffer, t as LogEntry } from "../logger-B4StJUDb.js";
2
+ import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-DOKzVMiO.js";
3
+ import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-B7fzPfZo.js";
4
+ import { n as mapWithConcurrencyLimit } from "../concurrency-DW0jQo3G.js";
5
+ import { t as geodesicAngleRad } from "../index-Nr3qg4IH.js";
6
+ import { t as formatFileSize } from "../format-file-size-Da8rZgfs.js";
7
+ import { t as listFormatter } from "../list-formatter-1ttG18MQ.js";
8
8
  export { FailureTracker, FailureTrackerConfig, FusedPathInput, LogEntry, LogLevel, Logger, clearLogBuffer, computeFusedPath, createFailureTracker, createLogger, formatFileSize, fusedGpsFromOdom, geodesicAngleRad, getGlobalLogLevel, getLogBuffer, listFormatter, mapWithConcurrencyLimit, setGlobalLogLevel, subscribeToLogs };
@@ -1,6 +1,6 @@
1
1
  import { LogLevel, clearLogBuffer, createLogger, getGlobalLogLevel, getLogBuffer, setGlobalLogLevel, subscribeToLogs } from "./logger.js";
2
2
  import { createFailureTracker } from "./failure-tracker.js";
3
- import { t as geodesicAngleRad } from "../geodesic-angle-BTldfFgs.js";
3
+ import { t as geodesicAngleRad } from "../geodesic-angle-CZ_Ow90I.js";
4
4
  import { computeFusedPath, fusedGpsFromOdom } from "./fused-path.js";
5
5
  import { mapWithConcurrencyLimit } from "./concurrency.js";
6
6
  import { formatFileSize } from "./format-file-size.js";
@@ -1,2 +1,2 @@
1
- import { t as listFormatter } from "../list-formatter-DLFDnS70.js";
1
+ import { t as listFormatter } from "../list-formatter-1ttG18MQ.js";
2
2
  export { listFormatter };
@@ -1,2 +1,2 @@
1
- import { a as createLogger, c as setGlobalLogLevel, i as clearLogBuffer, l as subscribeToLogs, n as LogLevel, o as getGlobalLogLevel, r as Logger, s as getLogBuffer, t as LogEntry } from "../logger-CqTd5Kpk.js";
1
+ import { a as createLogger, c as setGlobalLogLevel, i as clearLogBuffer, l as subscribeToLogs, n as LogLevel, o as getGlobalLogLevel, r as Logger, s as getLogBuffer, t as LogEntry } from "../logger-B4StJUDb.js";
2
2
  export { LogEntry, LogLevel, Logger, clearLogBuffer, createLogger, getGlobalLogLevel, getLogBuffer, setGlobalLogLevel, subscribeToLogs };
@@ -93,10 +93,17 @@ function serializeArg(arg) {
93
93
  return safeStringify(arg);
94
94
  }
95
95
  /**
96
+ * Serialize a log call's arguments once (quality-review C-5 — the buffer,
97
+ * breadcrumb, and Sentry-message paths each used to re-serialize the same
98
+ * args, i.e. 2–3× per log call). All downstream consumers take the string.
99
+ */
100
+ function serializeArgs(args) {
101
+ return args.map((arg) => serializeArg(arg)).join(" ");
102
+ }
103
+ /**
96
104
  * Add an entry to the log buffer and notify subscribers
97
105
  */
98
- function addToBuffer(level, tag, args) {
99
- const message = args.map((arg) => serializeArg(arg)).join(" ");
106
+ function addToBuffer(level, tag, message) {
100
107
  const entry = {
101
108
  timestamp: Date.now(),
102
109
  level,
@@ -177,8 +184,8 @@ function toSentryLevel(level) {
177
184
  * Add a Sentry breadcrumb for debugging context.
178
185
  * Breadcrumbs are attached to future exceptions, helping trace what happened before an error.
179
186
  */
180
- function addSentryBreadcrumb(level, tag, args) {
181
- const message = `[${tag}] ${args.map((arg) => serializeArg(arg)).join(" ")}`;
187
+ function addSentryBreadcrumb(level, tag, body) {
188
+ const message = `[${tag}] ${body}`;
182
189
  Sentry.addBreadcrumb({
183
190
  category: "log",
184
191
  level: toSentryLevel(level),
@@ -213,8 +220,7 @@ function toFingerprintTemplate(body) {
213
220
  * messages from the same tag remain distinct Issues (see
214
221
  * {@link toFingerprintTemplate}).
215
222
  */
216
- function captureLogMessage(level, tag, args) {
217
- const body = args.map((arg) => serializeArg(arg)).join(" ");
223
+ function captureLogMessage(level, tag, body) {
218
224
  const message = `[${tag}] ${body}`;
219
225
  Sentry.captureMessage(message, {
220
226
  level,
@@ -231,8 +237,8 @@ function captureLogMessage(level, tag, args) {
231
237
  * Called for log.warn() so warnings are independently visible in the
232
238
  * Sentry dashboard, not only as breadcrumbs attached to later exceptions.
233
239
  */
234
- function reportWarningToSentry(tag, args) {
235
- captureLogMessage("warning", tag, args);
240
+ function reportWarningToSentry(tag, body) {
241
+ captureLogMessage("warning", tag, body);
236
242
  }
237
243
  /**
238
244
  * Report log.error() arguments to Sentry as standalone Issues.
@@ -247,37 +253,41 @@ function reportWarningToSentry(tag, args) {
247
253
  * Issues when an Error is present, and groups via the same normalized template
248
254
  * fingerprint as warnings (see {@link captureLogMessage}).
249
255
  */
250
- function reportErrorsToSentry(tag, args) {
256
+ function reportErrorsToSentry(tag, args, body) {
251
257
  let capturedError = false;
252
258
  for (const arg of args) if (arg instanceof Error) {
253
259
  Sentry.captureException(arg);
254
260
  capturedError = true;
255
261
  }
256
- if (!capturedError) captureLogMessage("error", tag, args);
262
+ if (!capturedError) captureLogMessage("error", tag, body);
257
263
  }
258
264
  function createLogger(tag) {
259
265
  const prefix = `[${tag}]`;
260
266
  return {
261
267
  debug: (...args) => {
262
- addToBuffer(0, tag, args);
263
- addSentryBreadcrumb(0, tag, args);
268
+ const body = serializeArgs(args);
269
+ addToBuffer(0, tag, body);
270
+ addSentryBreadcrumb(0, tag, body);
264
271
  if (globalLogLevel <= 0) console.log(prefix, ...args);
265
272
  },
266
273
  info: (...args) => {
267
- addToBuffer(1, tag, args);
268
- addSentryBreadcrumb(1, tag, args);
274
+ const body = serializeArgs(args);
275
+ addToBuffer(1, tag, body);
276
+ addSentryBreadcrumb(1, tag, body);
269
277
  if (globalLogLevel <= 1) console.log(prefix, ...args);
270
278
  },
271
279
  warn: (...args) => {
272
- addToBuffer(2, tag, args);
273
- addSentryBreadcrumb(2, tag, args);
274
- reportWarningToSentry(tag, args);
280
+ const body = serializeArgs(args);
281
+ addToBuffer(2, tag, body);
282
+ addSentryBreadcrumb(2, tag, body);
283
+ reportWarningToSentry(tag, body);
275
284
  if (globalLogLevel <= 2) console.warn(prefix, ...args);
276
285
  },
277
286
  error: (...args) => {
278
- addToBuffer(3, tag, args);
279
- addSentryBreadcrumb(3, tag, args);
280
- reportErrorsToSentry(tag, args);
287
+ const body = serializeArgs(args);
288
+ addToBuffer(3, tag, body);
289
+ addSentryBreadcrumb(3, tag, body);
290
+ reportErrorsToSentry(tag, args, body);
281
291
  if (globalLogLevel <= 3) console.error(prefix, ...args);
282
292
  }
283
293
  };
@@ -1,2 +1,2 @@
1
- import { a as addAccuracyCircles, i as AccuracyCircleSample, n as ACCURACY_CIRCLE_STROKE_OPACITY, r as ACCURACY_CIRCLE_WEIGHT, t as ACCURACY_CIRCLE_FILL_OPACITY } from "../accuracy-circles-DkWBkF5g.js";
1
+ import { a as addAccuracyCircles, i as AccuracyCircleSample, n as ACCURACY_CIRCLE_STROKE_OPACITY, r as ACCURACY_CIRCLE_WEIGHT, t as ACCURACY_CIRCLE_FILL_OPACITY } from "../accuracy-circles-BHz7yVIL.js";
2
2
  export { ACCURACY_CIRCLE_FILL_OPACITY, ACCURACY_CIRCLE_STROKE_OPACITY, ACCURACY_CIRCLE_WEIGHT, AccuracyCircleSample, addAccuracyCircles };