@camera.ui/server 2.1.9 → 2.1.11

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 (725) hide show
  1. package/dist/interface/assets/404-B4_ZWIGx.js +1 -0
  2. package/dist/interface/assets/About-Cd8Ipr7a.js +1 -0
  3. package/dist/interface/assets/Automation-COZFDnKK.js +3 -0
  4. package/dist/interface/assets/AutomationImport-BTkkRikE.js +2 -0
  5. package/dist/interface/assets/AutomationStore-VdGEOwci.js +2 -0
  6. package/dist/interface/assets/AutomationStoreDetail-BQ2fER7x.js +2 -0
  7. package/dist/interface/assets/Automations-QmfGIQXO.js +2 -0
  8. package/dist/interface/assets/Camera-LSq1bWmA.css +1 -0
  9. package/dist/interface/assets/Camera-g95slrO0.js +2 -0
  10. package/dist/interface/assets/CameraConsole-KqRFGZzT.js +7 -0
  11. package/dist/interface/assets/Cameras-BO4SDgY0.js +652 -0
  12. package/dist/interface/assets/Camview-yzOY3cnD.js +1 -0
  13. package/dist/interface/assets/CertificateUpload-Dd4Ec7bt.js +1 -0
  14. package/dist/interface/assets/Config-Db-Eh4Lf.js +2 -0
  15. package/dist/interface/assets/{ConfigActionCameraControl-DWHg-YEU.js → ConfigActionCameraControl-CbG-HEuU.js} +1 -1
  16. package/dist/interface/assets/ConfigActionDelay-BoGIhNHr.js +1 -0
  17. package/dist/interface/assets/ConfigActionHttp-DyPo2XvQ.js +1 -0
  18. package/dist/interface/assets/ConfigActionImageInput-C9aYztb6.js +1 -0
  19. package/dist/interface/assets/ConfigActionMqtt-kQz9Y9OZ.js +1 -0
  20. package/dist/interface/assets/ConfigActionNotification-CbhQpAqn.js +1 -0
  21. package/dist/interface/assets/{ConfigActionNotificationControl-jSgxCZmV.js → ConfigActionNotificationControl-DEOv_FGO.js} +1 -1
  22. package/dist/interface/assets/ConfigActionOutput-CGtG-8PF.js +1 -0
  23. package/dist/interface/assets/ConfigActionPlugin-C8v0CWrz.js +1 -0
  24. package/dist/interface/assets/ConfigActionSensor-CESXnRuQ.js +1 -0
  25. package/dist/interface/assets/ConfigActionSnapshot-TVhjeFKP.js +1 -0
  26. package/dist/interface/assets/ConfigActionVariable-DwRFwopb.js +1 -0
  27. package/dist/interface/assets/ConfigConditionIfElse-CmtoYTUU.js +1 -0
  28. package/dist/interface/assets/ConfigConditionSensorState-3B9Sjxdb.js +1 -0
  29. package/dist/interface/assets/ConfigConditionSwitch-CA-tuT-G.js +1 -0
  30. package/dist/interface/assets/ConfigConditionTime-Djq2yOCr.js +1 -0
  31. package/dist/interface/assets/{ConfigSensorValueInput-DnMlFzil.js → ConfigSensorValueInput-DZ7r71aU.js} +1 -1
  32. package/dist/interface/assets/ConfigTriggerDetection-B62txb4H.js +1 -0
  33. package/dist/interface/assets/ConfigTriggerGeofence-sbEglk8c.js +1 -0
  34. package/dist/interface/assets/ConfigTriggerManual-nrYy4xBP.js +1 -0
  35. package/dist/interface/assets/ConfigTriggerMqtt-CK8FEVxs.js +1 -0
  36. package/dist/interface/assets/ConfigTriggerSchedule-DN3Tl7f4.js +1 -0
  37. package/dist/interface/assets/ConfigTriggerSensor-DBXrlYyS.js +1 -0
  38. package/dist/interface/assets/{ConfigTriggerSystem-CNBgtDF1.js → ConfigTriggerSystem-QFLNb9GC.js} +1 -1
  39. package/dist/interface/assets/ConfigTriggerWebhook-46mdJk6X.js +1 -0
  40. package/dist/interface/assets/Console-B78qXoaH.js +1 -0
  41. package/dist/interface/assets/CuiAutomationRunsDialog-BvtQfpTx.js +1 -0
  42. package/dist/interface/assets/CuiBottomSheet-BjkvcU8T.js +1 -0
  43. package/dist/interface/assets/CuiBottomSheet-UiJcO4M3.js +1 -0
  44. package/dist/interface/assets/CuiCameraPipCard-BOky075i.js +1 -0
  45. package/dist/interface/assets/CuiCameraRecordings-BzbwSK8-.css +1 -0
  46. package/dist/interface/assets/CuiCameraRecordings-DIBgpGaS.js +1 -0
  47. package/dist/interface/assets/CuiCameraShares-46_p-wPD.js +1 -0
  48. package/dist/interface/assets/CuiCameraTable-BXm5THd1.js +2 -0
  49. package/dist/interface/assets/CuiCameraTable-DwRywA0z.js +1 -0
  50. package/dist/interface/assets/CuiChartTable-ByHWgFTc.js +1 -0
  51. package/dist/interface/assets/CuiChartTable-DCGY-zVy.css +1 -0
  52. package/dist/interface/assets/{CuiConsole-CqEvNGe_.js → CuiConsole-BOyrbC0a.js} +2 -2
  53. package/dist/interface/assets/CuiDataTable-BDyku8Vr.js +1 -0
  54. package/dist/interface/assets/CuiLightControl-CsK2cn7L.js +1 -0
  55. package/dist/interface/assets/CuiList-D1d-S_-K.js +1 -0
  56. package/dist/interface/assets/CuiMarkdownContent-CckAX6Ci.js +1 -0
  57. package/dist/interface/assets/{CuiMarkdownContent-PSq4kE1G.js → CuiMarkdownContent-bAQw35id.js} +1 -1
  58. package/dist/interface/assets/CuiPluginCard-C-1ZhHi8.js +2 -0
  59. package/dist/interface/assets/CuiPluginCategoryChip-CCnZkkL5.js +1 -0
  60. package/dist/interface/assets/CuiPluginOAuthButton-CTKbdFZJ.js +2 -0
  61. package/dist/interface/assets/{CuiPluginTrustBadge-2wsPzYZA.js → CuiPluginTrustBadge-B_1b1iYf.js} +1 -1
  62. package/dist/interface/assets/CuiQRCode-B0CF6e-5.js +1 -0
  63. package/dist/interface/assets/CuiSchema-BYYeh269.css +1 -0
  64. package/dist/interface/assets/CuiSchema-CxRd72K7.js +1 -0
  65. package/dist/interface/assets/CuiTopNavbarItem-Bs4iRb31.js +1 -0
  66. package/dist/interface/assets/Faces-kl1hwT5M.js +1 -0
  67. package/dist/interface/assets/FirstSteps-BYGvfH-S.js +1 -0
  68. package/dist/interface/assets/Floorplan-DNd9aQv3.js +1 -0
  69. package/dist/interface/assets/Floorplan-Da5gt435.css +1 -0
  70. package/dist/interface/assets/Instances-aZApGeHu.js +1 -0
  71. package/dist/interface/assets/Logs-Bnq3wEXS.js +6 -0
  72. package/dist/interface/assets/Menu-M1PaPt5e.js +1 -0
  73. package/dist/interface/assets/Metrics-D5UHs6wj.js +9 -0
  74. package/dist/interface/assets/Metrics-DX59XXDc.css +1 -0
  75. package/dist/interface/assets/OAuthDeviceFlow-o2Irbs3_.js +1 -0
  76. package/dist/interface/assets/Plugin-CEpSsNQA.js +1 -0
  77. package/dist/interface/assets/PluginConsole-f5xf7P3Y.js +7 -0
  78. package/dist/interface/assets/PluginDetail-Ca-NJcL1.js +2 -0
  79. package/dist/interface/assets/PluginSchema-DMjDPtOB.js +1 -0
  80. package/dist/interface/assets/PluginSearch-DurGrb4n.js +1 -0
  81. package/dist/interface/assets/PluginSearch-Tmg5vCQF.js +2 -0
  82. package/dist/interface/assets/PluginUpdateProgress-FVY9RtmB.js +1 -0
  83. package/dist/interface/assets/Plugins-ocuSdXhB.js +1 -0
  84. package/dist/interface/assets/Recordings-CtSj2RuO.js +1 -0
  85. package/dist/interface/assets/Recordings-D4NzYCO9.css +1 -0
  86. package/dist/interface/assets/SensorEdit-CcD4LvZr.js +1 -0
  87. package/dist/interface/assets/SensorHistory-5nCWisih.js +1 -0
  88. package/dist/interface/assets/{Sensors-BUpob7LU.css → Sensors-BsLHVGqk.css} +1 -1
  89. package/dist/interface/assets/Sensors-CWjmo27p.js +2 -0
  90. package/dist/interface/assets/Settings-DsxjHlTb.js +1 -0
  91. package/dist/interface/assets/SettingsAccount-DQm9vFIT.js +1 -0
  92. package/dist/interface/assets/SettingsAccount-DekJwq5r.js +1 -0
  93. package/dist/interface/assets/SettingsAppearance-B7mm_vGf.js +1 -0
  94. package/dist/interface/assets/SettingsAppearance-Dc5qomCw.js +1 -0
  95. package/dist/interface/assets/SettingsBackup-xZ6fRlMp.js +1 -0
  96. package/dist/interface/assets/SettingsList-M3eOiLIi.js +1 -0
  97. package/dist/interface/assets/SettingsMqtt-D8grttey.js +1 -0
  98. package/dist/interface/assets/SettingsNotifications-BtFyN8J3.js +1 -0
  99. package/dist/interface/assets/SettingsPermissions-g6ppqzcI.js +1 -0
  100. package/dist/interface/assets/SettingsRecordings-DVEsPab-.js +1 -0
  101. package/dist/interface/assets/SettingsRemote-CtP6Gz9C.css +1 -0
  102. package/dist/interface/assets/SettingsRemote-Dqs-d-Xk.js +2 -0
  103. package/dist/interface/assets/SettingsSystem-EaqPKfS_.js +2 -0
  104. package/dist/interface/assets/SettingsUsers-B3m7YHzN.js +1 -0
  105. package/dist/interface/assets/Terminal-BXQKgvte.js +4 -0
  106. package/dist/interface/assets/Updates-Difs3xzH.js +2 -0
  107. package/dist/interface/assets/VariableInput-DNlqv5NS.js +1 -0
  108. package/dist/interface/assets/{VariableSuggestions-CrEa2zN-.js → VariableSuggestions-cR1Q4nfD.js} +1 -1
  109. package/dist/interface/assets/VersionsHandler-BHyZgGCP.js +7 -0
  110. package/dist/interface/assets/VirtualSensorCreate-CSzlXcHk.js +1 -0
  111. package/dist/interface/assets/{Workers-7hKMBU4w.css → Workers-DH59zE1C.css} +1 -1
  112. package/dist/interface/assets/Workers-L7PPidAd.js +2 -0
  113. package/dist/interface/assets/{account-DuSFtIHf.js → account-BW_r05fC.js} +1 -1
  114. package/dist/interface/assets/ace-BSiU5ylo.js +1 -0
  115. package/dist/interface/assets/{ace.config-BNjBs7Fe.js → ace.config-DIcQ8yOb.js} +1 -1
  116. package/dist/interface/assets/{alert-circle-C2AU59aR.js → alert-circle-We_nDFAy.js} +1 -1
  117. package/dist/interface/assets/alert-outline-KxFvd3i6.js +1 -0
  118. package/dist/interface/assets/api-Bpl4Sd0_.js +1 -0
  119. package/dist/interface/assets/api-CEbDxsSY.css +2 -0
  120. package/dist/interface/assets/api-ou2-S3Z9.js +2 -0
  121. package/dist/interface/assets/arrow-left-V1y_rwzT.js +1 -0
  122. package/dist/interface/assets/auth-O2tHbgZf.js +1 -0
  123. package/dist/interface/assets/automations-C3f5HUy2.js +1 -0
  124. package/dist/interface/assets/{back-filled-DcBDBvvP.js → back-filled-MAIFvJqE.js} +1 -1
  125. package/dist/interface/assets/{bell-ring-DSX81yd4.js → bell-ring-DBCDVZQy.js} +1 -1
  126. package/dist/interface/assets/brain-Bqf50oqB.js +1 -0
  127. package/dist/interface/assets/cameras.schema-BzSBpeUl.js +1 -0
  128. package/dist/interface/assets/cctv-Tng3HqLa.js +1 -0
  129. package/dist/interface/assets/check-circle-DNTQ812v.js +1 -0
  130. package/dist/interface/assets/chevron-down-DqCuosKP.js +1 -0
  131. package/dist/interface/assets/{clock-outline-DF1wLNzs.js → clock-outline-DwnISu0k.js} +1 -1
  132. package/dist/interface/assets/{close-BNAWPz0y.js → close-ChGy_BeH.js} +1 -1
  133. package/dist/interface/assets/{close-circle-zhDWvz98.js → close-circle-B9jFTQT1.js} +1 -1
  134. package/dist/interface/assets/{cloud-check-pUK1Fpt9.js → cloud-check-DABrVuto.js} +1 -1
  135. package/dist/interface/assets/cloudHandoff-ChRx5fsr.js +1 -0
  136. package/dist/interface/assets/config-BIxANITl.js +1 -0
  137. package/dist/interface/assets/content-copy-CsUEmnFS.js +1 -0
  138. package/dist/interface/assets/{copy-BPT84cDt.js → copy-CzGo5Njh.js} +1 -1
  139. package/dist/interface/assets/{cube-scan-DOe6W9mW.js → cube-scan-BR5la6Qx.js} +1 -1
  140. package/dist/interface/assets/delete-CiJ6ng5_.js +1 -0
  141. package/dist/interface/assets/{dist-Yc5s0_JB.js → dist-2BkH6KaN.js} +1 -1
  142. package/dist/interface/assets/download-CaV8-tw6.js +1 -0
  143. package/dist/interface/assets/esm-BbJ0evRe.js +1 -0
  144. package/dist/interface/assets/esm-BhHeaCLC.js +1 -0
  145. package/dist/interface/assets/esm-BoDnt3g2.js +1 -0
  146. package/dist/interface/assets/esm-BvXpx-4p.js +1 -0
  147. package/dist/interface/assets/esm-BvcRUTNT.js +1 -0
  148. package/dist/interface/assets/esm-C0UOpApX.js +1 -0
  149. package/dist/interface/assets/esm-C43w04L-.js +1 -0
  150. package/dist/interface/assets/esm-CdrLDSBm.js +1 -0
  151. package/dist/interface/assets/esm-Cwg8vrH-.js +1 -0
  152. package/dist/interface/assets/esm-DKQwb4z2.js +1 -0
  153. package/dist/interface/assets/esm-DcJy8m_I.js +1 -0
  154. package/dist/interface/assets/esm-Dp7jb0si.js +1 -0
  155. package/dist/interface/assets/esm-cbRd6tNR.js +1 -0
  156. package/dist/interface/assets/esm-iDhBQslT.js +1 -0
  157. package/dist/interface/assets/{eye-off-CaRq7Ks2.js → eye-off-DAhBNvxJ.js} +1 -1
  158. package/dist/interface/assets/eye-off-outline-Bj1tXD9w.js +1 -0
  159. package/dist/interface/assets/{flowSchema-CNnBxcwy.js → flowSchema-Cu_f8mZr.js} +1 -1
  160. package/dist/interface/assets/{history-SuH8IHAj.js → history-F0qTKQGT.js} +1 -1
  161. package/dist/interface/assets/home-DEKGoPL_.js +1 -0
  162. package/dist/interface/assets/{information-outline-BQDq8w2t.js → information-outline-CQ5e79wc.js} +1 -1
  163. package/dist/interface/assets/{intercomService-DJHBix4X.js → intercomService-JoKcW49f.js} +1 -1
  164. package/dist/interface/assets/lan-D9PCM8iA.js +1 -0
  165. package/dist/interface/assets/{lightbulb-outline-ClK17CO6.js → lightbulb-outline-BtraGBwO.js} +1 -1
  166. package/dist/interface/assets/main-BF8Mg561.css +1 -0
  167. package/dist/interface/assets/main-CT2dZ3bR.js +3 -0
  168. package/dist/interface/assets/{microphone-C0weJY9W.js → microphone-CGwzrMxl.js} +1 -1
  169. package/dist/interface/assets/minus-HH0UdIjG.js +1 -0
  170. package/dist/interface/assets/mqtt-D_ToI2JF.js +1 -0
  171. package/dist/interface/assets/native-BNjvFMoD.js +1 -0
  172. package/dist/interface/assets/native-XKbagpr7.js +1 -0
  173. package/dist/interface/assets/{nodeDefinitions-c5rXs9EW.js → nodeDefinitions-D6zhuw60.js} +1 -1
  174. package/dist/interface/assets/notifications-BZCPhbuG.js +1 -0
  175. package/dist/interface/assets/{pencil-outline-D7aD4cCo.js → pencil-outline-B5N-eyTy.js} +1 -1
  176. package/dist/interface/assets/plugin-BStPT8lW.js +1 -0
  177. package/dist/interface/assets/{plugins-5gXj0utE.js → plugins-DXYT--j6.js} +1 -1
  178. package/dist/interface/assets/{plus-CA5o30dE.js → plus-Ct9djYce.js} +1 -1
  179. package/dist/interface/assets/plus-CxnlTOHI.js +1 -0
  180. package/dist/interface/assets/power-C-XO8yWI.js +1 -0
  181. package/dist/interface/assets/radar-8nK_pSbi.js +1 -0
  182. package/dist/interface/assets/refresh-CygeIRWu.js +1 -0
  183. package/dist/interface/assets/restore-D_Dq23W9.js +1 -0
  184. package/dist/interface/assets/{ring-resize-DkY5EgVl.js → ring-resize-DsW_XYdA.js} +1 -1
  185. package/dist/interface/assets/rooms-BXXhWbYq.js +1 -0
  186. package/dist/interface/assets/{round-alt-arrow-left-bold-CfccdiWp.js → round-alt-arrow-left-bold-2FHg8vBl.js} +1 -1
  187. package/dist/interface/assets/{search-BZkSqZO5.js → search-Ck7b7yvI.js} +1 -1
  188. package/dist/interface/assets/sensorIcons-tORVN7ay.js +1 -0
  189. package/dist/interface/assets/sensors-ud0INKWh.js +1 -0
  190. package/dist/interface/assets/server-_f9tZajz.js +1 -0
  191. package/dist/interface/assets/{settings-BUEZ5iRE.js → settings-Bw6giVLH.js} +1 -1
  192. package/dist/interface/assets/{source-branch-ztDB0e13.js → source-branch-K7YOvHCE.js} +1 -1
  193. package/dist/interface/assets/theme-t4dIArYy.js +1 -0
  194. package/dist/interface/assets/{trash-2-DMMlSPXn.js → trash-2-eaKaSMof.js} +1 -1
  195. package/dist/interface/assets/trash-can-outline-_aiv_oEu.js +1 -0
  196. package/dist/interface/assets/{trash-fill-DevIK050.js → trash-fill-OkxLbTTj.js} +1 -1
  197. package/dist/interface/assets/{trash2-BLScx4HX.js → trash2-Czz-2j5D.js} +1 -1
  198. package/dist/interface/assets/types-CCCcoJBr.js +1 -0
  199. package/dist/interface/assets/{types-fCQkAGfW.js → types-D889aM6c.js} +1 -1
  200. package/dist/interface/assets/types-Dg1X10xd.js +1 -0
  201. package/dist/interface/assets/undo-RdNzlJdm.js +1 -0
  202. package/dist/interface/assets/ungrouped-Pn6rAXZt.js +1 -0
  203. package/dist/interface/assets/{CuiRecordingsGrid-Q4C3aeLo.css → ungrouped-uv64nr5n.css} +1 -1
  204. package/dist/interface/assets/updates-i-Ukebxe.js +1 -0
  205. package/dist/interface/assets/upload-DCTSXaJV.js +1 -0
  206. package/dist/interface/assets/upload-D_9SZvdG.js +1 -0
  207. package/dist/interface/assets/{useAppVersion-9zH_FspP.js → useAppVersion-DY0h_lct.js} +1 -1
  208. package/dist/interface/assets/useBackupRestore-BcAR3KYA.js +1 -0
  209. package/dist/interface/assets/{useCameraOptions-BIaDXHeq.js → useCameraOptions-C-rXBi8d.js} +1 -1
  210. package/dist/interface/assets/{useLogsSocket-BLV7dWSG.js → useLogsSocket-Bigb4u3j.js} +1 -1
  211. package/dist/interface/assets/{useNavLayout-wq-6JyWK.js → useNavLayout-C9FWniNC.js} +1 -1
  212. package/dist/interface/assets/{usePermissions-BiBlyeQl.js → usePermissions-C_4RPiE4.js} +1 -1
  213. package/dist/interface/assets/{usePluginUpdates-BZJSqnSF.js → usePluginUpdates-CQwLK3om.js} +1 -1
  214. package/dist/interface/assets/{usePushRegistration-CGFiyCuv.js → usePushRegistration-sYPibp5s.js} +2 -2
  215. package/dist/interface/assets/useServerRestart-B0Cfu10q.js +1 -0
  216. package/dist/interface/assets/{useStreamStatus-BFCF1B3T.js → useStreamStatus-BLXdLAvK.js} +1 -1
  217. package/dist/interface/assets/useTabSwipe-C3qfclkm.js +1 -0
  218. package/dist/interface/assets/useUpdateChannel-DvO5NQPE.js +1 -0
  219. package/dist/interface/assets/useUpdatesSocket-C6wTDGIg.js +1 -0
  220. package/dist/interface/assets/useUserOptions-B9T46skV.js +1 -0
  221. package/dist/interface/assets/{variable-CCMnQpL2.js → variable-CYzMRxrK.js} +1 -1
  222. package/dist/interface/assets/vendor-AX0A8AMd.js +20 -0
  223. package/dist/interface/assets/{vendor-ace-DIEVbs6L.js → vendor-ace-Bxj8w-af.js} +11 -11
  224. package/dist/interface/assets/vendor-cameraui-OySaGjmo.js +2326 -0
  225. package/dist/interface/assets/{vendor-capacitor-4nn-eF9U.js → vendor-capacitor-B-ykF6jr.js} +2 -2
  226. package/dist/interface/assets/vendor-chart-C-1xJhJN.js +3 -0
  227. package/dist/interface/assets/vendor-core-BZ52eUwC.js +1 -0
  228. package/dist/interface/assets/{vendor-dnd-ChrDrMuz.js → vendor-dnd-onyWAbsd.js} +1 -1
  229. package/dist/interface/assets/{vendor-draggabilly-DSeIE_bQ.js → vendor-draggabilly-B7q3Src-.js} +1 -1
  230. package/dist/interface/assets/{vendor-gridstack-DsRWLz0m.css → vendor-gridstack-7uZBsdEh.css} +1 -1
  231. package/dist/interface/assets/vendor-gridstack-C5hqQCSi.js +3 -0
  232. package/dist/interface/assets/{vendor-leaflet-Bcgd-fkG.js → vendor-leaflet-aXJ6sRgf.js} +1 -1
  233. package/dist/interface/assets/{vendor-markdown-Bw_90xkF.js → vendor-markdown-pUmink8s.js} +4 -4
  234. package/dist/interface/assets/{vendor-primevue-b9CB9Uh0.js → vendor-primevue-CvHDsVi_.js} +73 -73
  235. package/dist/interface/assets/vendor-vueflow-8uLknwcA.js +26 -0
  236. package/dist/interface/assets/vendor-xterm-Bor91IHm.js +85 -0
  237. package/dist/interface/assets/{vendor-zod-Dbq0fBXY.js → vendor-zod-B0ZFM2Pr.js} +1 -1
  238. package/dist/interface/assets/web-BFaZfzEP.js +1 -0
  239. package/dist/interface/assets/web-BdoMdiEl.js +1 -0
  240. package/dist/interface/assets/web-BjKL51lK-BiZEVgwj.js +1 -0
  241. package/dist/interface/assets/web-Bo0giiE9.js +1 -0
  242. package/dist/interface/assets/web-Bq6cS9c5.js +1 -0
  243. package/dist/interface/assets/web-Ckkk3gWT.js +1 -0
  244. package/dist/interface/assets/web-CsH298dH.js +1 -0
  245. package/dist/interface/assets/web-Cti9cQXr.js +1 -0
  246. package/dist/interface/assets/web-CtlJwfNS.js +1 -0
  247. package/dist/interface/assets/web-DUuNw0Ig.js +1 -0
  248. package/dist/interface/assets/web-Dz9QrW1k.js +1 -0
  249. package/dist/interface/assets/web-MA3uDo37.js +1 -0
  250. package/dist/interface/assets/web-UiUgCX6p.js +1 -0
  251. package/dist/interface/assets/web-zisLysQx.js +1 -0
  252. package/dist/interface/assets/{webhook-DQiZUPv8.js → webhook-CPF2kUgU.js} +1 -1
  253. package/dist/interface/assets/workbox-window.prod.es5-CocanelX.js +1 -0
  254. package/dist/interface/assets/{zoom-in-Du1IB9oA.js → zoom-in-D-OIVcXF.js} +1 -1
  255. package/dist/interface/index.html +51 -45
  256. package/dist/interface/sw.js +1 -1
  257. package/dist/server/package.json +21 -29
  258. package/dist/server/requirements.txt +4 -4
  259. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/signal_handler.py +2 -6
  260. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/__init__.py +12 -0
  261. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/__init__.py +4 -0
  262. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/config.py +10 -0
  263. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/detection.py +3 -3
  264. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/enums.py +6 -0
  265. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/manager/__init__.py +91 -1
  266. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/__init__.py +2 -0
  267. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/contract.py +3 -0
  268. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/interfaces.py +64 -1
  269. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/detection.py +3 -3
  270. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/object.py +6 -1
  271. package/dist/server/src/api/controllers/auth.controller.d.ts +0 -1
  272. package/dist/server/src/api/controllers/auth.controller.js +1 -18
  273. package/dist/server/src/api/controllers/auth.controller.js.map +1 -1
  274. package/dist/server/src/api/controllers/floorplan.controller.d.ts +11 -0
  275. package/dist/server/src/api/controllers/floorplan.controller.js +27 -0
  276. package/dist/server/src/api/controllers/floorplan.controller.js.map +1 -0
  277. package/dist/server/src/api/controllers/frameWorkers.controller.d.ts +2 -2
  278. package/dist/server/src/api/controllers/frameWorkers.controller.js +26 -49
  279. package/dist/server/src/api/controllers/frameWorkers.controller.js.map +1 -1
  280. package/dist/server/src/api/controllers/remote.controller.d.ts +1 -1
  281. package/dist/server/src/api/controllers/remote.controller.js +15 -24
  282. package/dist/server/src/api/controllers/remote.controller.js.map +1 -1
  283. package/dist/server/src/api/controllers/rooms.controller.d.ts +18 -0
  284. package/dist/server/src/api/controllers/rooms.controller.js +48 -0
  285. package/dist/server/src/api/controllers/rooms.controller.js.map +1 -0
  286. package/dist/server/src/api/controllers/sensors.controller.d.ts +1 -2
  287. package/dist/server/src/api/controllers/sensors.controller.js +0 -14
  288. package/dist/server/src/api/controllers/sensors.controller.js.map +1 -1
  289. package/dist/server/src/api/controllers/server.controller.d.ts +3 -0
  290. package/dist/server/src/api/controllers/server.controller.js +61 -3
  291. package/dist/server/src/api/controllers/server.controller.js.map +1 -1
  292. package/dist/server/src/api/controllers/updates.controller.d.ts +8 -0
  293. package/dist/server/src/api/controllers/updates.controller.js +40 -0
  294. package/dist/server/src/api/controllers/updates.controller.js.map +1 -0
  295. package/dist/server/src/api/controllers/workers.controller.js +8 -2
  296. package/dist/server/src/api/controllers/workers.controller.js.map +1 -1
  297. package/dist/server/src/api/database/constants.d.ts +2 -0
  298. package/dist/server/src/api/database/constants.js +2 -0
  299. package/dist/server/src/api/database/constants.js.map +1 -1
  300. package/dist/server/src/api/database/index.d.ts +4 -2
  301. package/dist/server/src/api/database/index.js +17 -6
  302. package/dist/server/src/api/database/index.js.map +1 -1
  303. package/dist/server/src/api/database/migrations/v2-1-11.js.map +1 -1
  304. package/dist/server/src/api/database/migrations/v2-1-13.d.ts +3 -0
  305. package/dist/server/src/api/database/migrations/v2-1-13.js +51 -0
  306. package/dist/server/src/api/database/migrations/v2-1-13.js.map +1 -0
  307. package/dist/server/src/api/database/migrations/v2-1-14.d.ts +3 -0
  308. package/dist/server/src/api/database/migrations/v2-1-14.js +87 -0
  309. package/dist/server/src/api/database/migrations/v2-1-14.js.map +1 -0
  310. package/dist/server/src/api/database/migrations/v2-1-15.d.ts +3 -0
  311. package/dist/server/src/api/database/migrations/v2-1-15.js +160 -0
  312. package/dist/server/src/api/database/migrations/v2-1-15.js.map +1 -0
  313. package/dist/server/src/api/database/migrations/v2-1-16.d.ts +3 -0
  314. package/dist/server/src/api/database/migrations/v2-1-16.js +36 -0
  315. package/dist/server/src/api/database/migrations/v2-1-16.js.map +1 -0
  316. package/dist/server/src/api/database/record-schemas.d.ts +65 -1
  317. package/dist/server/src/api/database/record-schemas.js +74 -0
  318. package/dist/server/src/api/database/record-schemas.js.map +1 -1
  319. package/dist/server/src/api/database/types.d.ts +68 -0
  320. package/dist/server/src/api/index.js +4 -0
  321. package/dist/server/src/api/index.js.map +1 -1
  322. package/dist/server/src/api/routes/floorplan.routes.d.ts +2 -0
  323. package/dist/server/src/api/routes/floorplan.routes.js +29 -0
  324. package/dist/server/src/api/routes/floorplan.routes.js.map +1 -0
  325. package/dist/server/src/api/routes/index.js +7 -1
  326. package/dist/server/src/api/routes/index.js.map +1 -1
  327. package/dist/server/src/api/routes/rooms.routes.d.ts +2 -0
  328. package/dist/server/src/api/routes/rooms.routes.js +40 -0
  329. package/dist/server/src/api/routes/rooms.routes.js.map +1 -0
  330. package/dist/server/src/api/routes/sensors.routes.js +1 -12
  331. package/dist/server/src/api/routes/sensors.routes.js.map +1 -1
  332. package/dist/server/src/api/routes/server.routes.js +33 -0
  333. package/dist/server/src/api/routes/server.routes.js.map +1 -1
  334. package/dist/server/src/api/routes/updates.routes.d.ts +2 -0
  335. package/dist/server/src/api/routes/updates.routes.js +47 -0
  336. package/dist/server/src/api/routes/updates.routes.js.map +1 -0
  337. package/dist/server/src/api/routes/workers.routes.js +3 -2
  338. package/dist/server/src/api/routes/workers.routes.js.map +1 -1
  339. package/dist/server/src/api/schemas/cameras.schema.d.ts +134 -55
  340. package/dist/server/src/api/schemas/cameras.schema.js +35 -3
  341. package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
  342. package/dist/server/src/api/schemas/config.schema.d.ts +0 -12
  343. package/dist/server/src/api/schemas/config.schema.js +1 -10
  344. package/dist/server/src/api/schemas/config.schema.js.map +1 -1
  345. package/dist/server/src/api/schemas/floorplan.schema.d.ts +110 -0
  346. package/dist/server/src/api/schemas/floorplan.schema.js +61 -0
  347. package/dist/server/src/api/schemas/floorplan.schema.js.map +1 -0
  348. package/dist/server/src/api/schemas/rooms.schema.d.ts +12 -0
  349. package/dist/server/src/api/schemas/rooms.schema.js +14 -0
  350. package/dist/server/src/api/schemas/rooms.schema.js.map +1 -0
  351. package/dist/server/src/api/schemas/sensors.schema.d.ts +0 -8
  352. package/dist/server/src/api/schemas/sensors.schema.js +1 -6
  353. package/dist/server/src/api/schemas/sensors.schema.js.map +1 -1
  354. package/dist/server/src/api/schemas/users.schema.d.ts +8 -8
  355. package/dist/server/src/api/schemas/workers.schema.d.ts +3 -0
  356. package/dist/server/src/api/schemas/workers.schema.js +5 -0
  357. package/dist/server/src/api/schemas/workers.schema.js.map +1 -1
  358. package/dist/server/src/api/services/backup.service.js +4 -5
  359. package/dist/server/src/api/services/backup.service.js.map +1 -1
  360. package/dist/server/src/api/services/cameras.service.d.ts +7 -0
  361. package/dist/server/src/api/services/cameras.service.js +41 -12
  362. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  363. package/dist/server/src/api/services/floorplan.service.d.ts +19 -0
  364. package/dist/server/src/api/services/floorplan.service.js +173 -0
  365. package/dist/server/src/api/services/floorplan.service.js.map +1 -0
  366. package/dist/server/src/api/services/plugins.service.d.ts +4 -1
  367. package/dist/server/src/api/services/plugins.service.js +27 -7
  368. package/dist/server/src/api/services/plugins.service.js.map +1 -1
  369. package/dist/server/src/api/services/rooms.service.d.ts +17 -0
  370. package/dist/server/src/api/services/rooms.service.js +121 -0
  371. package/dist/server/src/api/services/rooms.service.js.map +1 -0
  372. package/dist/server/src/api/services/sensors.service.d.ts +2 -1
  373. package/dist/server/src/api/services/sensors.service.js +24 -5
  374. package/dist/server/src/api/services/sensors.service.js.map +1 -1
  375. package/dist/server/src/api/services/server.service.d.ts +3 -1
  376. package/dist/server/src/api/services/server.service.js +12 -2
  377. package/dist/server/src/api/services/server.service.js.map +1 -1
  378. package/dist/server/src/api/services/updates.service.d.ts +110 -0
  379. package/dist/server/src/api/services/updates.service.js +491 -0
  380. package/dist/server/src/api/services/updates.service.js.map +1 -0
  381. package/dist/server/src/api/types/index.d.ts +7 -6
  382. package/dist/server/src/api/utils/cert.d.ts +1 -0
  383. package/dist/server/src/api/utils/cert.js +58 -29
  384. package/dist/server/src/api/utils/cert.js.map +1 -1
  385. package/dist/server/src/api/utils/constants.d.ts +3 -0
  386. package/dist/server/src/api/utils/constants.js +3 -0
  387. package/dist/server/src/api/utils/constants.js.map +1 -1
  388. package/dist/server/src/api/utils/custom-cert.d.ts +48 -0
  389. package/dist/server/src/api/utils/custom-cert.js +193 -0
  390. package/dist/server/src/api/utils/custom-cert.js.map +1 -0
  391. package/dist/server/src/api/websocket/index.js +5 -1
  392. package/dist/server/src/api/websocket/index.js.map +1 -1
  393. package/dist/server/src/api/websocket/nsp/metrics.d.ts +2 -0
  394. package/dist/server/src/api/websocket/nsp/metrics.js +36 -4
  395. package/dist/server/src/api/websocket/nsp/metrics.js.map +1 -1
  396. package/dist/server/src/api/websocket/nsp/sensors.d.ts +14 -0
  397. package/dist/server/src/api/websocket/nsp/sensors.js +83 -0
  398. package/dist/server/src/api/websocket/nsp/sensors.js.map +1 -0
  399. package/dist/server/src/api/websocket/nsp/server.js +43 -7
  400. package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
  401. package/dist/server/src/api/websocket/types.d.ts +4 -1
  402. package/dist/server/src/camera/controller.js +3 -2
  403. package/dist/server/src/camera/controller.js.map +1 -1
  404. package/dist/server/src/camera/decoder/child.js +3 -0
  405. package/dist/server/src/camera/decoder/child.js.map +1 -1
  406. package/dist/server/src/camera/decoder/debug/detection-record.d.ts +6 -0
  407. package/dist/server/src/camera/decoder/debug/detection-record.js +21 -0
  408. package/dist/server/src/camera/decoder/debug/detection-record.js.map +1 -1
  409. package/dist/server/src/camera/decoder/detection-coordinator.d.ts +23 -3
  410. package/dist/server/src/camera/decoder/detection-coordinator.js +342 -96
  411. package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
  412. package/dist/server/src/camera/decoder/detection-pipeline.d.ts +3 -1
  413. package/dist/server/src/camera/decoder/detection-pipeline.js +12 -4
  414. package/dist/server/src/camera/decoder/detection-pipeline.js.map +1 -1
  415. package/dist/server/src/camera/decoder/detection-window.d.ts +17 -0
  416. package/dist/server/src/camera/decoder/detection-window.js +188 -0
  417. package/dist/server/src/camera/decoder/detection-window.js.map +1 -0
  418. package/dist/server/src/camera/decoder/event-manager.d.ts +1 -0
  419. package/dist/server/src/camera/decoder/event-manager.js +36 -4
  420. package/dist/server/src/camera/decoder/event-manager.js.map +1 -1
  421. package/dist/server/src/camera/decoder/event-thumbnailer.js +0 -2
  422. package/dist/server/src/camera/decoder/event-thumbnailer.js.map +1 -1
  423. package/dist/server/src/camera/decoder/frame-scaler.d.ts +12 -0
  424. package/dist/server/src/camera/decoder/frame-scaler.js +39 -7
  425. package/dist/server/src/camera/decoder/frame-scaler.js.map +1 -1
  426. package/dist/server/src/camera/decoder/hardware.d.ts +1 -0
  427. package/dist/server/src/camera/decoder/hardware.js +11 -0
  428. package/dist/server/src/camera/decoder/hardware.js.map +1 -1
  429. package/dist/server/src/camera/decoder/motion-localizer.d.ts +16 -0
  430. package/dist/server/src/camera/decoder/motion-localizer.js +49 -0
  431. package/dist/server/src/camera/decoder/motion-localizer.js.map +1 -0
  432. package/dist/server/src/camera/decoder/nvr-sink.d.ts +4 -0
  433. package/dist/server/src/camera/decoder/nvr-sink.js +1 -1
  434. package/dist/server/src/camera/decoder/nvr-sink.js.map +1 -1
  435. package/dist/server/src/camera/decoder/perf-tracker.d.ts +2 -0
  436. package/dist/server/src/camera/decoder/perf-tracker.js +4 -0
  437. package/dist/server/src/camera/decoder/perf-tracker.js.map +1 -1
  438. package/dist/server/src/camera/decoder/plugin-registry.js +1 -6
  439. package/dist/server/src/camera/decoder/plugin-registry.js.map +1 -1
  440. package/dist/server/src/camera/decoder/sources/analysis-source.d.ts +1 -0
  441. package/dist/server/src/camera/decoder/sources/audio-source.js +0 -1
  442. package/dist/server/src/camera/decoder/sources/audio-source.js.map +1 -1
  443. package/dist/server/src/camera/decoder/sources/buffered-source.d.ts +1 -0
  444. package/dist/server/src/camera/decoder/sources/buffered-source.js +38 -0
  445. package/dist/server/src/camera/decoder/sources/buffered-source.js.map +1 -1
  446. package/dist/server/src/camera/decoder/types.d.ts +9 -8
  447. package/dist/server/src/camera/decoder/types.js.map +1 -1
  448. package/dist/server/src/camera/decoder/worker.js +7 -5
  449. package/dist/server/src/camera/decoder/worker.js.map +1 -1
  450. package/dist/server/src/go2rtc/index.js +10 -2
  451. package/dist/server/src/go2rtc/index.js.map +1 -1
  452. package/dist/server/src/main.js +40 -13
  453. package/dist/server/src/main.js.map +1 -1
  454. package/dist/server/src/manager/coreManager.d.ts +7 -4
  455. package/dist/server/src/manager/coreManager.js +19 -1
  456. package/dist/server/src/manager/coreManager.js.map +1 -1
  457. package/dist/server/src/manager/downloadManager.d.ts +1 -0
  458. package/dist/server/src/manager/downloadManager.js +30 -4
  459. package/dist/server/src/manager/downloadManager.js.map +1 -1
  460. package/dist/server/src/manager/types.d.ts +1 -0
  461. package/dist/server/src/manager/types.js +2 -0
  462. package/dist/server/src/manager/types.js.map +1 -1
  463. package/dist/server/src/mqtt/ha-discovery.js +0 -1
  464. package/dist/server/src/mqtt/ha-discovery.js.map +1 -1
  465. package/dist/server/src/plugins/index.js +0 -2
  466. package/dist/server/src/plugins/index.js.map +1 -1
  467. package/dist/server/src/plugins/runtime/base.d.ts +2 -1
  468. package/dist/server/src/plugins/runtime/base.js +16 -4
  469. package/dist/server/src/plugins/runtime/base.js.map +1 -1
  470. package/dist/server/src/plugins/runtime/node/child.js +3 -0
  471. package/dist/server/src/plugins/runtime/node/child.js.map +1 -1
  472. package/dist/server/src/plugins/runtime/node/index.js +2 -2
  473. package/dist/server/src/plugins/runtime/node/index.js.map +1 -1
  474. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js +39 -28
  475. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js.map +1 -1
  476. package/dist/server/src/plugins/runtime/node/proxy/limiter.d.ts +1 -0
  477. package/dist/server/src/plugins/runtime/node/proxy/limiter.js +21 -0
  478. package/dist/server/src/plugins/runtime/node/proxy/limiter.js.map +1 -0
  479. package/dist/server/src/plugins/runtime/node/proxy/sensorManager.d.ts +3 -1
  480. package/dist/server/src/plugins/runtime/node/proxy/sensorManager.js +63 -47
  481. package/dist/server/src/plugins/runtime/node/proxy/sensorManager.js.map +1 -1
  482. package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +5 -0
  483. package/dist/server/src/plugins/runtime/python/proxy/limiter.py +14 -0
  484. package/dist/server/src/plugins/runtime/python/proxy/sensor.py +4 -0
  485. package/dist/server/src/plugins/runtime/python/proxy/sensor_manager.py +35 -1
  486. package/dist/server/src/plugins/runtime/python/rpc/typings.py +4 -1
  487. package/dist/server/src/plugins/worker.js +1 -0
  488. package/dist/server/src/plugins/worker.js.map +1 -1
  489. package/dist/server/src/remote/types.d.ts +1 -2
  490. package/dist/server/src/rpc/index.js +2 -2
  491. package/dist/server/src/rpc/index.js.map +1 -1
  492. package/dist/server/src/rpc/interfaces/core.d.ts +19 -2
  493. package/dist/server/src/rpc/interfaces/sensor.d.ts +29 -1
  494. package/dist/server/src/rpc/leafConnection.d.ts +12 -0
  495. package/dist/server/src/rpc/leafConnection.js +60 -0
  496. package/dist/server/src/rpc/leafConnection.js.map +1 -0
  497. package/dist/server/src/rpc/namespaces.d.ts +4 -0
  498. package/dist/server/src/rpc/namespaces.js +5 -0
  499. package/dist/server/src/rpc/namespaces.js.map +1 -1
  500. package/dist/server/src/rpc/server.d.ts +2 -0
  501. package/dist/server/src/rpc/server.js +11 -5
  502. package/dist/server/src/rpc/server.js.map +1 -1
  503. package/dist/server/src/sensors/discovery.d.ts +29 -0
  504. package/dist/server/src/sensors/discovery.js +149 -0
  505. package/dist/server/src/sensors/discovery.js.map +1 -0
  506. package/dist/server/src/sensors/registry.d.ts +2 -2
  507. package/dist/server/src/sensors/registry.js +31 -10
  508. package/dist/server/src/sensors/registry.js.map +1 -1
  509. package/dist/server/src/services/config/constants.js +1 -2
  510. package/dist/server/src/services/config/constants.js.map +1 -1
  511. package/dist/server/src/services/config/defaults.d.ts +1 -2
  512. package/dist/server/src/services/config/defaults.js +0 -6
  513. package/dist/server/src/services/config/defaults.js.map +1 -1
  514. package/dist/server/src/services/config/index.d.ts +10 -0
  515. package/dist/server/src/services/config/index.js +96 -35
  516. package/dist/server/src/services/config/index.js.map +1 -1
  517. package/dist/server/src/services/config/types.d.ts +0 -7
  518. package/dist/server/src/types.d.ts +10 -1
  519. package/dist/server/src/utils/camera.d.ts +1 -0
  520. package/dist/server/src/utils/camera.js +7 -0
  521. package/dist/server/src/utils/camera.js.map +1 -1
  522. package/dist/server/src/utils/crash.d.ts +2 -0
  523. package/dist/server/src/utils/crash.js +14 -0
  524. package/dist/server/src/utils/crash.js.map +1 -0
  525. package/dist/server/src/utils/ipc.d.ts +9 -0
  526. package/dist/server/src/utils/ipc.js +31 -5
  527. package/dist/server/src/utils/ipc.js.map +1 -1
  528. package/dist/server/src/utils/process-exit.d.ts +5 -0
  529. package/dist/server/src/utils/process-exit.js +11 -0
  530. package/dist/server/src/utils/process-exit.js.map +1 -0
  531. package/dist/server/src/utils/system-info.d.ts +9 -0
  532. package/dist/server/src/utils/system-info.js +48 -0
  533. package/dist/server/src/utils/system-info.js.map +1 -0
  534. package/dist/server/src/workers/agent.d.ts +3 -0
  535. package/dist/server/src/workers/agent.js +38 -7
  536. package/dist/server/src/workers/agent.js.map +1 -1
  537. package/dist/server/src/workers/capabilities/frame-decoding.d.ts +2 -2
  538. package/dist/server/src/workers/capabilities/frame-decoding.js +17 -6
  539. package/dist/server/src/workers/capabilities/frame-decoding.js.map +1 -1
  540. package/dist/server/src/workers/capabilities/handler.d.ts +2 -2
  541. package/dist/server/src/workers/capabilities/plugin-host.d.ts +2 -2
  542. package/dist/server/src/workers/capabilities/plugin-host.js +6 -6
  543. package/dist/server/src/workers/capabilities/plugin-host.js.map +1 -1
  544. package/dist/server/src/workers/manager.d.ts +9 -1
  545. package/dist/server/src/workers/manager.js +24 -0
  546. package/dist/server/src/workers/manager.js.map +1 -1
  547. package/dist/server/src/workers/types.d.ts +14 -0
  548. package/dist/server/src/workers/types.js.map +1 -1
  549. package/package.json +21 -29
  550. package/dist/interface/assets/404-BEb5gvkW.js +0 -1
  551. package/dist/interface/assets/About-BKkjuIVJ.js +0 -1
  552. package/dist/interface/assets/Automation-DA89AEEI.js +0 -3
  553. package/dist/interface/assets/AutomationImport-hYr3Lp8F.js +0 -2
  554. package/dist/interface/assets/AutomationStore-DKhnExZn.js +0 -2
  555. package/dist/interface/assets/AutomationStoreDetail-DmqqEOir.js +0 -2
  556. package/dist/interface/assets/Automations-B6WFJyxS.js +0 -2
  557. package/dist/interface/assets/Camera-C5gF7yVN.css +0 -1
  558. package/dist/interface/assets/Camera-DmsSKvpY.js +0 -2
  559. package/dist/interface/assets/CameraConsole-DVpyGhx8.js +0 -7
  560. package/dist/interface/assets/Cameras-KOOphtlx.js +0 -652
  561. package/dist/interface/assets/Camview-BPQIinyP.js +0 -1
  562. package/dist/interface/assets/Config-DeUec_TN.js +0 -2
  563. package/dist/interface/assets/ConfigActionDelay-C8nNA7TC.js +0 -1
  564. package/dist/interface/assets/ConfigActionHttp-Dc97gItH.js +0 -1
  565. package/dist/interface/assets/ConfigActionImageInput-DpOGqlzA.js +0 -1
  566. package/dist/interface/assets/ConfigActionMqtt-D5DJ21oe.js +0 -1
  567. package/dist/interface/assets/ConfigActionNotification-4wKfanGB.js +0 -1
  568. package/dist/interface/assets/ConfigActionOutput-C8Esieni.js +0 -1
  569. package/dist/interface/assets/ConfigActionPlugin-C_cv60d3.js +0 -1
  570. package/dist/interface/assets/ConfigActionSensor-CFIKoJ3-.js +0 -1
  571. package/dist/interface/assets/ConfigActionSnapshot-BqaTwtN3.js +0 -1
  572. package/dist/interface/assets/ConfigActionVariable-De9RCGU4.js +0 -1
  573. package/dist/interface/assets/ConfigConditionIfElse-CeNDIucw.js +0 -1
  574. package/dist/interface/assets/ConfigConditionSensorState-C_Q9gU23.js +0 -1
  575. package/dist/interface/assets/ConfigConditionSwitch-DR63IGcD.js +0 -1
  576. package/dist/interface/assets/ConfigConditionTime-C9iuSxxe.js +0 -1
  577. package/dist/interface/assets/ConfigTriggerDetection-iThbCKOO.js +0 -1
  578. package/dist/interface/assets/ConfigTriggerGeofence-BeKwVWvS.js +0 -1
  579. package/dist/interface/assets/ConfigTriggerManual-DPkRlUqD.js +0 -1
  580. package/dist/interface/assets/ConfigTriggerMqtt-kd65tGJE.js +0 -1
  581. package/dist/interface/assets/ConfigTriggerSchedule-D6MoVDPc.js +0 -1
  582. package/dist/interface/assets/ConfigTriggerSensor-AMQM6f2r.js +0 -1
  583. package/dist/interface/assets/ConfigTriggerWebhook-B70DobSi.js +0 -1
  584. package/dist/interface/assets/Console-N_2Vornl.js +0 -1
  585. package/dist/interface/assets/CuiAutomationRunsDialog-Cp6Apki9.js +0 -1
  586. package/dist/interface/assets/CuiBottomSheet-CIR_fmSk.js +0 -1
  587. package/dist/interface/assets/CuiBottomSheet-D5N8X1K-.js +0 -1
  588. package/dist/interface/assets/CuiCameraPipCard-DP6X45oq.js +0 -1
  589. package/dist/interface/assets/CuiCameraRecordings-AA-sBtb4.css +0 -1
  590. package/dist/interface/assets/CuiCameraRecordings-CRjXsdO4.js +0 -1
  591. package/dist/interface/assets/CuiCameraShares-DMHwZEf1.js +0 -1
  592. package/dist/interface/assets/CuiCameraTable-AnEPu3XS.js +0 -2
  593. package/dist/interface/assets/CuiCameraTable-D5ZqTLVt.js +0 -1
  594. package/dist/interface/assets/CuiDataTable-wA_LbHH8.js +0 -1
  595. package/dist/interface/assets/CuiLightControl-CB_Tp4tI.js +0 -1
  596. package/dist/interface/assets/CuiList-DrYuFhK4.js +0 -1
  597. package/dist/interface/assets/CuiMarkdownContent-DIycyLeP.js +0 -1
  598. package/dist/interface/assets/CuiPluginCard-DEuNt5ni.js +0 -2
  599. package/dist/interface/assets/CuiPluginCategoryChip-BbkbkYj6.js +0 -1
  600. package/dist/interface/assets/CuiPluginOAuthButton-vMuRa9Qd.js +0 -2
  601. package/dist/interface/assets/CuiQRCode-Dh9EcaVc.js +0 -1
  602. package/dist/interface/assets/CuiRecordingsGrid-HjZEiSyp.js +0 -1
  603. package/dist/interface/assets/CuiSchema--yMBD996.css +0 -1
  604. package/dist/interface/assets/CuiSchema-CSFoI6cg.js +0 -1
  605. package/dist/interface/assets/CuiTopNavbarItem-CSdvkKHR.js +0 -1
  606. package/dist/interface/assets/Faces-CPZ5RA68.js +0 -1
  607. package/dist/interface/assets/FirstSteps-CaF8STWH.js +0 -1
  608. package/dist/interface/assets/Instances-Cw7A4I7E.js +0 -1
  609. package/dist/interface/assets/Logs-4Mgj7YWu.js +0 -6
  610. package/dist/interface/assets/Menu-T-54ZSSD.js +0 -1
  611. package/dist/interface/assets/Metrics-CQGKmHev.css +0 -1
  612. package/dist/interface/assets/Metrics-Dgm5qpzh.js +0 -6
  613. package/dist/interface/assets/OAuthDeviceFlow-DGikOkgK.js +0 -1
  614. package/dist/interface/assets/Plugin-YxqbMbUc.js +0 -1
  615. package/dist/interface/assets/PluginConsole-ZZvJlgIh.js +0 -7
  616. package/dist/interface/assets/PluginDetail-B9NgbzkJ.js +0 -2
  617. package/dist/interface/assets/PluginSchema-Cx_LInpM.js +0 -1
  618. package/dist/interface/assets/PluginSearch-5AgSWlmi.js +0 -1
  619. package/dist/interface/assets/PluginSearch-P274oMvy.js +0 -2
  620. package/dist/interface/assets/PluginUpdateProgress-0nV-8LvI.js +0 -1
  621. package/dist/interface/assets/Plugins-Bvru3q2P.js +0 -1
  622. package/dist/interface/assets/Recordings-BWGWC6Kq.js +0 -1
  623. package/dist/interface/assets/Recordings-cR4_6aGN.css +0 -1
  624. package/dist/interface/assets/SensorEdit-gEw6HHZs.js +0 -1
  625. package/dist/interface/assets/SensorHistory-IgMpuLdC.js +0 -1
  626. package/dist/interface/assets/Sensors-DukA8Xqx.js +0 -2
  627. package/dist/interface/assets/Settings-DWpeWPJh.js +0 -1
  628. package/dist/interface/assets/SettingsAccount-C1OpCtob.js +0 -1
  629. package/dist/interface/assets/SettingsAccount-CrLcqzSn.js +0 -1
  630. package/dist/interface/assets/SettingsAppearance-AhUjml5E.js +0 -1
  631. package/dist/interface/assets/SettingsAppearance-C8EEBVZN.js +0 -1
  632. package/dist/interface/assets/SettingsBackup-BJupyZCJ.js +0 -1
  633. package/dist/interface/assets/SettingsList-MXYSQMZ3.js +0 -1
  634. package/dist/interface/assets/SettingsMqtt-F3pV1Bvo.js +0 -1
  635. package/dist/interface/assets/SettingsNotifications-BmaAccX9.js +0 -1
  636. package/dist/interface/assets/SettingsPermissions-Dd_yfNlk.js +0 -1
  637. package/dist/interface/assets/SettingsRecordings-85B2bQIf.js +0 -1
  638. package/dist/interface/assets/SettingsRemote-C_ikoXW7.js +0 -2
  639. package/dist/interface/assets/SettingsRemote-DzrfpHjw.css +0 -1
  640. package/dist/interface/assets/SettingsSystem-Ct3qms5O.js +0 -2
  641. package/dist/interface/assets/SettingsUsers-D36vZ8Zf.js +0 -1
  642. package/dist/interface/assets/Terminal-ltPiB9CB.js +0 -4
  643. package/dist/interface/assets/VariableInput-7c7Px-DM.js +0 -1
  644. package/dist/interface/assets/VersionsHandler-BFuLGk6Y.js +0 -7
  645. package/dist/interface/assets/VirtualSensorCreate-uumfOHgB.js +0 -1
  646. package/dist/interface/assets/Workers-Bowrc1AF.js +0 -2
  647. package/dist/interface/assets/ace-BqKKexH4.js +0 -1
  648. package/dist/interface/assets/alert-outline-GrD7-zHq.js +0 -1
  649. package/dist/interface/assets/api-DLVsQBAO.js +0 -1
  650. package/dist/interface/assets/api-daCggwpn.css +0 -2
  651. package/dist/interface/assets/api-py5HP4SF.js +0 -2
  652. package/dist/interface/assets/arrow-left-C1N6U6kZ.js +0 -1
  653. package/dist/interface/assets/auth-uQlIia9h.js +0 -1
  654. package/dist/interface/assets/automations-ChG1qcO7.js +0 -1
  655. package/dist/interface/assets/cameras.schema-Cv7cjMz3.js +0 -1
  656. package/dist/interface/assets/check-circle-Do_mBN_A.js +0 -1
  657. package/dist/interface/assets/chevron-down-D111daTn.js +0 -1
  658. package/dist/interface/assets/cloudHandoff-CL4sircA.js +0 -1
  659. package/dist/interface/assets/config-B1aWtF-N.js +0 -1
  660. package/dist/interface/assets/content-copy-CLkJTA4w.js +0 -1
  661. package/dist/interface/assets/delete-BF6keuqy.js +0 -1
  662. package/dist/interface/assets/deployed-code-update-xHE-blDN.js +0 -1
  663. package/dist/interface/assets/download-BCPfm6aN.js +0 -1
  664. package/dist/interface/assets/esm-B3yVlCMw.js +0 -1
  665. package/dist/interface/assets/esm-BKQ7CQK7.js +0 -1
  666. package/dist/interface/assets/esm-BiSE05P9.js +0 -1
  667. package/dist/interface/assets/esm-BoPthGAl.js +0 -1
  668. package/dist/interface/assets/esm-C2ALrdyx.js +0 -1
  669. package/dist/interface/assets/esm-CKEGzys4.js +0 -1
  670. package/dist/interface/assets/esm-CctiCHtK.js +0 -1
  671. package/dist/interface/assets/esm-Cqq81lnk.js +0 -1
  672. package/dist/interface/assets/esm-CyrLQTu0.js +0 -1
  673. package/dist/interface/assets/esm-D6O-eZYo.js +0 -1
  674. package/dist/interface/assets/esm-DG1f0qwo.js +0 -1
  675. package/dist/interface/assets/esm-DGegIZMF.js +0 -1
  676. package/dist/interface/assets/esm-JGwpHVqo.js +0 -1
  677. package/dist/interface/assets/esm-TRigYTsA.js +0 -1
  678. package/dist/interface/assets/home-CUykMSBW.js +0 -1
  679. package/dist/interface/assets/main-CLvcwWW7.js +0 -3
  680. package/dist/interface/assets/main-mJXdi_gx.css +0 -1
  681. package/dist/interface/assets/minus-RI3VlDe8.js +0 -1
  682. package/dist/interface/assets/mqtt-Cyhv8shC.js +0 -1
  683. package/dist/interface/assets/native-B01iGjCh.js +0 -1
  684. package/dist/interface/assets/native-D381pxlG.js +0 -1
  685. package/dist/interface/assets/notifications-DniREnpL.js +0 -1
  686. package/dist/interface/assets/plugin-W20ihuog.js +0 -1
  687. package/dist/interface/assets/plus-DHwFyXkb.js +0 -1
  688. package/dist/interface/assets/power-C9UIp2oO.js +0 -1
  689. package/dist/interface/assets/round-restart-alt-D3jT5i_T.js +0 -1
  690. package/dist/interface/assets/round-restart-alt-DdIfy7mU.css +0 -1
  691. package/dist/interface/assets/sensorIcons-BXauWntX.js +0 -1
  692. package/dist/interface/assets/sensors-Bc02Z1G9.js +0 -1
  693. package/dist/interface/assets/server-D2KGja0u.js +0 -1
  694. package/dist/interface/assets/table-2-line-B-z0xvbG.js +0 -1
  695. package/dist/interface/assets/theme-vkX_uBgJ.js +0 -1
  696. package/dist/interface/assets/trash-can-outline-DLKniIWM.js +0 -1
  697. package/dist/interface/assets/types-CrvnT4-i.js +0 -1
  698. package/dist/interface/assets/types-D6IQ6ssc.js +0 -1
  699. package/dist/interface/assets/upload-ClkX9wUX.js +0 -1
  700. package/dist/interface/assets/useBackupRestore-Dbf24OqP.js +0 -1
  701. package/dist/interface/assets/useServerRestart-CjPAgzoX.js +0 -1
  702. package/dist/interface/assets/useUpdateChannel-F4WpbMJR.js +0 -1
  703. package/dist/interface/assets/useUserOptions-GbSC7_qt.js +0 -1
  704. package/dist/interface/assets/vendor-BaiDFVEr.js +0 -23
  705. package/dist/interface/assets/vendor-cameraui-0EJfDg8o.js +0 -2326
  706. package/dist/interface/assets/vendor-chart-DtwjR6yw.js +0 -3
  707. package/dist/interface/assets/vendor-core-RnPzfwaA.js +0 -1
  708. package/dist/interface/assets/vendor-gridstack-qw2ro2uB.js +0 -3
  709. package/dist/interface/assets/vendor-vueflow-CLJNLJXc.js +0 -26
  710. package/dist/interface/assets/vendor-xterm-BafMBqaV.js +0 -91
  711. package/dist/interface/assets/web-BNRwhIOt.js +0 -1
  712. package/dist/interface/assets/web-BPkOXv4d.js +0 -1
  713. package/dist/interface/assets/web-BZIx_2d3.js +0 -1
  714. package/dist/interface/assets/web-BjKL51lK-BwChM7zd.js +0 -1
  715. package/dist/interface/assets/web-BkmtZjSt.js +0 -1
  716. package/dist/interface/assets/web-C6RgriWz.js +0 -1
  717. package/dist/interface/assets/web-CQFMLa0a.js +0 -1
  718. package/dist/interface/assets/web-CZGnd6VE.js +0 -1
  719. package/dist/interface/assets/web-Cfzay11X.js +0 -1
  720. package/dist/interface/assets/web-DAgBwKL-.js +0 -1
  721. package/dist/interface/assets/web-DgVHh5ek.js +0 -1
  722. package/dist/interface/assets/web-DlSXwZBR.js +0 -1
  723. package/dist/interface/assets/web-eDYxVGH7.js +0 -1
  724. package/dist/interface/assets/web-h4k3EoRQ.js +0 -1
  725. package/dist/interface/assets/workbox-window.prod.es5-CcJiPjAS.js +0 -1
