gps-plus-slam-app-framework 1.11.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 (248) hide show
  1. package/README.md +13 -14
  2. package/dist/{app-selectors-DG0ZqaeI.d.ts → app-selectors-QM0ZpNA4.d.ts} +1 -1
  3. package/dist/ar/ar-crash-isolation.d.ts +1 -1
  4. package/dist/ar/bresenham3d.d.ts +1 -1
  5. package/dist/ar/camera-blit-capture.d.ts +1 -1
  6. package/dist/ar/capability-checker.d.ts +1 -1
  7. package/dist/ar/capture-failure-tracker.d.ts +1 -1
  8. package/dist/ar/capture-motion-gate.d.ts +1 -1
  9. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  10. package/dist/ar/depth-grid-lookup.d.ts +1 -1
  11. package/dist/ar/depth-occluder.d.ts +1 -1
  12. package/dist/ar/depth-sampler.d.ts +3 -3
  13. package/dist/ar/depth-sampler.js +28 -1
  14. package/dist/ar/depth-unprojection.d.ts +1 -1
  15. package/dist/ar/enable-gps-ar.d.ts +1 -1
  16. package/dist/ar/enable-gps-ar.js +20 -5
  17. package/dist/ar/frame-loop.d.ts +1 -1
  18. package/dist/ar/hit-test-reticle-driver.d.ts +2 -0
  19. package/dist/ar/hit-test-reticle-driver.js +122 -0
  20. package/dist/ar/image-capture.d.ts +1 -1
  21. package/dist/ar/image-capture.js +1 -1
  22. package/dist/ar/image-quality.d.ts +1 -1
  23. package/dist/ar/index.d.ts +35 -34
  24. package/dist/ar/index.js +5 -4
  25. package/dist/ar/occlusion-mesh-worker.d.ts +2 -2
  26. package/dist/ar/occlusion-mesh-worker.js +6 -4
  27. package/dist/ar/occupancy-grid.d.ts +2 -2
  28. package/dist/ar/occupancy-grid.js +191 -11
  29. package/dist/ar/occupancy-mesher.d.ts +1 -1
  30. package/dist/ar/occupancy-mesher.js +1 -636
  31. package/dist/ar/qr/index.d.ts +10 -10
  32. package/dist/ar/qr/planar-pnp.d.ts +1 -1
  33. package/dist/ar/qr/qr-debug-view.d.ts +1 -1
  34. package/dist/ar/qr/qr-derived-pose.d.ts +1 -1
  35. package/dist/ar/qr/qr-detection-controller.d.ts +1 -1
  36. package/dist/ar/qr/qr-frontend.d.ts +1 -1
  37. package/dist/ar/qr/qr-pose.d.ts +1 -1
  38. package/dist/ar/qr/qr-size-depth-context.d.ts +2 -2
  39. package/dist/ar/qr/qr-size-measurer.d.ts +1 -1
  40. package/dist/ar/replay-scene.d.ts +1 -1
  41. package/dist/ar/replay-scene.js +1 -1
  42. package/dist/ar/scene-node-names.d.ts +1 -1
  43. package/dist/ar/webxr-nue-basis.d.ts +1 -1
  44. package/dist/ar/webxr-session.d.ts +3 -3
  45. package/dist/ar/webxr-session.js +1 -1
  46. package/dist/ar/xr-camera-texture.d.ts +1 -1
  47. package/dist/ar/xr-error-handler.d.ts +1 -1
  48. package/dist/ar/xr-frame-loop.d.ts +1 -1
  49. package/dist/{ar-world-group-alignment-BdS_h8Nf.d.ts → ar-world-group-alignment-CvvfACfx.d.ts} +1 -1
  50. package/dist/{cell-key-Bj-eYTLA.js → cell-key-D1b_Ix-p.js} +12 -1
  51. package/dist/core/index.d.ts +1 -1
  52. package/dist/{create-slam-app-store-DFm5K9Ob.d.ts → create-slam-app-store-HNe1PBtx.d.ts} +26 -4
  53. package/dist/{create-slam-app-store-oK9bnqyI.js → create-slam-app-store-wYN7YkB5.js} +13 -4
  54. package/dist/{depth-grid-lookup-CCuzlqUo.d.ts → depth-grid-lookup-PcJTdRLL.d.ts} +1 -1
  55. package/dist/{depth-sampler-CS2jAFw4.d.ts → depth-sampler-BcvuxgCS.d.ts} +29 -2
  56. package/dist/{depth-unprojection-ET3Gwedf.d.ts → depth-unprojection-DbGipFkA.d.ts} +1 -1
  57. package/dist/{enable-gps-ar-D_xEHzh5.d.ts → enable-gps-ar-xjz3jNqm.d.ts} +4 -4
  58. package/dist/{frame-conversions-CH7E2Iv_.d.ts → frame-conversions-CzPQDYpM.d.ts} +1 -1
  59. package/dist/{fused-path-DOKzVMiO.d.ts → fused-path-CBAttcVm.d.ts} +1 -1
  60. package/dist/geo/h3-proximity.d.ts +1 -1
  61. package/dist/geo/index.d.ts +1 -1
  62. package/dist/{gps-anchor-BaqyRsPC.d.ts → gps-anchor-Gv4NDwH4.d.ts} +1 -1
  63. package/dist/{gps-ar-pose-sampler-BuuUuK-D.d.ts → gps-ar-pose-sampler-DBEYDFY5.d.ts} +1 -1
  64. package/dist/{gps-event-coordinator-Cruoe5I-.d.ts → gps-event-coordinator-BKwB4RyQ.d.ts} +4 -4
  65. package/dist/{gps-event-markers-y2b2aVl6.d.ts → gps-event-markers-212h7j3D.d.ts} +4 -4
  66. package/dist/hit-test-reticle-driver-CfKiDgsa.d.ts +40 -0
  67. package/dist/{image-capture-BevgKpoO.d.ts → image-capture-BXmx1YvD.d.ts} +3 -3
  68. package/dist/{index-Dxb6ATNK.d.ts → index-DVmgFIgm.d.ts} +1 -1
  69. package/dist/{index-BWVwd9Zw.d.ts → index-DX9VC257.d.ts} +3 -3
  70. package/dist/{index-ClmnNJ6-.d.ts → index-qtZ2muFd.d.ts} +1 -1
  71. package/dist/index.d.ts +89 -82
  72. package/dist/index.js +17 -10
  73. package/dist/{leaflet-map-overlay-CksetpTt.d.ts → leaflet-map-overlay-BkHmzvpD.d.ts} +1 -1
  74. package/dist/{map-data-D8cCqpOM.d.ts → map-data-BQXPtRz7.d.ts} +1 -1
  75. package/dist/{map-overlay-draw-Cy-klqoA.d.ts → map-overlay-draw-sTM3wug_.d.ts} +1 -1
  76. package/dist/{null-storage-backend-DXXuwG8T.d.ts → null-storage-backend-Dtn3TBfT.d.ts} +2 -2
  77. package/dist/{occlusion-mesh-BWe2PrVi.d.ts → occlusion-mesh-BY2aMej3.d.ts} +22 -4
  78. package/dist/occupancy-cubes-visualizer-soN0Sizd.d.ts +146 -0
  79. package/dist/{occupancy-grid-CYBdmMOo.d.ts → occupancy-grid-DKzIdCSZ.d.ts} +113 -3
  80. package/dist/{occupancy-mesher-B4Bv4BTk.d.ts → occupancy-mesher-Co80tOpl.d.ts} +22 -1
  81. package/dist/occupancy-mesher-DzNeJdQf.js +837 -0
  82. package/dist/{opfs-storage-backend-D1ZpeNEL.d.ts → opfs-storage-backend-CZ-ECudx.d.ts} +2 -2
  83. package/dist/perf-stats-overlay-BMEQrzx6.d.ts +68 -0
  84. package/dist/{persistence-middleware-Cun4aF5M.d.ts → persistence-middleware-Byo_Fs4n.d.ts} +1 -1
  85. package/dist/{planar-pnp-ByxwDEyM.d.ts → planar-pnp-CkcMN3o3.d.ts} +1 -1
  86. package/dist/pointer-picking-BATHHTlT.d.ts +41 -0
  87. package/dist/{qr-debug-view-CGlITU09.d.ts → qr-debug-view-BMjNVhV2.d.ts} +1 -1
  88. package/dist/{qr-derived-pose-DZPxZd9C.d.ts → qr-derived-pose-Dq7mPK2s.d.ts} +2 -2
  89. package/dist/{qr-detected-slice-mfyxD2-M.d.ts → qr-detected-slice-8t_laDR9.d.ts} +4 -4
  90. package/dist/{qr-detection-controller-C5NII-vs.d.ts → qr-detection-controller-Dh4Paymb.d.ts} +3 -3
  91. package/dist/{qr-frontend-QzKZSqB-.d.ts → qr-frontend-BnLlVjKu.d.ts} +1 -1
  92. package/dist/{qr-pose-aggregation-mABSN0AW.d.ts → qr-pose-aggregation-Bpv4uARJ.d.ts} +1 -1
  93. package/dist/{qr-size-depth-context-CMDv6T29.d.ts → qr-size-depth-context-Bzbx98nS.d.ts} +2 -2
  94. package/dist/{qr-size-measurer-rVFf4AdM.d.ts → qr-size-measurer-18_W3INY.d.ts} +3 -3
  95. package/dist/{recording-replayer-qT2EM1Qs.d.ts → recording-replayer-BKmVuchg.d.ts} +2 -2
  96. package/dist/{recording-slice-DXw5-UvO.d.ts → recording-slice-zMedT0ot.d.ts} +1 -1
  97. package/dist/{replay-engine-B1H_kLhK.d.ts → replay-engine-D-cbT0Fw.d.ts} +1 -1
  98. package/dist/{replay-scene-BJeO36YT.d.ts → replay-scene-D5qzY0_x.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/index.d.ts +4 -4
  103. package/dist/sensors/permission-checker.d.ts +1 -1
  104. package/dist/state/app-selectors.d.ts +1 -1
  105. package/dist/state/combined-root-state.d.ts +1 -1
  106. package/dist/state/create-slam-app-store.d.ts +1 -1
  107. package/dist/state/create-slam-app-store.js +1 -1
  108. package/dist/state/gps-ar-pose-sampler.d.ts +2 -2
  109. package/dist/state/gps-event-coordinator.d.ts +2 -2
  110. package/dist/state/gps-event-coordinator.js +1 -1
  111. package/dist/state/index.d.ts +18 -18
  112. package/dist/state/index.js +3 -3
  113. package/dist/state/persistence-middleware.d.ts +1 -1
  114. package/dist/state/qr-detected-slice.d.ts +3 -3
  115. package/dist/state/recording-replayer.d.ts +2 -2
  116. package/dist/state/recording-replayer.js +1 -1
  117. package/dist/state/recording-slice.d.ts +1 -1
  118. package/dist/state/replay-engine.d.ts +1 -1
  119. package/dist/state/replay-occupancy-subscriber.d.ts +51 -0
  120. package/dist/state/replay-occupancy-subscriber.js +85 -0
  121. package/dist/state/replay-session.d.ts +88 -0
  122. package/dist/state/replay-session.js +165 -0
  123. package/dist/state/store-subscribers.d.ts +2 -2
  124. package/dist/state/store-subscribers.js +1 -1
  125. package/dist/state/subscribe-to-selector.d.ts +1 -1
  126. package/dist/state/tracking-quality.d.ts +1 -1
  127. package/dist/state/tracking-slice.d.ts +1 -1
  128. package/dist/{state-CDF5LvsO.js → state-DxL3T1Id.js} +1 -1
  129. package/dist/storage/file-system-utils.d.ts +1 -1
  130. package/dist/storage/index.d.ts +8 -8
  131. package/dist/storage/null-storage-backend.d.ts +1 -1
  132. package/dist/storage/opfs-storage-backend.d.ts +1 -1
  133. package/dist/storage/opfs-storage.d.ts +1 -1
  134. package/dist/storage/storage-backend.d.ts +1 -1
  135. package/dist/storage/zip-coverage-embed.d.ts +1 -1
  136. package/dist/storage/zip-export.d.ts +1 -1
  137. package/dist/storage/zip-reader.d.ts +1 -1
  138. package/dist/{storage-backend-BX7egQKi.d.ts → storage-backend-DCYbOvTw.d.ts} +1 -1
  139. package/dist/{store-subscribers-CWHToX6N.d.ts → store-subscribers-BbRW35u5.d.ts} +2 -2
  140. package/dist/{subscribe-to-selector-j-eOYybQ.d.ts → subscribe-to-selector-B_lm_euO.d.ts} +1 -1
  141. package/dist/test-utils/browser-mocks.d.ts +1 -1
  142. package/dist/test-utils/zip-round-trip-helpers.d.ts +1 -1
  143. package/dist/text-sprite-C6VcC2mo.d.ts +53 -0
  144. package/dist/{tracking-slice-BAbcZK-Y.d.ts → tracking-slice-D5LDL_y4.d.ts} +1 -1
  145. package/dist/types/ar-types.d.ts +1 -1
  146. package/dist/types/geo-types.d.ts +1 -1
  147. package/dist/types/index.d.ts +2 -2
  148. package/dist/utils/concurrency.d.ts +1 -1
  149. package/dist/utils/failure-tracker.d.ts +1 -1
  150. package/dist/utils/format-file-size.d.ts +1 -1
  151. package/dist/utils/fused-path.d.ts +1 -1
  152. package/dist/utils/index.d.ts +7 -7
  153. package/dist/utils/list-formatter.d.ts +1 -1
  154. package/dist/utils/logger.d.ts +1 -1
  155. package/dist/visualization/accuracy-circles.d.ts +1 -1
  156. package/dist/visualization/alignment-lerper.d.ts +1 -1
  157. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  158. package/dist/visualization/ar-world-group-alignment.js +1 -1
  159. package/dist/visualization/camera-follower.d.ts +1 -1
  160. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  161. package/dist/visualization/frame-conversions.d.ts +1 -1
  162. package/dist/visualization/frustum-visibility.d.ts +1 -1
  163. package/dist/visualization/gps-anchor.d.ts +1 -1
  164. package/dist/visualization/gps-compass-cubes.d.ts +1 -1
  165. package/dist/visualization/gps-compass-cubes.js +6 -22
  166. package/dist/visualization/gps-event-markers.d.ts +1 -1
  167. package/dist/visualization/gps-event-markers.js +1 -1
  168. package/dist/visualization/hit-test-reticle.d.ts +1 -1
  169. package/dist/visualization/hit-test-reticle.js +3 -2
  170. package/dist/visualization/index.d.ts +25 -19
  171. package/dist/visualization/index.js +10 -4
  172. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  173. package/dist/visualization/leaflet-map-overlay.js +1 -1
  174. package/dist/visualization/lerp-utils.d.ts +1 -1
  175. package/dist/visualization/map-data.d.ts +1 -1
  176. package/dist/visualization/map-data.js +1 -1
  177. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  178. package/dist/visualization/occluder-mesh-driver.d.ts +2 -2
  179. package/dist/visualization/occlusion-mesh.d.ts +1 -1
  180. package/dist/visualization/occlusion-mesh.js +26 -1
  181. package/dist/visualization/occupancy-cubes-visualizer.d.ts +2 -0
  182. package/dist/visualization/occupancy-cubes-visualizer.js +221 -0
  183. package/dist/visualization/perf-stats-overlay.d.ts +2 -0
  184. package/dist/visualization/perf-stats-overlay.js +85 -0
  185. package/dist/visualization/pointer-picking.d.ts +2 -0
  186. package/dist/visualization/pointer-picking.js +58 -0
  187. package/dist/visualization/text-sprite.d.ts +2 -0
  188. package/dist/visualization/text-sprite.js +105 -0
  189. package/dist/visualization/three-dispose.d.ts +1 -1
  190. package/dist/visualization/vis-colors.d.ts +1 -1
  191. package/dist/visualization/wayfinding-hud.d.ts +2 -0
  192. package/dist/visualization/wayfinding-hud.js +289 -0
  193. package/dist/visualization/wayfinding-placement.d.ts +2 -0
  194. package/dist/visualization/wayfinding-placement.js +157 -0
  195. package/dist/wayfinding-hud-DVun2b69.d.ts +82 -0
  196. package/dist/wayfinding-placement-dnHzfYlT.d.ts +97 -0
  197. package/dist/{webxr-session-OyR3YbTq.js → webxr-session-BBlgzrqY.js} +3 -3
  198. package/dist/{webxr-session-DefwObIu.d.ts → webxr-session-DurXRnl_.d.ts} +7 -7
  199. package/package.json +3 -3
  200. /package/dist/{absolute-orientation-Dj1One3y.d.ts → absolute-orientation-0WIsqJnu.d.ts} +0 -0
  201. /package/dist/{accuracy-circles-BHz7yVIL.d.ts → accuracy-circles-CFnKGfsD.d.ts} +0 -0
  202. /package/dist/{alignment-lerper-DAHicRON.d.ts → alignment-lerper-CK1TYLIL.d.ts} +0 -0
  203. /package/dist/{ar-crash-isolation-DlXCGzMf.d.ts → ar-crash-isolation-BSFw_beO.d.ts} +0 -0
  204. /package/dist/{ar-types-D6PYS4bc.d.ts → ar-types-BprL3nKv.d.ts} +0 -0
  205. /package/dist/{bresenham3d-D-t9i_b5.d.ts → bresenham3d-bt61R-Qa.d.ts} +0 -0
  206. /package/dist/{camera-blit-capture-BlC-arRb.d.ts → camera-blit-capture-CgNJ9grH.d.ts} +0 -0
  207. /package/dist/{camera-follower-CO_ibF2o.d.ts → camera-follower-OnnXsbHd.d.ts} +0 -0
  208. /package/dist/{capability-checker-BZ3_x1YL.d.ts → capability-checker-DrWimJ_t.d.ts} +0 -0
  209. /package/dist/{capture-failure-tracker-BAUKjtXU.d.ts → capture-failure-tracker-bUXJeMvQ.d.ts} +0 -0
  210. /package/dist/{capture-motion-gate-CPwLekNf.d.ts → capture-motion-gate-C60Qrilh.d.ts} +0 -0
  211. /package/dist/{chromium-camera-access-workaround-BHR4clTE.d.ts → chromium-camera-access-workaround-BRs6gkI4.d.ts} +0 -0
  212. /package/dist/{concurrency-DW0jQo3G.d.ts → concurrency-CMhbkxBk.d.ts} +0 -0
  213. /package/dist/{css3d-renderer-manager-CJjHtCMT.d.ts → css3d-renderer-manager-CE6xN7XM.d.ts} +0 -0
  214. /package/dist/{device-orientation-cache-j-kLP8he.js → device-orientation-cache-BjEaEAmh.js} +0 -0
  215. /package/dist/{failure-tracker-B7fzPfZo.d.ts → failure-tracker-BdaFulDA.d.ts} +0 -0
  216. /package/dist/{file-system-utils-BHI0rXr9.d.ts → file-system-utils-DE3BViuq.d.ts} +0 -0
  217. /package/dist/{format-file-size-Da8rZgfs.d.ts → format-file-size-B2CJdRqD.d.ts} +0 -0
  218. /package/dist/{frame-loop-7GBMBu68.d.ts → frame-loop-CUEIdlhS.d.ts} +0 -0
  219. /package/dist/{frustum-visibility-COPfzruF.d.ts → frustum-visibility-BTx1Sqfo.d.ts} +0 -0
  220. /package/dist/{geo-types-BfDK8kJu.d.ts → geo-types-DGe5UKgx.d.ts} +0 -0
  221. /package/dist/{gps-CnhYrJCa.d.ts → gps-CC0l9lCp.d.ts} +0 -0
  222. /package/dist/{gps-compass-cubes-CT3TWctJ.d.ts → gps-compass-cubes-QQJgpRXR.d.ts} +0 -0
  223. /package/dist/{gps-error-handler-DjVuLXve.d.ts → gps-error-handler-da4DCcs5.d.ts} +0 -0
  224. /package/dist/{h3-proximity-BaAulrnM.d.ts → h3-proximity-CAEk3osq.d.ts} +0 -0
  225. /package/dist/{hit-test-reticle-DhnCMOsc.d.ts → hit-test-reticle-DcOyqo3B.d.ts} +0 -0
  226. /package/dist/{image-capture-C4DwxC10.js → image-capture-Dn8uLIP2.js} +0 -0
  227. /package/dist/{image-quality--HLuyJ2r.d.ts → image-quality-G7_qT4aj.d.ts} +0 -0
  228. /package/dist/{index-CjxbDm8W.d.ts → index-T8Fxvzka.d.ts} +0 -0
  229. /package/dist/{index-Nr3qg4IH.d.ts → index-Y_RNWbQX.d.ts} +0 -0
  230. /package/dist/{leaflet-map-overlay-CTcTVmL1.js → leaflet-map-overlay-DjWfRT8a.js} +0 -0
  231. /package/dist/{lerp-utils-bwMwVCpU.d.ts → lerp-utils-B-ecvLq2.d.ts} +0 -0
  232. /package/dist/{list-formatter-1ttG18MQ.d.ts → list-formatter-C45u3Vgv.d.ts} +0 -0
  233. /package/dist/{logger-B4StJUDb.d.ts → logger-BQGNXi9W.d.ts} +0 -0
  234. /package/dist/{map-data-DkhsYDGM.js → map-data-vL8jb5Z9.js} +0 -0
  235. /package/dist/{opfs-storage-S_odkCk1.d.ts → opfs-storage-CrhVauNL.d.ts} +0 -0
  236. /package/dist/{permission-checker-B-VtjnBA.d.ts → permission-checker-BDrCOwQF.d.ts} +0 -0
  237. /package/dist/{qr-pose-21fRDcFO.d.ts → qr-pose-_dInl6di.d.ts} +0 -0
  238. /package/dist/{scene-node-names-DWzhE7Ro.d.ts → scene-node-names-Ct6ATrfM.d.ts} +0 -0
  239. /package/dist/{session-disposers-B7hUN90w.js → session-disposers-BJM5U62W.js} +0 -0
  240. /package/dist/{three-dispose-C3mnKQR5.d.ts → three-dispose-B5-XiECx.d.ts} +0 -0
  241. /package/dist/{vis-colors-CoSpbZEO.d.ts → vis-colors-16Pht13u.d.ts} +0 -0
  242. /package/dist/{webxr-nue-basis-C3vTqkE2.d.ts → webxr-nue-basis-B8ZEetVb.d.ts} +0 -0
  243. /package/dist/{xr-camera-texture-q0eIDSRg.d.ts → xr-camera-texture-BA4xiaQ4.d.ts} +0 -0
  244. /package/dist/{xr-error-handler-D9y5r8ok.d.ts → xr-error-handler-BeyxXCE_.d.ts} +0 -0
  245. /package/dist/{xr-frame-loop-BiZvgqP7.d.ts → xr-frame-loop-A1mGDFHI.d.ts} +0 -0
  246. /package/dist/{zip-coverage-embed-CyoX7XL7.d.ts → zip-coverage-embed-BC3O2-8b.d.ts} +0 -0
  247. /package/dist/{zip-export-CuBimX1J.d.ts → zip-export-Cfl_kNQ7.d.ts} +0 -0
  248. /package/dist/{zip-reader-BHc_b_iA.d.ts → zip-reader-DwkuvlGo.d.ts} +0 -0
@@ -0,0 +1,88 @@
1
+ import { r as OccupancyGrid } from "../occupancy-grid-DKzIdCSZ.js";
2
+ import { i as SlamAppStore } from "../create-slam-app-store-HNe1PBtx.js";
3
+ import { a as ReplayAction, s as ReplayState } from "../replay-engine-D-cbT0Fw.js";
4
+ import { i as OcclusionMesh } from "../occlusion-mesh-BY2aMej3.js";
5
+ import { t as OccupancyCubesVisualizer } from "../occupancy-cubes-visualizer-soN0Sizd.js";
6
+ import * as THREE from "three";
7
+
8
+ //#region ../src/state/replay-session.d.ts
9
+ /** Occupancy-reconstruction options for a replay session. */
10
+ interface ReplayOccupancyConfig {
11
+ /** Build the occupancy grid + visualizers at all. Default `true`. */
12
+ readonly enabled?: boolean;
13
+ /** Voxel edge length in metres. Default 0.15. */
14
+ readonly cellSizeM?: number;
15
+ /** Minimum observations before a cell is drawn (noise filter). Default 1. */
16
+ readonly minObservations?: number;
17
+ /** Show the instanced debug cubes. Default `true`. */
18
+ readonly showCubes?: boolean;
19
+ /**
20
+ * Build the depth-only occlusion mesh (detailed style). Default `true`. Its
21
+ * visible skin starts `off` (invisible depth-only); a consumer flips it via
22
+ * {@link ReplaySessionController.getOcclusionMesh}`.setDebugStyle(...)`.
23
+ */
24
+ readonly showOcclusionMesh?: boolean;
25
+ /** Minimum delay between two visualizer refreshes (ms). Default 250. */
26
+ readonly refreshIntervalMs?: number;
27
+ }
28
+ interface StartReplaySessionOptions {
29
+ /** The already-loaded recorded action list to replay. */
30
+ readonly actions: ReplayAction[];
31
+ /** DOM element that receives the desktop replay canvas. */
32
+ readonly container: HTMLElement;
33
+ /**
34
+ * Store to replay into. Defaults to a fresh framework store with no
35
+ * persistence (`NullStorageBackend`). Inject one only to add app-specific
36
+ * slices; it MUST carry the framework recording slice.
37
+ */
38
+ readonly store?: SlamAppStore;
39
+ /** Occupancy reconstruction config (see {@link ReplayOccupancyConfig}). */
40
+ readonly occupancy?: ReplayOccupancyConfig;
41
+ /** Called after each action dispatch: (current, total). */
42
+ readonly onProgress?: (current: number, total: number) => void;
43
+ /** Called when all actions have been dispatched. */
44
+ readonly onComplete?: () => void;
45
+ /** Called when a dispatch throws: (actionIndex, error). */
46
+ readonly onError?: (actionIndex: number, error: Error) => void;
47
+ }
48
+ /** Handles to the replay scene graph (for adding consumer content). */
49
+ interface ReplaySceneHandles {
50
+ readonly scene: THREE.Scene;
51
+ readonly arWorldGroup: THREE.Group;
52
+ readonly arpose: THREE.Object3D;
53
+ readonly camera: THREE.PerspectiveCamera;
54
+ readonly renderer: THREE.WebGLRenderer;
55
+ }
56
+ interface ReplaySessionController {
57
+ /** Start dispatching actions at the given speed factor (default 1). */
58
+ play(speedFactor?: number): Promise<void>;
59
+ /** Pause the replay. */
60
+ pause(): void;
61
+ /** Resume from where we paused. */
62
+ resume(): Promise<void>;
63
+ /** Change playback speed (takes effect on the next delay). */
64
+ setSpeed(factor: number): void;
65
+ /** Current engine state. */
66
+ getState(): ReplayState;
67
+ /** The replay store (same instance the subscribers observe). */
68
+ getStore(): SlamAppStore;
69
+ /** The replay scene graph handles. */
70
+ getScene(): ReplaySceneHandles;
71
+ /** The reconstructed occupancy grid, or `null` when occupancy is disabled. */
72
+ getOccupancyGrid(): OccupancyGrid | null;
73
+ /** The cube visualizer, or `null` when disabled/not built (for a live mesh-view toggle). */
74
+ getCubesVisualizer(): OccupancyCubesVisualizer | null;
75
+ /** The occlusion mesh, or `null` when disabled/not built. */
76
+ getOcclusionMesh(): OcclusionMesh | null;
77
+ /** Total number of loaded actions. */
78
+ getActionCount(): number;
79
+ /** Tear down engine, subscribers, visualizers and the scene. */
80
+ dispose(): void;
81
+ }
82
+ /**
83
+ * Compose and start a desktop replay session. Synchronous — the caller drives
84
+ * playback via the returned controller.
85
+ */
86
+ declare function startReplaySession(options: StartReplaySessionOptions): ReplaySessionController;
87
+ //#endregion
88
+ export { ReplayOccupancyConfig, ReplaySceneHandles, ReplaySessionController, StartReplaySessionOptions, startReplaySession };
@@ -0,0 +1,165 @@
1
+ import { createLogger } from "../utils/logger.js";
2
+ import { b as nuePositionToWebXR, x as nueQuaternionToWebXR } from "../webxr-session-BBlgzrqY.js";
3
+ import { OccupancyGrid } from "../ar/occupancy-grid.js";
4
+ import { disposeReplayScene, getAlignmentLerper, initReplayScene, updateOrbitTarget } from "../ar/replay-scene.js";
5
+ import { NullStorageBackend } from "../storage/null-storage-backend.js";
6
+ import { t as createSlamAppStore } from "../create-slam-app-store-wYN7YkB5.js";
7
+ import { ReplayEngine } from "./replay-engine.js";
8
+ import { wireStoreSubscribers } from "./store-subscribers.js";
9
+ import { gpsEventVisualizer } from "../visualization/gps-event-markers.js";
10
+ import { OcclusionMesh } from "../visualization/occlusion-mesh.js";
11
+ import { OccupancyCubesVisualizer } from "../visualization/occupancy-cubes-visualizer.js";
12
+ import { subscribeReplayOccupancy } from "./replay-occupancy-subscriber.js";
13
+ import * as THREE from "three";
14
+ //#region ../src/state/replay-session.ts
15
+ /**
16
+ * Replay session — the framework-level composer that lets ANY consumer app
17
+ * replay a recorded session on the desktop (no phone, no WebXR) with live mesh
18
+ * reconstruction, in a handful of lines.
19
+ *
20
+ * It wires together the pieces that already exist so a consumer does not have to
21
+ * copy the RecorderApp's `replay/replay-mode.ts` orchestrator:
22
+ * - a store (a fresh framework store by default, or one the caller injects),
23
+ * - the non-WebXR desktop scene (`initReplayScene`),
24
+ * - the shared state→visuals bridge (`wireStoreSubscribers`: alignment lerp +
25
+ * GPS event markers + the recorded camera trajectory driving `arpose`),
26
+ * - the occupancy grid → cube visualizer + occlusion mesh path, fed by the
27
+ * replayed `recordDepthSample` stream (`subscribeReplayOccupancy`),
28
+ * - a {@link ReplayEngine} driving the recorded action list.
29
+ *
30
+ * The consumer supplies an already-loaded `RecordedAction[]` (the loader stays a
31
+ * consumer concern — the framework does not migrate old-era recordings). For a
32
+ * current-era zip, `loadActionsFromZip` (storage/zip-reader) turns it into the
33
+ * action list with zero recorder-side code.
34
+ *
35
+ * Recorder-specific visualizers (frame tiles, ref-point spheres/markers, stats
36
+ * overlay) are NOT wired here — the RecorderApp injects those into its own
37
+ * orchestrator. This composer ships only the generally-useful defaults every
38
+ * replay consumer wants.
39
+ *
40
+ * @see replay-session.ts.md for the full API and examples.
41
+ * @see 2026-07-15 replay-as-dev-harness Part A design.
42
+ */
43
+ const log = createLogger("ReplaySession");
44
+ /**
45
+ * Compose and start a desktop replay session. Synchronous — the caller drives
46
+ * playback via the returned controller.
47
+ */
48
+ function startReplaySession(options) {
49
+ const { actions, container } = options;
50
+ const occupancyConfig = options.occupancy ?? {};
51
+ const occupancyEnabled = occupancyConfig.enabled ?? true;
52
+ const store = options.store ?? createSlamAppStore({
53
+ storageBackend: new NullStorageBackend(),
54
+ enableDevChecks: false
55
+ });
56
+ const scene = initReplayScene(container);
57
+ log.info("Replay scene initialized");
58
+ gpsEventVisualizer.setSceneSource({
59
+ getScene: () => scene.scene,
60
+ getArWorldGroup: () => scene.arWorldGroup
61
+ });
62
+ const alignmentLerper = getAlignmentLerper();
63
+ const snapshotPos = new THREE.Vector3();
64
+ const unsubscribeStore = wireStoreSubscribers(store, {
65
+ applyAlignmentMatrix: (matrix) => alignmentLerper?.setTarget(matrix),
66
+ gpsEventVisualizer,
67
+ onNewOdomPose: (odomPosition, odomRotation) => {
68
+ const webxrPos = nuePositionToWebXR(odomPosition);
69
+ scene.arpose.position.fromArray(webxrPos);
70
+ const webxrRot = nueQuaternionToWebXR(odomRotation);
71
+ scene.arpose.quaternion.fromArray(webxrRot);
72
+ },
73
+ onAlignmentSnapshot: (nuePosition) => {
74
+ snapshotPos.fromArray(nuePosition);
75
+ updateOrbitTarget(snapshotPos);
76
+ }
77
+ });
78
+ const occupancy = occupancyEnabled ? setupOccupancyReconstruction(store, scene.arWorldGroup, occupancyConfig) : null;
79
+ const engine = new ReplayEngine();
80
+ if (options.onProgress) engine.onProgress(options.onProgress);
81
+ if (options.onComplete) engine.onComplete(options.onComplete);
82
+ if (options.onError) engine.onError(options.onError);
83
+ let disposed = false;
84
+ return {
85
+ play(speedFactor = 1) {
86
+ if (disposed) return Promise.resolve();
87
+ return engine.play(actions, store, speedFactor);
88
+ },
89
+ pause() {
90
+ engine.pause();
91
+ },
92
+ resume() {
93
+ if (disposed) return Promise.resolve();
94
+ return engine.resume();
95
+ },
96
+ setSpeed(factor) {
97
+ engine.setSpeed(factor);
98
+ },
99
+ getState() {
100
+ return engine.getState();
101
+ },
102
+ getStore() {
103
+ return store;
104
+ },
105
+ getScene() {
106
+ return scene;
107
+ },
108
+ getOccupancyGrid() {
109
+ return occupancy?.grid ?? null;
110
+ },
111
+ getCubesVisualizer() {
112
+ return occupancy?.cubes ?? null;
113
+ },
114
+ getOcclusionMesh() {
115
+ return occupancy?.occlusionMesh ?? null;
116
+ },
117
+ getActionCount() {
118
+ return actions.length;
119
+ },
120
+ dispose() {
121
+ if (disposed) return;
122
+ disposed = true;
123
+ engine.dispose();
124
+ unsubscribeStore();
125
+ occupancy?.dispose();
126
+ gpsEventVisualizer.setSceneSource(null);
127
+ disposeReplayScene();
128
+ log.info("Replay session disposed");
129
+ }
130
+ };
131
+ }
132
+ /**
133
+ * Build the occupancy grid, the (optional) cube visualizer + occlusion mesh, and
134
+ * the depth-sample subscription that refreshes them. Kept out of the main
135
+ * composer so its branches don't inflate that function's complexity.
136
+ */
137
+ function setupOccupancyReconstruction(store, arWorldGroup, config) {
138
+ const cellSizeM = config.cellSizeM ?? .15;
139
+ const minObservations = config.minObservations ?? 1;
140
+ const grid = new OccupancyGrid({ cellSizeM });
141
+ const cubes = config.showCubes ?? true ? new OccupancyCubesVisualizer(arWorldGroup, { minObservations }) : null;
142
+ const occlusionMesh = config.showOcclusionMesh ?? true ? new OcclusionMesh(arWorldGroup) : null;
143
+ const unsubscribe = subscribeReplayOccupancy({
144
+ store,
145
+ grid,
146
+ refreshIntervalMs: config.refreshIntervalMs,
147
+ onRefresh: (viewerPose) => {
148
+ cubes?.refresh(grid, viewerPose);
149
+ occlusionMesh?.update(grid.getOccupiedCells(minObservations), cellSizeM, (cell) => grid.getCellPoint(cell));
150
+ },
151
+ onError: (err) => log.warn("Occupancy refresh failed during replay", err)
152
+ });
153
+ return {
154
+ grid,
155
+ cubes,
156
+ occlusionMesh,
157
+ dispose() {
158
+ unsubscribe();
159
+ cubes?.dispose();
160
+ occlusionMesh?.dispose();
161
+ }
162
+ };
163
+ }
164
+ //#endregion
165
+ export { startReplaySession };
@@ -1,3 +1,3 @@
1
- import { t as SubscribableStore } from "../subscribe-to-selector-j-eOYybQ.js";
2
- import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-CWHToX6N.js";
1
+ import { t as SubscribableStore } from "../subscribe-to-selector-B_lm_euO.js";
2
+ import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-BbRW35u5.js";
3
3
  export { StoreSubscriberDeps, SubscribableStore, wireStoreSubscribers };
@@ -1,6 +1,6 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
2
  import { selectAlignmentMatrix, selectGpsPositions, selectOdometryPositions, selectOdometryRotations, selectZeroReference } from "./app-selectors.js";
3
- import { t as buildMapData } from "../map-data-DkhsYDGM.js";
3
+ import { t as buildMapData } from "../map-data-vL8jb5Z9.js";
4
4
  import { subscribeToSelector } from "./subscribe-to-selector.js";
5
5
  import { mat4, vec3 } from "gl-matrix";
6
6
  import { calcGpsCoords } from "gps-plus-slam-js";
@@ -1,2 +1,2 @@
1
- import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-j-eOYybQ.js";
1
+ import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-B_lm_euO.js";
2
2
  export { SubscribableStore, subscribeToSelector };
@@ -1,2 +1,2 @@
1
- import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, b as computeGpsVsFusedDivergence, c as ConvergenceResult, d as GpsAccuracyResult, f as ResidualConsensusResult, g as TrackingQualityState, h as TrackingQualitySliceState, j as snapshotsTrimmed, k as selectTrackingQuality, l as CoverageResult, m as TrackingQualityReport, p as TrackingQualityOptions, s as AlignmentSnapshot, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-DFm5K9Ob.js";
1
+ import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, b as computeGpsVsFusedDivergence, c as ConvergenceResult, d as GpsAccuracyResult, f as ResidualConsensusResult, g as TrackingQualityState, h as TrackingQualitySliceState, j as snapshotsTrimmed, k as selectTrackingQuality, l as CoverageResult, m as TrackingQualityReport, p as TrackingQualityOptions, s as AlignmentSnapshot, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-HNe1PBtx.js";
2
2
  export { AlignmentSnapshot, ConvergenceResult, CoverageResult, DEFAULT_TRACKING_QUALITY_OPTIONS, GpsAccuracyResult, ResidualConsensusResult, TrackingQualityOptions, TrackingQualityReport, TrackingQualitySliceState, TrackingQualityState, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeResidualConsensus, computeTrackingQualityReport, createTrackingQualityListenerMiddleware, degradedCountUpdated, matrixDelta, reportUpdated, resetTrackingQuality, selectRecentAlignments, selectTrackingQuality, snapshotPushed, snapshotsTrimmed, trackingQualityReducer };
@@ -1,2 +1,2 @@
1
- import { a as TrackingSliceState, c as poseLost, d as selectLastRestartedPayload, f as selectLastSensorOrientation, g as trackingReducer, h as selectTrackingPhase, i as TrackingPhase, l as poseReceived, m as selectLostFrameCount, n as PoseReceivedPayload, o as clearLastRestartedPayload, p as selectLastValidPose, r as ResetTransformData, s as originReset, t as DeviceOrientation, u as resetTracking } from "../tracking-slice-BAbcZK-Y.js";
1
+ import { a as TrackingSliceState, c as poseLost, d as selectLastRestartedPayload, f as selectLastSensorOrientation, g as trackingReducer, h as selectTrackingPhase, i as TrackingPhase, l as poseReceived, m as selectLostFrameCount, n as PoseReceivedPayload, o as clearLastRestartedPayload, p as selectLastValidPose, r as ResetTransformData, s as originReset, t as DeviceOrientation, u as resetTracking } from "../tracking-slice-D5LDL_y4.js";
2
2
  export { DeviceOrientation, PoseReceivedPayload, ResetTransformData, TrackingPhase, TrackingSliceState, clearLastRestartedPayload, originReset, poseLost, poseReceived, resetTracking, selectLastRestartedPayload, selectLastSensorOrientation, selectLastValidPose, selectLostFrameCount, selectTrackingPhase, trackingReducer };
@@ -5,7 +5,7 @@ import "./state/gps-event-coordinator.js";
5
5
  import "./state/app-selectors.js";
6
6
  import { selectTrackingQuality } from "./state/tracking-quality.js";
7
7
  import "./state/persistence-middleware.js";
8
- import "./create-slam-app-store-oK9bnqyI.js";
8
+ import "./create-slam-app-store-wYN7YkB5.js";
9
9
  import "./state/recording-replayer.js";
10
10
  import "./state/store-subscribers.js";
11
11
  import { add2dImage, calcRelativeCoordsInMeters, recordGpsEvent as recordGpsEvent$1, setZeroPos as setZeroPos$1 } from "gps-plus-slam-js";
@@ -1,2 +1,2 @@
1
- import { a as formatTimestamp, i as formatFrameFilename, n as SESSION_IMAGES_DIR, r as formatActionFilename, t as LEGACY_SESSION_IMAGES_DIR } from "../file-system-utils-BHI0rXr9.js";
1
+ import { a as formatTimestamp, i as formatFrameFilename, n as SESSION_IMAGES_DIR, r as formatActionFilename, t as LEGACY_SESSION_IMAGES_DIR } from "../file-system-utils-DE3BViuq.js";
2
2
  export { LEGACY_SESSION_IMAGES_DIR, SESSION_IMAGES_DIR, formatActionFilename, formatFrameFilename, formatTimestamp };
@@ -1,9 +1,9 @@
1
- import { a as getAppRootHandle, c as initOpfsStorage, d as resetSessionHandles, h as writeSessionMetadata, i as createSession, l as listSessions, n as SessionMetadata, o as getSessionHandle, r as checkStorageQuota, s as getSessionsRootHandle, u as resetOpfsStorage } from "../opfs-storage-S_odkCk1.js";
2
- import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-BX7egQKi.js";
3
- import { a as ZipActionEntry, c as loadActionsFromZip, d as loadSessionMetadata, f as loadSessionMetadataFromBlob, i as RecordedAction, l as loadEntriesFromSubdir, n as GpsPathCoord, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, s as ZipSubdirEntry, t as Entry, u as loadGpsPathFromBlob } from "../zip-reader-BHc_b_iA.js";
4
- import { t as NullStorageBackend } from "../null-storage-backend-DXXuwG8T.js";
5
- import { t as OpfsStorageBackend } from "../opfs-storage-backend-D1ZpeNEL.js";
6
- import { a as formatTimestamp, i as formatFrameFilename, r as formatActionFilename } from "../file-system-utils-BHI0rXr9.js";
7
- import { a as downloadZip, c as syncToExternalZip, i as ZipExportResult, n as ZipContributorAddFile, o as exportSessionAsZip, r as ZipExportContributor, s as exportSessionHandleAsZip, t as ExportSessionAsZipOptions } from "../zip-export-CuBimX1J.js";
8
- import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-CyoX7XL7.js";
1
+ import { a as getAppRootHandle, c as initOpfsStorage, d as resetSessionHandles, h as writeSessionMetadata, i as createSession, l as listSessions, n as SessionMetadata, o as getSessionHandle, r as checkStorageQuota, s as getSessionsRootHandle, u as resetOpfsStorage } from "../opfs-storage-CrhVauNL.js";
2
+ import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-DCYbOvTw.js";
3
+ import { a as ZipActionEntry, c as loadActionsFromZip, d as loadSessionMetadata, f as loadSessionMetadataFromBlob, i as RecordedAction, l as loadEntriesFromSubdir, n as GpsPathCoord, p as readZipEntries, r as MAX_ACTION_FILE_SIZE, s as ZipSubdirEntry, t as Entry, u as loadGpsPathFromBlob } from "../zip-reader-DwkuvlGo.js";
4
+ import { t as NullStorageBackend } from "../null-storage-backend-Dtn3TBfT.js";
5
+ import { t as OpfsStorageBackend } from "../opfs-storage-backend-CZ-ECudx.js";
6
+ import { a as formatTimestamp, i as formatFrameFilename, r as formatActionFilename } from "../file-system-utils-DE3BViuq.js";
7
+ import { a as downloadZip, c as syncToExternalZip, i as ZipExportResult, n as ZipContributorAddFile, o as exportSessionAsZip, r as ZipExportContributor, s as exportSessionHandleAsZip, t as ExportSessionAsZipOptions } from "../zip-export-Cfl_kNQ7.js";
8
+ import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-BC3O2-8b.js";
9
9
  export { type CreateSessionResult, type Entry, type ExportSessionAsZipOptions, type GpsPathCoord, MAX_ACTION_FILE_SIZE, NullStorageBackend, OpfsStorageBackend, type RecordedAction, type SessionMetadata, type StorageBackend, type ZipActionEntry, type ZipContributorAddFile, type ZipExportContributor, type ZipExportResult, type ZipSubdirEntry, checkStorageQuota, createSession, downloadZip, embedCoverageInSessionJson, exportSessionAsZip, exportSessionHandleAsZip, formatActionFilename, formatFrameFilename, formatTimestamp, getAppRootHandle, getSessionHandle, getSessionsRootHandle, initOpfsStorage, listSessions, loadActionsFromZip, loadEntriesFromSubdir, loadGpsPathFromBlob, loadSessionMetadataFromBlob, loadSessionMetadata as loadSessionMetadataFromZip, readZipEntries, resetOpfsStorage, resetSessionHandles, syncToExternalZip, writeSessionMetadata };
@@ -1,2 +1,2 @@
1
- import { t as NullStorageBackend } from "../null-storage-backend-DXXuwG8T.js";
1
+ import { t as NullStorageBackend } from "../null-storage-backend-Dtn3TBfT.js";
2
2
  export { NullStorageBackend };
@@ -1,2 +1,2 @@
1
- import { t as OpfsStorageBackend } from "../opfs-storage-backend-D1ZpeNEL.js";
1
+ import { t as OpfsStorageBackend } from "../opfs-storage-backend-CZ-ECudx.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-S_odkCk1.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-CrhVauNL.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-BX7egQKi.js";
1
+ import { n as StorageBackend, t as CreateSessionResult } from "../storage-backend-DCYbOvTw.js";
2
2
  export { CreateSessionResult, StorageBackend };
@@ -1,2 +1,2 @@
1
- import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-CyoX7XL7.js";
1
+ import { t as embedCoverageInSessionJson } from "../zip-coverage-embed-BC3O2-8b.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-CuBimX1J.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-Cfl_kNQ7.js";
2
2
  export { ExportSessionAsZipOptions, ZipContributorAddFile, ZipExportContributor, ZipExportResult, downloadZip, exportSessionAsZip, exportSessionHandleAsZip, syncToExternalZip };
@@ -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-BHc_b_iA.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-DwkuvlGo.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-S_odkCk1.js";
1
+ import { n as SessionMetadata } from "./opfs-storage-CrhVauNL.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-D8cCqpOM.js";
2
- import { t as SubscribableStore } from "./subscribe-to-selector-j-eOYybQ.js";
1
+ import { t as MapData } from "./map-data-BQXPtRz7.js";
2
+ import { t as SubscribableStore } from "./subscribe-to-selector-B_lm_euO.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-DFm5K9Ob.js";
1
+ import { N as CombinedRootState } from "./create-slam-app-store-HNe1PBtx.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-D6PYS4bc.js";
1
+ import { o as WebXRQuaternion, s as WebXRVec3 } from "../ar-types-BprL3nKv.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-BHc_b_iA.js";
1
+ import { i as RecordedAction } from "../zip-reader-DwkuvlGo.js";
2
2
  import { LatLong } from "gps-plus-slam-js";
3
3
 
4
4
  //#region ../src/test-utils/zip-round-trip-helpers.d.ts
@@ -0,0 +1,53 @@
1
+ import * as THREE from "three";
2
+
3
+ //#region ../src/visualization/text-sprite.d.ts
4
+ interface TextSpriteOptions {
5
+ /** Initial label text. Defaults to ''. */
6
+ text?: string;
7
+ /** Canvas backing-store width in px. Defaults to 64. */
8
+ canvasWidth?: number;
9
+ /** Canvas backing-store height in px. Defaults to 64. */
10
+ canvasHeight?: number;
11
+ /** CSS font shorthand used for the label. Defaults to 'bold 48px sans-serif'. */
12
+ font?: string;
13
+ /** Fill style for the text. Defaults to '#ffffff'. */
14
+ textColor?: string;
15
+ /**
16
+ * Background painted behind the text on every redraw.
17
+ * 'none' keeps the canvas transparent; 'pill' draws a rounded
18
+ * semi-transparent black capsule for contrast against AR video.
19
+ */
20
+ background?: 'none' | 'pill';
21
+ /** SpriteMaterial.depthWrite. Defaults to the three.js material default. */
22
+ depthWrite?: boolean;
23
+ /** SpriteMaterial.transparent. Defaults to the three.js material default. */
24
+ transparent?: boolean;
25
+ /** Use LinearFilter for min/mag (crisper animated text). Defaults to false. */
26
+ linearFilters?: boolean;
27
+ /** Sprite.renderOrder. Defaults to 0. */
28
+ renderOrder?: number;
29
+ /** Initial sprite scale. Defaults to the three.js sprite default (1,1,1). */
30
+ scale?: {
31
+ x: number;
32
+ y: number;
33
+ z: number;
34
+ };
35
+ }
36
+ interface TextSprite {
37
+ /** The renderable sprite — attach it to the scene graph yourself. */
38
+ readonly sprite: THREE.Sprite;
39
+ /** Redraw the label. No-op (no redraw, no texture upload) when unchanged. */
40
+ setText(text: string): void;
41
+ /** Dispose the sprite material and its canvas texture. */
42
+ dispose(): void;
43
+ }
44
+ /**
45
+ * Create a text sprite backed by an off-screen canvas texture.
46
+ *
47
+ * Tolerates a null 2D context (headless test environments without a canvas
48
+ * backend): the sprite is still created and setText()/dispose() stay safe;
49
+ * only the pixels are skipped.
50
+ */
51
+ declare function createTextSprite(options?: TextSpriteOptions): TextSprite;
52
+ //#endregion
53
+ export { TextSpriteOptions as n, createTextSprite as r, TextSprite as t };
@@ -1,4 +1,4 @@
1
- import { t as ARPose } from "./ar-types-D6PYS4bc.js";
1
+ import { t as ARPose } from "./ar-types-BprL3nKv.js";
2
2
  import { OdometryTrackingRestartedPayload, Quaternion, Vector3 } from "gps-plus-slam-js";
3
3
  import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
4
4
  import * as _$redux from "redux";
@@ -1,2 +1,2 @@
1
- import { a as RgbTuple, c as extractOdomPosition, i as DepthSample, l as extractOdomRotation, n as ArPoseTuples, o as WebXRQuaternion, r as DepthPoint, s as WebXRVec3, t as ARPose } from "../ar-types-D6PYS4bc.js";
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-BprL3nKv.js";
2
2
  export { ARPose, ArPoseTuples, DepthPoint, DepthSample, RgbTuple, WebXRQuaternion, WebXRVec3, extractOdomPosition, extractOdomRotation };
@@ -1,2 +1,2 @@
1
- import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-BfDK8kJu.js";
1
+ import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-DGe5UKgx.js";
2
2
  export { GpsCoord, RawGpsSample, RefPointMarker };
@@ -1,3 +1,3 @@
1
- import { a as RgbTuple, c as extractOdomPosition, i as DepthSample, l as extractOdomRotation, n as ArPoseTuples, o as WebXRQuaternion, r as DepthPoint, s as WebXRVec3, t as ARPose } from "../ar-types-D6PYS4bc.js";
2
- import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-BfDK8kJu.js";
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-BprL3nKv.js";
2
+ import { n as RawGpsSample, r as RefPointMarker, t as GpsCoord } from "../geo-types-DGe5UKgx.js";
3
3
  export { ARPose, ArPoseTuples, DepthPoint, DepthSample, GpsCoord, RawGpsSample, RefPointMarker, RgbTuple, WebXRQuaternion, WebXRVec3, extractOdomPosition, extractOdomRotation };
@@ -1,2 +1,2 @@
1
- import { n as mapWithConcurrencyLimit, t as forEachWithConcurrencyLimit } from "../concurrency-DW0jQo3G.js";
1
+ import { n as mapWithConcurrencyLimit, t as forEachWithConcurrencyLimit } from "../concurrency-CMhbkxBk.js";
2
2
  export { forEachWithConcurrencyLimit, mapWithConcurrencyLimit };
@@ -1,2 +1,2 @@
1
- import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-B7fzPfZo.js";
1
+ import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-BdaFulDA.js";
2
2
  export { FailureTracker, FailureTrackerConfig, createFailureTracker };
@@ -1,2 +1,2 @@
1
- import { t as formatFileSize } from "../format-file-size-Da8rZgfs.js";
1
+ import { t as formatFileSize } from "../format-file-size-B2CJdRqD.js";
2
2
  export { formatFileSize };
@@ -1,2 +1,2 @@
1
- import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-DOKzVMiO.js";
1
+ import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-CBAttcVm.js";
2
2
  export { FusedPathInput, computeFusedPath, fusedGpsFromOdom };
@@ -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-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";
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-BQGNXi9W.js";
2
+ import { n as computeFusedPath, r as fusedGpsFromOdom, t as FusedPathInput } from "../fused-path-CBAttcVm.js";
3
+ import { n as FailureTrackerConfig, r as createFailureTracker, t as FailureTracker } from "../failure-tracker-BdaFulDA.js";
4
+ import { n as mapWithConcurrencyLimit } from "../concurrency-CMhbkxBk.js";
5
+ import { t as geodesicAngleRad } from "../index-Y_RNWbQX.js";
6
+ import { t as formatFileSize } from "../format-file-size-B2CJdRqD.js";
7
+ import { t as listFormatter } from "../list-formatter-C45u3Vgv.js";
8
8
  export { FailureTracker, FailureTrackerConfig, FusedPathInput, LogEntry, LogLevel, Logger, clearLogBuffer, computeFusedPath, createFailureTracker, createLogger, formatFileSize, fusedGpsFromOdom, geodesicAngleRad, getGlobalLogLevel, getLogBuffer, listFormatter, mapWithConcurrencyLimit, setGlobalLogLevel, subscribeToLogs };
@@ -1,2 +1,2 @@
1
- import { t as listFormatter } from "../list-formatter-1ttG18MQ.js";
1
+ import { t as listFormatter } from "../list-formatter-C45u3Vgv.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-B4StJUDb.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-BQGNXi9W.js";
2
2
  export { LogEntry, LogLevel, Logger, clearLogBuffer, createLogger, getGlobalLogLevel, getLogBuffer, setGlobalLogLevel, subscribeToLogs };
@@ -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-BHz7yVIL.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-CFnKGfsD.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-DAHicRON.js";
1
+ import { n as createAlignmentLerper, t as AlignmentLerper } from "../alignment-lerper-CK1TYLIL.js";
2
2
  export { AlignmentLerper, createAlignmentLerper };
@@ -1,2 +1,2 @@
1
- import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-BdS_h8Nf.js";
1
+ import { n as ArWorldGroupAlignmentOptions, r as enableArWorldGroupAlignment, t as ArWorldGroupAlignmentHandle } from "../ar-world-group-alignment-CvvfACfx.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-B7hUN90w.js";
2
+ import { t as registerSessionDisposer } from "../session-disposers-BJM5U62W.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-CO_ibF2o.js";
1
+ import { n as createCameraFollower, t as CameraFollower } from "../camera-follower-OnnXsbHd.js";
2
2
  export { CameraFollower, createCameraFollower };
@@ -1,2 +1,2 @@
1
- import { n as createCss3dRendererManager, t as Css3dRendererManager } from "../css3d-renderer-manager-CJjHtCMT.js";
1
+ import { n as createCss3dRendererManager, t as Css3dRendererManager } from "../css3d-renderer-manager-CE6xN7XM.js";
2
2
  export { Css3dRendererManager, createCss3dRendererManager };
@@ -1,2 +1,2 @@
1
- import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-CH7E2Iv_.js";
1
+ import { n as worldNueToGps, t as nueToArLocal } from "../frame-conversions-CzPQDYpM.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-COPfzruF.js";
1
+ import { i as isSphereInCameraFrustum, n as isObjectInCameraFrustum, r as isPointInCameraFrustum, t as buildCameraFrustum } from "../frustum-visibility-BTx1Sqfo.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-BaqyRsPC.js";
1
+ import { a as GpsAnchorSamplePoint, i as GpsAnchorPhase, n as GpsAnchorMode, o as createGpsAnchor, r as GpsAnchorOptions, t as GpsAnchor } from "../gps-anchor-Gv4NDwH4.js";
2
2
  export { GpsAnchor, GpsAnchorMode, GpsAnchorOptions, GpsAnchorPhase, GpsAnchorSamplePoint, createGpsAnchor };
@@ -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-CT3TWctJ.js";
1
+ import { i as createGpsCompassCubes, n as COMPASS_CUBE_SIZE, r as GpsCompassCubes, t as COMPASS_CUBE_DISTANCE } from "../gps-compass-cubes-QQJgpRXR.js";
2
2
  export { COMPASS_CUBE_DISTANCE, COMPASS_CUBE_SIZE, GpsCompassCubes, createGpsCompassCubes };