@camera.ui/server 2.2.8 → 2.3.0

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 (493) hide show
  1. package/LICENSE.md +8 -1
  2. package/dist/interface/assets/{404-BYV0u5qE.js → 404-C0X5UBF4.js} +1 -1
  3. package/dist/interface/assets/About-Ctp_u5qK.js +1 -0
  4. package/dist/interface/assets/Assistant-Bj2bAUHD.css +1 -0
  5. package/dist/interface/assets/Assistant-CDrBV_mg.js +1 -0
  6. package/dist/interface/assets/Automation-Dp6V80Iz.js +3 -0
  7. package/dist/interface/assets/{Automation-BSicfOGF.css → Automation-R5o9sXYY.css} +1 -1
  8. package/dist/interface/assets/{AutomationImport-Iu-K82Os.js → AutomationImport-DKgg7atE.js} +2 -2
  9. package/dist/interface/assets/AutomationStore-CU-m5VC8.js +2 -0
  10. package/dist/interface/assets/{AutomationStoreDetail-BbvLRJ5u.js → AutomationStoreDetail-CiyIs8Iu.js} +2 -2
  11. package/dist/interface/assets/Automations-Dljh-sWu.js +2 -0
  12. package/dist/interface/assets/Camera-0p0P_mbp.css +1 -0
  13. package/dist/interface/assets/Camera-Bvovab-8.js +2 -0
  14. package/dist/interface/assets/{CameraConsole-JBD3ZmJ6.js → CameraConsole-D_Fv-MAi.js} +1 -1
  15. package/dist/interface/assets/{Cameras-R5mJGMK9.js → Cameras-Cq7Gw-fk.js} +2 -2
  16. package/dist/interface/assets/{Camview-DH6_8CxH.css → Camview-Bs2VvmUS.css} +1 -1
  17. package/dist/interface/assets/Camview-CP6PA20C.js +1 -0
  18. package/dist/interface/assets/{CertificateUpload-B9S4EOQs.js → CertificateUpload-DjzNMFc3.js} +1 -1
  19. package/dist/interface/assets/{Config-CbFl5Wcp.js → Config-Dl2TlyFe.js} +1 -1
  20. package/dist/interface/assets/{ConfigActionAssistant-DIOh6-np.js → ConfigActionAssistant-DCkJ_Iqq.js} +1 -1
  21. package/dist/interface/assets/ConfigActionCameraControl-2pzl59gR.js +1 -0
  22. package/dist/interface/assets/{ConfigActionDelay-B9i4YZjy.js → ConfigActionDelay-BAp1dr0N.js} +1 -1
  23. package/dist/interface/assets/{ConfigActionHttp-DFtxAa3U.js → ConfigActionHttp-_kqgEuun.js} +1 -1
  24. package/dist/interface/assets/{ConfigActionImageInput-CuTH4Nw2.js → ConfigActionImageInput-BgtACnCm.js} +1 -1
  25. package/dist/interface/assets/{ConfigActionMqtt-B9SfWP-G.js → ConfigActionMqtt-z7UzccW5.js} +1 -1
  26. package/dist/interface/assets/{ConfigActionNotification-BGMIByJT.js → ConfigActionNotification-bhbb5AqU.js} +1 -1
  27. package/dist/interface/assets/{ConfigActionNotificationControl-Cz72szMd.js → ConfigActionNotificationControl-BbvX8MFu.js} +1 -1
  28. package/dist/interface/assets/{ConfigActionOutput-BG6DoIRe.js → ConfigActionOutput-DdgSg3FU.js} +1 -1
  29. package/dist/interface/assets/{ConfigActionPlugin-B5oRSE9n.js → ConfigActionPlugin-DGjZd1L0.js} +1 -1
  30. package/dist/interface/assets/ConfigActionSensor-DmImWFAo.js +1 -0
  31. package/dist/interface/assets/{ConfigActionSnapshot-Di-uxMrg.js → ConfigActionSnapshot-hVHSfdtS.js} +1 -1
  32. package/dist/interface/assets/{ConfigActionVariable-BBpUti5A.js → ConfigActionVariable-BIpruwsx.js} +1 -1
  33. package/dist/interface/assets/{ConfigConditionIfElse-DjOKPXQw.js → ConfigConditionIfElse-DRSpsoR4.js} +1 -1
  34. package/dist/interface/assets/{ConfigConditionSensorState-BzvvZvD0.js → ConfigConditionSensorState-C2SNARH7.js} +1 -1
  35. package/dist/interface/assets/{ConfigConditionSwitch-DQvdfUxR.js → ConfigConditionSwitch-4SbQcU7N.js} +1 -1
  36. package/dist/interface/assets/{ConfigConditionTime-BqOElX5C.js → ConfigConditionTime-ESX3shbg.js} +1 -1
  37. package/dist/interface/assets/{ConfigSensorValueInput-BT-0LhSH.js → ConfigSensorValueInput-CTUdAA-R.js} +1 -1
  38. package/dist/interface/assets/{ConfigTriggerDetection-1OkudUah.js → ConfigTriggerDetection-BRr6ixxQ.js} +1 -1
  39. package/dist/interface/assets/{ConfigTriggerGeofence-HGatk3C5.js → ConfigTriggerGeofence-D-xRMGrT.js} +1 -1
  40. package/dist/interface/assets/{ConfigTriggerManual-DpRr_vVq.js → ConfigTriggerManual-aXD6k1qa.js} +1 -1
  41. package/dist/interface/assets/{ConfigTriggerMqtt-C_MId3BY.js → ConfigTriggerMqtt-pjHW4yOL.js} +1 -1
  42. package/dist/interface/assets/{ConfigTriggerSchedule-BmwDqd6N.js → ConfigTriggerSchedule-CYOt57qg.js} +1 -1
  43. package/dist/interface/assets/{ConfigTriggerSensor-Rgx8q4g8.js → ConfigTriggerSensor-BwJ_cAqd.js} +1 -1
  44. package/dist/interface/assets/{ConfigTriggerSystem-4VsHPmbn.js → ConfigTriggerSystem-DBXIrjzU.js} +1 -1
  45. package/dist/interface/assets/{ConfigTriggerWebhook-Bs7zEfY0.js → ConfigTriggerWebhook-CccBmMCb.js} +1 -1
  46. package/dist/interface/assets/Console-DWAaz1C6.js +1 -0
  47. package/dist/interface/assets/CuiAssistantConversation-B3xEiNNt.js +5 -0
  48. package/dist/interface/assets/{CuiAssistantConversation-BmBhwrNh.css → CuiAssistantConversation-C5ca1lgX.css} +1 -1
  49. package/dist/interface/assets/CuiAutomationRunsDialog-CfylVPLI.js +1 -0
  50. package/dist/interface/assets/CuiBottomSheet-ACN23VLS.js +1 -0
  51. package/dist/interface/assets/{CuiBottomSheet-Dd3uOtnC.js → CuiBottomSheet-DEVNeDqa.js} +1 -1
  52. package/dist/interface/assets/CuiCameraPipCard-rR_FW9zq.js +1 -0
  53. package/dist/interface/assets/CuiCameraRecordings-CnorhPhf.js +1 -0
  54. package/dist/interface/assets/CuiCameraShares-BxUgedC_.js +1 -0
  55. package/dist/interface/assets/{CuiCameraTable-C7WLZ2pA.js → CuiCameraTable-C3GB4Q2y.js} +2 -2
  56. package/dist/interface/assets/CuiCameraTable-MHfnZSyK.js +1 -0
  57. package/dist/interface/assets/CuiChartTable-TAzZgetO.js +1 -0
  58. package/dist/interface/assets/{CuiConsole-CkZML0iY.js → CuiConsole-Cf5lOCE1.js} +2 -2
  59. package/dist/interface/assets/{CuiDataTable-BFIhx1D3.js → CuiDataTable-DfjXa0C1.js} +1 -1
  60. package/dist/interface/assets/CuiLightControl-ChK-SvJp.js +1 -0
  61. package/dist/interface/assets/CuiList-C4fxd9lD.js +1 -0
  62. package/dist/interface/assets/CuiPluginCard-DMpANIQj.js +2 -0
  63. package/dist/interface/assets/CuiPluginCategoryChip-BKxJMid7.js +1 -0
  64. package/dist/interface/assets/{CuiPluginOAuthButton-BQZkTcgo.js → CuiPluginOAuthButton-DnQ838JJ.js} +2 -2
  65. package/dist/interface/assets/{CuiPluginTrustBadge-DbqdfdaL.js → CuiPluginTrustBadge-DyYDUWV6.js} +1 -1
  66. package/dist/interface/assets/{CuiQRCode-2WsWJQFi.js → CuiQRCode-S9fPi0_l.js} +1 -1
  67. package/dist/interface/assets/CuiSchema-DScmDQsh.js +1 -0
  68. package/dist/interface/assets/CuiTopNavbarItem-CT10aAlO.js +1 -0
  69. package/dist/interface/assets/Faces-Coy-tUVM.js +1 -0
  70. package/dist/interface/assets/FirstSteps-CrMJC049.js +1 -0
  71. package/dist/interface/assets/Floorplan-Bj_mVrxp.js +1 -0
  72. package/dist/interface/assets/{Floorplan-Ci63Zd8W.css → Floorplan-CT5TrMSD.css} +1 -1
  73. package/dist/interface/assets/Instances-B_mpKAng.js +1 -0
  74. package/dist/interface/assets/{Logs-DMehPk0t.js → Logs-fY1dpQk4.js} +2 -2
  75. package/dist/interface/assets/Menu-Bgi-NLdg.js +1 -0
  76. package/dist/interface/assets/Metrics-DnMeIrkf.css +1 -0
  77. package/dist/interface/assets/Metrics-k9KACiwh.js +12 -0
  78. package/dist/interface/assets/OAuthDeviceFlow-xTh83xmc.js +1 -0
  79. package/dist/interface/assets/Plugin-BB7x7UHw.css +1 -0
  80. package/dist/interface/assets/Plugin-VWq7sONB.js +1 -0
  81. package/dist/interface/assets/{PluginConsole-D1BRQCO9.js → PluginConsole-LnnDOVBL.js} +2 -2
  82. package/dist/interface/assets/PluginDetail-CKD9sbDx.js +2 -0
  83. package/dist/interface/assets/{PluginSchema-B9VsBHOU.js → PluginSchema-BnB0_6Sk.js} +1 -1
  84. package/dist/interface/assets/PluginSearch-BoBZLLbr.js +1 -0
  85. package/dist/interface/assets/PluginSearch-kGhweU1J.js +2 -0
  86. package/dist/interface/assets/{PluginUpdateProgress-uj0XPV-_.js → PluginUpdateProgress-DMx0QlgE.js} +1 -1
  87. package/dist/interface/assets/{Plugins-CPx9Hszm.js → Plugins-Ekmr6aVa.js} +1 -1
  88. package/dist/interface/assets/RecentEventsFilter-StLJNuks.js +1 -0
  89. package/dist/interface/assets/Recordings-8PqxJOI3.css +1 -0
  90. package/dist/interface/assets/Recordings-Bvkuk_TV.js +1 -0
  91. package/dist/interface/assets/SensorEdit-CAf9Nb01.js +1 -0
  92. package/dist/interface/assets/SensorHistory-il8bDErX.js +1 -0
  93. package/dist/interface/assets/Sensors-sxQ6HLKo.js +2 -0
  94. package/dist/interface/assets/Settings-Bu0G7Ebx.js +1 -0
  95. package/dist/interface/assets/{Settings-D7495zbV.css → Settings-DtCSaLPb.css} +1 -1
  96. package/dist/interface/assets/SettingsAccount-8OZJLQi-.js +1 -0
  97. package/dist/interface/assets/SettingsAccount-bSfFi9YH.js +1 -0
  98. package/dist/interface/assets/SettingsAppearance-CnvN_Tzr.js +1 -0
  99. package/dist/interface/assets/SettingsAppearance-EvPWgF4c.js +1 -0
  100. package/dist/interface/assets/SettingsAssistant-B6s6pHCx.js +1 -0
  101. package/dist/interface/assets/SettingsBackup-Dd2FaUcN.js +1 -0
  102. package/dist/interface/assets/SettingsList-SvCO_gfG.js +1 -0
  103. package/dist/interface/assets/SettingsMqtt-BXBzHX84.js +1 -0
  104. package/dist/interface/assets/SettingsNotifications-CV-jJwFV.js +1 -0
  105. package/dist/interface/assets/SettingsPermissions-GchFaWjz.js +1 -0
  106. package/dist/interface/assets/SettingsRecordings-C4Ch_jmV.js +1 -0
  107. package/dist/interface/assets/SettingsRemote-OZHDJKSq.js +2 -0
  108. package/dist/interface/assets/SettingsSystem-BJlHXwVs.js +2 -0
  109. package/dist/interface/assets/SettingsUsers-RGOkOzx0.js +1 -0
  110. package/dist/interface/assets/Terminal-DX-ECC91.js +4 -0
  111. package/dist/interface/assets/Training-B8my7vka.js +1 -0
  112. package/dist/interface/assets/Training-D1DDjCCD.css +1 -0
  113. package/dist/interface/assets/Updates-DmavyhAn.js +2 -0
  114. package/dist/interface/assets/{VariableInput-CcILik4M.js → VariableInput-DQJle67Y.js} +1 -1
  115. package/dist/interface/assets/{VariableSuggestions-Bj0HdrYW.js → VariableSuggestions-D8V739dF.js} +1 -1
  116. package/dist/interface/assets/{VersionsHandler-BA8Lcysg.js → VersionsHandler-B41TJhgY.js} +1 -1
  117. package/dist/interface/assets/{VirtualSensorCreate-DvHyw7I2.js → VirtualSensorCreate-MfLh-LpH.js} +1 -1
  118. package/dist/interface/assets/Workers-CafDeRhH.js +2 -0
  119. package/dist/interface/assets/api-By0v6EeA.css +2 -0
  120. package/dist/interface/assets/api-D1iULsSy.js +4 -0
  121. package/dist/interface/assets/{api-CKbL5jC7.js → api-DbUdfXO_.js} +1 -1
  122. package/dist/interface/assets/{assistant-CwmHp5bB.js → assistant-7hqP6OpA.js} +1 -1
  123. package/dist/interface/assets/{auth-AfZrkJ2f.js → auth-CDxrn7fe.js} +1 -1
  124. package/dist/interface/assets/{automations-DOCG0q8-.js → automations-CTTQlGCW.js} +1 -1
  125. package/dist/interface/assets/{cameraSources-mHEz9ROa.js → cameraSources-MOiE_1-W.js} +1 -1
  126. package/dist/interface/assets/cloudHandoff-CJzFH7CW.js +1 -0
  127. package/dist/interface/assets/{config-AG0SnOiY.js → config-6EiGxiYm.js} +1 -1
  128. package/dist/interface/assets/eventLabels-idFWh3Y_.js +1 -0
  129. package/dist/interface/assets/{flowSchema-B0d3VjU7.js → flowSchema-Dp_-p9WA.js} +1 -1
  130. package/dist/interface/assets/{intercomService-DG3EeZ6s.js → intercomService-BQYzjnAi.js} +1 -1
  131. package/dist/interface/assets/main-0oXl_8v7.js +3 -0
  132. package/dist/interface/assets/main-CdvAniEp.css +1 -0
  133. package/dist/interface/assets/mqtt-ChvXxMhR.js +1 -0
  134. package/dist/interface/assets/{notifications-8FH4ApEz.js → notifications-CbL-1oMs.js} +1 -1
  135. package/dist/interface/assets/{plugins-2JLUEMYc.js → plugins-lsoAntRQ.js} +1 -1
  136. package/dist/interface/assets/{rooms-DoAfzA8W.js → rooms-P8WrRIco.js} +1 -1
  137. package/dist/interface/assets/sensorIcons-BRTtoaHX.js +1 -0
  138. package/dist/interface/assets/{sensorSlots-biaL-O8E.js → sensorSlots-BTj-IM7z.js} +1 -1
  139. package/dist/interface/assets/{sensors-DyAMdS-H.js → sensors-Dxc7HgjZ.js} +1 -1
  140. package/dist/interface/assets/{server-BDRUGj61.js → server-DlK8gUoE.js} +1 -1
  141. package/dist/interface/assets/{theme-CLxrnR60.js → theme-BOppzzar.js} +1 -1
  142. package/dist/interface/assets/types-CeruGCb8.js +1 -0
  143. package/dist/interface/assets/{types-8JXzkoC8.js → types-J1Drrxo1.js} +1 -1
  144. package/dist/interface/assets/types-U4AuTNLR.js +1 -0
  145. package/dist/interface/assets/ungrouped-ING_JAuK.js +1 -0
  146. package/dist/interface/assets/{updates-F-veEP1I.js → updates-DtVp84Y0.js} +1 -1
  147. package/dist/interface/assets/{useAppVersion-BjUQmB7M.js → useAppVersion-BGgCk5GD.js} +1 -1
  148. package/dist/interface/assets/{useAssistantActions-CNEJol4o.js → useAssistantActions-C13O5EHU.js} +1 -1
  149. package/dist/interface/assets/useBackupRestore-vrhmc9i-.js +1 -0
  150. package/dist/interface/assets/{useCameraOptions-D_oduve2.js → useCameraOptions-CI1baRmm.js} +1 -1
  151. package/dist/interface/assets/{useKeyboardInset-CPWSVYlA.js → useKeyboardInset-CvgJp091.js} +1 -1
  152. package/dist/interface/assets/{useLogsSocket-B_jXUqv8.js → useLogsSocket-Bf0BI8ET.js} +1 -1
  153. package/dist/interface/assets/{useNavLayout-DEngIIeU.js → useNavLayout-6zM1Y-7B.js} +1 -1
  154. package/dist/interface/assets/{usePermissions-DAO92InI.js → usePermissions-DZitFsBQ.js} +1 -1
  155. package/dist/interface/assets/{usePluginUpdates-CJi8Y_wl.js → usePluginUpdates-VZdpJ_Ax.js} +1 -1
  156. package/dist/interface/assets/{usePushRegistration-j9WCeFbv.js → usePushRegistration-vcbMrTxZ.js} +1 -1
  157. package/dist/interface/assets/{useServerRestart-BVks5tuC.js → useServerRestart-DrpuNbIu.js} +1 -1
  158. package/dist/interface/assets/{useStreamStatus-DQ0NSyU8.js → useStreamStatus-l3Pfk1H4.js} +1 -1
  159. package/dist/interface/assets/{useTabSwipe-CVq7EcIY.js → useTabSwipe-BSpi25WV.js} +1 -1
  160. package/dist/interface/assets/{useUpdateChannel-C0fjDvNP.js → useUpdateChannel-kAl-5UNY.js} +1 -1
  161. package/dist/interface/assets/{useUpdatesSocket-DXKF9hzc.js → useUpdatesSocket-CaFz_fEb.js} +1 -1
  162. package/dist/interface/assets/{useUserOptions-UjMeAL5n.js → useUserOptions-BKteXnmU.js} +1 -1
  163. package/dist/interface/assets/vendor-cameraui-K1Nw4PvF.js +2326 -0
  164. package/dist/interface/assets/vendor-core-CJdfpB0I.js +1 -0
  165. package/dist/interface/assets/{vendor-primevue-Zx6t06A4.js → vendor-primevue-DoA2Rwcb.js} +871 -871
  166. package/dist/interface/assets/walk-B8FNhXuj.js +1 -0
  167. package/dist/interface/ha/{404-D5gfy0Cd.js → 404-RtgPpD9N.js} +1 -1
  168. package/dist/interface/ha/{About-JzlpCzBN.js → About-0PRv9bU0.js} +4 -4
  169. package/dist/interface/ha/{Assistant-DgOfGesf.js → Assistant-DbwxVfpl.js} +1021 -1021
  170. package/dist/interface/ha/{Automation-BDaWYiBu.js → Automation-D3HomdH7.js} +159 -155
  171. package/dist/interface/ha/{AutomationImport-BNB_PJ9R.js → AutomationImport-nQUUvZcv.js} +6 -6
  172. package/dist/interface/ha/{AutomationStore-_TeOt1wz.js → AutomationStore-BXDD92wZ.js} +8 -8
  173. package/dist/interface/ha/{AutomationStoreDetail-jjIEZoRi.js → AutomationStoreDetail-BYeq7FID.js} +19 -19
  174. package/dist/interface/ha/{Automations-DM6FEVOw.js → Automations-CJlGqmSP.js} +74 -74
  175. package/dist/interface/ha/Camera-Ai4BxVh_.js +747 -0
  176. package/dist/interface/ha/{CameraConsole-BoVql05l.js → CameraConsole-UMNOX3dE.js} +4 -4
  177. package/dist/interface/ha/{Cameras-cQBGvXq7.js → Cameras-BW-AEXYi.js} +266 -266
  178. package/dist/interface/ha/{Camview-mkG5FXZM.js → Camview-jikpVEE0.js} +195 -194
  179. package/dist/interface/ha/{Config-BNPDzo_h.js → Config-BOxwBH2D.js} +111 -111
  180. package/dist/interface/ha/{ConfigActionAssistant-C-8P3DYz.js → ConfigActionAssistant--3iWk9sq.js} +4 -4
  181. package/dist/interface/ha/{ConfigActionCameraControl-x1ksGL7m.js → ConfigActionCameraControl-DbVXWTeA.js} +3 -3
  182. package/dist/interface/ha/{ConfigActionHttp-DzCJp85z.js → ConfigActionHttp-Du3n2Yj0.js} +2 -2
  183. package/dist/interface/ha/{ConfigActionImageInput-C5C5U_2z.js → ConfigActionImageInput-BrJrTZTY.js} +4 -4
  184. package/dist/interface/ha/{ConfigActionMqtt-T29xb75r.js → ConfigActionMqtt-DZd1BNUt.js} +4 -4
  185. package/dist/interface/ha/{ConfigActionNotification-BcnyilF9.js → ConfigActionNotification-CJWW10gt.js} +3 -3
  186. package/dist/interface/ha/{ConfigActionNotificationControl-D3wIVKuU.js → ConfigActionNotificationControl-Bl41AVv1.js} +2 -2
  187. package/dist/interface/ha/{ConfigActionOutput-hD-yVczw.js → ConfigActionOutput-OTj7Lwgq.js} +1 -1
  188. package/dist/interface/ha/{ConfigActionPlugin-Bz1O-O4Q.js → ConfigActionPlugin-B790PEk0.js} +8 -8
  189. package/dist/interface/ha/{ConfigActionSensor-FOz-PYl_.js → ConfigActionSensor-BG3jZxge.js} +5 -5
  190. package/dist/interface/ha/{ConfigActionSnapshot-CmxEOuK1.js → ConfigActionSnapshot-fGmLl6jb.js} +2 -2
  191. package/dist/interface/ha/{ConfigActionVariable-BCvkrdCh.js → ConfigActionVariable-CK3vYDsr.js} +1 -1
  192. package/dist/interface/ha/{ConfigConditionIfElse-icfTG9OA.js → ConfigConditionIfElse-DyFLGg3y.js} +3 -3
  193. package/dist/interface/ha/{ConfigConditionSensorState-ClUAsm0d.js → ConfigConditionSensorState-BUTfeFO2.js} +7 -7
  194. package/dist/interface/ha/{ConfigConditionSwitch-C8AMCkn6.js → ConfigConditionSwitch-iDG_ubif.js} +5 -5
  195. package/dist/interface/ha/{ConfigSensorValueInput-ChvDQzGd.js → ConfigSensorValueInput-BmRIGUKB.js} +5 -5
  196. package/dist/interface/ha/{ConfigTriggerDetection-aUSyaClu.js → ConfigTriggerDetection-DyPQGt9M.js} +24 -24
  197. package/dist/interface/ha/{ConfigTriggerGeofence-DsJeJWP4.js → ConfigTriggerGeofence-CGE-bH_t.js} +6 -6
  198. package/dist/interface/ha/{ConfigTriggerMqtt-CsAxA7QZ.js → ConfigTriggerMqtt-CM3KZqBc.js} +1 -1
  199. package/dist/interface/ha/{ConfigTriggerSensor-CTxr9cfU.js → ConfigTriggerSensor-DoHMcwP4.js} +1 -1
  200. package/dist/interface/ha/{ConfigTriggerSystem-C8UEfpfs.js → ConfigTriggerSystem-BYKbW4Zr.js} +2 -2
  201. package/dist/interface/ha/{ConfigTriggerWebhook-frEE-SCB.js → ConfigTriggerWebhook-5PBAadG8.js} +2 -2
  202. package/dist/interface/ha/{Console-A3VtbsLg.js → Console-BEXzl4p1.js} +7 -7
  203. package/dist/interface/ha/{CuiAutomationRunsDialog-BlJvhBiX.js → CuiAutomationRunsDialog-DkK_ar5G.js} +3 -3
  204. package/dist/interface/ha/{CuiBottomSheet-Cu-t3H0Z.js → CuiBottomSheet-CYNvQV4T.js} +2 -2
  205. package/dist/interface/ha/{CuiCameraRecordings-R5ArEmqJ.js → CuiCameraRecordings-DYjecmE_.js} +30 -48
  206. package/dist/interface/ha/{CuiCameraShares-B9pfRkM4.js → CuiCameraShares-C0H60nZS.js} +7 -7
  207. package/dist/interface/ha/{CuiCameraTable-CKjGKaMC.js → CuiCameraTable-CQNMyBaq.js} +5 -5
  208. package/dist/interface/ha/{CuiChartTable-BxWjRe-k.js → CuiChartTable-Bhv1p9zj.js} +1161 -1161
  209. package/dist/interface/ha/{CuiConsole-C5fzsR7t.js → CuiConsole-DtXorGF5.js} +20 -20
  210. package/dist/interface/ha/{CuiDataTable-BOdQDY8J.js → CuiDataTable-Cy8EjCk9.js} +7 -7
  211. package/dist/interface/ha/{CuiList-CU2NJ1K6.js → CuiList-DnW6Q5m2.js} +1 -1
  212. package/dist/interface/ha/{CuiPluginCard-BT71RRAD.js → CuiPluginCard-B4SCUblV.js} +125 -125
  213. package/dist/interface/ha/{CuiPluginOAuthButton-moh9uS7G.js → CuiPluginOAuthButton-BKg9SftQ.js} +5 -5
  214. package/dist/interface/ha/{CuiPluginTrustBadge-F_pVWkPJ.js → CuiPluginTrustBadge-CEtUJhCJ.js} +1 -1
  215. package/dist/interface/ha/{CuiQRCode-BNuj-nJ4.js → CuiQRCode-gp-9hqyk.js} +7 -7
  216. package/dist/interface/ha/{CuiSchema-Cb_8Ks-I.js → CuiSchema-CYpr_dD7.js} +161 -161
  217. package/dist/interface/ha/{CuiTopNavbarItem-BGzrrTls.js → CuiTopNavbarItem-CM-1oPxf.js} +1 -1
  218. package/dist/interface/ha/Faces-pa60ySng.js +1575 -0
  219. package/dist/interface/ha/{FirstSteps-BFX0-EEi.js → FirstSteps-D42yZm7R.js} +68 -68
  220. package/dist/interface/ha/{Floorplan-D6MGqSJT.js → Floorplan-BvE546pE.js} +512 -511
  221. package/dist/interface/ha/{Instances-CHzIUyyA.js → Instances-CAGCyfbB.js} +64 -64
  222. package/dist/interface/ha/{Logs-DZKM3dWv.js → Logs-RB3Ba8WM.js} +12 -12
  223. package/dist/interface/ha/{Menu-BQz4dfQi.js → Menu-hAnHu_jq.js} +17 -17
  224. package/dist/interface/ha/{Metrics-CdpWJ1mm.js → Metrics-ChYTebkX.js} +94 -93
  225. package/dist/interface/ha/{OAuthDeviceFlow-DUELtx3X.js → OAuthDeviceFlow-C05pH-9o.js} +3 -3
  226. package/dist/interface/ha/{Plugin-5bbTF0Rv.js → Plugin-D7XwcXkW.js} +647 -439
  227. package/dist/interface/ha/{PluginConsole-C__0lzsS.js → PluginConsole-DphEIOlL.js} +4 -4
  228. package/dist/interface/ha/{PluginDetail-Blrktk9W.js → PluginDetail-DfMl-yCl.js} +9 -9
  229. package/dist/interface/ha/{PluginSearch-BKbdwHQ1.js → PluginSearch-BPN4Opg5.js} +34 -34
  230. package/dist/interface/ha/{PluginUpdateProgress-IsNiecu3.js → PluginUpdateProgress-ByJ0R5sW.js} +3 -3
  231. package/dist/interface/ha/{Plugins-CC2Dwlx5.js → Plugins-BhKmjjNn.js} +59 -59
  232. package/dist/interface/ha/{RecentEventsFilter-9ZkDHD1g.js → RecentEventsFilter-BkLMlGVJ.js} +5 -6
  233. package/dist/interface/ha/Recordings-BaU7M1OW.js +1836 -0
  234. package/dist/interface/ha/{SensorEdit-Bi2Yx_ji.js → SensorEdit-DWxcCJ0F.js} +88 -88
  235. package/dist/interface/ha/{SensorHistory-sqG_6eav.js → SensorHistory-DuA9E9wT.js} +2 -2
  236. package/dist/interface/ha/{Sensors-DLtOh1p4.js → Sensors-CVpIHcgG.js} +438 -435
  237. package/dist/interface/ha/{Settings-DI3_zenm.js → Settings-BO2eBGEn.js} +61 -61
  238. package/dist/interface/ha/{SettingsAccount-pS86Qyr-.js → SettingsAccount-BQZZfoSM.js} +255 -255
  239. package/dist/interface/ha/{SettingsAppearance-tS3bubKQ.js → SettingsAppearance-B_yGl89u.js} +16 -16
  240. package/dist/interface/ha/{SettingsAssistant-LejCRXsF.js → SettingsAssistant-kMOixl9g.js} +501 -501
  241. package/dist/interface/ha/{SettingsBackup-CkhD1Kze.js → SettingsBackup-BpG-W4j-.js} +24 -24
  242. package/dist/interface/ha/{SettingsList-bibwvPSM.js → SettingsList-Btnkzu94.js} +6 -6
  243. package/dist/interface/ha/{SettingsMqtt-DSt0B4Qg.js → SettingsMqtt-C4DX9cNC.js} +23 -23
  244. package/dist/interface/ha/{SettingsNotifications-BF7ajNwE.js → SettingsNotifications-DI6ImggH.js} +6 -6
  245. package/dist/interface/ha/{SettingsPermissions-Jh0FuIF7.js → SettingsPermissions-BCDyCFcb.js} +2 -2
  246. package/dist/interface/ha/{SettingsRecordings-BTIdncxg.js → SettingsRecordings-Bq5NkJhd.js} +10 -10
  247. package/dist/interface/ha/{SettingsRemote-Cba4P1-O.js → SettingsRemote-CtncaPIA.js} +308 -308
  248. package/dist/interface/ha/{SettingsSystem-_Nnh2ZF5.js → SettingsSystem-BJXuA7xA.js} +11 -11
  249. package/dist/interface/ha/{SettingsUsers-BfHFoxJi.js → SettingsUsers-BF0rDluv.js} +91 -91
  250. package/dist/interface/ha/{Terminal-Dv_7oWmS.js → Terminal-kTCe2jP3.js} +11 -11
  251. package/dist/interface/ha/Training-BM2Xb8Ef.js +1754 -0
  252. package/dist/interface/ha/{Updates-BHl5H7zE.js → Updates-Cv1EY_T0.js} +6 -6
  253. package/dist/interface/ha/{VariableInput-DtLo7-Nw.js → VariableInput-BO2zZu4N.js} +1 -1
  254. package/dist/interface/ha/{VersionsHandler-CF0DSeol.js → VersionsHandler-CRnT9-K7.js} +10 -10
  255. package/dist/interface/ha/{VirtualSensorCreate-C907EgIz.js → VirtualSensorCreate-6dVRxPjw.js} +8 -8
  256. package/dist/interface/ha/{Workers-Dz1d9gEQ.js → Workers-MHia86lu.js} +97 -97
  257. package/dist/interface/ha/{api-DUqpDJ2N.js → api-CH_Y8Hee.js} +17459 -14633
  258. package/dist/interface/ha/{api-gId1nlMj.js → api-DylRa66V.js} +3 -3
  259. package/dist/interface/ha/{assistant-BaR65gIY.js → assistant-smRQYA6p.js} +53 -53
  260. package/dist/interface/ha/{auth-Btsz_KxO.js → auth-BXj5Fm6s.js} +38 -38
  261. package/dist/interface/ha/{automationBlueprint-CuO3iOiM.js → automationBlueprint-DGjftXFC.js} +4 -4
  262. package/dist/interface/ha/cameraui-cards.js +1 -1
  263. package/dist/interface/ha/{cards-DWhezIPP.js → cards-E0zw1UVg.js} +114 -113
  264. package/dist/interface/ha/{config-BKStpoEQ.js → config-dG_DA6XL.js} +16 -16
  265. package/dist/interface/ha/{dist-CM7R4_Gj.js → dist-BQf9ANPx.js} +77 -77
  266. package/dist/interface/ha/{dist-BIngHzHx.js → dist-euRmladF.js} +4 -4
  267. package/dist/interface/ha/{eventIcons-BFNUgeGr.js → eventLabels-B5GrM5jO.js} +291 -233
  268. package/dist/interface/ha/{intercomService-B7HkLs6z.js → intercomService-BtJ_zUNd.js} +250 -264
  269. package/dist/interface/ha/{mqtt-ajcSmTB-.js → mqtt-CP3vVkRJ.js} +12 -12
  270. package/dist/interface/ha/{notifications-Cf9dXHEO.js → notifications-CZNwSXTg.js} +22 -22
  271. package/dist/interface/ha/{pinia-DIKO5lnE.js → pinia-CVnHHb-s.js} +533 -501
  272. package/dist/interface/ha/{plugins-ml823dJV.js → plugins--eatOIaI.js} +66 -66
  273. package/dist/interface/ha/{protocol-BB4jdtUC-DW3jl2tV.js → protocol-BB4jdtUC-BhEwymva.js} +129 -48
  274. package/dist/interface/ha/{rooms-C5gUErBi.js → rooms-D5E6K75d.js} +8 -8
  275. package/dist/interface/ha/{server-dArenpJI.js → server-D1BqEY7i.js} +31 -31
  276. package/dist/interface/ha/{types-DYymuACA.js → types-CWogEoya.js} +36 -36
  277. package/dist/interface/ha/ungrouped-Ch4UX4dy.js +58 -0
  278. package/dist/interface/ha/{updates-D5sFzGtC.js → updates-B48Owi1w.js} +28 -28
  279. package/dist/interface/ha/{useAppVersion-C5x3Ap4_.js → useAppVersion-D95sKTJR.js} +2 -2
  280. package/dist/interface/ha/{useAssistantActions-S1FrNe9b.js → useAssistantActions-kDwiO-u5.js} +1 -1
  281. package/dist/interface/ha/{useKeyboardInset-Cj0T2AFX.js → useKeyboardInset-C2R51vsC.js} +1 -1
  282. package/dist/interface/ha/{useLogsSocket-DtvfQlPh.js → useLogsSocket-BzNWa2y2.js} +1 -1
  283. package/dist/interface/ha/{useNavLayout-HSFBA4JV.js → useNavLayout-228cwwqA.js} +19 -19
  284. package/dist/interface/ha/{usePermissions-DaE_wFch.js → usePermissions-CfA5x7Df.js} +1 -1
  285. package/dist/interface/ha/{useServerRestart-Ci0SppGW.js → useServerRestart-B0c40zs5.js} +1 -1
  286. package/dist/interface/ha/{useTabSwipe-CPKkRmaH.js → useTabSwipe-CfZg5hWj.js} +2 -2
  287. package/dist/interface/ha/{useUpdateChannel-CXHHovK3.js → useUpdateChannel-DQxI7FrD.js} +2 -2
  288. package/dist/interface/ha/{useUpdatesSocket-DVST2YXV.js → useUpdatesSocket-B8LqBBd3.js} +1 -1
  289. package/dist/interface/ha/{useUserOptions-BYcYI6QA.js → useUserOptions-dZf6ejlz.js} +1 -1
  290. package/dist/interface/ha/walk-CsSXaeJw.js +33 -0
  291. package/dist/interface/index.html +35 -36
  292. package/dist/interface/sw.js +1 -1
  293. package/dist/interface/workbox-5f52ac45.js +1 -0
  294. package/dist/server/package.json +11 -11
  295. package/dist/server/requirements.txt +2 -2
  296. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/__init__.py +22 -0
  297. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/config.py +4 -0
  298. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/__init__.py +10 -0
  299. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/contract.py +6 -0
  300. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/interfaces.py +92 -4
  301. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/__init__.py +16 -0
  302. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/base.py +4 -0
  303. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/face_embedder.py +1 -1
  304. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/object.py +3 -3
  305. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/person_embedder.py +65 -0
  306. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/segmenter.py +81 -0
  307. package/dist/server/src/api/database/index.d.ts +2 -1
  308. package/dist/server/src/api/database/index.js +31 -7
  309. package/dist/server/src/api/database/index.js.map +1 -1
  310. package/dist/server/src/api/database/migrations/v2-2-9.d.ts +3 -0
  311. package/dist/server/src/api/database/migrations/v2-2-9.js +28 -0
  312. package/dist/server/src/api/database/migrations/v2-2-9.js.map +1 -0
  313. package/dist/server/src/api/database/record-schemas.d.ts +1 -1
  314. package/dist/server/src/api/database/types.d.ts +17 -1
  315. package/dist/server/src/api/schemas/assistant.schema.d.ts +1 -1
  316. package/dist/server/src/api/schemas/cameras.schema.d.ts +140 -76
  317. package/dist/server/src/api/schemas/cameras.schema.js +4 -2
  318. package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
  319. package/dist/server/src/api/schemas/training.schema.d.ts +15 -3
  320. package/dist/server/src/api/schemas/training.schema.js +4 -1
  321. package/dist/server/src/api/schemas/training.schema.js.map +1 -1
  322. package/dist/server/src/api/websocket/nsp/worker-perf.js +2 -0
  323. package/dist/server/src/api/websocket/nsp/worker-perf.js.map +1 -1
  324. package/dist/server/src/api/websocket/types.d.ts +1 -0
  325. package/dist/server/src/assistant/search.d.ts +17 -0
  326. package/dist/server/src/assistant/search.js +10 -2
  327. package/dist/server/src/assistant/search.js.map +1 -1
  328. package/dist/server/src/assistant/tools/plugins.js +7 -3
  329. package/dist/server/src/assistant/tools/plugins.js.map +1 -1
  330. package/dist/server/src/assistant/types.d.ts +2 -0
  331. package/dist/server/src/automations/actions/plugin.js +5 -9
  332. package/dist/server/src/automations/actions/plugin.js.map +1 -1
  333. package/dist/server/src/automations/pluginMethodRegistry.d.ts +6 -0
  334. package/dist/server/src/automations/pluginMethodRegistry.js +39 -0
  335. package/dist/server/src/automations/pluginMethodRegistry.js.map +1 -1
  336. package/dist/server/src/automations/segment-picture.d.ts +16 -0
  337. package/dist/server/src/automations/segment-picture.js +152 -0
  338. package/dist/server/src/automations/segment-picture.js.map +1 -0
  339. package/dist/server/src/camera/decoder/detection-coordinator.d.ts +5 -2
  340. package/dist/server/src/camera/decoder/detection-coordinator.js +45 -22
  341. package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
  342. package/dist/server/src/camera/decoder/detection-pipeline.d.ts +30 -2
  343. package/dist/server/src/camera/decoder/detection-pipeline.js +81 -21
  344. package/dist/server/src/camera/decoder/detection-pipeline.js.map +1 -1
  345. package/dist/server/src/camera/decoder/event-manager.d.ts +12 -2
  346. package/dist/server/src/camera/decoder/event-manager.js +77 -75
  347. package/dist/server/src/camera/decoder/event-manager.js.map +1 -1
  348. package/dist/server/src/camera/decoder/event-trace.d.ts +41 -1
  349. package/dist/server/src/camera/decoder/event-trace.js +63 -8
  350. package/dist/server/src/camera/decoder/event-trace.js.map +1 -1
  351. package/dist/server/src/camera/decoder/face-tracks.d.ts +26 -0
  352. package/dist/server/src/camera/decoder/face-tracks.js +199 -0
  353. package/dist/server/src/camera/decoder/face-tracks.js.map +1 -0
  354. package/dist/server/src/camera/decoder/frame-scaler.d.ts +3 -1
  355. package/dist/server/src/camera/decoder/frame-scaler.js +36 -8
  356. package/dist/server/src/camera/decoder/frame-scaler.js.map +1 -1
  357. package/dist/server/src/camera/decoder/nvr-sink.d.ts +6 -0
  358. package/dist/server/src/camera/decoder/nvr-sink.js +1 -1
  359. package/dist/server/src/camera/decoder/nvr-sink.js.map +1 -1
  360. package/dist/server/src/camera/decoder/perf-tracker.d.ts +2 -0
  361. package/dist/server/src/camera/decoder/perf-tracker.js +4 -0
  362. package/dist/server/src/camera/decoder/perf-tracker.js.map +1 -1
  363. package/dist/server/src/camera/decoder/ptz/autotracker.d.ts +6 -1
  364. package/dist/server/src/camera/decoder/ptz/autotracker.js +107 -25
  365. package/dist/server/src/camera/decoder/ptz/autotracker.js.map +1 -1
  366. package/dist/server/src/camera/decoder/secondary-stage.d.ts +10 -8
  367. package/dist/server/src/camera/decoder/secondary-stage.js +145 -125
  368. package/dist/server/src/camera/decoder/secondary-stage.js.map +1 -1
  369. package/dist/server/src/camera/decoder/training-sink.d.ts +5 -2
  370. package/dist/server/src/camera/decoder/training-sink.js +30 -6
  371. package/dist/server/src/camera/decoder/training-sink.js.map +1 -1
  372. package/dist/server/src/camera/decoder/types.d.ts +6 -2
  373. package/dist/server/src/camera/decoder/types.js +4 -2
  374. package/dist/server/src/camera/decoder/types.js.map +1 -1
  375. package/dist/server/src/manager/trainingCandidateManager.d.ts +2 -1
  376. package/dist/server/src/manager/trainingCandidateManager.js +25 -3
  377. package/dist/server/src/manager/trainingCandidateManager.js.map +1 -1
  378. package/dist/server/src/manager/trainingSubmission.d.ts +5 -0
  379. package/dist/server/src/manager/trainingSubmission.js +73 -0
  380. package/dist/server/src/manager/trainingSubmission.js.map +1 -0
  381. package/dist/server/src/manager/types.d.ts +8 -2
  382. package/dist/server/src/manager/types.js.map +1 -1
  383. package/dist/server/src/plugins/runtime/python/proxy/sensor.py +2 -0
  384. package/dist/server/src/remote/api/routes/train.d.ts +44 -3
  385. package/dist/server/src/remote/api/routes/train.js +2 -2
  386. package/dist/server/src/remote/api/routes/train.js.map +1 -1
  387. package/dist/server/src/rpc/interfaces/core.d.ts +6 -2
  388. package/dist/server/src/rpc/interfaces/detection.d.ts +20 -3
  389. package/dist/server/src/rpc/server.d.ts +2 -0
  390. package/dist/server/src/rpc/server.js +8 -5
  391. package/dist/server/src/rpc/server.js.map +1 -1
  392. package/dist/server/src/sensors/registry.d.ts +1 -0
  393. package/dist/server/src/sensors/registry.js +20 -11
  394. package/dist/server/src/sensors/registry.js.map +1 -1
  395. package/dist/server/src/sensors/types.d.ts +1 -0
  396. package/dist/server/src/sensors/types.js +3 -0
  397. package/dist/server/src/sensors/types.js.map +1 -1
  398. package/dist/server/src/services/config/index.d.ts +1 -0
  399. package/dist/server/src/services/config/index.js +2 -0
  400. package/dist/server/src/services/config/index.js.map +1 -1
  401. package/dist/server/src/utils/image.d.ts +6 -0
  402. package/dist/server/src/utils/image.js +58 -22
  403. package/dist/server/src/utils/image.js.map +1 -1
  404. package/npm-shrinkwrap.json +115 -74
  405. package/package.json +11 -11
  406. package/dist/interface/assets/About-DBOS1rfw.js +0 -1
  407. package/dist/interface/assets/Assistant-BQ6Ld-bt.css +0 -1
  408. package/dist/interface/assets/Assistant-BRcHj8hq.js +0 -1
  409. package/dist/interface/assets/Automation-C0Emde7z.js +0 -3
  410. package/dist/interface/assets/AutomationStore-C2G0Bk8c.js +0 -2
  411. package/dist/interface/assets/Automations-D-vfqRnZ.js +0 -2
  412. package/dist/interface/assets/Camera-BpurrgAr.js +0 -2
  413. package/dist/interface/assets/Camera-D0B7yyVD.css +0 -1
  414. package/dist/interface/assets/Camview-IbOVRx20.js +0 -1
  415. package/dist/interface/assets/ConfigActionCameraControl-Bw_egtpP.js +0 -1
  416. package/dist/interface/assets/ConfigActionSensor-BErRRYfl.js +0 -1
  417. package/dist/interface/assets/Console-oCuuVKET.js +0 -1
  418. package/dist/interface/assets/CuiAssistantConversation-Bsyxau9v.js +0 -5
  419. package/dist/interface/assets/CuiAutomationRunsDialog-sRh_K6JI.js +0 -1
  420. package/dist/interface/assets/CuiBottomSheet-DWoSHzC7.js +0 -1
  421. package/dist/interface/assets/CuiCameraPipCard-D6REm8uT.js +0 -1
  422. package/dist/interface/assets/CuiCameraRecordings-C2tvrbbw.js +0 -1
  423. package/dist/interface/assets/CuiCameraShares-jrrUEHoZ.js +0 -1
  424. package/dist/interface/assets/CuiCameraTable-BOzTWLwd.js +0 -1
  425. package/dist/interface/assets/CuiChartTable-BYrIX7LV.js +0 -1
  426. package/dist/interface/assets/CuiLightControl-DitIWqUr.js +0 -1
  427. package/dist/interface/assets/CuiList-BewTNr2X.js +0 -1
  428. package/dist/interface/assets/CuiPluginCard-Bd2HFduI.js +0 -2
  429. package/dist/interface/assets/CuiPluginCategoryChip-DlzOwRgc.js +0 -1
  430. package/dist/interface/assets/CuiSchema-BL0QZmP2.js +0 -1
  431. package/dist/interface/assets/CuiTopNavbarItem-Ti2TueU1.js +0 -1
  432. package/dist/interface/assets/Faces-DARrGLXf.js +0 -1
  433. package/dist/interface/assets/FirstSteps-DBYPBvGr.js +0 -1
  434. package/dist/interface/assets/Floorplan-BaZvzoyv.js +0 -1
  435. package/dist/interface/assets/Instances-r0xReURi.js +0 -1
  436. package/dist/interface/assets/Menu-C34RRyLd.js +0 -1
  437. package/dist/interface/assets/Metrics-BjoC71_O.js +0 -12
  438. package/dist/interface/assets/Metrics-DsHBab6t.css +0 -1
  439. package/dist/interface/assets/OAuthDeviceFlow-CdZxelf2.js +0 -1
  440. package/dist/interface/assets/Plugin-Qr_Q_Qfi.css +0 -1
  441. package/dist/interface/assets/Plugin-npx7CnwV.js +0 -1
  442. package/dist/interface/assets/PluginDetail-nwTrJmO6.js +0 -2
  443. package/dist/interface/assets/PluginSearch-CP2kQWKf.js +0 -1
  444. package/dist/interface/assets/PluginSearch-WEvbKMRs.js +0 -2
  445. package/dist/interface/assets/RecentEventsFilter-D5VSH2K1.js +0 -1
  446. package/dist/interface/assets/Recordings-BEKAn6QK.css +0 -1
  447. package/dist/interface/assets/Recordings-De6Zcv0M.js +0 -1
  448. package/dist/interface/assets/SensorEdit-SD_oHBRo.js +0 -1
  449. package/dist/interface/assets/SensorHistory-SxiLOloa.js +0 -1
  450. package/dist/interface/assets/Sensors-Djl64M-W.js +0 -2
  451. package/dist/interface/assets/Settings-CAf2reGs.js +0 -1
  452. package/dist/interface/assets/SettingsAccount-BGj5Ni91.js +0 -1
  453. package/dist/interface/assets/SettingsAccount-Dy6WC8ql.js +0 -1
  454. package/dist/interface/assets/SettingsAppearance-BGFhMlRk.js +0 -1
  455. package/dist/interface/assets/SettingsAppearance-DQzQmVzE.js +0 -1
  456. package/dist/interface/assets/SettingsAssistant-BwYVyuN3.js +0 -1
  457. package/dist/interface/assets/SettingsBackup-CVExGnOo.js +0 -1
  458. package/dist/interface/assets/SettingsList-vo7sz_MY.js +0 -1
  459. package/dist/interface/assets/SettingsMqtt-B1CuOcML.js +0 -1
  460. package/dist/interface/assets/SettingsNotifications-CCQ6eiq8.js +0 -1
  461. package/dist/interface/assets/SettingsPermissions-BlOf6HEy.js +0 -1
  462. package/dist/interface/assets/SettingsRecordings-7tTBg6m1.js +0 -1
  463. package/dist/interface/assets/SettingsRemote-DBgKmIdv.js +0 -2
  464. package/dist/interface/assets/SettingsSystem-DaFMsZpN.js +0 -2
  465. package/dist/interface/assets/SettingsUsers-DXACwVPi.js +0 -1
  466. package/dist/interface/assets/Terminal-DtGqlHbk.js +0 -4
  467. package/dist/interface/assets/Training-C-ToeAl4.css +0 -1
  468. package/dist/interface/assets/Training-Ca11D1Vj.js +0 -1
  469. package/dist/interface/assets/Updates-yenwuqnD.js +0 -2
  470. package/dist/interface/assets/Workers-Dyo44zxe.js +0 -2
  471. package/dist/interface/assets/api-CHQlxVtZ.css +0 -2
  472. package/dist/interface/assets/api-CLazgL-g.js +0 -4
  473. package/dist/interface/assets/cloudHandoff-zJCrDmwk.js +0 -1
  474. package/dist/interface/assets/eventIcons-C3JWChgS.js +0 -1
  475. package/dist/interface/assets/eventLabels-BsPoPWS9.js +0 -1
  476. package/dist/interface/assets/main-CGY9cVyi.css +0 -1
  477. package/dist/interface/assets/main-DkHV6YgB.js +0 -3
  478. package/dist/interface/assets/mqtt-DE2VbNdt.js +0 -1
  479. package/dist/interface/assets/sensorIcons-BntiOPX7.js +0 -1
  480. package/dist/interface/assets/types-B4LLKzDW.js +0 -1
  481. package/dist/interface/assets/types-a7Nw-P-m.js +0 -1
  482. package/dist/interface/assets/ungrouped-BoAbb9w3.js +0 -1
  483. package/dist/interface/assets/ungrouped-ChmBvcXp.css +0 -1
  484. package/dist/interface/assets/useBackupRestore-Biqn_lhh.js +0 -1
  485. package/dist/interface/assets/vendor-cameraui-GmMRyJ2R.js +0 -2326
  486. package/dist/interface/assets/vendor-core-BeAannbA.js +0 -1
  487. package/dist/interface/ha/Camera-sH9fRv18.js +0 -670
  488. package/dist/interface/ha/Faces-CsM5VO8Q.js +0 -1441
  489. package/dist/interface/ha/Recordings-B1XsJrzs.js +0 -1539
  490. package/dist/interface/ha/Training-CaSFA5oH.js +0 -1699
  491. package/dist/interface/ha/eventLabels-B4C1_4vT.js +0 -42
  492. package/dist/interface/ha/ungrouped-BHLAySWP.js +0 -1312
  493. package/dist/interface/workbox-778a14ff.js +0 -1
