gps-plus-slam-app-framework 1.10.0 → 1.13.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 (289) hide show
  1. package/README.md +27 -28
  2. package/dist/{absolute-orientation-C_IxDR_j.d.ts → absolute-orientation-0WIsqJnu.d.ts} +1 -1
  3. package/dist/{accuracy-circles-BE7tbvYV.d.ts → accuracy-circles-CFnKGfsD.d.ts} +1 -1
  4. package/dist/{app-selectors-CV7ggGoo.d.ts → app-selectors-QM0ZpNA4.d.ts} +1 -1
  5. package/dist/ar/ar-crash-isolation.d.ts +2 -0
  6. package/dist/ar/ar-crash-isolation.js +40 -0
  7. package/dist/ar/bresenham3d.d.ts +1 -1
  8. package/dist/ar/camera-blit-capture.d.ts +1 -1
  9. package/dist/ar/capability-checker.d.ts +1 -1
  10. package/dist/ar/capture-failure-tracker.d.ts +1 -1
  11. package/dist/ar/capture-motion-gate.d.ts +2 -0
  12. package/dist/{capture-motion-gate-D1eyGC_o.js → ar/capture-motion-gate.js} +25 -2
  13. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  14. package/dist/ar/chromium-camera-access-workaround.js +1 -1
  15. package/dist/ar/depth-grid-lookup.d.ts +1 -1
  16. package/dist/ar/depth-occluder.d.ts +1 -1
  17. package/dist/ar/depth-occluder.js +1 -1
  18. package/dist/ar/depth-sampler.d.ts +3 -3
  19. package/dist/ar/depth-sampler.js +28 -1
  20. package/dist/ar/depth-unprojection.d.ts +1 -1
  21. package/dist/ar/enable-gps-ar.d.ts +1 -1
  22. package/dist/ar/enable-gps-ar.js +20 -5
  23. package/dist/ar/frame-loop.d.ts +1 -1
  24. package/dist/ar/hit-test-reticle-driver.d.ts +2 -0
  25. package/dist/ar/hit-test-reticle-driver.js +122 -0
  26. package/dist/ar/image-capture.d.ts +1 -1
  27. package/dist/ar/image-capture.js +1 -1
  28. package/dist/ar/image-quality.d.ts +2 -2
  29. package/dist/ar/image-quality.js +136 -4
  30. package/dist/ar/index.d.ts +35 -32
  31. package/dist/ar/index.js +17 -15
  32. package/dist/ar/occlusion-mesh-worker.d.ts +2 -2
  33. package/dist/ar/occlusion-mesh-worker.js +6 -4
  34. package/dist/ar/occupancy-grid.d.ts +2 -2
  35. package/dist/ar/occupancy-grid.js +192 -12
  36. package/dist/ar/occupancy-mesher.d.ts +1 -1
  37. package/dist/ar/occupancy-mesher.js +1 -636
  38. package/dist/ar/qr/index.d.ts +11 -0
  39. package/dist/ar/qr/index.js +11 -0
  40. package/dist/ar/{planar-pnp.d.ts → qr/planar-pnp.d.ts} +1 -1
  41. package/dist/ar/{planar-pnp.js → qr/planar-pnp.js} +1 -1
  42. package/dist/ar/qr/qr-debug-view.d.ts +2 -0
  43. package/dist/ar/{qr-debug-view.js → qr/qr-debug-view.js} +2 -2
  44. package/dist/ar/{qr-derived-pose.d.ts → qr/qr-derived-pose.d.ts} +1 -1
  45. package/dist/ar/{qr-derived-pose.js → qr/qr-derived-pose.js} +2 -2
  46. package/dist/ar/{qr-detection-controller.d.ts → qr/qr-detection-controller.d.ts} +1 -1
  47. package/dist/ar/qr/qr-detection-controller.js +2 -0
  48. package/dist/ar/{qr-frontend.d.ts → qr/qr-frontend.d.ts} +1 -1
  49. package/dist/ar/{qr-frontend.js → qr/qr-frontend.js} +1 -1
  50. package/dist/ar/{qr-pose.d.ts → qr/qr-pose.d.ts} +1 -1
  51. package/dist/ar/{qr-pose.js → qr/qr-pose.js} +1 -1
  52. package/dist/ar/qr/qr-size-depth-context.d.ts +3 -0
  53. package/dist/ar/{qr-size-depth-context.js → qr/qr-size-depth-context.js} +4 -4
  54. package/dist/ar/{qr-size-measurer.d.ts → qr/qr-size-measurer.d.ts} +1 -1
  55. package/dist/ar/qr/qr-size-measurer.js +2 -0
  56. package/dist/ar/replay-scene.d.ts +1 -1
  57. package/dist/ar/replay-scene.js +15 -13
  58. package/dist/ar/scene-node-names.d.ts +1 -1
  59. package/dist/ar/webxr-nue-basis.d.ts +1 -1
  60. package/dist/ar/webxr-session.d.ts +4 -4
  61. package/dist/ar/webxr-session.js +2 -2
  62. package/dist/ar/xr-camera-texture.d.ts +1 -1
  63. package/dist/ar/xr-error-handler.d.ts +1 -1
  64. package/dist/ar/xr-frame-loop.d.ts +1 -1
  65. package/dist/ar/xr-frame-loop.js +1 -1
  66. package/dist/ar-crash-isolation-BSFw_beO.d.ts +52 -0
  67. package/dist/{ar-world-group-alignment-B6XiA1cT.d.ts → ar-world-group-alignment-CvvfACfx.d.ts} +2 -2
  68. package/dist/{capability-checker-DEo-ktWI.d.ts → capability-checker-DrWimJ_t.d.ts} +1 -1
  69. package/dist/capture-motion-gate-C60Qrilh.d.ts +120 -0
  70. package/dist/{cell-key-Bj-eYTLA.js → cell-key-D1b_Ix-p.js} +12 -1
  71. package/dist/{chromium-camera-access-workaround-DCd8SP2N.d.ts → chromium-camera-access-workaround-BRs6gkI4.d.ts} +1 -1
  72. package/dist/core/index.d.ts +1 -1
  73. package/dist/{create-slam-app-store-CH31erpP.d.ts → create-slam-app-store-HNe1PBtx.d.ts} +37 -6
  74. package/dist/{create-slam-app-store-DLv5ZwqU.js → create-slam-app-store-wYN7YkB5.js} +21 -10
  75. package/dist/{depth-grid-lookup-DY6zYTLx.d.ts → depth-grid-lookup-PcJTdRLL.d.ts} +1 -1
  76. package/dist/{depth-sampler-txG8evgQ.d.ts → depth-sampler-BcvuxgCS.d.ts} +30 -3
  77. package/dist/{depth-unprojection-JKkeqJrV.d.ts → depth-unprojection-DbGipFkA.d.ts} +1 -1
  78. package/dist/{enable-gps-ar-BbNWyqp5.d.ts → enable-gps-ar-xjz3jNqm.d.ts} +10 -5
  79. package/dist/{file-system-utils-CfLTj5Ra.d.ts → file-system-utils-DE3BViuq.d.ts} +1 -1
  80. package/dist/{frame-conversions-CH7E2Iv_.d.ts → frame-conversions-CzPQDYpM.d.ts} +1 -1
  81. package/dist/{fused-path-DOKzVMiO.d.ts → fused-path-CBAttcVm.d.ts} +1 -1
  82. package/dist/geo/h3-proximity.d.ts +1 -1
  83. package/dist/geo/h3-proximity.js +1 -1
  84. package/dist/geo/index.d.ts +1 -1
  85. package/dist/{geodesic-angle-HXBWiXiI.js → geodesic-angle-CZ_Ow90I.js} +2 -2
  86. package/dist/{gps-anchor-BaqyRsPC.d.ts → gps-anchor-Gv4NDwH4.d.ts} +1 -1
  87. package/dist/{gps-ar-pose-sampler-BOOV0jJk.d.ts → gps-ar-pose-sampler-DBEYDFY5.d.ts} +1 -1
  88. package/dist/{gps-event-coordinator-03rVh_us.d.ts → gps-event-coordinator-BKwB4RyQ.d.ts} +4 -4
  89. package/dist/{gps-event-markers-BsC2Ynlh.d.ts → gps-event-markers-212h7j3D.d.ts} +39 -5
  90. package/dist/{h3-proximity-pFluGfwL.d.ts → h3-proximity-CAEk3osq.d.ts} +1 -1
  91. package/dist/hit-test-reticle-driver-CfKiDgsa.d.ts +40 -0
  92. package/dist/{image-capture-Cr_rljeV.d.ts → image-capture-BXmx1YvD.d.ts} +6 -6
  93. package/dist/{image-capture-BUqqsOi3.js → image-capture-Dn8uLIP2.js} +3 -3
  94. package/dist/{image-quality-BjBLoTec.d.ts → image-quality-G7_qT4aj.d.ts} +44 -2
  95. package/dist/index-DVmgFIgm.d.ts +64 -0
  96. package/dist/{index-C2Bo0buN.d.ts → index-DX9VC257.d.ts} +10 -72
  97. package/dist/{index-CuHaGY0F.d.ts → index-qtZ2muFd.d.ts} +1 -1
  98. package/dist/index.d.ts +89 -82
  99. package/dist/index.js +31 -24
  100. package/dist/{leaflet-map-overlay-QhF199BW.d.ts → leaflet-map-overlay-BkHmzvpD.d.ts} +1 -1
  101. package/dist/{leaflet-map-overlay-BRkUhZMD.js → leaflet-map-overlay-DjWfRT8a.js} +1 -1
  102. package/dist/{map-data-D8sSxpOr.d.ts → map-data-BQXPtRz7.d.ts} +3 -3
  103. package/dist/{map-data-D3oE8AQP.js → map-data-vL8jb5Z9.js} +1 -1
  104. package/dist/{map-overlay-draw-1E61FLKs.d.ts → map-overlay-draw-sTM3wug_.d.ts} +1 -1
  105. package/dist/{median-Bla_W50f.js → median-DDBrZGP0.js} +2 -2
  106. package/dist/{null-storage-backend-DXXuwG8T.d.ts → null-storage-backend-Dtn3TBfT.d.ts} +2 -2
  107. package/dist/{occlusion-mesh-CZ4i_SW2.d.ts → occlusion-mesh-BY2aMej3.d.ts} +43 -6
  108. package/dist/occupancy-cubes-visualizer-soN0Sizd.d.ts +146 -0
  109. package/dist/{occupancy-grid-f0I07UxI.d.ts → occupancy-grid-DKzIdCSZ.d.ts} +114 -4
  110. package/dist/{occupancy-mesher-BqnRd10x.d.ts → occupancy-mesher-Co80tOpl.d.ts} +22 -1
  111. package/dist/occupancy-mesher-DzNeJdQf.js +837 -0
  112. package/dist/{opfs-storage-backend-D1ZpeNEL.d.ts → opfs-storage-backend-CZ-ECudx.d.ts} +2 -2
  113. package/dist/perf-stats-overlay-BMEQrzx6.d.ts +68 -0
  114. package/dist/{persistence-middleware-CI4Cetnl.d.ts → persistence-middleware-Byo_Fs4n.d.ts} +13 -3
  115. package/dist/{planar-pnp-CPLhg5MX.d.ts → planar-pnp-CkcMN3o3.d.ts} +2 -2
  116. package/dist/pointer-picking-BATHHTlT.d.ts +41 -0
  117. package/dist/{ar-D-03Kso-.js → qr-CTp5xI83.js} +11 -25
  118. package/dist/{qr-debug-view-BmbWo06j.d.ts → qr-debug-view-BMjNVhV2.d.ts} +2 -2
  119. package/dist/{qr-derived-pose-DEYT85ul.d.ts → qr-derived-pose-Dq7mPK2s.d.ts} +3 -3
  120. package/dist/{qr-detected-slice-CPEkGbxh.d.ts → qr-detected-slice-8t_laDR9.d.ts} +9 -8
  121. package/dist/{qr-detection-controller-bRTJXC6G.js → qr-detection-controller-DXc1yHRf.js} +3 -3
  122. package/dist/{qr-detection-controller-IcMRpTjV.d.ts → qr-detection-controller-Dh4Paymb.d.ts} +4 -4
  123. package/dist/{qr-frontend-61SKPSyU.d.ts → qr-frontend-BnLlVjKu.d.ts} +2 -2
  124. package/dist/{qr-pose-CCTF1PP0.d.ts → qr-pose-_dInl6di.d.ts} +1 -1
  125. package/dist/{qr-pose-aggregation-BL6gfl0s.d.ts → qr-pose-aggregation-Bpv4uARJ.d.ts} +2 -2
  126. package/dist/{qr-pose-aggregation-H-O_Jjz9.js → qr-pose-aggregation-Cp0Mtg_j.js} +4 -4
  127. package/dist/{qr-size-depth-context-DJsYqbqY.d.ts → qr-size-depth-context-Bzbx98nS.d.ts} +3 -3
  128. package/dist/{qr-size-measurer-Bl_i-umk.d.ts → qr-size-measurer-18_W3INY.d.ts} +5 -5
  129. package/dist/{qr-size-measurer-BVOIg-He.js → qr-size-measurer-zZB9S1va.js} +4 -4
  130. package/dist/{recording-replayer-DyIN13nG.d.ts → recording-replayer-BKmVuchg.d.ts} +2 -2
  131. package/dist/{recording-slice-DziOl7P5.d.ts → recording-slice-zMedT0ot.d.ts} +10 -5
  132. package/dist/{replay-engine-DAymjsd1.d.ts → replay-engine-D-cbT0Fw.d.ts} +1 -1
  133. package/dist/{replay-scene-CZdWgcpc.d.ts → replay-scene-D5qzY0_x.d.ts} +12 -5
  134. package/dist/sensors/absolute-orientation.d.ts +1 -1
  135. package/dist/sensors/absolute-orientation.js +1 -1
  136. package/dist/sensors/gps-error-handler.d.ts +1 -1
  137. package/dist/sensors/gps.d.ts +1 -1
  138. package/dist/sensors/index.d.ts +4 -4
  139. package/dist/sensors/permission-checker.d.ts +1 -1
  140. package/dist/{session-disposers-BZS-hi8u.js → session-disposers-BJM5U62W.js} +1 -1
  141. package/dist/state/app-selectors.d.ts +1 -1
  142. package/dist/state/combined-root-state.d.ts +1 -1
  143. package/dist/state/create-slam-app-store.d.ts +1 -1
  144. package/dist/state/create-slam-app-store.js +1 -1
  145. package/dist/state/gps-ar-pose-sampler.d.ts +2 -2
  146. package/dist/state/gps-event-coordinator.d.ts +2 -2
  147. package/dist/state/index.d.ts +19 -20
  148. package/dist/state/index.js +3 -4
  149. package/dist/state/persistence-middleware.d.ts +2 -2
  150. package/dist/state/persistence-middleware.js +24 -15
  151. package/dist/state/qr-detected-slice.d.ts +3 -3
  152. package/dist/state/qr-detected-slice.js +8 -8
  153. package/dist/state/recording-replayer.d.ts +2 -2
  154. package/dist/state/recording-replayer.js +1 -1
  155. package/dist/state/recording-slice.d.ts +1 -1
  156. package/dist/state/replay-engine.d.ts +1 -1
  157. package/dist/state/replay-occupancy-subscriber.d.ts +51 -0
  158. package/dist/state/replay-occupancy-subscriber.js +85 -0
  159. package/dist/state/replay-session.d.ts +88 -0
  160. package/dist/state/replay-session.js +165 -0
  161. package/dist/state/store-subscribers.d.ts +2 -2
  162. package/dist/state/store-subscribers.js +1 -1
  163. package/dist/state/subscribe-to-selector.d.ts +1 -1
  164. package/dist/state/tracking-quality.d.ts +1 -1
  165. package/dist/state/tracking-quality.js +2 -2
  166. package/dist/state/tracking-slice.d.ts +1 -1
  167. package/dist/{state-U45ioVyB.js → state-DxL3T1Id.js} +1 -2
  168. package/dist/storage/file-system-utils.d.ts +1 -1
  169. package/dist/storage/file-system-utils.js +1 -1
  170. package/dist/storage/index.d.ts +8 -8
  171. package/dist/storage/null-storage-backend.d.ts +1 -1
  172. package/dist/storage/opfs-storage-backend.d.ts +1 -1
  173. package/dist/storage/opfs-storage.d.ts +1 -1
  174. package/dist/storage/storage-backend.d.ts +1 -1
  175. package/dist/storage/zip-coverage-embed.d.ts +1 -1
  176. package/dist/storage/zip-coverage-embed.js +1 -1
  177. package/dist/storage/zip-export.d.ts +1 -1
  178. package/dist/storage/zip-reader.d.ts +1 -1
  179. package/dist/{storage-backend-BX7egQKi.d.ts → storage-backend-DCYbOvTw.d.ts} +1 -1
  180. package/dist/{store-subscribers-DtwakLrQ.d.ts → store-subscribers-BbRW35u5.d.ts} +2 -2
  181. package/dist/{subscribe-to-selector-Cgo9JTfS.d.ts → subscribe-to-selector-B_lm_euO.d.ts} +1 -1
  182. package/dist/test-utils/browser-mocks.d.ts +1 -1
  183. package/dist/test-utils/zip-round-trip-helpers.d.ts +1 -1
  184. package/dist/text-sprite-C6VcC2mo.d.ts +53 -0
  185. package/dist/{tracking-slice-Bt2OEQhA.d.ts → tracking-slice-D5LDL_y4.d.ts} +3 -2
  186. package/dist/types/ar-types.d.ts +1 -1
  187. package/dist/types/geo-types.d.ts +1 -1
  188. package/dist/types/index.d.ts +2 -2
  189. package/dist/utils/concurrency.d.ts +1 -1
  190. package/dist/utils/failure-tracker.d.ts +1 -1
  191. package/dist/utils/format-file-size.d.ts +1 -1
  192. package/dist/utils/fused-path.d.ts +1 -1
  193. package/dist/utils/index.d.ts +7 -7
  194. package/dist/utils/index.js +1 -1
  195. package/dist/utils/list-formatter.d.ts +1 -1
  196. package/dist/utils/logger.d.ts +1 -1
  197. package/dist/visualization/accuracy-circles.d.ts +1 -1
  198. package/dist/visualization/accuracy-circles.js +1 -1
  199. package/dist/visualization/alignment-lerper.d.ts +1 -1
  200. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  201. package/dist/visualization/ar-world-group-alignment.js +2 -2
  202. package/dist/visualization/camera-follower.d.ts +1 -1
  203. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  204. package/dist/visualization/frame-conversions.d.ts +1 -1
  205. package/dist/visualization/frustum-visibility.d.ts +1 -1
  206. package/dist/visualization/gps-anchor.d.ts +1 -1
  207. package/dist/visualization/gps-anchor.js +2 -2
  208. package/dist/visualization/gps-compass-cubes.d.ts +1 -1
  209. package/dist/visualization/gps-compass-cubes.js +6 -22
  210. package/dist/visualization/gps-event-markers.d.ts +2 -2
  211. package/dist/visualization/gps-event-markers.js +27 -6
  212. package/dist/visualization/hit-test-reticle.d.ts +1 -1
  213. package/dist/visualization/hit-test-reticle.js +3 -2
  214. package/dist/visualization/index.d.ts +25 -20
  215. package/dist/visualization/index.js +11 -6
  216. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  217. package/dist/visualization/leaflet-map-overlay.js +1 -1
  218. package/dist/visualization/lerp-utils.d.ts +1 -1
  219. package/dist/visualization/map-data.d.ts +1 -1
  220. package/dist/visualization/map-data.js +1 -1
  221. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  222. package/dist/visualization/occluder-mesh-driver.d.ts +2 -2
  223. package/dist/visualization/occluder-mesh-driver.js +1 -1
  224. package/dist/visualization/occlusion-mesh.d.ts +2 -2
  225. package/dist/visualization/occlusion-mesh.js +54 -4
  226. package/dist/visualization/occupancy-cubes-visualizer.d.ts +2 -0
  227. package/dist/visualization/occupancy-cubes-visualizer.js +221 -0
  228. package/dist/visualization/perf-stats-overlay.d.ts +2 -0
  229. package/dist/visualization/perf-stats-overlay.js +85 -0
  230. package/dist/visualization/pointer-picking.d.ts +2 -0
  231. package/dist/visualization/pointer-picking.js +58 -0
  232. package/dist/visualization/text-sprite.d.ts +2 -0
  233. package/dist/visualization/text-sprite.js +105 -0
  234. package/dist/visualization/three-dispose.d.ts +1 -1
  235. package/dist/visualization/vis-colors.d.ts +1 -1
  236. package/dist/visualization/wayfinding-hud.d.ts +2 -0
  237. package/dist/visualization/wayfinding-hud.js +289 -0
  238. package/dist/visualization/wayfinding-placement.d.ts +2 -0
  239. package/dist/visualization/wayfinding-placement.js +157 -0
  240. package/dist/wayfinding-hud-DVun2b69.d.ts +82 -0
  241. package/dist/wayfinding-placement-dnHzfYlT.d.ts +97 -0
  242. package/dist/{webxr-session-DWKUsCN9.js → webxr-session-BBlgzrqY.js} +150 -280
  243. package/dist/{webxr-session-CGFZ429B.d.ts → webxr-session-DurXRnl_.d.ts} +144 -194
  244. package/dist/{xr-frame-loop-25gM4B0K.d.ts → xr-frame-loop-A1mGDFHI.d.ts} +1 -1
  245. package/dist/{zip-coverage-embed-BrodRLq0.d.ts → zip-coverage-embed-BC3O2-8b.d.ts} +1 -1
  246. package/package.json +5 -3
  247. package/dist/ar/qr-debug-view.d.ts +0 -2
  248. package/dist/ar/qr-detection-controller.js +0 -2
  249. package/dist/ar/qr-size-depth-context.d.ts +0 -3
  250. package/dist/ar/qr-size-measurer.js +0 -2
  251. package/dist/capture-motion-gate-BmjiWUJv.d.ts +0 -24
  252. package/dist/map-overlay-0yJOcEVO.d.ts +0 -153
  253. package/dist/recording-options-Cai9D14V.d.ts +0 -700
  254. package/dist/state/recording-options.d.ts +0 -2
  255. package/dist/state/recording-options.js +0 -620
  256. package/dist/visualization/map-overlay.d.ts +0 -2
  257. package/dist/visualization/map-overlay.js +0 -241
  258. /package/dist/{alignment-lerper-B4COh_0p.d.ts → alignment-lerper-CK1TYLIL.d.ts} +0 -0
  259. /package/dist/{ar-types-CBafnxhE.d.ts → ar-types-BprL3nKv.d.ts} +0 -0
  260. /package/dist/{bresenham3d-D-t9i_b5.d.ts → bresenham3d-bt61R-Qa.d.ts} +0 -0
  261. /package/dist/{camera-blit-capture-BlC-arRb.d.ts → camera-blit-capture-CgNJ9grH.d.ts} +0 -0
  262. /package/dist/{camera-follower-B6zA3dy9.d.ts → camera-follower-OnnXsbHd.d.ts} +0 -0
  263. /package/dist/{capture-failure-tracker-BAUKjtXU.d.ts → capture-failure-tracker-bUXJeMvQ.d.ts} +0 -0
  264. /package/dist/{concurrency-DW0jQo3G.d.ts → concurrency-CMhbkxBk.d.ts} +0 -0
  265. /package/dist/{css3d-renderer-manager-DbrSY7Mh.d.ts → css3d-renderer-manager-CE6xN7XM.d.ts} +0 -0
  266. /package/dist/{failure-tracker-B7fzPfZo.d.ts → failure-tracker-BdaFulDA.d.ts} +0 -0
  267. /package/dist/{format-file-size-Da8rZgfs.d.ts → format-file-size-B2CJdRqD.d.ts} +0 -0
  268. /package/dist/{frame-loop-7HigCj7m.d.ts → frame-loop-CUEIdlhS.d.ts} +0 -0
  269. /package/dist/{frustum-visibility-COPfzruF.d.ts → frustum-visibility-BTx1Sqfo.d.ts} +0 -0
  270. /package/dist/{geo-types-BfDK8kJu.d.ts → geo-types-DGe5UKgx.d.ts} +0 -0
  271. /package/dist/{gps-CX5b9g3s.d.ts → gps-CC0l9lCp.d.ts} +0 -0
  272. /package/dist/{gps-compass-cubes-CT3TWctJ.d.ts → gps-compass-cubes-QQJgpRXR.d.ts} +0 -0
  273. /package/dist/{gps-error-handler-DjVuLXve.d.ts → gps-error-handler-da4DCcs5.d.ts} +0 -0
  274. /package/dist/{hit-test-reticle-DhnCMOsc.d.ts → hit-test-reticle-DcOyqo3B.d.ts} +0 -0
  275. /package/dist/{index-CjxbDm8W.d.ts → index-T8Fxvzka.d.ts} +0 -0
  276. /package/dist/{index-Nr3qg4IH.d.ts → index-Y_RNWbQX.d.ts} +0 -0
  277. /package/dist/{lerp-utils-bwMwVCpU.d.ts → lerp-utils-B-ecvLq2.d.ts} +0 -0
  278. /package/dist/{list-formatter-1ttG18MQ.d.ts → list-formatter-C45u3Vgv.d.ts} +0 -0
  279. /package/dist/{logger-B4StJUDb.d.ts → logger-BQGNXi9W.d.ts} +0 -0
  280. /package/dist/{opfs-storage-S_odkCk1.d.ts → opfs-storage-CrhVauNL.d.ts} +0 -0
  281. /package/dist/{permission-checker-D1C5zvo-.d.ts → permission-checker-BDrCOwQF.d.ts} +0 -0
  282. /package/dist/{scene-node-names-DWzhE7Ro.d.ts → scene-node-names-Ct6ATrfM.d.ts} +0 -0
  283. /package/dist/{three-dispose-C9mdpSRX.d.ts → three-dispose-B5-XiECx.d.ts} +0 -0
  284. /package/dist/{vis-colors-DjStl_tD.d.ts → vis-colors-16Pht13u.d.ts} +0 -0
  285. /package/dist/{webxr-nue-basis-C3vTqkE2.d.ts → webxr-nue-basis-B8ZEetVb.d.ts} +0 -0
  286. /package/dist/{xr-camera-texture-C6Z4d7RR.d.ts → xr-camera-texture-BA4xiaQ4.d.ts} +0 -0
  287. /package/dist/{xr-error-handler-D9y5r8ok.d.ts → xr-error-handler-BeyxXCE_.d.ts} +0 -0
  288. /package/dist/{zip-export-CuBimX1J.d.ts → zip-export-Cfl_kNQ7.d.ts} +0 -0
  289. /package/dist/{zip-reader-BHc_b_iA.d.ts → zip-reader-DwkuvlGo.d.ts} +0 -0
