@incodetech/core 2.1.0-rc.1 → 2.1.0-rc.3

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 (263) hide show
  1. package/dist/3dAvatarProvider-ChciZmjE.esm.js +28214 -0
  2. package/dist/{BrowserStorageProvider-BpJM-gIl.esm.js → BrowserStorageProvider-CrrN540a.esm.js} +1 -8
  3. package/dist/BrowserVisibilityObserverProvider-rim9Jrz-.esm.js +25 -0
  4. package/dist/Face2DProvider-BeLlYBbB.esm.js +824 -0
  5. package/dist/FaceDetectionProvider-B78455D4.d.ts +119 -0
  6. package/dist/IVisibilityObserverCapability-BbWjgpiF.d.ts +12 -0
  7. package/dist/IWasmUtilCapability-d2XvzaCk.d.ts +145 -0
  8. package/dist/IpifyProvider-BRW14_uo.esm.js +51 -0
  9. package/dist/{OpenViduRecordingProvider-O4GjBseO.esm.js → OpenViduRecordingProvider-B_0GKkzc.esm.js} +1 -1
  10. package/dist/PrivacyLensProvider-hDzaDzZ6.esm.js +339 -0
  11. package/dist/{StreamCanvasCapture-ImiDQdVA.esm.js → StreamCanvasCapture-Bz17q4FP.esm.js} +1 -1
  12. package/dist/StreamCanvasCapture-DS1TOoiH.d.ts +42 -0
  13. package/dist/{WasmUtilProvider-BKWm8rSA.esm.js → WasmUtilProvider-ADG54T6M.esm.js} +26 -2
  14. package/dist/{addressSearch-DvmWXKZg.esm.js → addressSearch-DJyNTg5S.esm.js} +4 -4
  15. package/dist/{ae-signature-BFZta3TZ.esm.js → ae-signature-DlElqFrZ.esm.js} +1 -1
  16. package/dist/ae-signature.d.ts +4 -3
  17. package/dist/ae-signature.esm.js +10 -7
  18. package/dist/antifraud.d.ts +4 -3
  19. package/dist/antifraud.esm.js +7 -6
  20. package/dist/antifraudManager-BKdQoMFf.esm.js +84 -0
  21. package/dist/{antifraudManager-CznnhyvD.d.ts → antifraudManager-DpIvbrZP.d.ts} +2 -2
  22. package/dist/{antifraudStateMachine-Ccrb-Jxc.esm.js → antifraudStateMachine-C0NGnP9W.esm.js} +3 -3
  23. package/dist/{api-CESGtpbH.esm.js → api-DsbUi7TO.esm.js} +21 -2
  24. package/dist/authentication.d.ts +19 -13
  25. package/dist/authentication.esm.js +33 -27
  26. package/dist/{authenticationManager-CaiQbp-q.d.ts → authenticationManager-CdPbNS2H.d.ts} +13 -3
  27. package/dist/{authenticationManager-BlR6mSaG.esm.js → authenticationManager-Dtl1vcET.esm.js} +17 -8
  28. package/dist/{authenticationStateMachine-DkcGUMw5.esm.js → authenticationStateMachine-D-hOlg8p.esm.js} +20 -23
  29. package/dist/avatar.d.ts +3 -0
  30. package/dist/avatar.esm.js +3 -0
  31. package/dist/{backCameraStream-D7Wo4Nbx.esm.js → backCameraStream-ZyqrFyjO.esm.js} +3 -3
  32. package/dist/browser-DlFgHpoC-qLKs75Qp.esm.js +1425 -0
  33. package/dist/{browserSimulation-B1dWiXp7.esm.js → browserSimulation-TsSoavQv.esm.js} +153 -1216
  34. package/dist/camera-DUkgmYMo.esm.js +79 -0
  35. package/dist/camera.d.ts +7 -1
  36. package/dist/camera.esm.js +4 -4
  37. package/dist/{StreamCanvasCapture-yyl20qd9.d.ts → canvas-CJUmoXSD.d.ts} +1 -41
  38. package/dist/certificate-issuance.d.ts +312 -0
  39. package/dist/certificate-issuance.esm.js +74 -0
  40. package/dist/certificateIssuanceStateMachine-C07m7qtP.esm.js +127 -0
  41. package/dist/clientLifecycle-Ct7h9uxx.esm.js +534 -0
  42. package/dist/consent.d.ts +4 -3
  43. package/dist/consent.esm.js +7 -6
  44. package/dist/{consentManager-BYo9Nu1r.esm.js → consentManager-BtnPZUW4.esm.js} +30 -5
  45. package/dist/{consentManager-Cg5Sk2tv.d.ts → consentManager-DufVo9D9.d.ts} +55 -55
  46. package/dist/{consentStateMachine-BG3yL8aC.esm.js → consentStateMachine-DO2JqoZW.esm.js} +3 -3
  47. package/dist/cpf-ocr.d.ts +4 -3
  48. package/dist/cpf-ocr.esm.js +7 -6
  49. package/dist/{cpfOcrManager-sSKegxox.esm.js → cpfOcrManager-C4rLgKsu.esm.js} +6 -5
  50. package/dist/{cpfOcrManager-Dg1s_TY5.d.ts → cpfOcrManager-DqZZ94Gt.d.ts} +19 -19
  51. package/dist/createFaceAvatar-B8pFpy6o.d.ts +401 -0
  52. package/dist/createFaceAvatar-BOHDKQRq.esm.js +46 -0
  53. package/dist/cross-document-data-match.d.ts +2 -1
  54. package/dist/cross-document-data-match.esm.js +6 -5
  55. package/dist/curp-validation.d.ts +10 -7
  56. package/dist/curp-validation.esm.js +7 -6
  57. package/dist/{curpValidationManager-CFem6zP9.esm.js → curpValidationManager-BafobPXC.esm.js} +52 -5
  58. package/dist/{curpValidationManager-RttixpIc.d.ts → curpValidationManager-Co6LZAHT.d.ts} +4 -3
  59. package/dist/{curpValidationStateMachine-B7V_qp66.esm.js → curpValidationStateMachine-DXTPK6vI.esm.js} +3 -3
  60. package/dist/custom-fields.d.ts +4 -2
  61. package/dist/custom-fields.esm.js +49 -6
  62. package/dist/custom-watchlist.d.ts +2 -1
  63. package/dist/custom-watchlist.esm.js +27 -6
  64. package/dist/{customWatchlistStateMachine-HmFybXLX.esm.js → customWatchlistStateMachine-B4G3Chkx.esm.js} +3 -3
  65. package/dist/{deepsightLoader-8tnddNx-.esm.js → deepsightLoader-DHSVD776.esm.js} +14 -13
  66. package/dist/{deepsightService-CrHmvx8X.esm.js → deepsightService-CDahSjGP.esm.js} +9 -38
  67. package/dist/deepsightService-CMB9XjES.d.ts +69 -0
  68. package/dist/device.d.ts +9 -1
  69. package/dist/device.esm.js +5 -5
  70. package/dist/document-capture.d.ts +178 -177
  71. package/dist/document-capture.esm.js +78 -14
  72. package/dist/document-upload.d.ts +51 -50
  73. package/dist/document-upload.esm.js +10 -9
  74. package/dist/{documentCaptureStateMachine-CUTUzUw_.esm.js → documentCaptureStateMachine-DSOX2epf.esm.js} +7 -7
  75. package/dist/dynamic-forms.d.ts +4 -192
  76. package/dist/dynamic-forms.esm.js +8 -410
  77. package/dist/dynamicFormsManager-BOefZbyF.esm.js +168 -0
  78. package/dist/dynamicFormsManager-CUYLOj9g.d.ts +239 -0
  79. package/dist/dynamicFormsStateMachine-BXHcaocI.esm.js +284 -0
  80. package/dist/ekyb.d.ts +10 -6
  81. package/dist/ekyb.esm.js +62 -17
  82. package/dist/{ekybStateMachine-klc-AImJ.esm.js → ekybStateMachine-CCSeqjCt.esm.js} +5 -5
  83. package/dist/ekyc.d.ts +5 -3
  84. package/dist/ekyc.esm.js +55 -9
  85. package/dist/{ekycStateMachine-CXbpaJJn.esm.js → ekycStateMachine-DkLVTOyA.esm.js} +5 -5
  86. package/dist/electronic-signature.d.ts +4 -3
  87. package/dist/electronic-signature.esm.js +9 -6
  88. package/dist/{electronicSignatureManager-BaECdJ1u.esm.js → electronicSignatureManager-DjzUzqZj.esm.js} +135 -92
  89. package/dist/email.d.ts +5 -4
  90. package/dist/email.esm.js +9 -8
  91. package/dist/{emailManager--D5G3ChB.esm.js → emailManager-B_XzEsXH.esm.js} +47 -6
  92. package/dist/{emailManager-lAzDoQOs.d.ts → emailManager-fHASH6uo.d.ts} +4 -3
  93. package/dist/{emailStateMachine-CxTOMAjC.esm.js → emailStateMachine-fqJ42b19.esm.js} +5 -5
  94. package/dist/{endpoints-BeTK0Mlt.esm.js → endpoints-BzMJFAPV.esm.js} +15 -0
  95. package/dist/{events-Dvvriq9l.esm.js → events-CqGY1yMq.esm.js} +87 -206
  96. package/dist/events.d.ts +23 -16
  97. package/dist/events.esm.js +3 -2
  98. package/dist/extensibility.d.ts +37 -27
  99. package/dist/extensibility.esm.js +74 -57
  100. package/dist/externalFetch-CyhBfD-n.esm.js +22 -0
  101. package/dist/face-match.d.ts +2 -2
  102. package/dist/face-match.esm.js +6 -5
  103. package/dist/{faceCaptureManagerFactory-ej2j1LMr.esm.js → faceCaptureManagerFactory-2brKTzMb.esm.js} +115 -25
  104. package/dist/faceCaptureManagerFactory-CGKbf7zt.d.ts +400 -0
  105. package/dist/{faceCaptureSetup-B9t6bYze.esm.js → faceCaptureSetup-CDUVU1nl.esm.js} +97 -13
  106. package/dist/{faceMatchStateMachine-DeXXzSuz.esm.js → faceMatchStateMachine-DUeUjEPx.esm.js} +3 -3
  107. package/dist/field-comparison.d.ts +4 -3
  108. package/dist/field-comparison.esm.js +6 -5
  109. package/dist/{fieldComparisonManager-COGI2ARD.esm.js → fieldComparisonManager-B9W0a9A5.esm.js} +5 -4
  110. package/dist/{fieldComparisonManager-Bu5TaSr3.d.ts → fieldComparisonManager-DdLqDeB2.d.ts} +2 -2
  111. package/dist/fiscal-qr.d.ts +5 -3
  112. package/dist/fiscal-qr.esm.js +13 -12
  113. package/dist/flow-events.d.ts +8 -6
  114. package/dist/flow.d.ts +34 -16
  115. package/dist/flow.esm.js +53 -30
  116. package/dist/flowCompletionService-BIqSTZcd.d.ts +28 -0
  117. package/dist/flowCompletionService-qEqh_g14.esm.js +42 -0
  118. package/dist/{flowServices-ChgTNggJ.esm.js → flowServices-C4piblgx.esm.js} +24 -9
  119. package/dist/geolocation.d.ts +4 -126
  120. package/dist/geolocation.esm.js +8 -87
  121. package/dist/geolocationManager-BP2Do9O-.esm.js +123 -0
  122. package/dist/geolocationManager-Cs50eRlC.d.ts +156 -0
  123. package/dist/{geolocationStateMachine-Dvh7X0wF.esm.js → geolocationStateMachine-BYfOOOG0.esm.js} +4 -4
  124. package/dist/{getDeviceClass-C8Do2qYu.esm.js → getDeviceClass-DGGzzfqm.esm.js} +1 -1
  125. package/dist/getDeviceData-TrKM8NPh.esm.js +101 -0
  126. package/dist/government-validation.d.ts +4 -3
  127. package/dist/government-validation.esm.js +43 -8
  128. package/dist/{governmentValidationStateMachine-DcJ-BfsC.esm.js → governmentValidationStateMachine-CwoPPO8b.esm.js} +5 -5
  129. package/dist/home.d.ts +18 -15
  130. package/dist/home.esm.js +5 -4
  131. package/dist/http.d.ts +1 -0
  132. package/dist/http.esm.js +2 -2
  133. package/dist/id-ocr.d.ts +4 -625
  134. package/dist/id-ocr.esm.js +8 -84
  135. package/dist/id-verification.d.ts +28 -27
  136. package/dist/id-verification.esm.js +6 -5
  137. package/dist/id.d.ts +24 -13
  138. package/dist/id.esm.js +48 -33
  139. package/dist/idCaptureDefaults-DNJON8Xo.esm.js +188 -0
  140. package/dist/{idCaptureManager-ChCNmgBj.d.ts → idCaptureManager-BVdvfJys.d.ts} +47 -12
  141. package/dist/{idCaptureManager-D3pwWutw.esm.js → idCaptureManager-Bo9DCQSU.esm.js} +100 -15
  142. package/dist/{idCaptureStateMachine-B3AiDIsT.esm.js → idCaptureStateMachine-BeDidMLU.esm.js} +525 -439
  143. package/dist/idOcrManager-BkRDrpZu.esm.js +92 -0
  144. package/dist/idOcrManager-CJzrmM91.d.ts +641 -0
  145. package/dist/{idOcrStateMachine-CDQ5d_VM.esm.js → idOcrStateMachine-DRZc4FBl.esm.js} +5 -5
  146. package/dist/{idVerificationStateMachine-kRxwImzO.esm.js → idVerificationStateMachine-oqiERKpg.esm.js} +3 -3
  147. package/dist/identity-reuse.d.ts +4 -3
  148. package/dist/identity-reuse.esm.js +7 -6
  149. package/dist/{identityReuseManager-C6n_97dw.esm.js → identityReuseManager-Bu62LToE.esm.js} +4 -3
  150. package/dist/{identityReuseManager-Cww-NDtd.d.ts → identityReuseManager-TWKbXuvY.d.ts} +33 -33
  151. package/dist/{identityReuseStateMachine-BfE5YiEr.esm.js → identityReuseStateMachine-BmONeF6B.esm.js} +3 -3
  152. package/dist/{index-B5hPA0Bg.d.ts → index-DtUlD-bz.d.ts} +2 -2
  153. package/dist/{index-B9NysVDB.d.ts → index-Icld-cKW.d.ts} +175 -295
  154. package/dist/index-XTtxaahe.d.ts +93 -0
  155. package/dist/index.d.ts +3 -2
  156. package/dist/index.esm.js +16 -12
  157. package/dist/{invokeOnCaptureCallback-ygByVdnn.esm.js → invokeOnCaptureCallback-v_PV_IJz.esm.js} +1 -1
  158. package/dist/{lib-BY67lgbq.esm.js → lib-B050WTth.esm.js} +1 -1
  159. package/dist/mandatory-consent.d.ts +10 -7
  160. package/dist/mandatory-consent.esm.js +7 -6
  161. package/dist/{mandatoryConsentManager-Dq6WiOZh.d.ts → mandatoryConsentManager-Bmdjo14S.d.ts} +50 -50
  162. package/dist/{mandatoryConsentManager-H6D18cZB.esm.js → mandatoryConsentManager-CQ3jirlZ.esm.js} +4 -3
  163. package/dist/{mandatoryConsentStateMachine-DtQNW1ji.esm.js → mandatoryConsentStateMachine-DkJJLHqC.esm.js} +3 -3
  164. package/dist/mediaRecorderOptions-C3NAkVgK.esm.js +42 -0
  165. package/dist/mediapipeShared-CRAKVElv.esm.js +67 -0
  166. package/dist/{recordingService-yRw7hfzU.esm.js → onDeviceFaceResults-DVBggeq8.esm.js} +71 -389
  167. package/dist/{openviduLazy-Dh14JNJc.esm.js → openviduLazy-BTOIauGP.esm.js} +2 -2
  168. package/dist/openviduLazy-Dov8oKfL.esm.js +3 -0
  169. package/dist/{permissionGuards-D0wGddy7.esm.js → permissionGuards-BR2oN573.esm.js} +1 -1
  170. package/dist/{permissionServices-Doec4X5L.esm.js → permissionServices-BJhGL13R.esm.js} +7 -4
  171. package/dist/personhood.d.ts +534 -0
  172. package/dist/personhood.esm.js +1494 -0
  173. package/dist/phone.d.ts +5 -4
  174. package/dist/phone.esm.js +9 -8
  175. package/dist/{phoneManager-fPmIBYQK.d.ts → phoneManager-BOTcjXgs.d.ts} +4 -3
  176. package/dist/{phoneManager-BmF-0Ez4.esm.js → phoneManager-BWlxqbyD.esm.js} +48 -6
  177. package/dist/{phoneStateMachine-BiV0yoEx.esm.js → phoneStateMachine-B_V9nODs.esm.js} +5 -5
  178. package/dist/{qe-signature-CUYPcHVo.esm.js → qe-signature-BhFnI9pT.esm.js} +1 -1
  179. package/dist/qe-signature.d.ts +4 -3
  180. package/dist/qe-signature.esm.js +10 -7
  181. package/dist/recordingService-m_1xCthr.esm.js +347 -0
  182. package/dist/redirect-to-mobile.d.ts +4 -3
  183. package/dist/redirect-to-mobile.esm.js +9 -7
  184. package/dist/{redirectToMobileManager-Dy3t7o0C.esm.js → redirectToMobileManager-BaAo9rgi.esm.js} +5 -4
  185. package/dist/{redirectToMobileManager-BNe3IzC_.d.ts → redirectToMobileManager-Br0KZK1G.d.ts} +2 -2
  186. package/dist/{redirectToMobileStateMachine-DyAdRxfP.esm.js → redirectToMobileStateMachine-DoAnf2ql.esm.js} +16 -28
  187. package/dist/{runChildModule-CuoHZ1cx.esm.js → runChildModule-0nQfjVVo.esm.js} +14 -24
  188. package/dist/selfie.d.ts +27 -14
  189. package/dist/selfie.esm.js +43 -30
  190. package/dist/{selfieManager-BNuTIGAz.esm.js → selfieManager-D_ZFERsE.esm.js} +17 -8
  191. package/dist/{selfieManager-C2y_t6DG.d.ts → selfieManager-R0Jw5sjb.d.ts} +13 -3
  192. package/dist/{selfieStateMachine-Bv99bZJE.esm.js → selfieStateMachine-CIgeeiN9.esm.js} +4 -4
  193. package/dist/{session-DoVb-OcB.esm.js → session-9jIfKFCc.esm.js} +3 -3
  194. package/dist/session.d.ts +11 -8
  195. package/dist/session.esm.js +16 -12
  196. package/dist/{sessionInitializer-DRB-hgbV.esm.js → sessionInitializer-C_TYIgyk.esm.js} +16 -109
  197. package/dist/{setup-BwCluiw3.d.ts → setup-CpRnXxn8.d.ts} +61 -2
  198. package/dist/setup-DHc6OaHm.esm.js +562 -0
  199. package/dist/signature.d.ts +4 -2
  200. package/dist/signature.esm.js +49 -6
  201. package/dist/{signatureStateMachine-C5qqYLRz.esm.js → signatureStateMachine-DtoiPzys.esm.js} +21 -39
  202. package/dist/{stats-BMNUG1AU.esm.js → stats-CYcScXcO.esm.js} +2 -2
  203. package/dist/stats.esm.js +3 -3
  204. package/dist/thumbmarkAdapter-fHBUDlAP.esm.js +1194 -0
  205. package/dist/tri-BG1iJsr4.esm.js +399 -0
  206. package/dist/tri.d.ts +2 -0
  207. package/dist/tri.esm-DUC01NgO.esm.js +2593 -0
  208. package/dist/tri.esm.js +4 -0
  209. package/dist/trust-graph.d.ts +4 -3
  210. package/dist/trust-graph.esm.js +4 -3
  211. package/dist/{types-NuT8ftBV.d.ts → types-BklZ_Wne.d.ts} +2 -1
  212. package/dist/{types-DOUhndhT.d.ts → types-BsYXnC5s.d.ts} +39 -3
  213. package/dist/{types-DsnEVMhr.esm.js → types-CMcxlSmH.esm.js} +2 -1
  214. package/dist/types-CxW2e0Ar.d.ts +132 -0
  215. package/dist/{types-Bj9hdFjU.d.ts → types-DgGlgyZT.d.ts} +1 -1
  216. package/dist/types-ElOJAGaM.esm.js +189 -0
  217. package/dist/urlUtils-BZqFU9rR.esm.js +16 -0
  218. package/dist/video-C2WIj6TS.esm.js +36 -0
  219. package/dist/video-selfie.d.ts +351 -0
  220. package/dist/video-selfie.esm.js +1509 -0
  221. package/dist/videoSelfieSteps-7M5vxKn-.esm.js +58 -0
  222. package/dist/{warmup-Dg8Lh-50.d.ts → warmup-BJZPQIiX.d.ts} +5 -1
  223. package/dist/wasm.d.ts +4 -3
  224. package/dist/wasm.esm.js +17 -13
  225. package/dist/watchlist-for-business.d.ts +2 -1
  226. package/dist/watchlist-for-business.esm.js +30 -7
  227. package/dist/watchlist.d.ts +2 -1
  228. package/dist/watchlist.esm.js +28 -6
  229. package/dist/{watchlistForBusinessStateMachine-DMl8j2Ov.esm.js → watchlistForBusinessStateMachine-DvEunDxs.esm.js} +3 -3
  230. package/dist/{watchlistStateMachine-DmQlqI6L.esm.js → watchlistStateMachine-AHXVf-TB.esm.js} +3 -3
  231. package/dist/workflow.d.ts +296 -103
  232. package/dist/workflow.esm.js +137 -74
  233. package/dist/{xstate.esm-C9wncMQa.esm.js → xstate.esm-Bomq1a0z.esm.js} +54 -5
  234. package/package.json +26 -1
  235. package/dist/IpifyProvider-D4LWD15E.esm.js +0 -167
  236. package/dist/antifraudManager-CkV4u-LE.esm.js +0 -55
  237. package/dist/camera-DJWm3V4g.esm.js +0 -22
  238. package/dist/deepsightService-Dh5P-hLf.d.ts +0 -265
  239. package/dist/faceCaptureManagerFactory-CjdBUS6s.d.ts +0 -721
  240. package/dist/flowCompletionService-BdR2cGgB.d.ts +0 -19
  241. package/dist/flowCompletionService-DdGojV9K.esm.js +0 -20
  242. package/dist/getBrowser-C8DP7oTB.esm.js +0 -8
  243. package/dist/openviduLazy-B8L--0oe.esm.js +0 -3
  244. package/dist/setup-CUO4mErT.esm.js +0 -1037
  245. /package/dist/{Actor-Y0_Fj-KL.d.ts → Actor-CGEelYtQ.d.ts} +0 -0
  246. /package/dist/{BrowserTimerProvider-DhNc_x02.esm.js → BrowserTimerProvider-CHloo0eQ.esm.js} +0 -0
  247. /package/dist/{ITimerCapability-CB0I1Uf2.esm.js → ITimerCapability-pltuG1E8.esm.js} +0 -0
  248. /package/dist/{Manager-BHn8wH8K.d.ts → Manager-CJ3G2zqi.d.ts} +0 -0
  249. /package/dist/{MotionSensorProvider-Bx7Mpzt0.esm.js → MotionSensorProvider-DCbId4De.esm.js} +0 -0
  250. /package/dist/{StateMachine-BC_nGvrc.d.ts → StateMachine-C_AY4cs7.d.ts} +0 -0
  251. /package/dist/{apiError-B-j-gyDx.esm.js → apiError-DNS2OCEX.esm.js} +0 -0
  252. /package/dist/{camera-SRBpPq2X.d.ts → camera-CNVUo-bC.d.ts} +0 -0
  253. /package/dist/{canvas-SKcRBxsk.esm.js → canvas-_I95hkPg.esm.js} +0 -0
  254. /package/dist/{chunk-CMUKZ2uL.esm.js → chunk-CIKcdghV.esm.js} +0 -0
  255. /package/dist/{cpf-BRzggV8G.esm.js → cpf-BKaho0j_.esm.js} +0 -0
  256. /package/dist/{dateUtils-AksLQmgV.esm.js → dateUtils-7-tQYRNN.esm.js} +0 -0
  257. /package/dist/{getDeviceClass-C0olyNFS.esm.js → getDeviceClass-DavNdcxh.esm.js} +0 -0
  258. /package/dist/{http-Cai3IoLS.esm.js → http-BkiUT7EB.esm.js} +0 -0
  259. /package/dist/{otp-CGMdUzBC.esm.js → otp-Bfnzf7I3.esm.js} +0 -0
  260. /package/dist/{otp-DF5A0sFx.d.ts → otp-M4iy57XY.d.ts} +0 -0
  261. /package/dist/{platform-SKvEfCBh.esm.js → platform-uIVQUnJP.esm.js} +0 -0
  262. /package/dist/{types-DvGZI7BF.d.ts → types-D_IceWxT.d.ts} +0 -0
  263. /package/dist/{types-ya0LN_MX.d.ts → types-Duy2rDxF.d.ts} +0 -0
