@photivra/engine 0.6.0 → 1.0.1
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.
- package/AGENTS.md +674 -0
- package/CHANGELOG.md +191 -0
- package/CITATION.cff +1 -1
- package/CONTRIBUTING.md +76 -0
- package/DCO +33 -0
- package/NODE_SUPPORT.md +37 -0
- package/NOTICE +2 -0
- package/README.md +139 -72
- package/SECURITY.md +55 -0
- package/THIRD_PARTY.md +63 -0
- package/dist/camera/equivalent-focal-length.d.ts +9 -0
- package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
- package/dist/camera/equivalent-focal-length.js +9 -0
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +13 -0
- package/dist/camera/field-of-view.d.ts.map +1 -1
- package/dist/camera/field-of-view.js +13 -0
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/projected-object-size.d.ts +8 -0
- package/dist/camera/projected-object-size.d.ts.map +1 -1
- package/dist/camera/projected-object-size.js +8 -0
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +60 -0
- package/dist/capture/capture-export-metadata.d.ts.map +1 -0
- package/dist/capture/capture-export-metadata.js +62 -0
- package/dist/capture/capture-export-metadata.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +55 -0
- package/dist/capture/environment-raw-producer.d.ts.map +1 -0
- package/dist/capture/environment-raw-producer.js +88 -0
- package/dist/capture/environment-raw-producer.js.map +1 -0
- package/dist/capture/export-jpeg.d.ts +12 -0
- package/dist/capture/export-jpeg.d.ts.map +1 -0
- package/dist/capture/export-jpeg.js +126 -0
- package/dist/capture/export-jpeg.js.map +1 -0
- package/dist/capture/export-tiff.d.ts +45 -0
- package/dist/capture/export-tiff.d.ts.map +1 -0
- package/dist/capture/export-tiff.js +129 -0
- package/dist/capture/export-tiff.js.map +1 -0
- package/dist/capture/focus-control.d.ts +210 -0
- package/dist/capture/focus-control.d.ts.map +1 -0
- package/dist/capture/focus-control.js +664 -0
- package/dist/capture/focus-control.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +59 -0
- package/dist/capture/linear-encoding.d.ts.map +1 -0
- package/dist/capture/linear-encoding.js +98 -0
- package/dist/capture/linear-encoding.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +135 -0
- package/dist/capture/photographic-export.d.ts.map +1 -0
- package/dist/capture/photographic-export.js +273 -0
- package/dist/capture/photographic-export.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +12 -0
- package/dist/capture/raw-frame-limits.d.ts.map +1 -0
- package/dist/capture/raw-frame-limits.js +13 -0
- package/dist/capture/raw-frame-limits.js.map +1 -0
- package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
- package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
- package/dist/capture/raw-frame-reconstruction.js +146 -0
- package/dist/capture/raw-frame-reconstruction.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +120 -0
- package/dist/capture/release-sequence.d.ts.map +1 -0
- package/dist/capture/release-sequence.js +446 -0
- package/dist/capture/release-sequence.js.map +1 -0
- package/dist/capture/sensor-raw-frame.d.ts +34 -0
- package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
- package/dist/capture/sensor-raw-frame.js +106 -0
- package/dist/capture/sensor-raw-frame.js.map +1 -0
- package/dist/capture/sensor-raw-producer.d.ts +51 -0
- package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
- package/dist/capture/sensor-raw-producer.js +235 -0
- package/dist/capture/sensor-raw-producer.js.map +1 -0
- package/dist/capture/simulated-capture.d.ts +125 -0
- package/dist/capture/simulated-capture.d.ts.map +1 -0
- package/dist/capture/simulated-capture.js +248 -0
- package/dist/capture/simulated-capture.js.map +1 -0
- package/dist/color/capture-color.d.ts +73 -0
- package/dist/color/capture-color.d.ts.map +1 -0
- package/dist/color/capture-color.js +145 -0
- package/dist/color/capture-color.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +23 -0
- package/dist/color/sensor-color-development.d.ts.map +1 -0
- package/dist/color/sensor-color-development.js +56 -0
- package/dist/color/sensor-color-development.js.map +1 -0
- package/dist/color/white-balance.d.ts +175 -0
- package/dist/color/white-balance.d.ts.map +1 -0
- package/dist/color/white-balance.js +606 -0
- package/dist/color/white-balance.js.map +1 -0
- package/dist/composition/image-formation-plan.d.ts +481 -0
- package/dist/composition/image-formation-plan.d.ts.map +1 -0
- package/dist/composition/image-formation-plan.js +2499 -0
- package/dist/composition/image-formation-plan.js.map +1 -0
- package/dist/composition/plan-consumer.d.ts +53 -0
- package/dist/composition/plan-consumer.d.ts.map +1 -0
- package/dist/composition/plan-consumer.js +119 -0
- package/dist/composition/plan-consumer.js.map +1 -0
- package/dist/core/calculation-result.d.ts.map +1 -1
- package/dist/core/calculation-result.js +6 -0
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +18 -0
- package/dist/core/canonical-json.d.ts.map +1 -0
- package/dist/core/canonical-json.js +44 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/configuration-error.d.ts +6 -0
- package/dist/core/configuration-error.d.ts.map +1 -1
- package/dist/core/configuration-error.js +6 -0
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +6 -0
- package/dist/core/evidence-provenance.d.ts.map +1 -1
- package/dist/core/evidence-provenance.js +7 -0
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +9 -3
- package/dist/core/image-formation.d.ts.map +1 -1
- package/dist/core/image-formation.js +29 -5
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +25 -0
- package/dist/core/owned-data.d.ts.map +1 -0
- package/dist/core/owned-data.js +34 -0
- package/dist/core/owned-data.js.map +1 -0
- package/dist/core/record-validation.d.ts +17 -0
- package/dist/core/record-validation.d.ts.map +1 -0
- package/dist/core/record-validation.js +44 -0
- package/dist/core/record-validation.js.map +1 -0
- package/dist/core/scientific-assurance.d.ts +101 -0
- package/dist/core/scientific-assurance.d.ts.map +1 -0
- package/dist/core/scientific-assurance.js +301 -0
- package/dist/core/scientific-assurance.js.map +1 -0
- package/dist/core/spectral-composition.d.ts +106 -0
- package/dist/core/spectral-composition.d.ts.map +1 -0
- package/dist/core/spectral-composition.js +334 -0
- package/dist/core/spectral-composition.js.map +1 -0
- package/dist/core/spectral.d.ts +34 -0
- package/dist/core/spectral.d.ts.map +1 -0
- package/dist/core/spectral.js +57 -0
- package/dist/core/spectral.js.map +1 -0
- package/dist/core/validation.d.ts +6 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +9 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +10 -0
- package/dist/core/version.js.map +1 -0
- package/dist/equipment/exposure-capabilities.d.ts +125 -0
- package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
- package/dist/equipment/exposure-capabilities.js +391 -0
- package/dist/equipment/exposure-capabilities.js.map +1 -0
- package/dist/equipment/generic-tier-assets.d.ts +82 -0
- package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-assets.js +119 -0
- package/dist/equipment/generic-tier-assets.js.map +1 -0
- package/dist/equipment/generic-tier-presets.d.ts +57 -0
- package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-presets.js +122 -0
- package/dist/equipment/generic-tier-presets.js.map +1 -0
- package/dist/equipment/iso-capabilities.d.ts +143 -0
- package/dist/equipment/iso-capabilities.d.ts.map +1 -0
- package/dist/equipment/iso-capabilities.js +578 -0
- package/dist/equipment/iso-capabilities.js.map +1 -0
- package/dist/equipment/metering-capabilities.d.ts +58 -0
- package/dist/equipment/metering-capabilities.d.ts.map +1 -0
- package/dist/equipment/metering-capabilities.js +151 -0
- package/dist/equipment/metering-capabilities.js.map +1 -0
- package/dist/equipment/release-capabilities.d.ts +33 -0
- package/dist/equipment/release-capabilities.d.ts.map +1 -0
- package/dist/equipment/release-capabilities.js +176 -0
- package/dist/equipment/release-capabilities.js.map +1 -0
- package/dist/exposure/exposure-duration-control.d.ts +72 -0
- package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
- package/dist/exposure/exposure-duration-control.js +161 -0
- package/dist/exposure/exposure-duration-control.js.map +1 -0
- package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
- package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
- package/dist/exposure/exposure-mode-resolver.js +1905 -0
- package/dist/exposure/exposure-mode-resolver.js.map +1 -0
- package/dist/exposure/exposure.d.ts +8 -0
- package/dist/exposure/exposure.d.ts.map +1 -1
- package/dist/exposure/exposure.js +8 -0
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash.d.ts +179 -0
- package/dist/exposure/flash.d.ts.map +1 -0
- package/dist/exposure/flash.js +644 -0
- package/dist/exposure/flash.js.map +1 -0
- package/dist/exposure/metering-scene-radiance.d.ts +72 -0
- package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
- package/dist/exposure/metering-scene-radiance.js +222 -0
- package/dist/exposure/metering-scene-radiance.js.map +1 -0
- package/dist/exposure/metering-target.d.ts +67 -0
- package/dist/exposure/metering-target.d.ts.map +1 -0
- package/dist/exposure/metering-target.js +265 -0
- package/dist/exposure/metering-target.js.map +1 -0
- package/dist/exposure/metering-temporal.d.ts +76 -0
- package/dist/exposure/metering-temporal.d.ts.map +1 -0
- package/dist/exposure/metering-temporal.js +210 -0
- package/dist/exposure/metering-temporal.js.map +1 -0
- package/dist/exposure/metering.d.ts +124 -0
- package/dist/exposure/metering.d.ts.map +1 -0
- package/dist/exposure/metering.js +422 -0
- package/dist/exposure/metering.js.map +1 -0
- package/dist/exposure/program-line.d.ts +29 -0
- package/dist/exposure/program-line.d.ts.map +1 -0
- package/dist/exposure/program-line.js +126 -0
- package/dist/exposure/program-line.js.map +1 -0
- package/dist/index.d.ts +87 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -6
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +16 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +16 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
- package/dist/motion/capture-rotation-trajectory.js +15 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
- package/dist/motion/extended-object-projection.d.ts +175 -0
- package/dist/motion/extended-object-projection.d.ts.map +1 -0
- package/dist/motion/extended-object-projection.js +402 -0
- package/dist/motion/extended-object-projection.js.map +1 -0
- package/dist/motion/projected-motion.d.ts +11 -0
- package/dist/motion/projected-motion.d.ts.map +1 -1
- package/dist/motion/projected-motion.js +11 -0
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/optics/aperture.d.ts +9 -0
- package/dist/optics/aperture.d.ts.map +1 -1
- package/dist/optics/aperture.js +9 -0
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/circle-of-confusion.d.ts +8 -0
- package/dist/optics/circle-of-confusion.d.ts.map +1 -1
- package/dist/optics/circle-of-confusion.js +8 -0
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +128 -0
- package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
- package/dist/optics/complex-pupil-psf.js +462 -0
- package/dist/optics/complex-pupil-psf.js.map +1 -0
- package/dist/optics/depth-of-field.d.ts +18 -0
- package/dist/optics/depth-of-field.d.ts.map +1 -1
- package/dist/optics/depth-of-field.js +29 -4
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +8 -0
- package/dist/optics/diffraction.d.ts.map +1 -1
- package/dist/optics/diffraction.js +8 -0
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +13 -0
- package/dist/optics/focus-breathing.d.ts.map +1 -1
- package/dist/optics/focus-breathing.js +13 -0
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +47 -0
- package/dist/optics/focus-state.d.ts.map +1 -0
- package/dist/optics/focus-state.js +78 -0
- package/dist/optics/focus-state.js.map +1 -0
- package/dist/optics/front-of-lens-filter.d.ts +114 -0
- package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
- package/dist/optics/front-of-lens-filter.js +468 -0
- package/dist/optics/front-of-lens-filter.js.map +1 -0
- package/dist/optics/illumination-vignetting.d.ts +9 -0
- package/dist/optics/illumination-vignetting.d.ts.map +1 -1
- package/dist/optics/illumination-vignetting.js +9 -0
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +11 -0
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +217 -0
- package/dist/optics/lens-psf-profile.d.ts.map +1 -0
- package/dist/optics/lens-psf-profile.js +823 -0
- package/dist/optics/lens-psf-profile.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +67 -0
- package/dist/optics/polygon-diffraction.d.ts.map +1 -0
- package/dist/optics/polygon-diffraction.js +145 -0
- package/dist/optics/polygon-diffraction.js.map +1 -0
- package/dist/optics/profile-contract.d.ts +42 -0
- package/dist/optics/profile-contract.d.ts.map +1 -0
- package/dist/optics/profile-contract.js +92 -0
- package/dist/optics/profile-contract.js.map +1 -0
- package/dist/optics/psf-foundation.d.ts +16 -3
- package/dist/optics/psf-foundation.d.ts.map +1 -1
- package/dist/optics/psf-foundation.js +28 -15
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +18 -0
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +18 -0
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-irradiance.js +662 -0
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.js +82 -0
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
- package/dist/optics/sensor-environment-query.d.ts +60 -0
- package/dist/optics/sensor-environment-query.d.ts.map +1 -0
- package/dist/optics/sensor-environment-query.js +50 -0
- package/dist/optics/sensor-environment-query.js.map +1 -0
- package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
- package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
- package/dist/optics/sensor-psf-quadrature.js +101 -0
- package/dist/optics/sensor-psf-quadrature.js.map +1 -0
- package/dist/optics/sensor-psf-support.d.ts +20 -0
- package/dist/optics/sensor-psf-support.d.ts.map +1 -0
- package/dist/optics/sensor-psf-support.js +13 -0
- package/dist/optics/sensor-psf-support.js.map +1 -0
- package/dist/optics/stray-light.d.ts +91 -0
- package/dist/optics/stray-light.d.ts.map +1 -0
- package/dist/optics/stray-light.js +110 -0
- package/dist/optics/stray-light.js.map +1 -0
- package/dist/optics/thin-lens.d.ts +8 -0
- package/dist/optics/thin-lens.d.ts.map +1 -1
- package/dist/optics/thin-lens.js +8 -0
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/output/capture-corrected-sdr.d.ts +49 -0
- package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
- package/dist/output/capture-corrected-sdr.js +149 -0
- package/dist/output/capture-corrected-sdr.js.map +1 -0
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +8 -0
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +49 -0
- package/dist/output/capture-sdr.d.ts.map +1 -0
- package/dist/output/capture-sdr.js +90 -0
- package/dist/output/capture-sdr.js.map +1 -0
- package/dist/output/crop.d.ts +6 -0
- package/dist/output/crop.d.ts.map +1 -1
- package/dist/output/crop.js +6 -0
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +137 -0
- package/dist/output/geometric-transforms.d.ts.map +1 -0
- package/dist/output/geometric-transforms.js +225 -0
- package/dist/output/geometric-transforms.js.map +1 -0
- package/dist/output/lens-corrections.d.ts +121 -0
- package/dist/output/lens-corrections.d.ts.map +1 -0
- package/dist/output/lens-corrections.js +210 -0
- package/dist/output/lens-corrections.js.map +1 -0
- package/dist/output/sdr-rendering.d.ts +81 -0
- package/dist/output/sdr-rendering.d.ts.map +1 -0
- package/dist/output/sdr-rendering.js +106 -0
- package/dist/output/sdr-rendering.js.map +1 -0
- package/dist/output/subject-framing-crop.d.ts +8 -0
- package/dist/output/subject-framing-crop.d.ts.map +1 -1
- package/dist/output/subject-framing-crop.js +8 -0
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/schema/camera.d.ts +6 -0
- package/dist/schema/camera.d.ts.map +1 -1
- package/dist/schema/illumination-spectral.d.ts +51 -0
- package/dist/schema/illumination-spectral.d.ts.map +1 -0
- package/dist/schema/illumination-spectral.js +132 -0
- package/dist/schema/illumination-spectral.js.map +1 -0
- package/dist/schema/illumination-temporal.d.ts +156 -0
- package/dist/schema/illumination-temporal.d.ts.map +1 -0
- package/dist/schema/illumination-temporal.js +554 -0
- package/dist/schema/illumination-temporal.js.map +1 -0
- package/dist/schema/illumination.d.ts +138 -0
- package/dist/schema/illumination.d.ts.map +1 -0
- package/dist/schema/illumination.js +483 -0
- package/dist/schema/illumination.js.map +1 -0
- package/dist/schema/scene-radiance-temporal.d.ts +107 -0
- package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
- package/dist/schema/scene-radiance-temporal.js +259 -0
- package/dist/schema/scene-radiance-temporal.js.map +1 -0
- package/dist/schema/scene-radiance.d.ts +185 -0
- package/dist/schema/scene-radiance.d.ts.map +1 -0
- package/dist/schema/scene-radiance.js +535 -0
- package/dist/schema/scene-radiance.js.map +1 -0
- package/dist/schema/scene.d.ts +7 -0
- package/dist/schema/scene.d.ts.map +1 -1
- package/dist/schema/validation.d.ts.map +1 -1
- package/dist/schema/validation.js +7 -0
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +199 -0
- package/dist/sensor/accumulated-charge.d.ts.map +1 -0
- package/dist/sensor/accumulated-charge.js +450 -0
- package/dist/sensor/accumulated-charge.js.map +1 -0
- package/dist/sensor/architecture.d.ts +48 -13
- package/dist/sensor/architecture.d.ts.map +1 -1
- package/dist/sensor/architecture.js +58 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
- package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
- package/dist/sensor/camera-saturation-capacity.js +356 -0
- package/dist/sensor/camera-saturation-capacity.js.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.js +14 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +63 -0
- package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
- package/dist/sensor/capture-mode-timing.js +270 -0
- package/dist/sensor/capture-mode-timing.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -1
- package/dist/sensor/capture-mode.js +13 -0
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts.map +1 -1
- package/dist/sensor/color-sampling.js +19 -0
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.js +382 -0
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
- package/dist/sensor/dark-current.d.ts +169 -0
- package/dist/sensor/dark-current.d.ts.map +1 -0
- package/dist/sensor/dark-current.js +427 -0
- package/dist/sensor/dark-current.js.map +1 -0
- package/dist/sensor/environment-photo-signal.d.ts +123 -0
- package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
- package/dist/sensor/environment-photo-signal.js +186 -0
- package/dist/sensor/environment-photo-signal.js.map +1 -0
- package/dist/sensor/eqe-electron-rate.d.ts +107 -0
- package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
- package/dist/sensor/eqe-electron-rate.js +561 -0
- package/dist/sensor/eqe-electron-rate.js.map +1 -0
- package/dist/sensor/eqe-local-exposure.d.ts +65 -0
- package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-local-exposure.js +84 -0
- package/dist/sensor/eqe-local-exposure.js.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.js +62 -0
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +14 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -1
- package/dist/sensor/exposure-window.js +14 -0
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/iso-signal-chain.d.ts +148 -0
- package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
- package/dist/sensor/iso-signal-chain.js +411 -0
- package/dist/sensor/iso-signal-chain.js.map +1 -0
- package/dist/sensor/local-exposure-binding.d.ts +87 -0
- package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
- package/dist/sensor/local-exposure-binding.js +214 -0
- package/dist/sensor/local-exposure-binding.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -1
- package/dist/sensor/optical-stack.js +17 -0
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +97 -0
- package/dist/sensor/photon-energy.d.ts.map +1 -0
- package/dist/sensor/photon-energy.js +390 -0
- package/dist/sensor/photon-energy.js.map +1 -0
- package/dist/sensor/physical-charge-capacity.d.ts +130 -0
- package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
- package/dist/sensor/physical-charge-capacity.js +345 -0
- package/dist/sensor/physical-charge-capacity.js.map +1 -0
- package/dist/sensor/pixel-pitch.d.ts +6 -0
- package/dist/sensor/pixel-pitch.d.ts.map +1 -1
- package/dist/sensor/pixel-pitch.js +6 -0
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +10 -0
- package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
- package/dist/sensor/radiometry-readiness.js +10 -0
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +314 -0
- package/dist/sensor/raw-readout.d.ts.map +1 -0
- package/dist/sensor/raw-readout.js +914 -0
- package/dist/sensor/raw-readout.js.map +1 -0
- package/dist/sensor/raw-reconstruction.d.ts +170 -0
- package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
- package/dist/sensor/raw-reconstruction.js +424 -0
- package/dist/sensor/raw-reconstruction.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +12 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
- package/dist/sensor/readout-exposure-linkage.js +12 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +13 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -1
- package/dist/sensor/readout-timing.js +13 -0
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +136 -0
- package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
- package/dist/sensor/response-application-compatibility.js +408 -0
- package/dist/sensor/response-application-compatibility.js.map +1 -0
- package/dist/sensor/response-operating-range.d.ts +173 -0
- package/dist/sensor/response-operating-range.d.ts.map +1 -0
- package/dist/sensor/response-operating-range.js +672 -0
- package/dist/sensor/response-operating-range.js.map +1 -0
- package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
- package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
- package/dist/sensor/responsivity-photocurrent.js +644 -0
- package/dist/sensor/responsivity-photocurrent.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -1
- package/dist/sensor/sampling-aperture.js +14 -0
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/sensor-geometry.d.ts +12 -0
- package/dist/sensor/sensor-geometry.d.ts.map +1 -1
- package/dist/sensor/sensor-geometry.js +12 -0
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +10 -0
- package/dist/sensor/signal-noise.d.ts.map +1 -1
- package/dist/sensor/signal-noise.js +10 -0
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +44 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
- package/dist/sensor/spatial-sample-reduction.js +51 -5
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.js +27 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.js +373 -0
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
- package/dist/sensor/spectral-coverage.d.ts +24 -0
- package/dist/sensor/spectral-coverage.d.ts.map +1 -0
- package/dist/sensor/spectral-coverage.js +86 -0
- package/dist/sensor/spectral-coverage.js.map +1 -0
- package/dist/sensor/spectral-quadrature.d.ts +169 -0
- package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
- package/dist/sensor/spectral-quadrature.js +542 -0
- package/dist/sensor/spectral-quadrature.js.map +1 -0
- package/dist/sensor/spectral-response.d.ts +192 -0
- package/dist/sensor/spectral-response.d.ts.map +1 -0
- package/dist/sensor/spectral-response.js +664 -0
- package/dist/sensor/spectral-response.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
- package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
- package/dist/sensor/temporal-eqe-sum.js +30 -0
- package/dist/sensor/temporal-eqe-sum.js.map +1 -0
- package/dist/sensor/temporal-photo-signal.d.ts +38 -0
- package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
- package/dist/sensor/temporal-photo-signal.js +110 -0
- package/dist/sensor/temporal-photo-signal.js.map +1 -0
- package/dist/sensor/temporal-sample-binding.d.ts +6 -0
- package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
- package/dist/sensor/temporal-sample-binding.js +32 -0
- package/dist/sensor/temporal-sample-binding.js.map +1 -0
- package/dist/simulation/poc-simulation.d.ts.map +1 -1
- package/dist/simulation/poc-simulation.js +34 -11
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +11 -0
- package/dist/stabilization/camera-shake.d.ts.map +1 -1
- package/dist/stabilization/camera-shake.js +11 -0
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +218 -0
- package/dist/stabilization/system.d.ts.map +1 -0
- package/dist/stabilization/system.js +695 -0
- package/dist/stabilization/system.js.map +1 -0
- package/docs/API_REFERENCE.md +2017 -0
- package/docs/API_STYLE.md +139 -3
- package/docs/ARCHITECTURE.md +134 -24
- package/docs/AUTOMATION_COORDINATION.md +2 -0
- package/docs/CAPTURE_COLOR.md +25 -0
- package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
- package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
- package/docs/CAPTURE_SDR.md +20 -0
- package/docs/DEVELOPERS.md +60 -0
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
- package/docs/EXPORT_ACCEPTANCE.md +133 -0
- package/docs/GENERIC_TIER_PRESETS.md +269 -0
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
- package/docs/IMAGE_FORMATION.md +80 -10
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +5 -3
- package/docs/NUMERICAL_CORRECTNESS.md +191 -0
- package/docs/PERFORMANCE_BASELINE.md +56 -0
- package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
- package/docs/PHYSICS_FOUNDATION.md +152 -5
- package/docs/POC_API.md +2 -0
- package/docs/POC_PROJECTION_REUSE.md +124 -0
- package/docs/PROCESSED_OUTPUT.md +157 -0
- package/docs/PRODUCTION_COMPOSITION.md +373 -0
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
- package/docs/PROVENANCE.md +4 -0
- package/docs/PSF_FOUNDATION.md +110 -88
- package/docs/RAW_FRAME_ENVELOPE.md +56 -0
- package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
- package/docs/RELEASE_1_0.md +66 -0
- package/docs/RELEASE_1_0_1.md +61 -0
- package/docs/RELEASE_AUDIT.md +39 -0
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
- package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
- package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
- package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
- package/docs/SDR_RENDERING.md +33 -0
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
- package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
- package/docs/SENSOR_RAW_FRAME.md +20 -0
- package/docs/SENSOR_RAW_PRODUCER.md +77 -0
- package/docs/SIGNAL_CONFORMANCE.md +23 -0
- package/docs/SIMULATED_CAPTURE.md +65 -0
- package/docs/STABILIZATION.md +160 -17
- package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
- package/docs/TIER_ACCEPTANCE.md +129 -0
- package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
- package/docs/USAGE.md +5050 -1047
- package/docs/V1_COMPOSITION_MAP.md +123 -0
- package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
- package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
- package/docs/api/camera-equivalent-focal-length.md +53 -0
- package/docs/api/camera-field-of-view.md +119 -0
- package/docs/api/camera-projected-object-size.md +54 -0
- package/docs/api/capture-capture-export-metadata.md +107 -0
- package/docs/api/capture-environment-raw-producer.md +56 -0
- package/docs/api/capture-focus-control.md +419 -0
- package/docs/api/capture-linear-encoding.md +99 -0
- package/docs/api/capture-photographic-export.md +172 -0
- package/docs/api/capture-raw-frame-reconstruction.md +87 -0
- package/docs/api/capture-release-sequence.md +252 -0
- package/docs/api/capture-sensor-raw-frame.md +66 -0
- package/docs/api/capture-sensor-raw-producer.md +98 -0
- package/docs/api/capture-simulated-capture.md +179 -0
- package/docs/api/color-capture-color.md +122 -0
- package/docs/api/color-white-balance.md +386 -0
- package/docs/api/composition-image-formation-plan.md +825 -0
- package/docs/api/composition-plan-consumer.md +98 -0
- package/docs/api/core-calculation-result.md +220 -0
- package/docs/api/core-configuration-error.md +19 -0
- package/docs/api/core-image-formation.md +204 -0
- package/docs/api/core-scientific-assurance.md +214 -0
- package/docs/api/core-spectral-composition.md +268 -0
- package/docs/api/core-spectral.md +78 -0
- package/docs/api/core-validation.md +34 -0
- package/docs/api/core-version.md +14 -0
- package/docs/api/equipment-exposure-capabilities.md +270 -0
- package/docs/api/equipment-generic-tier-assets.md +82 -0
- package/docs/api/equipment-generic-tier-presets.md +103 -0
- package/docs/api/equipment-iso-capabilities.md +295 -0
- package/docs/api/equipment-metering-capabilities.md +126 -0
- package/docs/api/equipment-release-capabilities.md +91 -0
- package/docs/api/exports.json +5656 -0
- package/docs/api/exposure-exposure-duration-control.md +115 -0
- package/docs/api/exposure-exposure-mode-resolver.md +966 -0
- package/docs/api/exposure-exposure.md +150 -0
- package/docs/api/exposure-flash.md +327 -0
- package/docs/api/exposure-metering-scene-radiance.md +154 -0
- package/docs/api/exposure-metering-target.md +134 -0
- package/docs/api/exposure-metering-temporal.md +77 -0
- package/docs/api/exposure-metering.md +172 -0
- package/docs/api/exposure-program-line.md +64 -0
- package/docs/api/motion-camera-rotation.md +215 -0
- package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
- package/docs/api/motion-capture-rotation-trajectory.md +132 -0
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
- package/docs/api/motion-extended-object-projection.md +312 -0
- package/docs/api/motion-projected-motion.md +60 -0
- package/docs/api/optics-aperture.md +69 -0
- package/docs/api/optics-circle-of-confusion.md +46 -0
- package/docs/api/optics-complex-pupil-psf.md +193 -0
- package/docs/api/optics-depth-of-field.md +92 -0
- package/docs/api/optics-diffraction.md +46 -0
- package/docs/api/optics-focus-breathing.md +119 -0
- package/docs/api/optics-focus-state.md +64 -0
- package/docs/api/optics-front-of-lens-filter.md +263 -0
- package/docs/api/optics-illumination-vignetting.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
- package/docs/api/optics-lens-psf-profile.md +380 -0
- package/docs/api/optics-polygon-diffraction.md +68 -0
- package/docs/api/optics-profile-contract.md +47 -0
- package/docs/api/optics-psf-foundation.md +181 -0
- package/docs/api/optics-radial-distortion.md +194 -0
- package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
- package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
- package/docs/api/optics-sensor-environment-query.md +58 -0
- package/docs/api/optics-sensor-psf-quadrature.md +81 -0
- package/docs/api/optics-stray-light.md +109 -0
- package/docs/api/optics-thin-lens.md +53 -0
- package/docs/api/output-capture-corrected-sdr.md +71 -0
- package/docs/api/output-capture-geometry.md +500 -0
- package/docs/api/output-capture-sdr.md +69 -0
- package/docs/api/output-crop.md +47 -0
- package/docs/api/output-geometric-transforms.md +199 -0
- package/docs/api/output-lens-corrections.md +162 -0
- package/docs/api/output-sdr-rendering.md +122 -0
- package/docs/api/output-subject-framing-crop.md +59 -0
- package/docs/api/schema-camera.md +84 -0
- package/docs/api/schema-illumination-spectral.md +77 -0
- package/docs/api/schema-illumination-temporal.md +289 -0
- package/docs/api/schema-illumination.md +246 -0
- package/docs/api/schema-scene-radiance-temporal.md +215 -0
- package/docs/api/schema-scene-radiance.md +415 -0
- package/docs/api/schema-scene.md +105 -0
- package/docs/api/schema-validation.md +25 -0
- package/docs/api/sensor-accumulated-charge.md +273 -0
- package/docs/api/sensor-architecture.md +155 -0
- package/docs/api/sensor-camera-saturation-capacity.md +215 -0
- package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
- package/docs/api/sensor-capture-mode-timing.md +123 -0
- package/docs/api/sensor-capture-mode.md +321 -0
- package/docs/api/sensor-color-sampling.md +228 -0
- package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
- package/docs/api/sensor-dark-current.md +227 -0
- package/docs/api/sensor-environment-photo-signal.md +77 -0
- package/docs/api/sensor-eqe-electron-rate.md +166 -0
- package/docs/api/sensor-eqe-local-exposure.md +68 -0
- package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
- package/docs/api/sensor-exposure-window.md +183 -0
- package/docs/api/sensor-iso-signal-chain.md +264 -0
- package/docs/api/sensor-local-exposure-binding.md +126 -0
- package/docs/api/sensor-optical-stack.md +211 -0
- package/docs/api/sensor-photon-energy.md +149 -0
- package/docs/api/sensor-physical-charge-capacity.md +196 -0
- package/docs/api/sensor-pixel-pitch.md +41 -0
- package/docs/api/sensor-radiometry-readiness.md +240 -0
- package/docs/api/sensor-raw-readout.md +499 -0
- package/docs/api/sensor-raw-reconstruction.md +260 -0
- package/docs/api/sensor-readout-exposure-linkage.md +172 -0
- package/docs/api/sensor-readout-timing.md +209 -0
- package/docs/api/sensor-response-application-compatibility.md +256 -0
- package/docs/api/sensor-response-operating-range.md +293 -0
- package/docs/api/sensor-responsivity-photocurrent.md +245 -0
- package/docs/api/sensor-sampling-aperture.md +221 -0
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
- package/docs/api/sensor-sensor-geometry.md +143 -0
- package/docs/api/sensor-signal-noise.md +75 -0
- package/docs/api/sensor-spatial-sample-reduction.md +186 -0
- package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
- package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
- package/docs/api/sensor-spectral-coverage.md +33 -0
- package/docs/api/sensor-spectral-quadrature.md +183 -0
- package/docs/api/sensor-spectral-response.md +291 -0
- package/docs/api/sensor-temporal-photo-signal.md +62 -0
- package/docs/api/simulation-poc-simulation.md +364 -0
- package/docs/api/stabilization-camera-shake.md +71 -0
- package/docs/api/stabilization-system.md +442 -0
- package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
- package/docs/examples/production-capture.mjs +34 -0
- package/docs/examples/production-request.json +4613 -0
- package/docs/examples/quick-start.mjs +12 -0
- package/docs/validation/documentation-fragments.json +212 -0
- package/docs/validation/release-audit-inventory.json +1306 -0
- package/docs/validation/tier-acceptance-report-v1.json +2538 -0
- package/package.json +15 -3
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
5
|
+
* missing required fields and incompatible scientific data fail at this boundary. Focus is a
|
|
6
|
+
* longitudinal plane or explicit infinity state, never a screen-space distance. The ideal actuator
|
|
7
|
+
* resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring scale or
|
|
8
|
+
* acquisition latency. Target loss, reacquisition, focus lock and release priority remain separate
|
|
9
|
+
* state transitions.
|
|
10
|
+
* Create the initial ideal focus-controller state from an explicit profile, focus plane and public
|
|
11
|
+
* state identity. Focus is a longitudinal plane or explicit infinity state, never a screen-space
|
|
12
|
+
* distance. The ideal actuator resolves supplied target observations; it does not infer a commercial
|
|
13
|
+
* AF sensor, focus-ring scale or acquisition latency. Target loss, reacquisition, focus lock and
|
|
14
|
+
* release priority remain separate state transitions.
|
|
15
|
+
* @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support
|
|
16
|
+
* limits.
|
|
17
|
+
*/
|
|
18
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
19
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
20
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
21
|
+
import { parseFocusPlane } from "../optics/focus-state.js";
|
|
22
|
+
export const FOCUS_CONTROL_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
23
|
+
export const FOCUS_CONTROL_STATE_VERSION = "0.1.0";
|
|
24
|
+
const FOCUS_MODES = new Set([
|
|
25
|
+
"manual",
|
|
26
|
+
"single-af",
|
|
27
|
+
"continuous-af"
|
|
28
|
+
]);
|
|
29
|
+
const RELEASE_PRIORITIES = new Set([
|
|
30
|
+
"focus-priority",
|
|
31
|
+
"release-priority",
|
|
32
|
+
"balanced"
|
|
33
|
+
]);
|
|
34
|
+
const TARGET_LOSS_REASONS = new Set([
|
|
35
|
+
"occluded",
|
|
36
|
+
"out-of-frame",
|
|
37
|
+
"identity-lost",
|
|
38
|
+
"outside-focus-area"
|
|
39
|
+
]);
|
|
40
|
+
function requireRecord(value, path) {
|
|
41
|
+
if (typeof value !== "object" ||
|
|
42
|
+
value === null ||
|
|
43
|
+
Array.isArray(value)) {
|
|
44
|
+
throw new InvalidConfigurationError(path + " must be an object.");
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function requireNonEmptyString(value, path) {
|
|
49
|
+
if (typeof value !== "string" ||
|
|
50
|
+
value.trim().length === 0) {
|
|
51
|
+
throw new InvalidConfigurationError(path +
|
|
52
|
+
" must be a non-empty string.");
|
|
53
|
+
}
|
|
54
|
+
return value.trim();
|
|
55
|
+
}
|
|
56
|
+
function requireScientificNonEmptyString(value, path) {
|
|
57
|
+
if (typeof value !== "string" ||
|
|
58
|
+
value.trim().length === 0) {
|
|
59
|
+
throw new InvalidScientificInputError(path +
|
|
60
|
+
" must be a non-empty string.");
|
|
61
|
+
}
|
|
62
|
+
return value.trim();
|
|
63
|
+
}
|
|
64
|
+
function requireScientificNonNegativeFinite(value, path) {
|
|
65
|
+
if (typeof value !== "number" ||
|
|
66
|
+
!Number.isFinite(value) ||
|
|
67
|
+
value < 0) {
|
|
68
|
+
throw new InvalidScientificInputError(path +
|
|
69
|
+
" must be finite and greater than or equal to zero.");
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
function requireScientificPositiveFinite(value, path) {
|
|
74
|
+
if (typeof value !== "number" ||
|
|
75
|
+
!Number.isFinite(value) ||
|
|
76
|
+
value <= 0) {
|
|
77
|
+
throw new InvalidScientificInputError(path +
|
|
78
|
+
" must be finite and greater than zero.");
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
function parseLimitations(value, path) {
|
|
83
|
+
if (!Array.isArray(value)) {
|
|
84
|
+
throw new InvalidConfigurationError(path + " must be an array.");
|
|
85
|
+
}
|
|
86
|
+
const parsed = value.map((entry, index) => requireNonEmptyString(entry, path +
|
|
87
|
+
"[" +
|
|
88
|
+
index +
|
|
89
|
+
"]"));
|
|
90
|
+
if (new Set(parsed).size !==
|
|
91
|
+
parsed.length) {
|
|
92
|
+
throw new InvalidConfigurationError(path +
|
|
93
|
+
" must not contain duplicates.");
|
|
94
|
+
}
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
function parseUniqueEnumList(value, path, allowed) {
|
|
98
|
+
if (!Array.isArray(value) ||
|
|
99
|
+
value.length === 0) {
|
|
100
|
+
throw new InvalidConfigurationError(path +
|
|
101
|
+
" must be a non-empty array.");
|
|
102
|
+
}
|
|
103
|
+
const parsed = value.map((entry, index) => {
|
|
104
|
+
if (typeof entry !==
|
|
105
|
+
"string" ||
|
|
106
|
+
!allowed.has(entry)) {
|
|
107
|
+
throw new InvalidConfigurationError(path +
|
|
108
|
+
"[" +
|
|
109
|
+
index +
|
|
110
|
+
"] is invalid.");
|
|
111
|
+
}
|
|
112
|
+
return entry;
|
|
113
|
+
});
|
|
114
|
+
if (new Set(parsed).size !==
|
|
115
|
+
parsed.length) {
|
|
116
|
+
throw new InvalidConfigurationError(path +
|
|
117
|
+
" must not contain duplicates.");
|
|
118
|
+
}
|
|
119
|
+
return parsed;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
123
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
124
|
+
*
|
|
125
|
+
* Focus is a longitudinal plane or explicit infinity state, never a screen-space distance. The ideal
|
|
126
|
+
* actuator resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring
|
|
127
|
+
* scale or acquisition latency. Target loss, reacquisition, focus lock and release priority remain
|
|
128
|
+
* separate state transitions.
|
|
129
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
130
|
+
* @returns FocusControlProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
131
|
+
*
|
|
132
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
133
|
+
*/
|
|
134
|
+
export function parseFocusControlProfile(value) {
|
|
135
|
+
const record = requireRecord(value, "focusControlProfile");
|
|
136
|
+
if (record.schemaVersion !==
|
|
137
|
+
FOCUS_CONTROL_PROFILE_SCHEMA_VERSION) {
|
|
138
|
+
throw new InvalidConfigurationError('focusControlProfile.schemaVersion must be "' +
|
|
139
|
+
FOCUS_CONTROL_PROFILE_SCHEMA_VERSION +
|
|
140
|
+
'".');
|
|
141
|
+
}
|
|
142
|
+
if (record.scientificStatus !==
|
|
143
|
+
"approximation") {
|
|
144
|
+
throw new InvalidConfigurationError('focusControlProfile.scientificStatus must be "approximation".');
|
|
145
|
+
}
|
|
146
|
+
const actuator = requireRecord(record.actuator, "focusControlProfile.actuator");
|
|
147
|
+
if (actuator.kind !==
|
|
148
|
+
"ideal-instantaneous") {
|
|
149
|
+
throw new InvalidConfigurationError('focusControlProfile.actuator.kind must be "ideal-instantaneous" in schema 0.1.0.');
|
|
150
|
+
}
|
|
151
|
+
if (record
|
|
152
|
+
.continuousTargetLossPolicy !==
|
|
153
|
+
"hold-last-focus-require-explicit-reacquisition") {
|
|
154
|
+
throw new InvalidConfigurationError('focusControlProfile.continuousTargetLossPolicy must be "hold-last-focus-require-explicit-reacquisition".');
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
schemaVersion: FOCUS_CONTROL_PROFILE_SCHEMA_VERSION,
|
|
158
|
+
profileId: requireNonEmptyString(record.profileId, "focusControlProfile.profileId"),
|
|
159
|
+
profileVersion: requireNonEmptyString(record.profileVersion, "focusControlProfile.profileVersion"),
|
|
160
|
+
scientificStatus: "approximation",
|
|
161
|
+
supportedModes: parseUniqueEnumList(record.supportedModes, "focusControlProfile.supportedModes", FOCUS_MODES),
|
|
162
|
+
actuator: {
|
|
163
|
+
kind: "ideal-instantaneous",
|
|
164
|
+
evidence: parseEvidenceList(actuator.evidence, "focusControlProfile.actuator.evidence")
|
|
165
|
+
},
|
|
166
|
+
continuousTargetLossPolicy: "hold-last-focus-require-explicit-reacquisition",
|
|
167
|
+
supportedReleasePriorities: parseUniqueEnumList(record
|
|
168
|
+
.supportedReleasePriorities, "focusControlProfile.supportedReleasePriorities", RELEASE_PRIORITIES),
|
|
169
|
+
evidence: parseEvidenceList(record.evidence, "focusControlProfile.evidence"),
|
|
170
|
+
limitations: parseLimitations(record.limitations, "focusControlProfile.limitations")
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function cloneJson(value) {
|
|
174
|
+
return JSON.parse(JSON.stringify(value));
|
|
175
|
+
}
|
|
176
|
+
function deepFreeze(value) {
|
|
177
|
+
if (typeof value !== "object" ||
|
|
178
|
+
value === null ||
|
|
179
|
+
Object.isFrozen(value)) {
|
|
180
|
+
return value;
|
|
181
|
+
}
|
|
182
|
+
Object.freeze(value);
|
|
183
|
+
for (const child of Object.values(value)) {
|
|
184
|
+
deepFreeze(child);
|
|
185
|
+
}
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
function immutableState(state) {
|
|
189
|
+
return deepFreeze(cloneJson(state));
|
|
190
|
+
}
|
|
191
|
+
function stateBase(stateId, profile, mode, focus, acquisitionState, eventTimeSeconds, focusResolvedAtSeconds, activeTargetId, activeFocusAreaId, lock) {
|
|
192
|
+
return immutableState({
|
|
193
|
+
version: FOCUS_CONTROL_STATE_VERSION,
|
|
194
|
+
stateId: requireScientificNonEmptyString(stateId, "stateId"),
|
|
195
|
+
sourceProfile: {
|
|
196
|
+
profileId: profile.profileId,
|
|
197
|
+
profileVersion: profile.profileVersion
|
|
198
|
+
},
|
|
199
|
+
profileLimitations: [
|
|
200
|
+
...profile.limitations
|
|
201
|
+
],
|
|
202
|
+
mode,
|
|
203
|
+
acquisitionState,
|
|
204
|
+
focus: parseFocusPlane(focus),
|
|
205
|
+
...(activeTargetId ===
|
|
206
|
+
undefined
|
|
207
|
+
? {}
|
|
208
|
+
: {
|
|
209
|
+
activeTargetId
|
|
210
|
+
}),
|
|
211
|
+
...(activeFocusAreaId ===
|
|
212
|
+
undefined
|
|
213
|
+
? {}
|
|
214
|
+
: {
|
|
215
|
+
activeFocusAreaId
|
|
216
|
+
}),
|
|
217
|
+
lastEventTimeSeconds: eventTimeSeconds,
|
|
218
|
+
focusResolvedAtSeconds,
|
|
219
|
+
locked: acquisitionState ===
|
|
220
|
+
"locked",
|
|
221
|
+
...(lock === undefined
|
|
222
|
+
? {}
|
|
223
|
+
: {
|
|
224
|
+
lock
|
|
225
|
+
}),
|
|
226
|
+
actuatorModel: "ideal-instantaneous",
|
|
227
|
+
continuousTargetLossPolicy: profile
|
|
228
|
+
.continuousTargetLossPolicy,
|
|
229
|
+
exposureModified: false,
|
|
230
|
+
meteringModified: false,
|
|
231
|
+
whiteBalanceModified: false,
|
|
232
|
+
subjectTrackingRecognitionModeled: false,
|
|
233
|
+
rendererCoordinatesConsumed: false,
|
|
234
|
+
limitations: [
|
|
235
|
+
...profile.limitations,
|
|
236
|
+
"Focus target observations use longitudinal camera-space/conjugate distance, not renderer ray length.",
|
|
237
|
+
"Ideal instantaneous focus actuation is an approximation and does not represent commercial AF speed, error, hunting, recognition, or low-light behavior.",
|
|
238
|
+
"Focus control does not modify exposure, metering, white balance, or scene illumination."
|
|
239
|
+
]
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function requireSupportedMode(profile, mode) {
|
|
243
|
+
if (!profile.supportedModes
|
|
244
|
+
.includes(mode)) {
|
|
245
|
+
throw new InvalidScientificInputError("Selected focus-control mode is not supported by the profile.");
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function requireMonotonicEventTime(current, eventTimeSeconds) {
|
|
249
|
+
const parsed = requireScientificNonNegativeFinite(eventTimeSeconds, "eventTimeSeconds");
|
|
250
|
+
if (parsed <
|
|
251
|
+
current.lastEventTimeSeconds) {
|
|
252
|
+
throw new InvalidScientificInputError("Focus-control event time must not move backward.");
|
|
253
|
+
}
|
|
254
|
+
return parsed;
|
|
255
|
+
}
|
|
256
|
+
function verifyStateProfile(state, profile) {
|
|
257
|
+
if (state.sourceProfile
|
|
258
|
+
.profileId !==
|
|
259
|
+
profile.profileId ||
|
|
260
|
+
state.sourceProfile
|
|
261
|
+
.profileVersion !==
|
|
262
|
+
profile.profileVersion) {
|
|
263
|
+
throw new InvalidScientificInputError("Focus-control state/profile identity does not match.");
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Create the initial ideal focus-controller state from an explicit profile, focus plane and public
|
|
268
|
+
* state identity.
|
|
269
|
+
*
|
|
270
|
+
* Focus is a longitudinal plane or explicit infinity state, never a screen-space distance. The ideal
|
|
271
|
+
* actuator resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring
|
|
272
|
+
* scale or acquisition latency. Target loss, reacquisition, focus lock and release priority remain
|
|
273
|
+
* separate state transitions.
|
|
274
|
+
* @param input - CreateFocusControlStateInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
275
|
+
* @returns FocusControlState. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
276
|
+
*
|
|
277
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
278
|
+
*/
|
|
279
|
+
export function createFocusControlState(input) {
|
|
280
|
+
const profile = parseFocusControlProfile(input.profile);
|
|
281
|
+
requireSupportedMode(profile, input.mode);
|
|
282
|
+
const time = input.initialTimeSeconds ===
|
|
283
|
+
undefined
|
|
284
|
+
? 0
|
|
285
|
+
: requireScientificNonNegativeFinite(input.initialTimeSeconds, "initialTimeSeconds");
|
|
286
|
+
return stateBase(input.stateId, profile, input.mode, input.initialFocus, "idle", time, time);
|
|
287
|
+
}
|
|
288
|
+
function stateProfileView(state) {
|
|
289
|
+
return {
|
|
290
|
+
schemaVersion: FOCUS_CONTROL_PROFILE_SCHEMA_VERSION,
|
|
291
|
+
profileId: state.sourceProfile
|
|
292
|
+
.profileId,
|
|
293
|
+
profileVersion: state.sourceProfile
|
|
294
|
+
.profileVersion,
|
|
295
|
+
scientificStatus: "approximation",
|
|
296
|
+
supportedModes: [
|
|
297
|
+
state.mode
|
|
298
|
+
],
|
|
299
|
+
actuator: {
|
|
300
|
+
kind: "ideal-instantaneous",
|
|
301
|
+
evidence: []
|
|
302
|
+
},
|
|
303
|
+
continuousTargetLossPolicy: state
|
|
304
|
+
.continuousTargetLossPolicy,
|
|
305
|
+
supportedReleasePriorities: [
|
|
306
|
+
"focus-priority",
|
|
307
|
+
"release-priority",
|
|
308
|
+
"balanced"
|
|
309
|
+
],
|
|
310
|
+
evidence: [],
|
|
311
|
+
limitations: state.profileLimitations
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Return a manual focus transition to the supplied finite/infinity plane without inventing a lens
|
|
316
|
+
* actuator or focus-ring conversion.
|
|
317
|
+
*
|
|
318
|
+
* Focus is a longitudinal plane or explicit infinity state, never a screen-space distance. The ideal
|
|
319
|
+
* actuator resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring
|
|
320
|
+
* scale or acquisition latency. Target loss, reacquisition, focus lock and release priority remain
|
|
321
|
+
* separate state transitions.
|
|
322
|
+
* @param input - SetManualFocusStateInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
323
|
+
* @returns FocusControlState. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
324
|
+
*
|
|
325
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
326
|
+
*/
|
|
327
|
+
export function setManualFocusState(input) {
|
|
328
|
+
if (input.state.mode !==
|
|
329
|
+
"manual") {
|
|
330
|
+
throw new InvalidScientificInputError("setManualFocusState requires manual focus mode.");
|
|
331
|
+
}
|
|
332
|
+
if (input.state.locked) {
|
|
333
|
+
throw new InvalidScientificInputError("Manual focus cannot change while focus lock is active.");
|
|
334
|
+
}
|
|
335
|
+
if (input.commandId !==
|
|
336
|
+
undefined) {
|
|
337
|
+
requireScientificNonEmptyString(input.commandId, "commandId");
|
|
338
|
+
}
|
|
339
|
+
const time = requireMonotonicEventTime(input.state, input.eventTimeSeconds);
|
|
340
|
+
return stateBase(input.stateId, stateProfileView(input.state), "manual", input.focus, "idle", time, time);
|
|
341
|
+
}
|
|
342
|
+
function parseObservation(observation) {
|
|
343
|
+
const targetId = requireScientificNonEmptyString(observation.targetId, "observation.targetId");
|
|
344
|
+
const observedAtSeconds = requireScientificNonNegativeFinite(observation
|
|
345
|
+
.observedAtSeconds, "observation.observedAtSeconds");
|
|
346
|
+
const focusAreaId = observation.focusAreaId ===
|
|
347
|
+
undefined
|
|
348
|
+
? undefined
|
|
349
|
+
: requireScientificNonEmptyString(observation.focusAreaId, "observation.focusAreaId");
|
|
350
|
+
if (observation.kind ===
|
|
351
|
+
"finite-surface") {
|
|
352
|
+
return {
|
|
353
|
+
kind: "finite-surface",
|
|
354
|
+
targetId,
|
|
355
|
+
...(focusAreaId ===
|
|
356
|
+
undefined
|
|
357
|
+
? {}
|
|
358
|
+
: {
|
|
359
|
+
focusAreaId
|
|
360
|
+
}),
|
|
361
|
+
observedAtSeconds,
|
|
362
|
+
longitudinalDistanceM: requireScientificPositiveFinite(observation
|
|
363
|
+
.longitudinalDistanceM, "observation.longitudinalDistanceM")
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
if (observation.kind ===
|
|
367
|
+
"infinity-environment") {
|
|
368
|
+
return {
|
|
369
|
+
kind: "infinity-environment",
|
|
370
|
+
targetId,
|
|
371
|
+
...(focusAreaId ===
|
|
372
|
+
undefined
|
|
373
|
+
? {}
|
|
374
|
+
: {
|
|
375
|
+
focusAreaId
|
|
376
|
+
}),
|
|
377
|
+
observedAtSeconds
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
if (observation.kind ===
|
|
381
|
+
"unavailable" &&
|
|
382
|
+
TARGET_LOSS_REASONS.has(observation.reason)) {
|
|
383
|
+
return {
|
|
384
|
+
kind: "unavailable",
|
|
385
|
+
targetId,
|
|
386
|
+
...(focusAreaId ===
|
|
387
|
+
undefined
|
|
388
|
+
? {}
|
|
389
|
+
: {
|
|
390
|
+
focusAreaId
|
|
391
|
+
}),
|
|
392
|
+
observedAtSeconds,
|
|
393
|
+
reason: observation.reason
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
throw new InvalidScientificInputError("observation.kind/reason is invalid.");
|
|
397
|
+
}
|
|
398
|
+
function focusFromObservation(observation) {
|
|
399
|
+
if (observation.kind ===
|
|
400
|
+
"infinity-environment") {
|
|
401
|
+
return {
|
|
402
|
+
kind: "infinity"
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
return {
|
|
406
|
+
kind: "finite",
|
|
407
|
+
distanceM: observation
|
|
408
|
+
.longitudinalDistanceM
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
function focusEquals(a, b) {
|
|
412
|
+
if (a.kind !== b.kind) {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
if (a.kind === "infinity" ||
|
|
416
|
+
b.kind === "infinity") {
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
return (a.distanceM ===
|
|
420
|
+
b.distanceM);
|
|
421
|
+
}
|
|
422
|
+
function stateFromResolvedTarget(input, observation) {
|
|
423
|
+
const focus = focusFromObservation(observation);
|
|
424
|
+
const state = stateBase(input.stateId, stateProfileView(input.state), input.state.mode, focus, "acquired", observation
|
|
425
|
+
.observedAtSeconds, observation
|
|
426
|
+
.observedAtSeconds, observation.targetId, observation.focusAreaId);
|
|
427
|
+
return {
|
|
428
|
+
state,
|
|
429
|
+
targetObservationApplied: true,
|
|
430
|
+
focusChanged: !focusEquals(input.state.focus, focus),
|
|
431
|
+
acquisitionEvent: input.event,
|
|
432
|
+
actuatorModel: "ideal-instantaneous",
|
|
433
|
+
silentRetargetingPerformed: false
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
function unchangedResolution(input) {
|
|
437
|
+
return {
|
|
438
|
+
state: input.state,
|
|
439
|
+
targetObservationApplied: false,
|
|
440
|
+
focusChanged: false,
|
|
441
|
+
acquisitionEvent: input.event,
|
|
442
|
+
actuatorModel: "ideal-instantaneous",
|
|
443
|
+
silentRetargetingPerformed: false
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Resolve an explicit available/lost target observation under the selected single/continuous AF
|
|
448
|
+
* policy, retaining acquisition and reacquisition disposition.
|
|
449
|
+
*
|
|
450
|
+
* Focus is a longitudinal plane or explicit infinity state, never a screen-space distance. The ideal
|
|
451
|
+
* actuator resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring
|
|
452
|
+
* scale or acquisition latency. Target loss, reacquisition, focus lock and release priority remain
|
|
453
|
+
* separate state transitions.
|
|
454
|
+
* @param input - ResolveFocusTargetObservationInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
455
|
+
* @returns FocusTargetResolution. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
456
|
+
*
|
|
457
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
458
|
+
*/
|
|
459
|
+
export function resolveFocusTargetObservation(input) {
|
|
460
|
+
if (input.event !== "acquire" &&
|
|
461
|
+
input.event !== "update") {
|
|
462
|
+
throw new InvalidScientificInputError('Focus target event must be "acquire" or "update".');
|
|
463
|
+
}
|
|
464
|
+
if (input.state.mode ===
|
|
465
|
+
"manual") {
|
|
466
|
+
throw new InvalidScientificInputError("Manual focus does not automatically consume autofocus target observations.");
|
|
467
|
+
}
|
|
468
|
+
const observation = parseObservation(input.observation);
|
|
469
|
+
requireMonotonicEventTime(input.state, observation
|
|
470
|
+
.observedAtSeconds);
|
|
471
|
+
if (input.state.locked) {
|
|
472
|
+
return unchangedResolution(input);
|
|
473
|
+
}
|
|
474
|
+
if (input.state.mode ===
|
|
475
|
+
"single-af") {
|
|
476
|
+
if (input.event ===
|
|
477
|
+
"update" &&
|
|
478
|
+
input.state
|
|
479
|
+
.acquisitionState ===
|
|
480
|
+
"acquired") {
|
|
481
|
+
return unchangedResolution(input);
|
|
482
|
+
}
|
|
483
|
+
if (input.event !==
|
|
484
|
+
"acquire") {
|
|
485
|
+
throw new InvalidScientificInputError("Single AF requires an explicit acquire event before target updates.");
|
|
486
|
+
}
|
|
487
|
+
if (observation.kind ===
|
|
488
|
+
"unavailable") {
|
|
489
|
+
const state = stateBase(input.stateId, stateProfileView(input.state), "single-af", input.state.focus, "target-lost", observation
|
|
490
|
+
.observedAtSeconds, input.state
|
|
491
|
+
.focusResolvedAtSeconds, observation.targetId, observation.focusAreaId);
|
|
492
|
+
return {
|
|
493
|
+
state,
|
|
494
|
+
targetObservationApplied: true,
|
|
495
|
+
focusChanged: false,
|
|
496
|
+
acquisitionEvent: input.event,
|
|
497
|
+
actuatorModel: "ideal-instantaneous",
|
|
498
|
+
silentRetargetingPerformed: false
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
return stateFromResolvedTarget(input, observation);
|
|
502
|
+
}
|
|
503
|
+
if (input.event ===
|
|
504
|
+
"update") {
|
|
505
|
+
if (input.state
|
|
506
|
+
.activeTargetId ===
|
|
507
|
+
undefined) {
|
|
508
|
+
throw new InvalidScientificInputError("Continuous AF requires an explicit acquire event before updates.");
|
|
509
|
+
}
|
|
510
|
+
if (observation.targetId !==
|
|
511
|
+
input.state
|
|
512
|
+
.activeTargetId) {
|
|
513
|
+
throw new InvalidScientificInputError("Continuous AF update targetId must match the active target; silent retargeting is not permitted.");
|
|
514
|
+
}
|
|
515
|
+
if (input.state
|
|
516
|
+
.acquisitionState ===
|
|
517
|
+
"target-lost") {
|
|
518
|
+
throw new InvalidScientificInputError("Continuous AF target loss requires an explicit acquire event before reacquisition.");
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
if (observation.kind ===
|
|
522
|
+
"unavailable") {
|
|
523
|
+
const state = stateBase(input.stateId, stateProfileView(input.state), "continuous-af", input.state.focus, "target-lost", observation
|
|
524
|
+
.observedAtSeconds, input.state
|
|
525
|
+
.focusResolvedAtSeconds, observation.targetId, observation.focusAreaId);
|
|
526
|
+
return {
|
|
527
|
+
state,
|
|
528
|
+
targetObservationApplied: true,
|
|
529
|
+
focusChanged: false,
|
|
530
|
+
acquisitionEvent: input.event,
|
|
531
|
+
actuatorModel: "ideal-instantaneous",
|
|
532
|
+
silentRetargetingPerformed: false
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
return stateFromResolvedTarget(input, observation);
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Return an explicit lock/unlock transition without changing the underlying physical focus plane.
|
|
539
|
+
*
|
|
540
|
+
* Focus is a longitudinal plane or explicit infinity state, never a screen-space distance. The ideal
|
|
541
|
+
* actuator resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring
|
|
542
|
+
* scale or acquisition latency. Target loss, reacquisition, focus lock and release priority remain
|
|
543
|
+
* separate state transitions.
|
|
544
|
+
* @param input - SetFocusLockInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
545
|
+
* @returns FocusControlState. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
546
|
+
*
|
|
547
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
548
|
+
*/
|
|
549
|
+
export function setFocusLock(input) {
|
|
550
|
+
const time = requireMonotonicEventTime(input.state, input.eventTimeSeconds);
|
|
551
|
+
if (input.locked) {
|
|
552
|
+
if (input.state.locked) {
|
|
553
|
+
return input.state;
|
|
554
|
+
}
|
|
555
|
+
return stateBase(input.stateId, stateProfileView(input.state), input.state.mode, input.state.focus, "locked", time, input.state
|
|
556
|
+
.focusResolvedAtSeconds, input.state
|
|
557
|
+
.activeTargetId, input.state
|
|
558
|
+
.activeFocusAreaId, {
|
|
559
|
+
lockedAtSeconds: time,
|
|
560
|
+
resumeAcquisitionState: input.state
|
|
561
|
+
.acquisitionState
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
if (!input.state.locked) {
|
|
565
|
+
return input.state;
|
|
566
|
+
}
|
|
567
|
+
const resume = input.state.lock
|
|
568
|
+
?.resumeAcquisitionState;
|
|
569
|
+
if (resume === undefined) {
|
|
570
|
+
throw new InvalidScientificInputError("Locked focus state is missing its resume acquisition state.");
|
|
571
|
+
}
|
|
572
|
+
return stateBase(input.stateId, stateProfileView(input.state), input.state.mode, input.state.focus, resume, time, input.state
|
|
573
|
+
.focusResolvedAtSeconds, input.state
|
|
574
|
+
.activeTargetId, input.state
|
|
575
|
+
.activeFocusAreaId);
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Report whether release may proceed under focus-priority or release-priority policy; this does not
|
|
579
|
+
* operate a shutter.
|
|
580
|
+
*
|
|
581
|
+
* Focus is a longitudinal plane or explicit infinity state, never a screen-space distance. The ideal
|
|
582
|
+
* actuator resolves supplied target observations; it does not infer a commercial AF sensor, focus-ring
|
|
583
|
+
* scale or acquisition latency. Target loss, reacquisition, focus lock and release priority remain
|
|
584
|
+
* separate state transitions.
|
|
585
|
+
* @param input - AssessFocusReleaseGateInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
586
|
+
* @returns FocusReleaseGateAssessment. Read structured blockers before consuming an authorization.
|
|
587
|
+
*
|
|
588
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
589
|
+
*/
|
|
590
|
+
export function assessFocusReleaseGate(input) {
|
|
591
|
+
const profile = parseFocusControlProfile(input.profile);
|
|
592
|
+
verifyStateProfile(input.state, profile);
|
|
593
|
+
if (!profile
|
|
594
|
+
.supportedReleasePriorities
|
|
595
|
+
.includes(input.priority)) {
|
|
596
|
+
throw new InvalidScientificInputError("Selected focus/release priority is not supported by the profile.");
|
|
597
|
+
}
|
|
598
|
+
if (input.priority ===
|
|
599
|
+
"release-priority") {
|
|
600
|
+
return {
|
|
601
|
+
priority: input.priority,
|
|
602
|
+
releaseAuthorized: true,
|
|
603
|
+
reason: "release-priority-bypasses-focus-gate",
|
|
604
|
+
requiresProfileSpecificBalancedPolicy: false,
|
|
605
|
+
opticalFocusModified: false,
|
|
606
|
+
exposureModified: false
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
if (input.priority ===
|
|
610
|
+
"balanced") {
|
|
611
|
+
return {
|
|
612
|
+
priority: input.priority,
|
|
613
|
+
releaseAuthorized: false,
|
|
614
|
+
reason: "balanced-policy-not-modeled",
|
|
615
|
+
requiresProfileSpecificBalancedPolicy: true,
|
|
616
|
+
opticalFocusModified: false,
|
|
617
|
+
exposureModified: false
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
if (input.state.mode ===
|
|
621
|
+
"manual") {
|
|
622
|
+
return {
|
|
623
|
+
priority: input.priority,
|
|
624
|
+
releaseAuthorized: true,
|
|
625
|
+
reason: "manual-focus-state",
|
|
626
|
+
requiresProfileSpecificBalancedPolicy: false,
|
|
627
|
+
opticalFocusModified: false,
|
|
628
|
+
exposureModified: false
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
if (input.state
|
|
632
|
+
.acquisitionState ===
|
|
633
|
+
"locked") {
|
|
634
|
+
return {
|
|
635
|
+
priority: input.priority,
|
|
636
|
+
releaseAuthorized: true,
|
|
637
|
+
reason: "focus-locked",
|
|
638
|
+
requiresProfileSpecificBalancedPolicy: false,
|
|
639
|
+
opticalFocusModified: false,
|
|
640
|
+
exposureModified: false
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
if (input.state
|
|
644
|
+
.acquisitionState ===
|
|
645
|
+
"acquired") {
|
|
646
|
+
return {
|
|
647
|
+
priority: input.priority,
|
|
648
|
+
releaseAuthorized: true,
|
|
649
|
+
reason: "focus-acquired",
|
|
650
|
+
requiresProfileSpecificBalancedPolicy: false,
|
|
651
|
+
opticalFocusModified: false,
|
|
652
|
+
exposureModified: false
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
return {
|
|
656
|
+
priority: input.priority,
|
|
657
|
+
releaseAuthorized: false,
|
|
658
|
+
reason: "focus-not-acquired",
|
|
659
|
+
requiresProfileSpecificBalancedPolicy: false,
|
|
660
|
+
opticalFocusModified: false,
|
|
661
|
+
exposureModified: false
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
//# sourceMappingURL=focus-control.js.map
|