package/README.md CHANGED
@@ -262,19 +262,19 @@ that guard's `APP_OVERLAY_CONTRACTS` list.
262
262
 
263
263
  WebXR session lifecycle, Three.js renderer setup, image/depth capture, replay scene management.
264
264
 
265
- | Export | Description |
266
- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
267
- | `initAR(container, isolation?, features?)` | Start a WebXR AR session with Three.js rendering. `features.requestHitTest` opts the session into the WebXR `hit-test` feature |
268
- | `endARSession()` | End the active XR session |
269
- | `createEnableGpsArController()` | Headless "Enable GPS AR" orchestration (support check + permission bundling + sensor watches + `initAR`) with observable state; the app renders its own button over it |
270
- | `registerXrFrameUpdate(cb)` | Per-frame access to the live `XRFrame` + reference space + session (valid only synchronously inside the callback). Enables app-side hit-test / other WebXR features |
271
- | `isFullySupported(s)` / `capabilityMessage(s)` | WebXR + geolocation capability gating + a user-facing message |
272
- | `startImageCapture()` / `stopImageCapture()` | Toggle camera frame capture |
273
- | `ImageCaptureManager` | Configurable camera frame capture pipeline |
274
- | `DepthSampler` | Depth buffer sampling with configurable grids |
275
- | `CameraBlitCapture` | GPU blit-based camera capture |
276
- | `initReplayScene(container)` | Create a 3D replay scene with orbit/FPS controls |
277
- | `applyChromiumProjectionLayerWorkaround` | Chromium camera-access tab-crash workaround. Always deletes projection-layer hooks (forces `XRWebGLLayer`; required on every affected build incl. Chrome 150) and additionally persists `baseLayer` only on the affected Chrome window (148.0.7778.12 up to 149.0.7821) |
265
+ | Export | Description |
266
+ | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
267
+ | `initAR(container, isolation?, features?, callbacks?)` | Start a WebXR AR session with Three.js rendering. `features.requestHitTest` opts the session into the WebXR `hit-test` feature. `callbacks` (`ArSessionCallbacks`) carries ALL per-session host callbacks — `imageCapture`, `tracking` (store + callbacks together), `depth`, `cameraFrame`, `onFrame`, `onSessionEnd` — replacing the former pre-init setter exports; re-pass it with each session (cleared at session end). `rebindTrackingStore(store)` remains for the one mid-session need (swapping the tracking store per recording) |
268
+ | `endARSession()` | End the active XR session |
269
+ | `createEnableGpsArController()` | Headless "Enable GPS AR" orchestration (support check + permission bundling + sensor watches + `initAR`) with observable state; the app renders its own button over it |
270
+ | `registerXrFrameUpdate(cb)` | Per-frame access to the live `XRFrame` + reference space + session (valid only synchronously inside the callback). Enables app-side hit-test / other WebXR features |
271
+ | `isFullySupported(s)` / `capabilityMessage(s)` | WebXR + geolocation capability gating + a user-facing message |
272
+ | `startImageCapture()` / `stopImageCapture()` | Toggle camera frame capture |
273
+ | `ImageCaptureManager` | Configurable camera frame capture pipeline |
274
+ | `DepthSampler` | Depth buffer sampling with configurable grids |
275
+ | `CameraBlitCapture` | GPU blit-based camera capture |
276
+ | `initReplayScene(container)` | Create a 3D replay scene with orbit/FPS controls |
277
+ | `applyChromiumProjectionLayerWorkaround` | Chromium camera-access tab-crash workaround. Always deletes projection-layer hooks (forces `XRWebGLLayer`; required on every affected build incl. Chrome 150) and additionally persists `baseLayer` only on the affected Chrome window (148.0.7778.12 up to 149.0.7821) |
278
278
 
