@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.
Files changed (750) hide show
  1. package/AGENTS.md +674 -0
  2. package/CHANGELOG.md +191 -0
  3. package/CITATION.cff +1 -1
  4. package/CONTRIBUTING.md +76 -0
  5. package/DCO +33 -0
  6. package/NODE_SUPPORT.md +37 -0
  7. package/NOTICE +2 -0
  8. package/README.md +139 -72
  9. package/SECURITY.md +55 -0
  10. package/THIRD_PARTY.md +63 -0
  11. package/dist/camera/equivalent-focal-length.d.ts +9 -0
  12. package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
  13. package/dist/camera/equivalent-focal-length.js +9 -0
  14. package/dist/camera/equivalent-focal-length.js.map +1 -1
  15. package/dist/camera/field-of-view.d.ts +13 -0
  16. package/dist/camera/field-of-view.d.ts.map +1 -1
  17. package/dist/camera/field-of-view.js +13 -0
  18. package/dist/camera/field-of-view.js.map +1 -1
  19. package/dist/camera/projected-object-size.d.ts +8 -0
  20. package/dist/camera/projected-object-size.d.ts.map +1 -1
  21. package/dist/camera/projected-object-size.js +8 -0
  22. package/dist/camera/projected-object-size.js.map +1 -1
  23. package/dist/capture/capture-export-metadata.d.ts +60 -0
  24. package/dist/capture/capture-export-metadata.d.ts.map +1 -0
  25. package/dist/capture/capture-export-metadata.js +62 -0
  26. package/dist/capture/capture-export-metadata.js.map +1 -0
  27. package/dist/capture/environment-raw-producer.d.ts +55 -0
  28. package/dist/capture/environment-raw-producer.d.ts.map +1 -0
  29. package/dist/capture/environment-raw-producer.js +88 -0
  30. package/dist/capture/environment-raw-producer.js.map +1 -0
  31. package/dist/capture/export-jpeg.d.ts +12 -0
  32. package/dist/capture/export-jpeg.d.ts.map +1 -0
  33. package/dist/capture/export-jpeg.js +126 -0
  34. package/dist/capture/export-jpeg.js.map +1 -0
  35. package/dist/capture/export-tiff.d.ts +45 -0
  36. package/dist/capture/export-tiff.d.ts.map +1 -0
  37. package/dist/capture/export-tiff.js +129 -0
  38. package/dist/capture/export-tiff.js.map +1 -0
  39. package/dist/capture/focus-control.d.ts +210 -0
  40. package/dist/capture/focus-control.d.ts.map +1 -0
  41. package/dist/capture/focus-control.js +664 -0
  42. package/dist/capture/focus-control.js.map +1 -0
  43. package/dist/capture/linear-encoding.d.ts +59 -0
  44. package/dist/capture/linear-encoding.d.ts.map +1 -0
  45. package/dist/capture/linear-encoding.js +98 -0
  46. package/dist/capture/linear-encoding.js.map +1 -0
  47. package/dist/capture/photographic-export.d.ts +135 -0
  48. package/dist/capture/photographic-export.d.ts.map +1 -0
  49. package/dist/capture/photographic-export.js +273 -0
  50. package/dist/capture/photographic-export.js.map +1 -0
  51. package/dist/capture/raw-frame-limits.d.ts +12 -0
  52. package/dist/capture/raw-frame-limits.d.ts.map +1 -0
  53. package/dist/capture/raw-frame-limits.js +13 -0
  54. package/dist/capture/raw-frame-limits.js.map +1 -0
  55. package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
  56. package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
  57. package/dist/capture/raw-frame-reconstruction.js +146 -0
  58. package/dist/capture/raw-frame-reconstruction.js.map +1 -0
  59. package/dist/capture/release-sequence.d.ts +120 -0
  60. package/dist/capture/release-sequence.d.ts.map +1 -0
  61. package/dist/capture/release-sequence.js +446 -0
  62. package/dist/capture/release-sequence.js.map +1 -0
  63. package/dist/capture/sensor-raw-frame.d.ts +34 -0
  64. package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
  65. package/dist/capture/sensor-raw-frame.js +106 -0
  66. package/dist/capture/sensor-raw-frame.js.map +1 -0
  67. package/dist/capture/sensor-raw-producer.d.ts +51 -0
  68. package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
  69. package/dist/capture/sensor-raw-producer.js +235 -0
  70. package/dist/capture/sensor-raw-producer.js.map +1 -0
  71. package/dist/capture/simulated-capture.d.ts +125 -0
  72. package/dist/capture/simulated-capture.d.ts.map +1 -0
  73. package/dist/capture/simulated-capture.js +248 -0
  74. package/dist/capture/simulated-capture.js.map +1 -0
  75. package/dist/color/capture-color.d.ts +73 -0
  76. package/dist/color/capture-color.d.ts.map +1 -0
  77. package/dist/color/capture-color.js +145 -0
  78. package/dist/color/capture-color.js.map +1 -0
  79. package/dist/color/sensor-color-development.d.ts +23 -0
  80. package/dist/color/sensor-color-development.d.ts.map +1 -0
  81. package/dist/color/sensor-color-development.js +56 -0
  82. package/dist/color/sensor-color-development.js.map +1 -0
  83. package/dist/color/white-balance.d.ts +175 -0
  84. package/dist/color/white-balance.d.ts.map +1 -0
  85. package/dist/color/white-balance.js +606 -0
  86. package/dist/color/white-balance.js.map +1 -0
  87. package/dist/composition/image-formation-plan.d.ts +481 -0
  88. package/dist/composition/image-formation-plan.d.ts.map +1 -0
  89. package/dist/composition/image-formation-plan.js +2499 -0
  90. package/dist/composition/image-formation-plan.js.map +1 -0
  91. package/dist/composition/plan-consumer.d.ts +53 -0
  92. package/dist/composition/plan-consumer.d.ts.map +1 -0
  93. package/dist/composition/plan-consumer.js +119 -0
  94. package/dist/composition/plan-consumer.js.map +1 -0
  95. package/dist/core/calculation-result.d.ts.map +1 -1
  96. package/dist/core/calculation-result.js +6 -0
  97. package/dist/core/calculation-result.js.map +1 -1
  98. package/dist/core/canonical-json.d.ts +18 -0
  99. package/dist/core/canonical-json.d.ts.map +1 -0
  100. package/dist/core/canonical-json.js +44 -0
  101. package/dist/core/canonical-json.js.map +1 -0
  102. package/dist/core/configuration-error.d.ts +6 -0
  103. package/dist/core/configuration-error.d.ts.map +1 -1
  104. package/dist/core/configuration-error.js +6 -0
  105. package/dist/core/configuration-error.js.map +1 -1
  106. package/dist/core/evidence-provenance.d.ts +6 -0
  107. package/dist/core/evidence-provenance.d.ts.map +1 -1
  108. package/dist/core/evidence-provenance.js +7 -0
  109. package/dist/core/evidence-provenance.js.map +1 -1
  110. package/dist/core/image-formation.d.ts +9 -3
  111. package/dist/core/image-formation.d.ts.map +1 -1
  112. package/dist/core/image-formation.js +29 -5
  113. package/dist/core/image-formation.js.map +1 -1
  114. package/dist/core/owned-data.d.ts +25 -0
  115. package/dist/core/owned-data.d.ts.map +1 -0
  116. package/dist/core/owned-data.js +34 -0
  117. package/dist/core/owned-data.js.map +1 -0
  118. package/dist/core/record-validation.d.ts +17 -0
  119. package/dist/core/record-validation.d.ts.map +1 -0
  120. package/dist/core/record-validation.js +44 -0
  121. package/dist/core/record-validation.js.map +1 -0
  122. package/dist/core/scientific-assurance.d.ts +101 -0
  123. package/dist/core/scientific-assurance.d.ts.map +1 -0
  124. package/dist/core/scientific-assurance.js +301 -0
  125. package/dist/core/scientific-assurance.js.map +1 -0
  126. package/dist/core/spectral-composition.d.ts +106 -0
  127. package/dist/core/spectral-composition.d.ts.map +1 -0
  128. package/dist/core/spectral-composition.js +334 -0
  129. package/dist/core/spectral-composition.js.map +1 -0
  130. package/dist/core/spectral.d.ts +34 -0
  131. package/dist/core/spectral.d.ts.map +1 -0
  132. package/dist/core/spectral.js +57 -0
  133. package/dist/core/spectral.js.map +1 -0
  134. package/dist/core/validation.d.ts +6 -0
  135. package/dist/core/validation.d.ts.map +1 -1
  136. package/dist/core/validation.js +6 -0
  137. package/dist/core/validation.js.map +1 -1
  138. package/dist/core/version.d.ts +9 -0
  139. package/dist/core/version.d.ts.map +1 -0
  140. package/dist/core/version.js +10 -0
  141. package/dist/core/version.js.map +1 -0
  142. package/dist/equipment/exposure-capabilities.d.ts +125 -0
  143. package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
  144. package/dist/equipment/exposure-capabilities.js +391 -0
  145. package/dist/equipment/exposure-capabilities.js.map +1 -0
  146. package/dist/equipment/generic-tier-assets.d.ts +82 -0
  147. package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
  148. package/dist/equipment/generic-tier-assets.js +119 -0
  149. package/dist/equipment/generic-tier-assets.js.map +1 -0
  150. package/dist/equipment/generic-tier-presets.d.ts +57 -0
  151. package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
  152. package/dist/equipment/generic-tier-presets.js +122 -0
  153. package/dist/equipment/generic-tier-presets.js.map +1 -0
  154. package/dist/equipment/iso-capabilities.d.ts +143 -0
  155. package/dist/equipment/iso-capabilities.d.ts.map +1 -0
  156. package/dist/equipment/iso-capabilities.js +578 -0
  157. package/dist/equipment/iso-capabilities.js.map +1 -0
  158. package/dist/equipment/metering-capabilities.d.ts +58 -0
  159. package/dist/equipment/metering-capabilities.d.ts.map +1 -0
  160. package/dist/equipment/metering-capabilities.js +151 -0
  161. package/dist/equipment/metering-capabilities.js.map +1 -0
  162. package/dist/equipment/release-capabilities.d.ts +33 -0
  163. package/dist/equipment/release-capabilities.d.ts.map +1 -0
  164. package/dist/equipment/release-capabilities.js +176 -0
  165. package/dist/equipment/release-capabilities.js.map +1 -0
  166. package/dist/exposure/exposure-duration-control.d.ts +72 -0
  167. package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
  168. package/dist/exposure/exposure-duration-control.js +161 -0
  169. package/dist/exposure/exposure-duration-control.js.map +1 -0
  170. package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
  171. package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
  172. package/dist/exposure/exposure-mode-resolver.js +1905 -0
  173. package/dist/exposure/exposure-mode-resolver.js.map +1 -0
  174. package/dist/exposure/exposure.d.ts +8 -0
  175. package/dist/exposure/exposure.d.ts.map +1 -1
  176. package/dist/exposure/exposure.js +8 -0
  177. package/dist/exposure/exposure.js.map +1 -1
  178. package/dist/exposure/flash.d.ts +179 -0
  179. package/dist/exposure/flash.d.ts.map +1 -0
  180. package/dist/exposure/flash.js +644 -0
  181. package/dist/exposure/flash.js.map +1 -0
  182. package/dist/exposure/metering-scene-radiance.d.ts +72 -0
  183. package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
  184. package/dist/exposure/metering-scene-radiance.js +222 -0
  185. package/dist/exposure/metering-scene-radiance.js.map +1 -0
  186. package/dist/exposure/metering-target.d.ts +67 -0
  187. package/dist/exposure/metering-target.d.ts.map +1 -0
  188. package/dist/exposure/metering-target.js +265 -0
  189. package/dist/exposure/metering-target.js.map +1 -0
  190. package/dist/exposure/metering-temporal.d.ts +76 -0
  191. package/dist/exposure/metering-temporal.d.ts.map +1 -0
  192. package/dist/exposure/metering-temporal.js +210 -0
  193. package/dist/exposure/metering-temporal.js.map +1 -0
  194. package/dist/exposure/metering.d.ts +124 -0
  195. package/dist/exposure/metering.d.ts.map +1 -0
  196. package/dist/exposure/metering.js +422 -0
  197. package/dist/exposure/metering.js.map +1 -0
  198. package/dist/exposure/program-line.d.ts +29 -0
  199. package/dist/exposure/program-line.d.ts.map +1 -0
  200. package/dist/exposure/program-line.js +126 -0
  201. package/dist/exposure/program-line.js.map +1 -0
  202. package/dist/index.d.ts +87 -6
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +85 -6
  205. package/dist/index.js.map +1 -1
  206. package/dist/motion/camera-rotation.d.ts +16 -0
  207. package/dist/motion/camera-rotation.d.ts.map +1 -1
  208. package/dist/motion/camera-rotation.js +16 -0
  209. package/dist/motion/camera-rotation.js.map +1 -1
  210. package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
  211. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
  212. package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
  213. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  214. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
  215. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
  216. package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
  217. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  218. package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
  219. package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
  220. package/dist/motion/capture-rotation-trajectory.js +15 -0
  221. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  222. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
  223. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
  224. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
  225. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
  226. package/dist/motion/extended-object-projection.d.ts +175 -0
  227. package/dist/motion/extended-object-projection.d.ts.map +1 -0
  228. package/dist/motion/extended-object-projection.js +402 -0
  229. package/dist/motion/extended-object-projection.js.map +1 -0
  230. package/dist/motion/projected-motion.d.ts +11 -0
  231. package/dist/motion/projected-motion.d.ts.map +1 -1
  232. package/dist/motion/projected-motion.js +11 -0
  233. package/dist/motion/projected-motion.js.map +1 -1
  234. package/dist/optics/aperture.d.ts +9 -0
  235. package/dist/optics/aperture.d.ts.map +1 -1
  236. package/dist/optics/aperture.js +9 -0
  237. package/dist/optics/aperture.js.map +1 -1
  238. package/dist/optics/circle-of-confusion.d.ts +8 -0
  239. package/dist/optics/circle-of-confusion.d.ts.map +1 -1
  240. package/dist/optics/circle-of-confusion.js +8 -0
  241. package/dist/optics/circle-of-confusion.js.map +1 -1
  242. package/dist/optics/complex-pupil-psf.d.ts +128 -0
  243. package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
  244. package/dist/optics/complex-pupil-psf.js +462 -0
  245. package/dist/optics/complex-pupil-psf.js.map +1 -0
  246. package/dist/optics/depth-of-field.d.ts +18 -0
  247. package/dist/optics/depth-of-field.d.ts.map +1 -1
  248. package/dist/optics/depth-of-field.js +29 -4
  249. package/dist/optics/depth-of-field.js.map +1 -1
  250. package/dist/optics/diffraction.d.ts +8 -0
  251. package/dist/optics/diffraction.d.ts.map +1 -1
  252. package/dist/optics/diffraction.js +8 -0
  253. package/dist/optics/diffraction.js.map +1 -1
  254. package/dist/optics/focus-breathing.d.ts +13 -0
  255. package/dist/optics/focus-breathing.d.ts.map +1 -1
  256. package/dist/optics/focus-breathing.js +13 -0
  257. package/dist/optics/focus-breathing.js.map +1 -1
  258. package/dist/optics/focus-state.d.ts +47 -0
  259. package/dist/optics/focus-state.d.ts.map +1 -0
  260. package/dist/optics/focus-state.js +78 -0
  261. package/dist/optics/focus-state.js.map +1 -0
  262. package/dist/optics/front-of-lens-filter.d.ts +114 -0
  263. package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
  264. package/dist/optics/front-of-lens-filter.js +468 -0
  265. package/dist/optics/front-of-lens-filter.js.map +1 -0
  266. package/dist/optics/illumination-vignetting.d.ts +9 -0
  267. package/dist/optics/illumination-vignetting.d.ts.map +1 -1
  268. package/dist/optics/illumination-vignetting.js +9 -0
  269. package/dist/optics/illumination-vignetting.js.map +1 -1
  270. package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
  271. package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
  272. package/dist/optics/lateral-chromatic-aberration.js +11 -0
  273. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  274. package/dist/optics/lens-psf-profile.d.ts +217 -0
  275. package/dist/optics/lens-psf-profile.d.ts.map +1 -0
  276. package/dist/optics/lens-psf-profile.js +823 -0
  277. package/dist/optics/lens-psf-profile.js.map +1 -0
  278. package/dist/optics/polygon-diffraction.d.ts +67 -0
  279. package/dist/optics/polygon-diffraction.d.ts.map +1 -0
  280. package/dist/optics/polygon-diffraction.js +145 -0
  281. package/dist/optics/polygon-diffraction.js.map +1 -0
  282. package/dist/optics/profile-contract.d.ts +42 -0
  283. package/dist/optics/profile-contract.d.ts.map +1 -0
  284. package/dist/optics/profile-contract.js +92 -0
  285. package/dist/optics/profile-contract.js.map +1 -0
  286. package/dist/optics/psf-foundation.d.ts +16 -3
  287. package/dist/optics/psf-foundation.d.ts.map +1 -1
  288. package/dist/optics/psf-foundation.js +28 -15
  289. package/dist/optics/psf-foundation.js.map +1 -1
  290. package/dist/optics/radial-distortion.d.ts +18 -0
  291. package/dist/optics/radial-distortion.d.ts.map +1 -1
  292. package/dist/optics/radial-distortion.js +18 -0
  293. package/dist/optics/radial-distortion.js.map +1 -1
  294. package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
  295. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
  296. package/dist/optics/scene-to-sensor-irradiance.js +662 -0
  297. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
  298. package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
  299. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
  300. package/dist/optics/scene-to-sensor-quadrature.js +82 -0
  301. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
  302. package/dist/optics/sensor-environment-query.d.ts +60 -0
  303. package/dist/optics/sensor-environment-query.d.ts.map +1 -0
  304. package/dist/optics/sensor-environment-query.js +50 -0
  305. package/dist/optics/sensor-environment-query.js.map +1 -0
  306. package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
  307. package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
  308. package/dist/optics/sensor-psf-quadrature.js +101 -0
  309. package/dist/optics/sensor-psf-quadrature.js.map +1 -0
  310. package/dist/optics/sensor-psf-support.d.ts +20 -0
  311. package/dist/optics/sensor-psf-support.d.ts.map +1 -0
  312. package/dist/optics/sensor-psf-support.js +13 -0
  313. package/dist/optics/sensor-psf-support.js.map +1 -0
  314. package/dist/optics/stray-light.d.ts +91 -0
  315. package/dist/optics/stray-light.d.ts.map +1 -0
  316. package/dist/optics/stray-light.js +110 -0
  317. package/dist/optics/stray-light.js.map +1 -0
  318. package/dist/optics/thin-lens.d.ts +8 -0
  319. package/dist/optics/thin-lens.d.ts.map +1 -1
  320. package/dist/optics/thin-lens.js +8 -0
  321. package/dist/optics/thin-lens.js.map +1 -1
  322. package/dist/output/capture-corrected-sdr.d.ts +49 -0
  323. package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
  324. package/dist/output/capture-corrected-sdr.js +149 -0
  325. package/dist/output/capture-corrected-sdr.js.map +1 -0
  326. package/dist/output/capture-geometry.d.ts.map +1 -1
  327. package/dist/output/capture-geometry.js +8 -0
  328. package/dist/output/capture-geometry.js.map +1 -1
  329. package/dist/output/capture-sdr.d.ts +49 -0
  330. package/dist/output/capture-sdr.d.ts.map +1 -0
  331. package/dist/output/capture-sdr.js +90 -0
  332. package/dist/output/capture-sdr.js.map +1 -0
  333. package/dist/output/crop.d.ts +6 -0
  334. package/dist/output/crop.d.ts.map +1 -1
  335. package/dist/output/crop.js +6 -0
  336. package/dist/output/crop.js.map +1 -1
  337. package/dist/output/geometric-transforms.d.ts +137 -0
  338. package/dist/output/geometric-transforms.d.ts.map +1 -0
  339. package/dist/output/geometric-transforms.js +225 -0
  340. package/dist/output/geometric-transforms.js.map +1 -0
  341. package/dist/output/lens-corrections.d.ts +121 -0
  342. package/dist/output/lens-corrections.d.ts.map +1 -0
  343. package/dist/output/lens-corrections.js +210 -0
  344. package/dist/output/lens-corrections.js.map +1 -0
  345. package/dist/output/sdr-rendering.d.ts +81 -0
  346. package/dist/output/sdr-rendering.d.ts.map +1 -0
  347. package/dist/output/sdr-rendering.js +106 -0
  348. package/dist/output/sdr-rendering.js.map +1 -0
  349. package/dist/output/subject-framing-crop.d.ts +8 -0
  350. package/dist/output/subject-framing-crop.d.ts.map +1 -1
  351. package/dist/output/subject-framing-crop.js +8 -0
  352. package/dist/output/subject-framing-crop.js.map +1 -1
  353. package/dist/schema/camera.d.ts +6 -0
  354. package/dist/schema/camera.d.ts.map +1 -1
  355. package/dist/schema/illumination-spectral.d.ts +51 -0
  356. package/dist/schema/illumination-spectral.d.ts.map +1 -0
  357. package/dist/schema/illumination-spectral.js +132 -0
  358. package/dist/schema/illumination-spectral.js.map +1 -0
  359. package/dist/schema/illumination-temporal.d.ts +156 -0
  360. package/dist/schema/illumination-temporal.d.ts.map +1 -0
  361. package/dist/schema/illumination-temporal.js +554 -0
  362. package/dist/schema/illumination-temporal.js.map +1 -0
  363. package/dist/schema/illumination.d.ts +138 -0
  364. package/dist/schema/illumination.d.ts.map +1 -0
  365. package/dist/schema/illumination.js +483 -0
  366. package/dist/schema/illumination.js.map +1 -0
  367. package/dist/schema/scene-radiance-temporal.d.ts +107 -0
  368. package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
  369. package/dist/schema/scene-radiance-temporal.js +259 -0
  370. package/dist/schema/scene-radiance-temporal.js.map +1 -0
  371. package/dist/schema/scene-radiance.d.ts +185 -0
  372. package/dist/schema/scene-radiance.d.ts.map +1 -0
  373. package/dist/schema/scene-radiance.js +535 -0
  374. package/dist/schema/scene-radiance.js.map +1 -0
  375. package/dist/schema/scene.d.ts +7 -0
  376. package/dist/schema/scene.d.ts.map +1 -1
  377. package/dist/schema/validation.d.ts.map +1 -1
  378. package/dist/schema/validation.js +7 -0
  379. package/dist/schema/validation.js.map +1 -1
  380. package/dist/sensor/accumulated-charge.d.ts +199 -0
  381. package/dist/sensor/accumulated-charge.d.ts.map +1 -0
  382. package/dist/sensor/accumulated-charge.js +450 -0
  383. package/dist/sensor/accumulated-charge.js.map +1 -0
  384. package/dist/sensor/architecture.d.ts +48 -13
  385. package/dist/sensor/architecture.d.ts.map +1 -1
  386. package/dist/sensor/architecture.js +58 -16
  387. package/dist/sensor/architecture.js.map +1 -1
  388. package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
  389. package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
  390. package/dist/sensor/camera-saturation-capacity.js +356 -0
  391. package/dist/sensor/camera-saturation-capacity.js.map +1 -0
  392. package/dist/sensor/capture-color-sampling-binding.d.ts +1 -0
  393. package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
  394. package/dist/sensor/capture-color-sampling-binding.js +14 -0
  395. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  396. package/dist/sensor/capture-mode-timing.d.ts +63 -0
  397. package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
  398. package/dist/sensor/capture-mode-timing.js +270 -0
  399. package/dist/sensor/capture-mode-timing.js.map +1 -0
  400. package/dist/sensor/capture-mode.d.ts.map +1 -1
  401. package/dist/sensor/capture-mode.js +13 -0
  402. package/dist/sensor/capture-mode.js.map +1 -1
  403. package/dist/sensor/color-sampling.d.ts.map +1 -1
  404. package/dist/sensor/color-sampling.js +19 -0
  405. package/dist/sensor/color-sampling.js.map +1 -1
  406. package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
  407. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
  408. package/dist/sensor/constant-rate-temporal-integration.js +382 -0
  409. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
  410. package/dist/sensor/dark-current.d.ts +169 -0
  411. package/dist/sensor/dark-current.d.ts.map +1 -0
  412. package/dist/sensor/dark-current.js +427 -0
  413. package/dist/sensor/dark-current.js.map +1 -0
  414. package/dist/sensor/environment-photo-signal.d.ts +123 -0
  415. package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
  416. package/dist/sensor/environment-photo-signal.js +186 -0
  417. package/dist/sensor/environment-photo-signal.js.map +1 -0
  418. package/dist/sensor/eqe-electron-rate.d.ts +107 -0
  419. package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
  420. package/dist/sensor/eqe-electron-rate.js +561 -0
  421. package/dist/sensor/eqe-electron-rate.js.map +1 -0
  422. package/dist/sensor/eqe-local-exposure.d.ts +65 -0
  423. package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
  424. package/dist/sensor/eqe-local-exposure.js +84 -0
  425. package/dist/sensor/eqe-local-exposure.js.map +1 -0
  426. package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
  427. package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
  428. package/dist/sensor/eqe-temporal-exposure.js +62 -0
  429. package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
  430. package/dist/sensor/exposure-window.d.ts +14 -0
  431. package/dist/sensor/exposure-window.d.ts.map +1 -1
  432. package/dist/sensor/exposure-window.js +14 -0
  433. package/dist/sensor/exposure-window.js.map +1 -1
  434. package/dist/sensor/iso-signal-chain.d.ts +148 -0
  435. package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
  436. package/dist/sensor/iso-signal-chain.js +411 -0
  437. package/dist/sensor/iso-signal-chain.js.map +1 -0
  438. package/dist/sensor/local-exposure-binding.d.ts +87 -0
  439. package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
  440. package/dist/sensor/local-exposure-binding.js +214 -0
  441. package/dist/sensor/local-exposure-binding.js.map +1 -0
  442. package/dist/sensor/optical-stack.d.ts.map +1 -1
  443. package/dist/sensor/optical-stack.js +17 -0
  444. package/dist/sensor/optical-stack.js.map +1 -1
  445. package/dist/sensor/photon-energy.d.ts +97 -0
  446. package/dist/sensor/photon-energy.d.ts.map +1 -0
  447. package/dist/sensor/photon-energy.js +390 -0
  448. package/dist/sensor/photon-energy.js.map +1 -0
  449. package/dist/sensor/physical-charge-capacity.d.ts +130 -0
  450. package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
  451. package/dist/sensor/physical-charge-capacity.js +345 -0
  452. package/dist/sensor/physical-charge-capacity.js.map +1 -0
  453. package/dist/sensor/pixel-pitch.d.ts +6 -0
  454. package/dist/sensor/pixel-pitch.d.ts.map +1 -1
  455. package/dist/sensor/pixel-pitch.js +6 -0
  456. package/dist/sensor/pixel-pitch.js.map +1 -1
  457. package/dist/sensor/radiometry-readiness.d.ts +10 -0
  458. package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
  459. package/dist/sensor/radiometry-readiness.js +10 -0
  460. package/dist/sensor/radiometry-readiness.js.map +1 -1
  461. package/dist/sensor/raw-readout.d.ts +314 -0
  462. package/dist/sensor/raw-readout.d.ts.map +1 -0
  463. package/dist/sensor/raw-readout.js +914 -0
  464. package/dist/sensor/raw-readout.js.map +1 -0
  465. package/dist/sensor/raw-reconstruction.d.ts +170 -0
  466. package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
  467. package/dist/sensor/raw-reconstruction.js +424 -0
  468. package/dist/sensor/raw-reconstruction.js.map +1 -0
  469. package/dist/sensor/readout-exposure-linkage.d.ts +12 -0
  470. package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
  471. package/dist/sensor/readout-exposure-linkage.js +12 -0
  472. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  473. package/dist/sensor/readout-timing.d.ts +13 -0
  474. package/dist/sensor/readout-timing.d.ts.map +1 -1
  475. package/dist/sensor/readout-timing.js +13 -0
  476. package/dist/sensor/readout-timing.js.map +1 -1
  477. package/dist/sensor/response-application-compatibility.d.ts +136 -0
  478. package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
  479. package/dist/sensor/response-application-compatibility.js +408 -0
  480. package/dist/sensor/response-application-compatibility.js.map +1 -0
  481. package/dist/sensor/response-operating-range.d.ts +173 -0
  482. package/dist/sensor/response-operating-range.d.ts.map +1 -0
  483. package/dist/sensor/response-operating-range.js +672 -0
  484. package/dist/sensor/response-operating-range.js.map +1 -0
  485. package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
  486. package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
  487. package/dist/sensor/responsivity-photocurrent.js +644 -0
  488. package/dist/sensor/responsivity-photocurrent.js.map +1 -0
  489. package/dist/sensor/sampling-aperture.d.ts.map +1 -1
  490. package/dist/sensor/sampling-aperture.js +14 -0
  491. package/dist/sensor/sampling-aperture.js.map +1 -1
  492. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
  493. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
  494. package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
  495. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
  496. package/dist/sensor/sensor-geometry.d.ts +12 -0
  497. package/dist/sensor/sensor-geometry.d.ts.map +1 -1
  498. package/dist/sensor/sensor-geometry.js +12 -0
  499. package/dist/sensor/sensor-geometry.js.map +1 -1
  500. package/dist/sensor/signal-noise.d.ts +10 -0
  501. package/dist/sensor/signal-noise.d.ts.map +1 -1
  502. package/dist/sensor/signal-noise.js +10 -0
  503. package/dist/sensor/signal-noise.js.map +1 -1
  504. package/dist/sensor/spatial-sample-reduction.d.ts +44 -1
  505. package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
  506. package/dist/sensor/spatial-sample-reduction.js +51 -5
  507. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  508. package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
  509. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
  510. package/dist/sensor/spatial-sampling-quadrature.js +27 -0
  511. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  512. package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
  513. package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
  514. package/dist/sensor/spatio-spectral-reduction.js +373 -0
  515. package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
  516. package/dist/sensor/spectral-coverage.d.ts +24 -0
  517. package/dist/sensor/spectral-coverage.d.ts.map +1 -0
  518. package/dist/sensor/spectral-coverage.js +86 -0
  519. package/dist/sensor/spectral-coverage.js.map +1 -0
  520. package/dist/sensor/spectral-quadrature.d.ts +169 -0
  521. package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
  522. package/dist/sensor/spectral-quadrature.js +542 -0
  523. package/dist/sensor/spectral-quadrature.js.map +1 -0
  524. package/dist/sensor/spectral-response.d.ts +192 -0
  525. package/dist/sensor/spectral-response.d.ts.map +1 -0
  526. package/dist/sensor/spectral-response.js +664 -0
  527. package/dist/sensor/spectral-response.js.map +1 -0
  528. package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
  529. package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
  530. package/dist/sensor/temporal-eqe-sum.js +30 -0
  531. package/dist/sensor/temporal-eqe-sum.js.map +1 -0
  532. package/dist/sensor/temporal-photo-signal.d.ts +38 -0
  533. package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
  534. package/dist/sensor/temporal-photo-signal.js +110 -0
  535. package/dist/sensor/temporal-photo-signal.js.map +1 -0
  536. package/dist/sensor/temporal-sample-binding.d.ts +6 -0
  537. package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
  538. package/dist/sensor/temporal-sample-binding.js +32 -0
  539. package/dist/sensor/temporal-sample-binding.js.map +1 -0
  540. package/dist/simulation/poc-simulation.d.ts.map +1 -1
  541. package/dist/simulation/poc-simulation.js +34 -11
  542. package/dist/simulation/poc-simulation.js.map +1 -1
  543. package/dist/stabilization/camera-shake.d.ts +11 -0
  544. package/dist/stabilization/camera-shake.d.ts.map +1 -1
  545. package/dist/stabilization/camera-shake.js +11 -0
  546. package/dist/stabilization/camera-shake.js.map +1 -1
  547. package/dist/stabilization/system.d.ts +218 -0
  548. package/dist/stabilization/system.d.ts.map +1 -0
  549. package/dist/stabilization/system.js +695 -0
  550. package/dist/stabilization/system.js.map +1 -0
  551. package/docs/API_REFERENCE.md +2017 -0
  552. package/docs/API_STYLE.md +139 -3
  553. package/docs/ARCHITECTURE.md +134 -24
  554. package/docs/AUTOMATION_COORDINATION.md +2 -0
  555. package/docs/CAPTURE_COLOR.md +25 -0
  556. package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
  557. package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
  558. package/docs/CAPTURE_SDR.md +20 -0
  559. package/docs/DEVELOPERS.md +60 -0
  560. package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
  561. package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
  562. package/docs/EXPORT_ACCEPTANCE.md +133 -0
  563. package/docs/GENERIC_TIER_PRESETS.md +269 -0
  564. package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
  565. package/docs/IMAGE_FORMATION.md +80 -10
  566. package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
  567. package/docs/MOTION_AND_SIGNAL.md +5 -3
  568. package/docs/NUMERICAL_CORRECTNESS.md +191 -0
  569. package/docs/PERFORMANCE_BASELINE.md +56 -0
  570. package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
  571. package/docs/PHYSICS_FOUNDATION.md +152 -5
  572. package/docs/POC_API.md +2 -0
  573. package/docs/POC_PROJECTION_REUSE.md +124 -0
  574. package/docs/PROCESSED_OUTPUT.md +157 -0
  575. package/docs/PRODUCTION_COMPOSITION.md +373 -0
  576. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
  577. package/docs/PROVENANCE.md +4 -0
  578. package/docs/PSF_FOUNDATION.md +110 -88
  579. package/docs/RAW_FRAME_ENVELOPE.md +56 -0
  580. package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
  581. package/docs/RELEASE_1_0.md +66 -0
  582. package/docs/RELEASE_1_0_1.md +61 -0
  583. package/docs/RELEASE_AUDIT.md +39 -0
  584. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
  585. package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
  586. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
  587. package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
  588. package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
  589. package/docs/SDR_RENDERING.md +33 -0
  590. package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
  591. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
  592. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
  593. package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
  594. package/docs/SENSOR_RAW_FRAME.md +20 -0
  595. package/docs/SENSOR_RAW_PRODUCER.md +77 -0
  596. package/docs/SIGNAL_CONFORMANCE.md +23 -0
  597. package/docs/SIMULATED_CAPTURE.md +65 -0
  598. package/docs/STABILIZATION.md +160 -17
  599. package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
  600. package/docs/TIER_ACCEPTANCE.md +129 -0
  601. package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
  602. package/docs/USAGE.md +5050 -1047
  603. package/docs/V1_COMPOSITION_MAP.md +123 -0
  604. package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
  605. package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
  606. package/docs/api/camera-equivalent-focal-length.md +53 -0
  607. package/docs/api/camera-field-of-view.md +119 -0
  608. package/docs/api/camera-projected-object-size.md +54 -0
  609. package/docs/api/capture-capture-export-metadata.md +107 -0
  610. package/docs/api/capture-environment-raw-producer.md +56 -0
  611. package/docs/api/capture-focus-control.md +419 -0
  612. package/docs/api/capture-linear-encoding.md +99 -0
  613. package/docs/api/capture-photographic-export.md +172 -0
  614. package/docs/api/capture-raw-frame-reconstruction.md +87 -0
  615. package/docs/api/capture-release-sequence.md +252 -0
  616. package/docs/api/capture-sensor-raw-frame.md +66 -0
  617. package/docs/api/capture-sensor-raw-producer.md +98 -0
  618. package/docs/api/capture-simulated-capture.md +179 -0
  619. package/docs/api/color-capture-color.md +122 -0
  620. package/docs/api/color-white-balance.md +386 -0
  621. package/docs/api/composition-image-formation-plan.md +825 -0
  622. package/docs/api/composition-plan-consumer.md +98 -0
  623. package/docs/api/core-calculation-result.md +220 -0
  624. package/docs/api/core-configuration-error.md +19 -0
  625. package/docs/api/core-image-formation.md +204 -0
  626. package/docs/api/core-scientific-assurance.md +214 -0
  627. package/docs/api/core-spectral-composition.md +268 -0
  628. package/docs/api/core-spectral.md +78 -0
  629. package/docs/api/core-validation.md +34 -0
  630. package/docs/api/core-version.md +14 -0
  631. package/docs/api/equipment-exposure-capabilities.md +270 -0
  632. package/docs/api/equipment-generic-tier-assets.md +82 -0
  633. package/docs/api/equipment-generic-tier-presets.md +103 -0
  634. package/docs/api/equipment-iso-capabilities.md +295 -0
  635. package/docs/api/equipment-metering-capabilities.md +126 -0
  636. package/docs/api/equipment-release-capabilities.md +91 -0
  637. package/docs/api/exports.json +5656 -0
  638. package/docs/api/exposure-exposure-duration-control.md +115 -0
  639. package/docs/api/exposure-exposure-mode-resolver.md +966 -0
  640. package/docs/api/exposure-exposure.md +150 -0
  641. package/docs/api/exposure-flash.md +327 -0
  642. package/docs/api/exposure-metering-scene-radiance.md +154 -0
  643. package/docs/api/exposure-metering-target.md +134 -0
  644. package/docs/api/exposure-metering-temporal.md +77 -0
  645. package/docs/api/exposure-metering.md +172 -0
  646. package/docs/api/exposure-program-line.md +64 -0
  647. package/docs/api/motion-camera-rotation.md +215 -0
  648. package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
  649. package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
  650. package/docs/api/motion-capture-rotation-trajectory.md +132 -0
  651. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
  652. package/docs/api/motion-extended-object-projection.md +312 -0
  653. package/docs/api/motion-projected-motion.md +60 -0
  654. package/docs/api/optics-aperture.md +69 -0
  655. package/docs/api/optics-circle-of-confusion.md +46 -0
  656. package/docs/api/optics-complex-pupil-psf.md +193 -0
  657. package/docs/api/optics-depth-of-field.md +92 -0
  658. package/docs/api/optics-diffraction.md +46 -0
  659. package/docs/api/optics-focus-breathing.md +119 -0
  660. package/docs/api/optics-focus-state.md +64 -0
  661. package/docs/api/optics-front-of-lens-filter.md +263 -0
  662. package/docs/api/optics-illumination-vignetting.md +95 -0
  663. package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
  664. package/docs/api/optics-lens-psf-profile.md +380 -0
  665. package/docs/api/optics-polygon-diffraction.md +68 -0
  666. package/docs/api/optics-profile-contract.md +47 -0
  667. package/docs/api/optics-psf-foundation.md +181 -0
  668. package/docs/api/optics-radial-distortion.md +194 -0
  669. package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
  670. package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
  671. package/docs/api/optics-sensor-environment-query.md +58 -0
  672. package/docs/api/optics-sensor-psf-quadrature.md +81 -0
  673. package/docs/api/optics-stray-light.md +109 -0
  674. package/docs/api/optics-thin-lens.md +53 -0
  675. package/docs/api/output-capture-corrected-sdr.md +71 -0
  676. package/docs/api/output-capture-geometry.md +500 -0
  677. package/docs/api/output-capture-sdr.md +69 -0
  678. package/docs/api/output-crop.md +47 -0
  679. package/docs/api/output-geometric-transforms.md +199 -0
  680. package/docs/api/output-lens-corrections.md +162 -0
  681. package/docs/api/output-sdr-rendering.md +122 -0
  682. package/docs/api/output-subject-framing-crop.md +59 -0
  683. package/docs/api/schema-camera.md +84 -0
  684. package/docs/api/schema-illumination-spectral.md +77 -0
  685. package/docs/api/schema-illumination-temporal.md +289 -0
  686. package/docs/api/schema-illumination.md +246 -0
  687. package/docs/api/schema-scene-radiance-temporal.md +215 -0
  688. package/docs/api/schema-scene-radiance.md +415 -0
  689. package/docs/api/schema-scene.md +105 -0
  690. package/docs/api/schema-validation.md +25 -0
  691. package/docs/api/sensor-accumulated-charge.md +273 -0
  692. package/docs/api/sensor-architecture.md +155 -0
  693. package/docs/api/sensor-camera-saturation-capacity.md +215 -0
  694. package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
  695. package/docs/api/sensor-capture-mode-timing.md +123 -0
  696. package/docs/api/sensor-capture-mode.md +321 -0
  697. package/docs/api/sensor-color-sampling.md +228 -0
  698. package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
  699. package/docs/api/sensor-dark-current.md +227 -0
  700. package/docs/api/sensor-environment-photo-signal.md +77 -0
  701. package/docs/api/sensor-eqe-electron-rate.md +166 -0
  702. package/docs/api/sensor-eqe-local-exposure.md +68 -0
  703. package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
  704. package/docs/api/sensor-exposure-window.md +183 -0
  705. package/docs/api/sensor-iso-signal-chain.md +264 -0
  706. package/docs/api/sensor-local-exposure-binding.md +126 -0
  707. package/docs/api/sensor-optical-stack.md +211 -0
  708. package/docs/api/sensor-photon-energy.md +149 -0
  709. package/docs/api/sensor-physical-charge-capacity.md +196 -0
  710. package/docs/api/sensor-pixel-pitch.md +41 -0
  711. package/docs/api/sensor-radiometry-readiness.md +240 -0
  712. package/docs/api/sensor-raw-readout.md +499 -0
  713. package/docs/api/sensor-raw-reconstruction.md +260 -0
  714. package/docs/api/sensor-readout-exposure-linkage.md +172 -0
  715. package/docs/api/sensor-readout-timing.md +209 -0
  716. package/docs/api/sensor-response-application-compatibility.md +256 -0
  717. package/docs/api/sensor-response-operating-range.md +293 -0
  718. package/docs/api/sensor-responsivity-photocurrent.md +245 -0
  719. package/docs/api/sensor-sampling-aperture.md +221 -0
  720. package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
  721. package/docs/api/sensor-sensor-geometry.md +143 -0
  722. package/docs/api/sensor-signal-noise.md +75 -0
  723. package/docs/api/sensor-spatial-sample-reduction.md +186 -0
  724. package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
  725. package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
  726. package/docs/api/sensor-spectral-coverage.md +33 -0
  727. package/docs/api/sensor-spectral-quadrature.md +183 -0
  728. package/docs/api/sensor-spectral-response.md +291 -0
  729. package/docs/api/sensor-temporal-photo-signal.md +62 -0
  730. package/docs/api/simulation-poc-simulation.md +364 -0
  731. package/docs/api/stabilization-camera-shake.md +71 -0
  732. package/docs/api/stabilization-system.md +442 -0
  733. package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
  734. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
  735. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
  736. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
  737. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
  738. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
  739. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
  740. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
  741. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
  742. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
  743. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
  744. package/docs/examples/production-capture.mjs +34 -0
  745. package/docs/examples/production-request.json +4613 -0
  746. package/docs/examples/quick-start.mjs +12 -0
  747. package/docs/validation/documentation-fragments.json +212 -0
  748. package/docs/validation/release-audit-inventory.json +1306 -0
  749. package/docs/validation/tier-acceptance-report-v1.json +2538 -0
  750. package/package.json +15 -3