@@ -0,0 +1,824 @@
1
+ import { t as createHiddenVideoElement } from "./video-C2WIj6TS.esm.js";
2
+ import { i as dtAlpha, n as asRvfc, r as createFaceLandmarker, t as MAX_EMA_DT_MS } from "./mediapipeShared-CRAKVElv.esm.js";
3
+
4
+ //#region ../infra/src/avatar/2d-default-avatar/assets.ts
5
+ /**
6
+ * 2D avatar MediaPipe asset resolution — **self-contained** (no shared
7
+ * `avatarDefaults`; owns its asset config). No VRM here — 2D satin face.
8
+ * See docs/features/FACE_AVATAR.md → Isolation and ownership.
9
+ *
10
+ * Prebuilt tasks-vision ESM + wasm + the face-landmarker model. Public CDNs for
11
+ * development; production should self-host.
12
+ */
13
+ const DEFAULT_MEDIAPIPE_MODULE_URL = "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.35";
14
+ const DEFAULT_FACE_LANDMARKER_MODEL_URL = "https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/1/face_landmarker.task";
15
+ function valid(value) {
16
+ return typeof value === "string" && value.trim() !== "";
17
+ }
18
+ function resolveAvatar2DAssets(overrides) {
19
+ const moduleUrl = valid(overrides?.mediapipeModulePath) ? overrides.mediapipeModulePath : DEFAULT_MEDIAPIPE_MODULE_URL;
20
+ return {
21
+ mediapipeModulePath: moduleUrl,
22
+ mediapipeWasmPath: valid(overrides?.mediapipeWasmPath) ? overrides.mediapipeWasmPath : `${moduleUrl}/wasm`,
23
+ faceLandmarkerModelPath: valid(overrides?.faceLandmarkerModelPath) ? overrides.faceLandmarkerModelPath : DEFAULT_FACE_LANDMARKER_MODEL_URL
24
+ };
25
+ }
26
+
27
+ //#endregion
28
+ //#region ../infra/src/avatar/renderers/SatinSmileyRenderer.ts
29
+ const SPRITE = 512;
30
+ const HEAD_CX = 256;
31
+ const HEAD_CY = 256;
32
+ const HEAD_R = 150;
33
+ const HALO_R = HEAD_R + 28;
34
+ const EYE_Y = 218;
35
+ const EYE_DX = 56;
36
+ const EYE_RX = 12;
37
+ const NOSE_Y0 = 258;
38
+ const NOSE_Y1 = 292;
39
+ const MOUTH_Y = 330;
40
+ const MOUTH_HALF = 44;
41
+ const YAW_PARALLAX = 90;
42
+ const PITCH_PARALLAX = 72;
43
+ const REST_SMILE = .35;
44
+ const PALETTES = {
45
+ detecting: {
46
+ stops: [
47
+ "#f4f9ff",
48
+ "#dbeafe",
49
+ "#cbe0fb",
50
+ "#aacdf3"
51
+ ],
52
+ occlusion: "#6f9fd8",
53
+ contact: "#3a5f8f",
54
+ feature: "#007aff",
55
+ halo: "#2f86f0"
56
+ },
57
+ success: {
58
+ stops: [
59
+ "#f0fdf4",
60
+ "#dcfce7",
61
+ "#bbf7d0",
62
+ "#86c79a"
63
+ ],
64
+ occlusion: "#3f7a52",
65
+ contact: "#1f5132",
66
+ feature: "#15803d",
67
+ halo: "#22c55e"
68
+ },
69
+ error: {
70
+ stops: [
71
+ "#fff1f1",
72
+ "#fee2e2",
73
+ "#fecaca",
74
+ "#e89a9a"
75
+ ],
76
+ occlusion: "#8c4a4a",
77
+ contact: "#5f1e1e",
78
+ feature: "#b91c1c",
79
+ halo: "#dc2626"
80
+ }
81
+ };
82
+ const clamp$1 = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
83
+ function hexToRgb(hex) {
84
+ const h = hex.replace("#", "");
85
+ return [
86
+ parseInt(h.slice(0, 2), 16),
87
+ parseInt(h.slice(2, 4), 16),
88
+ parseInt(h.slice(4, 6), 16)
89
+ ];
90
+ }
91
+ function rgb(c) {
92
+ return `rgb(${c[0] | 0}, ${c[1] | 0}, ${c[2] | 0})`;
93
+ }
94
+ function rgba(c, a) {
95
+ return `rgba(${c[0] | 0}, ${c[1] | 0}, ${c[2] | 0}, ${a})`;
96
+ }
97
+ function toRgbPalette(p) {
98
+ return {
99
+ stops: [
100
+ hexToRgb(p.stops[0]),
101
+ hexToRgb(p.stops[1]),
102
+ hexToRgb(p.stops[2]),
103
+ hexToRgb(p.stops[3])
104
+ ],
105
+ occlusion: hexToRgb(p.occlusion),
106
+ contact: hexToRgb(p.contact),
107
+ feature: hexToRgb(p.feature),
108
+ halo: hexToRgb(p.halo)
109
+ };
110
+ }
111
+ const RGB_PALETTES = {
112
+ detecting: toRgbPalette(PALETTES.detecting),
113
+ success: toRgbPalette(PALETTES.success),
114
+ error: toRgbPalette(PALETTES.error)
115
+ };
116
+ function clonePalette(p) {
117
+ return {
118
+ stops: [
119
+ [...p.stops[0]],
120
+ [...p.stops[1]],
121
+ [...p.stops[2]],
122
+ [...p.stops[3]]
123
+ ],
124
+ occlusion: [...p.occlusion],
125
+ contact: [...p.contact],
126
+ feature: [...p.feature],
127
+ halo: [...p.halo]
128
+ };
129
+ }
130
+ function easeRgb(cur, target, t) {
131
+ cur[0] += (target[0] - cur[0]) * t;
132
+ cur[1] += (target[1] - cur[1]) * t;
133
+ cur[2] += (target[2] - cur[2]) * t;
134
+ }
135
+ /** Ease every channel of `cur` toward `target` in place (smooth state crossfade). */
136
+ function easePaletteToward(cur, target, t) {
137
+ for (let i = 0; i < 4; i += 1) easeRgb(cur.stops[i], target.stops[i], t);
138
+ easeRgb(cur.occlusion, target.occlusion, t);
139
+ easeRgb(cur.contact, target.contact, t);
140
+ easeRgb(cur.feature, target.feature, t);
141
+ easeRgb(cur.halo, target.halo, t);
142
+ }
143
+ function resolveOverride() {
144
+ const v = globalThis.__incodeAvatarState;
145
+ return v === "detecting" || v === "success" || v === "error" ? v : null;
146
+ }
147
+ var SatinSmileyRenderer = class {
148
+ constructor(size = 512) {
149
+ this.ctx = null;
150
+ this.presence = 0;
151
+ this.faceState = "detecting";
152
+ this.eased = clonePalette(RGB_PALETTES.detecting);
153
+ this.size = size;
154
+ this.canvas = document.createElement("canvas");
155
+ this.canvas.width = size;
156
+ this.canvas.height = size;
157
+ }
158
+ init() {
159
+ this.ctx = this.canvas.getContext("2d");
160
+ }
161
+ getCanvas() {
162
+ return this.canvas;
163
+ }
164
+ /** Set the verdict state (detecting/success/error); colours ease toward it. */
165
+ setState(state) {
166
+ this.faceState = state;
167
+ }
168
+ dispose() {
169
+ this.ctx = null;
170
+ }
171
+ render(frame) {
172
+ const ctx = this.ctx;
173
+ if (!ctx) return;
174
+ const s = this.size;
175
+ ctx.clearRect(0, 0, s, s);
176
+ const state = resolveOverride() ?? this.faceState;
177
+ easePaletteToward(this.eased, RGB_PALETTES[state], .08);
178
+ const target = frame.tracked ? 1 : 0;
179
+ this.presence += (target - this.presence) * .12;
180
+ const faceAlpha = this.presence;
181
+ const k = s / SPRITE;
182
+ const slideX = frame.rootOffset.x * s * .03;
183
+ const slideY = frame.rootOffset.y * s * .03;
184
+ const scale = 1 + clamp$1(frame.depth, -.6, .8) * .35;
185
+ const yaw = clamp$1(frame.headEuler.y, -.9, .9);
186
+ const pitch = clamp$1(frame.headEuler.x, -.9, .9);
187
+ this.drawHalo(ctx, s, k, scale, slideX, slideY);
188
+ ctx.save();
189
+ ctx.translate(s / 2 + slideX, s / 2 + slideY);
190
+ ctx.rotate(frame.headEuler.z);
191
+ ctx.scale(scale * k, scale * k);
192
+ ctx.translate(-SPRITE / 2, -SPRITE / 2);
193
+ if (faceAlpha > .02) {
194
+ ctx.globalAlpha = faceAlpha;
195
+ this.drawBall(ctx);
196
+ const featX = yaw * YAW_PARALLAX;
197
+ const featY = pitch * PITCH_PARALLAX;
198
+ ctx.save();
199
+ ctx.translate(HEAD_CX, HEAD_CY);
200
+ ctx.scale(1 - Math.abs(yaw) * .24, 1 - Math.abs(pitch) * .12);
201
+ ctx.translate(-HEAD_CX, -HEAD_CY);
202
+ ctx.translate(featX, featY);
203
+ const feat = rgb(this.eased.feature);
204
+ let blinkL = clamp$1(frame.blink.left, 0, 1);
205
+ let blinkR = clamp$1(frame.blink.right, 0, 1);
206
+ if (state === "success") {
207
+ blinkL = 0;
208
+ blinkR = .85;
209
+ }
210
+ this.drawEye(ctx, HEAD_CX - EYE_DX, EYE_Y, blinkL, feat);
211
+ this.drawEye(ctx, HEAD_CX + EYE_DX, EYE_Y, blinkR, feat);
212
+ this.drawNose(ctx, feat);
213
+ let mouth = Math.max(REST_SMILE, clamp$1(frame.smile ?? 0, 0, 1));
214
+ if (state === "success") mouth = 1;
215
+ else if (state === "error") mouth = -.55;
216
+ this.drawMouth(ctx, mouth, feat);
217
+ ctx.restore();
218
+ ctx.globalAlpha = 1;
219
+ }
220
+ ctx.restore();
221
+ }
222
+ /** Dashed halo ring around the head — the "we've got you" frame (state-colored). */
223
+ drawHalo(ctx, s, k, scale, slideX, slideY) {
224
+ ctx.save();
225
+ ctx.translate(s / 2 + slideX, s / 2 + slideY);
226
+ ctx.scale(scale, scale);
227
+ ctx.globalAlpha = .9;
228
+ ctx.strokeStyle = rgb(this.eased.halo);
229
+ ctx.lineWidth = 4 * k;
230
+ ctx.lineCap = "round";
231
+ ctx.setLineDash([15 * k, 12 * k]);
232
+ ctx.beginPath();
233
+ ctx.arc(0, 0, HALO_R * k, 0, Math.PI * 2);
234
+ ctx.stroke();
235
+ ctx.setLineDash([]);
236
+ ctx.restore();
237
+ }
238
+ /** Soft 3D-shaded ball via runtime gradients (so state colours can ease). */
239
+ drawBall(ctx) {
240
+ const p = this.eased;
241
+ const contact = ctx.createRadialGradient(256, 424, 0, 256, 424, 122);
242
+ contact.addColorStop(0, rgba(p.contact, .28));
243
+ contact.addColorStop(1, rgba(p.contact, 0));
244
+ ctx.fillStyle = contact;
245
+ ctx.beginPath();
246
+ ctx.ellipse(256, 424, 122, 26, 0, 0, Math.PI * 2);
247
+ ctx.fill();
248
+ const body = ctx.createRadialGradient(HEAD_CX - HEAD_R * .28, HEAD_CY - HEAD_R * .34, HEAD_R * .08, HEAD_CX, HEAD_CY, HEAD_R * 1.05);
249
+ body.addColorStop(0, rgb(p.stops[0]));
250
+ body.addColorStop(.45, rgb(p.stops[1]));
251
+ body.addColorStop(.8, rgb(p.stops[2]));
252
+ body.addColorStop(1, rgb(p.stops[3]));
253
+ ctx.fillStyle = body;
254
+ ctx.beginPath();
255
+ ctx.arc(HEAD_CX, HEAD_CY, HEAD_R, 0, Math.PI * 2);
256
+ ctx.fill();
257
+ const occl = ctx.createRadialGradient(HEAD_CX, HEAD_CY, HEAD_R * .68, HEAD_CX, HEAD_CY, HEAD_R);
258
+ occl.addColorStop(0, rgba(p.occlusion, 0));
259
+ occl.addColorStop(1, rgba(p.occlusion, .22));
260
+ ctx.fillStyle = occl;
261
+ ctx.beginPath();
262
+ ctx.arc(HEAD_CX, HEAD_CY, HEAD_R, 0, Math.PI * 2);
263
+ ctx.fill();
264
+ const spec = ctx.createRadialGradient(200, 190, 0, 200, 190, 64);
265
+ spec.addColorStop(0, "rgba(255, 255, 255, 0.85)");
266
+ spec.addColorStop(1, "rgba(255, 255, 255, 0)");
267
+ ctx.fillStyle = spec;
268
+ ctx.beginPath();
269
+ ctx.ellipse(200, 190, 64, 48, 0, 0, Math.PI * 2);
270
+ ctx.fill();
271
+ }
272
+ /** One eye: a near-round dot (open) that flattens to a line as blink → 1. */
273
+ drawEye(ctx, cx, cy, blink, color) {
274
+ const ry = 2.5 + (1 - blink) * 14;
275
+ ctx.fillStyle = color;
276
+ ctx.beginPath();
277
+ ctx.ellipse(cx, cy, EYE_RX, ry, 0, 0, Math.PI * 2);
278
+ ctx.fill();
279
+ }
280
+ /** Nose: a short, rounded vertical line under the eyes (personhood cue). */
281
+ drawNose(ctx, color) {
282
+ ctx.strokeStyle = color;
283
+ ctx.lineWidth = 8;
284
+ ctx.lineCap = "round";
285
+ ctx.beginPath();
286
+ ctx.moveTo(HEAD_CX, NOSE_Y0);
287
+ ctx.lineTo(HEAD_CX, NOSE_Y1);
288
+ ctx.stroke();
289
+ }
290
+ /** Mouth: a rounded line — flat at rest, bowing up with smile, down on frown. */
291
+ drawMouth(ctx, smile, color) {
292
+ const cy = MOUTH_Y;
293
+ const curve = 2 + smile * 32;
294
+ const lift = smile * 10;
295
+ ctx.strokeStyle = color;
296
+ ctx.lineWidth = 11;
297
+ ctx.lineCap = "round";
298
+ ctx.beginPath();
299
+ ctx.moveTo(HEAD_CX - MOUTH_HALF, cy - lift);
300
+ ctx.quadraticCurveTo(HEAD_CX, cy + curve, HEAD_CX + MOUTH_HALF, cy - lift);
301
+ ctx.stroke();
302
+ }
303
+ };
304
+
305
+ //#endregion
306
+ //#region ../infra/src/avatar/2d-default-avatar/pose.ts
307
+ const AVATAR2D_NEUTRAL_POSE = {
308
+ tracked: false,
309
+ headEuler: {
310
+ x: 0,
311
+ y: 0,
312
+ z: 0
313
+ },
314
+ rootOffset: {
315
+ x: 0,
316
+ y: 0
317
+ },
318
+ depth: 0,
319
+ blink: {
320
+ left: 0,
321
+ right: 0
322
+ },
323
+ mouthOpen: 0,
324
+ smile: 0
325
+ };
326
+ const LM_NOSE_TIP = 4;
327
+ const LM_EYE_L = 33;
328
+ const LM_EYE_L_INNER = 133;
329
+ const LM_EYE_R = 263;
330
+ const LM_EYE_R_INNER = 362;
331
+ const LM_FOREHEAD = 10;
332
+ const LM_CHIN = 152;
333
+ const AVATAR2D_POSE_CONFIG = {
334
+ yawGain: 2.2,
335
+ pitchUpGain: 3.4,
336
+ pitchDownGain: 2.6,
337
+ rollGain: 1,
338
+ rotMax: .9,
339
+ lateralGain: 1.6,
340
+ lateralMax: 1,
341
+ depthGain: 2,
342
+ depthMax: .8,
343
+ signYaw: 1,
344
+ signPitch: 1,
345
+ signRoll: 1,
346
+ signX: 1,
347
+ signY: 1
348
+ };
349
+ function clamp(v, lo, hi) {
350
+ return Math.min(hi, Math.max(lo, v));
351
+ }
352
+ /** Soft deadzone (continuous past the threshold): kills idle micro-jitter. (§3b.) */
353
+ function deadzone(v, dz) {
354
+ return Math.abs(v) <= dz ? 0 : v - Math.sign(v) * dz;
355
+ }
356
+ const AVATAR2D_DEADZONE = {
357
+ rot: .005,
358
+ roll: .006,
359
+ pos: .03,
360
+ depth: .1
361
+ };
362
+ const MEDIAN_WINDOW = 7;
363
+ /**
364
+ * Below this face-size ratio the detector emits sporadic single-frame outlier
365
+ * spikes ("the avatar jumps") that the deadzone (idle-only) and the EMA (delays,
366
+ * doesn't reject) both miss; run the {@link Median} first in that regime. At/above
367
+ * it, the face is near and exp smoothing alone is enough. (FACE_AVATAR.md → Pose pipeline.)
368
+ */
369
+ const MEDIAN_FACE_RATIO = .35;
370
+ /**
371
+ * Single-axis rolling-window median for outlier rejection. Returns the latest
372
+ * sample until the window fills (no start-up lag spike), then the middle of the
373
+ * sorted window. The buffer stays in insertion order so `shift()` evicts the
374
+ * OLDEST sample, not the smallest. Ported from the incode-personhood-widget
375
+ * `MedianFilter` — **copied, not shared** (POC isolation; renderer is the only
376
+ * shared surface). Use three independent instances (one per axis).
377
+ */
378
+ var Median = class {
379
+ constructor() {
380
+ this.buf = [];
381
+ }
382
+ reset() {
383
+ this.buf = [];
384
+ }
385
+ filter(x) {
386
+ this.buf.push(x);
387
+ if (this.buf.length > MEDIAN_WINDOW) this.buf.shift();
388
+ if (this.buf.length < MEDIAN_WINDOW) return x;
389
+ const sorted = [...this.buf].sort((a, b) => a - b);
390
+ return sorted[Math.floor(sorted.length / 2)];
391
+ }
392
+ };
393
+ /**
394
+ * Caps on the auto-calibrated neutral so calibration cancels small device/framing
395
+ * bias but NOT the user's real starting orientation. Yaw/roll only (straight ≈ 0
396
+ * for both); pitch + position are left unbounded (pitch has a person-specific
397
+ * baseline; position is genuine framing) — bounding those risks an "always looks
398
+ * down/off-centre" artifact. Tune on device.
399
+ */
400
+ const AVATAR2D_NEUTRAL_BIAS = {
401
+ yaw: .06,
402
+ roll: .05
403
+ };
404
+ /**
405
+ * Raw pose from landmarks, in **pixel space** (multiply normalized coords by the
406
+ * input width/height) so distances/angles aren't skewed on non-square frames.
407
+ * Returns null on a missing or non-finite frame (NaN guard).
408
+ */
409
+ function computeRawPose(result, width, height) {
410
+ const lm = result.faceLandmarks?.[0];
411
+ if (!lm) return null;
412
+ const nose = lm[LM_NOSE_TIP];
413
+ const eyeLo = lm[LM_EYE_L];
414
+ const eyeLi = lm[LM_EYE_L_INNER];
415
+ const eyeRo = lm[LM_EYE_R];
416
+ const eyeRi = lm[LM_EYE_R_INNER];
417
+ const forehead = lm[LM_FOREHEAD];
418
+ const chin = lm[LM_CHIN];
419
+ if (!nose || !eyeLo || !eyeLi || !eyeRo || !eyeRi || !forehead || !chin) return null;
420
+ const nx = nose.x * width;
421
+ const ny = nose.y * height;
422
+ const lx = (eyeLo.x + eyeLi.x) / 2 * width;
423
+ const ly = (eyeLo.y + eyeLi.y) / 2 * height;
424
+ const rx = (eyeRo.x + eyeRi.x) / 2 * width;
425
+ const ry = (eyeRo.y + eyeRi.y) / 2 * height;
426
+ const fy = forehead.y * height;
427
+ const cy = chin.y * height;
428
+ const eyeMidX = (lx + rx) / 2;
429
+ const eyeMidY = (ly + ry) / 2;
430
+ const faceMidY = (fy + cy) / 2;
431
+ const eyeDist = Math.hypot(rx - lx, ry - ly) || 1e-4;
432
+ const faceH = Math.abs(cy - fy) || 1e-4;
433
+ const yaw = (nx - eyeMidX) / eyeDist;
434
+ const pitch = (ny - faceMidY) / faceH;
435
+ const roll = Math.atan2(ry - ly, rx - lx);
436
+ if (!Number.isFinite(yaw) || !Number.isFinite(pitch) || !Number.isFinite(roll) || !Number.isFinite(eyeMidX) || !Number.isFinite(eyeDist)) return null;
437
+ let faceSizeRatio;
438
+ if (width > 0 && height > 0) {
439
+ let minX = Infinity;
440
+ let minY = Infinity;
441
+ let maxX = -Infinity;
442
+ let maxY = -Infinity;
443
+ for (let i = 0; i < lm.length; i += 1) {
444
+ const p = lm[i];
445
+ if (p.x < minX) minX = p.x;
446
+ if (p.x > maxX) maxX = p.x;
447
+ if (p.y < minY) minY = p.y;
448
+ if (p.y > maxY) maxY = p.y;
449
+ }
450
+ const bw = (maxX - minX) * width;
451
+ const bh = (maxY - minY) * height;
452
+ if (bw > 0 && bh > 0) faceSizeRatio = Math.sqrt(bw * bh) / Math.min(width, height);
453
+ }
454
+ return {
455
+ yaw,
456
+ pitch,
457
+ roll,
458
+ eyeMidX,
459
+ eyeMidY,
460
+ eyeDist,
461
+ faceH,
462
+ faceSizeRatio
463
+ };
464
+ }
465
+ /** Map a raw pose (relative to neutral) into head euler + offset + depth. */
466
+ function mapToPose(raw, neutral, cfg) {
467
+ let dRoll = raw.roll - neutral.roll;
468
+ dRoll = Math.atan2(Math.sin(dRoll), Math.cos(dRoll));
469
+ const dist = neutral.dist || 1e-4;
470
+ const dPitch = deadzone(raw.pitch - neutral.pitch, AVATAR2D_DEADZONE.rot);
471
+ const pitchGain = dPitch < 0 ? cfg.pitchUpGain : cfg.pitchDownGain;
472
+ const dYaw = deadzone(raw.yaw - neutral.yaw, AVATAR2D_DEADZONE.rot);
473
+ const dRollDz = deadzone(dRoll, AVATAR2D_DEADZONE.roll);
474
+ const relX = deadzone((raw.eyeMidX - neutral.cx) / dist, AVATAR2D_DEADZONE.pos);
475
+ const relY = deadzone((raw.eyeMidY - neutral.cy) / dist, AVATAR2D_DEADZONE.pos);
476
+ const faceHN = neutral.faceH || 1e-4;
477
+ const relZ = deadzone((raw.faceH - neutral.faceH) / faceHN, AVATAR2D_DEADZONE.depth);
478
+ return {
479
+ headEuler: {
480
+ x: clamp(dPitch * pitchGain * cfg.signPitch, -cfg.rotMax, cfg.rotMax),
481
+ y: clamp(dYaw * cfg.yawGain * cfg.signYaw, -cfg.rotMax, cfg.rotMax),
482
+ z: clamp(dRollDz * cfg.rollGain * cfg.signRoll, -cfg.rotMax, cfg.rotMax)
483
+ },
484
+ rootOffset: {
485
+ x: clamp(relX * cfg.lateralGain * cfg.signX, -cfg.lateralMax, cfg.lateralMax),
486
+ y: clamp(relY * cfg.lateralGain * cfg.signY, -cfg.lateralMax, cfg.lateralMax)
487
+ },
488
+ depth: clamp(relZ * cfg.depthGain, -cfg.depthMax, cfg.depthMax)
489
+ };
490
+ }
491
+ /** Per-eye blink + mouth-open + smile straight from the ARKit blendshapes. */
492
+ function blinkMouthFromBlendshapes(result) {
493
+ const categories = result.faceBlendshapes?.[0]?.categories ?? [];
494
+ let left = 0;
495
+ let right = 0;
496
+ let jaw = 0;
497
+ let smileL = 0;
498
+ let smileR = 0;
499
+ for (const c of categories) if (c.categoryName === "eyeBlinkLeft") left = c.score;
500
+ else if (c.categoryName === "eyeBlinkRight") right = c.score;
501
+ else if (c.categoryName === "jawOpen") jaw = c.score;
502
+ else if (c.categoryName === "mouthSmileLeft") smileL = c.score;
503
+ else if (c.categoryName === "mouthSmileRight") smileR = c.score;
504
+ return {
505
+ blink: {
506
+ left,
507
+ right
508
+ },
509
+ mouthOpen: jaw,
510
+ smile: (smileL + smileR) / 2
511
+ };
512
+ }
513
+
514
+ //#endregion
515
+ //#region ../infra/src/avatar/2d-default-avatar/Face2DProvider.ts
516
+ /**
517
+ * 2D satin-face avatar — MediaPipe-tracked, 2D sprite renderer.
518
+ * **Self-contained** (its own MediaPipe loop; see FACE_AVATAR.md → Isolation and ownership).
519
+ * Carries mobile robustness patterns (FACE_AVATAR.md → Mobile hardening): `window.Module` shield,
520
+ * CPU delegate, transformation matrix OFF, landmark-derived pose, NaN guards.
521
+ */
522
+ const DEFAULT_MAX_FPS = 30;
523
+ const NEUTRAL_FRAMES = 20;
524
+ const FACE_LOST_MS = 600;
525
+ const HEAD_ALPHA = .4;
526
+ const POS_ALPHA = .35;
527
+ const DEPTH_ALPHA = .2;
528
+ const EXPR_ALPHA = .5;
529
+ const MAX_DETECT_FAILURES = 30;
530
+ const CAL_MOTION_YAWPITCH = .012;
531
+ const CAL_MOTION_ROLL = .02;
532
+ const CAL_FALLBACK_MULT = 3;
533
+ var Avatar2DProvider = class {
534
+ constructor() {
535
+ this.renderer = new SatinSmileyRenderer(512);
536
+ this.videoHandle = null;
537
+ this.landmarker = null;
538
+ this.inputCanvas = document.createElement("canvas");
539
+ this.inputCtx = null;
540
+ this.rafId = null;
541
+ this.lastFrameAt = 0;
542
+ this.minFrameIntervalMs = 1e3 / DEFAULT_MAX_FPS;
543
+ this.stopped = false;
544
+ this.mediapipeModulePath = "";
545
+ this.mediapipeWasmPath = "";
546
+ this.faceLandmarkerModelPath = "";
547
+ this.detectFailures = 0;
548
+ this.current = structuredClonePose(AVATAR2D_NEUTRAL_POSE);
549
+ this.target = structuredClonePose(AVATAR2D_NEUTRAL_POSE);
550
+ this.lastFaceAt = 0;
551
+ this.calibrated = false;
552
+ this.nFrames = 0;
553
+ this.sum = {
554
+ yaw: 0,
555
+ pitch: 0,
556
+ roll: 0,
557
+ cx: 0,
558
+ cy: 0,
559
+ dist: 0,
560
+ faceH: 0
561
+ };
562
+ this.neutral = {
563
+ yaw: 0,
564
+ pitch: 0,
565
+ roll: 0,
566
+ cx: 0,
567
+ cy: 0,
568
+ dist: 1,
569
+ faceH: 1
570
+ };
571
+ this.calAttempts = 0;
572
+ this.prevCalYaw = NaN;
573
+ this.prevCalPitch = NaN;
574
+ this.prevCalRoll = NaN;
575
+ this.seeded = false;
576
+ this.medYaw = new Median();
577
+ this.medPitch = new Median();
578
+ this.medRoll = new Median();
579
+ this.usingRvfc = false;
580
+ this.rvfcHandle = null;
581
+ this.loop = (now) => {
582
+ if (this.stopped) return;
583
+ this.scheduleNextFrame();
584
+ if (now - this.lastFrameAt < this.minFrameIntervalMs) return;
585
+ const dtMs = clamp(this.lastFrameAt > 0 ? now - this.lastFrameAt : this.minFrameIntervalMs, 1, MAX_EMA_DT_MS);
586
+ this.lastFrameAt = now;
587
+ const video = this.videoHandle?.element;
588
+ if (!video || video.readyState < 2 || !this.landmarker) {
589
+ this.renderer.render(this.current);
590
+ return;
591
+ }
592
+ const vw = video.videoWidth;
593
+ const vh = video.videoHeight;
594
+ if (vw > 0 && vh > 0) {
595
+ if (!this.inputCtx) this.inputCtx = this.inputCanvas.getContext("2d");
596
+ if (this.inputCtx) {
597
+ if (this.inputCanvas.width !== vw || this.inputCanvas.height !== vh) {
598
+ this.inputCanvas.width = vw;
599
+ this.inputCanvas.height = vh;
600
+ }
601
+ this.inputCtx.drawImage(video, 0, 0, vw, vh);
602
+ let result = null;
603
+ try {
604
+ result = this.landmarker.detectForVideo(this.inputCanvas, now);
605
+ this.detectFailures = 0;
606
+ } catch {
607
+ result = null;
608
+ this.detectFailures += 1;
609
+ if (this.detectFailures >= MAX_DETECT_FAILURES) this.recreateLandmarker();
610
+ }
611
+ if (result) this.ingest(result, vw, vh, now);
612
+ }
613
+ }
614
+ if (now - this.lastFaceAt > FACE_LOST_MS) this.target = structuredClonePose(AVATAR2D_NEUTRAL_POSE);
615
+ this.smoothTowardTarget(dtMs);
616
+ this.renderer.render(this.current);
617
+ };
618
+ }
619
+ getCanvas() {
620
+ return this.renderer.getCanvas();
621
+ }
622
+ setState(state) {
623
+ this.renderer.setState(state);
624
+ }
625
+ async start(stream, options = {}) {
626
+ const assets = resolveAvatar2DAssets({
627
+ mediapipeModulePath: options.assets?.mediapipeModulePath,
628
+ mediapipeWasmPath: options.assets?.mediapipeWasmPath,
629
+ faceLandmarkerModelPath: options.assets?.faceLandmarkerModelPath
630
+ });
631
+ this.mediapipeModulePath = assets.mediapipeModulePath;
632
+ this.mediapipeWasmPath = assets.mediapipeWasmPath;
633
+ this.faceLandmarkerModelPath = assets.faceLandmarkerModelPath;
634
+ this.minFrameIntervalMs = 1e3 / (options.maxFps ?? DEFAULT_MAX_FPS);
635
+ this.videoHandle = createHiddenVideoElement(stream, { keepStreamAlive: true });
636
+ try {
637
+ this.renderer.init();
638
+ this.landmarker = await this.createLandmarker();
639
+ if (this.stopped) {
640
+ this.landmarker?.close();
641
+ this.landmarker = null;
642
+ return;
643
+ }
644
+ const video = this.videoHandle?.element;
645
+ this.usingRvfc = !!(video && asRvfc(video));
646
+ this.scheduleNextFrame();
647
+ } catch (error) {
648
+ this.stop();
649
+ throw error;
650
+ }
651
+ }
652
+ /** rVFC (one callback per camera frame) when available, else capped rAF. (§1.) */
653
+ scheduleNextFrame() {
654
+ if (this.stopped) return;
655
+ const video = this.videoHandle?.element;
656
+ const rvfc = this.usingRvfc && video ? asRvfc(video) : null;
657
+ if (rvfc) this.rvfcHandle = rvfc.requestVideoFrameCallback(this.loop);
658
+ else this.rafId = requestAnimationFrame(this.loop);
659
+ }
660
+ stop() {
661
+ this.stopped = true;
662
+ if (this.rafId != null) {
663
+ cancelAnimationFrame(this.rafId);
664
+ this.rafId = null;
665
+ }
666
+ const stoppingVideo = this.videoHandle?.element;
667
+ if (stoppingVideo && this.rvfcHandle != null) {
668
+ asRvfc(stoppingVideo)?.cancelVideoFrameCallback(this.rvfcHandle);
669
+ this.rvfcHandle = null;
670
+ }
671
+ this.landmarker?.close();
672
+ this.landmarker = null;
673
+ this.renderer.dispose();
674
+ this.videoHandle?.dispose();
675
+ this.videoHandle = null;
676
+ }
677
+ /** Loads the FaceLandmarker via the shared shielded init (see mediapipeShared). */
678
+ createLandmarker() {
679
+ return createFaceLandmarker({
680
+ mediapipeModulePath: this.mediapipeModulePath,
681
+ mediapipeWasmPath: this.mediapipeWasmPath,
682
+ faceLandmarkerModelPath: this.faceLandmarkerModelPath
683
+ });
684
+ }
685
+ /** MediaPipe result → target pose (averaged-neutral calibration). */
686
+ ingest(result, vw, vh, now) {
687
+ const raw0 = computeRawPose(result, vw, vh);
688
+ if (!raw0) return;
689
+ const raw = this.applyMedian(raw0);
690
+ this.lastFaceAt = now;
691
+ if (!this.calibrated) {
692
+ this.calAttempts += 1;
693
+ const dRollMotion = Math.atan2(Math.sin(raw.roll - this.prevCalRoll), Math.cos(raw.roll - this.prevCalRoll));
694
+ const moved = Number.isFinite(this.prevCalYaw) && (Math.abs(raw.yaw - this.prevCalYaw) > CAL_MOTION_YAWPITCH || Math.abs(raw.pitch - this.prevCalPitch) > CAL_MOTION_YAWPITCH || Math.abs(dRollMotion) > CAL_MOTION_ROLL);
695
+ this.prevCalYaw = raw.yaw;
696
+ this.prevCalPitch = raw.pitch;
697
+ this.prevCalRoll = raw.roll;
698
+ const fallback = this.calAttempts >= NEUTRAL_FRAMES * CAL_FALLBACK_MULT;
699
+ if (!moved || fallback) {
700
+ this.nFrames += 1;
701
+ this.sum.yaw += raw.yaw;
702
+ this.sum.pitch += raw.pitch;
703
+ this.sum.roll += raw.roll;
704
+ this.sum.cx += raw.eyeMidX;
705
+ this.sum.cy += raw.eyeMidY;
706
+ this.sum.dist += raw.eyeDist;
707
+ this.sum.faceH += raw.faceH;
708
+ }
709
+ if (this.nFrames >= NEUTRAL_FRAMES) {
710
+ const n = this.nFrames;
711
+ this.neutral = {
712
+ yaw: clamp(this.sum.yaw / n, -AVATAR2D_NEUTRAL_BIAS.yaw, AVATAR2D_NEUTRAL_BIAS.yaw),
713
+ pitch: this.sum.pitch / n,
714
+ roll: clamp(this.sum.roll / n, -AVATAR2D_NEUTRAL_BIAS.roll, AVATAR2D_NEUTRAL_BIAS.roll),
715
+ cx: this.sum.cx / n,
716
+ cy: this.sum.cy / n,
717
+ dist: this.sum.dist / n || 1,
718
+ faceH: this.sum.faceH / n || 1
719
+ };
720
+ this.calibrated = true;
721
+ }
722
+ return;
723
+ }
724
+ const mapped = mapToPose(raw, this.neutral, AVATAR2D_POSE_CONFIG);
725
+ const { blink, mouthOpen, smile } = blinkMouthFromBlendshapes(result);
726
+ this.target = {
727
+ tracked: true,
728
+ headEuler: { ...mapped.headEuler },
729
+ rootOffset: { ...mapped.rootOffset },
730
+ depth: mapped.depth,
731
+ blink,
732
+ mouthOpen,
733
+ smile
734
+ };
735
+ if (!this.seeded) {
736
+ copyPoseInto(this.current, this.target);
737
+ this.seeded = true;
738
+ }
739
+ }
740
+ /**
741
+ * Outlier rejection (FACE_AVATAR.md → Pose pipeline): when the face is small in
742
+ * frame the detector emits single-frame spikes the deadzone/EMA can't reject —
743
+ * median-filter yaw/pitch/roll first. When the face is near, pass through and
744
+ * reset the buffers (no stale samples across distance regimes).
745
+ */
746
+ applyMedian(raw) {
747
+ if (!(raw.faceSizeRatio !== void 0 && raw.faceSizeRatio < MEDIAN_FACE_RATIO)) {
748
+ this.medYaw.reset();
749
+ this.medPitch.reset();
750
+ this.medRoll.reset();
751
+ return raw;
752
+ }
753
+ return {
754
+ ...raw,
755
+ yaw: this.medYaw.filter(raw.yaw),
756
+ pitch: this.medPitch.filter(raw.pitch),
757
+ roll: this.medRoll.filter(raw.roll)
758
+ };
759
+ }
760
+ smoothTowardTarget(dtMs) {
761
+ const c = this.current;
762
+ const t = this.target;
763
+ const ha = dtAlpha(HEAD_ALPHA, dtMs);
764
+ const pa = dtAlpha(POS_ALPHA, dtMs);
765
+ const da = dtAlpha(DEPTH_ALPHA, dtMs);
766
+ const ea = dtAlpha(EXPR_ALPHA, dtMs);
767
+ c.tracked = t.tracked;
768
+ c.headEuler.x += (t.headEuler.x - c.headEuler.x) * ha;
769
+ c.headEuler.y += (t.headEuler.y - c.headEuler.y) * ha;
770
+ c.headEuler.z += (t.headEuler.z - c.headEuler.z) * ha;
771
+ c.rootOffset.x += (t.rootOffset.x - c.rootOffset.x) * pa;
772
+ c.rootOffset.y += (t.rootOffset.y - c.rootOffset.y) * pa;
773
+ c.depth += (t.depth - c.depth) * da;
774
+ c.blink.left += (t.blink.left - c.blink.left) * ea;
775
+ c.blink.right += (t.blink.right - c.blink.right) * ea;
776
+ c.mouthOpen += (t.mouthOpen - c.mouthOpen) * ea;
777
+ c.smile += (t.smile - c.smile) * ea;
778
+ }
779
+ recreateLandmarker() {
780
+ this.detectFailures = 0;
781
+ this.landmarker?.close();
782
+ this.landmarker = null;
783
+ this.createLandmarker().then((lm) => {
784
+ if (this.stopped) {
785
+ lm.close();
786
+ return;
787
+ }
788
+ this.landmarker = lm;
789
+ }).catch(() => {});
790
+ }
791
+ };
792
+ function structuredClonePose(p) {
793
+ return {
794
+ tracked: p.tracked,
795
+ headEuler: { ...p.headEuler },
796
+ rootOffset: { ...p.rootOffset },
797
+ depth: p.depth,
798
+ blink: { ...p.blink },
799
+ mouthOpen: p.mouthOpen,
800
+ smile: p.smile
801
+ };
802
+ }
803
+ /** Copy src's values INTO dst's existing (mutated-in-place) objects — used to
804
+ * seed the smoother on the first tracked frame without reallocating `current`. */
805
+ function copyPoseInto(dst, src) {
806
+ dst.tracked = src.tracked;
807
+ dst.headEuler.x = src.headEuler.x;
808
+ dst.headEuler.y = src.headEuler.y;
809
+ dst.headEuler.z = src.headEuler.z;
810
+ dst.rootOffset.x = src.rootOffset.x;
811
+ dst.rootOffset.y = src.rootOffset.y;
812
+ dst.depth = src.depth;
813
+ dst.blink.left = src.blink.left;
814
+ dst.blink.right = src.blink.right;
815
+ dst.mouthOpen = src.mouthOpen;
816
+ dst.smile = src.smile;
817
+ }
818
+ /** Factory used by the avatar actor's provider selection (2D satin-face avatar). */
819
+ function createProvider() {
820
+ return new Avatar2DProvider();
821
+ }
822
+
823
+ //#endregion
824
+ export { createProvider };