@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.
- package/dist/interface/assets/404-B4_ZWIGx.js +1 -0
- package/dist/interface/assets/About-Cd8Ipr7a.js +1 -0
- package/dist/interface/assets/Automation-COZFDnKK.js +3 -0
- package/dist/interface/assets/AutomationImport-BTkkRikE.js +2 -0
- package/dist/interface/assets/AutomationStore-VdGEOwci.js +2 -0
- package/dist/interface/assets/AutomationStoreDetail-BQ2fER7x.js +2 -0
- package/dist/interface/assets/Automations-QmfGIQXO.js +2 -0
- package/dist/interface/assets/Camera-LSq1bWmA.css +1 -0
- package/dist/interface/assets/Camera-g95slrO0.js +2 -0
- package/dist/interface/assets/CameraConsole-KqRFGZzT.js +7 -0
- package/dist/interface/assets/Cameras-BO4SDgY0.js +652 -0
- package/dist/interface/assets/Camview-yzOY3cnD.js +1 -0
- package/dist/interface/assets/CertificateUpload-Dd4Ec7bt.js +1 -0
- package/dist/interface/assets/Config-Db-Eh4Lf.js +2 -0
- package/dist/interface/assets/{ConfigActionCameraControl-DWHg-YEU.js → ConfigActionCameraControl-CbG-HEuU.js} +1 -1
- package/dist/interface/assets/ConfigActionDelay-BoGIhNHr.js +1 -0
- package/dist/interface/assets/ConfigActionHttp-DyPo2XvQ.js +1 -0
- package/dist/interface/assets/ConfigActionImageInput-C9aYztb6.js +1 -0
- package/dist/interface/assets/ConfigActionMqtt-kQz9Y9OZ.js +1 -0
- package/dist/interface/assets/ConfigActionNotification-CbhQpAqn.js +1 -0
- package/dist/interface/assets/{ConfigActionNotificationControl-jSgxCZmV.js → ConfigActionNotificationControl-DEOv_FGO.js} +1 -1
- package/dist/interface/assets/ConfigActionOutput-CGtG-8PF.js +1 -0
- package/dist/interface/assets/ConfigActionPlugin-C8v0CWrz.js +1 -0
- package/dist/interface/assets/ConfigActionSensor-CESXnRuQ.js +1 -0
- package/dist/interface/assets/ConfigActionSnapshot-TVhjeFKP.js +1 -0
- package/dist/interface/assets/ConfigActionVariable-DwRFwopb.js +1 -0
- package/dist/interface/assets/ConfigConditionIfElse-CmtoYTUU.js +1 -0
- package/dist/interface/assets/ConfigConditionSensorState-3B9Sjxdb.js +1 -0
- package/dist/interface/assets/ConfigConditionSwitch-CA-tuT-G.js +1 -0
- package/dist/interface/assets/ConfigConditionTime-Djq2yOCr.js +1 -0
- package/dist/interface/assets/{ConfigSensorValueInput-DnMlFzil.js → ConfigSensorValueInput-DZ7r71aU.js} +1 -1
- package/dist/interface/assets/ConfigTriggerDetection-B62txb4H.js +1 -0
- package/dist/interface/assets/ConfigTriggerGeofence-sbEglk8c.js +1 -0
- package/dist/interface/assets/ConfigTriggerManual-nrYy4xBP.js +1 -0
- package/dist/interface/assets/ConfigTriggerMqtt-CK8FEVxs.js +1 -0
- package/dist/interface/assets/ConfigTriggerSchedule-DN3Tl7f4.js +1 -0
- package/dist/interface/assets/ConfigTriggerSensor-DBXrlYyS.js +1 -0
- package/dist/interface/assets/{ConfigTriggerSystem-CNBgtDF1.js → ConfigTriggerSystem-QFLNb9GC.js} +1 -1
- package/dist/interface/assets/ConfigTriggerWebhook-46mdJk6X.js +1 -0
- package/dist/interface/assets/Console-B78qXoaH.js +1 -0
- package/dist/interface/assets/CuiAutomationRunsDialog-BvtQfpTx.js +1 -0
- package/dist/interface/assets/CuiBottomSheet-BjkvcU8T.js +1 -0
- package/dist/interface/assets/CuiBottomSheet-UiJcO4M3.js +1 -0
- package/dist/interface/assets/CuiCameraPipCard-BOky075i.js +1 -0
- package/dist/interface/assets/CuiCameraRecordings-BzbwSK8-.css +1 -0
- package/dist/interface/assets/CuiCameraRecordings-DIBgpGaS.js +1 -0
- package/dist/interface/assets/CuiCameraShares-46_p-wPD.js +1 -0
- package/dist/interface/assets/CuiCameraTable-BXm5THd1.js +2 -0
- package/dist/interface/assets/CuiCameraTable-DwRywA0z.js +1 -0
- package/dist/interface/assets/CuiChartTable-ByHWgFTc.js +1 -0
- package/dist/interface/assets/CuiChartTable-DCGY-zVy.css +1 -0
- package/dist/interface/assets/{CuiConsole-CqEvNGe_.js → CuiConsole-BOyrbC0a.js} +2 -2
- package/dist/interface/assets/CuiDataTable-BDyku8Vr.js +1 -0
- package/dist/interface/assets/CuiLightControl-CsK2cn7L.js +1 -0
- package/dist/interface/assets/CuiList-D1d-S_-K.js +1 -0
- package/dist/interface/assets/CuiMarkdownContent-CckAX6Ci.js +1 -0
- package/dist/interface/assets/{CuiMarkdownContent-PSq4kE1G.js → CuiMarkdownContent-bAQw35id.js} +1 -1
- package/dist/interface/assets/CuiPluginCard-C-1ZhHi8.js +2 -0
- package/dist/interface/assets/CuiPluginCategoryChip-CCnZkkL5.js +1 -0
- package/dist/interface/assets/CuiPluginOAuthButton-CTKbdFZJ.js +2 -0
- package/dist/interface/assets/{CuiPluginTrustBadge-2wsPzYZA.js → CuiPluginTrustBadge-B_1b1iYf.js} +1 -1
- package/dist/interface/assets/CuiQRCode-B0CF6e-5.js +1 -0
- package/dist/interface/assets/CuiSchema-BYYeh269.css +1 -0
- package/dist/interface/assets/CuiSchema-CxRd72K7.js +1 -0
- package/dist/interface/assets/CuiTopNavbarItem-Bs4iRb31.js +1 -0
- package/dist/interface/assets/Faces-kl1hwT5M.js +1 -0
- package/dist/interface/assets/FirstSteps-BYGvfH-S.js +1 -0
- package/dist/interface/assets/Floorplan-DNd9aQv3.js +1 -0
- package/dist/interface/assets/Floorplan-Da5gt435.css +1 -0
- package/dist/interface/assets/Instances-aZApGeHu.js +1 -0
- package/dist/interface/assets/Logs-Bnq3wEXS.js +6 -0
- package/dist/interface/assets/Menu-M1PaPt5e.js +1 -0
- package/dist/interface/assets/Metrics-D5UHs6wj.js +9 -0
- package/dist/interface/assets/Metrics-DX59XXDc.css +1 -0
- package/dist/interface/assets/OAuthDeviceFlow-o2Irbs3_.js +1 -0
- package/dist/interface/assets/Plugin-CEpSsNQA.js +1 -0
- package/dist/interface/assets/PluginConsole-f5xf7P3Y.js +7 -0
- package/dist/interface/assets/PluginDetail-Ca-NJcL1.js +2 -0
- package/dist/interface/assets/PluginSchema-DMjDPtOB.js +1 -0
- package/dist/interface/assets/PluginSearch-DurGrb4n.js +1 -0
- package/dist/interface/assets/PluginSearch-Tmg5vCQF.js +2 -0
- package/dist/interface/assets/PluginUpdateProgress-FVY9RtmB.js +1 -0
- package/dist/interface/assets/Plugins-ocuSdXhB.js +1 -0
- package/dist/interface/assets/Recordings-CtSj2RuO.js +1 -0
- package/dist/interface/assets/Recordings-D4NzYCO9.css +1 -0
- package/dist/interface/assets/SensorEdit-CcD4LvZr.js +1 -0
- package/dist/interface/assets/SensorHistory-5nCWisih.js +1 -0
- package/dist/interface/assets/{Sensors-BUpob7LU.css → Sensors-BsLHVGqk.css} +1 -1
- package/dist/interface/assets/Sensors-CWjmo27p.js +2 -0
- package/dist/interface/assets/Settings-DsxjHlTb.js +1 -0
- package/dist/interface/assets/SettingsAccount-DQm9vFIT.js +1 -0
- package/dist/interface/assets/SettingsAccount-DekJwq5r.js +1 -0
- package/dist/interface/assets/SettingsAppearance-B7mm_vGf.js +1 -0
- package/dist/interface/assets/SettingsAppearance-Dc5qomCw.js +1 -0
- package/dist/interface/assets/SettingsBackup-xZ6fRlMp.js +1 -0
- package/dist/interface/assets/SettingsList-M3eOiLIi.js +1 -0
- package/dist/interface/assets/SettingsMqtt-D8grttey.js +1 -0
- package/dist/interface/assets/SettingsNotifications-BtFyN8J3.js +1 -0
- package/dist/interface/assets/SettingsPermissions-g6ppqzcI.js +1 -0
- package/dist/interface/assets/SettingsRecordings-DVEsPab-.js +1 -0
- package/dist/interface/assets/SettingsRemote-CtP6Gz9C.css +1 -0
- package/dist/interface/assets/SettingsRemote-Dqs-d-Xk.js +2 -0
- package/dist/interface/assets/SettingsSystem-EaqPKfS_.js +2 -0
- package/dist/interface/assets/SettingsUsers-B3m7YHzN.js +1 -0
- package/dist/interface/assets/Terminal-BXQKgvte.js +4 -0
- package/dist/interface/assets/Updates-Difs3xzH.js +2 -0
- package/dist/interface/assets/VariableInput-DNlqv5NS.js +1 -0
- package/dist/interface/assets/{VariableSuggestions-CrEa2zN-.js → VariableSuggestions-cR1Q4nfD.js} +1 -1
- package/dist/interface/assets/VersionsHandler-BHyZgGCP.js +7 -0
- package/dist/interface/assets/VirtualSensorCreate-CSzlXcHk.js +1 -0
- package/dist/interface/assets/{Workers-7hKMBU4w.css → Workers-DH59zE1C.css} +1 -1
- package/dist/interface/assets/Workers-L7PPidAd.js +2 -0
- package/dist/interface/assets/{account-DuSFtIHf.js → account-BW_r05fC.js} +1 -1
- package/dist/interface/assets/ace-BSiU5ylo.js +1 -0
- package/dist/interface/assets/{ace.config-BNjBs7Fe.js → ace.config-DIcQ8yOb.js} +1 -1
- package/dist/interface/assets/{alert-circle-C2AU59aR.js → alert-circle-We_nDFAy.js} +1 -1
- package/dist/interface/assets/alert-outline-KxFvd3i6.js +1 -0
- package/dist/interface/assets/api-Bpl4Sd0_.js +1 -0
- package/dist/interface/assets/api-CEbDxsSY.css +2 -0
- package/dist/interface/assets/api-ou2-S3Z9.js +2 -0
- package/dist/interface/assets/arrow-left-V1y_rwzT.js +1 -0
- package/dist/interface/assets/auth-O2tHbgZf.js +1 -0
- package/dist/interface/assets/automations-C3f5HUy2.js +1 -0
- package/dist/interface/assets/{back-filled-DcBDBvvP.js → back-filled-MAIFvJqE.js} +1 -1
- package/dist/interface/assets/{bell-ring-DSX81yd4.js → bell-ring-DBCDVZQy.js} +1 -1
- package/dist/interface/assets/brain-Bqf50oqB.js +1 -0
- package/dist/interface/assets/cameras.schema-BzSBpeUl.js +1 -0
- package/dist/interface/assets/cctv-Tng3HqLa.js +1 -0
- package/dist/interface/assets/check-circle-DNTQ812v.js +1 -0
- package/dist/interface/assets/chevron-down-DqCuosKP.js +1 -0
- package/dist/interface/assets/{clock-outline-DF1wLNzs.js → clock-outline-DwnISu0k.js} +1 -1
- package/dist/interface/assets/{close-BNAWPz0y.js → close-ChGy_BeH.js} +1 -1
- package/dist/interface/assets/{close-circle-zhDWvz98.js → close-circle-B9jFTQT1.js} +1 -1
- package/dist/interface/assets/{cloud-check-pUK1Fpt9.js → cloud-check-DABrVuto.js} +1 -1
- package/dist/interface/assets/cloudHandoff-ChRx5fsr.js +1 -0
- package/dist/interface/assets/config-BIxANITl.js +1 -0
- package/dist/interface/assets/content-copy-CsUEmnFS.js +1 -0
- package/dist/interface/assets/{copy-BPT84cDt.js → copy-CzGo5Njh.js} +1 -1
- package/dist/interface/assets/{cube-scan-DOe6W9mW.js → cube-scan-BR5la6Qx.js} +1 -1
- package/dist/interface/assets/delete-CiJ6ng5_.js +1 -0
- package/dist/interface/assets/{dist-Yc5s0_JB.js → dist-2BkH6KaN.js} +1 -1
- package/dist/interface/assets/download-CaV8-tw6.js +1 -0
- package/dist/interface/assets/esm-BbJ0evRe.js +1 -0
- package/dist/interface/assets/esm-BhHeaCLC.js +1 -0
- package/dist/interface/assets/esm-BoDnt3g2.js +1 -0
- package/dist/interface/assets/esm-BvXpx-4p.js +1 -0
- package/dist/interface/assets/esm-BvcRUTNT.js +1 -0
- package/dist/interface/assets/esm-C0UOpApX.js +1 -0
- package/dist/interface/assets/esm-C43w04L-.js +1 -0
- package/dist/interface/assets/esm-CdrLDSBm.js +1 -0
- package/dist/interface/assets/esm-Cwg8vrH-.js +1 -0
- package/dist/interface/assets/esm-DKQwb4z2.js +1 -0
- package/dist/interface/assets/esm-DcJy8m_I.js +1 -0
- package/dist/interface/assets/esm-Dp7jb0si.js +1 -0
- package/dist/interface/assets/esm-cbRd6tNR.js +1 -0
- package/dist/interface/assets/esm-iDhBQslT.js +1 -0
- package/dist/interface/assets/{eye-off-CaRq7Ks2.js → eye-off-DAhBNvxJ.js} +1 -1
- package/dist/interface/assets/eye-off-outline-Bj1tXD9w.js +1 -0
- package/dist/interface/assets/{flowSchema-CNnBxcwy.js → flowSchema-Cu_f8mZr.js} +1 -1
- package/dist/interface/assets/{history-SuH8IHAj.js → history-F0qTKQGT.js} +1 -1
- package/dist/interface/assets/home-DEKGoPL_.js +1 -0
- package/dist/interface/assets/{information-outline-BQDq8w2t.js → information-outline-CQ5e79wc.js} +1 -1
- package/dist/interface/assets/{intercomService-DJHBix4X.js → intercomService-JoKcW49f.js} +1 -1
- package/dist/interface/assets/lan-D9PCM8iA.js +1 -0
- package/dist/interface/assets/{lightbulb-outline-ClK17CO6.js → lightbulb-outline-BtraGBwO.js} +1 -1
- package/dist/interface/assets/main-BF8Mg561.css +1 -0
- package/dist/interface/assets/main-CT2dZ3bR.js +3 -0
- package/dist/interface/assets/{microphone-C0weJY9W.js → microphone-CGwzrMxl.js} +1 -1
- package/dist/interface/assets/minus-HH0UdIjG.js +1 -0
- package/dist/interface/assets/mqtt-D_ToI2JF.js +1 -0
- package/dist/interface/assets/native-BNjvFMoD.js +1 -0
- package/dist/interface/assets/native-XKbagpr7.js +1 -0
- package/dist/interface/assets/{nodeDefinitions-c5rXs9EW.js → nodeDefinitions-D6zhuw60.js} +1 -1
- package/dist/interface/assets/notifications-BZCPhbuG.js +1 -0
- package/dist/interface/assets/{pencil-outline-D7aD4cCo.js → pencil-outline-B5N-eyTy.js} +1 -1
- package/dist/interface/assets/plugin-BStPT8lW.js +1 -0
- package/dist/interface/assets/{plugins-5gXj0utE.js → plugins-DXYT--j6.js} +1 -1
- package/dist/interface/assets/{plus-CA5o30dE.js → plus-Ct9djYce.js} +1 -1
- package/dist/interface/assets/plus-CxnlTOHI.js +1 -0
- package/dist/interface/assets/power-C-XO8yWI.js +1 -0
- package/dist/interface/assets/radar-8nK_pSbi.js +1 -0
- package/dist/interface/assets/refresh-CygeIRWu.js +1 -0
- package/dist/interface/assets/restore-D_Dq23W9.js +1 -0
- package/dist/interface/assets/{ring-resize-DkY5EgVl.js → ring-resize-DsW_XYdA.js} +1 -1
- package/dist/interface/assets/rooms-BXXhWbYq.js +1 -0
- package/dist/interface/assets/{round-alt-arrow-left-bold-CfccdiWp.js → round-alt-arrow-left-bold-2FHg8vBl.js} +1 -1
- package/dist/interface/assets/{search-BZkSqZO5.js → search-Ck7b7yvI.js} +1 -1
- package/dist/interface/assets/sensorIcons-tORVN7ay.js +1 -0
- package/dist/interface/assets/sensors-ud0INKWh.js +1 -0
- package/dist/interface/assets/server-_f9tZajz.js +1 -0
- package/dist/interface/assets/{settings-BUEZ5iRE.js → settings-Bw6giVLH.js} +1 -1
- package/dist/interface/assets/{source-branch-ztDB0e13.js → source-branch-K7YOvHCE.js} +1 -1
- package/dist/interface/assets/theme-t4dIArYy.js +1 -0
- package/dist/interface/assets/{trash-2-DMMlSPXn.js → trash-2-eaKaSMof.js} +1 -1
- package/dist/interface/assets/trash-can-outline-_aiv_oEu.js +1 -0
- package/dist/interface/assets/{trash-fill-DevIK050.js → trash-fill-OkxLbTTj.js} +1 -1
- package/dist/interface/assets/{trash2-BLScx4HX.js → trash2-Czz-2j5D.js} +1 -1
- package/dist/interface/assets/types-CCCcoJBr.js +1 -0
- package/dist/interface/assets/{types-fCQkAGfW.js → types-D889aM6c.js} +1 -1
- package/dist/interface/assets/types-Dg1X10xd.js +1 -0
- package/dist/interface/assets/undo-RdNzlJdm.js +1 -0
- package/dist/interface/assets/ungrouped-Pn6rAXZt.js +1 -0
- package/dist/interface/assets/{CuiRecordingsGrid-Q4C3aeLo.css → ungrouped-uv64nr5n.css} +1 -1
- package/dist/interface/assets/updates-i-Ukebxe.js +1 -0
- package/dist/interface/assets/upload-DCTSXaJV.js +1 -0
- package/dist/interface/assets/upload-D_9SZvdG.js +1 -0
- package/dist/interface/assets/{useAppVersion-9zH_FspP.js → useAppVersion-DY0h_lct.js} +1 -1
- package/dist/interface/assets/useBackupRestore-BcAR3KYA.js +1 -0
- package/dist/interface/assets/{useCameraOptions-BIaDXHeq.js → useCameraOptions-C-rXBi8d.js} +1 -1
- package/dist/interface/assets/{useLogsSocket-BLV7dWSG.js → useLogsSocket-Bigb4u3j.js} +1 -1
- package/dist/interface/assets/{useNavLayout-wq-6JyWK.js → useNavLayout-C9FWniNC.js} +1 -1
- package/dist/interface/assets/{usePermissions-BiBlyeQl.js → usePermissions-C_4RPiE4.js} +1 -1
- package/dist/interface/assets/{usePluginUpdates-BZJSqnSF.js → usePluginUpdates-CQwLK3om.js} +1 -1
- package/dist/interface/assets/{usePushRegistration-CGFiyCuv.js → usePushRegistration-sYPibp5s.js} +2 -2
- package/dist/interface/assets/useServerRestart-B0Cfu10q.js +1 -0
- package/dist/interface/assets/{useStreamStatus-BFCF1B3T.js → useStreamStatus-BLXdLAvK.js} +1 -1
- package/dist/interface/assets/useTabSwipe-C3qfclkm.js +1 -0
- package/dist/interface/assets/useUpdateChannel-DvO5NQPE.js +1 -0
- package/dist/interface/assets/useUpdatesSocket-C6wTDGIg.js +1 -0
- package/dist/interface/assets/useUserOptions-B9T46skV.js +1 -0
- package/dist/interface/assets/{variable-CCMnQpL2.js → variable-CYzMRxrK.js} +1 -1
- package/dist/interface/assets/vendor-AX0A8AMd.js +20 -0
- package/dist/interface/assets/{vendor-ace-DIEVbs6L.js → vendor-ace-Bxj8w-af.js} +11 -11
- package/dist/interface/assets/vendor-cameraui-OySaGjmo.js +2326 -0
- package/dist/interface/assets/{vendor-capacitor-4nn-eF9U.js → vendor-capacitor-B-ykF6jr.js} +2 -2
- package/dist/interface/assets/vendor-chart-C-1xJhJN.js +3 -0
- package/dist/interface/assets/vendor-core-BZ52eUwC.js +1 -0
- package/dist/interface/assets/{vendor-dnd-ChrDrMuz.js → vendor-dnd-onyWAbsd.js} +1 -1
- package/dist/interface/assets/{vendor-draggabilly-DSeIE_bQ.js → vendor-draggabilly-B7q3Src-.js} +1 -1
- package/dist/interface/assets/{vendor-gridstack-DsRWLz0m.css → vendor-gridstack-7uZBsdEh.css} +1 -1
- package/dist/interface/assets/vendor-gridstack-C5hqQCSi.js +3 -0
- package/dist/interface/assets/{vendor-leaflet-Bcgd-fkG.js → vendor-leaflet-aXJ6sRgf.js} +1 -1
- package/dist/interface/assets/{vendor-markdown-Bw_90xkF.js → vendor-markdown-pUmink8s.js} +4 -4
- package/dist/interface/assets/{vendor-primevue-b9CB9Uh0.js → vendor-primevue-CvHDsVi_.js} +73 -73
- package/dist/interface/assets/vendor-vueflow-8uLknwcA.js +26 -0
- package/dist/interface/assets/vendor-xterm-Bor91IHm.js +85 -0
- package/dist/interface/assets/{vendor-zod-Dbq0fBXY.js → vendor-zod-B0ZFM2Pr.js} +1 -1
- package/dist/interface/assets/web-BFaZfzEP.js +1 -0
- package/dist/interface/assets/web-BdoMdiEl.js +1 -0
- package/dist/interface/assets/web-BjKL51lK-BiZEVgwj.js +1 -0
- package/dist/interface/assets/web-Bo0giiE9.js +1 -0
- package/dist/interface/assets/web-Bq6cS9c5.js +1 -0
- package/dist/interface/assets/web-Ckkk3gWT.js +1 -0
- package/dist/interface/assets/web-CsH298dH.js +1 -0
- package/dist/interface/assets/web-Cti9cQXr.js +1 -0
- package/dist/interface/assets/web-CtlJwfNS.js +1 -0
- package/dist/interface/assets/web-DUuNw0Ig.js +1 -0
- package/dist/interface/assets/web-Dz9QrW1k.js +1 -0
- package/dist/interface/assets/web-MA3uDo37.js +1 -0
- package/dist/interface/assets/web-UiUgCX6p.js +1 -0
- package/dist/interface/assets/web-zisLysQx.js +1 -0
- package/dist/interface/assets/{webhook-DQiZUPv8.js → webhook-CPF2kUgU.js} +1 -1
- package/dist/interface/assets/workbox-window.prod.es5-CocanelX.js +1 -0
- package/dist/interface/assets/{zoom-in-Du1IB9oA.js → zoom-in-D-OIVcXF.js} +1 -1
- package/dist/interface/index.html +51 -45
- package/dist/interface/sw.js +1 -1
- package/dist/server/package.json +21 -29
- package/dist/server/requirements.txt +4 -4
- package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/signal_handler.py +2 -6
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/__init__.py +12 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/__init__.py +4 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/config.py +10 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/detection.py +3 -3
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/enums.py +6 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/manager/__init__.py +91 -1
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/__init__.py +2 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/contract.py +3 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/interfaces.py +64 -1
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/detection.py +3 -3
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/object.py +6 -1
- package/dist/server/src/api/controllers/auth.controller.d.ts +0 -1
- package/dist/server/src/api/controllers/auth.controller.js +1 -18
- package/dist/server/src/api/controllers/auth.controller.js.map +1 -1
- package/dist/server/src/api/controllers/floorplan.controller.d.ts +11 -0
- package/dist/server/src/api/controllers/floorplan.controller.js +27 -0
- package/dist/server/src/api/controllers/floorplan.controller.js.map +1 -0
- package/dist/server/src/api/controllers/frameWorkers.controller.d.ts +2 -2
- package/dist/server/src/api/controllers/frameWorkers.controller.js +26 -49
- package/dist/server/src/api/controllers/frameWorkers.controller.js.map +1 -1
- package/dist/server/src/api/controllers/remote.controller.d.ts +1 -1
- package/dist/server/src/api/controllers/remote.controller.js +15 -24
- package/dist/server/src/api/controllers/remote.controller.js.map +1 -1
- package/dist/server/src/api/controllers/rooms.controller.d.ts +18 -0
- package/dist/server/src/api/controllers/rooms.controller.js +48 -0
- package/dist/server/src/api/controllers/rooms.controller.js.map +1 -0
- package/dist/server/src/api/controllers/sensors.controller.d.ts +1 -2
- package/dist/server/src/api/controllers/sensors.controller.js +0 -14
- package/dist/server/src/api/controllers/sensors.controller.js.map +1 -1
- package/dist/server/src/api/controllers/server.controller.d.ts +3 -0
- package/dist/server/src/api/controllers/server.controller.js +61 -3
- package/dist/server/src/api/controllers/server.controller.js.map +1 -1
- package/dist/server/src/api/controllers/updates.controller.d.ts +8 -0
- package/dist/server/src/api/controllers/updates.controller.js +40 -0
- package/dist/server/src/api/controllers/updates.controller.js.map +1 -0
- package/dist/server/src/api/controllers/workers.controller.js +8 -2
- package/dist/server/src/api/controllers/workers.controller.js.map +1 -1
- package/dist/server/src/api/database/constants.d.ts +2 -0
- package/dist/server/src/api/database/constants.js +2 -0
- package/dist/server/src/api/database/constants.js.map +1 -1
- package/dist/server/src/api/database/index.d.ts +4 -2
- package/dist/server/src/api/database/index.js +17 -6
- package/dist/server/src/api/database/index.js.map +1 -1
- package/dist/server/src/api/database/migrations/v2-1-11.js.map +1 -1
- package/dist/server/src/api/database/migrations/v2-1-13.d.ts +3 -0
- package/dist/server/src/api/database/migrations/v2-1-13.js +51 -0
- package/dist/server/src/api/database/migrations/v2-1-13.js.map +1 -0
- package/dist/server/src/api/database/migrations/v2-1-14.d.ts +3 -0
- package/dist/server/src/api/database/migrations/v2-1-14.js +87 -0
- package/dist/server/src/api/database/migrations/v2-1-14.js.map +1 -0
- package/dist/server/src/api/database/migrations/v2-1-15.d.ts +3 -0
- package/dist/server/src/api/database/migrations/v2-1-15.js +160 -0
- package/dist/server/src/api/database/migrations/v2-1-15.js.map +1 -0
- package/dist/server/src/api/database/migrations/v2-1-16.d.ts +3 -0
- package/dist/server/src/api/database/migrations/v2-1-16.js +36 -0
- package/dist/server/src/api/database/migrations/v2-1-16.js.map +1 -0
- package/dist/server/src/api/database/record-schemas.d.ts +65 -1
- package/dist/server/src/api/database/record-schemas.js +74 -0
- package/dist/server/src/api/database/record-schemas.js.map +1 -1
- package/dist/server/src/api/database/types.d.ts +68 -0
- package/dist/server/src/api/index.js +4 -0
- package/dist/server/src/api/index.js.map +1 -1
- package/dist/server/src/api/routes/floorplan.routes.d.ts +2 -0
- package/dist/server/src/api/routes/floorplan.routes.js +29 -0
- package/dist/server/src/api/routes/floorplan.routes.js.map +1 -0
- package/dist/server/src/api/routes/index.js +7 -1
- package/dist/server/src/api/routes/index.js.map +1 -1
- package/dist/server/src/api/routes/rooms.routes.d.ts +2 -0
- package/dist/server/src/api/routes/rooms.routes.js +40 -0
- package/dist/server/src/api/routes/rooms.routes.js.map +1 -0
- package/dist/server/src/api/routes/sensors.routes.js +1 -12
- package/dist/server/src/api/routes/sensors.routes.js.map +1 -1
- package/dist/server/src/api/routes/server.routes.js +33 -0
- package/dist/server/src/api/routes/server.routes.js.map +1 -1
- package/dist/server/src/api/routes/updates.routes.d.ts +2 -0
- package/dist/server/src/api/routes/updates.routes.js +47 -0
- package/dist/server/src/api/routes/updates.routes.js.map +1 -0
- package/dist/server/src/api/routes/workers.routes.js +3 -2
- package/dist/server/src/api/routes/workers.routes.js.map +1 -1
- package/dist/server/src/api/schemas/cameras.schema.d.ts +134 -55
- package/dist/server/src/api/schemas/cameras.schema.js +35 -3
- package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
- package/dist/server/src/api/schemas/config.schema.d.ts +0 -12
- package/dist/server/src/api/schemas/config.schema.js +1 -10
- package/dist/server/src/api/schemas/config.schema.js.map +1 -1
- package/dist/server/src/api/schemas/floorplan.schema.d.ts +110 -0
- package/dist/server/src/api/schemas/floorplan.schema.js +61 -0
- package/dist/server/src/api/schemas/floorplan.schema.js.map +1 -0
- package/dist/server/src/api/schemas/rooms.schema.d.ts +12 -0
- package/dist/server/src/api/schemas/rooms.schema.js +14 -0
- package/dist/server/src/api/schemas/rooms.schema.js.map +1 -0
- package/dist/server/src/api/schemas/sensors.schema.d.ts +0 -8
- package/dist/server/src/api/schemas/sensors.schema.js +1 -6
- package/dist/server/src/api/schemas/sensors.schema.js.map +1 -1
- package/dist/server/src/api/schemas/users.schema.d.ts +8 -8
- package/dist/server/src/api/schemas/workers.schema.d.ts +3 -0
- package/dist/server/src/api/schemas/workers.schema.js +5 -0
- package/dist/server/src/api/schemas/workers.schema.js.map +1 -1
- package/dist/server/src/api/services/backup.service.js +4 -5
- package/dist/server/src/api/services/backup.service.js.map +1 -1
- package/dist/server/src/api/services/cameras.service.d.ts +7 -0
- package/dist/server/src/api/services/cameras.service.js +41 -12
- package/dist/server/src/api/services/cameras.service.js.map +1 -1
- package/dist/server/src/api/services/floorplan.service.d.ts +19 -0
- package/dist/server/src/api/services/floorplan.service.js +173 -0
- package/dist/server/src/api/services/floorplan.service.js.map +1 -0
- package/dist/server/src/api/services/plugins.service.d.ts +4 -1
- package/dist/server/src/api/services/plugins.service.js +27 -7
- package/dist/server/src/api/services/plugins.service.js.map +1 -1
- package/dist/server/src/api/services/rooms.service.d.ts +17 -0
- package/dist/server/src/api/services/rooms.service.js +121 -0
- package/dist/server/src/api/services/rooms.service.js.map +1 -0
- package/dist/server/src/api/services/sensors.service.d.ts +2 -1
- package/dist/server/src/api/services/sensors.service.js +24 -5
- package/dist/server/src/api/services/sensors.service.js.map +1 -1
- package/dist/server/src/api/services/server.service.d.ts +3 -1
- package/dist/server/src/api/services/server.service.js +12 -2
- package/dist/server/src/api/services/server.service.js.map +1 -1
- package/dist/server/src/api/services/updates.service.d.ts +110 -0
- package/dist/server/src/api/services/updates.service.js +491 -0
- package/dist/server/src/api/services/updates.service.js.map +1 -0
- package/dist/server/src/api/types/index.d.ts +7 -6
- package/dist/server/src/api/utils/cert.d.ts +1 -0
- package/dist/server/src/api/utils/cert.js +58 -29
- package/dist/server/src/api/utils/cert.js.map +1 -1
- package/dist/server/src/api/utils/constants.d.ts +3 -0
- package/dist/server/src/api/utils/constants.js +3 -0
- package/dist/server/src/api/utils/constants.js.map +1 -1
- package/dist/server/src/api/utils/custom-cert.d.ts +48 -0
- package/dist/server/src/api/utils/custom-cert.js +193 -0
- package/dist/server/src/api/utils/custom-cert.js.map +1 -0
- package/dist/server/src/api/websocket/index.js +5 -1
- package/dist/server/src/api/websocket/index.js.map +1 -1
- package/dist/server/src/api/websocket/nsp/metrics.d.ts +2 -0
- package/dist/server/src/api/websocket/nsp/metrics.js +36 -4
- package/dist/server/src/api/websocket/nsp/metrics.js.map +1 -1
- package/dist/server/src/api/websocket/nsp/sensors.d.ts +14 -0
- package/dist/server/src/api/websocket/nsp/sensors.js +83 -0
- package/dist/server/src/api/websocket/nsp/sensors.js.map +1 -0
- package/dist/server/src/api/websocket/nsp/server.js +43 -7
- package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
- package/dist/server/src/api/websocket/types.d.ts +4 -1
- package/dist/server/src/camera/controller.js +3 -2
- package/dist/server/src/camera/controller.js.map +1 -1
- package/dist/server/src/camera/decoder/child.js +3 -0
- package/dist/server/src/camera/decoder/child.js.map +1 -1
- package/dist/server/src/camera/decoder/debug/detection-record.d.ts +6 -0
- package/dist/server/src/camera/decoder/debug/detection-record.js +21 -0
- package/dist/server/src/camera/decoder/debug/detection-record.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-coordinator.d.ts +23 -3
- package/dist/server/src/camera/decoder/detection-coordinator.js +342 -96
- package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-pipeline.d.ts +3 -1
- package/dist/server/src/camera/decoder/detection-pipeline.js +12 -4
- package/dist/server/src/camera/decoder/detection-pipeline.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-window.d.ts +17 -0
- package/dist/server/src/camera/decoder/detection-window.js +188 -0
- package/dist/server/src/camera/decoder/detection-window.js.map +1 -0
- package/dist/server/src/camera/decoder/event-manager.d.ts +1 -0
- package/dist/server/src/camera/decoder/event-manager.js +36 -4
- package/dist/server/src/camera/decoder/event-manager.js.map +1 -1
- package/dist/server/src/camera/decoder/event-thumbnailer.js +0 -2
- package/dist/server/src/camera/decoder/event-thumbnailer.js.map +1 -1
- package/dist/server/src/camera/decoder/frame-scaler.d.ts +12 -0
- package/dist/server/src/camera/decoder/frame-scaler.js +39 -7
- package/dist/server/src/camera/decoder/frame-scaler.js.map +1 -1
- package/dist/server/src/camera/decoder/hardware.d.ts +1 -0
- package/dist/server/src/camera/decoder/hardware.js +11 -0
- package/dist/server/src/camera/decoder/hardware.js.map +1 -1
- package/dist/server/src/camera/decoder/motion-localizer.d.ts +16 -0
- package/dist/server/src/camera/decoder/motion-localizer.js +49 -0
- package/dist/server/src/camera/decoder/motion-localizer.js.map +1 -0
- package/dist/server/src/camera/decoder/nvr-sink.d.ts +4 -0
- package/dist/server/src/camera/decoder/nvr-sink.js +1 -1
- package/dist/server/src/camera/decoder/nvr-sink.js.map +1 -1
- package/dist/server/src/camera/decoder/perf-tracker.d.ts +2 -0
- package/dist/server/src/camera/decoder/perf-tracker.js +4 -0
- package/dist/server/src/camera/decoder/perf-tracker.js.map +1 -1
- package/dist/server/src/camera/decoder/plugin-registry.js +1 -6
- package/dist/server/src/camera/decoder/plugin-registry.js.map +1 -1
- package/dist/server/src/camera/decoder/sources/analysis-source.d.ts +1 -0
- package/dist/server/src/camera/decoder/sources/audio-source.js +0 -1
- package/dist/server/src/camera/decoder/sources/audio-source.js.map +1 -1
- package/dist/server/src/camera/decoder/sources/buffered-source.d.ts +1 -0
- package/dist/server/src/camera/decoder/sources/buffered-source.js +38 -0
- package/dist/server/src/camera/decoder/sources/buffered-source.js.map +1 -1
- package/dist/server/src/camera/decoder/types.d.ts +9 -8
- package/dist/server/src/camera/decoder/types.js.map +1 -1
- package/dist/server/src/camera/decoder/worker.js +7 -5
- package/dist/server/src/camera/decoder/worker.js.map +1 -1
- package/dist/server/src/go2rtc/index.js +10 -2
- package/dist/server/src/go2rtc/index.js.map +1 -1
- package/dist/server/src/main.js +40 -13
- package/dist/server/src/main.js.map +1 -1
- package/dist/server/src/manager/coreManager.d.ts +7 -4
- package/dist/server/src/manager/coreManager.js +19 -1
- package/dist/server/src/manager/coreManager.js.map +1 -1
- package/dist/server/src/manager/downloadManager.d.ts +1 -0
- package/dist/server/src/manager/downloadManager.js +30 -4
- package/dist/server/src/manager/downloadManager.js.map +1 -1
- package/dist/server/src/manager/types.d.ts +1 -0
- package/dist/server/src/manager/types.js +2 -0
- package/dist/server/src/manager/types.js.map +1 -1
- package/dist/server/src/mqtt/ha-discovery.js +0 -1
- package/dist/server/src/mqtt/ha-discovery.js.map +1 -1
- package/dist/server/src/plugins/index.js +0 -2
- package/dist/server/src/plugins/index.js.map +1 -1
- package/dist/server/src/plugins/runtime/base.d.ts +2 -1
- package/dist/server/src/plugins/runtime/base.js +16 -4
- package/dist/server/src/plugins/runtime/base.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/child.js +3 -0
- package/dist/server/src/plugins/runtime/node/child.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/index.js +2 -2
- package/dist/server/src/plugins/runtime/node/index.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js +39 -28
- package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js.map +1 -1
- package/dist/server/src/plugins/runtime/node/proxy/limiter.d.ts +1 -0
- package/dist/server/src/plugins/runtime/node/proxy/limiter.js +21 -0
- package/dist/server/src/plugins/runtime/node/proxy/limiter.js.map +1 -0
- package/dist/server/src/plugins/runtime/node/proxy/sensorManager.d.ts +3 -1
- package/dist/server/src/plugins/runtime/node/proxy/sensorManager.js +63 -47
- package/dist/server/src/plugins/runtime/node/proxy/sensorManager.js.map +1 -1
- package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +5 -0
- package/dist/server/src/plugins/runtime/python/proxy/limiter.py +14 -0
- package/dist/server/src/plugins/runtime/python/proxy/sensor.py +4 -0
- package/dist/server/src/plugins/runtime/python/proxy/sensor_manager.py +35 -1
- package/dist/server/src/plugins/runtime/python/rpc/typings.py +4 -1
- package/dist/server/src/plugins/worker.js +1 -0
- package/dist/server/src/plugins/worker.js.map +1 -1
- package/dist/server/src/remote/types.d.ts +1 -2
- package/dist/server/src/rpc/index.js +2 -2
- package/dist/server/src/rpc/index.js.map +1 -1
- package/dist/server/src/rpc/interfaces/core.d.ts +19 -2
- package/dist/server/src/rpc/interfaces/sensor.d.ts +29 -1
- package/dist/server/src/rpc/leafConnection.d.ts +12 -0
- package/dist/server/src/rpc/leafConnection.js +60 -0
- package/dist/server/src/rpc/leafConnection.js.map +1 -0
- package/dist/server/src/rpc/namespaces.d.ts +4 -0
- package/dist/server/src/rpc/namespaces.js +5 -0
- package/dist/server/src/rpc/namespaces.js.map +1 -1
- package/dist/server/src/rpc/server.d.ts +2 -0
- package/dist/server/src/rpc/server.js +11 -5
- package/dist/server/src/rpc/server.js.map +1 -1
- package/dist/server/src/sensors/discovery.d.ts +29 -0
- package/dist/server/src/sensors/discovery.js +149 -0
- package/dist/server/src/sensors/discovery.js.map +1 -0
- package/dist/server/src/sensors/registry.d.ts +2 -2
- package/dist/server/src/sensors/registry.js +31 -10
- package/dist/server/src/sensors/registry.js.map +1 -1
- package/dist/server/src/services/config/constants.js +1 -2
- package/dist/server/src/services/config/constants.js.map +1 -1
- package/dist/server/src/services/config/defaults.d.ts +1 -2
- package/dist/server/src/services/config/defaults.js +0 -6
- package/dist/server/src/services/config/defaults.js.map +1 -1
- package/dist/server/src/services/config/index.d.ts +10 -0
- package/dist/server/src/services/config/index.js +96 -35
- package/dist/server/src/services/config/index.js.map +1 -1
- package/dist/server/src/services/config/types.d.ts +0 -7
- package/dist/server/src/types.d.ts +10 -1
- package/dist/server/src/utils/camera.d.ts +1 -0
- package/dist/server/src/utils/camera.js +7 -0
- package/dist/server/src/utils/camera.js.map +1 -1
- package/dist/server/src/utils/crash.d.ts +2 -0
- package/dist/server/src/utils/crash.js +14 -0
- package/dist/server/src/utils/crash.js.map +1 -0
- package/dist/server/src/utils/ipc.d.ts +9 -0
- package/dist/server/src/utils/ipc.js +31 -5
- package/dist/server/src/utils/ipc.js.map +1 -1
- package/dist/server/src/utils/process-exit.d.ts +5 -0
- package/dist/server/src/utils/process-exit.js +11 -0
- package/dist/server/src/utils/process-exit.js.map +1 -0
- package/dist/server/src/utils/system-info.d.ts +9 -0
- package/dist/server/src/utils/system-info.js +48 -0
- package/dist/server/src/utils/system-info.js.map +1 -0
- package/dist/server/src/workers/agent.d.ts +3 -0
- package/dist/server/src/workers/agent.js +38 -7
- package/dist/server/src/workers/agent.js.map +1 -1
- package/dist/server/src/workers/capabilities/frame-decoding.d.ts +2 -2
- package/dist/server/src/workers/capabilities/frame-decoding.js +17 -6
- package/dist/server/src/workers/capabilities/frame-decoding.js.map +1 -1
- package/dist/server/src/workers/capabilities/handler.d.ts +2 -2
- package/dist/server/src/workers/capabilities/plugin-host.d.ts +2 -2
- package/dist/server/src/workers/capabilities/plugin-host.js +6 -6
- package/dist/server/src/workers/capabilities/plugin-host.js.map +1 -1
- package/dist/server/src/workers/manager.d.ts +9 -1
- package/dist/server/src/workers/manager.js +24 -0
- package/dist/server/src/workers/manager.js.map +1 -1
- package/dist/server/src/workers/types.d.ts +14 -0
- package/dist/server/src/workers/types.js.map +1 -1
- package/package.json +21 -29
- package/dist/interface/assets/404-BEb5gvkW.js +0 -1
- package/dist/interface/assets/About-BKkjuIVJ.js +0 -1
- package/dist/interface/assets/Automation-DA89AEEI.js +0 -3
- package/dist/interface/assets/AutomationImport-hYr3Lp8F.js +0 -2
- package/dist/interface/assets/AutomationStore-DKhnExZn.js +0 -2
- package/dist/interface/assets/AutomationStoreDetail-DmqqEOir.js +0 -2
- package/dist/interface/assets/Automations-B6WFJyxS.js +0 -2
- package/dist/interface/assets/Camera-C5gF7yVN.css +0 -1
- package/dist/interface/assets/Camera-DmsSKvpY.js +0 -2
- package/dist/interface/assets/CameraConsole-DVpyGhx8.js +0 -7
- package/dist/interface/assets/Cameras-KOOphtlx.js +0 -652
- package/dist/interface/assets/Camview-BPQIinyP.js +0 -1
- package/dist/interface/assets/Config-DeUec_TN.js +0 -2
- package/dist/interface/assets/ConfigActionDelay-C8nNA7TC.js +0 -1
- package/dist/interface/assets/ConfigActionHttp-Dc97gItH.js +0 -1
- package/dist/interface/assets/ConfigActionImageInput-DpOGqlzA.js +0 -1
- package/dist/interface/assets/ConfigActionMqtt-D5DJ21oe.js +0 -1
- package/dist/interface/assets/ConfigActionNotification-4wKfanGB.js +0 -1
- package/dist/interface/assets/ConfigActionOutput-C8Esieni.js +0 -1
- package/dist/interface/assets/ConfigActionPlugin-C_cv60d3.js +0 -1
- package/dist/interface/assets/ConfigActionSensor-CFIKoJ3-.js +0 -1
- package/dist/interface/assets/ConfigActionSnapshot-BqaTwtN3.js +0 -1
- package/dist/interface/assets/ConfigActionVariable-De9RCGU4.js +0 -1
- package/dist/interface/assets/ConfigConditionIfElse-CeNDIucw.js +0 -1
- package/dist/interface/assets/ConfigConditionSensorState-C_Q9gU23.js +0 -1
- package/dist/interface/assets/ConfigConditionSwitch-DR63IGcD.js +0 -1
- package/dist/interface/assets/ConfigConditionTime-C9iuSxxe.js +0 -1
- package/dist/interface/assets/ConfigTriggerDetection-iThbCKOO.js +0 -1
- package/dist/interface/assets/ConfigTriggerGeofence-BeKwVWvS.js +0 -1
- package/dist/interface/assets/ConfigTriggerManual-DPkRlUqD.js +0 -1
- package/dist/interface/assets/ConfigTriggerMqtt-kd65tGJE.js +0 -1
- package/dist/interface/assets/ConfigTriggerSchedule-D6MoVDPc.js +0 -1
- package/dist/interface/assets/ConfigTriggerSensor-AMQM6f2r.js +0 -1
- package/dist/interface/assets/ConfigTriggerWebhook-B70DobSi.js +0 -1
- package/dist/interface/assets/Console-N_2Vornl.js +0 -1
- package/dist/interface/assets/CuiAutomationRunsDialog-Cp6Apki9.js +0 -1
- package/dist/interface/assets/CuiBottomSheet-CIR_fmSk.js +0 -1
- package/dist/interface/assets/CuiBottomSheet-D5N8X1K-.js +0 -1
- package/dist/interface/assets/CuiCameraPipCard-DP6X45oq.js +0 -1
- package/dist/interface/assets/CuiCameraRecordings-AA-sBtb4.css +0 -1
- package/dist/interface/assets/CuiCameraRecordings-CRjXsdO4.js +0 -1
- package/dist/interface/assets/CuiCameraShares-DMHwZEf1.js +0 -1
- package/dist/interface/assets/CuiCameraTable-AnEPu3XS.js +0 -2
- package/dist/interface/assets/CuiCameraTable-D5ZqTLVt.js +0 -1
- package/dist/interface/assets/CuiDataTable-wA_LbHH8.js +0 -1
- package/dist/interface/assets/CuiLightControl-CB_Tp4tI.js +0 -1
- package/dist/interface/assets/CuiList-DrYuFhK4.js +0 -1
- package/dist/interface/assets/CuiMarkdownContent-DIycyLeP.js +0 -1
- package/dist/interface/assets/CuiPluginCard-DEuNt5ni.js +0 -2
- package/dist/interface/assets/CuiPluginCategoryChip-BbkbkYj6.js +0 -1
- package/dist/interface/assets/CuiPluginOAuthButton-vMuRa9Qd.js +0 -2
- package/dist/interface/assets/CuiQRCode-Dh9EcaVc.js +0 -1
- package/dist/interface/assets/CuiRecordingsGrid-HjZEiSyp.js +0 -1
- package/dist/interface/assets/CuiSchema--yMBD996.css +0 -1
- package/dist/interface/assets/CuiSchema-CSFoI6cg.js +0 -1
- package/dist/interface/assets/CuiTopNavbarItem-CSdvkKHR.js +0 -1
- package/dist/interface/assets/Faces-CPZ5RA68.js +0 -1
- package/dist/interface/assets/FirstSteps-CaF8STWH.js +0 -1
- package/dist/interface/assets/Instances-Cw7A4I7E.js +0 -1
- package/dist/interface/assets/Logs-4Mgj7YWu.js +0 -6
- package/dist/interface/assets/Menu-T-54ZSSD.js +0 -1
- package/dist/interface/assets/Metrics-CQGKmHev.css +0 -1
- package/dist/interface/assets/Metrics-Dgm5qpzh.js +0 -6
- package/dist/interface/assets/OAuthDeviceFlow-DGikOkgK.js +0 -1
- package/dist/interface/assets/Plugin-YxqbMbUc.js +0 -1
- package/dist/interface/assets/PluginConsole-ZZvJlgIh.js +0 -7
- package/dist/interface/assets/PluginDetail-B9NgbzkJ.js +0 -2
- package/dist/interface/assets/PluginSchema-Cx_LInpM.js +0 -1
- package/dist/interface/assets/PluginSearch-5AgSWlmi.js +0 -1
- package/dist/interface/assets/PluginSearch-P274oMvy.js +0 -2
- package/dist/interface/assets/PluginUpdateProgress-0nV-8LvI.js +0 -1
- package/dist/interface/assets/Plugins-Bvru3q2P.js +0 -1
- package/dist/interface/assets/Recordings-BWGWC6Kq.js +0 -1
- package/dist/interface/assets/Recordings-cR4_6aGN.css +0 -1
- package/dist/interface/assets/SensorEdit-gEw6HHZs.js +0 -1
- package/dist/interface/assets/SensorHistory-IgMpuLdC.js +0 -1
- package/dist/interface/assets/Sensors-DukA8Xqx.js +0 -2
- package/dist/interface/assets/Settings-DWpeWPJh.js +0 -1
- package/dist/interface/assets/SettingsAccount-C1OpCtob.js +0 -1
- package/dist/interface/assets/SettingsAccount-CrLcqzSn.js +0 -1
- package/dist/interface/assets/SettingsAppearance-AhUjml5E.js +0 -1
- package/dist/interface/assets/SettingsAppearance-C8EEBVZN.js +0 -1
- package/dist/interface/assets/SettingsBackup-BJupyZCJ.js +0 -1
- package/dist/interface/assets/SettingsList-MXYSQMZ3.js +0 -1
- package/dist/interface/assets/SettingsMqtt-F3pV1Bvo.js +0 -1
- package/dist/interface/assets/SettingsNotifications-BmaAccX9.js +0 -1
- package/dist/interface/assets/SettingsPermissions-Dd_yfNlk.js +0 -1
- package/dist/interface/assets/SettingsRecordings-85B2bQIf.js +0 -1
- package/dist/interface/assets/SettingsRemote-C_ikoXW7.js +0 -2
- package/dist/interface/assets/SettingsRemote-DzrfpHjw.css +0 -1
- package/dist/interface/assets/SettingsSystem-Ct3qms5O.js +0 -2
- package/dist/interface/assets/SettingsUsers-D36vZ8Zf.js +0 -1
- package/dist/interface/assets/Terminal-ltPiB9CB.js +0 -4
- package/dist/interface/assets/VariableInput-7c7Px-DM.js +0 -1
- package/dist/interface/assets/VersionsHandler-BFuLGk6Y.js +0 -7
- package/dist/interface/assets/VirtualSensorCreate-uumfOHgB.js +0 -1
- package/dist/interface/assets/Workers-Bowrc1AF.js +0 -2
- package/dist/interface/assets/ace-BqKKexH4.js +0 -1
- package/dist/interface/assets/alert-outline-GrD7-zHq.js +0 -1
- package/dist/interface/assets/api-DLVsQBAO.js +0 -1
- package/dist/interface/assets/api-daCggwpn.css +0 -2
- package/dist/interface/assets/api-py5HP4SF.js +0 -2
- package/dist/interface/assets/arrow-left-C1N6U6kZ.js +0 -1
- package/dist/interface/assets/auth-uQlIia9h.js +0 -1
- package/dist/interface/assets/automations-ChG1qcO7.js +0 -1
- package/dist/interface/assets/cameras.schema-Cv7cjMz3.js +0 -1
- package/dist/interface/assets/check-circle-Do_mBN_A.js +0 -1
- package/dist/interface/assets/chevron-down-D111daTn.js +0 -1
- package/dist/interface/assets/cloudHandoff-CL4sircA.js +0 -1
- package/dist/interface/assets/config-B1aWtF-N.js +0 -1
- package/dist/interface/assets/content-copy-CLkJTA4w.js +0 -1
- package/dist/interface/assets/delete-BF6keuqy.js +0 -1
- package/dist/interface/assets/deployed-code-update-xHE-blDN.js +0 -1
- package/dist/interface/assets/download-BCPfm6aN.js +0 -1
- package/dist/interface/assets/esm-B3yVlCMw.js +0 -1
- package/dist/interface/assets/esm-BKQ7CQK7.js +0 -1
- package/dist/interface/assets/esm-BiSE05P9.js +0 -1
- package/dist/interface/assets/esm-BoPthGAl.js +0 -1
- package/dist/interface/assets/esm-C2ALrdyx.js +0 -1
- package/dist/interface/assets/esm-CKEGzys4.js +0 -1
- package/dist/interface/assets/esm-CctiCHtK.js +0 -1
- package/dist/interface/assets/esm-Cqq81lnk.js +0 -1
- package/dist/interface/assets/esm-CyrLQTu0.js +0 -1
- package/dist/interface/assets/esm-D6O-eZYo.js +0 -1
- package/dist/interface/assets/esm-DG1f0qwo.js +0 -1
- package/dist/interface/assets/esm-DGegIZMF.js +0 -1
- package/dist/interface/assets/esm-JGwpHVqo.js +0 -1
- package/dist/interface/assets/esm-TRigYTsA.js +0 -1
- package/dist/interface/assets/home-CUykMSBW.js +0 -1
- package/dist/interface/assets/main-CLvcwWW7.js +0 -3
- package/dist/interface/assets/main-mJXdi_gx.css +0 -1
- package/dist/interface/assets/minus-RI3VlDe8.js +0 -1
- package/dist/interface/assets/mqtt-Cyhv8shC.js +0 -1
- package/dist/interface/assets/native-B01iGjCh.js +0 -1
- package/dist/interface/assets/native-D381pxlG.js +0 -1
- package/dist/interface/assets/notifications-DniREnpL.js +0 -1
- package/dist/interface/assets/plugin-W20ihuog.js +0 -1
- package/dist/interface/assets/plus-DHwFyXkb.js +0 -1
- package/dist/interface/assets/power-C9UIp2oO.js +0 -1
- package/dist/interface/assets/round-restart-alt-D3jT5i_T.js +0 -1
- package/dist/interface/assets/round-restart-alt-DdIfy7mU.css +0 -1
- package/dist/interface/assets/sensorIcons-BXauWntX.js +0 -1
- package/dist/interface/assets/sensors-Bc02Z1G9.js +0 -1
- package/dist/interface/assets/server-D2KGja0u.js +0 -1
- package/dist/interface/assets/table-2-line-B-z0xvbG.js +0 -1
- package/dist/interface/assets/theme-vkX_uBgJ.js +0 -1
- package/dist/interface/assets/trash-can-outline-DLKniIWM.js +0 -1
- package/dist/interface/assets/types-CrvnT4-i.js +0 -1
- package/dist/interface/assets/types-D6IQ6ssc.js +0 -1
- package/dist/interface/assets/upload-ClkX9wUX.js +0 -1
- package/dist/interface/assets/useBackupRestore-Dbf24OqP.js +0 -1
- package/dist/interface/assets/useServerRestart-CjPAgzoX.js +0 -1
- package/dist/interface/assets/useUpdateChannel-F4WpbMJR.js +0 -1
- package/dist/interface/assets/useUserOptions-GbSC7_qt.js +0 -1
- package/dist/interface/assets/vendor-BaiDFVEr.js +0 -23
- package/dist/interface/assets/vendor-cameraui-0EJfDg8o.js +0 -2326
- package/dist/interface/assets/vendor-chart-DtwjR6yw.js +0 -3
- package/dist/interface/assets/vendor-core-RnPzfwaA.js +0 -1
- package/dist/interface/assets/vendor-gridstack-qw2ro2uB.js +0 -3
- package/dist/interface/assets/vendor-vueflow-CLJNLJXc.js +0 -26
- package/dist/interface/assets/vendor-xterm-BafMBqaV.js +0 -91
- package/dist/interface/assets/web-BNRwhIOt.js +0 -1
- package/dist/interface/assets/web-BPkOXv4d.js +0 -1
- package/dist/interface/assets/web-BZIx_2d3.js +0 -1
- package/dist/interface/assets/web-BjKL51lK-BwChM7zd.js +0 -1
- package/dist/interface/assets/web-BkmtZjSt.js +0 -1
- package/dist/interface/assets/web-C6RgriWz.js +0 -1
- package/dist/interface/assets/web-CQFMLa0a.js +0 -1
- package/dist/interface/assets/web-CZGnd6VE.js +0 -1
- package/dist/interface/assets/web-Cfzay11X.js +0 -1
- package/dist/interface/assets/web-DAgBwKL-.js +0 -1
- package/dist/interface/assets/web-DgVHh5ek.js +0 -1
- package/dist/interface/assets/web-DlSXwZBR.js +0 -1
- package/dist/interface/assets/web-eDYxVGH7.js +0 -1
- package/dist/interface/assets/web-h4k3EoRQ.js +0 -1
- 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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
for
|
|
521
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
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.
|
|
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
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
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 = {
|
|
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
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
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
|
-
|
|
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:
|
|
1677
|
-
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
|
|
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,
|