279
279
  ### `sensors/` — GPS & Permissions
280
280
 
@@ -291,19 +291,18 @@ WebXR session lifecycle, Three.js renderer setup, image/depth capture, replay sc
291
291
 
292
292
  ### `state/` — Store & Recording
293
293
 
294
- | Export | Description |
295
- | --------------------------------------------------- | -------------------------------------------------------------- |
296
- | `createSlamAppStore(options)` | Composable store factory (see options table above). |
297
- | `recordingReducer` | Recording lifecycle slice (built into the factory). |
298
- | `startSession()` / `endSession()` | Recording lifecycle actions. |
299
- | `recordGpsEvent(payload)` | Record a paired AR+GPS observation. |
300
- | `createGpsPositionHandler(config)` | Factory that adapts `GeolocationPosition` to a store dispatch. |
301
- | `captureGpsAnchorSample(options)` | Sample a paired AR pose + GPS point for anchoring. |
302
- | `loadRecordingOptions()` / `saveRecordingOptions()` | Persist user-controlled recording settings. |
303
- | `replayRecording(store, blob)` | Replay a ZIP recording into a store. |
304
- | `ReplayEngine` | Lower-level timed action playback with pause/resume/speed. |
305
- | `createPersistenceMiddleware(options)` | Middleware factory used internally by `createSlamAppStore`. |
306
- | `wireStoreSubscribers(store, deps)` | Bridge store state → visualization updates. |
294
+ | Export | Description |
295
+ | -------------------------------------- | -------------------------------------------------------------- |
296
+ | `createSlamAppStore(options)` | Composable store factory (see options table above). |
297
+ | `recordingReducer` | Recording lifecycle slice (built into the factory). |
298
+ | `startSession()` / `endSession()` | Recording lifecycle actions. |
299
+ | `recordGpsEvent(payload)` | Record a paired AR+GPS observation. |
300
+ | `createGpsPositionHandler(config)` | Factory that adapts `GeolocationPosition` to a store dispatch. |
301
+ | `captureGpsAnchorSample(options)` | Sample a paired AR pose + GPS point for anchoring. |
302
+ | `replayRecording(store, blob)` | Replay a ZIP recording into a store. |
303
+ | `ReplayEngine` | Lower-level timed action playback with pause/resume/speed. |
304
+ | `createPersistenceMiddleware(options)` | Middleware factory used internally by `createSlamAppStore`. |
305
+ | `wireStoreSubscribers(store, deps)` | Bridge store state visualization updates. |
307
306
 