@@ -0,0 +1,1836 @@
1
+ import { m as e, p as t } from "./ripple-ZDATPc2w.js";
2
+ import { D as n, G as r, H as i, I as a, Jt as o, U as s, Wt as c, Y as l, _t as u, d, f, gt as p, kt as m, l as h, lt as g, o as _, ot as v, p as y, qt as b, r as x, rt as S, st as C, u as w, ut as T, v as ee, wt as E, x as D, xt as O, y as k, yt as A, z as te } from "./runtime-core.esm-bundler-_TfE0DWz.js";
3
+ import { t as j } from "./tooltip-BDrlgLof.js";
4
+ import { t as M } from "./message-D6dIy_hz.js";
5
+ import { t as N } from "./tag-mchuCAPR.js";
6
+ import { $ as P, An as ne, Ar as F, B as I, Ci as L, Cr as R, Ei as z, En as re, Fr as ie, H as B, Hn as ae, J as V, Kn as oe, Mn as H, Mr as se, Nn as ce, Nr as le, Or as U, Pn as ue, Pr as de, R as W, U as fe, Un as pe, V as me, Wn as he, Xr as ge, Z as _e, Zn as ve, bi as ye, bn as be, cr as xe, er as Se, et as Ce, g as we, ga as G, hn as Te, it as Ee, jn as De, jr as Oe, nn as ke, nr as Ae, q as je, rr as Me, sr as Ne, tn as Pe, tr as Fe, tt as Ie, wr as Le, xn as Re, yn as ze, yr as Be, z as Ve } from "./api-CH_Y8Hee.js";
7
+ import { B as He, I as Ue, M as We } from "./protocol-BB4jdtUC-BhEwymva.js";
8
+ import { h as Ge, u as K } from "./intercomService-BtJ_zUNd.js";
9
+ import { n as Ke } from "./vue-i18n-D5EAy78K.js";
10
+ import { C as qe, _ as Je, g as Ye } from "./dist-euRmladF.js";
11
+ import { i as Xe } from "./alert-outline-FcLLjoOK.js";
12
+ import { a as Ze, c as Qe, n as $e, o as et, s as tt, t as q } from "./eventLabels-B5GrM5jO.js";
13
+ import { t as nt } from "./button-BouAFgf5.js";
14
+ import { M as rt } from "./dist-BQf9ANPx.js";
15
+ import { t as it } from "./inputtext-C_ygnPrC.js";
16
+ import { t as at } from "./checkbox-CAKzZcqk.js";
17
+ import { t as ot } from "./datepicker-DXk97lTw.js";
18
+ import { t as J } from "./select-DV7p2EDj.js";
19
+ import { t as st } from "./close-CxFbonhd.js";
20
+ import { t as ct } from "./progressbar-CaUaM8Bt.js";
21
+ import { t as Y } from "./multiselect-BOb4ScAZ.js";
22
+ import { t as lt } from "./textarea-ByXnzJzx.js";
23
+ import { s as ut, t as dt } from "./assistant-smRQYA6p.js";
24
+ import { n as ft, r as pt, t as mt } from "./ungrouped-Ch4UX4dy.js";
25
+ import { t as ht } from "./utils-DYtBrGDz.js";
26
+ import { t as gt } from "./settings-lWJfHaif.js";
27
+ import { t as _t } from "./database-refresh-outline-PiqlCkA7.js";
28
+ import { n as vt, t as yt } from "./round-alt-arrow-left-bold-DDy2dLUM.js";
29
+ //#region ~icons/tabler/photo-search
30
+ var bt = {
31
+ viewBox: "0 0 24 24",
32
+ width: "1.2em",
33
+ height: "1.2em"
34
+ };
35
+ function X(e, t) {
36
+ return i(), y("svg", bt, [...t[0] ||= [w("g", {
37
+ fill: "none",
38
+ stroke: "currentColor",
39
+ "stroke-linecap": "round",
40
+ "stroke-linejoin": "round",
41
+ "stroke-width": "2"
42
+ }, [w("path", { d: "M15 8h.01M11.5 21H6a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v5.5" }), w("path", { d: "M15 18a3 3 0 1 0 6 0a3 3 0 1 0-6 0m5.2 2.2L22 22M3 16l5-5c.928-.893 2.072-.893 3 0l2 2" })], -1)]]);
43
+ }
44
+ var xt = u({
45
+ name: "tabler-photo-search",
46
+ render: X
47
+ }), Z = { class: "flex flex-col gap-4" }, St = { class: "text-sm text-pretty" }, Ct = {
48
+ key: 0,
49
+ class: "flex flex-col gap-2"
50
+ }, wt = {
51
+ key: 0,
52
+ class: "flex justify-between text-sm text-muted"
53
+ }, Tt = { key: 0 }, Et = /* @__PURE__ */ D({
54
+ __name: "ClipReindex",
55
+ setup(e, { expose: t }) {
56
+ let r = n("dialogRefProps"), { t: a } = Ke(), { status: s, isBusy: c, checking: l, refresh: u, start: d, cancel: p } = pe(), g = O(!1), _ = O(!1), b = O(0), x = h(() => s.value?.running === !0), S = h(() => {
57
+ if (_.value) {
58
+ if (!s.value?.total) return a("views.recordings.reindex.up_to_date");
59
+ let { done: e, total: t, skipped: n } = s.value;
60
+ return n ? a("views.recordings.reindex.result_failed", {
61
+ done: e,
62
+ total: t,
63
+ skipped: n
64
+ }) : a("views.recordings.reindex.result", {
65
+ done: e,
66
+ total: t
67
+ });
68
+ }
69
+ return l.value ? a("views.recordings.reindex.checking") : x.value ? a("views.recordings.reindex.running_intro") : a("views.recordings.reindex.intro");
70
+ }), T = h(() => {
71
+ if (_.value) return b.value;
72
+ let e = s.value?.total ?? 0;
73
+ return e <= 0 ? 0 : Math.min(100, Math.round(((s.value?.done ?? 0) + (s.value?.skipped ?? 0)) / e * 100));
74
+ });
75
+ async function ee() {
76
+ return x.value ? p() : (g.value = !0, d()), null;
77
+ }
78
+ return v(x, (e, t) => {
79
+ t && !e && g.value && (_.value = !0, b.value = s.value?.total ? 100 : 0, s.value?.total || requestAnimationFrame(() => b.value = 100));
80
+ }), C(() => {
81
+ r.hideConfirmButton && (r.hideConfirmButton.value = _.value), r.confirmText && (r.confirmText.value = x.value ? a("views.recordings.reindex.stop") : a("views.recordings.reindex.start")), r.confirmButtonProps && (r.confirmButtonProps.value = x.value ? { severity: "danger" } : {}), r.disabled && (r.disabled.value = c.value);
82
+ }), te(() => {
83
+ s.value?.running && (g.value = !0), u().then(() => {
84
+ s.value?.running && (g.value = !0);
85
+ });
86
+ }), t({ onConfirm: ee }), (e, t) => {
87
+ let n = ct;
88
+ return i(), y("div", Z, [w("span", St, o(m(S)), 1), m(g) || m(x) ? (i(), y("div", Ct, [k(n, {
89
+ mode: m(l) ? "indeterminate" : "determinate",
90
+ value: m(T),
91
+ "show-value": !1,
92
+ class: "h-2"
93
+ }, null, 8, ["mode", "value"]), m(x) && !m(l) ? (i(), y("div", wt, [w("span", null, o(e.$t("views.recordings.reindex.progress", {
94
+ done: m(s)?.done ?? 0,
95
+ total: m(s)?.total ?? 0
96
+ })), 1), m(s)?.skipped ? (i(), y("span", Tt, o(e.$t("views.recordings.reindex.skipped", { count: m(s).skipped })), 1)) : f("", !0)])) : f("", !0)])) : f("", !0)]);
97
+ };
98
+ }
99
+ }), Dt = {
100
+ viewBox: "0 0 24 24",
101
+ width: "1.2em",
102
+ height: "1.2em"
103
+ };
104
+ function Ot(e, t) {
105
+ return i(), y("svg", Dt, [...t[0] ||= [w("path", {
106
+ fill: "currentColor",
107
+ d: "m14 2l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zm4 18V9h-5V4H6v16zm-2-2l-2.5-1.7V18H8v-5h5.5v1.7L16 13z"
108
+ }, null, -1)]]);
109
+ }
110
+ var kt = u({
111
+ name: "mdi-file-video-outline",
112
+ render: Ot
113
+ }), At = { class: "flex flex-col gap-6" }, jt = { class: "flex flex-col field-gap" }, Mt = { class: "cui-label" }, Q = { class: "flex flex-col field-gap" }, Nt = { class: "cui-label" }, Pt = { class: "grid grid-cols-1 xs:grid-cols-2 gap-3" }, Ft = { class: "flex flex-col gap-1" }, It = { class: "text-xs text-muted" }, Lt = { class: "flex flex-col gap-1" }, Rt = { class: "text-xs text-muted" }, zt = { class: "grid grid-cols-1 xs:grid-cols-2 gap-x-6 gap-y-4" }, Bt = { class: "flex flex-col field-gap" }, Vt = { class: "cui-label" }, Ht = { class: "flex flex-col field-gap" }, Ut = { class: "cui-label" }, Wt = { class: "flex flex-col field-gap" }, Gt = { class: "flex items-center gap-3" }, Kt = { class: "cui-label !mb-0" }, qt = {
114
+ key: 0,
115
+ class: "ml-auto flex items-center gap-2.5 text-sm tabular-nums"
116
+ }, Jt = { class: "font-semibold" }, Yt = { class: "font-semibold" }, Xt = { class: "border border-color rounded-xl card-background overflow-hidden" }, $ = { class: "flex flex-col gap-3 max-h-[240px] overflow-y-auto p-2.5" }, Zt = {
117
+ key: 0,
118
+ class: "flex items-center justify-center gap-2 text-muted text-sm py-6"
119
+ }, Qt = {
120
+ key: 1,
121
+ class: "text-center text-muted text-sm py-6"
122
+ }, $t = { class: "text-xs text-muted px-0.5" }, en = { class: "font-mono text-xs truncate flex-1" }, tn = { class: "text-xs text-muted tabular-nums shrink-0" }, nn = { class: "font-mono text-xs text-muted tabular-nums shrink-0 min-w-[58px] text-right" }, rn = 30, an = /* @__PURE__ */ D({
123
+ __name: "ExportRecordings",
124
+ props: {
125
+ cameras: {},
126
+ preselect: {}
127
+ },
128
+ setup(e, { expose: t }) {
129
+ let a = e, { t: s } = Ke(), c = z(), l = n("dialogRefProps"), { plugin: u } = rt("@camera.ui/camera-ui-nvr"), _ = O([]), v = O(!1), b = O(a.preselect?.length ? [...a.preselect] : []), S = O("best"), T = O(0), E = O(new Date((/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0))), D = O(/* @__PURE__ */ new Date()), A = h(() => [{
130
+ label: s("views.recordings.export.quality_best"),
131
+ value: "best"
132
+ }, {
133
+ label: s("views.recordings.export.quality_smallest"),
134
+ value: "smallest"
135
+ }]), te = h(() => [
136
+ 0,
137
+ 1,
138
+ 2,
139
+ 5,
140
+ 10,
141
+ 30,
142
+ 60,
143
+ 120,
144
+ 180,
145
+ 240,
146
+ 300
147
+ ].map((e) => ({
148
+ label: e === 0 ? s("views.recordings.export.timelapse_off") : e < 60 ? `${e} s` : `${e / 60} min`,
149
+ value: e
150
+ }))), j = h(() => T.value > 0), P = h(() => j.value ? "~" : ""), ne = h(() => new Map(a.cameras.map((e) => [e.id, e.name]))), F = h(() => E.value instanceof Date && D.value instanceof Date && E.value < D.value), I = h(() => {
151
+ if (!F.value) return [];
152
+ let e = [], t = E.value.getTime(), n = D.value.getTime(), r = new Date(E.value);
153
+ r.setHours(0, 0, 0, 0);
154
+ let i = new Date(D.value);
155
+ for (i.setHours(0, 0, 0, 0); r.getTime() <= i.getTime();) {
156
+ let i = new Date(r), a = new Date(r);
157
+ a.setDate(a.getDate() + 1);
158
+ let o = Math.max(i.getTime(), t), s = Math.min(a.getTime(), n);
159
+ s > o && e.push({
160
+ day: ae(i),
161
+ startUs: o * 1e3,
162
+ endUs: s * 1e3
163
+ }), r.setDate(r.getDate() + 1);
164
+ }
165
+ return e;
166
+ }), L = h(() => _.value.map((e) => {
167
+ let t = ne.value.get(e.cameraId) ?? e.cameraId, n = /* @__PURE__ */ new Date(e.startUs / 1e3), r = /* @__PURE__ */ new Date(e.endUs / 1e3), i = n.getHours() === 0 && n.getMinutes() === 0 && e.endUs - e.startUs === 864e8, a = r.getHours() === 0 && r.getMinutes() === 0 ? "24:00" : V(r);
168
+ return {
169
+ cameraId: e.cameraId,
170
+ cameraName: t,
171
+ name: `${oe(t)}_${e.day}${j.value ? "_timelapse" : ""}.mp4`,
172
+ span: i ? s("views.recordings.export.whole_day") : `${V(n)}–${a}`,
173
+ bytes: j.value ? e.bytes / rn : e.bytes
174
+ };
175
+ })), R = h(() => {
176
+ let e = /* @__PURE__ */ new Map();
177
+ for (let t of L.value) {
178
+ let n = e.get(t.cameraId);
179
+ n || (n = {
180
+ cameraId: t.cameraId,
181
+ cameraName: t.cameraName,
182
+ files: [],
183
+ bytes: 0
184
+ }, e.set(t.cameraId, n)), n.files.push(t), n.bytes += t.bytes;
185
+ }
186
+ return [...e.values()];
187
+ }), re = h(() => L.value.reduce((e, t) => e + t.bytes, 0)), ie = h(() => b.value.length === 0 ? s("views.recordings.export.no_cameras") : F.value ? s("views.recordings.export.no_footage") : s("views.recordings.export.no_range"));
188
+ function B(e) {
189
+ return String(e).padStart(2, "0");
190
+ }
191
+ function ae(e) {
192
+ return `${e.getFullYear()}-${B(e.getMonth() + 1)}-${B(e.getDate())}`;
193
+ }
194
+ function V(e) {
195
+ return `${B(e.getHours())}:${B(e.getMinutes())}`;
196
+ }
197
+ function oe(e) {
198
+ return e.replace(/[^a-zA-Z0-9-_]/g, "_");
199
+ }
200
+ function H(e) {
201
+ if (e <= 0) return "0 MB";
202
+ let t = e / 1e6;
203
+ if (t < 1e3) return `${t < 10 ? t.toFixed(1) : Math.round(t)} MB`;
204
+ let n = e / 1e9;
205
+ return `${n.toFixed(+(n < 10))} GB`;
206
+ }
207
+ async function se() {
208
+ let e = u.value;
209
+ if (!e?.nvrExportEstimate || b.value.length === 0 || I.value.length === 0) {
210
+ _.value = [], v.value = !1;
211
+ return;
212
+ }
213
+ v.value = !0;
214
+ try {
215
+ let t = await e.nvrExportEstimate({
216
+ cameras: b.value,
217
+ slices: I.value,
218
+ quality: S.value
219
+ });
220
+ _.value = t.files ?? [];
221
+ } catch {
222
+ _.value = [];
223
+ } finally {
224
+ v.value = !1;
225
+ }
226
+ }
227
+ async function ce() {
228
+ if (!F.value || b.value.length === 0 || I.value.length === 0) return null;
229
+ let e = u.value;
230
+ if (!e?.nvrExportBatch) return c.add({
231
+ severity: "error",
232
+ detail: s("views.recordings.export.plugin_missing"),
233
+ life: 3e3
234
+ }), null;
235
+ let t = await e.nvrExportBatch({
236
+ cameras: b.value,
237
+ slices: I.value,
238
+ quality: S.value,
239
+ timelapseIntervalSec: j.value ? T.value : 0
240
+ });
241
+ await Le({
242
+ url: t.url,
243
+ filename: t.filename
244
+ });
245
+ }
246
+ return He([
247
+ b,
248
+ I,
249
+ S
250
+ ], se, {
251
+ debounce: 350,
252
+ immediate: !0,
253
+ deep: !0
254
+ }), C(() => {
255
+ l.disabled && (l.disabled.value = !F.value || b.value.length === 0 || !v.value && L.value.length === 0);
256
+ }), t({ onConfirm: ce }), (t, n) => {
257
+ let a = Y, s = ot, c = M, l = xe, u = J, h = N, _ = U, C = kt;
258
+ return i(), y("div", At, [
259
+ w("div", jt, [w("label", Mt, o(t.$t("views.recordings.export.cameras")), 1), k(a, {
260
+ modelValue: m(b),
261
+ "onUpdate:modelValue": n[0] ||= (e) => p(b) ? b.value = e : null,
262
+ options: e.cameras,
263
+ "option-label": "name",
264
+ "option-value": "id",
265
+ display: "chip",
266
+ filter: "",
267
+ placeholder: t.$t("views.recordings.export.cameras_placeholder"),
268
+ class: "w-full"
269
+ }, null, 8, [
270
+ "modelValue",
271
+ "options",
272
+ "placeholder"
273
+ ])]),
274
+ w("div", Q, [
275
+ w("label", Nt, o(t.$t("views.recordings.export.range")), 1),
276
+ w("div", Pt, [w("div", Ft, [w("span", It, o(t.$t("views.recordings.export.from")), 1), k(s, {
277
+ modelValue: m(E),
278
+ "onUpdate:modelValue": n[1] ||= (e) => p(E) ? E.value = e : null,
279
+ "show-time": "",
280
+ "hour-format": "24",
281
+ fluid: "",
282
+ "max-date": m(D)
283
+ }, null, 8, ["modelValue", "max-date"])]), w("div", Lt, [w("span", Rt, o(t.$t("views.recordings.export.to")), 1), k(s, {
284
+ modelValue: m(D),
285
+ "onUpdate:modelValue": n[2] ||= (e) => p(D) ? D.value = e : null,
286
+ "show-time": "",
287
+ "hour-format": "24",
288
+ fluid: "",
289
+ "min-date": m(E)
290
+ }, null, 8, ["modelValue", "min-date"])])]),
291
+ m(F) ? (i(), d(c, {
292
+ key: 1,
293
+ severity: "secondary",
294
+ variant: "simple",
295
+ size: "small",
296
+ class: "cui-input-hint"
297
+ }, {
298
+ default: g(() => [ee(o(t.$t("views.recordings.export.range_hint")), 1)]),
299
+ _: 1
300
+ })) : (i(), d(c, {
301
+ key: 0,
302
+ severity: "error",
303
+ variant: "simple",
304
+ size: "small",
305
+ class: "cui-input-hint"
306
+ }, {
307
+ default: g(() => [ee(o(t.$t("views.recordings.export.invalid_range")), 1)]),
308
+ _: 1
309
+ }))
310
+ ]),
311
+ w("div", zt, [w("div", Bt, [w("label", Vt, o(t.$t("views.recordings.export.quality")), 1), k(l, {
312
+ modelValue: m(S),
313
+ "onUpdate:modelValue": n[3] ||= (e) => p(S) ? S.value = e : null,
314
+ options: m(A),
315
+ "option-label": "label",
316
+ "option-value": "value",
317
+ "allow-empty": !1,
318
+ pt: {
319
+ root: { class: "flex w-full" },
320
+ pcToggleButton: { root: { class: "flex-1" } }
321
+ }
322
+ }, null, 8, ["modelValue", "options"])]), w("div", Ht, [w("label", Ut, o(t.$t("views.recordings.export.timelapse")), 1), k(u, {
323
+ modelValue: m(T),
324
+ "onUpdate:modelValue": n[4] ||= (e) => p(T) ? T.value = e : null,
325
+ options: m(te),
326
+ "option-label": "label",
327
+ "option-value": "value",
328
+ class: "w-full"
329
+ }, null, 8, ["modelValue", "options"])])]),
330
+ w("div", Wt, [w("div", Gt, [w("label", Kt, o(t.$t("views.recordings.export.result")), 1), m(L).length ? (i(), y("div", qt, [
331
+ w("span", Jt, o(m(L).length) + " " + o(m(L).length === 1 ? t.$t("views.recordings.export.file") : t.$t("views.recordings.export.files")), 1),
332
+ n[5] ||= w("span", { class: "text-muted" }, "·", -1),
333
+ w("span", Yt, o(m(P)) + o(H(m(re))), 1),
334
+ k(h, {
335
+ value: m(L).length === 1 ? "MP4" : "ZIP",
336
+ severity: "info"
337
+ }, null, 8, ["value"])
338
+ ])) : f("", !0)]), w("div", Xt, [w("div", $, [m(v) && !m(L).length ? (i(), y("div", Zt, [k(_, {
339
+ style: {
340
+ width: "1rem",
341
+ height: "1rem"
342
+ },
343
+ "stroke-width": "4",
344
+ class: "m-0"
345
+ }), w("span", null, o(t.$t("views.recordings.export.estimating")), 1)])) : m(L).length ? (i(!0), y(x, { key: 2 }, r(m(R), (e) => (i(), y("div", {
346
+ key: e.cameraId,
347
+ class: "flex flex-col gap-1"
348
+ }, [w("span", $t, o(e.cameraName) + " · " + o(e.files.length) + " · " + o(m(P)) + o(H(e.bytes)), 1), (i(!0), y(x, null, r(e.files, (e) => (i(), y("div", {
349
+ key: e.name,
350
+ class: "flex items-center gap-3 card-inner-background border border-color rounded-lg px-3 py-2"
351
+ }, [
352
+ k(C, { class: "w-4 h-4 text-muted shrink-0" }),
353
+ w("span", en, o(e.name), 1),
354
+ w("span", tn, o(e.span), 1),
355
+ w("span", nn, o(m(P)) + o(H(e.bytes)), 1)
356
+ ]))), 128))]))), 128)) : (i(), y("div", Qt, o(m(ie)), 1))])])])
357
+ ]);
358
+ };
359
+ }
360
+ }), on = [
361
+ "object",
362
+ "objectAssist",
363
+ "face",
364
+ "faceEmbedder",
365
+ "personEmbedder",
366
+ "licensePlate",
367
+ "clip",
368
+ "segmenter"
369
+ ], sn = { class: "flex flex-col items-center gap-3" }, cn = {
370
+ key: 0,
371
+ class: "relative max-w-full overflow-hidden rounded-md"
372
+ }, ln = ["src"], un = {
373
+ key: 1,
374
+ class: "text-sm text-muted text-center"
375
+ }, dn = /* @__PURE__ */ D({
376
+ __name: "SimilarImageSearch",
377
+ props: { image: {} },
378
+ setup(e, { expose: t }) {
379
+ let r = new Te(), s = e, { t: c } = Ke(), l = n("dialogRef"), { openSimilarSearch: u } = Ce(), { data: d, isLoading: p } = r.getCamerasQuery({
380
+ page: 1,
381
+ pageSize: -1
382
+ }), g = URL.createObjectURL(s.image), _ = h(() => {
383
+ let e, t = 0;
384
+ for (let n of d.value?.result ?? []) {
385
+ let r = n.assignments ?? {};
386
+ if (n.disabled || !(r.object || r.objectAssist)) continue;
387
+ let i = on.filter((e) => r[e]).length;
388
+ i > t && (e = n, t = i);
389
+ }
390
+ return e;
391
+ });
392
+ async function v(e) {
393
+ let t = await Ee(s.image, e.box, e.mask);
394
+ l.value.close(), u({
395
+ query: e.query,
396
+ objectLabel: e.label,
397
+ crop: t
398
+ });
399
+ }
400
+ return a(() => URL.revokeObjectURL(g)), t({}), (t, n) => {
401
+ let r = ke;
402
+ return i(), y("div", sn, [m(_) ? (i(), y("div", cn, [w("img", {
403
+ src: m(g),
404
+ alt: "",
405
+ class: "block max-w-full max-h-[65vh]"
406
+ }, null, 8, ln), k(r, {
407
+ camera: m(_),
408
+ frame: e.image,
409
+ onPick: v,
410
+ onClose: n[0] ||= (e) => m(l).close()
411
+ }, null, 8, ["camera", "frame"])])) : m(p) ? f("", !0) : (i(), y("p", un, o(m(c)("components.similar.image_no_camera")), 1))]);
412
+ };
413
+ }
414
+ }), fn = {
415
+ viewBox: "0 0 24 24",
416
+ width: "1.2em",
417
+ height: "1.2em"
418
+ };
419
+ function pn(e, t) {
420
+ return i(), y("svg", fn, [...t[0] ||= [w("path", {
421
+ fill: "none",
422
+ stroke: "currentColor",
423
+ "stroke-linecap": "round",
424
+ "stroke-linejoin": "round",
425
+ "stroke-width": "2",
426
+ d: "m6 9l6 6l6-6"
427
+ }, null, -1)]]);
428
+ }
429
+ var mn = u({
430
+ name: "tabler-chevron-down",
431
+ render: pn
432
+ }), hn = {
433
+ viewBox: "0 0 24 24",
434
+ width: "1.2em",
435
+ height: "1.2em"
436
+ };
437
+ function gn(e, t) {
438
+ return i(), y("svg", hn, [...t[0] ||= [w("path", {
439
+ fill: "none",
440
+ stroke: "currentColor",
441
+ "stroke-linecap": "round",
442
+ "stroke-linejoin": "round",
443
+ "stroke-width": "2",
444
+ d: "m6 15l6-6l6 6"
445
+ }, null, -1)]]);
446
+ }
447
+ var _n = u({
448
+ name: "tabler-chevron-up",
449
+ render: gn
450
+ }), vn = { class: "flex flex-col gap-2" }, yn = { class: "sidebar-section-title" }, bn = { class: "text-xs text-muted" }, xn = { class: "text-xs text-muted" }, Sn = {
451
+ key: 0,
452
+ class: "flex flex-col gap-2"
453
+ }, Cn = { class: "sidebar-section-title" }, wn = { class: "text-xs text-muted" }, Tn = {
454
+ key: 0,
455
+ class: "inline-flex items-center gap-1 text-xs text-muted"
456
+ }, En = {
457
+ key: 1,
458
+ class: "flex flex-col gap-1.5 mt-1"
459
+ }, Dn = { class: "text-xs text-muted" }, On = { class: "flex items-center gap-3" }, kn = { class: "text-xs font-mono w-8 text-right shrink-0" }, An = {
460
+ key: 0,
461
+ class: "text-xs text-muted"
462
+ }, jn = { class: "text-xs text-center" }, Mn = {
463
+ key: 1,
464
+ class: "sidebar-divider"
465
+ }, Nn = {
466
+ key: 2,
467
+ class: "flex flex-col gap-2"
468
+ }, Pn = { class: "sidebar-section-title" }, Fn = { class: "flex flex-col gap-2" }, In = { class: "sidebar-section-title" }, Ln = { class: "flex flex-col gap-2" }, Rn = { class: "sidebar-section-title" }, zn = { class: "relative rounded-md overflow-hidden" }, Bn = {
469
+ key: 4,
470
+ class: "sidebar-divider"
471
+ }, Vn = {
472
+ key: 5,
473
+ class: "flex flex-col gap-2"
474
+ }, Hn = { class: "sidebar-section-title" }, Un = { class: "flex items-center gap-3" }, Wn = { class: "text-xs font-mono w-8 text-right shrink-0" }, Gn = { class: "flex flex-col gap-2" }, Kn = { class: "sidebar-section-title" }, qn = { class: "flex flex-wrap gap-1" }, Jn = { class: "flex flex-col gap-2" }, Yn = {
475
+ key: 0,
476
+ class: "flex flex-col gap-2"
477
+ }, Xn = { class: "flex items-center gap-2 cursor-pointer text-sm" }, Zn = {
478
+ key: 0,
479
+ class: "flex flex-col gap-2 ml-6"
480
+ }, Qn = { class: "filter-logic-divider" }, $n = { class: "flex flex-col gap-2" }, er = {
481
+ key: 0,
482
+ class: "flex flex-col gap-2"
483
+ }, tr = { class: "filter-logic-divider" }, nr = { class: "flex flex-col gap-2" }, rr = {
484
+ key: 0,
485
+ class: "flex flex-col gap-2"
486
+ }, ir = { class: "flex items-center gap-2 cursor-pointer text-sm" }, ar = { class: "flex flex-col gap-2" }, or = {
487
+ key: 0,
488
+ class: "flex flex-col gap-3"
489
+ }, sr = { class: "flex flex-wrap gap-2" }, cr = [
490
+ "aria-label",
491
+ "aria-pressed",
492
+ "onClick"
493
+ ], lr = { class: "flex flex-wrap gap-1" }, ur = { class: "text-xs text-muted" }, dr = 288, fr = /*#__PURE__*/ F(/* @__PURE__ */ D({
494
+ __name: "RecordingsFilterSidebar",
495
+ props: {
496
+ filters: {},
497
+ cameras: {},
498
+ isOpen: { type: Boolean },
499
+ isOverlay: { type: Boolean },
500
+ resultCount: {},
501
+ resultTotal: {},
502
+ resultCapped: { type: Boolean },
503
+ semanticCount: {},
504
+ semanticSearchAvailable: { type: Boolean },
505
+ semanticSearchLoading: { type: Boolean },
506
+ assistantSearchAvailable: { type: Boolean },
507
+ assistantSearchLoading: { type: Boolean },
508
+ assistantSearchNote: {},
509
+ imageSearchAvailable: { type: Boolean }
510
+ },
511
+ emits: [
512
+ "update:filters",
513
+ "semantic-search",
514
+ "assistant-search",
515
+ "image-search",
516
+ "close"
517
+ ],
518
+ setup(n, { expose: a, emit: s }) {
519
+ let u = /* @__PURE__ */ new Set(["motion", "audio"]), _ = {
520
+ white: "#f5f5f5",
521
+ gray: "#9ca3af",
522
+ yellow: "#facc15",
523
+ red: "#ef4444",
524
+ green: "#22c55e",
525
+ blue: "#3b82f6",
526
+ black: "#111827"
527
+ }, C = n, E = s, { t: D } = Ke(), { topbarOffset: te } = ie(), { icons: M, generic: N } = Qe(), P = M, ne = _n, F = mn, I = S("sidebarRef"), L = O(C.filters.semanticQuery ?? ""), z = O(""), re = O(C.filters.semanticQuery ? "semantic" : "text"), B = O(!1), V = A({
528
+ eventTypes: !0,
529
+ attributes: !0,
530
+ sensorEvents: !0,
531
+ vehicles: !0
532
+ }), oe = h(() => C.isOpen ? dr : 0), H = h(() => {
533
+ let e = [...new Set(C.cameras.map((e) => e.room).filter((e) => !!e))];
534
+ return e.sort((e, t) => e.localeCompare(t)), e.map((e) => ({
535
+ id: e,
536
+ name: e === "Default" ? D("components.form.label.room_default") : e
537
+ }));
538
+ }), se = h(() => {
539
+ let e = C.filters.rooms;
540
+ return (e.length > 0 ? C.cameras.filter((t) => e.includes(t.room ?? "")) : C.cameras).map((e) => ({
541
+ id: e.id,
542
+ name: e.name
543
+ }));
544
+ }), le = h(() => {
545
+ if (C.filters.cameraIds.length === 1) return C.cameras.find((e) => e.id === C.filters.cameraIds[0])?.id;
546
+ }), U = h(() => C.filters.contentKind === "episodes"), ue = h(() => {
547
+ let e = U.value ? "episodes" : "recordings";
548
+ if (C.resultTotal === void 0) return D(`views.recordings.result_count_${e}`, { count: C.resultCount });
549
+ let t = C.resultCapped ? `${C.resultTotal}+` : C.resultTotal;
550
+ return D(`views.recordings.result_count_${e}_of`, {
551
+ count: C.resultCount,
552
+ total: t
553
+ });
554
+ }), de = h(() => {
555
+ let e = [];
556
+ return U.value || (e.push({
557
+ value: "text",
558
+ label: D("views.recordings.search"),
559
+ icon: pt
560
+ }), e.push({
561
+ value: "semantic",
562
+ label: D("views.recordings.semantic_search"),
563
+ icon: ce
564
+ })), C.assistantSearchAvailable && e.push({
565
+ value: "assistant",
566
+ label: D("views.recordings.assistant_search"),
567
+ icon: Xe
568
+ }), C.imageSearchAvailable && !U.value && e.push({
569
+ value: "image",
570
+ label: D("views.recordings.image_search"),
571
+ icon: xt
572
+ }), e;
573
+ }), W = h(() => de.value.find((e) => e.value === re.value) ?? de.value[0]), fe = h(() => [
574
+ {
575
+ label: D("views.recordings.content_kind_all"),
576
+ value: "all"
577
+ },
578
+ {
579
+ label: D("views.recordings.content_kind_events"),
580
+ value: "events"
581
+ },
582
+ {
583
+ label: D("views.recordings.content_kind_episodes"),
584
+ value: "episodes"
585
+ }
586
+ ]), pe = h(() => [{
587
+ label: D("views.recordings.filter_and"),
588
+ value: "and"
589
+ }, {
590
+ label: D("views.recordings.filter_or"),
591
+ value: "or"
592
+ }]), me = h(() => [
593
+ {
594
+ label: D("views.recordings.time_1h"),
595
+ value: "1h"
596
+ },
597
+ {
598
+ label: D("views.recordings.time_1d"),
599
+ value: "1d"
600
+ },
601
+ {
602
+ label: D("views.recordings.time_1w"),
603
+ value: "1w"
604
+ },
605
+ {
606
+ label: D("views.recordings.time_1m"),
607
+ value: "1m"
608
+ }
609
+ ]), ge = h(() => Je.filter((e) => !u.has(e)).map((e) => ({
610
+ label: D(`views.recordings.type_${e}`),
611
+ value: e,
612
+ icon: M[e] ?? N
613
+ }))), _e = h(() => ({
614
+ label: D("views.recordings.type_other"),
615
+ value: Ae,
616
+ icon: M.other ?? N
617
+ })), ve = h(() => ye.map((e) => ({
618
+ label: D(Ze(e)),
619
+ value: e,
620
+ icon: P[e] ?? N
621
+ }))), be = h(() => qe.map((e) => ({
622
+ label: D($e(e)),
623
+ value: e,
624
+ icon: M[e] ?? N
625
+ }))), Se = h(() => Ye.map((e) => ({
626
+ label: D(q(e)),
627
+ value: e,
628
+ icon: M[e] ?? N
629
+ }))), Ce = h(() => ae.map((e) => ({
630
+ label: D(et(e)),
631
+ value: e,
632
+ swatch: _[e]
633
+ }))), we = h(() => he.map((e) => ({
634
+ label: D(tt(e)),
635
+ value: e
636
+ })));
637
+ function G(e, t) {
638
+ E("update:filters", {
639
+ ...C.filters,
640
+ [e]: t
641
+ });
642
+ }
643
+ let Te = Ue((e) => {
644
+ G("search", e);
645
+ }, 300);
646
+ function Ee(e) {
647
+ let t = new Set(C.cameras.filter((t) => e.length === 0 || e.includes(t.room ?? "")).map((e) => e.id));
648
+ E("update:filters", {
649
+ ...C.filters,
650
+ rooms: e,
651
+ cameraIds: C.filters.cameraIds.filter((e) => t.has(e))
652
+ });
653
+ }
654
+ function De() {
655
+ let e = z.value.trim();
656
+ e && !C.assistantSearchLoading && E("assistant-search", e);
657
+ }
658
+ function Oe(e) {
659
+ B.value = !1, je(e.dataTransfer?.files);
660
+ }
661
+ function ke(e) {
662
+ let t = e.target;
663
+ je(t.files), t.value = "";
664
+ }
665
+ function je(e) {
666
+ let t = Array.from(e ?? []).find((e) => e.type.startsWith("image/"));
667
+ t && E("image-search", t);
668
+ }
669
+ function Me() {
670
+ let e = L.value.trim();
671
+ G("semanticQuery", e), E("semantic-search", e);
672
+ }
673
+ function Fe(e) {
674
+ let t = [...C.filters.eventTypes], n = t.indexOf(e);
675
+ n >= 0 ? t.splice(n, 1) : t.push(e), G("eventTypes", t);
676
+ }
677
+ function Ie(e) {
678
+ let t = [...C.filters.audioLabels], n = t.indexOf(e);
679
+ n >= 0 ? t.splice(n, 1) : t.push(e), G("audioLabels", t);
680
+ }
681
+ function Le(e) {
682
+ let t = [...C.filters.sensorEvents], n = t.indexOf(e);
683
+ n >= 0 ? t.splice(n, 1) : t.push(e), G("sensorEvents", t);
684
+ }
685
+ function Re(e) {
686
+ let t = [...C.filters.hasAttributes], n = t.indexOf(e);
687
+ n >= 0 ? t.splice(n, 1) : t.push(e), G("hasAttributes", t);
688
+ }
689
+ function ze(e, t) {
690
+ let n = C.filters[e];
691
+ G(e, n.includes(t) ? n.filter((e) => e !== t) : [...n, t]);
692
+ }
693
+ function Be(e) {
694
+ V[e] = !V[e];
695
+ }
696
+ return v(L, (e) => {
697
+ !e?.trim() && C.filters.semanticQuery && G("semanticQuery", "");
698
+ }), K(I, (e) => {
699
+ let t = e.target;
700
+ t.closest("#recordings-sidebar-toggle") || t.closest("[data-pc-section=\"overlay\"], [data-pc-section=\"panel\"], .p-connected-overlay") || C.isOpen && C.isOverlay && E("close");
701
+ }), a({ sidebarWidth: oe }), (a, s) => {
702
+ let u = xe, h = it, _ = lt, v = nt, S = ce, C = Ne, E = xt, D = Y, O = R, A = Pe, M = at, N = j;
703
+ return i(), y("nav", {
704
+ ref_key: "sidebarRef",
705
+ ref: I,
706
+ class: "recordings-sidebar fixed transition-all duration-200 overflow-x-hidden overflow-y-auto md:!pl-0 pl-safe flex flex-col z-4",
707
+ style: b({
708
+ width: `${m(oe)}px`,
709
+ borderRightWidth: n.isOpen ? "1px" : "0px",
710
+ paddingBottom: `calc(var(--safe-area-inset-top) + ${m(te)}px + var(--cui-bottom-bar) + var(--cui-bottom-gap))`
711
+ })
712
+ }, [w("div", {
713
+ class: "flex flex-col gap-4 px-4 pt-4",
714
+ style: b({ width: `${dr}px` })
715
+ }, [
716
+ w("div", vn, [
717
+ w("label", yn, o(a.$t("views.recordings.content_kind")), 1),
718
+ k(u, {
719
+ "model-value": n.filters.contentKind,
720
+ options: m(fe),
721
+ "option-label": "label",
722
+ "option-value": "value",
723
+ "allow-empty": !1,
724
+ class: "content-kind-toggle",
725
+ "onUpdate:modelValue": s[0] ||= (e) => G("contentKind", e)
726
+ }, null, 8, ["model-value", "options"]),
727
+ m(U) ? (i(), y(x, { key: 0 }, [w("span", bn, o(m(ue)), 1), w("span", xn, o(a.$t("views.recordings.content_kind_episodes_hint")), 1)], 64)) : f("", !0)
728
+ ]),
729
+ s[27] ||= w("div", { class: "sidebar-divider" }, null, -1),
730
+ m(W) ? (i(), y("div", Sn, [
731
+ w("label", Cn, o(m(W).label), 1),
732
+ m(de).length > 1 ? (i(), d(u, {
733
+ key: 0,
734
+ "model-value": m(W).value,
735
+ options: m(de),
736
+ "option-value": "value",
737
+ "data-key": "value",
738
+ "allow-empty": !1,
739
+ class: "search-mode-toggle",
740
+ "onUpdate:modelValue": s[1] ||= (e) => re.value = e
741
+ }, {
742
+ option: g(({ option: e }) => [T((i(), d(l(e.icon), {
743
+ "aria-label": e.label,
744
+ class: "w-4 h-4"
745
+ }, null, 8, ["aria-label"])), [[
746
+ N,
747
+ e.label,
748
+ void 0,
749
+ { bottom: !0 }
750
+ ]])]),
751
+ _: 1
752
+ }, 8, ["model-value", "options"])) : f("", !0),
753
+ m(W).value === "text" ? (i(), y(x, { key: 1 }, [k(h, {
754
+ "model-value": n.filters.search,
755
+ placeholder: a.$t("views.recordings.search_placeholder"),
756
+ class: "w-full text-sm",
757
+ "onUpdate:modelValue": s[2] ||= (e) => m(Te)(e)
758
+ }, null, 8, ["model-value", "placeholder"]), w("span", wn, o(m(ue)), 1)], 64)) : m(W).value === "semantic" ? (i(), y(x, { key: 2 }, [
759
+ k(_, {
760
+ modelValue: m(L),
761
+ "onUpdate:modelValue": s[3] ||= (e) => p(L) ? L.value = e : null,
762
+ placeholder: a.$t("views.recordings.semantic_search_placeholder"),
763
+ class: "w-full text-sm semantic-textarea",
764
+ rows: "3",
765
+ disabled: !n.semanticSearchAvailable
766
+ }, null, 8, [
767
+ "modelValue",
768
+ "placeholder",
769
+ "disabled"
770
+ ]),
771
+ k(v, {
772
+ label: a.$t("views.recordings.semantic_search_button"),
773
+ severity: "secondary",
774
+ outlined: "",
775
+ size: "small",
776
+ class: "w-full text-xs",
777
+ loading: n.semanticSearchLoading,
778
+ disabled: !n.semanticSearchAvailable || !m(L)?.trim(),
779
+ onClick: Me
780
+ }, null, 8, [
781
+ "label",
782
+ "loading",
783
+ "disabled"
784
+ ]),
785
+ n.semanticCount == null ? f("", !0) : (i(), y("span", Tn, [k(S, { class: "w-3 h-3" }), ee(" " + o(a.$t("views.recordings.semantic_results", { count: n.semanticCount })), 1)])),
786
+ n.filters.semanticQuery ? (i(), y("div", En, [w("label", Dn, o(a.$t("views.recordings.min_match_score")), 1), w("div", On, [k(C, {
787
+ "model-value": n.filters.minSemanticScore,
788
+ min: 0,
789
+ max: 1,
790
+ step: .05,
791
+ class: "flex-1",
792
+ "onUpdate:modelValue": s[4] ||= (e) => G("minSemanticScore", e)
793
+ }, null, 8, ["model-value"]), w("span", kn, o(Math.round(n.filters.minSemanticScore * 100)) + "%", 1)])])) : f("", !0)
794
+ ], 64)) : m(W).value === "assistant" ? (i(), y(x, { key: 3 }, [
795
+ k(h, {
796
+ modelValue: m(z),
797
+ "onUpdate:modelValue": s[5] ||= (e) => p(z) ? z.value = e : null,
798
+ placeholder: a.$t("views.recordings.assistant_search_placeholder"),
799
+ class: "w-full text-sm",
800
+ disabled: n.assistantSearchLoading,
801
+ onKeydown: t(e(De, ["prevent"]), ["enter"])
802
+ }, null, 8, [
803
+ "modelValue",
804
+ "placeholder",
805
+ "disabled",
806
+ "onKeydown"
807
+ ]),
808
+ k(v, {
809
+ label: a.$t("views.recordings.assistant_search_button"),
810
+ severity: "secondary",
811
+ outlined: "",
812
+ size: "small",
813
+ class: "w-full text-xs",
814
+ loading: n.assistantSearchLoading,
815
+ disabled: !m(z).trim(),
816
+ onClick: De
817
+ }, null, 8, [
818
+ "label",
819
+ "loading",
820
+ "disabled"
821
+ ]),
822
+ n.assistantSearchNote ? (i(), y("span", An, o(n.assistantSearchNote), 1)) : f("", !0)
823
+ ], 64)) : (i(), y("label", {
824
+ key: 4,
825
+ class: c(["image-drop", { "image-drop-over": m(B) }]),
826
+ onDragover: s[6] ||= e((e) => B.value = !0, ["prevent"]),
827
+ onDragleave: s[7] ||= e((e) => B.value = !1, ["prevent"]),
828
+ onDrop: e(Oe, ["prevent"])
829
+ }, [
830
+ k(E, { class: "w-6 h-6" }),
831
+ w("span", jn, o(a.$t("views.recordings.image_search_drop")), 1),
832
+ w("input", {
833
+ type: "file",
834
+ accept: "image/*",
835
+ class: "hidden",
836
+ onChange: ke
837
+ }, null, 32)
838
+ ], 34))
839
+ ])) : f("", !0),
840
+ m(W) ? (i(), y("div", Mn)) : f("", !0),
841
+ m(H).length > 1 ? (i(), y("div", Nn, [w("label", Pn, o(a.$t("views.recordings.rooms")), 1), k(D, {
842
+ "model-value": n.filters.rooms,
843
+ options: m(H),
844
+ "option-label": "name",
845
+ "option-value": "id",
846
+ placeholder: a.$t("views.recordings.all_rooms"),
847
+ class: "w-full text-sm",
848
+ "max-selected-labels": 2,
849
+ "show-toggle-all": !1,
850
+ pt: { overlay: { style: "position: fixed" } },
851
+ "onUpdate:modelValue": s[8] ||= (e) => Ee(e)
852
+ }, null, 8, [
853
+ "model-value",
854
+ "options",
855
+ "placeholder"
856
+ ])])) : f("", !0),
857
+ w("div", Fn, [w("label", In, o(a.$t("views.recordings.cameras")), 1), k(D, {
858
+ "model-value": n.filters.cameraIds,
859
+ options: m(se),
860
+ "option-label": "name",
861
+ "option-value": "id",
862
+ placeholder: a.$t("views.recordings.all_cameras"),
863
+ class: "w-full text-sm",
864
+ "max-selected-labels": 2,
865
+ "show-toggle-all": !1,
866
+ pt: { overlay: { style: "position: fixed" } },
867
+ "onUpdate:modelValue": s[9] ||= (e) => G("cameraIds", e)
868
+ }, null, 8, [
869
+ "model-value",
870
+ "options",
871
+ "placeholder"
872
+ ])]),
873
+ m(le) && !m(U) ? (i(), y(x, { key: 3 }, [s[20] ||= w("div", { class: "sidebar-divider" }, null, -1), w("div", Ln, [
874
+ w("label", Rn, o(a.$t("views.recordings.grid_search")), 1),
875
+ w("div", zn, [k(O, {
876
+ camera: m(le),
877
+ "object-fit": "cover"
878
+ }, null, 8, ["camera"]), k(A, {
879
+ "model-value": n.filters.gridRegions,
880
+ "onUpdate:modelValue": s[10] ||= (e) => G("gridRegions", e)
881
+ }, null, 8, ["model-value"])]),
882
+ k(v, {
883
+ label: a.$t("views.recordings.grid_clear"),
884
+ severity: "secondary",
885
+ outlined: "",
886
+ size: "small",
887
+ class: "w-full text-xs",
888
+ disabled: n.filters.gridRegions.length === 0,
889
+ onClick: s[11] ||= (e) => G("gridRegions", [])
890
+ }, null, 8, ["label", "disabled"])
891
+ ])], 64)) : f("", !0),
892
+ m(U) ? f("", !0) : (i(), y("div", Bn)),
893
+ m(U) ? f("", !0) : (i(), y("div", Vn, [w("label", Hn, o(a.$t("views.recordings.confidence")), 1), w("div", Un, [k(C, {
894
+ "model-value": n.filters.minConfidence,
895
+ min: 0,
896
+ max: 1,
897
+ step: .05,
898
+ class: "flex-1",
899
+ "onUpdate:modelValue": s[12] ||= (e) => G("minConfidence", e)
900
+ }, null, 8, ["model-value"]), w("span", Wn, o(Math.round(n.filters.minConfidence * 100)) + "%", 1)])])),
901
+ s[28] ||= w("div", { class: "sidebar-divider" }, null, -1),
902
+ w("div", Gn, [w("label", Kn, o(a.$t("views.recordings.time_range")), 1), w("div", qn, [(i(!0), y(x, null, r(m(me), (e) => (i(), d(v, {
903
+ key: e.value,
904
+ label: e.label,
905
+ severity: n.filters.timeRange === e.value ? void 0 : "secondary",
906
+ outlined: n.filters.timeRange !== e.value,
907
+ size: "small",
908
+ class: "text-xs flex-1 min-w-0",
909
+ onClick: (t) => G("timeRange", n.filters.timeRange === e.value ? null : e.value)
910
+ }, null, 8, [
911
+ "label",
912
+ "severity",
913
+ "outlined",
914
+ "onClick"
915
+ ]))), 128))])]),
916
+ m(U) ? f("", !0) : (i(), y(x, { key: 6 }, [
917
+ s[25] ||= w("div", { class: "sidebar-divider" }, null, -1),
918
+ w("div", Jn, [w("button", {
919
+ class: "sidebar-section-title flex items-center justify-between w-full cursor-pointer",
920
+ onClick: s[13] ||= (e) => Be("sensorEvents")
921
+ }, [w("span", null, o(a.$t("views.recordings.sensor_events")), 1), (i(), d(l(m(V).sensorEvents ? m(ne) : m(F)), { class: "w-4 h-4 text-muted" }))]), m(V).sensorEvents ? (i(), y("div", Yn, [(i(!0), y(x, null, r(m(ve), (e) => (i(), y(x, { key: e.value }, [w("label", Xn, [
922
+ k(M, {
923
+ "model-value": n.filters.sensorEvents.includes(e.value),
924
+ binary: !0,
925
+ "onUpdate:modelValue": (t) => Le(e.value)
926
+ }, null, 8, ["model-value", "onUpdate:modelValue"]),
927
+ (i(), d(l(e.icon), { class: "w-4 h-4 text-muted" })),
928
+ w("span", null, o(e.label), 1)
929
+ ]), e.value === "audio" && n.filters.sensorEvents.includes("audio") ? (i(), y("div", Zn, [(i(!0), y(x, null, r(m(be), (e) => (i(), y("label", {
930
+ key: e.value,
931
+ class: "flex items-center gap-2 cursor-pointer text-sm"
932
+ }, [
933
+ k(M, {
934
+ "model-value": n.filters.audioLabels.includes(e.value),
935
+ binary: !0,
936
+ "onUpdate:modelValue": (t) => Ie(e.value)
937
+ }, null, 8, ["model-value", "onUpdate:modelValue"]),
938
+ (i(), d(l(e.icon), { class: "w-4 h-4 text-muted" })),
939
+ w("span", null, o(e.label), 1)
940
+ ]))), 128))])) : f("", !0)], 64))), 128))])) : f("", !0)]),
941
+ w("div", Qn, [
942
+ s[21] ||= w("div", { class: "filter-logic-line" }, null, -1),
943
+ k(u, {
944
+ "model-value": n.filters.filterLogicTriggers,
945
+ options: m(pe),
946
+ "option-label": "label",
947
+ "option-value": "value",
948
+ "allow-empty": !1,
949
+ class: "filter-logic-toggle",
950
+ "onUpdate:modelValue": s[14] ||= (e) => G("filterLogicTriggers", e)
951
+ }, null, 8, ["model-value", "options"]),
952
+ s[22] ||= w("div", { class: "filter-logic-line" }, null, -1)
953
+ ]),
954
+ w("div", $n, [w("button", {
955
+ class: "sidebar-section-title flex items-center justify-between w-full cursor-pointer",
956
+ onClick: s[15] ||= (e) => Be("eventTypes")
957
+ }, [w("span", null, o(a.$t("views.recordings.event_type")), 1), (i(), d(l(m(V).eventTypes ? m(ne) : m(F)), { class: "w-4 h-4 text-muted" }))]), m(V).eventTypes ? (i(), y("div", er, [(i(!0), y(x, null, r(m(ge), (e) => (i(), y("label", {
958
+ key: e.value,
959
+ class: "flex items-center gap-2 cursor-pointer text-sm"
960
+ }, [
961
+ k(M, {
962
+ "model-value": n.filters.eventTypes.includes(e.value),
963
+ binary: !0,
964
+ "onUpdate:modelValue": (t) => Fe(e.value)
965
+ }, null, 8, ["model-value", "onUpdate:modelValue"]),
966
+ (i(), d(l(e.icon), { class: "w-4 h-4 text-muted" })),
967
+ w("span", null, o(e.label), 1)
968
+ ]))), 128))])) : f("", !0)]),
969
+ w("div", tr, [
970
+ s[23] ||= w("div", { class: "filter-logic-line" }, null, -1),
971
+ k(u, {
972
+ "model-value": n.filters.filterLogicAttributes,
973
+ options: m(pe),
974
+ "option-label": "label",
975
+ "option-value": "value",
976
+ "allow-empty": !1,
977
+ class: "filter-logic-toggle",
978
+ "onUpdate:modelValue": s[16] ||= (e) => G("filterLogicAttributes", e)
979
+ }, null, 8, ["model-value", "options"]),
980
+ s[24] ||= w("div", { class: "filter-logic-line" }, null, -1)
981
+ ]),
982
+ w("div", nr, [w("button", {
983
+ class: "sidebar-section-title flex items-center justify-between w-full cursor-pointer",
984
+ onClick: s[17] ||= (e) => Be("attributes")
985
+ }, [w("span", null, o(a.$t("views.recordings.attributes")), 1), (i(), d(l(m(V).attributes ? m(ne) : m(F)), { class: "w-4 h-4 text-muted" }))]), m(V).attributes ? (i(), y("div", rr, [(i(!0), y(x, null, r(m(Se), (e) => (i(), y("label", {
986
+ key: e.value,
987
+ class: "flex items-center gap-2 cursor-pointer text-sm"
988
+ }, [
989
+ k(M, {
990
+ "model-value": n.filters.hasAttributes.includes(e.value),
991
+ binary: !0,
992
+ "onUpdate:modelValue": (t) => Re(e.value)
993
+ }, null, 8, ["model-value", "onUpdate:modelValue"]),
994
+ (i(), d(l(e.icon), { class: "w-4 h-4 text-muted" })),
995
+ w("span", null, o(e.label), 1)
996
+ ]))), 128)), w("label", ir, [
997
+ k(M, {
998
+ "model-value": n.filters.eventTypes.includes(m(_e).value),
999
+ binary: !0,
1000
+ "onUpdate:modelValue": s[18] ||= (e) => Fe(m(_e).value)
1001
+ }, null, 8, ["model-value"]),
1002
+ (i(), d(l(m(_e).icon), { class: "w-4 h-4 text-muted" })),
1003
+ w("span", null, o(m(_e).label), 1)
1004
+ ])])) : f("", !0)]),
1005
+ s[26] ||= w("div", { class: "sidebar-divider" }, null, -1),
1006
+ w("div", ar, [w("button", {
1007
+ class: "sidebar-section-title flex items-center justify-between w-full cursor-pointer",
1008
+ onClick: s[19] ||= (e) => Be("vehicles")
1009
+ }, [w("span", null, o(a.$t("views.recordings.vehicles")), 1), (i(), d(l(m(V).vehicles ? m(ne) : m(F)), { class: "w-4 h-4 text-muted" }))]), m(V).vehicles ? (i(), y("div", or, [
1010
+ w("div", sr, [(i(!0), y(x, null, r(m(Ce), (e) => T((i(), y("button", {
1011
+ key: e.value,
1012
+ class: c(["vehicle-color", { "vehicle-color-active": n.filters.vehicleColors.includes(e.value) }]),
1013
+ style: b({ background: e.swatch }),
1014
+ "aria-label": e.label,
1015
+ "aria-pressed": n.filters.vehicleColors.includes(e.value),
1016
+ onClick: (t) => ze("vehicleColors", e.value)
1017
+ }, null, 14, cr)), [[
1018
+ N,
1019
+ { value: e.label },
1020
+ void 0,
1021
+ { top: !0 }
1022
+ ]])), 128))]),
1023
+ w("div", lr, [(i(!0), y(x, null, r(m(we), (e) => (i(), d(v, {
1024
+ key: e.value,
1025
+ label: e.label,
1026
+ severity: n.filters.vehicleTypes.includes(e.value) ? void 0 : "secondary",
1027
+ outlined: !n.filters.vehicleTypes.includes(e.value),
1028
+ size: "small",
1029
+ class: "text-xs",
1030
+ onClick: (t) => ze("vehicleTypes", e.value)
1031
+ }, null, 8, [
1032
+ "label",
1033
+ "severity",
1034
+ "outlined",
1035
+ "onClick"
1036
+ ]))), 128))]),
1037
+ w("span", ur, o(a.$t("views.recordings.vehicle_filter_hint")), 1)
1038
+ ])) : f("", !0)])
1039
+ ], 64))
1040
+ ], 4)], 4);
1041
+ };
1042
+ }
1043
+ }), [["__scopeId", "data-v-be7d97b8"]]), pr = { class: "font-semibold text-xl truncate" }, mr = {
1044
+ key: 0,
1045
+ class: "image-drop-overlay"
1046
+ }, hr = { class: "text-sm font-semibold" }, gr = { class: "w-full h-full relative" }, _r = {
1047
+ key: 0,
1048
+ class: "w-full flex flex-row h-[calc(40px+1rem)] py-2 items-center fixed z-10"
1049
+ }, vr = { class: "relative z-2 page-title !m-0" }, yr = {
1050
+ key: 1,
1051
+ class: "fixed right-0 z-10 h-[calc(40px+1rem)] py-2 pr-safe-offset-2 flex items-center"
1052
+ }, br = {
1053
+ key: 3,
1054
+ class: "flex justify-center py-4"
1055
+ }, xr = {
1056
+ key: 4,
1057
+ class: "flex flex-1 min-h-0 flex-col items-center justify-center w-full gap-4"
1058
+ }, Sr = { class: "text-muted text-sm" }, Cr = 288, wr = /*#__PURE__*/ F(/* @__PURE__ */ D({
1059
+ __name: "Recordings",
1060
+ setup(t) {
1061
+ let n = new dt(), r = new Te(), a = new L(), l = Re(), u = we(), { bottombarHeight: p } = ie(), { status: C, checking: ee } = pe(), { openEventTrace: D } = Ie(), { request: A, closeSimilarSearch: M } = Ce(), N = Se("@camera.ui/camera-ui-nvr"), F = z(), { t: R, locale: ae } = Ke(), { smBreakpoint: U, xlBreakpoint: he, mdBreakpoint: ye } = de(), { registerScrollToTop: xe } = V();
1062
+ if (typeof VideoDecoder < "u") {
1063
+ let e = Fe({ cacheSize: 20 });
1064
+ s(Me, e), We(() => e.dispose());
1065
+ }
1066
+ let { results: Ee, isSearching: ke, isAvailable: Ae, hasSearched: Ne, search: Pe, clear: Le } = oe(), { result: He, isSearching: Ue, isAvailable: K, licenseRequired: qe, search: Je, clear: Ye } = ue(), { data: Xe } = n.getAssistantStatusQuery(), { data: Ze } = r.getCamerasQuery({
1067
+ page: 1,
1068
+ pageSize: -1
1069
+ }), { data: Qe } = a.getUserQuery(h(() => u.user?.username ?? "")), $e = Array.from({ length: 24 }, (e, t) => t), et = {
1070
+ contentKind: "all",
1071
+ favoritesOnly: !1,
1072
+ search: "",
1073
+ semanticQuery: "",
1074
+ filterLogicTriggers: "or",
1075
+ filterLogicAttributes: "or",
1076
+ rooms: [],
1077
+ cameraIds: [],
1078
+ timeRange: null,
1079
+ customDateRange: null,
1080
+ eventTypes: [],
1081
+ audioLabels: [],
1082
+ hasAttributes: [],
1083
+ vehicleColors: [],
1084
+ vehicleTypes: [],
1085
+ sensorEvents: [],
1086
+ gridRegions: [],
1087
+ minConfidence: .5,
1088
+ minSemanticScore: .5,
1089
+ onlyWithRecordings: !0
1090
+ }, tt = {
1091
+ "1h": 36e5,
1092
+ "1d": 864e5,
1093
+ "1w": 6048e5,
1094
+ "1m": 2592e6
1095
+ }, q = S("gridRef"), rt = S("viewMenuRef"), it = S("reindexAnchorRef"), at = E({
1096
+ hasDetections: !0,
1097
+ withRecordingInfo: !0,
1098
+ hasRecording: !0
1099
+ }), ot = E([]), J = O("closed"), ct = O(!1), Y = O({ ...et }), lt = O(!1), pt = O(""), bt = O(0), X = O(), Z = O(!1), St = O(null), Ct = !1, wt = JSON.stringify(at.value), { left: Tt } = Ge(it), Dt = h(() => {
1100
+ let e = p.value > 0 ? "calc(1.25rem + var(--safe-area-inset-bottom))" : "calc(max(8px, var(--safe-area-inset-bottom)) + 0px)";
1101
+ return `calc(${p.value}px + ${e})`;
1102
+ }), Ot = h(() => he.value ? !0 : J.value === "opened"), kt = h(() => ye.value), At = le(() => q.value?.scrollY ?? 0), jt = h(() => Ot.value && kt.value ? !0 : At.value && !C.value?.running), Mt = h(() => ye.value ? "0px" : Ot.value ? `${Cr}px` : "0px"), Q = h(() => (Ze.value?.result ?? []).map((e) => ({
1103
+ id: e._id,
1104
+ name: e.name,
1105
+ room: e.room
1106
+ }))), Nt = h(() => {
1107
+ let e = /* @__PURE__ */ new Map();
1108
+ for (let t of Q.value) e.set(t.id, t.name);
1109
+ return e;
1110
+ }), Pt = h(() => {
1111
+ let e = /* @__PURE__ */ new Map();
1112
+ for (let t of Ze.value?.result ?? []) e.set(t._id, t);
1113
+ return e;
1114
+ }), Ft = h(() => {
1115
+ let e = Y.value.rooms;
1116
+ return (e.length > 0 ? Q.value.filter((t) => e.includes(t.room ?? "")) : Q.value).map((e) => e.id);
1117
+ }), It = h(() => Y.value.cameraIds.filter((e) => Ft.value.includes(e))), Lt = h(() => Ft.value);
1118
+ xe(() => q.value?.scrollToTop());
1119
+ let { events: Rt, isLoading: zt, hasMore: Bt, stats: Vt, loadMore: Ht, loadThumbnails: Ut, deleteEvents: Wt, reset: Gt, loadFailed: Kt, licenseRequired: qt, pluginUnavailable: Jt } = ve({
1120
+ availableCameraIds: Lt,
1121
+ cameraIds: It,
1122
+ realtime: !0,
1123
+ pageSize: 40,
1124
+ filter: at,
1125
+ withEpisodes: !0,
1126
+ withStats: !0
1127
+ }), Yt = h(() => {
1128
+ let e = /* @__PURE__ */ new Map();
1129
+ for (let t of Ee.value ?? []) {
1130
+ let n = e.get(t.eventId);
1131
+ (!n || t.score > n) && e.set(t.eventId, t.score);
1132
+ }
1133
+ return e;
1134
+ }), Xt = h(() => Ne.value), $ = h(() => !!A.value), Zt = h(() => new Map((He.value?.events ?? []).map((e) => [e.id, e]))), Qt = h(() => {
1135
+ let e = [], t = /* @__PURE__ */ new Set();
1136
+ for (let n of He.value?.matches ?? []) {
1137
+ let r = Zt.value.get(n.eventId);
1138
+ if (!r) continue;
1139
+ let i = n.segment >= 0 && r.segments[n.segment] ? n.segment : void 0, a = i === void 0 ? r.id : `${r.id}:seg:${i}`;
1140
+ t.has(a) || (t.add(a), e.push({
1141
+ event: r,
1142
+ key: a,
1143
+ segIndex: i
1144
+ }));
1145
+ }
1146
+ return e;
1147
+ }), $t = h(() => {
1148
+ let e = Y.value, t = It.value.length ? It.value : e.rooms.length ? Ft.value : [], n = e.timeRange === "custom" ? e.customDateRange : null;
1149
+ return {
1150
+ cameraIds: t.length ? t : void 0,
1151
+ startMs: n ? n[0].getTime() : X.value,
1152
+ endMs: n ? n[1].getTime() : void 0
1153
+ };
1154
+ }), en = h(() => $.value ? Ue.value : zt.value), tn = h(() => {
1155
+ if ($.value) {
1156
+ let e = He.value;
1157
+ return !!e && e?.mode !== "none" && !Qt.value.length && !Ue.value;
1158
+ }
1159
+ return !rn.value.length && !zt.value && !ke.value;
1160
+ }), nn = h(() => $.value ? R("views.recordings.similar_empty") : qt.value ? R("views.recordings.vehicle_filter_license") : Jt.value ? R("views.recordings.recordings_unavailable") : Kt.value ? R("views.recordings.load_failed") : R("views.recordings.no_recordings")), rn = h(() => {
1161
+ let e = Rt.value.filter((e) => e.state === "ended" || (e.segments?.length ?? 0) > 0), t = Y.value;
1162
+ if (X.value !== void 0) {
1163
+ let t = X.value;
1164
+ e = e.filter((e) => e.startTime >= t);
1165
+ }
1166
+ return t.gridRegions.length > 0 && (e = e.filter((e) => e.segments.some((e) => e.detections.some((e) => e.box && ht(e.box, t.gridRegions))))), t.favoritesOnly && (e = e.filter((e) => e.favorite)), Xt.value && (e = e.filter((e) => {
1167
+ let n = Yt.value.get(e.id);
1168
+ return n != null && n >= t.minSemanticScore;
1169
+ }), e.sort((e, t) => (Yt.value.get(t.id) ?? 0) - (Yt.value.get(e.id) ?? 0))), e;
1170
+ }), on = h(() => Y.value.contentKind === "episodes"), sn = h(() => {
1171
+ let e = Y.value;
1172
+ return e.search.trim() !== "" || e.eventTypes.length > 0 || e.audioLabels.length > 0 || e.hasAttributes.length > 0 || e.vehicleColors.length > 0 || e.vehicleTypes.length > 0 || e.sensorEvents.length > 0 || e.minConfidence !== .5;
1173
+ }), cn = h(() => Xe.value?.state === "ready"), ln = h(() => {
1174
+ if (Y.value.contentKind === "events") return [];
1175
+ N.storeVersion.value;
1176
+ let e = Y.value;
1177
+ if (!on.value && (Xt.value || e.gridRegions.length > 0 || sn.value)) return [];
1178
+ let t = It.value.length > 0 ? It.value : Lt.value, n = X.value ?? 0, r = Infinity;
1179
+ if (e.timeRange === "custom" && e.customDateRange && (n = Math.max(n, e.customDateRange[0].getTime()), r = e.customDateRange[1].getTime()), Bt.value && !on.value) {
1180
+ let e = Infinity;
1181
+ for (let t of Rt.value) e = Math.min(e, t.thumbnailAt ?? t.startTime);
1182
+ n = Math.max(n, e);
1183
+ }
1184
+ let i = [];
1185
+ for (let a of N.getEpisodes()) a.description && (!e.favoritesOnly || a.favorite) && (n && a.endTime < n || a.startTime > r || t.length > 0 && !a.members.some((e) => t.includes(e.cameraId)) || i.push({
1186
+ event: void 0,
1187
+ key: `episode:${a.id}`,
1188
+ episode: a
1189
+ }));
1190
+ return i;
1191
+ }), un = h(() => {
1192
+ if ($.value) return Qt.value;
1193
+ if (on.value) return [...ln.value].sort(ft);
1194
+ let e = Z.value && ot.value.length ? [...ot.value] : rn.value.map((e) => ({
1195
+ event: e,
1196
+ key: e.id
1197
+ }));
1198
+ return ln.value.length && (e.push(...ln.value), e.sort(ft)), e;
1199
+ }), fn = h(() => {
1200
+ let e = Vt.value, t = Y.value;
1201
+ if (!e || !Bt.value || Xt.value || t.gridRegions.length > 0 || t.timeRange && X.value === void 0) return;
1202
+ if (on.value) return e.episodes;
1203
+ let n = Z.value ? e.segments : e.total;
1204
+ if (n !== void 0) return n + (t.contentKind !== "events" && !sn.value ? e.episodes : 0);
1205
+ }), pn = h(() => Be(void 0, "admin")), mn = h(() => rn.value.filter((e) => e.state === "ended")), { selectionMode: hn, selectedIds: gn, allSelected: _n, bulkBusy: vn, enterSelectionMode: yn, exitSelectionMode: bn, toggleSelectAll: xn, toggleSelection: Sn } = W(mn, (e) => e.id);
1206
+ function Cn() {
1207
+ let e = [...gn.value];
1208
+ e.length && !vn.value && l.openTextDialog({
1209
+ data: {
1210
+ title: R("components.dialog.title.confirm"),
1211
+ contentText: R("views.recordings.delete_selected_confirm", { count: e.length }),
1212
+ confirmText: R("components.form.button.remove"),
1213
+ confirmButtonProps: { severity: "danger" }
1214
+ },
1215
+ onConfirm: async () => {
1216
+ vn.value = !0;
1217
+ try {
1218
+ await Wt(e), bn(), F.add({
1219
+ severity: "success",
1220
+ detail: R("views.recordings.delete_selected_done", { count: e.length }),
1221
+ life: 5e3
1222
+ });
1223
+ } catch (e) {
1224
+ F.add({
1225
+ severity: "error",
1226
+ detail: e?.message ?? String(e),
1227
+ life: 5e3
1228
+ });
1229
+ } finally {
1230
+ vn.value = !1;
1231
+ }
1232
+ }
1233
+ });
1234
+ }
1235
+ let wn = h(() => [
1236
+ {
1237
+ key: "ungroup",
1238
+ label: R("views.recordings.ungroup"),
1239
+ description: R("views.recordings.ungroup_hint"),
1240
+ toggle: !0,
1241
+ toggleState: Z.value,
1242
+ onClick: () => {
1243
+ Ct = !0, Z.value = !Z.value, u.updateUser({ preferences: { recordings: { ungrouped: Z.value } } });
1244
+ }
1245
+ },
1246
+ {
1247
+ key: "onlyWithRecordings",
1248
+ label: R("views.recordings.only_with_recordings"),
1249
+ description: R("views.recordings.only_with_recordings_hint"),
1250
+ toggle: !0,
1251
+ toggleState: Y.value.onlyWithRecordings,
1252
+ onClick: () => {
1253
+ Y.value = {
1254
+ ...Y.value,
1255
+ onlyWithRecordings: !Y.value.onlyWithRecordings
1256
+ };
1257
+ }
1258
+ },
1259
+ ...pn.value ? [{
1260
+ key: "favoritesOnly",
1261
+ label: R("views.recordings.favorites_only"),
1262
+ description: R("views.recordings.favorites_hint"),
1263
+ toggle: !0,
1264
+ toggleState: Y.value.favoritesOnly,
1265
+ onClick: () => {
1266
+ Y.value = {
1267
+ ...Y.value,
1268
+ favoritesOnly: !Y.value.favoritesOnly
1269
+ };
1270
+ }
1271
+ }] : []
1272
+ ]);
1273
+ function Tn() {
1274
+ l.openComponentDialog(Et, { data: {
1275
+ title: R("views.recordings.reindex.title"),
1276
+ contentProps: {},
1277
+ confirmText: R("views.recordings.reindex.start")
1278
+ } });
1279
+ }
1280
+ function En() {
1281
+ l.openComponentDialog(an, { data: {
1282
+ title: R("views.recordings.export.title"),
1283
+ contentProps: {
1284
+ cameras: Q.value,
1285
+ preselect: Y.value.cameraIds?.length ? Y.value.cameraIds : []
1286
+ },
1287
+ confirmText: R("views.recordings.export.confirm")
1288
+ } });
1289
+ }
1290
+ function Dn() {
1291
+ let e = J.value;
1292
+ J.value = e === "opened" ? "closed" : "opened";
1293
+ }
1294
+ function On() {
1295
+ J.value = "closed";
1296
+ }
1297
+ function kn(e) {
1298
+ !e.semanticQuery?.trim() && Y.value.semanticQuery?.trim() && Le(), Y.value = e;
1299
+ }
1300
+ async function An(e) {
1301
+ lt.value = !0, pt.value = "";
1302
+ try {
1303
+ let t = await ut(e, ae.value, Intl.DateTimeFormat().resolvedOptions().timeZone);
1304
+ kn({
1305
+ ...et,
1306
+ ...t.filters,
1307
+ favoritesOnly: pn.value && t.filters.favoritesOnly
1308
+ }), jn(t.filters.semanticQuery), pt.value = t.note;
1309
+ } catch (e) {
1310
+ F.add({
1311
+ severity: "error",
1312
+ detail: e?.response?.data?.message ?? R("views.recordings.assistant_search_failed"),
1313
+ life: 5e3
1314
+ });
1315
+ } finally {
1316
+ lt.value = !1;
1317
+ }
1318
+ }
1319
+ function jn(e) {
1320
+ if (!e.trim()) {
1321
+ Le();
1322
+ return;
1323
+ }
1324
+ Pe(e);
1325
+ }
1326
+ function Mn(e, t) {
1327
+ let n = Zt.value.get(e);
1328
+ return n && !N.getEvent(e) ? N.loadThumbnails(e, n.cameraId, t) : Ut(e, t);
1329
+ }
1330
+ function Nn(e) {
1331
+ if (!e.vehicleColors.length && !e.vehicleTypes.length) return;
1332
+ let t = {};
1333
+ return e.vehicleColors.length && (t.color = e.vehicleColors), e.vehicleTypes.length && (t.vehicle_type = e.vehicleTypes), t;
1334
+ }
1335
+ function Pn(e, t) {
1336
+ let n = Pt.value.get(e.cameraId);
1337
+ n && D(e, n, t);
1338
+ }
1339
+ function Fn(e) {
1340
+ l.openComponentDialog(dn, {
1341
+ data: {
1342
+ title: R("components.similar.image_search_title"),
1343
+ hideConfirmButton: !0,
1344
+ contentProps: { image: e }
1345
+ },
1346
+ dialogSize: { desktop: { width: "720px" } }
1347
+ });
1348
+ }
1349
+ function In(e) {
1350
+ return !!e.dataTransfer?.types.includes("Files");
1351
+ }
1352
+ function Ln(e) {
1353
+ K.value && In(e) && bt.value++;
1354
+ }
1355
+ function Rn(e) {
1356
+ In(e) && (bt.value = Math.max(0, bt.value - 1));
1357
+ }
1358
+ function zn(e) {
1359
+ bt.value = 0;
1360
+ let t = Array.from(e.dataTransfer?.files ?? []).find((e) => e.type.startsWith("image/"));
1361
+ t && K.value && Fn(t);
1362
+ }
1363
+ function Bn(e, t) {
1364
+ let n = Pt.value.get(e.cameraId);
1365
+ n && l.openComponentDialog(P, {
1366
+ data: {
1367
+ title: n.name,
1368
+ dedupeKey: `camera-event:${n._id}:${t}`,
1369
+ stayActive: !0,
1370
+ hideCancelButton: !0,
1371
+ hideConfirmButton: !0,
1372
+ contentProps: {
1373
+ camera: n,
1374
+ eventTimestamp: t
1375
+ },
1376
+ headerActions: e.segments?.some((e) => e?.description) ? [{
1377
+ icon: ce,
1378
+ toggle: !0,
1379
+ onClick: () => {}
1380
+ }] : void 0,
1381
+ draggable: !0,
1382
+ blockDragOnSelectors: [".p-dialog-body"],
1383
+ dismissableMask: !1,
1384
+ modal: !1,
1385
+ dialogContentClass: "!px-0 h-full",
1386
+ goTo: `/cameras/${n.name}?startTs=${t}`
1387
+ },
1388
+ dialogSize: { desktop: {
1389
+ maxWidth: "800px",
1390
+ maxHeight: "calc(100vh - max(1rem, var(--safe-area-inset-top)) - max(1rem, var(--safe-area-inset-bottom)))",
1391
+ width: "50vw"
1392
+ } }
1393
+ });
1394
+ }
1395
+ return v(he, (e) => {
1396
+ e && (J.value = "closed");
1397
+ }), v(() => Y.value.timeRange, (e) => {
1398
+ X.value = e && tt[e] ? Date.now() - tt[e] : void 0;
1399
+ }, { immediate: !0 }), v(Y, (e) => {
1400
+ let t = e.eventTypes.length > 0 || e.sensorEvents.length > 0 || e.audioLabels.length > 0 || e.hasAttributes.length > 0, n = {
1401
+ types: e.eventTypes.length > 0 ? e.eventTypes : void 0,
1402
+ triggers: e.sensorEvents.length > 0 ? e.sensorEvents : void 0,
1403
+ triggerLabels: e.audioLabels.length > 0 ? e.audioLabels : void 0,
1404
+ attributes: e.hasAttributes.length > 0 ? e.hasAttributes : void 0,
1405
+ attributeLabels: Nn(e),
1406
+ filterLogicTriggers: t ? e.filterLogicTriggers : void 0,
1407
+ filterLogicAttributes: t ? e.filterLogicAttributes : void 0,
1408
+ search: e.search || void 0,
1409
+ minConfidence: e.minConfidence > 0 ? e.minConfidence : void 0,
1410
+ hasDetections: !t,
1411
+ withRecordingInfo: !0,
1412
+ hasRecording: e.onlyWithRecordings || void 0,
1413
+ favoritesOnly: e.favoritesOnly || void 0,
1414
+ startedSinceMs: X.value
1415
+ }, r = JSON.stringify(n);
1416
+ r !== wt && (wt = r, at.value = n);
1417
+ }, {
1418
+ deep: !0,
1419
+ immediate: !0
1420
+ }), v(Qe, (e) => {
1421
+ if (!e || Ct) return;
1422
+ let t = e.preferences?.recordings?.ungrouped;
1423
+ t !== void 0 && (Z.value = t);
1424
+ }, { immediate: !0 }), v([
1425
+ A,
1426
+ () => JSON.stringify($t.value),
1427
+ K
1428
+ ], ([e, , t]) => {
1429
+ e ? t && Je(e.query, $t.value) : Ye();
1430
+ }, { immediate: !0 }), v([
1431
+ Z,
1432
+ rn,
1433
+ Xt
1434
+ ], ([e, t, n]) => {
1435
+ ot.value = e ? mt(t, n) : [];
1436
+ }), v(() => Y.value.cameraIds, (e) => {
1437
+ e.length !== 1 && Y.value.gridRegions.length > 0 && (Y.value = {
1438
+ ...Y.value,
1439
+ gridRegions: []
1440
+ });
1441
+ }), te(() => {
1442
+ requestAnimationFrame(() => {
1443
+ ct.value = !0;
1444
+ });
1445
+ }), (t, n) => {
1446
+ let r = je, a = B, s = me, l = nt, u = gt, p = xt, h = yt, v = vt, S = ze, E = _e, D = be, O = De, te = G, N = H, P = ge, F = Oe, L = se, R = j;
1447
+ return i(), y("div", null, [
1448
+ k(r, { position: "center" }, {
1449
+ default: g(() => [w("span", pr, o(t.$t("views.recordings.title")), 1)]),
1450
+ _: 1
1451
+ }),
1452
+ k(r, { position: "left" }, {
1453
+ default: g(() => [k(l, {
1454
+ id: "recordings-sidebar-toggle",
1455
+ severity: "secondary",
1456
+ class: "cui-button p-2 text-color",
1457
+ text: "",
1458
+ rounded: "",
1459
+ onClick: Dn
1460
+ }, {
1461
+ icon: g(() => [m(J) === "closed" ? (i(), d(a, {
1462
+ key: 0,
1463
+ width: "100%",
1464
+ height: "100%"
1465
+ })) : (i(), d(s, {
1466
+ key: 1,
1467
+ width: "100%",
1468
+ height: "100%"
1469
+ }))]),
1470
+ _: 1
1471
+ })]),
1472
+ _: 1
1473
+ }),
1474
+ k(r, { position: "right" }, {
1475
+ default: g(() => [k(l, {
1476
+ severity: "secondary",
1477
+ class: "cui-button p-2 text-color",
1478
+ text: "",
1479
+ rounded: "",
1480
+ onClick: n[0] ||= (e) => m(rt)?.toggleMenu(e)
1481
+ }, {
1482
+ icon: g(() => [k(u, {
1483
+ width: "100%",
1484
+ height: "100%"
1485
+ })]),
1486
+ _: 1
1487
+ })]),
1488
+ _: 1
1489
+ }),
1490
+ k(fr, {
1491
+ filters: m(Y),
1492
+ cameras: m(Q),
1493
+ "is-open": m(Ot),
1494
+ "is-overlay": m(kt),
1495
+ "result-count": m(un).length,
1496
+ "result-total": m(fn),
1497
+ "result-capped": m(Vt)?.capped,
1498
+ "semantic-count": m(Xt) ? m(Yt).size : void 0,
1499
+ "semantic-search-available": m(Ae),
1500
+ "semantic-search-loading": m(ke),
1501
+ "assistant-search-available": m(cn),
1502
+ "assistant-search-loading": m(lt),
1503
+ "assistant-search-note": m(pt),
1504
+ "image-search-available": m(K),
1505
+ "onUpdate:filters": kn,
1506
+ onSemanticSearch: jn,
1507
+ onAssistantSearch: An,
1508
+ onImageSearch: Fn,
1509
+ onClose: On
1510
+ }, null, 8, [
1511
+ "filters",
1512
+ "cameras",
1513
+ "is-open",
1514
+ "is-overlay",
1515
+ "result-count",
1516
+ "result-total",
1517
+ "result-capped",
1518
+ "semantic-count",
1519
+ "semantic-search-available",
1520
+ "semantic-search-loading",
1521
+ "assistant-search-available",
1522
+ "assistant-search-loading",
1523
+ "assistant-search-note",
1524
+ "image-search-available"
1525
+ ]),
1526
+ (i(), d(_, {
1527
+ to: "#container",
1528
+ defer: ""
1529
+ }, [m(Ot) && m(kt) ? (i(), y("div", {
1530
+ key: 0,
1531
+ class: "fixed top-0 left-0 right-0 bottom-0 w-full h-full bg-black/50 z-1",
1532
+ onClick: On
1533
+ })) : f("", !0)])),
1534
+ w("main", {
1535
+ ref_key: "reindexAnchorRef",
1536
+ ref: it,
1537
+ class: "relative w-full h-full",
1538
+ style: b({
1539
+ paddingLeft: m(Mt),
1540
+ transition: m(ct) ? "padding-left 200ms" : void 0
1541
+ }),
1542
+ onDragenter: Ln,
1543
+ onDragleave: Rn,
1544
+ onDragover: n[3] ||= e(() => {}, ["prevent"]),
1545
+ onDrop: e(zn, ["prevent"])
1546
+ }, [m(bt) > 0 ? (i(), y("div", mr, [k(p, { class: "w-10 h-10" }), w("span", hr, o(t.$t("views.recordings.image_drop_overlay")), 1)])) : f("", !0), w("div", gr, [
1547
+ m(U) ? f("", !0) : (i(), y("div", _r, [
1548
+ n[4] ||= w("div", { class: "ml-2" }, null, -1),
1549
+ m(he) ? f("", !0) : (i(), d(l, {
1550
+ key: 0,
1551
+ id: "recordings-sidebar-toggle",
1552
+ severity: "secondary",
1553
+ class: "mr-2 cui-icon-lg relative z-2",
1554
+ text: "",
1555
+ rounded: "",
1556
+ onClick: Dn
1557
+ }, {
1558
+ icon: g(() => [m(Ot) ? (i(), d(h, {
1559
+ key: 0,
1560
+ width: "100%",
1561
+ height: "100%"
1562
+ })) : (i(), d(v, {
1563
+ key: 1,
1564
+ width: "100%",
1565
+ height: "100%"
1566
+ }))]),
1567
+ _: 1
1568
+ })),
1569
+ w("h1", vr, o(t.$t("views.recordings.title")), 1),
1570
+ n[5] ||= w("div", { class: "gradient-blur rotate-180 !h-[70px]" }, [
1571
+ w("div"),
1572
+ w("div"),
1573
+ w("div"),
1574
+ w("div"),
1575
+ w("div"),
1576
+ w("div")
1577
+ ], -1)
1578
+ ])),
1579
+ m(U) ? f("", !0) : (i(), y("div", yr, [T((i(), d(l, {
1580
+ severity: "secondary",
1581
+ text: "",
1582
+ rounded: "",
1583
+ class: "cui-icon-lg relative z-2",
1584
+ onClick: n[1] ||= (e) => m(rt)?.toggleMenu(e)
1585
+ }, {
1586
+ icon: g(() => [k(u, {
1587
+ width: "100%",
1588
+ height: "100%"
1589
+ })]),
1590
+ _: 1
1591
+ })), [[
1592
+ R,
1593
+ { value: t.$t("views.recordings.view_options") },
1594
+ void 0,
1595
+ { bottom: !0 }
1596
+ ]])])),
1597
+ w("div", { class: c(["px-2 h-full w-full flex flex-col", {
1598
+ "pt-4": m(U),
1599
+ "pt-[calc(40px+2rem)]": !m(U)
1600
+ }]) }, [
1601
+ m($) ? (i(), d(S, {
1602
+ key: 0,
1603
+ crop: m(A)?.crop,
1604
+ "object-label": m(A)?.objectLabel,
1605
+ result: m(He),
1606
+ count: m(Qt).length,
1607
+ searching: m(Ue) || !m(K),
1608
+ "license-required": m(qe),
1609
+ onClose: m(M)
1610
+ }, null, 8, [
1611
+ "crop",
1612
+ "object-label",
1613
+ "result",
1614
+ "count",
1615
+ "searching",
1616
+ "license-required",
1617
+ "onClose"
1618
+ ])) : f("", !0),
1619
+ m(un).length ? (i(), d(O, {
1620
+ key: 1,
1621
+ ref_key: "gridRef",
1622
+ ref: q,
1623
+ items: m(un),
1624
+ "min-item-width": m(U) ? 160 : 180,
1625
+ gap: 8,
1626
+ "has-more": m(Bt) && !m($),
1627
+ "load-more": m(Ht),
1628
+ "item-key": (e) => e.key,
1629
+ class: "flex-1 min-h-0",
1630
+ style: { "--cui-scroll-end": "calc(var(--cui-bottom-gap) - 8px)" }
1631
+ }, {
1632
+ item: g(({ item: e }) => [e.episode ? (i(), d(E, {
1633
+ key: 0,
1634
+ episode: e.episode,
1635
+ "camera-by-id": m(Pt),
1636
+ fluid: "",
1637
+ "click-disabled": m(hn)
1638
+ }, null, 8, [
1639
+ "episode",
1640
+ "camera-by-id",
1641
+ "click-disabled"
1642
+ ])) : (i(), d(D, {
1643
+ key: 1,
1644
+ event: e.event,
1645
+ "camera-name": m(Nt).get(e.event.cameraId),
1646
+ camera: m(Pt).get(e.event.cameraId),
1647
+ "load-thumbnails": Mn,
1648
+ "semantic-score": m(Yt).get(e.event.id),
1649
+ "seg-index": e.segIndex,
1650
+ "selection-mode": m(hn) && e.event.state === "ended",
1651
+ selected: m(gn).has(e.event.id),
1652
+ "sibling-active": e.segIndex !== void 0 && m(St) === e.event.id,
1653
+ onSelect: (t) => m(Sn)(e.event.id),
1654
+ onScrollToEvent: (t) => Bn(e.event, t),
1655
+ onOpenTrace: (t) => Pn(e.event, t),
1656
+ onMouseenter: (t) => St.value = e.segIndex === void 0 ? null : e.event.id,
1657
+ onMouseleave: n[2] ||= (e) => St.value = null
1658
+ }, null, 8, [
1659
+ "event",
1660
+ "camera-name",
1661
+ "camera",
1662
+ "semantic-score",
1663
+ "seg-index",
1664
+ "selection-mode",
1665
+ "selected",
1666
+ "sibling-active",
1667
+ "onSelect",
1668
+ "onScrollToEvent",
1669
+ "onOpenTrace",
1670
+ "onMouseenter"
1671
+ ]))]),
1672
+ _: 1
1673
+ }, 8, [
1674
+ "items",
1675
+ "min-item-width",
1676
+ "has-more",
1677
+ "load-more",
1678
+ "item-key"
1679
+ ])) : m(en) ? (i(), d(O, {
1680
+ key: 2,
1681
+ items: m($e),
1682
+ "min-item-width": m(U) ? 160 : 180,
1683
+ gap: 8,
1684
+ "item-key": (e) => e,
1685
+ class: "flex-1 min-h-0 pointer-events-none"
1686
+ }, {
1687
+ item: g(() => [k(te, {
1688
+ width: "100%",
1689
+ height: "100%",
1690
+ class: "rounded-xl"
1691
+ })]),
1692
+ _: 1
1693
+ }, 8, [
1694
+ "items",
1695
+ "min-item-width",
1696
+ "item-key"
1697
+ ])) : f("", !0),
1698
+ m(en) && m(un).length && !m(q)?.loadingMore || m(ke) ? (i(), y("div", br, [k(N, {
1699
+ width: "24px",
1700
+ height: "24px",
1701
+ class: "text-muted"
1702
+ })])) : f("", !0),
1703
+ m(tn) ? (i(), y("div", xr, [
1704
+ k(P, { class: "w-12 h-12 text-muted" }),
1705
+ w("span", Sr, o(m(nn)), 1),
1706
+ m(Kt) && !m(Jt) && !m($) && !m(qt) ? (i(), d(l, {
1707
+ key: 0,
1708
+ severity: "secondary",
1709
+ class: "cui-button-small",
1710
+ label: t.$t("views.recordings.load_failed_retry"),
1711
+ onClick: m(Gt)
1712
+ }, null, 8, ["label", "onClick"])) : f("", !0)
1713
+ ])) : f("", !0)
1714
+ ], 2)
1715
+ ])], 36),
1716
+ m(pn) && m(Q).length ? (i(), y("div", {
1717
+ key: 0,
1718
+ class: c(["fixed z-10", m(jt) ? "scale-0 opacity-0" : "scale-100 opacity-100"]),
1719
+ style: b({
1720
+ left: m(jt) ? `calc(${m(Mt)} + 0.75rem + var(--safe-area-inset-left))` : `calc(${m(Tt)}px + ${m(Mt)} + 0.75rem)`,
1721
+ bottom: m(Dt),
1722
+ transition: m(ct) ? "left 200ms, transform 200ms ease-in-out, opacity 200ms ease-in-out" : void 0
1723
+ })
1724
+ }, [k(l, {
1725
+ severity: "secondary",
1726
+ rounded: "",
1727
+ class: "shadow-lg",
1728
+ disabled: m(C)?.running,
1729
+ label: m(ee) ? t.$t("views.recordings.reindex.checking") : m(C)?.running ? t.$t("views.recordings.reindex.progress", {
1730
+ done: m(C).done,
1731
+ total: m(C).total
1732
+ }) : t.$t("views.recordings.reindex.button"),
1733
+ onClick: Tn
1734
+ }, {
1735
+ icon: g(() => [m(C)?.running ? (i(), d(m(H), { key: 0 })) : (i(), d(m(_t), { key: 1 }))]),
1736
+ _: 1
1737
+ }, 8, ["disabled", "label"])], 6)) : f("", !0),
1738
+ m(Q).length ? (i(), d(L, {
1739
+ key: 1,
1740
+ "force-visible": m(hn),
1741
+ "scroll-y": m(q)?.scrollY ?? 0
1742
+ }, {
1743
+ default: g(() => [m(hn) ? (i(), y(x, { key: 1 }, [
1744
+ k(F, {
1745
+ grouped: "",
1746
+ "tooltip-props": { value: t.$t("components.form.tooltip.cancel_selection") },
1747
+ "button-props": { severity: "secondary" },
1748
+ icon: m(st),
1749
+ "icon-props": {
1750
+ width: "100%",
1751
+ height: "100%"
1752
+ },
1753
+ onClick: m(bn)
1754
+ }, null, 8, [
1755
+ "tooltip-props",
1756
+ "icon",
1757
+ "onClick"
1758
+ ]),
1759
+ k(F, {
1760
+ grouped: "",
1761
+ "tooltip-props": { value: m(_n) ? t.$t("components.form.tooltip.deselect_all") : t.$t("components.form.tooltip.select_all") },
1762
+ "button-props": { severity: m(_n) ? "primary" : "secondary" },
1763
+ icon: m(fe),
1764
+ "icon-props": {
1765
+ width: "100%",
1766
+ height: "100%"
1767
+ },
1768
+ onClick: m(xn)
1769
+ }, null, 8, [
1770
+ "tooltip-props",
1771
+ "button-props",
1772
+ "icon",
1773
+ "onClick"
1774
+ ]),
1775
+ k(F, {
1776
+ grouped: "",
1777
+ "tooltip-props": { value: t.$t("components.form.tooltip.delete_selected") },
1778
+ "button-props": {
1779
+ severity: "danger",
1780
+ disabled: !m(gn).size || m(vn)
1781
+ },
1782
+ icon: m(I),
1783
+ "icon-props": {
1784
+ width: "100%",
1785
+ height: "100%"
1786
+ },
1787
+ onClick: Cn
1788
+ }, null, 8, [
1789
+ "tooltip-props",
1790
+ "button-props",
1791
+ "icon"
1792
+ ])
1793
+ ], 64)) : (i(), y(x, { key: 0 }, [m(pn) && m(rn).length && !m($) ? (i(), d(F, {
1794
+ key: 0,
1795
+ grouped: "",
1796
+ "tooltip-props": { value: t.$t("views.recordings.select") },
1797
+ "button-props": { severity: "secondary" },
1798
+ icon: m(Ve),
1799
+ "icon-props": {
1800
+ width: "100%",
1801
+ height: "100%"
1802
+ },
1803
+ onClick: m(yn)
1804
+ }, null, 8, [
1805
+ "tooltip-props",
1806
+ "icon",
1807
+ "onClick"
1808
+ ])) : f("", !0), k(F, {
1809
+ grouped: "",
1810
+ "tooltip-props": { value: t.$t("views.recordings.export.title") },
1811
+ "button-props": { class: "text-white" },
1812
+ icon: m(ne),
1813
+ "icon-props": {
1814
+ width: "26px",
1815
+ height: "26px"
1816
+ },
1817
+ onClick: En
1818
+ }, null, 8, ["tooltip-props", "icon"])], 64))]),
1819
+ _: 1
1820
+ }, 8, ["force-visible", "scroll-y"])) : f("", !0),
1821
+ k(re, {
1822
+ ref_key: "viewMenuRef",
1823
+ ref: rt,
1824
+ items: m(wn),
1825
+ "auto-hide": !1,
1826
+ popover: { pt: {
1827
+ root: { class: "w-[22rem]" },
1828
+ content: { class: "p-0! rounded-xl! overflow-hidden!" }
1829
+ } }
1830
+ }, null, 8, ["items"])
1831
+ ]);
1832
+ };
1833
+ }
1834
+ }), [["__scopeId", "data-v-4ed7ce40"]]);
1835
+ //#endregion
1836
+ export { wr as default };