@@ -19,11 +19,14 @@ import { AudioDetectionLoop } from './audio-loop.js';
19
19
  import { CascadeManager } from './cascade-manager.js';
20
20
  import { detectionRecord } from './debug/detection-record.js';
21
21
  import { DetectionPipeline } from './detection-pipeline.js';
22
+ import { clusterBoxes, DetectionWindow, mergeWindowDetections, MOTION_PAD, planWindowsOnce, TRACK_PAD } from './detection-window.js';
22
23
  import { DwellManager } from './dwell-manager.js';
23
24
  import { DetectionEventManager, MOMENT_RANK_ATTRIBUTE, MOMENT_RANK_OBJECT } from './event-manager.js';
24
25
  import { EventThumbnailer } from './event-thumbnailer.js';
25
26
  import { FrameScaler } from './frame-scaler.js';
27
+ import { hardwareDecodingAvailable } from './hardware.js';
26
28
  import { directionBetween, directionOf, MOMENT_FORMATS, MOMENT_QUALITY, momentWindow, unionBox } from './moment-crop.js';
29
+ import { MotionLocalizer } from './motion-localizer.js';
27
30
  import { PerfTracker } from './perf-tracker.js';
28
31
  import { normalizePlateText } from './plate-vote.js';
29
32
  import { isVideoInputSpec, modelIdentity, PluginRegistry } from './plugin-registry.js';
