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/dist/ar/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_AR_CRASH_ISOLATION, validateArCrashIsolationOptions } from "./ar-crash-isolation.js";
1
2
  import { CameraBlitCapture, DEFAULT_BLIT_CONFIG, computeAspectFitSize, computeCaptureSize } from "./camera-blit-capture.js";
2
3
  import { capabilityMessage, isFullySupported } from "./capability-checker.js";
3
4
  import { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, applyChromiumProjectionLayerWorkaround, needsBaseLayerPersistence, parseChromeVersion } from "./chromium-camera-access-workaround.js";
@@ -5,28 +6,28 @@ import { CAPTURE_FAILURE_WARNING, DEFAULT_CAPTURE_TRACKER_CONFIG, createCaptureF
5
6
  import { DepthSampler, wrapXRDepthInfo } from "./depth-sampler.js";
6
7
  import { createDepthUnprojector, unprojectDepthPoint } from "./depth-unprojection.js";
7
8
  import { createDepthGridLookup } from "./depth-grid-lookup.js";
8
- import { n as createQrSizeAccumulator, r as estimateQrSizeFromDepth, t as createQrSizeMeasurer } from "../qr-size-measurer-BVOIg-He.js";
9
- import { createQrSizeDepthContext } from "./qr-size-depth-context.js";
10
- import { buildObjectPoints, composePose, intrinsicsFromProjection, invertPose, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, signedQuadArea, solveQrPose, transformPoint, validateQuad } from "./qr-pose.js";
11
- import { createIncrementalQrPlacement, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, solveQrPoseFromObservation } from "./qr-derived-pose.js";
9
+ import { n as createQrSizeAccumulator, r as estimateQrSizeFromDepth, t as createQrSizeMeasurer } from "../qr-size-measurer-zZB9S1va.js";
10
+ import { createQrSizeDepthContext } from "./qr/qr-size-depth-context.js";
11
+ import { buildObjectPoints, composePose, intrinsicsFromProjection, invertPose, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, signedQuadArea, solveQrPose, transformPoint, validateQuad } from "./qr/qr-pose.js";
12
+ import { createIncrementalQrPlacement, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, solveQrPoseFromObservation } from "./qr/qr-derived-pose.js";
12
13
  import { WEBXR_TO_NUE } from "./webxr-nue-basis.js";
13
- import { createQrDebugView } from "./qr-debug-view.js";
14
- import { n as createDetectionScheduler, r as createQrDetectionScheduler, t as createQrDetectionController } from "../qr-detection-controller-bRTJXC6G.js";
15
- import { i as evaluateQrPoseStability, n as aggregateQrPose, r as averageRotation, t as DEFAULT_ROTATION_INLIER_ANGLE_DEG } from "../qr-pose-aggregation-H-O_Jjz9.js";
16
- import { a as offsetGeo, c as parseQrLevel, i as localPlaneToEnu, n as createQrTrackingController, o as QrLevelValidationError, r as buildQrGpsVotes, s as fetchQrLevel, t as checkQrPlausibility } from "../ar-D-03Kso-.js";
17
- import { BarcodeDetectorFrontEnd, createBarcodeDetectorFrontEnd } from "./qr-frontend.js";
18
- import { B as setTrackingLostCallback, C as initAR, F as setImageCaptureCallback, G as startDepthCapture, H as setTrackingStore, I as setImageQualityAnalyzer, J as stopDepthCapture, K as startImageCapture, M as setCameraFrameCallback, N as setDepthCaptureCallback, P as setFrameCallback, R as setSessionEndCallback, W as startCameraFrameCapture, X as CameraFrameSource, Y as stopImageCapture, _ as getDepthInfoFromFrame, b as getLiveCss3dManager, c as endARSession, f as getArWorldGroup, g as getCurrentArPose, h as getCameraFrameCount, p as getCamera, q as stopCameraFrameCapture, v as getDepthSampleCount, x as getScene, y as getImageCaptureFrameCount, z as setTrackingCallbacks } from "../webxr-session-DWKUsCN9.js";
19
- import { PlanarPnpSquare, homographyFromCorrespondences, ippePoseCandidates, nearestRotation3x3, rotationToRodrigues, solveLinear } from "./planar-pnp.js";
14
+ import { createQrDebugView } from "./qr/qr-debug-view.js";
15
+ import { n as createDetectionScheduler, r as createQrDetectionScheduler, t as createQrDetectionController } from "../qr-detection-controller-DXc1yHRf.js";
16
+ import { i as evaluateQrPoseStability, n as aggregateQrPose, r as averageRotation, t as DEFAULT_ROTATION_INLIER_ANGLE_DEG } from "../qr-pose-aggregation-Cp0Mtg_j.js";
17
+ import { a as offsetGeo, c as parseQrLevel, i as localPlaneToEnu, n as createQrTrackingController, o as QrLevelValidationError, r as buildQrGpsVotes, s as fetchQrLevel, t as checkQrPlausibility } from "../qr-CTp5xI83.js";
18
+ import { BarcodeDetectorFrontEnd, createBarcodeDetectorFrontEnd } from "./qr/qr-frontend.js";
19
+ import { PlanarPnpSquare, homographyFromCorrespondences, ippePoseCandidates, nearestRotation3x3, rotationToRodrigues, solveLinear } from "./qr/planar-pnp.js";
20
+ import { A as stopImageCapture, D as startImageCapture, E as startDepthCapture, O as stopCameraFrameCapture, S as rebindTrackingStore, T as startCameraFrameCapture, _ as initAR, a as endARSession, c as getArWorldGroup, d as getCurrentArPose, f as getDepthInfoFromFrame, h as getScene, j as CameraFrameSource, k as stopDepthCapture, l as getCamera, m as getImageCaptureFrameCount, p as getDepthSampleCount, u as getCameraFrameCount } from "../webxr-session-OyR3YbTq.js";
20
21
  import { bresenham3d } from "./bresenham3d.js";
21
22
  import { OccupancyGrid } from "./occupancy-grid.js";
22
23
  import { meshOccupiedCells } from "./occupancy-mesher.js";
23
24
  import { registerFrameUpdate } from "./frame-loop.js";
24
25
  import { registerXrFrameUpdate } from "./xr-frame-loop.js";
25
- import { n as ImageCaptureManager, r as MIN_VALID_IMAGE_BYTES, t as DEFAULT_CAPTURE_CONFIG } from "../image-capture-BUqqsOi3.js";
26
- import { DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, meanLuminance, rgbaToGrayscale, sharpnessScore } from "./image-quality.js";
26
+ import { n as ImageCaptureManager, r as MIN_VALID_IMAGE_BYTES, t as DEFAULT_CAPTURE_CONFIG } from "../image-capture-C4DwxC10.js";
27
+ import { BLUR_METRIC_IDS, DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, blurMetricScorer, highFrequencyEnergyRatio, meanLuminance, rgbaToGrayscale, sharpnessScore } from "./image-quality.js";
27
28
  import { acquireCameraTexture } from "./xr-camera-texture.js";
28
29
  import { SCENE_NODE } from "./scene-node-names.js";
29
30
  import { createEnableGpsArController } from "./enable-gps-ar.js";
30
31
  import { disposeReplayScene, getAlignmentLerper, getCameraFollower, getCameraMode, getReplayState, initReplayScene, toggleCameraMode, updateOrbitTarget } from "./replay-scene.js";
31
32
  import { XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, getXrErrorMessage } from "./xr-error-handler.js";
32
- export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, BarcodeDetectorFrontEnd, CAPTURE_FAILURE_WARNING, CameraBlitCapture, CameraFrameSource, 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, DepthSampler, ImageCaptureManager, ImageQualityGate, MIN_VALID_IMAGE_BYTES, OccupancyGrid, PlanarPnpSquare, QrLevelValidationError, SCENE_NODE, WEBXR_TO_NUE, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, 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 };
33
+ export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, BLUR_METRIC_IDS, BarcodeDetectorFrontEnd, CAPTURE_FAILURE_WARNING, CameraBlitCapture, CameraFrameSource, 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, DepthSampler, ImageCaptureManager, ImageQualityGate, MIN_VALID_IMAGE_BYTES, OccupancyGrid, PlanarPnpSquare, QrLevelValidationError, SCENE_NODE, WEBXR_TO_NUE, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, 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 };
@@ -1,5 +1,5 @@
1
1
  import { t as GridCell } from "../bresenham3d-D-t9i_b5.js";
