gps-plus-slam-app-framework 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +14 -14
  2. package/dist/{absolute-orientation-C_IxDR_j.d.ts → absolute-orientation-Dj1One3y.d.ts} +1 -1
  3. package/dist/{accuracy-circles-BE7tbvYV.d.ts → accuracy-circles-BHz7yVIL.d.ts} +1 -1
  4. package/dist/{app-selectors-CV7ggGoo.d.ts → app-selectors-DG0ZqaeI.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/capability-checker.d.ts +1 -1
  8. package/dist/ar/capture-motion-gate.d.ts +2 -0
  9. package/dist/{capture-motion-gate-D1eyGC_o.js → ar/capture-motion-gate.js} +25 -2
  10. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  11. package/dist/ar/chromium-camera-access-workaround.js +1 -1
  12. package/dist/ar/depth-grid-lookup.d.ts +1 -1
  13. package/dist/ar/depth-occluder.d.ts +1 -1
  14. package/dist/ar/depth-occluder.js +1 -1
  15. package/dist/ar/depth-sampler.d.ts +2 -2
  16. package/dist/ar/depth-unprojection.d.ts +1 -1
  17. package/dist/ar/enable-gps-ar.d.ts +1 -1
  18. package/dist/ar/enable-gps-ar.js +2 -2
  19. package/dist/ar/frame-loop.d.ts +1 -1
  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 +2 -2
  23. package/dist/ar/image-quality.js +136 -4
  24. package/dist/ar/index.d.ts +28 -26
  25. package/dist/ar/index.js +15 -14
  26. package/dist/ar/occlusion-mesh-worker.d.ts +1 -1
  27. package/dist/ar/occupancy-grid.d.ts +1 -1
  28. package/dist/ar/occupancy-grid.js +1 -1
  29. package/dist/ar/occupancy-mesher.d.ts +1 -1
  30. package/dist/ar/occupancy-mesher.js +1 -1
  31. package/dist/ar/qr/index.d.ts +11 -0
  32. package/dist/ar/qr/index.js +11 -0
  33. package/dist/ar/{planar-pnp.d.ts → qr/planar-pnp.d.ts} +1 -1
  34. package/dist/ar/{planar-pnp.js → qr/planar-pnp.js} +1 -1
  35. package/dist/ar/qr/qr-debug-view.d.ts +2 -0
  36. package/dist/ar/{qr-debug-view.js → qr/qr-debug-view.js} +2 -2
  37. package/dist/ar/{qr-derived-pose.d.ts → qr/qr-derived-pose.d.ts} +1 -1
  38. package/dist/ar/{qr-derived-pose.js → qr/qr-derived-pose.js} +2 -2
  39. package/dist/ar/{qr-detection-controller.d.ts → qr/qr-detection-controller.d.ts} +1 -1
  40. package/dist/ar/qr/qr-detection-controller.js +2 -0
  41. package/dist/ar/{qr-frontend.d.ts → qr/qr-frontend.d.ts} +1 -1
  42. package/dist/ar/{qr-frontend.js → qr/qr-frontend.js} +1 -1
  43. package/dist/ar/{qr-pose.d.ts → qr/qr-pose.d.ts} +1 -1
  44. package/dist/ar/{qr-pose.js → qr/qr-pose.js} +1 -1
  45. package/dist/ar/qr/qr-size-depth-context.d.ts +3 -0
  46. package/dist/ar/{qr-size-depth-context.js → qr/qr-size-depth-context.js} +4 -4
  47. package/dist/ar/{qr-size-measurer.d.ts → qr/qr-size-measurer.d.ts} +1 -1
  48. package/dist/ar/qr/qr-size-measurer.js +2 -0
  49. package/dist/ar/replay-scene.d.ts +1 -1
  50. package/dist/ar/replay-scene.js +15 -13
  51. package/dist/ar/webxr-session.d.ts +4 -4
  52. package/dist/ar/webxr-session.js +2 -2
  53. package/dist/ar/xr-camera-texture.d.ts +1 -1
  54. package/dist/ar/xr-frame-loop.d.ts +1 -1
  55. package/dist/ar/xr-frame-loop.js +1 -1
  56. package/dist/ar-crash-isolation-DlXCGzMf.d.ts +52 -0
  57. package/dist/{ar-world-group-alignment-B6XiA1cT.d.ts → ar-world-group-alignment-BdS_h8Nf.d.ts} +2 -2
  58. package/dist/{capability-checker-DEo-ktWI.d.ts → capability-checker-BZ3_x1YL.d.ts} +1 -1
  59. package/dist/capture-motion-gate-CPwLekNf.d.ts +120 -0
  60. package/dist/{chromium-camera-access-workaround-DCd8SP2N.d.ts → chromium-camera-access-workaround-BHR4clTE.d.ts} +1 -1
  61. package/dist/{create-slam-app-store-CH31erpP.d.ts → create-slam-app-store-DFm5K9Ob.d.ts} +13 -4
  62. package/dist/{create-slam-app-store-DLv5ZwqU.js → create-slam-app-store-oK9bnqyI.js} +8 -6
  63. package/dist/{depth-grid-lookup-DY6zYTLx.d.ts → depth-grid-lookup-CCuzlqUo.d.ts} +1 -1
  64. package/dist/{depth-sampler-txG8evgQ.d.ts → depth-sampler-CS2jAFw4.d.ts} +2 -2
  65. package/dist/{depth-unprojection-JKkeqJrV.d.ts → depth-unprojection-ET3Gwedf.d.ts} +1 -1
  66. package/dist/{enable-gps-ar-BbNWyqp5.d.ts → enable-gps-ar-D_xEHzh5.d.ts} +10 -5
  67. package/dist/{file-system-utils-CfLTj5Ra.d.ts → file-system-utils-BHI0rXr9.d.ts} +1 -1
  68. package/dist/geo/h3-proximity.d.ts +1 -1
  69. package/dist/geo/h3-proximity.js +1 -1
  70. package/dist/geo/index.d.ts +1 -1
  71. package/dist/{geodesic-angle-HXBWiXiI.js → geodesic-angle-CZ_Ow90I.js} +2 -2
  72. package/dist/{gps-ar-pose-sampler-BOOV0jJk.d.ts → gps-ar-pose-sampler-BuuUuK-D.d.ts} +1 -1
  73. package/dist/{gps-event-coordinator-03rVh_us.d.ts → gps-event-coordinator-Cruoe5I-.d.ts} +4 -4
  74. package/dist/{gps-event-markers-BsC2Ynlh.d.ts → gps-event-markers-y2b2aVl6.d.ts} +35 -1
  75. package/dist/{h3-proximity-pFluGfwL.d.ts → h3-proximity-BaAulrnM.d.ts} +1 -1
  76. package/dist/{image-capture-Cr_rljeV.d.ts → image-capture-BevgKpoO.d.ts} +6 -6
  77. package/dist/{image-capture-BUqqsOi3.js → image-capture-C4DwxC10.js} +3 -3
  78. package/dist/{image-quality-BjBLoTec.d.ts → image-quality--HLuyJ2r.d.ts} +44 -2
  79. package/dist/{index-C2Bo0buN.d.ts → index-BWVwd9Zw.d.ts} +9 -71
  80. package/dist/{index-CuHaGY0F.d.ts → index-ClmnNJ6-.d.ts} +1 -1
  81. package/dist/index-Dxb6ATNK.d.ts +64 -0
  82. package/dist/index.d.ts +55 -55
  83. package/dist/index.js +23 -23
  84. package/dist/{leaflet-map-overlay-BRkUhZMD.js → leaflet-map-overlay-CTcTVmL1.js} +1 -1
  85. package/dist/{leaflet-map-overlay-QhF199BW.d.ts → leaflet-map-overlay-CksetpTt.d.ts} +1 -1
  86. package/dist/{map-data-D8sSxpOr.d.ts → map-data-D8cCqpOM.d.ts} +2 -2
  87. package/dist/{map-data-D3oE8AQP.js → map-data-DkhsYDGM.js} +1 -1
  88. package/dist/{map-overlay-draw-1E61FLKs.d.ts → map-overlay-draw-Cy-klqoA.d.ts} +1 -1
  89. package/dist/{median-Bla_W50f.js → median-DDBrZGP0.js} +2 -2
  90. package/dist/{occlusion-mesh-CZ4i_SW2.d.ts → occlusion-mesh-BWe2PrVi.d.ts} +22 -3
  91. package/dist/{occupancy-grid-f0I07UxI.d.ts → occupancy-grid-CYBdmMOo.d.ts} +2 -2
  92. package/dist/{persistence-middleware-CI4Cetnl.d.ts → persistence-middleware-Cun4aF5M.d.ts} +12 -2
  93. package/dist/{planar-pnp-CPLhg5MX.d.ts → planar-pnp-ByxwDEyM.d.ts} +2 -2
  94. package/dist/{ar-D-03Kso-.js → qr-CTp5xI83.js} +11 -25
  95. package/dist/{qr-debug-view-BmbWo06j.d.ts → qr-debug-view-CGlITU09.d.ts} +2 -2
  96. package/dist/{qr-derived-pose-DEYT85ul.d.ts → qr-derived-pose-DZPxZd9C.d.ts} +3 -3
  97. package/dist/{qr-detected-slice-CPEkGbxh.d.ts → qr-detected-slice-mfyxD2-M.d.ts} +9 -8
  98. package/dist/{qr-detection-controller-IcMRpTjV.d.ts → qr-detection-controller-C5NII-vs.d.ts} +4 -4
  99. package/dist/{qr-detection-controller-bRTJXC6G.js → qr-detection-controller-DXc1yHRf.js} +3 -3
  100. package/dist/{qr-frontend-61SKPSyU.d.ts → qr-frontend-QzKZSqB-.d.ts} +2 -2
  101. package/dist/{qr-pose-CCTF1PP0.d.ts → qr-pose-21fRDcFO.d.ts} +1 -1
  102. package/dist/{qr-pose-aggregation-H-O_Jjz9.js → qr-pose-aggregation-Cp0Mtg_j.js} +4 -4
  103. package/dist/{qr-pose-aggregation-BL6gfl0s.d.ts → qr-pose-aggregation-mABSN0AW.d.ts} +2 -2
  104. package/dist/{qr-size-depth-context-DJsYqbqY.d.ts → qr-size-depth-context-CMDv6T29.d.ts} +3 -3
  105. package/dist/{qr-size-measurer-Bl_i-umk.d.ts → qr-size-measurer-rVFf4AdM.d.ts} +5 -5
  106. package/dist/{qr-size-measurer-BVOIg-He.js → qr-size-measurer-zZB9S1va.js} +4 -4
  107. package/dist/{recording-replayer-DyIN13nG.d.ts → recording-replayer-qT2EM1Qs.d.ts} +1 -1
  108. package/dist/{recording-slice-DziOl7P5.d.ts → recording-slice-DXw5-UvO.d.ts} +10 -5
  109. package/dist/{replay-engine-DAymjsd1.d.ts → replay-engine-B1H_kLhK.d.ts} +1 -1
  110. package/dist/{replay-scene-CZdWgcpc.d.ts → replay-scene-BJeO36YT.d.ts} +12 -5
  111. package/dist/sensors/absolute-orientation.d.ts +1 -1
  112. package/dist/sensors/absolute-orientation.js +1 -1
  113. package/dist/sensors/gps.d.ts +1 -1
  114. package/dist/sensors/index.d.ts +3 -3
  115. package/dist/sensors/permission-checker.d.ts +1 -1
  116. package/dist/{session-disposers-BZS-hi8u.js → session-disposers-B7hUN90w.js} +1 -1
  117. package/dist/state/app-selectors.d.ts +1 -1
  118. package/dist/state/combined-root-state.d.ts +1 -1
  119. package/dist/state/create-slam-app-store.d.ts +1 -1
  120. package/dist/state/create-slam-app-store.js +1 -1
  121. package/dist/state/gps-ar-pose-sampler.d.ts +2 -2
  122. package/dist/state/gps-event-coordinator.d.ts +2 -2
  123. package/dist/state/gps-event-coordinator.js +1 -1
  124. package/dist/state/index.d.ts +17 -18
  125. package/dist/state/index.js +4 -5
  126. package/dist/state/persistence-middleware.d.ts +2 -2
  127. package/dist/state/persistence-middleware.js +24 -15
  128. package/dist/state/qr-detected-slice.d.ts +3 -3
  129. package/dist/state/qr-detected-slice.js +8 -8
  130. package/dist/state/recording-replayer.d.ts +2 -2
  131. package/dist/state/recording-replayer.js +1 -1
  132. package/dist/state/recording-slice.d.ts +1 -1
  133. package/dist/state/replay-engine.d.ts +1 -1
  134. package/dist/state/store-subscribers.d.ts +2 -2
  135. package/dist/state/store-subscribers.js +1 -1
  136. package/dist/state/subscribe-to-selector.d.ts +1 -1
  137. package/dist/state/tracking-quality.d.ts +1 -1
  138. package/dist/state/tracking-quality.js +2 -2
  139. package/dist/state/tracking-slice.d.ts +1 -1
  140. package/dist/{state-U45ioVyB.js → state-CDF5LvsO.js} +1 -2
  141. package/dist/storage/file-system-utils.d.ts +1 -1
  142. package/dist/storage/file-system-utils.js +1 -1
  143. package/dist/storage/index.d.ts +2 -2
  144. package/dist/storage/zip-coverage-embed.d.ts +1 -1
  145. package/dist/storage/zip-coverage-embed.js +1 -1
  146. package/dist/{store-subscribers-DtwakLrQ.d.ts → store-subscribers-CWHToX6N.d.ts} +2 -2
  147. package/dist/{subscribe-to-selector-Cgo9JTfS.d.ts → subscribe-to-selector-j-eOYybQ.d.ts} +1 -1
  148. package/dist/test-utils/browser-mocks.d.ts +1 -1
  149. package/dist/{tracking-slice-Bt2OEQhA.d.ts → tracking-slice-BAbcZK-Y.d.ts} +3 -2
  150. package/dist/types/ar-types.d.ts +1 -1
  151. package/dist/types/index.d.ts +1 -1
  152. package/dist/utils/index.js +1 -1
  153. package/dist/visualization/accuracy-circles.d.ts +1 -1
  154. package/dist/visualization/accuracy-circles.js +1 -1
  155. package/dist/visualization/alignment-lerper.d.ts +1 -1
  156. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  157. package/dist/visualization/ar-world-group-alignment.js +2 -2
  158. package/dist/visualization/camera-follower.d.ts +1 -1
  159. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  160. package/dist/visualization/gps-anchor.js +2 -2
  161. package/dist/visualization/gps-event-markers.d.ts +2 -2
  162. package/dist/visualization/gps-event-markers.js +27 -6
  163. package/dist/visualization/index.d.ts +13 -14
  164. package/dist/visualization/index.js +4 -5
  165. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  166. package/dist/visualization/leaflet-map-overlay.js +1 -1
  167. package/dist/visualization/map-data.d.ts +1 -1
  168. package/dist/visualization/map-data.js +1 -1
  169. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  170. package/dist/visualization/occluder-mesh-driver.d.ts +1 -1
  171. package/dist/visualization/occluder-mesh-driver.js +1 -1
  172. package/dist/visualization/occlusion-mesh.d.ts +2 -2
  173. package/dist/visualization/occlusion-mesh.js +28 -3
  174. package/dist/visualization/three-dispose.d.ts +1 -1
  175. package/dist/visualization/vis-colors.d.ts +1 -1
  176. package/dist/{webxr-session-CGFZ429B.d.ts → webxr-session-DefwObIu.d.ts} +144 -194
  177. package/dist/{webxr-session-DWKUsCN9.js → webxr-session-OyR3YbTq.js} +151 -281
  178. package/dist/{xr-frame-loop-25gM4B0K.d.ts → xr-frame-loop-BiZvgqP7.d.ts} +1 -1
  179. package/dist/{zip-coverage-embed-BrodRLq0.d.ts → zip-coverage-embed-CyoX7XL7.d.ts} +1 -1
  180. package/package.json +4 -2
  181. package/dist/ar/qr-debug-view.d.ts +0 -2
  182. package/dist/ar/qr-detection-controller.js +0 -2
  183. package/dist/ar/qr-size-depth-context.d.ts +0 -3
  184. package/dist/ar/qr-size-measurer.js +0 -2
  185. package/dist/capture-motion-gate-BmjiWUJv.d.ts +0 -24
  186. package/dist/map-overlay-0yJOcEVO.d.ts +0 -153
  187. package/dist/recording-options-Cai9D14V.d.ts +0 -700
  188. package/dist/state/recording-options.d.ts +0 -2
  189. package/dist/state/recording-options.js +0 -620
  190. package/dist/visualization/map-overlay.d.ts +0 -2
  191. package/dist/visualization/map-overlay.js +0 -241
  192. /package/dist/{alignment-lerper-B4COh_0p.d.ts → alignment-lerper-DAHicRON.d.ts} +0 -0
  193. /package/dist/{ar-types-CBafnxhE.d.ts → ar-types-D6PYS4bc.d.ts} +0 -0
  194. /package/dist/{camera-follower-B6zA3dy9.d.ts → camera-follower-CO_ibF2o.d.ts} +0 -0
  195. /package/dist/{css3d-renderer-manager-DbrSY7Mh.d.ts → css3d-renderer-manager-CJjHtCMT.d.ts} +0 -0
  196. /package/dist/{device-orientation-cache-BjEaEAmh.js → device-orientation-cache-j-kLP8he.js} +0 -0
  197. /package/dist/{frame-loop-7HigCj7m.d.ts → frame-loop-7GBMBu68.d.ts} +0 -0
  198. /package/dist/{gps-CX5b9g3s.d.ts → gps-CnhYrJCa.d.ts} +0 -0
  199. /package/dist/{occupancy-mesher-BqnRd10x.d.ts → occupancy-mesher-B4Bv4BTk.d.ts} +0 -0
  200. /package/dist/{permission-checker-D1C5zvo-.d.ts → permission-checker-B-VtjnBA.d.ts} +0 -0
  201. /package/dist/{three-dispose-C9mdpSRX.d.ts → three-dispose-C3mnKQR5.d.ts} +0 -0
  202. /package/dist/{vis-colors-DjStl_tD.d.ts → vis-colors-CoSpbZEO.d.ts} +0 -0
  203. /package/dist/{xr-camera-texture-C6Z4d7RR.d.ts → xr-camera-texture-q0eIDSRg.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
 
@@ -341,7 +341,6 @@ H3-based proximity matching for GPS-anchored points (renamed from `ref-points/`
341
341
  | Export | Description |
342
342
  | ------------------------------ | ------------------------------------------------------ |
343
343
  | `LeafletMapOverlay` | 2D Leaflet map integrated via CSS3D into a 3D scene. |
344
- | `MapOverlay` | Tile-based 3D map overlay (no Leaflet dependency). |
345
344
  | `GpsEventVisualizer` | Three.js spheres for GPS event positions. |
346
345
  | `createAlignmentLerper()` | Smooth alignment matrix interpolation. |
347
346
  | `createCameraFollower()` | Camera that tracks a moving target. |
@@ -392,6 +391,7 @@ pnpm run build # build with tsdown
392
391
  ```
393
392
  src/
394
393
  ├── ar/ # WebXR session, capture, replay scene
394
+ │ └── qr/ # QR detection, pose (planar PnP), size-from-depth, GPS vote
395
395
  ├── sensors/ # GPS, orientation, permissions
396
396
  ├── state/ # createSlamAppStore, recording, replay, persistence middleware
397
397
  ├── 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-DFm5K9Ob.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-DlXCGzMf.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 { 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-BZ3_x1YL.js";
2
2
  export { CapabilityMessageOptions, CapabilitySupport, capabilityMessage, isFullySupported };
@@ -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-CPwLekNf.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-BHR4clTE.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-CCuzlqUo.js";
2
2
  export { DepthGridLookup, createDepthGridLookup };
@@ -1,4 +1,4 @@
1
- import { t as DepthInfo } from "../depth-sampler-txG8evgQ.js";
1
+ import { t as DepthInfo } from "../depth-sampler-CS2jAFw4.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";
1
+ import { i as DepthSample } from "../ar-types-D6PYS4bc.js";
2
+ import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-CS2jAFw4.js";
3
3
  export { DepthInfo, DepthSample, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, 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-ET3Gwedf.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-D_xEHzh5.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-OyR3YbTq.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
@@ -78,7 +78,7 @@ function createEnableGpsArController(deps = {}) {
78
78
  try {
79
79
  const permissionError = await requestPermissions(config);
80
80
  if (permissionError !== null) return fail(permissionError);
81
- await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest });
81
+ await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest }, config.callbacks);
82
82
  sessionStarted = true;
83
83
  if (config.onGpsPosition) {
84
84
  resolved.startGpsWatch(config.onGpsPosition);
@@ -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-7GBMBu68.js";
2
2
  export { FrameUpdate, clearFrameUpdates, registerFrameUpdate, runFrameUpdates };
@@ -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-BevgKpoO.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-C4DwxC10.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--HLuyJ2r.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 };
@@ -1,4 +1,4 @@
1
- import { n as lowerMedian } from "../median-Bla_W50f.js";
1
+ import { n as lowerMedian } from "../median-DDBrZGP0.js";
2
2
  //#region ../src/ar/image-quality.ts
3
3
  /**
4
4
  * Image-quality metrics + the drop/retry verdict policy for the image-content
@@ -22,10 +22,13 @@ import { n as lowerMedian } from "../median-Bla_W50f.js";
22
22
  * black/empty frame; an absolute cutoff is safe because "black is black"
23
23
  * regardless of scene texture (§5).
24
24
  *
25
- * @see GpsPlusSlamJs_Docs/docs/2026-06-24-image-quality-gate-plan.md
25
+ * @see GpsPlusSlamJs_Docs/docs/2026-06-24-1057-image-quality-gate-plan.md
26
26
  * @see ./capture-motion-gate.ts — the motion gate this builds on (same shape:
27
27
  * a shared config type + a small stateful window + a pure decision).
28
28
  */
29
+ /** All valid {@link BlurMetricId} values, the default (VoL) first — for
30
+ * consumer-side validation of persisted configs. */
31
+ const BLUR_METRIC_IDS = ["variance-of-laplacian", "high-frequency-energy-ratio"];
29
32
  /**
30
33
  * Default image-quality configuration. **Disabled by default** (plan §10): the
31
34
  * relative blur threshold is unvalidated, and a mis-tuned gate silently dropping
@@ -39,7 +42,8 @@ const DEFAULT_QUALITY_FILTER = {
39
42
  enabled: false,
40
43
  blurRelativeThreshold: .5,
41
44
  minMeanLuminance: 10,
42
- maxWaitMs: 4e3
45
+ maxWaitMs: 4e3,
46
+ blurMetric: "variance-of-laplacian"
43
47
  };
44
48
  /** Default number of recent (non-black) sharpness scores the gate keeps. */
45
49
  const DEFAULT_SHARPNESS_HISTORY_SIZE = 15;
@@ -120,6 +124,134 @@ function meanLuminance(rgba) {
120
124
  return sum / pixels;
121
125
  }
122
126
  /**
127
+ * Frequency-domain focus measure: the fraction of non-DC spectral energy at
128
+ * normalized radial frequency ≥ `cutoff` (default 0.3), computed by FFT over
129
+ * the centered largest power-of-two crop (needs ≥ 8×8, else returns 0).
130
+ * In [0, 1]; higher ⇒ sharper. Unlike {@link sharpnessScore} it is invariant
131
+ * to brightness shift AND contrast scale (it is a ratio). Ported from the
132
+ * investigation benchmark (2026-07-12 toggle plan) where it won the
133
+ * "sharp vs degraded" boundary (AUC 0.838 vs 0.750).
134
+ *
135
+ * Defensive contract identical to {@link sharpnessScore}: non-integer or
136
+ * < 3×3 dims, or a buffer shorter than `width·height`, return 0.
137
+ */
138
+ function highFrequencyEnergyRatio(gray, width, height, cutoff = .3) {
139
+ if (!hasFftCrop(gray, width, height)) return 0;
140
+ const pw = largestPow2AtMost(width);
141
+ const ph = largestPow2AtMost(height);
142
+ const offX = Math.floor((width - pw) / 2);
143
+ const offY = Math.floor((height - ph) / 2);
144
+ const re = new Float64Array(pw * ph);
145
+ const im = new Float64Array(pw * ph);
146
+ for (let y = 0; y < ph; y++) {
147
+ const srcRow = (y + offY) * width + offX;
148
+ for (let x = 0; x < pw; x++) re[y * pw + x] = gray[srcRow + x];
149
+ }
150
+ fft2dInPlace(re, im, pw, ph);
151
+ return highEnergyFraction(re, im, pw, ph, cutoff);
152
+ }
153
+ /** Same input guard as sharpnessScore, plus the FFT's ≥ 8×8 pow2-crop need. */
154
+ function hasFftCrop(gray, width, height) {
155
+ return Number.isInteger(width) && Number.isInteger(height) && width >= 8 && height >= 8 && gray.length >= width * height && largestPow2AtMost(width) >= 8 && largestPow2AtMost(height) >= 8;
156
+ }
157
+ /** Largest power of two ≤ n (n ≥ 1). */
158
+ function largestPow2AtMost(n) {
159
+ let p = 1;
160
+ while (p * 2 <= n) p *= 2;
161
+ return p;
162
+ }
163
+ /**
164
+ * In-place iterative radix-2 FFT (decimation-in-time). `re`/`im` length must
165
+ * be a power of two (guaranteed by the caller's crop).
166
+ */
167
+ function fftInPlace(re, im) {
168
+ const n = re.length;
169
+ for (let i = 1, j = 0; i < n; i++) {
170
+ let bit = n >> 1;
171
+ for (; j & bit; bit >>= 1) j ^= bit;
172
+ j ^= bit;
173
+ if (i < j) {
174
+ const tr = re[i];
175
+ re[i] = re[j];
176
+ re[j] = tr;
177
+ const ti = im[i];
178
+ im[i] = im[j];
179
+ im[j] = ti;
180
+ }
181
+ }
182
+ for (let len = 2; len <= n; len <<= 1) {
183
+ const ang = -2 * Math.PI / len;
184
+ const wRe = Math.cos(ang);
185
+ const wIm = Math.sin(ang);
186
+ for (let start = 0; start < n; start += len) {
187
+ let curRe = 1;
188
+ let curIm = 0;
189
+ for (let k = 0; k < len / 2; k++) {
190
+ const a = start + k;
191
+ const b = a + len / 2;
192
+ const vRe = re[b] * curRe - im[b] * curIm;
193
+ const vIm = re[b] * curIm + im[b] * curRe;
194
+ re[b] = re[a] - vRe;
195
+ im[b] = im[a] - vIm;
196
+ re[a] = re[a] + vRe;
197
+ im[a] = im[a] + vIm;
198
+ const nextRe = curRe * wRe - curIm * wIm;
199
+ curIm = curRe * wIm + curIm * wRe;
200
+ curRe = nextRe;
201
+ }
202
+ }
203
+ }
204
+ }
205
+ /** 2D FFT over a pw×ph buffer: rows in place, then columns via scratch. */
206
+ function fft2dInPlace(re, im, pw, ph) {
207
+ for (let y = 0; y < ph; y++) fftInPlace(re.subarray(y * pw, (y + 1) * pw), im.subarray(y * pw, (y + 1) * pw));
208
+ const colRe = new Float64Array(ph);
209
+ const colIm = new Float64Array(ph);
210
+ for (let x = 0; x < pw; x++) {
211
+ for (let y = 0; y < ph; y++) {
212
+ colRe[y] = re[y * pw + x];
213
+ colIm[y] = im[y * pw + x];
214
+ }
215
+ fftInPlace(colRe, colIm);
216
+ for (let y = 0; y < ph; y++) {
217
+ re[y * pw + x] = colRe[y];
218
+ im[y * pw + x] = colIm[y];
219
+ }
220
+ }
221
+ }
222
+ /**
223
+ * Fraction of non-DC spectral energy at normalized radial frequency ≥
224
+ * `cutoff` (radius normalized so the diagonal Nyquist bin is exactly 1).
225
+ * The DC bin carries brightness, not sharpness — excluded, which is what
226
+ * makes the ratio exposure-invariant.
227
+ */
228
+ function highEnergyFraction(re, im, pw, ph, cutoff) {
229
+ let total = 0;
230
+ let high = 0;
231
+ for (let ky = 0; ky < ph; ky++) {
232
+ const ny = (ky <= ph / 2 ? ky : ky - ph) / (ph / 2);
233
+ for (let kx = 0; kx < pw; kx++) {
234
+ if (kx === 0 && ky === 0) continue;
235
+ const nx = (kx <= pw / 2 ? kx : kx - pw) / (pw / 2);
236
+ const i = ky * pw + kx;
237
+ const energy = re[i] * re[i] + im[i] * im[i];
238
+ total += energy;
239
+ if (Math.hypot(nx, ny) / Math.SQRT2 >= cutoff) high += energy;
240
+ }
241
+ }
242
+ return total > 0 ? high / total : 0;
243
+ }
244
+ /**
245
+ * Resolve a {@link BlurMetricId} to its scoring function. `undefined` or an
246
+ * unknown id (e.g. from a persisted config written by a newer/older app
247
+ * version) resolves to {@link sharpnessScore} — the pre-toggle behavior.
248
+ * The (untestable) recorder worker calls this so the mapping stays here,
249
+ * where tests can pin it.
250
+ */
251
+ function blurMetricScorer(metric) {
252
+ return metric === "high-frequency-energy-ratio" ? highFrequencyEnergyRatio : sharpnessScore;
253
+ }
254
+ /**
123
255
  * The self-calibrating blur+blackness verdict, with the rolling sharpness
124
256
  * history that makes the blur check scene-relative (§5). Stateful but pure (no
125
257
  * DOM/worker): one instance per recording session, fed each analysed frame's
@@ -185,4 +317,4 @@ var ImageQualityGate = class {
185
317
  }
186
318
  };
187
319
  //#endregion
188
- export { DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, meanLuminance, rgbaToGrayscale, sharpnessScore };
320
+ export { BLUR_METRIC_IDS, DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, blurMetricScorer, highFrequencyEnergyRatio, meanLuminance, rgbaToGrayscale, sharpnessScore };
@@ -1,32 +1,34 @@
1
+ import { n as DEFAULT_AR_CRASH_ISOLATION, r as validateArCrashIsolationOptions, t as ArCrashIsolationOptions } from "../ar-crash-isolation-DlXCGzMf.js";
1
2
  import { r as bresenham3d, t as GridCell } from "../bresenham3d-D-t9i_b5.js";
2
3
  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";
3
- import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-DEo-ktWI.js";
4
+ import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-BZ3_x1YL.js";
4
5
  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";
5
- 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";
6
- import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-DY6zYTLx.js";
7
- import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-txG8evgQ.js";
8
- import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-JKkeqJrV.js";
9
- 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";
10
- 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";
11
- import { _ as solveQrPose, a as QrPoseSolution, c as SolveQrPoseInput, d as intrinsicsFromProjection, f as invertPose, g as signedQuadArea, h as reprojectionErrorPx, i as Pose, l as buildObjectPoints, m as qrInCameraFromOpenCv, n as OpenCvPnpResult, o as QuadValidation, p as projectViewPoint, r as Point2, s as SolvePnpSquare, t as CameraIntrinsics, u as composePose, v as transformPoint, y as validateQuad } from "../qr-pose-CCTF1PP0.js";
12
- import { a as QrFrontEnd, c as createBarcodeDetectorFrontEnd, i as QrDetection, n as BarcodeDetectorLike, o as RgbaImage, r as DetectedBarcodeLike, s as ToImageBitmapSource, t as BarcodeDetectorFrontEnd } from "../qr-frontend-61SKPSyU.js";
13
- import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-C6Z4d7RR.js";
14
- import { $ as stopImageCapture, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, b as getCurrentArPose, f as endARSession, g as getArWorldGroup, i as CameraFrameCaptureConfig, o as SessionEndInfo, s as SessionFeatureOptions, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "../webxr-session-CGFZ429B.js";
15
- 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";
16
- import { r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-7HigCj7m.js";
17
- import { c as QrSizeAccumulatorOptions, d as QrSizeStatus, f as createQrSizeAccumulator, i as QrSizeMeasurer, l as QrSizeEstimate, n as QrSizeDepthContext, o as createQrSizeMeasurer, p as estimateQrSizeFromDepth, r as QrSizeMeasurement, s as QrSizeAccumulator, t as ImageSize, u as QrSizeObservation } from "../qr-size-measurer-Bl_i-umk.js";
18
- import { t as createQrSizeDepthContext } from "../qr-size-depth-context-DJsYqbqY.js";
19
- import { a as createIncrementalQrPlacement, c as deriveSolvedQrPose, i as RawQrObservation, l as solveQrPoseFromObservation, n as DerivedQrPlacement, o as deriveQrPlacement, r as IncrementalQrPlacement, s as deriveQrSizeM, t as DeriveQrPoseDeps } from "../qr-derived-pose-DEYT85ul.js";
20
- import { n as createQrDebugView, t as QrDebugView } from "../qr-debug-view-BmbWo06j.js";
21
- import { a as createQrDetectionController, i as RawObservationSink, n as QrDetectionControllerDeps, r as QrScanStatus, t as QrDetectionController } from "../qr-detection-controller-IcMRpTjV.js";
22
- import { a as QrPoseStability, c as aggregateQrPose, i as DEFAULT_ROTATION_INLIER_ANGLE_DEG, l as averageRotation, n as AverageRotationOptions, o as QrPoseStabilityOptions, r as AverageRotationResult, s as QrPoseStabilityStatus, t as AggregateQrPoseResult, u as evaluateQrPoseStability } from "../qr-pose-aggregation-BL6gfl0s.js";
23
- import { A as buildQrGpsVotes, C as QrLevel, D as Enu, E as parseQrLevel, M as offsetGeo, O as QrGeoPose, S as FetchQrLevelOptions, T as fetchQrLevel, _ as QrTrackingController, a as checkQrPlausibility, b as createQrTrackingController, c as QrDetectionScheduler, d as createQrDetectionScheduler, f as CameraFrameSource, g as QrSolvePoseInput, h as QrDetectionEvent, i as QrPlausibilityVerdict, j as localPlaneToEnu, k as QrGpsVoteInput, l as QrDetectionSchedulerConfig, m as CameraFrameSourceConfig, n as QrPlausibility, o as DetectionScheduler, p as CameraFrameSourceCallbacks, r as QrPlausibilityOptions, s as DetectionSchedulerConfig, t as OccupancySurface, u as createDetectionScheduler, v as QrTrackingControllerConfig, w as QrLevelValidationError, x as FetchLike, y as QrTrackingStatus } from "../index-C2Bo0buN.js";
24
- import { a as homographyFromCorrespondences, c as rotationToRodrigues, i as PoseCandidate, l as solveLinear, n as Mat3, o as ippePoseCandidates, r as PlanarPnpSquare, s as nearestRotation3x3, t as Homography } from "../planar-pnp-CPLhg5MX.js";
25
- import { n as OccupancyGridOptions, t as OccupancyGrid } from "../occupancy-grid-f0I07UxI.js";
26
- import { a as meshOccupiedCells, i as OccupancyMeshResult, r as MeshOccupiedCellsOptions, t as Aabb } from "../occupancy-mesher-BqnRd10x.js";
27
- import { i as registerXrFrameUpdate, n as XrFrameUpdate, t as XrFrameContext } from "../xr-frame-loop-25gM4B0K.js";
28
- import { a as getCameraFollower, c as getReplayState, d as updateOrbitTarget, i as getAlignmentLerper, l as initReplayScene, n as ReplaySceneState, o as getCameraMode, r as disposeReplayScene, t as CameraMode, u as toggleCameraMode } from "../replay-scene-CZdWgcpc.js";
6
+ 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-BHR4clTE.js";
7
+ import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-CCuzlqUo.js";
8
+ import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-CS2jAFw4.js";
9
+ import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-ET3Gwedf.js";
10
+ 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--HLuyJ2r.js";
11
+ 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-BevgKpoO.js";
12
+ import { _ as solveQrPose, a as QrPoseSolution, c as SolveQrPoseInput, d as intrinsicsFromProjection, f as invertPose, g as signedQuadArea, h as reprojectionErrorPx, i as Pose, l as buildObjectPoints, m as qrInCameraFromOpenCv, n as OpenCvPnpResult, o as QuadValidation, p as projectViewPoint, r as Point2, s as SolvePnpSquare, t as CameraIntrinsics, u as composePose, v as transformPoint, y as validateQuad } from "../qr-pose-21fRDcFO.js";
13
+ import { a as QrFrontEnd, c as createBarcodeDetectorFrontEnd, i as QrDetection, n as BarcodeDetectorLike, o as RgbaImage, r as DetectedBarcodeLike, s as ToImageBitmapSource, t as BarcodeDetectorFrontEnd } from "../qr-frontend-QzKZSqB-.js";
14
+ import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-q0eIDSRg.js";
15
+ import { A as startCameraFrameCapture, D as rebindTrackingStore, F as stopImageCapture, M as startImageCapture, N as stopCameraFrameCapture, P as stopDepthCapture, S as initAR, _ as getDepthInfoFromFrame, a as SessionFeatureOptions, b as getScene, g as getCurrentArPose, h as getCameraFrameCount, i as SessionEndInfo, j as startDepthCapture, m as getCamera, n as CameraFrameCaptureConfig, p as getArWorldGroup, t as ArSessionCallbacks, u as endARSession, v as getDepthSampleCount, y as getImageCaptureFrameCount } from "../webxr-session-DefwObIu.js";
16
+ 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-D_xEHzh5.js";
17
+ import { r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-7GBMBu68.js";
18
+ import { c as QrSizeAccumulatorOptions, d as QrSizeStatus, f as createQrSizeAccumulator, i as QrSizeMeasurer, l as QrSizeEstimate, n as QrSizeDepthContext, o as createQrSizeMeasurer, p as estimateQrSizeFromDepth, r as QrSizeMeasurement, s as QrSizeAccumulator, t as ImageSize, u as QrSizeObservation } from "../qr-size-measurer-rVFf4AdM.js";
19
+ import { t as createQrSizeDepthContext } from "../qr-size-depth-context-CMDv6T29.js";
20
+ import { a as createIncrementalQrPlacement, c as deriveSolvedQrPose, i as RawQrObservation, l as solveQrPoseFromObservation, n as DerivedQrPlacement, o as deriveQrPlacement, r as IncrementalQrPlacement, s as deriveQrSizeM, t as DeriveQrPoseDeps } from "../qr-derived-pose-DZPxZd9C.js";
21
+ import { n as createQrDebugView, t as QrDebugView } from "../qr-debug-view-CGlITU09.js";
22
+ import { a as createQrDetectionController, i as RawObservationSink, n as QrDetectionControllerDeps, r as QrScanStatus, t as QrDetectionController } from "../qr-detection-controller-C5NII-vs.js";
23
+ import { a as QrPoseStability, c as aggregateQrPose, i as DEFAULT_ROTATION_INLIER_ANGLE_DEG, l as averageRotation, n as AverageRotationOptions, o as QrPoseStabilityOptions, r as AverageRotationResult, s as QrPoseStabilityStatus, t as AggregateQrPoseResult, u as evaluateQrPoseStability } from "../qr-pose-aggregation-mABSN0AW.js";
24
+ import { C as parseQrLevel, D as buildQrGpsVotes, E as QrGpsVoteInput, O as localPlaneToEnu, S as fetchQrLevel, T as QrGeoPose, _ as createQrTrackingController, a as checkQrPlausibility, b as QrLevel, c as QrDetectionScheduler, d as createQrDetectionScheduler, f as QrDetectionEvent, g as QrTrackingStatus, h as QrTrackingControllerConfig, i as QrPlausibilityVerdict, k as offsetGeo, l as QrDetectionSchedulerConfig, m as QrTrackingController, n as QrPlausibility, o as DetectionScheduler, p as QrSolvePoseInput, r as QrPlausibilityOptions, s as DetectionSchedulerConfig, t as OccupancySurface, u as createDetectionScheduler, v as FetchLike, w as Enu, x as QrLevelValidationError, y as FetchQrLevelOptions } from "../index-BWVwd9Zw.js";
25
+ import { a as homographyFromCorrespondences, c as rotationToRodrigues, i as PoseCandidate, l as solveLinear, n as Mat3, o as ippePoseCandidates, r as PlanarPnpSquare, s as nearestRotation3x3, t as Homography } from "../planar-pnp-ByxwDEyM.js";
26
+ import { n as CameraFrameSourceCallbacks, r as CameraFrameSourceConfig, t as CameraFrameSource } from "../index-Dxb6ATNK.js";
27
+ import { n as OccupancyGridOptions, t as OccupancyGrid } from "../occupancy-grid-CYBdmMOo.js";
28
+ import { a as meshOccupiedCells, i as OccupancyMeshResult, r as MeshOccupiedCellsOptions, t as Aabb } from "../occupancy-mesher-B4Bv4BTk.js";
29
+ import { i as registerXrFrameUpdate, n as XrFrameUpdate, t as XrFrameContext } from "../xr-frame-loop-BiZvgqP7.js";
30
+ import { a as getCameraFollower, c as getReplayState, d as updateOrbitTarget, i as getAlignmentLerper, l as initReplayScene, n as ReplaySceneState, o as getCameraMode, r as disposeReplayScene, t as CameraMode, u as toggleCameraMode } from "../replay-scene-BJeO36YT.js";
29
31
  import { t as SCENE_NODE } from "../scene-node-names-DWzhE7Ro.js";
30
32
  import { t as WEBXR_TO_NUE } from "../webxr-nue-basis-C3vTqkE2.js";
31
33
  import { n as XR_ERROR_MESSAGE_UNKNOWN, r as getXrErrorMessage, t as XR_ERROR_MESSAGES } from "../xr-error-handler-D9y5r8ok.js";
32
- export { Aabb, AggregateQrPoseResult, AverageRotationOptions, AverageRotationResult, BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, BarcodeDetectorFrontEnd, BarcodeDetectorLike, CAPTURE_FAILURE_WARNING, CameraBlitCapture, CameraBlitCaptureConfig, CameraFrameCaptureConfig, CameraFrameSource, CameraFrameSourceCallbacks, CameraFrameSourceConfig, CameraIntrinsics, CameraMode, CameraTextureResult, CapabilityMessageOptions, CapabilitySupport, CaptureFailureTracker, CaptureFailureTrackerConfig, CapturedFrame, CapturedImage, ChromeVersion, ChromiumProjectionLayerWorkaroundResult, DEFAULT_BLIT_CONFIG, DEFAULT_CAPTURE_CONFIG, DEFAULT_CAPTURE_TRACKER_CONFIG, DEFAULT_QUALITY_FILTER, DEFAULT_ROTATION_INLIER_ANGLE_DEG, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, DepthGridLookup, DepthInfo, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, DepthUnprojector, DeriveQrPoseDeps, DerivedQrPlacement, DetectedBarcodeLike, DetectionScheduler, DetectionSchedulerConfig, EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, Enu, FetchLike, FetchQrLevelOptions, FrameQualityVerdict, FrameUpdate, GridCell, Homography, ImageCaptureCallbacks, ImageCaptureConfig, ImageCaptureManager, ImageQualityGate, ImageSize, IncrementalQrPlacement, MIN_VALID_IMAGE_BYTES, Mat3, MeshOccupiedCellsOptions, OccupancyGrid, OccupancyGridOptions, OccupancyMeshResult, OccupancySurface, OpenCvPnpResult, PlanarPnpSquare, Point2, Pose, PoseCandidate, QrDebugView, QrDetection, QrDetectionController, QrDetectionControllerDeps, QrDetectionEvent, QrDetectionScheduler, QrDetectionSchedulerConfig, QrFrontEnd, QrGeoPose, QrGpsVoteInput, QrLevel, QrLevelValidationError, QrPlausibility, QrPlausibilityOptions, QrPlausibilityVerdict, QrPoseSolution, QrPoseStability, QrPoseStabilityOptions, QrPoseStabilityStatus, QrScanStatus, QrSizeAccumulator, QrSizeAccumulatorOptions, QrSizeDepthContext, QrSizeEstimate, QrSizeMeasurement, QrSizeMeasurer, QrSizeObservation, QrSizeStatus, QrSolvePoseInput, QrTrackingController, QrTrackingControllerConfig, QrTrackingStatus, QuadValidation, QualityFilterConfig, QualityRejectReason, QualityVerdict, RawObservationSink, RawQrObservation, RendererLike, ReplaySceneState, RgbaImage, SCENE_NODE, SessionEndInfo, SessionFeatureOptions, SolvePnpSquare, SolveQrPoseInput, ToImageBitmapSource, WEBXR_TO_NUE, XRCameraLike, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, XrFrameContext, XrFrameUpdate, acquireCameraTexture, aggregateQrPose, applyChromiumProjectionLayerWorkaround, averageRotation, bresenham3d, buildObjectPoints, buildQrGpsVotes, capabilityMessage, checkQrPlausibility, composePose, computeAspectFitSize, computeCaptureSize, createBarcodeDetectorFrontEnd, createCaptureFailureTracker, createDepthGridLookup, createDepthUnprojector, createDetectionScheduler, createEnableGpsArController, createIncrementalQrPlacement, createQrDebugView, createQrDetectionController, createQrDetectionScheduler, createQrSizeAccumulator, createQrSizeDepthContext, createQrSizeMeasurer, createQrTrackingController, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, disposeReplayScene, endARSession, estimateQrSizeFromDepth, evaluateQrPoseStability, fetchQrLevel, getAlignmentLerper, getArWorldGroup, getCamera, getCameraFollower, getCameraFrameCount, getCameraMode, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getReplayState, getScene, getXrErrorMessage, homographyFromCorrespondences, initAR, initReplayScene, intrinsicsFromProjection, invertPose, ippePoseCandidates, isFullySupported, localPlaneToEnu, meanLuminance, meshOccupiedCells, nearestRotation3x3, needsBaseLayerPersistence, offsetGeo, parseChromeVersion, parseQrLevel, projectViewPoint, qrInCameraFromOpenCv, registerFrameUpdate, registerXrFrameUpdate, reprojectionErrorPx, rgbaToGrayscale, rotationToRodrigues, setCameraFrameCallback, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setImageQualityAnalyzer, setSessionEndCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingStore, sharpnessScore, signedQuadArea, solveLinear, solveQrPose, solveQrPoseFromObservation, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture, toggleCameraMode, transformPoint, unprojectDepthPoint, updateOrbitTarget, validateQuad, wrapXRDepthInfo };
34
+ export { Aabb, AggregateQrPoseResult, ArCrashIsolationOptions, ArSessionCallbacks, AverageRotationOptions, AverageRotationResult, BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, BLUR_METRIC_IDS, BarcodeDetectorFrontEnd, BarcodeDetectorLike, BlurMetricId, CAPTURE_FAILURE_WARNING, CameraBlitCapture, CameraBlitCaptureConfig, CameraFrameCaptureConfig, CameraFrameSource, CameraFrameSourceCallbacks, CameraFrameSourceConfig, CameraIntrinsics, CameraMode, CameraTextureResult, CapabilityMessageOptions, CapabilitySupport, CaptureFailureTracker, CaptureFailureTrackerConfig, CapturedFrame, CapturedImage, ChromeVersion, ChromiumProjectionLayerWorkaroundResult, DEFAULT_AR_CRASH_ISOLATION, DEFAULT_BLIT_CONFIG, DEFAULT_CAPTURE_CONFIG, DEFAULT_CAPTURE_TRACKER_CONFIG, DEFAULT_QUALITY_FILTER, DEFAULT_ROTATION_INLIER_ANGLE_DEG, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, DepthGridLookup, DepthInfo, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, DepthUnprojector, DeriveQrPoseDeps, DerivedQrPlacement, DetectedBarcodeLike, DetectionScheduler, DetectionSchedulerConfig, EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, Enu, FetchLike, FetchQrLevelOptions, FrameQualityVerdict, FrameUpdate, GridCell, Homography, ImageCaptureCallbacks, ImageCaptureConfig, ImageCaptureManager, ImageQualityGate, ImageSize, IncrementalQrPlacement, MIN_VALID_IMAGE_BYTES, Mat3, MeshOccupiedCellsOptions, OccupancyGrid, OccupancyGridOptions, OccupancyMeshResult, OccupancySurface, OpenCvPnpResult, PlanarPnpSquare, Point2, Pose, PoseCandidate, QrDebugView, QrDetection, QrDetectionController, QrDetectionControllerDeps, QrDetectionEvent, QrDetectionScheduler, QrDetectionSchedulerConfig, QrFrontEnd, QrGeoPose, QrGpsVoteInput, QrLevel, QrLevelValidationError, QrPlausibility, QrPlausibilityOptions, QrPlausibilityVerdict, QrPoseSolution, QrPoseStability, QrPoseStabilityOptions, QrPoseStabilityStatus, QrScanStatus, QrSizeAccumulator, QrSizeAccumulatorOptions, QrSizeDepthContext, QrSizeEstimate, QrSizeMeasurement, QrSizeMeasurer, QrSizeObservation, QrSizeStatus, QrSolvePoseInput, QrTrackingController, QrTrackingControllerConfig, QrTrackingStatus, QuadValidation, QualityFilterConfig, QualityRejectReason, QualityVerdict, RawObservationSink, RawQrObservation, RendererLike, ReplaySceneState, RgbaImage, SCENE_NODE, SessionEndInfo, SessionFeatureOptions, SolvePnpSquare, SolveQrPoseInput, ToImageBitmapSource, WEBXR_TO_NUE, XRCameraLike, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, XrFrameContext, XrFrameUpdate, acquireCameraTexture, aggregateQrPose, applyChromiumProjectionLayerWorkaround, averageRotation, blurMetricScorer, bresenham3d, buildObjectPoints, buildQrGpsVotes, capabilityMessage, checkQrPlausibility, composePose, computeAspectFitSize, computeCaptureSize, createBarcodeDetectorFrontEnd, createCaptureFailureTracker, createDepthGridLookup, createDepthUnprojector, createDetectionScheduler, createEnableGpsArController, createIncrementalQrPlacement, createQrDebugView, createQrDetectionController, createQrDetectionScheduler, createQrSizeAccumulator, createQrSizeDepthContext, createQrSizeMeasurer, createQrTrackingController, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, disposeReplayScene, endARSession, estimateQrSizeFromDepth, evaluateQrPoseStability, fetchQrLevel, getAlignmentLerper, getArWorldGroup, getCamera, getCameraFollower, getCameraFrameCount, getCameraMode, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getReplayState, getScene, getXrErrorMessage, highFrequencyEnergyRatio, homographyFromCorrespondences, initAR, initReplayScene, intrinsicsFromProjection, invertPose, ippePoseCandidates, isFullySupported, localPlaneToEnu, meanLuminance, meshOccupiedCells, nearestRotation3x3, needsBaseLayerPersistence, offsetGeo, parseChromeVersion, parseQrLevel, projectViewPoint, qrInCameraFromOpenCv, rebindTrackingStore, registerFrameUpdate, registerXrFrameUpdate, reprojectionErrorPx, rgbaToGrayscale, rotationToRodrigues, sharpnessScore, signedQuadArea, solveLinear, solveQrPose, solveQrPoseFromObservation, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture, toggleCameraMode, transformPoint, unprojectDepthPoint, updateOrbitTarget, validateArCrashIsolationOptions, validateQuad, wrapXRDepthInfo };