@@ -0,0 +1,695 @@
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. Generic
6
+ * stabilization evaluates declared angular disturbance with per-axis response, latency, limits and
7
+ * panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
8
+ * calibration, arbitrary stop rating or inferred coordination is supplied.
9
+ * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
10
+ * missing required fields and incompatible scientific data fail at this boundary. Generic
11
+ * stabilization evaluates declared angular disturbance with per-axis response, latency, limits and
12
+ * panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
13
+ * calibration, arbitrary stop rating or inferred coordination is supplied.
14
+ * @see docs/STABILIZATION.md for equations, coordinate/unit conventions, blockers and support limits.
15
+ */
16
+ import { approximationResult } from "../core/calculation-result.js";
17
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
18
+ import { parseEvidenceList } from "../core/evidence-provenance.js";
19
+ import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
20
+ export const STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION = "0.1.0";
21
+ export const STABILIZATION_DISTURBANCE_TRAJECTORY_VERSION = "0.1.0";
22
+ const AXES = new Set([
23
+ "pitch",
24
+ "yaw",
25
+ "roll"
26
+ ]);
27
+ const ARCHITECTURES = new Set([
28
+ "off",
29
+ "sensor-shift",
30
+ "lens-optical",
31
+ "coordinated-physical"
32
+ ]);
33
+ const CAPTURE_KINDS = new Set([
34
+ "still",
35
+ "video"
36
+ ]);
37
+ function requireRecord(value, path) {
38
+ if (typeof value !== "object" ||
39
+ value === null ||
40
+ Array.isArray(value)) {
41
+ throw new InvalidConfigurationError(path + " must be an object.");
42
+ }
43
+ return value;
44
+ }
45
+ function requireNonEmptyString(value, path) {
46
+ if (typeof value !== "string" ||
47
+ value.trim().length === 0) {
48
+ throw new InvalidConfigurationError(path +
49
+ " must be a non-empty string.");
50
+ }
51
+ return value.trim();
52
+ }
53
+ function requireFinite(value, path) {
54
+ if (typeof value !== "number" ||
55
+ !Number.isFinite(value)) {
56
+ throw new InvalidConfigurationError(path + " must be finite.");
57
+ }
58
+ return value;
59
+ }
60
+ function requireNonNegativeFinite(value, path) {
61
+ const parsed = requireFinite(value, path);
62
+ if (parsed < 0) {
63
+ throw new InvalidConfigurationError(path +
64
+ " must be greater than or equal to zero.");
65
+ }
66
+ return parsed;
67
+ }
68
+ function requirePositiveFinite(value, path) {
69
+ const parsed = requireFinite(value, path);
70
+ if (parsed <= 0) {
71
+ throw new InvalidConfigurationError(path +
72
+ " must be greater than zero.");
73
+ }
74
+ return parsed;
75
+ }
76
+ function requireFraction(value, path) {
77
+ const parsed = requireFinite(value, path);
78
+ if (parsed < 0 ||
79
+ parsed > 1) {
80
+ throw new InvalidConfigurationError(path +
81
+ " must lie from zero through one.");
82
+ }
83
+ return parsed;
84
+ }
85
+ function parseLimitations(value, path) {
86
+ if (!Array.isArray(value)) {
87
+ throw new InvalidConfigurationError(path + " must be an array.");
88
+ }
89
+ const parsed = value.map((entry, index) => requireNonEmptyString(entry, path +
90
+ "[" +
91
+ index +
92
+ "]"));
93
+ if (new Set(parsed).size !==
94
+ parsed.length) {
95
+ throw new InvalidConfigurationError(path +
96
+ " must not contain duplicates.");
97
+ }
98
+ return parsed;
99
+ }
100
+ function parseFractionFact(value, path) {
101
+ const record = requireRecord(value, path);
102
+ return {
103
+ value: requireFraction(record.value, path + ".value"),
104
+ evidence: parseEvidenceList(record.evidence, path + ".evidence")
105
+ };
106
+ }
107
+ function parseNonNegativeFact(value, path) {
108
+ const record = requireRecord(value, path);
109
+ return {
110
+ value: requireNonNegativeFinite(record.value, path + ".value"),
111
+ evidence: parseEvidenceList(record.evidence, path + ".evidence")
112
+ };
113
+ }
114
+ function parsePositiveFact(value, path) {
115
+ const record = requireRecord(value, path);
116
+ return {
117
+ value: requirePositiveFinite(record.value, path + ".value"),
118
+ evidence: parseEvidenceList(record.evidence, path + ".evidence")
119
+ };
120
+ }
121
+ function parseAxis(value, path) {
122
+ if (typeof value !== "string" ||
123
+ !AXES.has(value)) {
124
+ throw new InvalidConfigurationError(path + " is invalid.");
125
+ }
126
+ return value;
127
+ }
128
+ function parseAxisResponse(value, path) {
129
+ const record = requireRecord(value, path);
130
+ return {
131
+ axis: parseAxis(record.axis, path + ".axis"),
132
+ correctionGain: parseFractionFact(record.correctionGain, path +
133
+ ".correctionGain"),
134
+ latencySeconds: parseNonNegativeFact(record.latencySeconds, path +
135
+ ".latencySeconds"),
136
+ maximumCorrectionAngleRad: parsePositiveFact(record
137
+ .maximumCorrectionAngleRad, path +
138
+ ".maximumCorrectionAngleRad")
139
+ };
140
+ }
141
+ function parsePanningPolicy(value, path) {
142
+ const record = requireRecord(value, path);
143
+ if (record.kind === "none") {
144
+ return {
145
+ kind: "none"
146
+ };
147
+ }
148
+ if (record.kind ===
149
+ "declared-axis-bypass") {
150
+ return {
151
+ kind: "declared-axis-bypass",
152
+ axis: parseAxis(record.axis, path + ".axis"),
153
+ evidence: parseEvidenceList(record.evidence, path + ".evidence")
154
+ };
155
+ }
156
+ throw new InvalidConfigurationError(path + ".kind is invalid.");
157
+ }
158
+ function parseCoordinatedAllocation(value, path) {
159
+ const record = requireRecord(value, path);
160
+ if (record
161
+ .totalCorrectionAppliedOnce !==
162
+ true) {
163
+ throw new InvalidConfigurationError(path +
164
+ ".totalCorrectionAppliedOnce must be true.");
165
+ }
166
+ const bodyFraction = requireFraction(record.bodyFraction, path + ".bodyFraction");
167
+ const lensFraction = requireFraction(record.lensFraction, path + ".lensFraction");
168
+ if (Math.abs(bodyFraction +
169
+ lensFraction -
170
+ 1) >
171
+ 1e-12) {
172
+ throw new InvalidConfigurationError(path +
173
+ " bodyFraction + lensFraction must equal one.");
174
+ }
175
+ return {
176
+ bodyFraction,
177
+ lensFraction,
178
+ evidence: parseEvidenceList(record.evidence, path + ".evidence"),
179
+ totalCorrectionAppliedOnce: true
180
+ };
181
+ }
182
+ /**
183
+ * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
184
+ * missing required fields and incompatible scientific data fail at this boundary.
185
+ *
186
+ * Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
187
+ * and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
188
+ * calibration, arbitrary stop rating or inferred coordination is supplied.
189
+ * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
190
+ * @returns StabilizationSystemProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
191
+ *
192
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
193
+ */
194
+ export function parseStabilizationSystemProfile(value) {
195
+ const record = requireRecord(value, "stabilizationSystemProfile");
196
+ if (record.schemaVersion !==
197
+ STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION) {
198
+ throw new InvalidConfigurationError('stabilizationSystemProfile.schemaVersion must be "' +
199
+ STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION +
200
+ '".');
201
+ }
202
+ if (record.profileKind !==
203
+ "generic-synthetic" ||
204
+ record.scientificStatus !==
205
+ "approximation") {
206
+ throw new InvalidConfigurationError('stabilizationSystemProfile schema 0.1.0 requires profileKind "generic-synthetic" and scientificStatus "approximation".');
207
+ }
208
+ if (typeof record.architecture !==
209
+ "string" ||
210
+ !ARCHITECTURES.has(record.architecture)) {
211
+ throw new InvalidConfigurationError("stabilizationSystemProfile.architecture is invalid.");
212
+ }
213
+ if (typeof record.captureKind !==
214
+ "string" ||
215
+ !CAPTURE_KINDS.has(record.captureKind)) {
216
+ throw new InvalidConfigurationError("stabilizationSystemProfile.captureKind is invalid.");
217
+ }
218
+ for (const key of [
219
+ "controlTransientModeled",
220
+ "spontaneousDriftModeled",
221
+ "cameraTranslationCorrectionModeled",
222
+ "digitalStabilizationIncluded",
223
+ "supportPolicyIncluded",
224
+ "stopRatingUsedAsDynamicResponse"
225
+ ]) {
226
+ if (record[key] !== false) {
227
+ throw new InvalidConfigurationError("stabilizationSystemProfile." +
228
+ key +
229
+ " must be false in schema 0.1.0.");
230
+ }
231
+ }
232
+ if (!Array.isArray(record.axisResponses)) {
233
+ throw new InvalidConfigurationError("stabilizationSystemProfile.axisResponses must be an array.");
234
+ }
235
+ const axisResponses = record.axisResponses.map((entry, index) => parseAxisResponse(entry, "stabilizationSystemProfile.axisResponses[" +
236
+ index +
237
+ "]"));
238
+ const axes = axisResponses.map((entry) => entry.axis);
239
+ if (new Set(axes).size !==
240
+ axes.length) {
241
+ throw new InvalidConfigurationError("stabilizationSystemProfile.axisResponses must not contain duplicate axes.");
242
+ }
243
+ const architecture = record.architecture;
244
+ if (architecture === "off" &&
245
+ axisResponses.length !== 0) {
246
+ throw new InvalidConfigurationError("An off stabilization profile must not declare axis responses.");
247
+ }
248
+ if (architecture !== "off" &&
249
+ axisResponses.length === 0) {
250
+ throw new InvalidConfigurationError("An enabled physical stabilization profile must declare at least one axis response.");
251
+ }
252
+ const panningPolicy = parsePanningPolicy(record.panningPolicy, "stabilizationSystemProfile.panningPolicy");
253
+ if (architecture === "off" &&
254
+ panningPolicy.kind !== "none") {
255
+ throw new InvalidConfigurationError("An off stabilization profile must use panningPolicy.kind \"none\".");
256
+ }
257
+ if (panningPolicy.kind ===
258
+ "declared-axis-bypass" &&
259
+ !axisResponses.some((entry) => entry.axis ===
260
+ panningPolicy.axis)) {
261
+ throw new InvalidConfigurationError("Declared panning bypass axis must exist in axisResponses.");
262
+ }
263
+ const coordinatedAllocation = record.coordinatedAllocation ===
264
+ undefined
265
+ ? undefined
266
+ : parseCoordinatedAllocation(record.coordinatedAllocation, "stabilizationSystemProfile.coordinatedAllocation");
267
+ if (architecture ===
268
+ "coordinated-physical" &&
269
+ coordinatedAllocation ===
270
+ undefined) {
271
+ throw new InvalidConfigurationError("Coordinated physical stabilization requires an explicit body/lens correction allocation.");
272
+ }
273
+ if (architecture !==
274
+ "coordinated-physical" &&
275
+ coordinatedAllocation !==
276
+ undefined) {
277
+ throw new InvalidConfigurationError("Only coordinated physical stabilization may declare coordinatedAllocation.");
278
+ }
279
+ return {
280
+ schemaVersion: STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION,
281
+ profileId: requireNonEmptyString(record.profileId, "stabilizationSystemProfile.profileId"),
282
+ profileVersion: requireNonEmptyString(record.profileVersion, "stabilizationSystemProfile.profileVersion"),
283
+ profileKind: "generic-synthetic",
284
+ scientificStatus: "approximation",
285
+ architecture,
286
+ captureKind: record.captureKind,
287
+ axisResponses,
288
+ panningPolicy,
289
+ ...(coordinatedAllocation ===
290
+ undefined
291
+ ? {}
292
+ : {
293
+ coordinatedAllocation
294
+ }),
295
+ controlTransientModeled: false,
296
+ spontaneousDriftModeled: false,
297
+ cameraTranslationCorrectionModeled: false,
298
+ digitalStabilizationIncluded: false,
299
+ supportPolicyIncluded: false,
300
+ stopRatingUsedAsDynamicResponse: false,
301
+ evidence: parseEvidenceList(record.evidence, "stabilizationSystemProfile.evidence"),
302
+ limitations: parseLimitations(record.limitations, "stabilizationSystemProfile.limitations")
303
+ };
304
+ }
305
+ function parseAngularState(value, path) {
306
+ const record = requireRecord(value, path);
307
+ return {
308
+ pitch: requireFinite(record.pitch, path + ".pitch"),
309
+ yaw: requireFinite(record.yaw, path + ".yaw"),
310
+ roll: requireFinite(record.roll, path + ".roll")
311
+ };
312
+ }
313
+ /**
314
+ * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
315
+ * missing required fields and incompatible scientific data fail at this boundary.
316
+ *
317
+ * Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
318
+ * and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
319
+ * calibration, arbitrary stop rating or inferred coordination is supplied.
320
+ * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
321
+ * @returns StabilizationDisturbanceTrajectory. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
322
+ *
323
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
324
+ */
325
+ export function parseStabilizationDisturbanceTrajectory(value) {
326
+ const record = requireRecord(value, "stabilizationDisturbanceTrajectory");
327
+ if (record.version !==
328
+ STABILIZATION_DISTURBANCE_TRAJECTORY_VERSION ||
329
+ record.timeReference !==
330
+ "first-opening-boundary-phase" ||
331
+ record
332
+ .initialAngularDisplacementIsZero !==
333
+ true ||
334
+ record
335
+ .cameraTranslationIncluded !==
336
+ false ||
337
+ record.subjectMotionIncluded !==
338
+ false ||
339
+ record.supportStateEncoded !==
340
+ false) {
341
+ throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory metadata is invalid for version 0.1.0.");
342
+ }
343
+ if (!Array.isArray(record.samples) ||
344
+ record.samples.length < 2) {
345
+ throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory.samples must contain at least two samples.");
346
+ }
347
+ let previousTime = Number.NEGATIVE_INFINITY;
348
+ const samples = record.samples.map((entry, index) => {
349
+ const path = "stabilizationDisturbanceTrajectory.samples[" +
350
+ index +
351
+ "]";
352
+ const sample = requireRecord(entry, path);
353
+ const time = requireNonNegativeFinite(sample
354
+ .timeSecondsFromCaptureReference, path +
355
+ ".timeSecondsFromCaptureReference");
356
+ if (time <= previousTime) {
357
+ throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory sample times must be strictly increasing.");
358
+ }
359
+ previousTime = time;
360
+ return {
361
+ timeSecondsFromCaptureReference: time,
362
+ angularDisplacementRad: parseAngularState(sample
363
+ .angularDisplacementRad, path +
364
+ ".angularDisplacementRad")
365
+ };
366
+ });
367
+ const first = samples[0];
368
+ if (first
369
+ .timeSecondsFromCaptureReference !==
370
+ 0 ||
371
+ first
372
+ .angularDisplacementRad
373
+ .pitch !== 0 ||
374
+ first
375
+ .angularDisplacementRad
376
+ .yaw !== 0 ||
377
+ first
378
+ .angularDisplacementRad
379
+ .roll !== 0) {
380
+ throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory must begin at capture-reference t=0 with zero angular displacement.");
381
+ }
382
+ return {
383
+ version: STABILIZATION_DISTURBANCE_TRAJECTORY_VERSION,
384
+ trajectoryId: requireNonEmptyString(record.trajectoryId, "stabilizationDisturbanceTrajectory.trajectoryId"),
385
+ timeReference: "first-opening-boundary-phase",
386
+ samples,
387
+ initialAngularDisplacementIsZero: true,
388
+ cameraTranslationIncluded: false,
389
+ subjectMotionIncluded: false,
390
+ supportStateEncoded: false,
391
+ evidence: parseEvidenceList(record.evidence, "stabilizationDisturbanceTrajectory.evidence"),
392
+ limitations: parseLimitations(record.limitations, "stabilizationDisturbanceTrajectory.limitations")
393
+ };
394
+ }
395
+ function interpolateAxis(trajectory, timeSeconds, axis) {
396
+ const first = trajectory.samples[0];
397
+ const last = trajectory.samples[trajectory.samples.length -
398
+ 1];
399
+ if (timeSeconds <
400
+ first
401
+ .timeSecondsFromCaptureReference ||
402
+ timeSeconds >
403
+ last
404
+ .timeSecondsFromCaptureReference) {
405
+ throw new InvalidScientificInputError("Requested stabilization evaluation time lies outside the disturbance trajectory support.");
406
+ }
407
+ if (timeSeconds ===
408
+ last
409
+ .timeSecondsFromCaptureReference) {
410
+ return last
411
+ .angularDisplacementRad[axis];
412
+ }
413
+ for (let index = 0; index <
414
+ trajectory.samples.length - 1; index += 1) {
415
+ const left = trajectory.samples[index];
416
+ const right = trajectory.samples[index + 1];
417
+ if (timeSeconds >=
418
+ left
419
+ .timeSecondsFromCaptureReference &&
420
+ timeSeconds <=
421
+ right
422
+ .timeSecondsFromCaptureReference) {
423
+ const duration = right
424
+ .timeSecondsFromCaptureReference -
425
+ left
426
+ .timeSecondsFromCaptureReference;
427
+ const phase = duration === 0
428
+ ? 0
429
+ : (timeSeconds -
430
+ left
431
+ .timeSecondsFromCaptureReference) /
432
+ duration;
433
+ const a = left
434
+ .angularDisplacementRad[axis];
435
+ const b = right
436
+ .angularDisplacementRad[axis];
437
+ return (a +
438
+ (b - a) * phase);
439
+ }
440
+ }
441
+ throw new InvalidScientificInputError("Disturbance trajectory interpolation failed.");
442
+ }
443
+ function axisValue(state, axis) {
444
+ return state[axis];
445
+ }
446
+ function setAxisValue(state, axis, value) {
447
+ state[axis] = value;
448
+ }
449
+ function clampSymmetric(value, limit) {
450
+ return Math.max(-limit, Math.min(limit, value));
451
+ }
452
+ function evaluateAtTime(disturbance, profile, timeSeconds) {
453
+ const current = {
454
+ pitch: interpolateAxis(disturbance, timeSeconds, "pitch"),
455
+ yaw: interpolateAxis(disturbance, timeSeconds, "yaw"),
456
+ roll: interpolateAxis(disturbance, timeSeconds, "roll")
457
+ };
458
+ const correction = {
459
+ pitch: 0,
460
+ yaw: 0,
461
+ roll: 0
462
+ };
463
+ const residual = {
464
+ ...current
465
+ };
466
+ const responses = new Map(profile.axisResponses.map((response) => [
467
+ response.axis,
468
+ response
469
+ ]));
470
+ const axes = ["pitch", "yaw", "roll"];
471
+ const resolvedAxes = axes.map((axis) => {
472
+ const response = responses.get(axis);
473
+ const bypassed = profile.panningPolicy.kind ===
474
+ "declared-axis-bypass" &&
475
+ profile.panningPolicy.axis ===
476
+ axis;
477
+ if (profile.architecture ===
478
+ "off" ||
479
+ response === undefined ||
480
+ bypassed) {
481
+ return {
482
+ axis,
483
+ disturbanceAngleRad: axisValue(current, axis),
484
+ delayedMeasuredAngleRad: 0,
485
+ requestedCorrectionAngleRad: 0,
486
+ appliedCorrectionAngleRad: 0,
487
+ residualAngleRad: axisValue(current, axis),
488
+ correctionGain: response?.correctionGain
489
+ .value ?? 0,
490
+ latencySeconds: response?.latencySeconds
491
+ .value ?? 0,
492
+ maximumCorrectionAngleRad: response
493
+ ?.maximumCorrectionAngleRad
494
+ .value ?? 0,
495
+ bypassedForDeclaredPan: bypassed,
496
+ correctionLimitReached: false
497
+ };
498
+ }
499
+ const delayedTime = timeSeconds -
500
+ response
501
+ .latencySeconds.value;
502
+ const delayedMeasured = delayedTime < 0
503
+ ? 0
504
+ : interpolateAxis(disturbance, delayedTime, axis);
505
+ const requested = delayedMeasured *
506
+ response
507
+ .correctionGain.value;
508
+ const applied = clampSymmetric(requested, response
509
+ .maximumCorrectionAngleRad
510
+ .value);
511
+ const residualAngle = axisValue(current, axis) -
512
+ applied;
513
+ setAxisValue(correction, axis, applied);
514
+ setAxisValue(residual, axis, residualAngle);
515
+ return {
516
+ axis,
517
+ disturbanceAngleRad: axisValue(current, axis),
518
+ delayedMeasuredAngleRad: delayedMeasured,
519
+ requestedCorrectionAngleRad: requested,
520
+ appliedCorrectionAngleRad: applied,
521
+ residualAngleRad: residualAngle,
522
+ correctionGain: response
523
+ .correctionGain.value,
524
+ latencySeconds: response
525
+ .latencySeconds.value,
526
+ maximumCorrectionAngleRad: response
527
+ .maximumCorrectionAngleRad
528
+ .value,
529
+ bypassedForDeclaredPan: false,
530
+ correctionLimitReached: applied !== requested
531
+ };
532
+ });
533
+ return {
534
+ timeSecondsFromCaptureReference: timeSeconds,
535
+ disturbanceAngularDisplacementRad: current,
536
+ appliedCorrectionAngularDisplacementRad: correction,
537
+ residualAngularDisplacementRad: residual,
538
+ axes: resolvedAxes
539
+ };
540
+ }
541
+ /**
542
+ * Evaluate the declared generic per-axis controller against an explicit angular disturbance trajectory
543
+ * and return residual motion with latency/limit diagnostics.
544
+ *
545
+ * Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
546
+ * and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
547
+ * calibration, arbitrary stop rating or inferred coordination is supplied.
548
+ * @param input - CalculateStabilizedRotationTrajectoryInput. See the linked contract for coordinate, unit and profile binding semantics.
549
+ * @returns CalculationResult<StabilizedRotationTrajectory>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
550
+ *
551
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
552
+ */
553
+ export function calculateStabilizedRotationTrajectory(input) {
554
+ const disturbance = parseStabilizationDisturbanceTrajectory(input.disturbance);
555
+ const profile = parseStabilizationSystemProfile(input.profile);
556
+ if (input.captureKind !==
557
+ profile.captureKind) {
558
+ throw new InvalidScientificInputError("captureKind must exactly match the stabilization profile captureKind.");
559
+ }
560
+ const samples = disturbance.samples.map((sample) => evaluateAtTime(disturbance, profile, sample
561
+ .timeSecondsFromCaptureReference));
562
+ return approximationResult({
563
+ profileId: profile.profileId,
564
+ profileVersion: profile.profileVersion,
565
+ trajectoryId: disturbance.trajectoryId,
566
+ architecture: profile.architecture,
567
+ captureKind: input.captureKind,
568
+ timeReference: "first-opening-boundary-phase",
569
+ samples,
570
+ correctionModel: "delayed-linear-image-equivalent-angular-response",
571
+ supportStateConsumed: false,
572
+ translationCorrectionModeled: false,
573
+ digitalStabilizationApplied: false,
574
+ digitalStabilizationOwnedBy: "downstream-geometric-correction-composition",
575
+ coordinatedCorrectionDoubleCounted: false,
576
+ zeroDisturbanceCanCreateMotion: false
577
+ }, "generic-time-domain-physical-stabilization", "1.0.0", [
578
+ "The stabilization response is a generic synthetic image-equivalent rotational correction, not a manufacturer-specific IBIS/OIS calibration.",
579
+ "Correction uses explicit per-axis gain, latency and symmetric angular correction limits.",
580
+ "A coordinated profile allocates one total correction between body and lens for descriptive ownership only; the total correction is applied once.",
581
+ "Support state is not an input and never silently toggles stabilization.",
582
+ "Declared panning bypass suppresses correction only on the explicitly selected axis; pan intent is never inferred.",
583
+ "Camera translation/parallax correction is not modeled because translational image motion depends on scene depth.",
584
+ "Digital stabilization is a separate downstream geometric/crop/resampling domain.",
585
+ "CIPA-style stop ratings are not used as a dynamic response function.",
586
+ "The legacy stabilizationStopsEquivalent approximation remains unchanged."
587
+ ]);
588
+ }
589
+ function localExposureForPoint(timing, point) {
590
+ const matches = timing.exposureWindows.samples.filter((sample) => sample.pointNative.x ===
591
+ point.x &&
592
+ sample.pointNative.y ===
593
+ point.y);
594
+ if (matches.length !== 1) {
595
+ throw new InvalidScientificInputError("Each stabilization sample point must match exactly one committed #12 exposure-window sample point.");
596
+ }
597
+ const match = matches[0];
598
+ return {
599
+ start: match
600
+ .startOffsetSecondsFromOpeningReference,
601
+ end: match
602
+ .endOffsetSecondsFromOpeningReference,
603
+ duration: match
604
+ .localExposureDurationSeconds
605
+ };
606
+ }
607
+ /**
608
+ * Feed the residual stabilized rotation into the existing local-exposure temporal mapping without
609
+ * changing shutter timing or inventing a blur radius.
610
+ *
611
+ * Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
612
+ * and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
613
+ * calibration, arbitrary stop rating or inferred coordination is supplied.
614
+ * @param input - CalculateStabilizedCaptureTemporalSamplesInput. See the linked contract for coordinate, unit and profile binding semantics.
615
+ * @returns CalculationResult<StabilizedCaptureTemporalSamples>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
616
+ *
617
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
618
+ */
619
+ export function calculateStabilizedCaptureTemporalSamples(input) {
620
+ const disturbance = parseStabilizationDisturbanceTrajectory(input.disturbance);
621
+ const profile = parseStabilizationSystemProfile(input.profile);
622
+ if (input.captureKind !==
623
+ profile.captureKind) {
624
+ throw new InvalidScientificInputError("captureKind must exactly match the stabilization profile captureKind.");
625
+ }
626
+ requirePositiveInteger("temporalSampleCount", input.temporalSampleCount);
627
+ if (!Array.isArray(input.samplePointsNative) ||
628
+ input.samplePointsNative.length ===
629
+ 0) {
630
+ throw new InvalidScientificInputError("samplePointsNative must be a non-empty array.");
631
+ }
632
+ const totalNodeCount = input.temporalSampleCount *
633
+ input.samplePointsNative.length;
634
+ if (!Number.isSafeInteger(totalNodeCount)) {
635
+ throw new InvalidScientificInputError("temporalSampleCount × samplePointsNative.length must remain a safe integer.");
636
+ }
637
+ const points = input.samplePointsNative.map((point) => {
638
+ const exposure = localExposureForPoint(input.timing, point);
639
+ const normalizedTimeWeight = 1 /
640
+ input.temporalSampleCount;
641
+ const timeMeasureSeconds = exposure.duration /
642
+ input.temporalSampleCount;
643
+ const nodes = Array.from({
644
+ length: input.temporalSampleCount
645
+ }, (_, temporalSampleIndex) => {
646
+ const localExposurePhase = (temporalSampleIndex +
647
+ 0.5) /
648
+ input.temporalSampleCount;
649
+ const captureTime = exposure.start +
650
+ localExposurePhase *
651
+ exposure.duration;
652
+ return {
653
+ temporalSampleIndex,
654
+ localExposurePhase,
655
+ captureTimeSecondsFromReference: captureTime,
656
+ normalizedTimeWeight,
657
+ timeMeasureSeconds,
658
+ stabilization: evaluateAtTime(disturbance, profile, captureTime)
659
+ };
660
+ });
661
+ return {
662
+ destinationPointNative: {
663
+ ...point
664
+ },
665
+ localExposureWindow: {
666
+ startSecondsFromCaptureReference: exposure.start,
667
+ endSecondsFromCaptureReference: exposure.end,
668
+ durationSeconds: exposure.duration
669
+ },
670
+ nodes
671
+ };
672
+ });
673
+ return approximationResult({
674
+ profileId: profile.profileId,
675
+ trajectoryId: disturbance.trajectoryId,
676
+ captureModeId: input.timing.captureModeId,
677
+ timingProfileId: input.timing.timingProfileId,
678
+ captureKind: input.captureKind,
679
+ architecture: profile.architecture,
680
+ timeReference: "first-opening-boundary-phase",
681
+ quadratureScheme: "uniform-midpoint",
682
+ temporalSampleCount: input.temporalSampleCount,
683
+ points,
684
+ sensorReadoutTimingUsedAsExposureTiming: false,
685
+ supportStateConsumed: false,
686
+ translationCorrectionModeled: false,
687
+ digitalStabilizationApplied: false
688
+ }, "capture-local-stabilization-temporal-sampling", "1.0.0", [
689
+ "Stabilization is evaluated at deterministic midpoint nodes inside each authoritative #12 local exposure window.",
690
+ "Sensor data-readout timing is not substituted for exposure timing.",
691
+ "The result is rotational disturbance/correction/residual state only; it does not itself calculate image-plane mapping, radiance, blur, PSF or output pixels.",
692
+ "Translation/parallax, subject motion, shutter shock, support vibration sources and digital stabilization remain separate domains."
693
+ ]);
694
+ }
695
+ //# sourceMappingURL=system.js.map