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,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-BrodRLq0.js";
2
2
  export { embedCoverageInSessionJson };
@@ -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-D8sSxpOr.js";
2
+ import { t as SubscribableStore } from "./subscribe-to-selector-Cgo9JTfS.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-CH31erpP.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-CBafnxhE.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,4 +1,4 @@
1
- import { t as ARPose } from "./ar-types-Cc5yvBwn.js";
1
+ import { t as ARPose } from "./ar-types-CBafnxhE.js";
2
2
  import { OdometryTrackingRestartedPayload, Quaternion, Vector3 } from "gps-plus-slam-js";
3
3
  import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
4
4
 
@@ -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-CBafnxhE.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-CBafnxhE.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-HXBWiXiI.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-BE7tbvYV.js";
2
2
  export { ACCURACY_CIRCLE_FILL_OPACITY, ACCURACY_CIRCLE_STROKE_OPACITY, ACCURACY_CIRCLE_WEIGHT, AccuracyCircleSample, addAccuracyCircles };
@@ -1,2 +1,2 @@
1
- import { n as createAlignmentLerper, t as AlignmentLerper } from "../alignment-lerper-gD70k7Fq.js";
1
+ import { n as createAlignmentLerper, t as AlignmentLerper } from "../alignment-lerper-B4COh_0p.js";
2
2
  export { AlignmentLerper, createAlignmentLerper };
@@ -28,27 +28,37 @@ new THREE.Vector3();
28
28
  * @param arWorldGroup The group whose matrix is interpolated.
29
29
  * @param lerpRate Lerp speed multiplier (default 8).
30
30
  */