@@ -38,6 +41,9 @@ const MOMENT_ATTRIBUTE_MIN_AREA = 600;
38
41
  const DEFAULT_CASCADE_TIMEOUT = 10;
39
42
  const OBJECT_DWELL_SECONDS = 2;
40
43
  const SECONDARY_BBOX_TTL_MS = 2000;
44
+ // generous vs. the cascade window (default 10s): fresh motion re-arms the
45
+ // cascade and lets the tracker close its spans properly well before this
46
+ const WORLD_TICK_STARVATION_MS = 60_000;
41
47
  const CADENCE_MIN_SAMPLES = 5;
42
48
  const CADENCE_OUTLIER_BAND = 2.5;
43
49
  const CADENCE_OUTLIER_RESEED = 5;
@@ -62,6 +68,7 @@ let DetectionCoordinator = class DetectionCoordinator {
62
68
  eventManager;
63
69
  cascade = new CascadeManager();
64
70
  worldSpans = new Set();
71
+ lastWorldTickAt = 0;
65
72
  activeSensorTriggerTypes = new Map();
66
73
  secondaryBboxSeen = new Map();
67
74
  faceIdentities = new Set();
@@ -74,6 +81,13 @@ let DetectionCoordinator = class DetectionCoordinator {
74
81
  perf = new PerfTracker();
75
82
  benchmarkRunning = false;
76
83
  hqUpgrade;
84
+ localizer;
85
+ lastLocalizeAt = 0;
86
+ anchorBoxes = [];
87
+ trackAnchorBoxes = [];
88
+ farewellBoxes = [];
89
+ lastTrackedById = new Map();
90
+ detectionWindow = new DetectionWindow();
77
91
  mainStreamActive = false;
78
92
  idleSince = 0;
79
93
  lastMotionAt = 0;
@@ -115,6 +129,7 @@ let DetectionCoordinator = class DetectionCoordinator {
115
129
  if (config.streamHot)
116
130
  this.frameSource.start();
117
131
  this.frameScaler = new FrameScaler(null, logger, this.privacy);
132
+ this.localizer = new MotionLocalizer();
118
133
  this.pipeline = new DetectionPipeline(this.pipelineZones(), config.detectionSettings);
119
134
  this.secondaries = new SecondaryStage(this, this.plugins, this.pipeline, this.frameScaler, this.proxy, this.perf, logger);
120
135
  if (config.zones.lines.length > 0) {
@@ -136,7 +151,7 @@ let DetectionCoordinator = class DetectionCoordinator {
136
151
  logger,
137
152
  decoder: this.config.frameWorkerSettings.decoder,
138
153
  }, config.availableSources);
139
- this.thumbnailer.sync(this.mainStreamAnalysisWanted);
154
+ this.thumbnailer.sync(this.mainStreamSourceWanted);
140
155
  // debugging
141
156
  detectionRecord.sources({
142
157
  roles: config.availableSources?.map((s) => s.role),
@@ -167,6 +182,7 @@ let DetectionCoordinator = class DetectionCoordinator {
167
182
  this.cascadeUnsubscribe = this.cascade.onChange((event) => {
168
183
  if (event.type === 'activated') {
169
184
  this.startAdHocVideoLoopIfNeeded();
185
+ this.seedLocalizerReference();
170
186
  }
171
187
  else {
172
188
  this.stopAdHocVideoLoopIfIdle();
@@ -194,6 +210,7 @@ let DetectionCoordinator = class DetectionCoordinator {
194
210
  if (!this.dwell.hasActive() && this.worldSpans.size === 0 && !this.eventManager.hasActiveSegment()) {
195
211
  this.eventManager.forceEndActiveEvent();
196
212
  }
213
+ this.stopAdHocVideoLoopIfIdle();
197
214
  }
198
215
  });
199
216
  }
@@ -302,7 +319,7 @@ let DetectionCoordinator = class DetectionCoordinator {
302
319
  }
303
320
  updateFrameWorkerSettings(settings) {
304
321
  this.config.frameWorkerSettings = settings;
305
- this.thumbnailer.sync(this.mainStreamAnalysisWanted);
322
+ this.thumbnailer.sync(this.mainStreamSourceWanted);
306
323
  }
307
324
  updateNvrRpc(namespace) {
308
325
  this.config.nvrRpc = namespace;
@@ -390,6 +407,9 @@ let DetectionCoordinator = class DetectionCoordinator {
390
407
  this.ptzAutotracker.handlePresenceDetections(externalDetections);
391
408
  if (this.ptzAutotracker.suppressionActive)
392
409
  return;
410
+ detectionRecord.tick({
411
+ externalObject: { detected: filtered.detected === true, count: (filtered.detections ?? []).length },
412
+ });
393
413
  this.ingestDetectionResult(SensorType.Object, sensorId, filtered);
394
414
  this.eventManager.processResults(this.buildSnapshot());
395
415
  // re-shoot the event thumbnail: smart-camera reports arrive after the
@@ -403,8 +423,10 @@ let DetectionCoordinator = class DetectionCoordinator {
403
423
  if (filtered.detected !== true)
404
424
  return;
405
425
  // assist alone is enough: its boxes upgrade zones, bboxes and thumbnails
406
- // even when no face/plate/clip secondary consumes them
407
- if (!this.plugins.hasFrameBasedSecondary() && !this.plugins.hasEligibleObjectAssist())
426
+ // even when no face/plate/clip secondary consumes them; without either,
427
+ // the embedded diff's anchors can still localize a moment crop
428
+ const hasAnchors = this.anchorBoxes.length > 0 || this.farewellBoxes.length > 0;
429
+ if (!this.plugins.hasFrameBasedSecondary() && !this.plugins.hasEligibleObjectAssist() && !hasAnchors)
408
430
  return;
409
431
  if (this.processingExternalSecondary)
410
432
  return; // previous RPC still running
@@ -416,42 +438,60 @@ let DetectionCoordinator = class DetectionCoordinator {
416
438
  return;
417
439
  try {
418
440
  const results = { timestamp: Date.now() };
419
- const objects = await this.runObjectAssist(handle.frame, rawExternal);
420
- this.ingestAssistedObjects(sensorId, objects);
421
- if (objects.assisted) {
422
- // real boxes: crop the object like the frame pipeline, so face and
423
- // plate secondaries run on the subject instead of the whole scene
424
- // (processExternal only adapts the shape, external boxes get no real tracking)
425
- const objectDetections = this.pipeline.processExternal(objects.detections);
426
- await this.runSecondariesAndThumbnails({ frame: handle.frame, scaler: this.frameScaler, isMainStream: false }, objectDetections, results);
427
- this.ingestResultsForAllSecondaries(results);
428
- const snapshot = this.buildSnapshot();
429
- if (results.thumbnails && results.thumbnails.length > 0) {
430
- snapshot.thumbnails = results.thumbnails;
431
- }
432
- this.eventManager.processResults(snapshot);
433
- }
434
- else {
435
- const sceneJpeg = await this.secondaries.detectFullFrame(handle.frame, results);
436
- try {
437
- results.thumbnails = await this.secondaries.generateThumbnails(handle.frame, this.frameScaler, results);
438
- }
439
- catch (error) {
440
- this.logger.error('Thumbnail generation error:', error);
441
- }
442
- this.ingestResultsForAllSecondaries(results);
443
- const snapshot = this.buildSnapshot();
444
- if (results.thumbnails && results.thumbnails.length > 0) {
445
- snapshot.thumbnails = results.thumbnails;
441
+ // anchors may have switched analysis to the main stream: the assist
442
+ // windows and secondary crops should see those native pixels
443
+ const analysis = await this.acquireAnalysisFrame(handle.frame);
444
+ try {
445
+ const objects = await this.runObjectAssist(analysis.frame, rawExternal, analysis.scaler);
446
+ this.ingestAssistedObjects(sensorId, objects);
447
+ if (objects.assisted) {
448
+ // real boxes: crop the object like the frame pipeline, so face and
449
+ // plate secondaries run on the subject instead of the whole scene
450
+ // (processExternal only adapts the shape, external boxes get no real tracking)
451
+ const objectDetections = this.pipeline.processExternal(objects.detections);
452
+ detectionRecord.tick({ assistProcessed: { count: objectDetections.length, bufferedObjects: this.currentDetectionState.object?.detections?.length ?? 0 } });
453
+ await this.runSecondariesAndThumbnails(analysis, objectDetections, results);
454
+ await this.captureExternalMoment(objectDetections, analysis, results.timestamp);
455
+ this.ingestResultsForAllSecondaries(results);
456
+ const snapshot = this.buildSnapshot();
457
+ detectionRecord.tick({ assistSnapshot: { objects: snapshot.objects.length } });
458
+ if (results.thumbnails && results.thumbnails.length > 0) {
459
+ snapshot.thumbnails = results.thumbnails;
460
+ }
461
+ this.eventManager.processResults(snapshot);
446
462
  }
447
- if (sceneJpeg)
448
- snapshot.eventThumbnail = sceneJpeg;
449
- const wantsEventThumb = this.eventManager.needsThumbnail() || this.snapshotWillStartEvent(snapshot);
450
- this.eventManager.processResults(snapshot);
451
- if (wantsEventThumb) {
452
- this.thumbnailer.upgradeEventThumbnailAsync();
463
+ else {
464
+ // no assist boxes: the diff's motion clusters are the only
465
+ // localization, still better than a full-scene card
466
+ const anchorDetections = this.anchorMomentDetections(rawExternal);
467
+ if (anchorDetections.length > 0) {
468
+ await this.captureExternalMoment(anchorDetections, analysis, results.timestamp);
469
+ }
470
+ const sceneJpeg = await this.secondaries.detectFullFrame(analysis.frame, results);
471
+ try {
472
+ results.thumbnails = await this.secondaries.generateThumbnails(analysis.frame, analysis.scaler, results);
473
+ }
474
+ catch (error) {
475
+ this.logger.error('Thumbnail generation error:', error);
476
+ }
477
+ this.ingestResultsForAllSecondaries(results);
478
+ const snapshot = this.buildSnapshot();
479
+ if (results.thumbnails && results.thumbnails.length > 0) {
480
+ snapshot.thumbnails = results.thumbnails;
481
+ }
482
+ if (sceneJpeg)
483
+ snapshot.eventThumbnail = sceneJpeg;
484
+ const wantsEventThumb = this.eventManager.needsThumbnail() || this.snapshotWillStartEvent(snapshot);
485
+ this.eventManager.processResults(snapshot);
486
+ if (wantsEventThumb) {
487
+ this.thumbnailer.upgradeEventThumbnailAsync();
488
+ }
453
489
  }
454
490
  }
491
+ finally {
492
+ if (analysis.frame !== handle.frame)
493
+ analysis.frame[Symbol.dispose]?.();
494
+ }
455
495
  }
456
496
  finally {
457
497
  await handle[Symbol.asyncDispose]();
@@ -511,18 +551,28 @@ let DetectionCoordinator = class DetectionCoordinator {
511
551
  hasPlugin(sensorType) {
512
552
  return this.plugins.has(sensorType);
513
553
  }
514
- externalObjectSpanActive() {
515
- // the registry holds frame-based providers only; a smart-camera object
516
- // sensor (Reolink AI, ONVIF) lives in the feeding set, and its dwell is
517
- // what keeps the span open between its report edges
518
- if (this.plugins.get(SensorType.Object)?.requiresFrames)
519
- return false;
520
- for (const [sensorId, sensorType] of this.feedingSensors) {
521
- if (sensorType === SensorType.Object && this.dwell.isActive(sensorId))
554
+ get windowAnchorsWanted() {
555
+ return this.plugins.get(SensorType.Object)?.requiresFrames === true || this.plugins.hasEligibleObjectAssist();
556
+ }
557
+ get localizerWanted() {
558
+ // the registry only holds frame-based providers; a smart-camera object
559
+ // sensor (Reolink AI, ONVIF) feeds externally and needs the anchors just
560
+ // as much — for assist zoom windows and for framing its moment pictures
561
+ if (this.plugins.has(SensorType.Object) || this.plugins.hasEligibleObjectAssist())
562
+ return true;
563
+ for (const sensorType of this.feedingSensors.values()) {
564
+ if (sensorType === SensorType.Object)
522
565
  return true;
523
566
  }
524
567
  return false;
525
568
  }
569
+ get windowWantsMainStream() {
570
+ if (!this.cascade.isActive)
571
+ return false;
572
+ if (this.anchorBoxes.length === 0 && this.trackAnchorBoxes.length === 0)
573
+ return false;
574
+ return this.windowAnchorsWanted;
575
+ }
526
576
  get cascadeEnabled() {
527
577
  return this.config.detectionSettings.cascadeDetection !== false;
528
578
  }
@@ -539,7 +589,33 @@ let DetectionCoordinator = class DetectionCoordinator {
539
589
  const [w, h] = this.config.interfaceSettings.aspectRatio.split(':').map(Number);
540
590
  return w / h;
541
591
  }
592
+ get mainStreamAvailable() {
593
+ if (!this.thumbnailer.hasMainStream)
594
+ return false;
595
+ return this.mainStreamWanted;
596
+ }
597
+ get mainStreamWanted() {
598
+ return this.config.frameWorkerSettings.mainStreamAnalysis === true || hardwareDecodingAvailable(this.config.frameWorkerSettings.decoder, this.logger);
599
+ }
600
+ get mainStreamSourceWanted() {
601
+ return this.mainStreamWanted && (this.config.streamHot === true || this.loopRunning);
602
+ }
603
+ externalObjectSpanActive() {
604
+ // the registry holds frame-based providers only; a smart-camera object
605
+ // sensor (Reolink AI, ONVIF) lives in the feeding set, and its dwell is
606
+ // what keeps the span open between its report edges
607
+ if (this.plugins.get(SensorType.Object)?.requiresFrames)
608
+ return false;
609
+ for (const [sensorId, sensorType] of this.feedingSensors) {
610
+ if (sensorType === SensorType.Object && this.dwell.isActive(sensorId))
611
+ return true;
612
+ }
613
+ return false;
614
+ }
542
615
  handleCascadeDeactivated() {
616
+ this.anchorBoxes = [];
617
+ this.farewellBoxes = [];
618
+ this.detectionWindow.reset();
543
619
  // clear cascade-gated buffer slots, keep motion/audio
544
620
  const cs = this.currentDetectionState;
545
621
  cs.object = undefined;
@@ -920,7 +996,9 @@ let DetectionCoordinator = class DetectionCoordinator {
920
996
  this.pipeline.notifyCameraMove();
921
997
  }
922
998
  clearSecondaryBboxes(sensorId) {
923
- this.writeSensorProperties(sensorId, { detections: [] });
999
+ // detected must fall with the boxes: secondaries only run while objects
1000
+ // are tracked, so nothing else ever writes the false edge
1001
+ this.writeSensorProperties(sensorId, { detected: false, detections: [] });
924
1002
  this.secondaryBboxSeen.delete(sensorId);
925
1003
  }
926
1004
  clearStaleSecondaryBboxes() {
@@ -938,6 +1016,7 @@ let DetectionCoordinator = class DetectionCoordinator {
938
1016
  return;
939
1017
  this.logger.debug('Starting video detection loop');
940
1018
  this.loopRunning = true;
1019
+ this.thumbnailer.sync(this.mainStreamSourceWanted);
941
1020
  this.loopPromise = this.runDetectionLoop();
942
1021
  }
943
1022
  async stopVideoLoop() {
@@ -951,6 +1030,7 @@ let DetectionCoordinator = class DetectionCoordinator {
951
1030
  this.worldSpans.clear();
952
1031
  this.mainStreamActive = false;
953
1032
  this.idleSince = 0;
1033
+ this.thumbnailer.sync(this.mainStreamSourceWanted);
954
1034
  const doStop = async () => {
955
1035
  await this.frameSource.detach();
956
1036
  await this.loopPromise;
@@ -965,18 +1045,26 @@ let DetectionCoordinator = class DetectionCoordinator {
965
1045
  }
966
1046
  }
967
1047
  startAdHocVideoLoopIfNeeded() {
968
- if (!this.loopRunning && this.plugins.needsAdHocLoop()) {
1048
+ // localizerWanted covers what the registry cannot see: an object assist or
1049
+ // an external object sensor needs the loop for the localizer's anchors
1050
+ if (!this.loopRunning && (this.plugins.needsAdHocLoop() || this.localizerWanted)) {
969
1051
  this.adHocVideoLoop = true;
970
1052
  this.logger.debug('Starting ad-hoc video loop for sensor cascade trigger');
971
1053
  this.startVideoLoop();
972
1054
  }
973
1055
  }
974
1056
  stopAdHocVideoLoopIfIdle() {
975
- if (this.adHocVideoLoop && !this.plugins.shouldVideoBeActive()) {
976
- this.adHocVideoLoop = false;
977
- this.logger.debug('Stopping ad-hoc video loop — cascade ended');
978
- this.stopVideoLoop();
979
- }
1057
+ if (!this.adHocVideoLoop || this.plugins.shouldVideoBeActive())
1058
+ return;
1059
+ // the localizer and assist still need frames while the event runs;
1060
+ // stopping on the cascade edge alone churned the main-stream decoder
1061
+ // open/closed mid-event, which starves the hw device (vaapi surface sync
1062
+ // failures) right when the next report arrives
1063
+ if (this.cascade.isActive || this.dwell.hasActive() || this.eventManager.hasActiveSegment())
1064
+ return;
1065
+ this.adHocVideoLoop = false;
1066
+ this.logger.debug('Stopping ad-hoc video loop — idle');
1067
+ this.stopVideoLoop();
980
1068
  }
981
1069
  async runDetectionLoop() {
982
1070
  // the source reconnects on its own, nextFrame simply waits it out
@@ -1008,7 +1096,9 @@ let DetectionCoordinator = class DetectionCoordinator {
1008
1096
  // a fresh connection brings its own hardware context and resolution
1009
1097
  this.frameScaler.updateHardwareContext(this.frameSource.hardwareContext);
1010
1098
  this.frameScaler.clearCache();
1011
- this.thumbnailer.sync(this.mainStreamAnalysisWanted);
1099
+ this.thumbnailer.sync(this.mainStreamSourceWanted);
1100
+ this.localizer.reset();
1101
+ this.detectionWindow.reset();
1012
1102
  }
1013
1103
  // motion always reads the low stream: switching its input resolution
1014
1104
  // would reset the background model on every transition
@@ -1063,14 +1153,6 @@ let DetectionCoordinator = class DetectionCoordinator {
1063
1153
  this.frameScaler.clearCache();
1064
1154
  this.logger.debug('Detection loop ended');
1065
1155
  }
1066
- get mainStreamAvailable() {
1067
- if (!this.thumbnailer.hasMainStream)
1068
- return false;
1069
- return this.mainStreamAnalysisWanted;
1070
- }
1071
- get mainStreamAnalysisWanted() {
1072
- return this.config.frameWorkerSettings.mainStreamAnalysis === true || this.frameSource.hardwareContext !== null;
1073
- }
1074
1156
  async acquireAnalysisFrame(lowFrame) {
1075
1157
  if (this.mainStreamActive) {
1076
1158
  const t0 = Date.now();
@@ -1106,7 +1188,7 @@ let DetectionCoordinator = class DetectionCoordinator {
1106
1188
  return undefined;
1107
1189
  }
1108
1190
  updateStreamState() {
1109
- if (this.worldSpans.size > 0 || this.eventManager.hasActiveSegment()) {
1191
+ if (this.worldSpans.size > 0 || this.eventManager.hasActiveSegment() || this.windowWantsMainStream) {
1110
1192
  this.idleSince = 0;
1111
1193
  if (!this.mainStreamActive && this.mainStreamAvailable) {
1112
1194
  this.mainStreamActive = true;
@@ -1141,6 +1223,7 @@ let DetectionCoordinator = class DetectionCoordinator {
1141
1223
  const t0 = Date.now();
1142
1224
  let motionDetected = false;
1143
1225
  let objectDetections = [];
1226
+ let staticDetections = [];
1144
1227
  const results = { timestamp: t0 };
1145
1228
  // while the PTZ repositions: motion and object keep running so the
1146
1229
  // background model and track ids survive the pan, but nothing below
@@ -1160,6 +1243,8 @@ let DetectionCoordinator = class DetectionCoordinator {
1160
1243
  return;
1161
1244
  if (motionFrame) {
1162
1245
  this.lastMotionAt = t0;
1246
+ if (this.localizerWanted)
1247
+ this.feedLocalizer(motionFrame, t0, ptzSuppressed);
1163
1248
  try {
1164
1249
  const motionInferStart = Date.now();
1165
1250
  const result = await motionPlugin.proxy.detectMotion(motionFrame);
@@ -1193,6 +1278,17 @@ let DetectionCoordinator = class DetectionCoordinator {
1193
1278
  // no frame-based motion plugin, the cascade is the only motion-equivalent signal
1194
1279
  motionDetected = true;
1195
1280
  results.cascadeTriggered = true;
1281
+ // the localizer scales its own gray here, nobody else needed one
1282
+ const localizeDue = t0 - this.lastLocalizeAt >= MOTION_INTERVAL_MS - TICK_SLACK_MS;
1283
+ if (localizeDue && this.localizerWanted) {
1284
+ const scaleStart = Date.now();
1285
+ const gray = await this.scaleForMotionInput(motionRawFrame);
1286
+ this.perf.scaleMs += Date.now() - scaleStart;
1287
+ if (!this.loopRunning)
1288
+ return;
1289
+ if (gray)
1290
+ this.feedLocalizer(gray, t0, ptzSuppressed);
1291
+ }
1196
1292
  }
1197
1293
  // detected is re-derived after zone filtering, the plugin's own flag is ignored
1198
1294
  if (results.motion && motionPlugin) {
@@ -1206,27 +1302,19 @@ let DetectionCoordinator = class DetectionCoordinator {
1206
1302
  const objectPlugin = this.plugins.get(SensorType.Object);
1207
1303
  const shouldDetectObjects = objectPlugin?.requiresFrames === true && (ptzSuppressed || !this.cascadeEnabled || this.cascade.isActive);
1208
1304
  if (shouldDetectObjects) {
1209
- const scaleStart = Date.now();
1210
- const objectFrame = await this.scaleForObject(analysis.frame, analysis.scaler);
1211
- this.perf.scaleMs += Date.now() - scaleStart;
1212
- if (!this.loopRunning)
1213
- return;
1214
- if (objectFrame) {
1215
- try {
1216
- const inferStart = Date.now();
1217
- const result = await PromiseTimeout(objectPlugin.proxy.detectObjects(objectFrame.model), DETECT_TIMEOUT_MS, undefined, `Object detection timed out after ${DETECT_TIMEOUT_MS}ms`);
1218
- this.perf.objectMs += Date.now() - inferStart;
1219
- this.perf.objectCount++;
1220
- if (!this.loopRunning)
1221
- return;
1305
+ try {
1306
+ const detected = await this.runObjectDetection(objectPlugin, analysis, results.motion?.detections ?? []);
1307
+ if (!this.loopRunning)
1308
+ return;
1309
+ if (detected) {
1222
1310
  this.trackDetectionCadence();
1223
1311
  // run the pipeline even on empty frames so Norfair advances its
1224
1312
  // Kalman state; the pose delta keeps predictions stable across pans
1225
1313
  const poseDelta = this.ptzAutotracker.consumePoseDelta();
1226
1314
  const postStart = Date.now();
1227
- const detected = FrameScaler.undoLetterbox(ensureDetectionBoxes(result.detections), objectFrame.geometry);
1228
1315
  const pipelineResult = this.pipeline.process(detected, poseDelta);
1229
1316
  this.perf.postMs += Date.now() - postStart;
1317
+ this.lastWorldTickAt = t0;
1230
1318
  // the tick that opens a span analysed the low stream (the switch lands
1231
1319
  // next tick), its picture work is worth a one-off HQ decode
1232
1320
  if (this.updateWorldSpans(pipelineResult) && !analysis.isMainStream) {
@@ -1258,25 +1346,35 @@ let DetectionCoordinator = class DetectionCoordinator {
1258
1346
  return cx > -0.1 && cx < 1.1 && cy > -0.1 && cy < 1.1;
1259
1347
  });
1260
1348
  objectDetections = visibleTracks.filter((t) => !t.trackLost);
1261
- results.object = { ...result, detections: visibleTracks };
1349
+ results.object = { detected: objectDetections.length > 0, detections: visibleTracks };
1350
+ staticDetections = pipelineResult.staticTracks;
1262
1351
  if (pipelineResult.crossings.length > 0)
1263
1352
  results.lineCrossings = pipelineResult.crossings;
1264
1353
  // incl. extrapolated tracks, otherwise a single missed detector
1265
1354
  // frame flips the autotracker into LOST/REACQUIRE churn
1266
1355
  this.ptzAutotracker.handleObjectDetections(pipelineResult.tracked);
1267
- }
1268
- catch (error) {
1269
- if (!this.loopRunning || isNoRespondersError(error))
1270
- return;
1271
- this.logger.error('Object detection error:', error);
1356
+ // live tracks anchor the next tick's window; a track that just died
1357
+ // gets one farewell look at its last position
1358
+ this.trackAnchorBoxes = objectDetections.map((t) => t.box);
1359
+ for (const id of pipelineResult.removed) {
1360
+ const last = this.lastTrackedById.get(id);
1361
+ if (last)
1362
+ this.farewellBoxes.push(last);
1363
+ }
1364
+ this.lastTrackedById = new Map(pipelineResult.tracked.filter((t) => t.trackId !== undefined).map((t) => [t.trackId, t.box]));
1272
1365
  }
1273
1366
  }
1367
+ catch (error) {
1368
+ if (!this.loopRunning || isNoRespondersError(error))
1369
+ return;
1370
+ this.logger.error('Object detection error:', error);
1371
+ }
1274
1372
  }
1275
1373
  // tracker and autotracker are fed, everything event-facing stays quiet
1276
1374
  if (ptzSuppressed) {
1277
1375
  // object boxes stay live in the UI through the move, bbox publish only
1278
1376
  if (objectPlugin && results.object) {
1279
- this.writeSensorProperties(objectPlugin.sensorId, { detections: results.object.detections });
1377
+ this.writeSensorProperties(objectPlugin.sensorId, { detections: results.object.detections, staticDetections });
1280
1378
  }
1281
1379
  // keep an already-running object dwell alive so a chase doesn't end its
1282
1380
  // own event, but never activate it from suppressed frames
@@ -1295,6 +1393,7 @@ let DetectionCoordinator = class DetectionCoordinator {
1295
1393
  this.ingestDetectionResult(SensorType.Object, objectPlugin.sensorId, {
1296
1394
  detected: objectDetections.length > 0,
1297
1395
  detections: results.object.detections,
1396
+ staticDetections,
1298
1397
  });
1299
1398
  }
1300
1399
  if (!this.loopRunning)
@@ -1336,6 +1435,13 @@ let DetectionCoordinator = class DetectionCoordinator {
1336
1435
  }
1337
1436
  }
1338
1437
  this.eventManager.processResults(snapshot);
1438
+ // a span can only close while the tracker receives ticks; if the cascade
1439
+ // re-arm chain broke (object plugin outage, camera drop mid-event) the
1440
+ // stale spans would pin the event open and the cascade armed forever
1441
+ if (this.worldSpans.size > 0 && this.lastWorldTickAt > 0 && t0 - this.lastWorldTickAt > WORLD_TICK_STARVATION_MS) {
1442
+ this.logger.warn(`Dropping ${this.worldSpans.size} open object span(s): no tracker tick for ${Math.round((t0 - this.lastWorldTickAt) / 1000)}s`);
1443
+ this.worldSpans.clear();
1444
+ }
1339
1445
  // spans can outlive every trigger dwell (gate case); once spans, dwells
1340
1446
  // and the segment linger are all quiet the event ends here
1341
1447
  if (this.worldSpans.size === 0 && !this.dwell.hasActive() && !this.eventManager.hasActiveSegment()) {
@@ -1463,6 +1569,10 @@ let DetectionCoordinator = class DetectionCoordinator {
1463
1569
  this.worldSpans.delete(obj.trackId);
1464
1570
  }
1465
1571
  }
1572
+ // a track that died without a paired close event must not leak its span
1573
+ for (const id of result.removed) {
1574
+ this.worldSpans.delete(id);
1575
+ }
1466
1576
  return opened;
1467
1577
  }
1468
1578
  async captureMoments(result, analysis, at) {
@@ -1493,6 +1603,41 @@ let DetectionCoordinator = class DetectionCoordinator {
1493
1603
  return;
1494
1604
  await this.captureMoment(subject, bestScore, trigger, result.tracked, analysis, at);
1495
1605
  }
1606
+ anchorMomentDetections(reported) {
1607
+ const anchors = [...this.anchorBoxes, ...this.farewellBoxes];
1608
+ if (anchors.length === 0 || reported.length === 0)
1609
+ return [];
1610
+ const subject = reported.find((d) => d.label !== 'motion') ?? reported[0];
1611
+ const clusters = clusterBoxes(anchors);
1612
+ const largest = Math.max(...clusters.map((b) => b.width * b.height));
1613
+ // specks would drag the base union across the frame
1614
+ return clusters.filter((b) => b.width * b.height >= largest * 0.2).map((b) => ({ label: subject.label, confidence: subject.confidence, box: b }));
1615
+ }
1616
+ async captureExternalMoment(detections, analysis, at) {
1617
+ let subject;
1618
+ let bestScore = 0;
1619
+ for (const detection of detections) {
1620
+ const box = detection.box;
1621
+ if (!box)
1622
+ continue;
1623
+ const score = detection.confidence * Math.sqrt(box.width * box.height);
1624
+ if (score > bestScore) {
1625
+ bestScore = score;
1626
+ subject = detection;
1627
+ }
1628
+ }
1629
+ if (!subject)
1630
+ return;
1631
+ if (!this.eventManager.wantsMoment(MOMENT_RANK_OBJECT, bestScore, 'low', at))
1632
+ return;
1633
+ const target = { subject: subject.box, base: unionBox(detections.map((d) => d.box).filter(Boolean)) };
1634
+ const rendered = await this.renderMoment(target, analysis);
1635
+ if (!rendered)
1636
+ return;
1637
+ this.eventManager.offerMoment({ strip: rendered.strip, card: rendered.card, capturedAt: at, score: bestScore, rank: MOMENT_RANK_OBJECT, stream: 'low' });
1638
+ // debugging
1639
+ await this.recordMoment(target, rendered, analysis, `${subject.label}-external`, bestScore, 'external', at);
1640
+ }
1496
1641
  async captureMoment(subject, score, trigger, tracked, analysis, at) {
1497
1642
  const box = { x: subject.x, y: subject.y, width: subject.width, height: subject.height };
1498
1643
  const moving = tracked.filter((d) => (d.trackSpeed ?? 0) >= MOMENT_MOVING_SPEED).map((d) => d.box);
@@ -1527,7 +1672,6 @@ let DetectionCoordinator = class DetectionCoordinator {
1527
1672
  // legible one frames the shot, the rest stay their own attribute tiles
1528
1673
  let best;
1529
1674
  let bestScore = -1;
1530
- let bestCard;
1531
1675
  for (const candidate of candidates) {
1532
1676
  const cut = results.thumbnails?.find((t) => t.label === candidate.label);
1533
1677
  // a subject cut off by the frame edge makes a poor card
@@ -1542,20 +1686,21 @@ let DetectionCoordinator = class DetectionCoordinator {
1542
1686
  if (score > bestScore) {
1543
1687
  bestScore = score;
1544
1688
  best = candidate;
1545
- bestCard = cut?.jpeg;
1546
1689
  }
1547
1690
  }
1548
1691
  // ask before cutting: the same face rides along on every tick of a segment
1549
1692
  // and re-encoding for a picture that loses anyway is pure cost
1550
1693
  if (!best || !this.eventManager.wantsMoment(MOMENT_RANK_ATTRIBUTE, bestScore, analysis.isMainStream ? 'main' : 'low', at))
1551
1694
  return;
1695
+ // the card frames the whole person with the face as its center, not the
1696
+ // bare face box: the zoomed face already exists as an attribute tile, and
1697
+ // a misdetected "face" zoomed to card size ruins the event picture
1552
1698
  const target = {
1553
1699
  subject: best.box,
1700
+ base: best.parentBox ?? best.box,
1554
1701
  hint: best.parentBox ? directionBetween(best.box, best.parentBox) : undefined,
1555
1702
  };
1556
- // the attribute tile was cut from this frame with this very target, so the
1557
- // card is already encoded; only the 16:9 companion is still missing
1558
- const rendered = await this.renderMoment(target, analysis, bestCard);
1703
+ const rendered = await this.renderMoment(target, analysis);
1559
1704
  if (!rendered)
1560
1705
  return;
1561
1706
  const stream = analysis.isMainStream ? 'main' : 'low';
@@ -1619,10 +1764,42 @@ let DetectionCoordinator = class DetectionCoordinator {
1619
1764
  const motionPlugin = this.plugins.get(SensorType.Motion);
1620
1765
  if (!motionPlugin?.requiresFrames)
1621
1766
  return undefined;
1767
+ return this.scaleForMotionInput(rawFrame);
1768
+ }
1769
+ async scaleForMotionInput(rawFrame) {
1622
1770
  const maxWidth = MOTION_WIDTH_MAP[this.motionResolution];
1623
1771
  const scaled = await this.frameScaler.scaleProportional(rawFrame, maxWidth, 'gray');
1624
1772
  return scaled ? this.frameScaler.toVideoFrameData(scaled) : undefined;
1625
1773
  }
1774
+ feedLocalizer(gray, t0, ptzSuppressed) {
1775
+ this.lastLocalizeAt = t0;
1776
+ const data = Buffer.isBuffer(gray.data) ? gray.data : Buffer.from(gray.data);
1777
+ const boxes = this.localizer.localize({ data, width: gray.width, height: gray.height });
1778
+ // during ego-motion the diff is garbage, feeding keeps the reference alive
1779
+ this.anchorBoxes = ptzSuppressed ? [] : boxes;
1780
+ }
1781
+ async seedLocalizerReference() {
1782
+ if (!this.localizerWanted || !this.frameSource.decodeOldestKeyframe)
1783
+ return;
1784
+ try {
1785
+ const frame = await this.frameSource.decodeOldestKeyframe();
1786
+ if (!frame)
1787
+ return;
1788
+ try {
1789
+ const gray = await this.scaleForMotionInput(frame);
1790
+ if (gray) {
1791
+ const data = Buffer.isBuffer(gray.data) ? gray.data : Buffer.from(gray.data);
1792
+ this.localizer.seedReference({ data, width: gray.width, height: gray.height });
1793
+ }
1794
+ }
1795
+ finally {
1796
+ frame[Symbol.dispose]?.();
1797
+ }
1798
+ }
1799
+ catch (error) {
1800
+ this.logger.debug('Localizer reference seed failed:', error);
1801
+ }
1802
+ }
1626
1803
  trackDetectionCadence() {
1627
1804
  const now = Date.now();
1628
1805
  const previous = this.lastObjectCallAt;
@@ -1656,6 +1833,43 @@ let DetectionCoordinator = class DetectionCoordinator {
1656
1833
  return undefined;
1657
1834
  return this.scaleFrameForPlugin(rawFrame, objectPlugin, scaler);
1658
1835
  }
1836
+ async runObjectDetection(objectPlugin, analysis, pluginMotionBoxes) {
1837
+ const inputSpec = objectPlugin.modelSpec?.input;
1838
+ const motionAnchors = [...this.anchorBoxes, ...pluginMotionBoxes.map((d) => d.box).filter((box) => box !== undefined), ...this.farewellBoxes];
1839
+ this.farewellBoxes = [];
1840
+ const windows = isVideoInputSpec(inputSpec)
1841
+ ? this.detectionWindow.plan(motionAnchors, this.trackAnchorBoxes, analysis.frame.width, analysis.frame.height, inputSpec.width)
1842
+ : null;
1843
+ if (windows && windows.length > 0) {
1844
+ this.perf.zoomTicks++;
1845
+ this.perf.zoomWindows += windows.length;
1846
+ detectionRecord.zoom({ kind: 'object', anchors: motionAnchors, tracks: this.trackAnchorBoxes, windows });
1847
+ const inferStart = Date.now();
1848
+ const perWindow = await Promise.all(windows.map((window) => this.detectInWindow(objectPlugin, analysis.frame, analysis.scaler, window, inputSpec)));
1849
+ this.perf.objectMs += Date.now() - inferStart;
1850
+ this.perf.objectCount++;
1851
+ return mergeWindowDetections(perWindow.flat());
1852
+ }
1853
+ const scaleStart = Date.now();
1854
+ const objectFrame = await this.scaleForObject(analysis.frame, analysis.scaler);
1855
+ this.perf.scaleMs += Date.now() - scaleStart;
1856
+ if (!objectFrame || !this.loopRunning)
1857
+ return undefined;
1858
+ const inferStart = Date.now();
1859
+ const result = await PromiseTimeout(objectPlugin.proxy.detectObjects(objectFrame.model), DETECT_TIMEOUT_MS, undefined, `Object detection timed out after ${DETECT_TIMEOUT_MS}ms`);
1860
+ this.perf.objectMs += Date.now() - inferStart;
1861
+ this.perf.objectCount++;
1862
+ return FrameScaler.undoLetterbox(ensureDetectionBoxes(result.detections), objectFrame.geometry);
1863
+ }
1864
+ async detectInWindow(plugin, frame, scaler, window, spec) {
1865
+ const scaleStart = Date.now();
1866
+ const cropped = await scaler.cropToSpec(frame, window, spec);
1867
+ this.perf.scaleMs += Date.now() - scaleStart;
1868
+ if (!cropped)
1869
+ return [];
1870
+ const result = await PromiseTimeout(plugin.proxy.detectObjects(scaler.toVideoFrameData(cropped.padded, 'model')), DETECT_TIMEOUT_MS, undefined, `Object detection timed out after ${DETECT_TIMEOUT_MS}ms`);
1871
+ return FrameScaler.undoLetterbox(ensureDetectionBoxes(result.detections), cropped.geometry);
1872
+ }
1659
1873
  async scaleFrameForPlugin(rawFrame, plugin, scaler = this.frameScaler) {
1660
1874
  const inputSpec = plugin.modelSpec?.input;
1661
1875
  if (!isVideoInputSpec(inputSpec))
@@ -1672,27 +1886,34 @@ let DetectionCoordinator = class DetectionCoordinator {
1672
1886
  ingestAssistedObjects(sensorId, objects) {
1673
1887
  if (!objects.assisted)
1674
1888
  return;
1889
+ // the assist returns raw detector output; the frame path dedupes via NMS
1890
+ // before ingest, so this path must merge too or near-identical candidate
1891
+ // boxes inflate the object count
1892
+ const merged = this.pipeline.runMergeAndZoneFilter(objects.detections);
1675
1893
  const refiltered = this.applyExternalDetectionFilters(SensorType.Object, {
1676
- detected: objects.detections.length > 0,
1677
- detections: objects.detections,
1894
+ detected: merged.length > 0,
1895
+ detections: merged,
1896
+ });
1897
+ detectionRecord.tick({
1898
+ assistIngest: {
1899
+ raw: objects.detections.map((d) => ({ label: d.label, score: d.confidence, box: d.box })),
1900
+ merged: merged.length,
1901
+ kept: (refiltered.detections ?? []).length,
1902
+ },
1678
1903
  });
1679
1904
  this.ingestDetectionResult(SensorType.Object, sensorId, refiltered);
1680
1905
  }
1681
- async runObjectAssist(frame, reported) {
1906
+ async runObjectAssist(frame, reported, scaler = this.frameScaler) {
1682
1907
  if (!this.plugins.hasEligibleObjectAssist()) {
1683
1908
  return { detections: reported, assisted: false };
1684
1909
  }
1685
1910
  const assist = this.plugins.get(SensorType.ObjectAssist);
1686
- const scaled = await this.scaleFrameForPlugin(frame, assist);
1687
- if (!scaled)
1688
- return { detections: reported, assisted: false };
1689
1911
  try {
1690
1912
  const inferStart = Date.now();
1691
- const result = await PromiseTimeout(assist.proxy.detectObjects(scaled.model), DETECT_TIMEOUT_MS, undefined, `Object assist timed out after ${DETECT_TIMEOUT_MS}ms`);
1913
+ const boxed = await this.assistDetections(assist, frame, scaler, reported);
1692
1914
  this.perf.assistMs += Date.now() - inferStart;
1693
1915
  this.perf.assistCount++;
1694
1916
  const reportedLabels = new Set(reported.map((d) => d.label.toLowerCase()));
1695
- const boxed = FrameScaler.undoLetterbox(ensureDetectionBoxes(result?.detections ?? []), scaled.geometry);
1696
1917
  const found = boxed.filter((d) => reportedLabels.size === 0 || reportedLabels.has(d.label.toLowerCase()));
1697
1918
  if (found.length === 0)
1698
1919
  return { detections: reported, assisted: false };
@@ -1706,6 +1927,31 @@ let DetectionCoordinator = class DetectionCoordinator {
1706
1927
  return { detections: reported, assisted: false };
1707
1928
  }
1708
1929
  }
1930
+ async assistDetections(assist, frame, scaler, reported) {
1931
+ const inputSpec = assist.modelSpec?.input;
1932
+ const reportedBoxes = reported.map((d) => d.box).filter((box) => box !== undefined);
1933
+ // a coordinate-less report still has the localizer's diff anchors: zoom
1934
+ // the assist into the moving regions instead of letterboxing the whole
1935
+ // frame, which shrinks the subject to nothing on a main-stream frame
1936
+ const anchors = reportedBoxes.length > 0 ? reportedBoxes : [...this.anchorBoxes, ...this.farewellBoxes];
1937
+ const pad = reportedBoxes.length > 0 ? TRACK_PAD : MOTION_PAD;
1938
+ if (isVideoInputSpec(inputSpec) && anchors.length > 0) {
1939
+ const windows = planWindowsOnce(anchors, pad, frame.width, frame.height, inputSpec.width);
1940
+ if (windows.length > 0) {
1941
+ detectionRecord.zoom({ kind: 'assist', anchors, windows });
1942
+ const perWindow = await Promise.all(windows.map((window) => this.detectInWindow(assist, frame, scaler, window, inputSpec)));
1943
+ return mergeWindowDetections(perWindow.flat());
1944
+ }
1945
+ }
1946
+ detectionRecord.tick({
1947
+ assistFullFrame: { anchors: anchors.length, videoSpec: isVideoInputSpec(inputSpec), loop: this.loopRunning, cascade: this.cascade.isActive },
1948
+ });
1949
+ const scaled = await this.scaleFrameForPlugin(frame, assist, scaler);
1950
+ if (!scaled)
1951
+ return [];
1952
+ const result = await PromiseTimeout(assist.proxy.detectObjects(scaled.model), DETECT_TIMEOUT_MS, undefined, `Object assist timed out after ${DETECT_TIMEOUT_MS}ms`);
1953
+ return FrameScaler.undoLetterbox(ensureDetectionBoxes(result?.detections ?? []), scaled.geometry);
1954
+ }
1709
1955
  };
1710
1956
  __decorate([
1711
1957
  RPCMethod,