308
307
  ### `storage/` — OPFS, ZIP, File System
309
308
 
@@ -312,7 +311,7 @@ WebXR session lifecycle, Three.js renderer setup, image/depth capture, replay sc
312
311
  | `StorageBackend` | Abstract storage interface (implement your own). |
313
312
  | `OpfsStorageBackend` | OPFS-based `StorageBackend`. |
314
313
  | `NullStorageBackend` | No-op backend for tests and replay. |
315
- | `initOpfsStorage()` / `initStorage(backend)` | Initialize the file-system layer. |
314
+ | `initOpfsStorage()` | Initialize the OPFS file-system layer. |
316
315
  | `createSession()` / `listSessions()` | Session lifecycle on disk. |
317
316
  | `exportSessionAsZip(handle, { contributors })` | Export a recording session as a ZIP blob. |
318
317
  | `ZipExportContributor` | Hook for adding your own ZIP subdirectories on export. |
@@ -341,7 +340,6 @@ H3-based proximity matching for GPS-anchored points (renamed from `ref-points/`
341
340
  | Export | Description |
342
341
  | ------------------------------ | ------------------------------------------------------ |
343
342
  | `LeafletMapOverlay` | 2D Leaflet map integrated via CSS3D into a 3D scene. |
344
- | `MapOverlay` | Tile-based 3D map overlay (no Leaflet dependency). |
345
343
  | `GpsEventVisualizer` | Three.js spheres for GPS event positions. |
346
344
  | `createAlignmentLerper()` | Smooth alignment matrix interpolation. |
347
345
  | `createCameraFollower()` | Camera that tracks a moving target. |
@@ -392,6 +390,7 @@ pnpm run build # build with tsdown
392
390
  ```
393
391
  src/
394
392
  ├── ar/ # WebXR session, capture, replay scene
393
+ │ └── qr/ # QR detection, pose (planar PnP), size-from-depth, GPS vote
395
394
  ├── sensors/ # GPS, orientation, permissions
396
395
  ├── state/ # createSlamAppStore, recording, replay, persistence middleware
397
396
  ├── storage/ # OPFS, ZIP export/import, StorageBackend
@@ -3,7 +3,7 @@
3
3
  * AbsoluteOrientationSensor capture (Generic Sensor API).
4
4
  *
5
5
  * Phase 1 of the AbsoluteOrientationSensor plan
6
- * (GpsPlusSlamJs_Docs/docs/2026-06-25-absolute-orientation-sensor-plan.md §5.1):
6
+ * (GpsPlusSlamJs_Docs/docs/2026-06-25-0543-absolute-orientation-sensor-plan.md §5.1):
7
7
  * passive instrumentation that fuses accelerometer + gyroscope + magnetometer
8
8
  * into an Earth-referenced (ENU) quaternion, captured per GPS event as an
9
9
  * independent north reference. No production behaviour change.
@@ -16,7 +16,7 @@ import L from "leaflet";
16
16
  * @deprecated Stroke-only since 2026-06-28 (Finding 1) — accuracy circles no
17
17
  * longer render a fill, so this opacity is unused. Retained as an exported
18
18
  * constant only to preserve the published API surface; do not pass it to
19
- * `L.circle`. See `2026-06-28-map-rings-transparency-and-view-direction-user-feedback.md`.
19
+ * `L.circle`. See `2026-06-28-1822-map-rings-transparency-and-view-direction-user-feedback.md`.
20
20
  */
21
21
  declare const ACCURACY_CIRCLE_FILL_OPACITY = 0.12;
22
22
  declare const ACCURACY_CIRCLE_STROKE_OPACITY = 0.5;
@@ -1,4 +1,4 @@
1
- import { N as CombinedRootState } from "./create-slam-app-store-CH31erpP.js";
1
+ import { N as CombinedRootState } from "./create-slam-app-store-HNe1PBtx.js";
2
2
  import * as _$gps_plus_slam_js0 from "gps-plus-slam-js";
3
3
  import { ArImageCapture, GpsPoint, LatLong, Matrix4, Quaternion, Vector3 } from "gps-plus-slam-js";
4
4
  import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
@@ -0,0 +1,2 @@
1
+ import { n as DEFAULT_AR_CRASH_ISOLATION, r as validateArCrashIsolationOptions, t as ArCrashIsolationOptions } from "../ar-crash-isolation-BSFw_beO.js";
2
+ export { ArCrashIsolationOptions, DEFAULT_AR_CRASH_ISOLATION, validateArCrashIsolationOptions };
@@ -0,0 +1,40 @@
1
+ //#region ../src/ar/ar-crash-isolation.ts
2
+ /** Default AR-crash-isolation flags (all features enabled). */
3
+ const DEFAULT_AR_CRASH_ISOLATION = {
4
+ enableDomOverlay: true,
5
+ enableCameraAccess: true,
6
+ enableDepthSensingFeature: true,
7
+ enableCss3dRenderer: true,
8
+ enableCameraTextureAcquisition: true,
9
+ applyChromiumProjectionLayerWorkaround: true
10
+ };
11
+ /**
12
+ * Boolean-or-default (quality-review C-1): persisted/external values are
13
+ * untrusted, so anything that is not a real boolean falls back to the
14
+ * default. Local copy of the recorder catalog's helper — the validator must
15
+ * stay dependency-free so the framework owns the whole group.
16
+ */
17
+ function boolOr(value, fallback) {
18
+ return typeof value === "boolean" ? value : fallback;
19
+ }
20
+ /**
21
+ * Validate and normalize AR crash isolation flags.
22
+ * Missing or invalid values fall back to defaults. The container itself is as
23
+ * untrusted as its fields (persisted blobs may lack the key entirely or hold
24
+ * `null`), so a nullish container yields the full defaults instead of
25
+ * throwing.
26
+ */
27
+ function validateArCrashIsolationOptions(rawOptions) {
28
+ const options = rawOptions ?? {};
29
+ const defaults = DEFAULT_AR_CRASH_ISOLATION;
30
+ return {
31
+ enableDomOverlay: boolOr(options.enableDomOverlay, defaults.enableDomOverlay),
32
+ enableCameraAccess: boolOr(options.enableCameraAccess, defaults.enableCameraAccess),
33
+ enableDepthSensingFeature: boolOr(options.enableDepthSensingFeature, defaults.enableDepthSensingFeature),
34
+ enableCss3dRenderer: boolOr(options.enableCss3dRenderer, defaults.enableCss3dRenderer),
35
+ enableCameraTextureAcquisition: boolOr(options.enableCameraTextureAcquisition, defaults.enableCameraTextureAcquisition),
36
+ applyChromiumProjectionLayerWorkaround: boolOr(options.applyChromiumProjectionLayerWorkaround, defaults.applyChromiumProjectionLayerWorkaround)
37
+ };
38
+ }
39
+ //#endregion
40
+ export { DEFAULT_AR_CRASH_ISOLATION, validateArCrashIsolationOptions };
@@ -1,2 +1,2 @@
1
- import { n as MAX_TRACE_STEPS, r as bresenham3d, t as GridCell } from "../bresenham3d-D-t9i_b5.js";
1
+ import { n as MAX_TRACE_STEPS, r as bresenham3d, t as GridCell } from "../bresenham3d-bt61R-Qa.js";
2
2
  export { GridCell, MAX_TRACE_STEPS, bresenham3d };
@@ -1,2 +1,2 @@
1
- import { a as computeCaptureSize, i as computeAspectFitSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-BlC-arRb.js";
1
+ import { a as computeCaptureSize, i as computeAspectFitSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-CgNJ9grH.js";
2
2
  export { CameraBlitCapture, CameraBlitCaptureConfig, DEFAULT_BLIT_CONFIG, computeAspectFitSize, computeCaptureSize };
@@ -1,2 +1,2 @@
1
- import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-DEo-ktWI.js";
1
+ import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-DrWimJ_t.js";
2
2
  export { CapabilityMessageOptions, CapabilitySupport, capabilityMessage, isFullySupported };
@@ -1,2 +1,2 @@
1
- import { a as createCaptureFailureTracker, i as DEFAULT_CAPTURE_TRACKER_CONFIG, n as CaptureFailureTracker, r as CaptureFailureTrackerConfig, t as CAPTURE_FAILURE_WARNING } from "../capture-failure-tracker-BAUKjtXU.js";
1
+ import { a as createCaptureFailureTracker, i as DEFAULT_CAPTURE_TRACKER_CONFIG, n as CaptureFailureTracker, r as CaptureFailureTrackerConfig, t as CAPTURE_FAILURE_WARNING } from "../capture-failure-tracker-bUXJeMvQ.js";
2
2
  export { CAPTURE_FAILURE_WARNING, CaptureFailureTracker, CaptureFailureTrackerConfig, DEFAULT_CAPTURE_TRACKER_CONFIG, createCaptureFailureTracker };
@@ -0,0 +1,2 @@
1
+ import { a as MotionWindow, i as MotionFilterConfig, n as DEFAULT_MOTION_FILTER, o as decideCapture, r as DEFAULT_MOTION_WINDOW_SIZE, t as CaptureDecisionInput } from "../capture-motion-gate-C60Qrilh.js";
2
+ export { CaptureDecisionInput, DEFAULT_MOTION_FILTER, DEFAULT_MOTION_WINDOW_SIZE, MotionFilterConfig, MotionWindow, decideCapture };
@@ -1,3 +1,26 @@
1
+ //#region ../src/ar/capture-motion-gate.ts
2
+ /**
3
+ * Capture motion gate — the policy that decides whether a *due* capture should
4
+ * fire on the current frame or be deferred until the device settles.
5
+ *
6
+ * Two cohesive pieces, both pure/deterministic and unit-testable in isolation
7
+ * from `ImageCaptureManager`:
8
+ * - {@link decideCapture} — the stateless capture-vs-defer decision over the
9
+ * windowed motion maxima, the thresholds, and the time since the capture
10
+ * became due (the never-calm safety fallback).
11
+ * - {@link MotionWindow} — a tiny fixed-size ring of recent per-frame
12
+ * velocities with glitch rejection, so the decision judges "max over the
13
+ * last N frames" rather than one lucky-calm sample.
14
+ *
15
+ * The window size and glitch ceilings are INTERNAL constants, deliberately not
16
+ * user-facing config: the user-facing surface is only enabled / maxAngular /
17
+ * maxLinear / maxWaitMs (plan §5.1). Keeping the stateful policy here (not in a
18
+ * speculative framework-wide service) matches the plan's §4.1 scope note.
19
+ *
20
+ * @see GpsPlusSlamJs_Docs/docs/2026-06-23-2105-blurry-frame-motion-gating-plan.md §4.2-4.4
21
+ */
22
+ /** Default number of recent frames the gate judges motion over (~50 ms @ 60fps). */
23
+ const DEFAULT_MOTION_WINDOW_SIZE = 3;
1
24
  /**
2
25
  * Angular velocity (rad/s) above which a sample is treated as a tracking glitch
3
26
  * (e.g. relocalization teleport), not real motion. A genuine hand/device turn
@@ -27,7 +50,7 @@ const LINEAR_GLITCH_CEILING_M_S = 20;
27
50
  * — demoting the (weak-at-scanning-distance) linear signal to a gross-motion
28
51
  * safety net and letting the well-behaved angular gate be the primary blur
29
52
  * selector. See
30
- * `GpsPlusSlamJs_Docs/docs/2026-07-02-image-capture-rate-motion-gate-finding.md`.
53
+ * `GpsPlusSlamJs_Docs/docs/2026-07-02-0117-image-capture-rate-motion-gate-finding.md`.
31
54
  *
32
55
  * `maxAngularVelocity` remains a PLACEHOLDER pending on-device field tuning
33
56
  * (plan §7). `maxWaitMs` of 4000 ms is 2× the default 2000 ms image interval.
@@ -103,4 +126,4 @@ var MotionWindow = class {
103
126
  }
104
127
  };
105
128
  //#endregion
106
- export { MotionWindow as n, decideCapture as r, DEFAULT_MOTION_FILTER as t };
129
+ export { DEFAULT_MOTION_FILTER, DEFAULT_MOTION_WINDOW_SIZE, MotionWindow, decideCapture };
@@ -1,2 +1,2 @@
1
- import { a as applyChromiumProjectionLayerWorkaround, i as ChromiumProjectionLayerWorkaroundResult, n as BASELAYER_WINDOW_MIN, o as needsBaseLayerPersistence, r as ChromeVersion, s as parseChromeVersion, t as BASELAYER_WINDOW_MAX } from "../chromium-camera-access-workaround-DCd8SP2N.js";
1
+ import { a as applyChromiumProjectionLayerWorkaround, i as ChromiumProjectionLayerWorkaroundResult, n as BASELAYER_WINDOW_MIN, o as needsBaseLayerPersistence, r as ChromeVersion, s as parseChromeVersion, t as BASELAYER_WINDOW_MAX } from "../chromium-camera-access-workaround-BRs6gkI4.js";
2
2
  export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, ChromeVersion, ChromiumProjectionLayerWorkaroundResult, applyChromiumProjectionLayerWorkaround, needsBaseLayerPersistence, parseChromeVersion };
@@ -11,7 +11,7 @@ import { createLogger } from "../utils/logger.js";
11
11
  * added — i.e. it is not specific to this app's session setup. See:
12
12
  *
13
13
  * - GpsPlusSlamJs_Docs/docs/2026-04-22-camera-access-reproducer-plan.md
14
- * - GpsPlusSlamJs_Docs/docs/2026-06-04-camera-access-crash-regression-chrome-148.md
14
+ * - GpsPlusSlamJs_Docs/docs/2026-06-04-0458-camera-access-crash-regression-chrome-148.md
15
15
  * - https://github.com/mrdoob/three.js/issues/33404
16
16
  * - https://issues.chromium.org/issues/507508099 (root-cause, marked Fixed)
17
17
  *
@@ -1,2 +1,2 @@
1
- import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-DY6zYTLx.js";
1
+ import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-PcJTdRLL.js";
2
2
  export { DepthGridLookup, createDepthGridLookup };
@@ -1,4 +1,4 @@
1
- import { t as DepthInfo } from "../depth-sampler-txG8evgQ.js";
1
+ import { r as DepthInfo } from "../depth-sampler-BcvuxgCS.js";
2
2
  import * as THREE from "three";
3
3
 
4
4
  //#region ../src/ar/depth-occluder.d.ts
@@ -10,7 +10,7 @@ import * as THREE from "three";
10
10
  * occludes per-pixel against the surface currently in view (sharp, registration-
11
11
  * free, no memory). They **compose** — both depth-only under `arWorldGroup`, the
12
12
  * live occluder wins where this frame has depth, the mesh fills out-of-view / depth
13
- * holes (2026-06-14-webxr-depth-occlusion-plan.md §5).
13
+ * holes (2026-06-14-0009-webxr-depth-occlusion-plan.md §5).
14
14
  *
15
15
  * **Two layers, two confidence levels:**
16
16
  * - The **pure occlusion math** (this file's exported functions) is the CI-tested
@@ -1,3 +1,3 @@
1
- import { i as DepthSample } from "../ar-types-CBafnxhE.js";
2
- import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-txG8evgQ.js";
3
- export { DepthInfo, DepthSample, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, wrapXRDepthInfo };
1
+ import { i as DepthSample } from "../ar-types-BprL3nKv.js";
2
+ import { a as DepthSamplerCallbacks, i as DepthSampler, n as DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS, o as DepthSamplerConfig, r as DepthInfo, s as wrapXRDepthInfo, t as DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE } from "../depth-sampler-BcvuxgCS.js";
3
+ export { DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE, DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS, DepthInfo, DepthSample, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, wrapXRDepthInfo };
@@ -42,6 +42,33 @@ function wrapXRDepthInfo(raw, projectionMatrix) {
42
42
  if (uvTransform) wrapped.normDepthBufferFromNormView = uvTransform;
43
43
  return wrapped;
44
44
  }
45
+ /**
46
+ * Recommended depth-sampling cadence for apps that RECONSTRUCT-and-render an
47
+ * occupancy mesh (the Recorder, the PhysicsDemo) — the depth-side counterpart
48
+ * of `DEFAULT_OCCUPANCY_CELL_SIZE_M`/`DEFAULT_OCCUPANCY_MIN_OBSERVATIONS`
49
+ * (occupancy-grid.ts): one framework-level source of truth so both apps build
50
+ * the mesh at the same speed (2026-07-16 field feedback: the demo relied on
51
+ * the conservative fallback below — 16×16 @ 1 Hz, 8× fewer points/s than the
52
+ * recorder — and reconstructed visibly slower).
53
+ *
54
+ * Tuning (2026-07-16 EVENING, maintainer's on-device framerate/mesh trade-off
55
+ * passes — supersedes the same-day sweep-derived 500 ms × 64): 200 ms × 24×24.
56
+ * The ground-truth density/cadence sweep
57
+ * (GpsPlusSlamJs_Investigation test-results/synthetic-density-cadence-sweep.txt)
58
+ * showed density is the more point-efficient mesh-speed lever, but its
59
+ * flagged open question — on-device frame-time cost — resolved against LARGE
60
+ * per-sample batches: 64² @ 2 Hz (8192 points/s) visibly hurt the framerate,
61
+ * while many SMALL samples (24² @ 5 Hz, ~2880 points/s) keep the per-frame
62
+ * work chunk tiny and rendering smooth at good mesh build-up. If devices get
63
+ * faster, the sweep says gridSize (not the interval) is the knob to raise
64
+ * first.
65
+ *
66
+ * Deliberately OPT-IN named constants, NOT a change to the fallback below:
67
+ * bumping the fallback would silently re-tune consumers that are not
68
+ * reconstruction apps (MinimalExample / AnchorStarter).
69
+ */
70
+ const DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS = 200;
71
+ const DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE = 24;
45
72
  const DEFAULT_CONFIG = {
46
73
  intervalMs: 1e3,
47
74
  gridSize: 16,
@@ -228,4 +255,4 @@ function isFinitePositive(value) {
228
255
  return typeof value === "number" && Number.isFinite(value) && value > 0;
229
256
  }
230
257
  //#endregion
231
- export { DepthSampler, wrapXRDepthInfo };
258
+ export { DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE, DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS, DepthSampler, wrapXRDepthInfo };
@@ -1,2 +1,2 @@
1
- import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-JKkeqJrV.js";
1
+ import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-DbGipFkA.js";
2
2
  export { DepthUnprojector, createDepthUnprojector, unprojectDepthPoint };
@@ -1,2 +1,2 @@
1
- import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-BbNWyqp5.js";
1
+ import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-xjz3jNqm.js";
2
2
  export { EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, createEnableGpsArController };
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
- import { C as initAR, c as endARSession, w as isWebXRSupported } from "../webxr-session-DWKUsCN9.js";
2
+ import { _ as initAR, a as endARSession, v as isWebXRSupported } from "../webxr-session-BBlgzrqY.js";
3
3
  import { requestGeolocationPermission, requestOrientationPermission, requestWebXRWithDepthPermission } from "../sensors/permission-checker.js";
4
4
  import { startGpsWatch, startOrientationWatch, stopGpsWatch, stopOrientationWatch } from "../sensors/gps.js";
5
5
  //#region ../src/ar/enable-gps-ar.ts
@@ -74,11 +74,22 @@ function createEnableGpsArController(deps = {}) {
74
74
  error: "AR is already starting, running or stopping."
75
75
  };
76
76
  setState({ status: "starting" });
77
+ const appCallbacks = config.callbacks;
78
+ const callbacks = {
79
+ ...appCallbacks,
80
+ onSessionEnd: (info) => {
81
+ if (state.status === "running") {
82
+ stopWatches();
83
+ setState({ status: "ready" });
84
+ }
85
+ appCallbacks?.onSessionEnd?.(info);
86
+ }
87
+ };
77
88
  let sessionStarted = false;
78
89
  try {
79
90
  const permissionError = await requestPermissions(config);
80
91
  if (permissionError !== null) return fail(permissionError);
81
- await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest });
92
+ await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest }, callbacks);
82
93
  sessionStarted = true;
83
94
  if (config.onGpsPosition) {
84
95
  resolved.startGpsWatch(config.onGpsPosition);
@@ -127,9 +138,8 @@ function createEnableGpsArController(deps = {}) {
127
138
  error
128
139
  };
129
140
  }
130
- async function disable() {
131
- if (state.status !== "running") return;
132
- setState({ status: "stopping" });
141
+ /** Stop whichever sensor watches this controller started (idempotent). */
142
+ function stopWatches() {
133
143
  if (gpsWatchActive) {
134
144
  resolved.stopGpsWatch();
135
145
  gpsWatchActive = false;
@@ -138,6 +148,11 @@ function createEnableGpsArController(deps = {}) {
138
148
  resolved.stopOrientationWatch();
139
149
  orientationWatchActive = false;
140
150
  }
151
+ }
152
+ async function disable() {
153
+ if (state.status !== "running") return;
154
+ setState({ status: "stopping" });
155
+ stopWatches();
141
156
  try {
142
157
  await resolved.endARSession();
143
158
  } catch (err) {
@@ -1,2 +1,2 @@
1
- import { i as runFrameUpdates, n as clearFrameUpdates, r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-7HigCj7m.js";
1
+ import { i as runFrameUpdates, n as clearFrameUpdates, r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-CUEIdlhS.js";
2
2
  export { FrameUpdate, clearFrameUpdates, registerFrameUpdate, runFrameUpdates };
@@ -0,0 +1,2 @@
1
+ import { n as HitTestReticleHandle, r as startHitTestReticle, t as HitTestReticleArgs } from "../hit-test-reticle-driver-CfKiDgsa.js";
2
+ export { HitTestReticleArgs, HitTestReticleHandle, startHitTestReticle };
@@ -0,0 +1,122 @@
1
+ import { registerXrFrameUpdate } from "./xr-frame-loop.js";
2
+ import { createReticleMesh, updateReticle } from "../visualization/hit-test-reticle.js";
3
+ import { Vector3 } from "three";
4
+ //#region ../src/ar/hit-test-reticle-driver.ts
5
+ /**
6
+ * Hit-test reticle driver — the per-frame WebXR plumbing that drives the
7
+ * screen-centre hit-test reticle whose pure view-model lives in
8
+ * `visualization/hit-test-reticle.ts` (`createReticleMesh` / `updateReticle`).
9
+ *
10
+ * Promoted from the consumer apps (2026-07-18): MinimalExample,
11
+ * WayfindingHudDemo and AnchorStarter each hand-rolled this loop, and the
12
+ * copies had already drifted in their session-end handling. AnchorStarter's
13
+ * copy (the most careful one) is the reference implementation.
14
+ *
15
+ * Responsibilities, all subtle and previously copy-pasted per app:
16
+ * - Request the hit-test source once per session (`requestReferenceSpace
17
+ * ('viewer')` → `requestHitTestSource`), retrying on transient failure.
18
+ * - Guard the "request still in flight while we shut down" races: a source
19
+ * that resolves after `dispose()` — or after the session that issued the
20
+ * request has ended — is cancelled, never adopted.
21
+ * - Register the session `'end'` (and optional `'select'`) listeners exactly
22
+ * once per session, outside the request-retry path.
23
+ * - Reset per-session state on `'end'` so a fresh session re-requests its own
24
+ * source with its own listeners.
25
+ *
26
+ * Lifecycle: the handle is torn down only by `dispose()`. In the framework's
27
+ * standard flow `resetWebXRState()` clears the XR frame registry at every
28
+ * session end, so a handle is typically created once per AR session entry and
29
+ * disposed from the app's session-teardown path; the per-session reset logic
30
+ * additionally keeps the handle correct when frames are delivered outside that
31
+ * flow (tests, custom loops).
32
+ */
33
+ /**
34
+ * Request a screen-centre hit-test source from the live session. Returns
35
+ * `null` when the runtime does not expose `requestHitTestSource` (older WebXR
36
+ * builds); the caller keeps the reticle hidden in that case.
37
+ */
38
+ async function requestHitTestSource(session) {
39
+ const viewerSpace = await session.requestReferenceSpace("viewer");
40
+ return await session.requestHitTestSource?.({ space: viewerSpace }) ?? null;
41
+ }
42
+ /**
43
+ * Cancel a hit-test source, tolerating a dead session. `cancel()` can throw
44
+ * once the source's session has ended (e.g. the app's teardown path calls
45
+ * `dispose()` before this driver's own `'end'` listener has run) — and a
46
+ * dead session has already stopped the hit-test, so there is nothing left to
47
+ * clean up.
48
+ */
49
+ function cancelSource(source) {
50
+ try {
51
+ source?.cancel();
52
+ } catch {}
53
+ }
54
+ /**
55
+ * Install the hit-test reticle under `arWorldGroup` and start driving it from
56
+ * the XR frame loop. Returns a handle the app reads at placement time (or
57
+ * ignores entirely when it placed via `onSelect`).
58
+ */
59
+ function startHitTestReticle(args) {
60
+ const reticle = createReticleMesh();
61
+ args.arWorldGroup.add(reticle);
62
+ let hitTestSource = null;
63
+ let hitTestSourceRequested = false;
64
+ let disposed = false;
65
+ let removeSessionListeners = null;
66
+ let sessionGeneration = 0;
67
+ const handleSelect = () => {
68
+ args.onSelect?.(reticle.visible ? reticle.getWorldPosition(new Vector3()) : null);
69
+ };
70
+ const handleSessionEnd = () => {
71
+ sessionGeneration += 1;
72
+ hitTestSource = null;
73
+ hitTestSourceRequested = false;
74
+ removeSessionListeners = null;
75
+ };
76
+ const unregister = registerXrFrameUpdate(({ frame, referenceSpace, session }) => {
77
+ if (!removeSessionListeners) {
78
+ session.addEventListener("end", handleSessionEnd);
79
+ if (args.onSelect) session.addEventListener("select", handleSelect);
80
+ removeSessionListeners = () => {
81
+ session.removeEventListener("end", handleSessionEnd);
82
+ if (args.onSelect) session.removeEventListener("select", handleSelect);
83
+ };
84
+ }
85
+ if (!hitTestSourceRequested) {
86
+ hitTestSourceRequested = true;
87
+ const requestGeneration = sessionGeneration;
88
+ requestHitTestSource(session).then((source) => {
89
+ if (disposed || requestGeneration !== sessionGeneration) {
90
+ cancelSource(source);
91
+ return;
92
+ }
93
+ hitTestSource = source;
94
+ }).catch(() => {
95
+ if (requestGeneration === sessionGeneration) hitTestSourceRequested = false;
96
+ });
97
+ }
98
+ if (!hitTestSource) {
99
+ updateReticle(reticle, null);
100
+ return;
101
+ }
102
+ const [hit] = frame.getHitTestResults(hitTestSource);
103
+ const pose = hit?.getPose(referenceSpace);
104
+ updateReticle(reticle, pose ? pose.transform.matrix : null);
105
+ });
106
+ return {
107
+ isVisible: () => reticle.visible,
108
+ getWorldPosition: (out) => reticle.getWorldPosition(out),
109
+ dispose: () => {
110
+ if (disposed) return;
111
+ disposed = true;
112
+ unregister();
113
+ removeSessionListeners?.();
114
+ removeSessionListeners = null;
115
+ cancelSource(hitTestSource);
116
+ hitTestSource = null;
117
+ args.arWorldGroup.remove(reticle);
118
+ }
119
+ };
120
+ }
121
+ //#endregion
122
+ export { startHitTestReticle };
@@ -1,2 +1,2 @@
1
- import { a as ImageCaptureCallbacks, c as MIN_VALID_IMAGE_BYTES, i as FrameQualityVerdict, n as CapturedImage, o as ImageCaptureConfig, r as DEFAULT_CAPTURE_CONFIG, s as ImageCaptureManager, t as CapturedFrame } from "../image-capture-Cr_rljeV.js";
1
+ import { a as ImageCaptureCallbacks, c as MIN_VALID_IMAGE_BYTES, i as FrameQualityVerdict, n as CapturedImage, o as ImageCaptureConfig, r as DEFAULT_CAPTURE_CONFIG, s as ImageCaptureManager, t as CapturedFrame } from "../image-capture-BXmx1YvD.js";
2
2
  export { CapturedFrame, CapturedImage, DEFAULT_CAPTURE_CONFIG, FrameQualityVerdict, ImageCaptureCallbacks, ImageCaptureConfig, ImageCaptureManager, MIN_VALID_IMAGE_BYTES };
@@ -1,2 +1,2 @@
1
- import { n as ImageCaptureManager, r as MIN_VALID_IMAGE_BYTES, t as DEFAULT_CAPTURE_CONFIG } from "../image-capture-BUqqsOi3.js";
1
+ import { n as ImageCaptureManager, r as MIN_VALID_IMAGE_BYTES, t as DEFAULT_CAPTURE_CONFIG } from "../image-capture-Dn8uLIP2.js";
2
2
  export { DEFAULT_CAPTURE_CONFIG, ImageCaptureManager, MIN_VALID_IMAGE_BYTES };
@@ -1,2 +1,2 @@
1
- import { a as QualityFilterConfig, c as meanLuminance, i as ImageQualityGate, l as rgbaToGrayscale, n as DEFAULT_SHARPNESS_HISTORY_SIZE, o as QualityRejectReason, r as DEFAULT_SHARPNESS_MIN_SAMPLES, s as QualityVerdict, t as DEFAULT_QUALITY_FILTER, u as sharpnessScore } from "../image-quality-BjBLoTec.js";
2
- export { DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, QualityFilterConfig, QualityRejectReason, QualityVerdict, meanLuminance, rgbaToGrayscale, sharpnessScore };
1
+ import { a as DEFAULT_SHARPNESS_MIN_SAMPLES, c as QualityRejectReason, d as highFrequencyEnergyRatio, f as meanLuminance, i as DEFAULT_SHARPNESS_HISTORY_SIZE, l as QualityVerdict, m as sharpnessScore, n as BlurMetricId, o as ImageQualityGate, p as rgbaToGrayscale, r as DEFAULT_QUALITY_FILTER, s as QualityFilterConfig, t as BLUR_METRIC_IDS, u as blurMetricScorer } from "../image-quality-G7_qT4aj.js";
2
+ export { BLUR_METRIC_IDS, BlurMetricId, DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, QualityFilterConfig, QualityRejectReason, QualityVerdict, blurMetricScorer, highFrequencyEnergyRatio, meanLuminance, rgbaToGrayscale, sharpnessScore };