2
- import { n as MeshMode } from "../occupancy-mesher-BqnRd10x.js";
2
+ import { n as MeshMode } from "../occupancy-mesher-B4Bv4BTk.js";
3
3
  import { Vector3 } from "gps-plus-slam-js";
4
4
 
5
5
  //#region ../src/ar/occlusion-mesh-worker.d.ts
@@ -1,2 +1,2 @@
1
- import { i as unpackCellKey, n as OccupancyGridOptions, r as cellKey, t as OccupancyGrid } from "../occupancy-grid-f0I07UxI.js";
1
+ import { i as unpackCellKey, n as OccupancyGridOptions, r as cellKey, t as OccupancyGrid } from "../occupancy-grid-CYBdmMOo.js";
2
2
  export { OccupancyGrid, OccupancyGridOptions, cellKey, unpackCellKey };
@@ -39,7 +39,7 @@ var OccupancyGrid = class {
39
39
  * an already-settled cell (count `> MAX_RELEVANT_COUNT`) does NOT bump it, so a
40
40
  * consumer can cheaply skip a full re-derive (cube refresh / occluder re-mesh)
41
41
  * when the revision is unchanged — the dominant idle-time saving over a long
42
- * session (see `2026-06-30-occluder-tuning-followups.md`).
42
+ * session (see `2026-06-30-0829-occluder-tuning-followups.md`).
43
43
  */
44
44
  revision = 0;
45
45
  /**
@@ -1,2 +1,2 @@
1
- import { a as meshOccupiedCells, i as OccupancyMeshResult, n as MeshMode, r as MeshOccupiedCellsOptions, t as Aabb } from "../occupancy-mesher-BqnRd10x.js";
1
+ import { a as meshOccupiedCells, i as OccupancyMeshResult, n as MeshMode, r as MeshOccupiedCellsOptions, t as Aabb } from "../occupancy-mesher-B4Bv4BTk.js";
2
2
  export { Aabb, MeshMode, MeshOccupiedCellsOptions, OccupancyMeshResult, meshOccupiedCells };
@@ -349,7 +349,7 @@ function buildCulled(occupied, uniqueCells, cellSizeM, positions, indices) {
349
349
  * (locally indistinguishable from a thin floor's intentionally-flat edges).
350
350
  * 0.25 was rejected as too close to imperceptibly-non-zero; 1.0 discards the
351
351
  * measured centroid exactly where data is sparsest. See
352
- * 2026-07-01-followup-smooth-mesher-single-corner-degeneracy.md.
352
+ * 2026-07-01-1455-smooth-mesher-single-corner-degeneracy-followup.md.
353
353
  */
354
354
  const SINGLE_CORNER_NUDGE_K = .5;
355
355
  function buildSmooth(occupied, uniqueCells, cellSizeM, getCellPoint, positions, indices) {
@@ -0,0 +1,11 @@
1
+ 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";
2
+ 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";
3
+ 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";
4
+ import { t as createQrSizeDepthContext } from "../../qr-size-depth-context-CMDv6T29.js";
5
+ 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";
6
+ import { n as createQrDebugView, t as QrDebugView } from "../../qr-debug-view-CGlITU09.js";
7
+ import { a as createQrDetectionController, i as RawObservationSink, n as QrDetectionControllerDeps, r as QrScanStatus, t as QrDetectionController } from "../../qr-detection-controller-C5NII-vs.js";
8
+ 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";
9
+ 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";
10
+ 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";
11
+ export { AggregateQrPoseResult, AverageRotationOptions, AverageRotationResult, BarcodeDetectorFrontEnd, BarcodeDetectorLike, CameraIntrinsics, DEFAULT_ROTATION_INLIER_ANGLE_DEG, DeriveQrPoseDeps, DerivedQrPlacement, DetectedBarcodeLike, DetectionScheduler, DetectionSchedulerConfig, Enu, FetchLike, FetchQrLevelOptions, Homography, ImageSize, IncrementalQrPlacement, Mat3, 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, RawObservationSink, RawQrObservation, RgbaImage, SolvePnpSquare, SolveQrPoseInput, ToImageBitmapSource, aggregateQrPose, averageRotation, buildObjectPoints, buildQrGpsVotes, checkQrPlausibility, composePose, createBarcodeDetectorFrontEnd, createDetectionScheduler, createIncrementalQrPlacement, createQrDebugView, createQrDetectionController, createQrDetectionScheduler, createQrSizeAccumulator, createQrSizeDepthContext, createQrSizeMeasurer, createQrTrackingController, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, estimateQrSizeFromDepth, evaluateQrPoseStability, fetchQrLevel, homographyFromCorrespondences, intrinsicsFromProjection, invertPose, ippePoseCandidates, localPlaneToEnu, nearestRotation3x3, offsetGeo, parseQrLevel, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, rotationToRodrigues, signedQuadArea, solveLinear, solveQrPose, solveQrPoseFromObservation, transformPoint, validateQuad };
@@ -0,0 +1,11 @@
1
+ import { n as createQrSizeAccumulator, r as estimateQrSizeFromDepth, t as createQrSizeMeasurer } from "../../qr-size-measurer-zZB9S1va.js";
2
+ import { createQrSizeDepthContext } from "./qr-size-depth-context.js";
3
+ import { buildObjectPoints, composePose, intrinsicsFromProjection, invertPose, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, signedQuadArea, solveQrPose, transformPoint, validateQuad } from "./qr-pose.js";
4
+ import { createIncrementalQrPlacement, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, solveQrPoseFromObservation } from "./qr-derived-pose.js";
5
+ import { createQrDebugView } from "./qr-debug-view.js";
6
+ import { n as createDetectionScheduler, r as createQrDetectionScheduler, t as createQrDetectionController } from "../../qr-detection-controller-DXc1yHRf.js";
7
+ import { i as evaluateQrPoseStability, n as aggregateQrPose, r as averageRotation, t as DEFAULT_ROTATION_INLIER_ANGLE_DEG } from "../../qr-pose-aggregation-Cp0Mtg_j.js";
8
+ import { a as offsetGeo, c as parseQrLevel, i as localPlaneToEnu, n as createQrTrackingController, o as QrLevelValidationError, r as buildQrGpsVotes, s as fetchQrLevel, t as checkQrPlausibility } from "../../qr-CTp5xI83.js";
9
+ import { BarcodeDetectorFrontEnd, createBarcodeDetectorFrontEnd } from "./qr-frontend.js";
10
+ import { PlanarPnpSquare, homographyFromCorrespondences, ippePoseCandidates, nearestRotation3x3, rotationToRodrigues, solveLinear } from "./planar-pnp.js";
11
+ export { BarcodeDetectorFrontEnd, DEFAULT_ROTATION_INLIER_ANGLE_DEG, PlanarPnpSquare, QrLevelValidationError, aggregateQrPose, averageRotation, buildObjectPoints, buildQrGpsVotes, checkQrPlausibility, composePose, createBarcodeDetectorFrontEnd, createDetectionScheduler, createIncrementalQrPlacement, createQrDebugView, createQrDetectionController, createQrDetectionScheduler, createQrSizeAccumulator, createQrSizeDepthContext, createQrSizeMeasurer, createQrTrackingController, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, estimateQrSizeFromDepth, evaluateQrPoseStability, fetchQrLevel, homographyFromCorrespondences, intrinsicsFromProjection, invertPose, ippePoseCandidates, localPlaneToEnu, nearestRotation3x3, offsetGeo, parseQrLevel, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, rotationToRodrigues, signedQuadArea, solveLinear, solveQrPose, solveQrPoseFromObservation, transformPoint, validateQuad };
@@ -1,2 +1,2 @@
1
- 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";
1
+ 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";
2
2
  export { Homography, Mat3, PlanarPnpSquare, PoseCandidate, homographyFromCorrespondences, ippePoseCandidates, nearestRotation3x3, rotationToRodrigues, solveLinear };
@@ -1,4 +1,4 @@
1
- //#region ../src/ar/planar-pnp.ts
1
+ //#region ../src/ar/qr/planar-pnp.ts
2
2
  const EPS = 1e-12;
3
3
  /**
4
4
  * Solve the dense square linear system `A·x = b` by Gaussian elimination with
@@ -0,0 +1,2 @@
1
+ import { n as createQrDebugView, t as QrDebugView } from "../../qr-debug-view-CGlITU09.js";
2
+ export { QrDebugView, createQrDebugView };
@@ -1,6 +1,6 @@
1
- import { WEBXR_TO_NUE } from "./webxr-nue-basis.js";
1
+ import { WEBXR_TO_NUE } from "../webxr-nue-basis.js";
2
2
  import { AxesHelper, BoxGeometry, Group, Mesh, MeshBasicMaterial } from "three";
3
- //#region ../src/ar/qr-debug-view.ts
3
+ //#region ../src/ar/qr/qr-debug-view.ts
4
4
  /**
5
5
  * QR debug view — the shared 3D "is it glued to the code?" overlay: a 3D axis at
6
6
  * the solved QR pose plus a semi-transparent cube sized to the QR so its front
@@ -1,2 +1,2 @@
1
- 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";
1
+ 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";
2
2
  export { DeriveQrPoseDeps, DerivedQrPlacement, IncrementalQrPlacement, RawQrObservation, createIncrementalQrPlacement, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, solveQrPoseFromObservation };
@@ -1,6 +1,6 @@
1
- import { t as createQrSizeMeasurer } from "../qr-size-measurer-BVOIg-He.js";
1
+ import { t as createQrSizeMeasurer } from "../../qr-size-measurer-zZB9S1va.js";
2
2
  import { intrinsicsFromProjection, solveQrPose } from "./qr-pose.js";
3
- //#region ../src/ar/qr-derived-pose.ts
3
+ //#region ../src/ar/qr/qr-derived-pose.ts
4
4
  /**
5
5
  * Replay a marker's observation history through a fresh size measurer (each
6
6
  * observation sized against its own as-of depth context) and return the running
@@ -1,2 +1,2 @@
1
- import { a as createQrDetectionController, i as RawObservationSink, n as QrDetectionControllerDeps, r as QrScanStatus, t as QrDetectionController } from "../qr-detection-controller-IcMRpTjV.js";
1
+ import { a as createQrDetectionController, i as RawObservationSink, n as QrDetectionControllerDeps, r as QrScanStatus, t as QrDetectionController } from "../../qr-detection-controller-C5NII-vs.js";
2
2
  export { QrDetectionController, QrDetectionControllerDeps, QrScanStatus, RawObservationSink, createQrDetectionController };
@@ -0,0 +1,2 @@
1
+ import { t as createQrDetectionController } from "../../qr-detection-controller-DXc1yHRf.js";
2
+ export { createQrDetectionController };
@@ -1,2 +1,2 @@
1
- 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";
1
+ 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";
2
2
  export { BarcodeDetectorFrontEnd, BarcodeDetectorLike, DetectedBarcodeLike, QrDetection, QrFrontEnd, RgbaImage, ToImageBitmapSource, createBarcodeDetectorFrontEnd };
@@ -1,4 +1,4 @@
1
- //#region ../src/ar/qr-frontend.ts
1
+ //#region ../src/ar/qr/qr-frontend.ts
2
2
  const defaultToImageData = (image) => new ImageData(new Uint8ClampedArray(image.data), image.width, image.height);
3
3
  var BarcodeDetectorFrontEnd = class {
4
4
  kind = "barcode-detector";
@@ -1,2 +1,2 @@
1
- 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";
1
+ 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";
2
2
  export { CameraIntrinsics, OpenCvPnpResult, Point2, Pose, QrPoseSolution, QuadValidation, SolvePnpSquare, SolveQrPoseInput, buildObjectPoints, composePose, intrinsicsFromProjection, invertPose, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, signedQuadArea, solveQrPose, transformPoint, validateQuad };
@@ -1,5 +1,5 @@
1
1
  import { quat, vec3 } from "gl-matrix";
2
- //#region ../src/ar/qr-pose.ts
2
+ //#region ../src/ar/qr/qr-pose.ts
3
3
  /**
4
4
  * QR pose math — Phase 1 of the QR-code detection & 3D-tracking plan.
5
5
  *
@@ -0,0 +1,3 @@
1
+ import { n as QrSizeDepthContext } from "../../qr-size-measurer-rVFf4AdM.js";
2
+ import { t as createQrSizeDepthContext } from "../../qr-size-depth-context-CMDv6T29.js";
3
+ export { QrSizeDepthContext, createQrSizeDepthContext };
@@ -1,6 +1,6 @@
1
- import { createDepthUnprojector } from "./depth-unprojection.js";
2
- import { createDepthGridLookup } from "./depth-grid-lookup.js";
3
- //#region ../src/ar/qr-size-depth-context.ts
1
+ import { createDepthUnprojector } from "../depth-unprojection.js";
2
+ import { createDepthGridLookup } from "../depth-grid-lookup.js";
3
+ //#region ../src/ar/qr/qr-size-depth-context.ts
4
4
  /**
5
5
  * `createQrSizeDepthContext` — build a {@link QrSizeDepthContext} (unprojector +
6
6
  * bilinear depth-grid lookup) from one {@link DepthSample}.
@@ -16,7 +16,7 @@ import { createDepthGridLookup } from "./depth-grid-lookup.js";
16
16
  * consumer composes whatever extra it needs on top (the demo adds `cameraPose` +
17
17
  * `projectionMatrix` for the PnP intrinsics).
18
18
  *
19
- * Deep-imported via `…/ar/qr-size-depth-context` (NOT the `…/ar` barrel) so the
19
+ * Deep-imported via `…/ar/qr/qr-size-depth-context` (NOT the `…/ar` barrel) so the
20
20
  * Recorder's partially-mocked wiring tests don't pull heavy transitive deps —
21
21
  * same rationale as `qr-depth-resolver` / `qr-debug-view`.
22
22
  *
@@ -1,2 +1,2 @@
1
- import { a as QrSizeMeasurerOptions, i as QrSizeMeasurer, n as QrSizeDepthContext, o as createQrSizeMeasurer, r as QrSizeMeasurement, t as ImageSize } from "../qr-size-measurer-Bl_i-umk.js";
1
+ import { a as QrSizeMeasurerOptions, i as QrSizeMeasurer, n as QrSizeDepthContext, o as createQrSizeMeasurer, r as QrSizeMeasurement, t as ImageSize } from "../../qr-size-measurer-rVFf4AdM.js";
2
2
  export { ImageSize, QrSizeDepthContext, QrSizeMeasurement, QrSizeMeasurer, QrSizeMeasurerOptions, createQrSizeMeasurer };
@@ -0,0 +1,2 @@
1
+ import { t as createQrSizeMeasurer } from "../../qr-size-measurer-zZB9S1va.js";
2
+ export { createQrSizeMeasurer };
@@ -1,2 +1,2 @@
1
- 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, s as getCss3dManager, t as CameraMode, u as toggleCameraMode } from "../replay-scene-CZdWgcpc.js";
1
+ 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, s as getCss3dManager, t as CameraMode, u as toggleCameraMode } from "../replay-scene-BJeO36YT.js";
2
2
  export { CameraMode, ReplaySceneState, disposeReplayScene, getAlignmentLerper, getCameraFollower, getCameraMode, getCss3dManager, getReplayState, initReplayScene, toggleCameraMode, updateOrbitTarget };
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
- import { A as setArWorldGroup, L as setScene, j as setCamera, k as setArPose, s as createSceneHierarchy } from "../webxr-session-DWKUsCN9.js";
2
+ import { i as createSceneHierarchy } from "../webxr-session-OyR3YbTq.js";
3
3
  import { createCss3dRendererManager } from "../visualization/css3d-renderer-manager.js";
4
4
  import { createCameraFollower } from "../visualization/camera-follower.js";
5
5
  import { createAlignmentLerper } from "../visualization/alignment-lerper.js";
@@ -16,8 +16,15 @@ import { OrbitControls } from "three/addons/controls/OrbitControls.js";
16
16
  * controls operate in a stable world-space frame, unaffected by the
17
17
  * alignment matrix on arWorldGroup or odom pose updates on arpose.
18
18
  *
19
- * Registers the scene objects with webxr-session.ts module-global getters
20
- * (Risk R1 fix) so existing visualizers work without modification.
19
+ * OWNS its scene objects: the replay scene/arWorldGroup/camera/arpose are
20
+ * exposed via initReplayScene()'s return value and getReplayState(), and are
21
+ * NEVER injected into webxr-session.ts (the historical Risk R1
22
+ * setScene/setArWorldGroup/setCamera/setArPose hack was removed by the
23
+ * 2026-07-11 webxr-session surface-reduction plan, step 2). The live-session
24
+ * getters (getScene() etc.) stay null during replay; replay consumers read
25
+ * this module's accessors instead, and scene-reading visualizers (e.g.
26
+ * gpsEventVisualizer.setSceneSource) are pointed at these references by the
27
+ * replay orchestrator.
21
28
  *
22
29
  * Camera modes:
23
30
  * - orbit (default): OrbitControls — click-drag orbit + scroll zoom
@@ -70,7 +77,8 @@ function updateFpsMovement(dt) {
70
77
  * - Creates the scene hierarchy via createSceneHierarchy()
71
78
  * - Reparents camera from arWorldGroup to scene root (Risk R5)
72
79
  * - Creates a WebGLRenderer WITHOUT WebXR
73
- * - Registers scene with module-global getters (Risk R1)
80
+ * - Keeps its own scene/arWorldGroup/arpose/camera references (returned
81
+ * here and via getReplayState()) — nothing is written into webxr-session
74
82
  * - Inserts canvas into the provided container
75
83
  * - Starts a requestAnimationFrame render loop
76
84
  * - Sets up OrbitControls as default camera mode
@@ -96,10 +104,6 @@ function initReplayScene(container) {
96
104
  renderer.xr.enabled = false;
97
105
  container.appendChild(renderer.domElement);
98
106
  const css3dManager = createCss3dRendererManager(container, width, height);
99
- setScene(scene);
100
- setArWorldGroup(arWorldGroup);
101
- setArPose(arpose);
102
- setCamera(camera);
103
107
  const orbitControls = new OrbitControls(camera, renderer.domElement);
104
108
  orbitControls.enableDamping = true;
105
109
  orbitControls.target.set(0, 0, 0);
@@ -109,6 +113,7 @@ function initReplayScene(container) {
109
113
  state = {
110
114
  scene,
111
115
  arWorldGroup,
116
+ arpose,
112
117
  camera,
113
118
  renderer,
114
119
  orbitControls,
@@ -123,6 +128,7 @@ function initReplayScene(container) {
123
128
  return {
124
129
  scene,
125
130
  arWorldGroup,
131
+ arpose,
126
132
  camera,
127
133
  renderer
128
134
  };
@@ -134,7 +140,7 @@ function initReplayScene(container) {
134
140
  * - Disposes renderer (frees GPU resources)
135
141
  * - Disposes camera controls
136
142
  * - Removes canvas from DOM
137
- * - Clears module-global scene references
143
+ * - Clears this module's state (getReplayState() returns null afterwards)
138
144
  *
139
145
  * Safe to call multiple times (idempotent).
140
146
  */
@@ -151,10 +157,6 @@ function disposeReplayScene() {
151
157
  restoreTabindex();
152
158
  if (state.renderer.domElement.parentElement) state.renderer.domElement.parentElement.removeChild(state.renderer.domElement);
153
159
  state.renderer.dispose();
154
- setScene(null);
155
- setArWorldGroup(null);
156
- setArPose(null);
157
- setCamera(null);
158
160
  state = null;
159
161
  log.info("Replay scene disposed");
160
162
  }
@@ -1,4 +1,4 @@
1
- import { i as DepthSample, t as ARPose } from "../ar-types-CBafnxhE.js";
2
- import { n as CapturedImage } from "../image-capture-Cr_rljeV.js";
3
- import { $ as stopImageCapture, A as nuePositionToWebXR, B as setImageQualityAnalyzer, C as getImageCaptureFrameCount, D as initAR, E as getXrCameraFromPose, F as setCamera, G as setTrackingRecoveredCallback, H as setSessionEndCallback, I as setCameraFrameCallback, J as startCameraFrameCapture, K as setTrackingStore, L as setDepthCaptureCallback, M as resetWebXRState, N as setArPose, O as isWebXRSupported, P as setArWorldGroup, Q as stopDepthCapture, R as setFrameCallback, S as getDepthSampleCount, T as getScene, U as setTrackingCallbacks, V as setScene, W as setTrackingLostCallback, X as startImageCapture, Y as startDepthCapture, Z as stopCameraFrameCapture, _ as getCamera, a as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, b as getCurrentArPose, c as TrackingSubscribableStore, d as createSceneHierarchy, f as endARSession, g as getArWorldGroup, h as getArPose, i as CameraFrameCaptureConfig, j as nueQuaternionToWebXR, k as isXRCameraLike, l as applyAlignmentMatrix, m as extractResetTransformData, n as AR_CAMERA_FOV, o as SessionEndInfo, p as extractPoseFromViewer, q as shouldLogCameraAccessDiagnostic, r as AR_CAMERA_NEAR, s as SessionFeatureOptions, t as AR_CAMERA_FAR, u as buildSessionOptions, v as getCameraFrameCaptureSize, w as getLiveCss3dManager, x as getDepthInfoFromFrame, y as getCameraFrameCount, z as setImageCaptureCallback } from "../webxr-session-CGFZ429B.js";
4
- export { ARPose, AR_CAMERA_FAR, AR_CAMERA_FOV, AR_CAMERA_NEAR, CameraFrameCaptureConfig, CapturedImage, DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, DepthSample, SessionEndInfo, SessionFeatureOptions, TrackingSubscribableStore, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArPose, getArWorldGroup, getCamera, getCameraFrameCaptureSize, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, resetWebXRState, setArPose, setArWorldGroup, setCamera, setCameraFrameCallback, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setImageQualityAnalyzer, setScene, setSessionEndCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingRecoveredCallback, setTrackingStore, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
1
+ import { i as DepthSample, t as ARPose } from "../ar-types-D6PYS4bc.js";
2
+ import { n as CapturedImage } from "../image-capture-BevgKpoO.js";
3
+ import { A as startCameraFrameCapture, C as isWebXRSupported, D as rebindTrackingStore, E as nueQuaternionToWebXR, F as stopImageCapture, M as startImageCapture, N as stopCameraFrameCapture, O as resetWebXRState, P as stopDepthCapture, S as initAR, T as nuePositionToWebXR, _ as getDepthInfoFromFrame, a as SessionFeatureOptions, b as getScene, c as buildSessionOptions, d as extractPoseFromViewer, f as extractResetTransformData, g as getCurrentArPose, h as getCameraFrameCount, i as SessionEndInfo, j as startDepthCapture, k as shouldLogCameraAccessDiagnostic, l as createSceneHierarchy, m as getCamera, n as CameraFrameCaptureConfig, o as TrackingSubscribableStore, p as getArWorldGroup, r as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, s as applyAlignmentMatrix, t as ArSessionCallbacks, u as endARSession, v as getDepthSampleCount, w as isXRCameraLike, x as getXrCameraFromPose, y as getImageCaptureFrameCount } from "../webxr-session-DefwObIu.js";
4
+ export { ARPose, ArSessionCallbacks, CameraFrameCaptureConfig, CapturedImage, DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, DepthSample, SessionEndInfo, SessionFeatureOptions, TrackingSubscribableStore, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArWorldGroup, getCamera, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, rebindTrackingStore, resetWebXRState, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
@@ -1,2 +1,2 @@
1
- import { A as setArWorldGroup, B as setTrackingLostCallback, C as initAR, D as nueQuaternionToWebXR, E as nuePositionToWebXR, F as setImageCaptureCallback, G as startDepthCapture, H as setTrackingStore, I as setImageQualityAnalyzer, J as stopDepthCapture, K as startImageCapture, L as setScene, M as setCameraFrameCallback, N as setDepthCaptureCallback, O as resetWebXRState, P as setFrameCallback, R as setSessionEndCallback, S as getXrCameraFromPose, T as isXRCameraLike, U as shouldLogCameraAccessDiagnostic, V as setTrackingRecoveredCallback, W as startCameraFrameCapture, Y as stopImageCapture, _ as getDepthInfoFromFrame, a as applyAlignmentMatrix, b as getLiveCss3dManager, c as endARSession, d as getArPose, f as getArWorldGroup, g as getCurrentArPose, h as getCameraFrameCount, i as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, j as setCamera, k as setArPose, l as extractPoseFromViewer, m as getCameraFrameCaptureSize, n as AR_CAMERA_FOV, o as buildSessionOptions, p as getCamera, q as stopCameraFrameCapture, r as AR_CAMERA_NEAR, s as createSceneHierarchy, t as AR_CAMERA_FAR, u as extractResetTransformData, v as getDepthSampleCount, w as isWebXRSupported, x as getScene, y as getImageCaptureFrameCount, z as setTrackingCallbacks } from "../webxr-session-DWKUsCN9.js";
2
- export { AR_CAMERA_FAR, AR_CAMERA_FOV, AR_CAMERA_NEAR, DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArPose, getArWorldGroup, getCamera, getCameraFrameCaptureSize, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, resetWebXRState, setArPose, setArWorldGroup, setCamera, setCameraFrameCallback, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setImageQualityAnalyzer, setScene, setSessionEndCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingRecoveredCallback, setTrackingStore, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
1
+ import { A as stopImageCapture, C as resetWebXRState, D as startImageCapture, E as startDepthCapture, O as stopCameraFrameCapture, S as rebindTrackingStore, T as startCameraFrameCapture, _ as initAR, a as endARSession, b as nuePositionToWebXR, c as getArWorldGroup, d as getCurrentArPose, f as getDepthInfoFromFrame, g as getXrCameraFromPose, h as getScene, i as createSceneHierarchy, k as stopDepthCapture, l as getCamera, m as getImageCaptureFrameCount, n as applyAlignmentMatrix, o as extractPoseFromViewer, p as getDepthSampleCount, r as buildSessionOptions, s as extractResetTransformData, t as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, u as getCameraFrameCount, v as isWebXRSupported, w as shouldLogCameraAccessDiagnostic, x as nueQuaternionToWebXR, y as isXRCameraLike } from "../webxr-session-OyR3YbTq.js";
2
+ export { DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArWorldGroup, getCamera, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, rebindTrackingStore, resetWebXRState, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
@@ -1,2 +1,2 @@
1
- import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-C6Z4d7RR.js";
1
+ import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-q0eIDSRg.js";
2
2
  export { CameraTextureResult, RendererLike, XRCameraLike, acquireCameraTexture };
@@ -1,2 +1,2 @@
1
- import { a as runXrFrameUpdates, i as registerXrFrameUpdate, n as XrFrameUpdate, r as clearXrFrameUpdates, t as XrFrameContext } from "../xr-frame-loop-25gM4B0K.js";
1
+ import { a as runXrFrameUpdates, i as registerXrFrameUpdate, n as XrFrameUpdate, r as clearXrFrameUpdates, t as XrFrameContext } from "../xr-frame-loop-BiZvgqP7.js";
2
2
  export { XrFrameContext, XrFrameUpdate, clearXrFrameUpdates, registerXrFrameUpdate, runXrFrameUpdates };
@@ -18,7 +18,7 @@ import { createLogger } from "../utils/logger.js";
18
18
  * makes correct use the easy path and stashing the awkward one. Do NOT retain
19
19
  * `ctx` or its fields beyond the callback's synchronous execution.
20
20
  *
21
- * See `2026-06-03-threejs-arbutton-minimal-ar-example-user-feedback.md`
21
+ * See `2026-06-03-0553-threejs-arbutton-minimal-ar-example-user-feedback.md`
22
22
  * §6.2/§6.3 (option H-A2) for the design rationale.
23
23
  */
24
24
  const log = createLogger("XrFrameLoop");
@@ -0,0 +1,52 @@
1
+ //#region ../src/ar/ar-crash-isolation.d.ts
2
+ /**
3
+ * AR crash isolation flags — diagnostic gates for XR session negotiation.
4
+ *
5
+ * Moved out of the recorder settings catalog (2026-07-11 G-1 move,
6
+ * `2026-07-11-1445-recording-options-altitude-move-plan.md`): the framework itself
7
+ * consumes these flags in `webxr-session.ts` (session feature requests, frame
8
+ * loop) and on `enable-gps-ar.ts`'s public param, so the type + defaults +
9
+ * validator live framework-side. The recorder embeds the group in its own
10
+ * `RecordingOptions` catalog and re-exports the type.
11
+ */
12
+ /**
13
+ * Diagnostic flags for isolating pre-recording AR startup crashes.
14
+ * These gates affect XR session negotiation and frame-loop behavior,
15
+ * independently of recording-time image/depth capture.
16
+ */
17
+ interface ArCrashIsolationOptions {
18
+ enableDomOverlay: boolean;
19
+ enableCameraAccess: boolean;
20
+ enableDepthSensingFeature: boolean;
21
+ enableCss3dRenderer: boolean;
22
+ enableCameraTextureAcquisition: boolean;
23
+ /**
24
+ * Apply the Chromium WebXR camera-access tab-crash workaround at app
25
+ * bootstrap. The workaround always deletes
26
+ * `XRWebGLBinding.prototype.createProjectionLayer` /
27
+ * `XRRenderState.prototype.layers` (forcing `XRWebGLLayer`) — required on
28
+ * every affected Chrome build observed on-device, including Chrome 150 — and
29
+ * additionally persists the `baseLayer` across
30
+ * `XRSession.prototype.updateRenderState` only for Chrome builds inside the
31
+ * affected window (148.0.7778.12 up to 149.0.7821).
32
+ *
33
+ * Default `true`. Opt-out is offered because forcing `XRWebGLLayer` may break
34
+ * WebXR on unaffected (e.g. Quest) devices.
35
+ *
36
+ * @see GpsPlusSlamJs_AppFramework/src/ar/chromium-camera-access-workaround.ts
37
+ * @see https://github.com/mrdoob/three.js/issues/33404
38
+ */
39
+ applyChromiumProjectionLayerWorkaround: boolean;
40
+ }
41
+ /** Default AR-crash-isolation flags (all features enabled). */
42
+ declare const DEFAULT_AR_CRASH_ISOLATION: ArCrashIsolationOptions;
43
+ /**
44
+ * Validate and normalize AR crash isolation flags.
45
+ * Missing or invalid values fall back to defaults. The container itself is as
46
+ * untrusted as its fields (persisted blobs may lack the key entirely or hold
47
+ * `null`), so a nullish container yields the full defaults instead of
48
+ * throwing.
49
+ */
50
+ declare function validateArCrashIsolationOptions(rawOptions?: Partial<ArCrashIsolationOptions> | null): ArCrashIsolationOptions;
51
+ //#endregion
52
+ export { DEFAULT_AR_CRASH_ISOLATION as n, validateArCrashIsolationOptions as r, ArCrashIsolationOptions as t };
@@ -1,4 +1,4 @@
1
- import { t as SubscribableStore } from "./subscribe-to-selector-Cgo9JTfS.js";
1
+ import { t as SubscribableStore } from "./subscribe-to-selector-j-eOYybQ.js";
2
2
  import * as THREE from "three";
3
3
 
4
4
  //#region ../src/visualization/ar-world-group-alignment.d.ts
@@ -32,7 +32,7 @@ interface ArWorldGroupAlignmentHandle {
32
32
  * handle is still returned for callers that want to stop alignment mid-session,
33
33
  * and is idempotent + self-deregistering so a manual `dispose()` and the
34
34
  * teardown flush never double-run. See
35
- * gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-08-arworldgroup-alignment-session-scoped-disposal.md.
35
+ * gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-08-2149-arworldgroup-alignment-session-scoped-disposal.md.
36
36
  *
37
37
  * Double-drive is still the caller's concern: the recorder owns its own lerper
38
38
  * and must NOT also call this (it would double-lerp the same group). It does not
@@ -8,7 +8,7 @@
8
8
  * stays in each app's `main.ts`; only the browser-free decision and the
9
9
  * user-facing message live here so they can be unit-tested without a browser.
10
10
  *
11
- * See `2026-06-03-threejs-arbutton-minimal-ar-example-user-feedback.md` §6.4.
11
+ * See `2026-06-03-0553-threejs-arbutton-minimal-ar-example-user-feedback.md` §6.4.
12
12
  */
13
13
  /** The two capabilities every GPS+AR demo requires to run. */
14
14
  interface CapabilitySupport {
@@ -0,0 +1,120 @@
1
+ //#region ../src/ar/capture-motion-gate.d.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
+ declare const DEFAULT_MOTION_WINDOW_SIZE = 3;
24
+ /**
25
+ * User-/consumer-facing motion-filter configuration. Shared by both config
26
+ * shapes that carry it — `ImageCaptureConfig` (what `ImageCaptureManager`
27
+ * consumes) and `ImageCaptureOptions` (the persisted recorder options) — so the
28
+ * one definition cannot drift between them. The window size and glitch ceilings
29
+ * are deliberately NOT here: they are internal tuning constants, not exposed.
30
+ */
31
+ interface MotionFilterConfig {
32
+ /** Master switch for the motion gate. Default `true`. */
33
+ enabled: boolean;
34
+ /** Angular-velocity threshold (rad/s); at/below this a frame is "calm". */
35
+ maxAngularVelocity: number;
36
+ /** Linear-velocity threshold (m/s); at/below this a frame is "calm". */
37
+ maxLinearVelocity: number;
38
+ /**
39
+ * Never-calm safety fallback: once a due capture has waited this many ms it
40
+ * fires regardless of motion, so an interval is never silently lost. A
41
+ * sensible value is ~2× the capture interval.
42
+ */
43
+ maxWaitMs: number;
44
+ }
45
+ /**
46
+ * Default motion-filter configuration. Enabled by default (plan §1).
47
+ *
48
+ * `maxLinearVelocity` was raised `0.5 → 2.5` m/s on 2026-07-02 after a
49
+ * 5-recording field analysis: at 0.5 m/s (~⅓ of a ~1.4 m/s walking pace) the
50
+ * gate deferred ~90 % of captures to the never-calm `maxWaitMs` fallback,
51
+ * collapsing the walking capture rate from the configured 0.5 Hz to ~0.17 Hz.
52
+ * Measured 1 Hz-averaged walking speed was a tight band (median 1.38, max
53
+ * 1.73 m/s); allowing for higher instantaneous per-frame stride peaks, 2.5 m/s
54
+ * clears steady and brisk walking while still deferring genuine lunges/jogging
55
+ * — demoting the (weak-at-scanning-distance) linear signal to a gross-motion
56
+ * safety net and letting the well-behaved angular gate be the primary blur
57
+ * selector. See
58
+ * `GpsPlusSlamJs_Docs/docs/2026-07-02-0117-image-capture-rate-motion-gate-finding.md`.
59
+ *
60
+ * `maxAngularVelocity` remains a PLACEHOLDER pending on-device field tuning
61
+ * (plan §7). `maxWaitMs` of 4000 ms is 2× the default 2000 ms image interval.
62
+ */
63
+ declare const DEFAULT_MOTION_FILTER: MotionFilterConfig;
64
+ /** Inputs to the stateless capture decision. */
65
+ interface CaptureDecisionInput {
66
+ /** Max angular velocity (rad/s) over the recent window. `Infinity` if empty. */
67
+ windowMaxAngular: number;
68
+ /** Max linear velocity (m/s) over the recent window. `Infinity` if empty. */
69
+ windowMaxLinear: number;
70
+ /** Angular-velocity threshold (rad/s); at/below this is "calm". */
71
+ maxAngularVelocity: number;
72
+ /** Linear-velocity threshold (m/s); at/below this is "calm". */
73
+ maxLinearVelocity: number;
74
+ /** Milliseconds since the capture first became due (interval elapsed). */
75
+ msSinceDue: number;
76
+ /** Safety fallback: capture regardless once this many ms have passed. */
77
+ maxWaitMs: number;
78
+ }
79
+ /**
80
+ * Decide whether a due capture should fire now or defer to a later frame.
81
+ *
82
+ * A frame is "calm" when BOTH windowed maxima are at/below their thresholds —
83
+ * an empty window reports `Infinity`, so it is never calm (no capture before a
84
+ * valid sample exists). If not calm, the capture is deferred UNTIL `msSinceDue`
85
+ * reaches `maxWaitMs`, at which point it fires regardless to guarantee an
86
+ * interval is never silently lost (worst case: one blurry frame, not a gap).
87
+ */
88
+ declare function decideCapture(input: CaptureDecisionInput): 'capture' | 'defer';
89
+ /**
90
+ * Fixed-size ring of the most recent VALID (non-glitch) per-frame velocities.
91
+ *
92
+ * `maxAngular()`/`maxLinear()` return the max over the retained samples, or
93
+ * `Infinity` when empty so "no data yet" reads as not-calm in
94
+ * {@link decideCapture}. A sample exceeding either glitch ceiling is rejected
95
+ * outright (`push` returns `false`) and never stored, so a relocalization spike
96
+ * neither pollutes the window (no spurious defer) nor is treated as motion.
97
+ */
98
+ declare class MotionWindow {
99
+ private readonly angularGlitchCeiling;
100
+ private readonly linearGlitchCeiling;
101
+ private readonly size;
102
+ private readonly angular;
103
+ private readonly linear;
104
+ constructor(size?: number, angularGlitchCeiling?: number, linearGlitchCeiling?: number);
105
+ /**
106
+ * Record a per-frame velocity pair. Returns `false` (and stores nothing) when
107
+ * the sample exceeds either glitch ceiling, `true` otherwise.
108
+ */
109
+ push(angularVel: number, linearVel: number): boolean;
110
+ /** Whether the window holds at least one valid (non-glitch) sample yet. */
111
+ hasSamples(): boolean;
112
+ /** Max angular velocity over the retained window, or `Infinity` if empty. */
113
+ maxAngular(): number;
114
+ /** Max linear velocity over the retained window, or `Infinity` if empty. */
115
+ maxLinear(): number;
116
+ /** Clear all samples (e.g. on tracking loss / capture restart). */
117
+ reset(): void;
118
+ }
119
+ //#endregion
120
+ export { MotionWindow as a, MotionFilterConfig as i, DEFAULT_MOTION_FILTER as n, decideCapture as o, DEFAULT_MOTION_WINDOW_SIZE as r, CaptureDecisionInput as t };
@@ -10,7 +10,7 @@
10
10
  * added — i.e. it is not specific to this app's session setup. See:
11
11
  *
12
12
  * - GpsPlusSlamJs_Docs/docs/2026-04-22-camera-access-reproducer-plan.md
13
- * - GpsPlusSlamJs_Docs/docs/2026-06-04-camera-access-crash-regression-chrome-148.md
13
+ * - GpsPlusSlamJs_Docs/docs/2026-06-04-0458-camera-access-crash-regression-chrome-148.md
14
14
  * - https://github.com/mrdoob/three.js/issues/33404
15
15
  * - https://issues.chromium.org/issues/507508099 (root-cause, marked Fixed)
16
16
  *