31
+ const CONVERGED_POS_EPSILON_SQ = 1e-4 * 1e-4;
32
+ const CONVERGED_QUAT_DOT = .99999999;
33
+ const CONVERGED_SCALE_EPSILON_SQ = 1e-6 * 1e-6;
31
34
  function createAlignmentLerper(arWorldGroup, lerpRate = 8) {
32
35
  let hasTarget = false;
33
36
  let isFirstTarget = true;
37
+ let converged = false;
34
38
  const storedTargetPos = new THREE.Vector3();
35
39
  const storedTargetQuat = new THREE.Quaternion();
36
40
  const storedTargetScale = new THREE.Vector3(1, 1, 1);
37
41
  const _matrix = new THREE.Matrix4();
42
+ /** Write the exact stored target and refresh the subtree. */
43
+ const applyTargetExactly = () => {
44
+ _matrix.compose(storedTargetPos, storedTargetQuat, storedTargetScale);
45
+ arWorldGroup.matrix.copy(_matrix);
46
+ arWorldGroup.matrixAutoUpdate = false;
47
+ arWorldGroup.updateMatrixWorld(true);
48
+ };
38
49
  return {
39
50
  setTarget(matrix) {
40
51
  _matrix.fromArray(matrix);
41
52
  _matrix.decompose(storedTargetPos, storedTargetQuat, storedTargetScale);
42
53
  hasTarget = true;
54
+ converged = false;
43
55
  },
44
56
  update(dt) {
45
- if (!hasTarget) return;
57
+ if (!hasTarget || converged) return;
46
58
  if (isFirstTarget) {
47
- _matrix.compose(storedTargetPos, storedTargetQuat, storedTargetScale);
48
- arWorldGroup.matrix.copy(_matrix);
49
- arWorldGroup.matrixAutoUpdate = false;
50
- arWorldGroup.updateMatrixWorld(true);
59
+ applyTargetExactly();
51
60
  isFirstTarget = false;
61
+ converged = true;
52
62
  return;
53
63
  }
54
64
  arWorldGroup.matrix.decompose(_currentPos, _currentQuat, _currentScale);
@@ -56,6 +66,11 @@ function createAlignmentLerper(arWorldGroup, lerpRate = 8) {
56
66
  _currentPos.lerp(storedTargetPos, alpha);
57
67
  _currentQuat.slerp(storedTargetQuat, alpha);
58
68
  _currentScale.lerp(storedTargetScale, alpha);
69
+ if (_currentPos.distanceToSquared(storedTargetPos) < CONVERGED_POS_EPSILON_SQ && Math.abs(_currentQuat.dot(storedTargetQuat)) > CONVERGED_QUAT_DOT && _currentScale.distanceToSquared(storedTargetScale) < CONVERGED_SCALE_EPSILON_SQ) {
70
+ applyTargetExactly();
71
+ converged = true;
72
+ return;
73
+ }
59
74
  _matrix.compose(_currentPos, _currentQuat, _currentScale);
60
75
  arWorldGroup.matrix.copy(_matrix);
61
76
  arWorldGroup.matrixAutoUpdate = false;
@@ -1,2 +1,2 @@
1
- import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-Cfg0trC3.js";
1
+ import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-B6XiA1cT.js";
2
2
  export { ArWorldGroupAlignmentHandle, ArWorldGroupAlignmentOptions, enableArWorldGroupAlignment };
@@ -1,5 +1,5 @@
1
1
  import { registerFrameUpdate } from "../ar/frame-loop.js";
2
- import { t as registerSessionDisposer } from "../session-disposers-BPrMplIC.js";
2
+ import { t as registerSessionDisposer } from "../session-disposers-BZS-hi8u.js";
3
3
  import { createAlignmentLerper } from "./alignment-lerper.js";
4
4
  import { selectAlignmentMatrix } from "../state/app-selectors.js";
5
5
  import { subscribeToSelector } from "../state/subscribe-to-selector.js";
@@ -1,2 +1,2 @@
1
- import { n as createCameraFollower, t as CameraFollower } from "../camera-follower-DfBm2J5i.js";
1
+ import { n as createCameraFollower, t as CameraFollower } from "../camera-follower-B6zA3dy9.js";
2
2
  export { CameraFollower, createCameraFollower };
@@ -1,2 +1,2 @@
1
- import { n as createCss3dRendererManager, t as Css3dRendererManager } from "../css3d-renderer-manager-CPpVtvgs.js";
1
+ import { n as createCss3dRendererManager, t as Css3dRendererManager } from "../css3d-renderer-manager-DbrSY7Mh.js";
2
2
  export { Css3dRendererManager, createCss3dRendererManager };
@@ -1,2 +1,2 @@
1
- import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-DDcNHkTb.js";
1
+ import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-CH7E2Iv_.js";
2
2
  export { nueToArLocal, worldNueToGps };
@@ -1,2 +1,2 @@
1
- import { i as isSphereInCameraFrustum, n as isObjectInCameraFrustum, r as isPointInCameraFrustum, t as buildCameraFrustum } from "../frustum-visibility-CokkgS_i.js";
1
+ import { i as isSphereInCameraFrustum, n as isObjectInCameraFrustum, r as isPointInCameraFrustum, t as buildCameraFrustum } from "../frustum-visibility-COPfzruF.js";
2
2
  export { buildCameraFrustum, isObjectInCameraFrustum, isPointInCameraFrustum, isSphereInCameraFrustum };
@@ -1,2 +1,2 @@
1
- import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-CEjGqEVD.js";
1
+ import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-BaqyRsPC.js";
2
2
  export { GpsAnchor, GpsAnchorMode, GpsAnchorOptions, GpsAnchorPhase, GpsAnchorSamplePoint, createGpsAnchor };
@@ -1,7 +1,8 @@
1
+ import { t as interpolatingMedian } from "../median-Bla_W50f.js";
1
2
  import { registerFrameUpdate } from "../ar/frame-loop.js";
2
3
  import { isObjectInCameraFrustum } from "./frustum-visibility.js";
3
4
  import { calcRelativeCoordsInMeters } from "../core/index.js";
4
- import { nueToArLocal } from "./frame-conversions.js";
5
+ import { nueToArLocal, worldNueToGps } from "./frame-conversions.js";
5
6
  import * as THREE from "three";
6
7
  //#region ../src/visualization/gps-anchor.ts
7
8
  /**
@@ -18,6 +19,27 @@ import * as THREE from "three";
18
19
  * 6 and remains deferred.
19
20
  */
20
21
  /**
22
+ * Built-in "object-pose" bootstrap source (quality-review G-6): samples the
23
+ * object's world pose converted to GPS. Requires a GPS-world frame — the
24
+ * world position is GPS-world NUE only once an alignment exists (via
25
+ * `enableArWorldGroupAlignment`), so ticks are skipped until zero AND
26
+ * alignment are available (mirrors "no fix yet").
27
+ */
28
+ function createObjectPoseSampler(options) {
29
+ const scratch = new THREE.Vector3();
30
+ return () => {
31
+ const zero = options.getGpsZeroRef();
32
+ if (zero === null || zero === void 0) return null;
33
+ const alignment = options.getAlignmentMatrix();
34
+ if (alignment === null || alignment === void 0) return null;
35
+ return worldNueToGps(options.object3D.getWorldPosition(scratch), zero);
36
+ };
37
+ }
38
+ /** A caller-provided bootstrap reader wins; otherwise the built-in object-pose source. */
39
+ function resolveBootstrapSampler(options) {
40
+ return options.getCurrentGpsPoint ?? createObjectPoseSampler(options);
41
+ }
42
+ /**
21
43
  * Module-level registry of objects currently owned by a `GpsAnchor`.
22
44
  * Used to detect nested anchors (parent + child both anchored) which
23
45
  * we explicitly forbid; mirrors the C# invariant.
@@ -48,20 +70,14 @@ function isDescendantOf(object, arWorldGroup) {
48
70
  }
49
71
  return false;
50
72
  }
51
- function median(values) {
52
- const sorted = [...values].sort((a, b) => a - b);
53
- const mid = Math.floor(sorted.length / 2);
54
- if (sorted.length % 2 === 0) return (sorted[mid - 1] + sorted[mid]) / 2;
55
- return sorted[mid];
56
- }
57
73
  function medianPoint(samples) {
58
- const lat = median(samples.map((s) => s.lat));
59
- const lon = median(samples.map((s) => s.lon));
74
+ const lat = interpolatingMedian(samples.map((s) => s.lat));
75
+ const lon = interpolatingMedian(samples.map((s) => s.lon));
60
76
  const alts = samples.map((s) => "altitude" in s ? s.altitude : void 0).filter((a) => typeof a === "number");
61
77
  if (alts.length > 0) return {
62
78
  lat,
63
79
  lon,
64
- altitude: median(alts)
80
+ altitude: interpolatingMedian(alts)
65
81
  };
66
82
  return {
67
83
  lat,
@@ -82,6 +98,7 @@ function createGpsAnchor(options) {
82
98
  options.angleThresholdInDegrees;
83
99
  const mode = options.mode ?? "snap-when-offscreen";
84
100
  const scratchTarget = new THREE.Vector3();
101
+ const getCurrentGpsPoint = resolveBootstrapSampler(options);
85
102
  const scratchCamWorld = new THREE.Vector3();
86
103
  const scratchObjWorld = new THREE.Vector3();
87
104
  let phase = options.skipBootstrap === true ? "anchored" : "bootstrap";
@@ -148,18 +165,26 @@ function createGpsAnchor(options) {
148
165
  * matrix yet — an AR-local object cannot be placed without knowing the
149
166
  * AR↔NUE transform).
150
167
  */
168
+ let lastTargetZeroRef = null;
169
+ let lastTargetAlignmentRef = null;
170
+ let lastTargetGpsPointRef = null;
151
171
  const maybeCommitSteadyState = () => {
152
172
  const zero = options.getGpsZeroRef();
153
173
  if (zero === null || zero === void 0) return;
154
174
  const currentAlignment = options.getAlignmentMatrix();
155
175
  if (currentAlignment === null || currentAlignment === void 0) return;
156
- const targetAlt = "altitude" in gpsPoint && typeof gpsPoint.altitude === "number" ? gpsPoint.altitude : 0;
157
- const nue = calcRelativeCoordsInMeters(zero, gpsPoint, targetAlt, 0);
158
- nueToArLocal(currentAlignment, [
159
- nue[0],
160
- nue[1],
161
- nue[2]
162
- ], scratchTarget);
176
+ if (zero !== lastTargetZeroRef || currentAlignment !== lastTargetAlignmentRef || gpsPoint !== lastTargetGpsPointRef) {
177
+ const targetAlt = "altitude" in gpsPoint && typeof gpsPoint.altitude === "number" ? gpsPoint.altitude : 0;
178
+ const nue = calcRelativeCoordsInMeters(zero, gpsPoint, targetAlt, 0);
179
+ nueToArLocal(currentAlignment, [
180
+ nue[0],
181
+ nue[1],
182
+ nue[2]
183
+ ], scratchTarget);
184
+ lastTargetZeroRef = zero;
185
+ lastTargetAlignmentRef = currentAlignment;
186
+ lastTargetGpsPointRef = gpsPoint;
187
+ }
163
188
  options.camera.getWorldPosition(scratchCamWorld);
164
189
  options.object3D.getWorldPosition(scratchObjWorld);
165
190
  const scale = 1 + 10 * scratchCamWorld.distanceTo(scratchObjWorld) / 100;
@@ -181,7 +206,7 @@ function createGpsAnchor(options) {
181
206
  }
182
207
  if (elapsed - phaseEnteredAtElapsed < settlingSeconds) return;
183
208
  if (lastSampleAtElapsed !== null && elapsed - lastSampleAtElapsed < 1) return;
184
- const sample = options.getCurrentGpsPoint();
209
+ const sample = getCurrentGpsPoint();
185
210
  if (sample === null || sample === void 0) return;
186
211
  samples.push(sample);
187
212
  lastSampleAtElapsed = elapsed;
@@ -1,2 +1,2 @@
1
- import { i as createGpsCompassCubes, n as COMPASS_CUBE_SIZE, r as GpsCompassCubes, t as COMPASS_CUBE_DISTANCE } from "../gps-compass-cubes-1mooS3BS.js";
1
+ import { i as createGpsCompassCubes, n as COMPASS_CUBE_SIZE, r as GpsCompassCubes, t as COMPASS_CUBE_DISTANCE } from "../gps-compass-cubes-CT3TWctJ.js";
2
2
  export { COMPASS_CUBE_DISTANCE, COMPASS_CUBE_SIZE, GpsCompassCubes, createGpsCompassCubes };
@@ -1,2 +1,2 @@
1
- import { n as GpsEventVisualizer, r as gpsEventVisualizer, t as GpsEventAccuracy } from "../gps-event-markers-Di2nBzx-.js";
1
+ import { n as GpsEventVisualizer, r as gpsEventVisualizer, t as GpsEventAccuracy } from "../gps-event-markers-BsC2Ynlh.js";
2
2
  export { GpsEventAccuracy, GpsEventVisualizer, gpsEventVisualizer };
@@ -1,6 +1,6 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
2
  import { disposeMeshArray } from "./three-dispose.js";
3
- import { f as getArWorldGroup, x as getScene } from "../webxr-session-BCP2XK7k.js";
3
+ import { f as getArWorldGroup, x as getScene } from "../webxr-session-DWKUsCN9.js";
4
4
  import { VIS_COLORS } from "./vis-colors.js";
5
5
  import * as THREE from "three";
6
6
  //#region ../src/visualization/gps-event-markers.ts
@@ -1,2 +1,2 @@
1
- import { n as createReticleMesh, r as updateReticle, t as HitMatrix } from "../hit-test-reticle-CaQbrhbk.js";
1
+ import { n as createReticleMesh, r as updateReticle, t as HitMatrix } from "../hit-test-reticle-DhnCMOsc.js";
2
2
  export { HitMatrix, createReticleMesh, updateReticle };