@camera.ui/server 2.2.5-beta.3 → 2.2.5

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 (645) hide show
  1. package/dist/interface/assets/{404-YZOLos9r.js → 404-CiOxoqnT.js} +1 -1
  2. package/dist/interface/assets/{About-HtxMc8JZ.js → About-DWOlfWEm.js} +1 -1
  3. package/dist/interface/assets/Assistant-B1xdMAkA.js +1 -0
  4. package/dist/interface/assets/{Assistant-BMscGKnc.css → Assistant-CXx7EY1W.css} +1 -1
  5. package/dist/interface/assets/{Automation-D3DcUyui.js → Automation-BJgwUkUB.js} +3 -3
  6. package/dist/interface/assets/{AutomationImport-Dp_hT6hQ.js → AutomationImport-9GRAndAt.js} +2 -2
  7. package/dist/interface/assets/{AutomationStore-BKR7GXMk.js → AutomationStore-D_HR2Xby.js} +2 -2
  8. package/dist/interface/assets/{AutomationStoreDetail-B9yh51WQ.js → AutomationStoreDetail-B9MxV2py.js} +2 -2
  9. package/dist/interface/assets/Automations-Bpw8olkc.js +2 -0
  10. package/dist/interface/assets/Camera-BpFfZDaS.js +2 -0
  11. package/dist/interface/assets/{CameraConsole-BI93OaRt.js → CameraConsole-BKPTLSTO.js} +1 -1
  12. package/dist/interface/assets/{Cameras-Ctub8sVt.js → Cameras-DcrVCgLy.js} +2 -2
  13. package/dist/interface/assets/Camview-C16pyCZk.js +1 -0
  14. package/dist/interface/assets/{Camview-CZct5cnP.css → Camview-DasO326h.css} +1 -1
  15. package/dist/interface/assets/{CertificateUpload-xW55NA1Q.js → CertificateUpload-BYFKZCP9.js} +1 -1
  16. package/dist/interface/assets/Config-BmEL5EaW.js +2 -0
  17. package/dist/interface/assets/{ConfigActionAssistant-B488rOp5.js → ConfigActionAssistant-DM4tIhoa.js} +1 -1
  18. package/dist/interface/assets/{ConfigActionCameraControl-ZMUuBxOs.js → ConfigActionCameraControl-Deo0eDPS.js} +1 -1
  19. package/dist/interface/assets/{ConfigActionDelay-BJ11xvOW.js → ConfigActionDelay-_EqbfWgo.js} +1 -1
  20. package/dist/interface/assets/{ConfigActionHttp-DOUo69OR.js → ConfigActionHttp-BxJmoshF.js} +1 -1
  21. package/dist/interface/assets/{ConfigActionImageInput-BMzuVZW9.js → ConfigActionImageInput-KrzXFQDm.js} +1 -1
  22. package/dist/interface/assets/{ConfigActionMqtt-Co_uksca.js → ConfigActionMqtt-BoYBomRC.js} +1 -1
  23. package/dist/interface/assets/{ConfigActionNotification-CcZkstYx.js → ConfigActionNotification-CSAOijDt.js} +1 -1
  24. package/dist/interface/assets/{ConfigActionNotificationControl--VeucoTw.js → ConfigActionNotificationControl-BOdyKiOs.js} +1 -1
  25. package/dist/interface/assets/{ConfigActionOutput-CyDa1LGA.js → ConfigActionOutput-CwsPcnd_.js} +1 -1
  26. package/dist/interface/assets/{ConfigActionPlugin-Kfg3ZEQF.js → ConfigActionPlugin-D3wyULpp.js} +1 -1
  27. package/dist/interface/assets/{ConfigActionSensor-DhAF0HPw.js → ConfigActionSensor-BmeaIxYY.js} +1 -1
  28. package/dist/interface/assets/{ConfigActionSnapshot-zMe3SPvW.js → ConfigActionSnapshot-DbyFKcYr.js} +1 -1
  29. package/dist/interface/assets/{ConfigActionVariable-BE5q3NwY.js → ConfigActionVariable-cThGJ1Pc.js} +1 -1
  30. package/dist/interface/assets/{ConfigConditionIfElse-BNIRtSVD.js → ConfigConditionIfElse-BugkJeXR.js} +1 -1
  31. package/dist/interface/assets/{ConfigConditionSensorState-DTNd-SzI.js → ConfigConditionSensorState-Bf-mMf4E.js} +1 -1
  32. package/dist/interface/assets/{ConfigConditionSwitch-BU5wWMU1.js → ConfigConditionSwitch-DcpFoYET.js} +1 -1
  33. package/dist/interface/assets/{ConfigConditionTime-KXTCIVIV.js → ConfigConditionTime-CM4bSMyU.js} +1 -1
  34. package/dist/interface/assets/{ConfigSensorValueInput-BC1FpMm-.js → ConfigSensorValueInput-CgAI34__.js} +1 -1
  35. package/dist/interface/assets/{ConfigTriggerDetection-hIN1hi53.js → ConfigTriggerDetection-BWK6gfwM.js} +1 -1
  36. package/dist/interface/assets/ConfigTriggerGeofence-Cm3CU7Tl.js +1 -0
  37. package/dist/interface/assets/{ConfigTriggerManual-C5vwxS-e.js → ConfigTriggerManual-DgkR-GWy.js} +1 -1
  38. package/dist/interface/assets/{ConfigTriggerMqtt-B4PtWC3E.js → ConfigTriggerMqtt-BMFjTAso.js} +1 -1
  39. package/dist/interface/assets/{ConfigTriggerSchedule-BZzUdGBa.js → ConfigTriggerSchedule-E_QWfNKy.js} +1 -1
  40. package/dist/interface/assets/{ConfigTriggerSensor-D18nwMsj.js → ConfigTriggerSensor-DOdJkZRo.js} +1 -1
  41. package/dist/interface/assets/{ConfigTriggerSystem-BhygWLB4.js → ConfigTriggerSystem-BFDIbZsE.js} +1 -1
  42. package/dist/interface/assets/{ConfigTriggerWebhook-yyuBuhLD.js → ConfigTriggerWebhook-DDoUEVHb.js} +1 -1
  43. package/dist/interface/assets/Console-BIj7cIqO.js +1 -0
  44. package/dist/interface/assets/CuiAssistantConversation-CRNCKRHz.js +5 -0
  45. package/dist/interface/assets/{CuiAssistantConversation-lkpZg3ML.css → CuiAssistantConversation-DQ0wOJvV.css} +1 -1
  46. package/dist/interface/assets/CuiAutomationRunsDialog-DMUfNcsf.js +1 -0
  47. package/dist/interface/assets/CuiBottomSheet-CYi5c3fP.js +1 -0
  48. package/dist/interface/assets/{CuiBottomSheet-DWefGWK2.js → CuiBottomSheet-FwsPnJ3n.js} +1 -1
  49. package/dist/interface/assets/{CuiCameraPipCard-C2qaGJlH.js → CuiCameraPipCard-Cb_Qbly6.js} +1 -1
  50. package/dist/interface/assets/CuiCameraRecordings-BeciatDY.js +1 -0
  51. package/dist/interface/assets/{CuiCameraShares-DcqOcePX.js → CuiCameraShares-CSFwIYsg.js} +1 -1
  52. package/dist/interface/assets/CuiCameraTable-BgL5FZso.js +1 -0
  53. package/dist/interface/assets/{CuiCameraTable-BOkfp_5M.js → CuiCameraTable-DBRfGX3I.js} +2 -2
  54. package/dist/interface/assets/{CuiChartTable-DP38uBwK.js → CuiChartTable-CtasoxMM.js} +1 -1
  55. package/dist/interface/assets/{CuiConsole-C7xE_nQg.js → CuiConsole-DQbAafiz.js} +2 -2
  56. package/dist/interface/assets/CuiDataTable-JlD7Agky.js +1 -0
  57. package/dist/interface/assets/{CuiLightControl-ChGYpQAK.js → CuiLightControl-CLYl5pfN.js} +1 -1
  58. package/dist/interface/assets/{CuiList-DJp0__mV.js → CuiList-Dsu5m0TA.js} +1 -1
  59. package/dist/interface/assets/{CuiMarkdownContent-BUYtK_wD.js → CuiMarkdownContent-BYBQX_aF.js} +1 -1
  60. package/dist/interface/assets/CuiMarkdownContent-DTAm-EDR.js +1 -0
  61. package/dist/interface/assets/{CuiPluginCard-CWImTZ6l.js → CuiPluginCard-CC1oXY16.js} +2 -2
  62. package/dist/interface/assets/{CuiPluginCategoryChip-Ch_upS6Y.js → CuiPluginCategoryChip-B2bR5LQa.js} +1 -1
  63. package/dist/interface/assets/{CuiPluginOAuthButton-DEQ9xILN.js → CuiPluginOAuthButton-DfEjfcY-.js} +2 -2
  64. package/dist/interface/assets/{CuiPluginTrustBadge-sVWdvHcM.js → CuiPluginTrustBadge-C6CW6Soh.js} +1 -1
  65. package/dist/interface/assets/{CuiQRCode-DqSF4SkD.js → CuiQRCode-DGKBhDib.js} +1 -1
  66. package/dist/interface/assets/CuiSchema-pAAVh28m.js +1 -0
  67. package/dist/interface/assets/{CuiTopNavbarItem-B_KWykgq.js → CuiTopNavbarItem-ve-3Dsc3.js} +1 -1
  68. package/dist/interface/assets/Faces-1xd5yGuO.js +1 -0
  69. package/dist/interface/assets/{FirstSteps-QNYTkEJo.js → FirstSteps-E9cMqa0a.js} +1 -1
  70. package/dist/interface/assets/Floorplan-BovV_ATh.js +1 -0
  71. package/dist/interface/assets/Instances-BbxyB7vR.js +1 -0
  72. package/dist/interface/assets/{Logs-BSPT80vP.js → Logs-BhRactvQ.js} +2 -2
  73. package/dist/interface/assets/{Menu-HHtuhIS2.js → Menu-DMCmUVDs.js} +1 -1
  74. package/dist/interface/assets/Metrics-BgXrNl38.js +12 -0
  75. package/dist/interface/assets/Metrics-ChVnC6f6.css +1 -0
  76. package/dist/interface/assets/{OAuthDeviceFlow-Bn1nlWNa.js → OAuthDeviceFlow-BMEwVkIa.js} +1 -1
  77. package/dist/interface/assets/Plugin-CDNywaVE.js +1 -0
  78. package/dist/interface/assets/Plugin-Qr_Q_Qfi.css +1 -0
  79. package/dist/interface/assets/{PluginConsole-Cv-uhnPY.js → PluginConsole-C4Ba_U_1.js} +1 -1
  80. package/dist/interface/assets/{PluginDetail-cpOz7FkA.js → PluginDetail-13OWIzdd.js} +2 -2
  81. package/dist/interface/assets/{PluginSchema-DW3TGeTM.js → PluginSchema-DN0cSU8s.js} +1 -1
  82. package/dist/interface/assets/PluginSearch-sPkO8aH3.js +2 -0
  83. package/dist/interface/assets/PluginSearch-xNIlfXk4.js +1 -0
  84. package/dist/interface/assets/{PluginUpdateProgress-n6q6vzyd.js → PluginUpdateProgress-CeWuRp3Z.js} +1 -1
  85. package/dist/interface/assets/Plugins-C8yjhxnQ.js +1 -0
  86. package/dist/interface/assets/{RecentEventsFilter-CTR5JK_P.js → RecentEventsFilter-Kp_lTOuG.js} +1 -1
  87. package/dist/interface/assets/Recordings-BHT8Vvv_.js +1 -0
  88. package/dist/interface/assets/Recordings-DwuojaAw.css +1 -0
  89. package/dist/interface/assets/SensorEdit-C-yJdJuP.js +1 -0
  90. package/dist/interface/assets/{SensorHistory-9CdOpCPs.js → SensorHistory-ClAcOgHj.js} +1 -1
  91. package/dist/interface/assets/Sensors-Cza4Et2c.js +2 -0
  92. package/dist/interface/assets/Settings-Cj0leoGd.js +1 -0
  93. package/dist/interface/assets/SettingsAccount-COkcBBSz.js +1 -0
  94. package/dist/interface/assets/SettingsAccount-DjrJdssy.js +1 -0
  95. package/dist/interface/assets/{SettingsAppearance-BY1xQMx4.js → SettingsAppearance-CJt4xJEW.js} +1 -1
  96. package/dist/interface/assets/SettingsAppearance-D20YW7Vq.js +1 -0
  97. package/dist/interface/assets/SettingsAssistant-CDdbbG-c.css +1 -0
  98. package/dist/interface/assets/SettingsAssistant-DKWDp1AI.js +1 -0
  99. package/dist/interface/assets/{SettingsBackup-D_weokqu.js → SettingsBackup-DIJmci05.js} +1 -1
  100. package/dist/interface/assets/{SettingsList-Bq24WTDU.js → SettingsList-Cb_dLy5T.js} +1 -1
  101. package/dist/interface/assets/SettingsMqtt-LIuCRPT5.js +1 -0
  102. package/dist/interface/assets/{SettingsNotifications-8TZOUxg2.js → SettingsNotifications-CZxqqH_8.js} +1 -1
  103. package/dist/interface/assets/{SettingsPermissions-M8u_jrN0.js → SettingsPermissions-CJiz0Z7B.js} +1 -1
  104. package/dist/interface/assets/{SettingsRecordings-C1Kp5xW_.js → SettingsRecordings-BEpwMh-y.js} +1 -1
  105. package/dist/interface/assets/SettingsRemote-DRt-N_yA.js +2 -0
  106. package/dist/interface/assets/{SettingsSystem-Cetu2faJ.js → SettingsSystem-Cncdpx8T.js} +2 -2
  107. package/dist/interface/assets/{SettingsUsers-CDwtQLdV.js → SettingsUsers-DZkz8WlI.js} +1 -1
  108. package/dist/interface/assets/Terminal-U4yfJN3O.js +4 -0
  109. package/dist/interface/assets/Training-Bkn52mPJ.css +1 -0
  110. package/dist/interface/assets/Training-DfgE_dA8.js +1 -0
  111. package/dist/interface/assets/Updates-cCvbFq3w.js +2 -0
  112. package/dist/interface/assets/{VariableInput-BxPj5wo6.js → VariableInput-PVsqGYW0.js} +1 -1
  113. package/dist/interface/assets/{VariableSuggestions-CbizvAkz.js → VariableSuggestions-DwLtlzVz.js} +1 -1
  114. package/dist/interface/assets/{VersionsHandler-CePyEUVO.js → VersionsHandler-Df7dhddp.js} +2 -2
  115. package/dist/interface/assets/{VirtualSensorCreate-D_GVoeL7.js → VirtualSensorCreate-FTKANjd-.js} +1 -1
  116. package/dist/interface/assets/Workers-Ba37_3cY.js +2 -0
  117. package/dist/interface/assets/{account-Bu30He0P.js → account-DwW7pBOb.js} +1 -1
  118. package/dist/interface/assets/{alert-circle-D2fAQwTX.js → alert-circle-BdUVAt1B.js} +1 -1
  119. package/dist/interface/assets/{alert-outline-D7zaSJH_.js → alert-outline-IRxYbw0j.js} +1 -1
  120. package/dist/interface/assets/api-C1mraOYr.js +4 -0
  121. package/dist/interface/assets/{api-DW2niHRN.js → api-DpqXhwcx.js} +1 -1
  122. package/dist/interface/assets/api-z8ZVnoOl.css +2 -0
  123. package/dist/interface/assets/{arrow-left-BGLyEqqa.js → arrow-left-Bk-ZrOVr.js} +1 -1
  124. package/dist/interface/assets/assistant-Lz3mFLDo.js +1 -0
  125. package/dist/interface/assets/{assistantModels-D0soYqq7.js → assistantModels-BsSgRsws.js} +1 -1
  126. package/dist/interface/assets/{auth-Dc8bUpc-.js → auth-L7_5vsJs.js} +1 -1
  127. package/dist/interface/assets/{automations-DXrjbArj.js → automations-D1XFFSrm.js} +1 -1
  128. package/dist/interface/assets/{back-filled-BPBVnQjx.js → back-filled-D-X19YMO.js} +1 -1
  129. package/dist/interface/assets/{bell-ring-CyCFPUL_.js → bell-ring-DreEHgoT.js} +1 -1
  130. package/dist/interface/assets/{brain-CIJB1ree.js → brain-DuDAg544.js} +1 -1
  131. package/dist/interface/assets/{cameraSources-QJfUDOQJ.js → cameraSources-DEGJDtmK.js} +1 -1
  132. package/dist/interface/assets/{cctv-D6kxZ-lp.js → cctv-DM-C_8_6.js} +1 -1
  133. package/dist/interface/assets/{check-circle-DHAAn6A6.js → check-circle-Bevuw8-0.js} +1 -1
  134. package/dist/interface/assets/{check-circle-outline-BbqeKfIK.js → check-circle-outline-aMxkvksr.js} +1 -1
  135. package/dist/interface/assets/{chevron-down-ZYTrU871.js → chevron-down-CCFn9Z56.js} +1 -1
  136. package/dist/interface/assets/{chevron-up-LQXNz9CE.js → chevron-up-CSImUM3_.js} +1 -1
  137. package/dist/interface/assets/{clock-outline-CKTiLKoR.js → clock-outline-DH3WIEJt.js} +1 -1
  138. package/dist/interface/assets/{close-BbEPZQqa.js → close-CMxyM4v9.js} +1 -1
  139. package/dist/interface/assets/{close-circle-BSUSUs4K.js → close-circle-CfgJCZ9A.js} +1 -1
  140. package/dist/interface/assets/{cloud-check-BTGbrAQ_.js → cloud-check-CbdFLIdR.js} +1 -1
  141. package/dist/interface/assets/cloudHandoff-DkUx4m3P.js +1 -0
  142. package/dist/interface/assets/{config-CiQDwB4t.js → config-CVqy37fG.js} +1 -1
  143. package/dist/interface/assets/{content-copy-V0DW9ZbH.js → content-copy-Bz49QPOI.js} +1 -1
  144. package/dist/interface/assets/{copy-DsmMEtSH.js → copy-DA6QQHRt.js} +1 -1
  145. package/dist/interface/assets/{cube-scan-DGhUFV1x.js → cube-scan-IiH8zwm2.js} +1 -1
  146. package/dist/interface/assets/database-refresh-outline-CIUDpcuq.js +1 -0
  147. package/dist/interface/assets/{delete-CY8fsIW6.js → delete-Btu-UVx9.js} +1 -1
  148. package/dist/interface/assets/{dist-DNyx_J8o.js → dist-D_qWDAKp.js} +1 -1
  149. package/dist/interface/assets/{dots-vertical-pP1vP0Qa.js → dots-vertical-D496SIss.js} +1 -1
  150. package/dist/interface/assets/{download-CyjJ7yJW.js → download-BSC7lwq_.js} +1 -1
  151. package/dist/interface/assets/esm-0kxqa_1s.js +1 -0
  152. package/dist/interface/assets/esm-4p_M5mFV.js +1 -0
  153. package/dist/interface/assets/esm-8G-vO1KQ.js +1 -0
  154. package/dist/interface/assets/esm-8cB56ICb.js +1 -0
  155. package/dist/interface/assets/esm-B92csSEb.js +1 -0
  156. package/dist/interface/assets/esm-BHiNTIiN.js +1 -0
  157. package/dist/interface/assets/esm-Bu9PMLmw.js +1 -0
  158. package/dist/interface/assets/esm-CS6Ra46d.js +1 -0
  159. package/dist/interface/assets/esm-CWvQWALL.js +1 -0
  160. package/dist/interface/assets/esm-D2UDrwmt.js +1 -0
  161. package/dist/interface/assets/esm-D8OHF2X1.js +1 -0
  162. package/dist/interface/assets/esm-DrXkS8eG.js +1 -0
  163. package/dist/interface/assets/esm-pfoHiO1a.js +1 -0
  164. package/dist/interface/assets/esm-tJSCF7Vh.js +1 -0
  165. package/dist/interface/assets/{eventIcons-cdzqQc0W.js → eventIcons-UQutPG3p.js} +1 -1
  166. package/dist/interface/assets/{eye-off-JCu1iUer.js → eye-off-CSU0U8g7.js} +1 -1
  167. package/dist/interface/assets/{eye-off-outline-GErp76H2.js → eye-off-outline-DCxLRGo_.js} +1 -1
  168. package/dist/interface/assets/{flowSchema-BRTZHQ1w.js → flowSchema-CppNBDy1.js} +1 -1
  169. package/dist/interface/assets/{help-circle-outline-G43EJuch.js → help-circle-outline-Cr_yNhPi.js} +1 -1
  170. package/dist/interface/assets/{history-CNJREqJG.js → history-anuCbp1T.js} +1 -1
  171. package/dist/interface/assets/{home-B-_OQpZ6.js → home-N3bDR1vX.js} +1 -1
  172. package/dist/interface/assets/{information-outline-Blt4EtWJ.js → information-outline-CMWIvLNB.js} +1 -1
  173. package/dist/interface/assets/{intercomService-BnA-FQ0Q.js → intercomService-CjoJaOZ7.js} +1 -1
  174. package/dist/interface/assets/{lan-C3jliANx.js → lan-CYXjdk7L.js} +1 -1
  175. package/dist/interface/assets/main-BK3kmiG2.js +3 -0
  176. package/dist/interface/assets/{main-BoGhBedC.css → main-Bo0Lb1y2.css} +1 -1
  177. package/dist/interface/assets/{microphone-B6xc9JQ2.js → microphone-BB2pATI_.js} +1 -1
  178. package/dist/interface/assets/{minus-BI5qXFwJ.js → minus-BCp3ZNKO.js} +1 -1
  179. package/dist/interface/assets/{mqtt-iD9XHYO_.js → mqtt-BENV9Fx4.js} +1 -1
  180. package/dist/interface/assets/native-BEkWOGyD.js +1 -0
  181. package/dist/interface/assets/native-ugMg173F.js +1 -0
  182. package/dist/interface/assets/{nodeDefinitions-Dop49tx8.js → nodeDefinitions-ByrqsENY.js} +1 -1
  183. package/dist/interface/assets/{notifications-CbAJX7RF.js → notifications-By40oPng.js} +1 -1
  184. package/dist/interface/assets/{pause-DKzvPG2b.js → pause-BQlxwAW2.js} +1 -1
  185. package/dist/interface/assets/{pencil-DKbi9SsG.js → pencil-CDsNnEXi.js} +1 -1
  186. package/dist/interface/assets/{pencil-outline-CD3Xv98d.js → pencil-outline-CIQL5Kui.js} +1 -1
  187. package/dist/interface/assets/plugin-eafNQWg2.js +1 -0
  188. package/dist/interface/assets/{plugins-eIUrXNeM.js → plugins-09rEDbMz.js} +1 -1
  189. package/dist/interface/assets/{plus-CHPYoMO_.js → plus-Bp4q9G7S.js} +1 -1
  190. package/dist/interface/assets/{plus--kDl8ben.js → plus-CySoovdr.js} +1 -1
  191. package/dist/interface/assets/{power-C9wmNlFS.js → power-WmBLDR0-.js} +1 -1
  192. package/dist/interface/assets/{radar-B3ra28GD.js → radar-CyYAmume.js} +1 -1
  193. package/dist/interface/assets/{refresh-DfqyhMOh.js → refresh-CHTA3jVN.js} +1 -1
  194. package/dist/interface/assets/{restore-FMacmqd_.js → restore-C8RNM5yX.js} +1 -1
  195. package/dist/interface/assets/{rooms-BqPyo8jc.js → rooms-LBxn-Uuu.js} +1 -1
  196. package/dist/interface/assets/{round-alt-arrow-left-bold-56eF9Bol.js → round-alt-arrow-left-bold-Gh5mi_yR.js} +1 -1
  197. package/dist/interface/assets/{search-BXbDWhLk.js → search-BajCVmOI.js} +1 -1
  198. package/dist/interface/assets/sensorIcons-Csu5s0uk.js +1 -0
  199. package/dist/interface/assets/{sensorSlots-BZCXtnb6.js → sensorSlots-CtbKmsGG.js} +1 -1
  200. package/dist/interface/assets/{sensors-DttBNEEt.js → sensors-CbzNs18A.js} +1 -1
  201. package/dist/interface/assets/{server-DUFhf2c_.js → server-Btp5KILd.js} +1 -1
  202. package/dist/interface/assets/{settings-Cw63SIJl.js → settings-DnksaK7m.js} +1 -1
  203. package/dist/interface/assets/{source-branch-oyzrlfCD.js → source-branch-CzqIPffP.js} +1 -1
  204. package/dist/interface/assets/{theme-BMmjtQ4w.js → theme-GhzGwpqd.js} +1 -1
  205. package/dist/interface/assets/{trash-2-BQc04l9M.js → trash-2-DJeEhHf4.js} +1 -1
  206. package/dist/interface/assets/{trash-can-outline-Bk5eENNM.js → trash-can-outline-DrT6iw7I.js} +1 -1
  207. package/dist/interface/assets/{trash-fill-CXk8BmtF.js → trash-fill-Bb_-UicM.js} +1 -1
  208. package/dist/interface/assets/{trash2-2rUvghml.js → trash2-Dsl8gfxq.js} +1 -1
  209. package/dist/interface/assets/types-BAwhu9iv.js +1 -0
  210. package/dist/interface/assets/{types-DWTSNJ79.js → types-CklFkUXk.js} +1 -1
  211. package/dist/interface/assets/{types-CXw7CEzu.js → types-D8QWPhe-.js} +1 -1
  212. package/dist/interface/assets/{undo-Dcf7vcsv.js → undo-DoqJW-k7.js} +1 -1
  213. package/dist/interface/assets/ungrouped-BMk56E3L.js +1 -0
  214. package/dist/interface/assets/{ungrouped-DHMJ9Rg1.css → ungrouped-BnQIcSQd.css} +1 -1
  215. package/dist/interface/assets/{updates-TIPWXKzL.js → updates-CGo0T4sn.js} +1 -1
  216. package/dist/interface/assets/{upload-nnbfDypK.js → upload-C3w1XH-o.js} +1 -1
  217. package/dist/interface/assets/{upload-B-ZYPekV.js → upload-DtIcwiNC.js} +1 -1
  218. package/dist/interface/assets/{useAppVersion-BIz44Bg4.js → useAppVersion-CJlexqyz.js} +1 -1
  219. package/dist/interface/assets/{useAssistantActions-CLkkw9kB.js → useAssistantActions-Cc_O6M9_.js} +1 -1
  220. package/dist/interface/assets/useBackupRestore-_s8vS5WF.js +1 -0
  221. package/dist/interface/assets/{useCameraOptions-A97teAIr.js → useCameraOptions-CFISVNgk.js} +1 -1
  222. package/dist/interface/assets/{useKeyboardInset-DXVi1dLG.js → useKeyboardInset-DkUn62i7.js} +1 -1
  223. package/dist/interface/assets/{useLogsSocket-BlFxVXjF.js → useLogsSocket-D-ndWAg0.js} +1 -1
  224. package/dist/interface/assets/{useNavLayout-C5obaCNv.js → useNavLayout-CG0X_3kt.js} +1 -1
  225. package/dist/interface/assets/{usePermissions-C8hB_pG1.js → usePermissions-BXTw4tII.js} +1 -1
  226. package/dist/interface/assets/{usePluginUpdates-DO0-Gk4Q.js → usePluginUpdates-nW_dt66E.js} +1 -1
  227. package/dist/interface/assets/{usePushRegistration-BUttCraQ.js → usePushRegistration-DCqOAxR4.js} +2 -2
  228. package/dist/interface/assets/{useServerRestart-Cz9eVHUE.js → useServerRestart-CxJGxAcU.js} +1 -1
  229. package/dist/interface/assets/{useStreamStatus-BhS_MCCB.js → useStreamStatus-CXb1HbAq.js} +1 -1
  230. package/dist/interface/assets/{useTabSwipe-D4k8lm1M.js → useTabSwipe-DHb8__wU.js} +1 -1
  231. package/dist/interface/assets/{useUpdateChannel-D9lhfW0y.js → useUpdateChannel-BR4PMh1R.js} +1 -1
  232. package/dist/interface/assets/{useUpdatesSocket-DnH9sON5.js → useUpdatesSocket-DKDRZhvc.js} +1 -1
  233. package/dist/interface/assets/useUserOptions-lyc4WJ4L.js +1 -0
  234. package/dist/interface/assets/{variable-CcE0ZwTr.js → variable-ywTlRfo5.js} +1 -1
  235. package/dist/interface/assets/{vendor-cameraui-QXD8jkcj.js → vendor-cameraui-CK4yHsJi.js} +45 -45
  236. package/dist/interface/assets/{vendor-capacitor-COL6Kz75.js → vendor-capacitor-f9ShAzys.js} +2 -2
  237. package/dist/interface/assets/{vendor-chart-80wrH3md.js → vendor-chart-DBK083Hu.js} +1 -1
  238. package/dist/interface/assets/{vendor-core-CnhnyKDl.js → vendor-core-B-Q4es-f.js} +1 -1
  239. package/dist/interface/assets/{vendor-dnd-CEJS9JKU.js → vendor-dnd-DGQLvX6Y.js} +1 -1
  240. package/dist/interface/assets/{vendor-draggabilly-BY7O1F_Z.js → vendor-draggabilly-D8CK6M-y.js} +1 -1
  241. package/dist/interface/assets/{vendor-DGke_6M4.js → vendor-gFkr2qsZ.js} +1 -1
  242. package/dist/interface/assets/vendor-gridstack-DtDG3os6.js +3 -0
  243. package/dist/interface/assets/{vendor-markdown-DD4teg2u.js → vendor-markdown-qHIinIUE.js} +1 -1
  244. package/dist/interface/assets/{vendor-primevue-CCUqY55W.js → vendor-primevue-Cmp3VjIC.js} +72 -72
  245. package/dist/interface/assets/{vendor-vueflow-Bmwd2les.js → vendor-vueflow-bSwRZ9X8.js} +1 -1
  246. package/dist/interface/assets/web-3OOGlctS.js +1 -0
  247. package/dist/interface/assets/web-5NFVd9gs.js +1 -0
  248. package/dist/interface/assets/web-A4yovlXr.js +1 -0
  249. package/dist/interface/assets/web-BBC3YoWX.js +1 -0
  250. package/dist/interface/assets/web-B_9Qyt8E.js +1 -0
  251. package/dist/interface/assets/web-BjKL51lK-DUIsII0n.js +1 -0
  252. package/dist/interface/assets/web-C2-YAfsx.js +1 -0
  253. package/dist/interface/assets/web-CUL_MhvM.js +1 -0
  254. package/dist/interface/assets/web-CZVCXYLV.js +1 -0
  255. package/dist/interface/assets/web-DJ-LUxlV.js +1 -0
  256. package/dist/interface/assets/web-DNsEGLGS.js +1 -0
  257. package/dist/interface/assets/web-DZsU0QT_.js +1 -0
  258. package/dist/interface/assets/web-MoyOTbiU.js +1 -0
  259. package/dist/interface/assets/web-avRH_3t7.js +1 -0
  260. package/dist/interface/assets/{webhook-oVbP79Yk.js → webhook-CWKf2Qxu.js} +1 -1
  261. package/dist/interface/assets/workbox-window.prod.es5-BEYAF-e-.js +1 -0
  262. package/dist/interface/assets/{zoom-in-GKNy8xA7.js → zoom-in-CHkXAWHy.js} +1 -1
  263. package/dist/interface/ha/{404-DLhJqxRl.js → 404-B2T8Gktj.js} +1 -1
  264. package/dist/interface/ha/{About-DC0i1iE4.js → About-CrTKzU9_.js} +6 -6
  265. package/dist/interface/ha/{Assistant-BmazMPIg.js → Assistant-BDHJmYx_.js} +823 -820
  266. package/dist/interface/ha/{Automation-gabF9YzQ.js → Automation-Czo5EsAg.js} +337 -337
  267. package/dist/interface/ha/{AutomationImport-DaqZNs9s.js → AutomationImport-CuFAQbiX.js} +6 -6
  268. package/dist/interface/ha/{AutomationStore-DzM4huo5.js → AutomationStore-D-6x0JIt.js} +16 -16
  269. package/dist/interface/ha/{AutomationStoreDetail-CpzQMt_D.js → AutomationStoreDetail-Dad4q1MN.js} +19 -19
  270. package/dist/interface/ha/{Automations-Dcm4Us50.js → Automations-C-oGM5SR.js} +71 -71
  271. package/dist/interface/ha/{Camera-CNK3QR7l.js → Camera-CerkQGbZ.js} +214 -214
  272. package/dist/interface/ha/{CameraConsole-CpcF0411.js → CameraConsole-hRGwbjsD.js} +3 -3
  273. package/dist/interface/ha/{Cameras-Cf9rwRyf.js → Cameras-Bk5TFXA8.js} +92 -92
  274. package/dist/interface/ha/{Camview-BFKR2t6C.js → Camview-CsKKqxxY.js} +382 -382
  275. package/dist/interface/ha/{Config-1XH3zfr2.js → Config-Vl4-K3A_.js} +11 -11
  276. package/dist/interface/ha/{ConfigActionAssistant-C0-NFoTB.js → ConfigActionAssistant-OWUX8glZ.js} +4 -4
  277. package/dist/interface/ha/{ConfigActionCameraControl-DNSKZPSZ.js → ConfigActionCameraControl-DEaOot8w.js} +3 -3
  278. package/dist/interface/ha/{ConfigActionHttp-DVJAcGkl.js → ConfigActionHttp-CSr2BpKL.js} +2 -2
  279. package/dist/interface/ha/{ConfigActionImageInput-VVbHHHZs.js → ConfigActionImageInput--O8Tyca-.js} +1 -1
  280. package/dist/interface/ha/{ConfigActionMqtt-N5OUJDzM.js → ConfigActionMqtt-DQJ4-gs2.js} +4 -4
  281. package/dist/interface/ha/{ConfigActionNotification-s142tQoU.js → ConfigActionNotification-wR8CCA_T.js} +3 -3
  282. package/dist/interface/ha/{ConfigActionNotificationControl-Dh7kaKVP.js → ConfigActionNotificationControl-DNMrHwPz.js} +2 -2
  283. package/dist/interface/ha/{ConfigActionOutput-B4HHTg5C.js → ConfigActionOutput-C-LVFxFP.js} +1 -1
  284. package/dist/interface/ha/{ConfigActionPlugin-D20G2Dqf.js → ConfigActionPlugin-BCREAkNo.js} +5 -5
  285. package/dist/interface/ha/{ConfigActionSensor-BS3jrFaG.js → ConfigActionSensor-D48CQ6qR.js} +5 -5
  286. package/dist/interface/ha/{ConfigActionSnapshot-CInLAcwK.js → ConfigActionSnapshot-DpDy88Mg.js} +2 -2
  287. package/dist/interface/ha/{ConfigActionVariable-C5vADGNF.js → ConfigActionVariable-D9BxmwvB.js} +1 -1
  288. package/dist/interface/ha/{ConfigConditionIfElse-CPeWDD31.js → ConfigConditionIfElse-CW42tQFY.js} +3 -3
  289. package/dist/interface/ha/{ConfigConditionSensorState-BM5GmpN6.js → ConfigConditionSensorState-BZpij7kB.js} +4 -4
  290. package/dist/interface/ha/{ConfigConditionSwitch-Dmz9FduJ.js → ConfigConditionSwitch-DlTuJ9Sf.js} +5 -5
  291. package/dist/interface/ha/{ConfigSensorValueInput-Ch5njvtv.js → ConfigSensorValueInput-2QLHESlE.js} +5 -5
  292. package/dist/interface/ha/{ConfigTriggerDetection-BR2QWNyO.js → ConfigTriggerDetection-DPmUkmUJ.js} +3 -3
  293. package/dist/interface/ha/{ConfigTriggerGeofence-CaImOjyW.js → ConfigTriggerGeofence--T9OXhGl.js} +2 -2
  294. package/dist/interface/ha/{ConfigTriggerMqtt-DWz1XwZQ.js → ConfigTriggerMqtt-fZn_X6yY.js} +1 -1
  295. package/dist/interface/ha/{ConfigTriggerSensor-lfnhz0im.js → ConfigTriggerSensor-_3O6iBFX.js} +1 -1
  296. package/dist/interface/ha/{ConfigTriggerSystem-CwUhyFAj.js → ConfigTriggerSystem-CC9lqi8Q.js} +2 -2
  297. package/dist/interface/ha/{ConfigTriggerWebhook-J6Xts7GQ.js → ConfigTriggerWebhook-BuBcgXqf.js} +1 -1
  298. package/dist/interface/ha/{Console-BSdKFm6Y.js → Console-DNc49UEt.js} +13 -13
  299. package/dist/interface/ha/{CuiAutomationRunsDialog-BU8sympp.js → CuiAutomationRunsDialog-Dj_iiZht.js} +2 -2
  300. package/dist/interface/ha/{CuiBottomSheet-Bnp7ta7V.js → CuiBottomSheet-DG7wOV7m.js} +1 -1
  301. package/dist/interface/ha/{CuiCameraRecordings-E-mMqKSs.js → CuiCameraRecordings-BlOZTfQ4.js} +12 -12
  302. package/dist/interface/ha/{CuiCameraShares-DcNwd2OC.js → CuiCameraShares-BOn-mobi.js} +2 -2
  303. package/dist/interface/ha/{CuiCameraTable-DNW9Vm_A.js → CuiCameraTable-D50FLiK8.js} +9 -9
  304. package/dist/interface/ha/{CuiChartTable-muC7jL2H.js → CuiChartTable-CfcVRvdZ.js} +42 -42
  305. package/dist/interface/ha/{CuiConsole-ND8bcuTg.js → CuiConsole-UpN0Wihm.js} +6 -6
  306. package/dist/interface/ha/{CuiDataTable-CN4T8DgP.js → CuiDataTable-CpADXKNF.js} +6 -6
  307. package/dist/interface/ha/{CuiPluginCard-nIQiyQvH.js → CuiPluginCard-CT6ZfL9o.js} +52 -52
  308. package/dist/interface/ha/{CuiPluginOAuthButton-FJ49NfUh.js → CuiPluginOAuthButton-BJVKd6Ac.js} +6 -6
  309. package/dist/interface/ha/{CuiPluginTrustBadge-D6eanMyI.js → CuiPluginTrustBadge-gb9GI24w.js} +3 -3
  310. package/dist/interface/ha/{CuiQRCode-BdJzeeoE.js → CuiQRCode-DqKDx9zR.js} +7 -7
  311. package/dist/interface/ha/{CuiSchema-DY0V-8xP.js → CuiSchema-CHeJkx0k.js} +129 -129
  312. package/dist/interface/ha/{CuiTopNavbarItem-DT5pAKHp.js → CuiTopNavbarItem-CFeI6ZYU.js} +5 -5
  313. package/dist/interface/ha/Faces-CTfvhhCj.js +1441 -0
  314. package/dist/interface/ha/{FirstSteps-yS2M2cor.js → FirstSteps-C-WXJ8IL.js} +80 -80
  315. package/dist/interface/ha/{Floorplan-DSOeScjI.js → Floorplan-CDKTYN7B.js} +307 -307
  316. package/dist/interface/ha/{Instances-B4h5EKpF.js → Instances-n23yvN3L.js} +62 -62
  317. package/dist/interface/ha/{Logs-BH0Lxvs6.js → Logs-Dfm0BWOQ.js} +10 -10
  318. package/dist/interface/ha/{Menu-COH7QXuE.js → Menu-76kvdAEF.js} +15 -15
  319. package/dist/interface/ha/{Metrics-BtnRqL_I.js → Metrics-lnivlTWm.js} +101 -100
  320. package/dist/interface/ha/{OAuthDeviceFlow-D2QJ9MnP.js → OAuthDeviceFlow-4ChaymHu.js} +7 -7
  321. package/dist/interface/ha/{Plugin-EfUSqwyh.js → Plugin-BV8YA8aN.js} +486 -347
  322. package/dist/interface/ha/{PluginConsole-hh_o15f7.js → PluginConsole-csf1Km7f.js} +4 -4
  323. package/dist/interface/ha/{PluginDetail-DFiXGkrY.js → PluginDetail-DTff6cbA.js} +185 -185
  324. package/dist/interface/ha/{PluginSearch-Cdrfubrj.js → PluginSearch-CdjxmFPN.js} +116 -116
  325. package/dist/interface/ha/{PluginUpdateProgress-BD2g2kVj.js → PluginUpdateProgress-ClyF4pbA.js} +3 -3
  326. package/dist/interface/ha/{Plugins-qFiHW-Nk.js → Plugins-_xOrqP36.js} +34 -34
  327. package/dist/interface/ha/{RecentEventsFilter-UWrXnvfq.js → RecentEventsFilter-9ZkDHD1g.js} +1 -1
  328. package/dist/interface/ha/{Recordings-BzeC6tOz.js → Recordings-dTZv0pkp.js} +483 -458
  329. package/dist/interface/ha/{SensorEdit-BSgy7lkZ.js → SensorEdit-DDRkZjmm.js} +40 -40
  330. package/dist/interface/ha/{SensorHistory-IDvP8LKH.js → SensorHistory-DSGlRITr.js} +2 -2
  331. package/dist/interface/ha/{Sensors-Diqp4oZ0.js → Sensors-DjhGRUzM.js} +477 -462
  332. package/dist/interface/ha/{Settings-BgDsxAlx.js → Settings-DYuvz4de.js} +17 -17
  333. package/dist/interface/ha/{SettingsAccount-DBXMQPYk.js → SettingsAccount-DQAo8SnK.js} +146 -146
  334. package/dist/interface/ha/{SettingsAppearance-VmbjnT3o.js → SettingsAppearance-_tbhpUA0.js} +8 -8
  335. package/dist/interface/ha/{SettingsAssistant-C2R4ZetE.js → SettingsAssistant-DSf-dYuD.js} +656 -533
  336. package/dist/interface/ha/{SettingsBackup-BqY9TwYn.js → SettingsBackup-wLOa7xtw.js} +40 -40
  337. package/dist/interface/ha/{SettingsList-CzHcfo2N.js → SettingsList-CYujivw5.js} +4 -4
  338. package/dist/interface/ha/{SettingsMqtt-DqV3h3Ow.js → SettingsMqtt-DbxJ-h3J.js} +115 -115
  339. package/dist/interface/ha/{SettingsNotifications-yn5fIR_7.js → SettingsNotifications-DO2-KJvq.js} +118 -118
  340. package/dist/interface/ha/{SettingsRecordings-DDs1lyfY.js → SettingsRecordings-C47i1UhI.js} +9 -9
  341. package/dist/interface/ha/{SettingsRemote-jBw3l5E0.js → SettingsRemote-BPvb-KLI.js} +335 -335
  342. package/dist/interface/ha/{SettingsSystem-BOv9hNlk.js → SettingsSystem-BJPrv9JE.js} +9 -9
  343. package/dist/interface/ha/{SettingsUsers-Biv-2F4C.js → SettingsUsers-CcpCz6Y1.js} +89 -89
  344. package/dist/interface/ha/{Terminal-CmcrGEV0.js → Terminal-DT7-WNH1.js} +16 -16
  345. package/dist/interface/ha/Training-CqGBf8k1.js +1694 -0
  346. package/dist/interface/ha/{Updates-DJAcmDQJ.js → Updates-CgdrqX6R.js} +13 -13
  347. package/dist/interface/ha/{VariableInput-DlYg7t0m.js → VariableInput-DOzSFgxT.js} +1 -1
  348. package/dist/interface/ha/{VersionsHandler-UnrAWn-b.js → VersionsHandler-ItklhE2t.js} +10 -10
  349. package/dist/interface/ha/{VirtualSensorCreate-CssxeaCC.js → VirtualSensorCreate-DbS3VqHC.js} +2 -2
  350. package/dist/interface/ha/{Workers-CLpqLugC.js → Workers-6PU7yUv1.js} +36 -36
  351. package/dist/interface/ha/{api-BP7mlzjP.js → api-Dv3Lk_g5.js} +8832 -8608
  352. package/dist/interface/ha/{api-B_tDa73J.js → api-anWolhVj.js} +3 -3
  353. package/dist/interface/ha/{assistant-Cb6ACguQ.js → assistant-B3m0Kgev.js} +101 -97
  354. package/dist/interface/ha/{auth-DOYDRgFm.js → auth-CAkpM_7A.js} +33 -33
  355. package/dist/interface/ha/{automationBlueprint-CbbG_ku4.js → automationBlueprint-DwVvbKbw.js} +4 -4
  356. package/dist/interface/ha/cameraui-cards.js +1 -1
  357. package/dist/interface/ha/{cards-BpBP1zVW.js → cards-B0qagpBw.js} +743 -667
  358. package/dist/interface/ha/{config-DroY1HBs.js → config-C20itAPE.js} +14 -14
  359. package/dist/interface/ha/database-refresh-outline-PiqlCkA7.js +19 -0
  360. package/dist/interface/ha/{dist-BTp4AyuI.js → dist-BIngHzHx.js} +5 -5
  361. package/dist/interface/ha/{dist-C6MBHJhs.js → dist-oFWkn6pD.js} +5 -8
  362. package/dist/interface/ha/{mqtt-NJTVdd53.js → mqtt-C6JvkA5E.js} +14 -14
  363. package/dist/interface/ha/{notifications-BPTvvgvv.js → notifications-gLmNZxwZ.js} +19 -19
  364. package/dist/interface/ha/{pinia-C6gt7A_Q.js → pinia-Du8AM917.js} +639 -625
  365. package/dist/interface/ha/{plugins-B29K3nQP.js → plugins-6x0kBuQb.js} +53 -53
  366. package/dist/interface/ha/{rooms-DLw0WUy_.js → rooms-C-mLT6mX.js} +11 -11
  367. package/dist/interface/ha/{server-B4b5_Ecu.js → server-DuikIt69.js} +28 -28
  368. package/dist/interface/ha/{types-DJHHL7nn.js → types-C0NcQ4Cz.js} +49 -38
  369. package/dist/interface/ha/{types-XqA3YJPD.js → types-wLECk3Ml.js} +3 -1
  370. package/dist/interface/ha/{ungrouped-xyK1QrsM.js → ungrouped-ooCH0Izh.js} +120 -120
  371. package/dist/interface/ha/{updates-XFSu9Tfm.js → updates-H8MlOQLC.js} +36 -36
  372. package/dist/interface/ha/{useAppVersion-BH3rU1zz.js → useAppVersion-DAUCV_cn.js} +1 -1
  373. package/dist/interface/ha/{useLogsSocket-CaTRzvgU.js → useLogsSocket-BOLAXPuD.js} +1 -1
  374. package/dist/interface/ha/{useNavLayout-DV0_OQx0.js → useNavLayout-B7VoHzM1.js} +2 -2
  375. package/dist/interface/ha/{useServerRestart-C8tynLUf.js → useServerRestart-qSH0bqwY.js} +1 -1
  376. package/dist/interface/ha/{useTabSwipe-CFoLDp3j.js → useTabSwipe-DYzG_gVG.js} +1 -1
  377. package/dist/interface/ha/{useUpdateChannel-DSG2RTPe.js → useUpdateChannel-CK7JiWbG.js} +2 -2
  378. package/dist/interface/ha/{useUpdatesSocket-CSQ0g7-6.js → useUpdatesSocket-DrqkGMuR.js} +1 -1
  379. package/dist/interface/ha/{useUserOptions-CFaCy6L1.js → useUserOptions-BteVUdaT.js} +1 -1
  380. package/dist/interface/index.html +70 -70
  381. package/dist/interface/sw.js +1 -1
  382. package/dist/server/package.json +28 -28
  383. package/dist/server/requirements.txt +2 -2
  384. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/__init__.py +44 -0
  385. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/config.py +2 -0
  386. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/detection.py +7 -2
  387. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/__init__.py +42 -0
  388. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/assistant_models.py +300 -0
  389. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/contract.py +9 -0
  390. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/helper.py +21 -0
  391. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/interfaces.py +80 -4
  392. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/__init__.py +6 -0
  393. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/base.py +2 -0
  394. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/face.py +3 -7
  395. package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/face_embedder.py +69 -0
  396. package/dist/server/src/api/controllers/assistant.controller.js +1 -1
  397. package/dist/server/src/api/controllers/assistant.controller.js.map +1 -1
  398. package/dist/server/src/api/database/index.d.ts +1 -1
  399. package/dist/server/src/api/database/index.js +1 -1
  400. package/dist/server/src/api/database/migrations/v2-2-5.d.ts +3 -0
  401. package/dist/server/src/api/database/migrations/v2-2-5.js +19 -0
  402. package/dist/server/src/api/database/migrations/v2-2-5.js.map +1 -0
  403. package/dist/server/src/api/database/record-schemas.d.ts +4 -2
  404. package/dist/server/src/api/database/record-schemas.js +4 -1
  405. package/dist/server/src/api/database/record-schemas.js.map +1 -1
  406. package/dist/server/src/api/database/types.d.ts +5 -1
  407. package/dist/server/src/api/schemas/assistant.schema.d.ts +21 -7
  408. package/dist/server/src/api/schemas/assistant.schema.js +4 -1
  409. package/dist/server/src/api/schemas/assistant.schema.js.map +1 -1
  410. package/dist/server/src/api/schemas/cameras.schema.d.ts +56 -8
  411. package/dist/server/src/api/schemas/cameras.schema.js +4 -3
  412. package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
  413. package/dist/server/src/api/services/assistant.service.d.ts +1 -1
  414. package/dist/server/src/api/services/assistant.service.js +4 -1
  415. package/dist/server/src/api/services/assistant.service.js.map +1 -1
  416. package/dist/server/src/api/services/cameras.service.js +2 -2
  417. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  418. package/dist/server/src/api/websocket/nsp/logs.js +3 -3
  419. package/dist/server/src/api/websocket/nsp/logs.js.map +1 -1
  420. package/dist/server/src/api/websocket/nsp/worker-perf.js +13 -0
  421. package/dist/server/src/api/websocket/nsp/worker-perf.js.map +1 -1
  422. package/dist/server/src/api/websocket/types.d.ts +12 -0
  423. package/dist/server/src/assistant/budget.d.ts +27 -0
  424. package/dist/server/src/assistant/budget.js +118 -0
  425. package/dist/server/src/assistant/budget.js.map +1 -0
  426. package/dist/server/src/assistant/compaction.d.ts +10 -0
  427. package/dist/server/src/assistant/compaction.js +83 -0
  428. package/dist/server/src/assistant/compaction.js.map +1 -0
  429. package/dist/server/src/assistant/docs.js +4 -3
  430. package/dist/server/src/assistant/docs.js.map +1 -1
  431. package/dist/server/src/assistant/history.d.ts +1 -0
  432. package/dist/server/src/assistant/history.js +28 -0
  433. package/dist/server/src/assistant/history.js.map +1 -1
  434. package/dist/server/src/assistant/manager.d.ts +10 -0
  435. package/dist/server/src/assistant/manager.js +261 -62
  436. package/dist/server/src/assistant/manager.js.map +1 -1
  437. package/dist/server/src/assistant/plugin-models.d.ts +34 -0
  438. package/dist/server/src/assistant/plugin-models.js +266 -0
  439. package/dist/server/src/assistant/plugin-models.js.map +1 -0
  440. package/dist/server/src/assistant/prompt.d.ts +7 -1
  441. package/dist/server/src/assistant/prompt.js +75 -11
  442. package/dist/server/src/assistant/prompt.js.map +1 -1
  443. package/dist/server/src/assistant/providers.js +7 -3
  444. package/dist/server/src/assistant/providers.js.map +1 -1
  445. package/dist/server/src/assistant/recap.d.ts +3 -0
  446. package/dist/server/src/assistant/recap.js +65 -0
  447. package/dist/server/src/assistant/recap.js.map +1 -0
  448. package/dist/server/src/assistant/registry.d.ts +16 -1
  449. package/dist/server/src/assistant/registry.js +49 -1
  450. package/dist/server/src/assistant/registry.js.map +1 -1
  451. package/dist/server/src/assistant/retry.js +38 -24
  452. package/dist/server/src/assistant/retry.js.map +1 -1
  453. package/dist/server/src/assistant/router.d.ts +7 -0
  454. package/dist/server/src/assistant/router.js +67 -0
  455. package/dist/server/src/assistant/router.js.map +1 -0
  456. package/dist/server/src/assistant/skills.d.ts +8 -0
  457. package/dist/server/src/assistant/skills.js +59 -1
  458. package/dist/server/src/assistant/skills.js.map +1 -1
  459. package/dist/server/src/assistant/threads.d.ts +1 -0
  460. package/dist/server/src/assistant/threads.js +7 -1
  461. package/dist/server/src/assistant/threads.js.map +1 -1
  462. package/dist/server/src/assistant/tool-names.js +9 -1
  463. package/dist/server/src/assistant/tool-names.js.map +1 -1
  464. package/dist/server/src/assistant/tool-rank.d.ts +2 -0
  465. package/dist/server/src/assistant/tool-rank.js +48 -0
  466. package/dist/server/src/assistant/tool-rank.js.map +1 -0
  467. package/dist/server/src/assistant/tool-schema.d.ts +3 -0
  468. package/dist/server/src/assistant/tool-schema.js +65 -0
  469. package/dist/server/src/assistant/tool-schema.js.map +1 -0
  470. package/dist/server/src/assistant/tools/api.js +7 -9
  471. package/dist/server/src/assistant/tools/api.js.map +1 -1
  472. package/dist/server/src/assistant/tools/ask.js +1 -2
  473. package/dist/server/src/assistant/tools/ask.js.map +1 -1
  474. package/dist/server/src/assistant/tools/automations.js +3 -5
  475. package/dist/server/src/assistant/tools/automations.js.map +1 -1
  476. package/dist/server/src/assistant/tools/cameras.js +3 -4
  477. package/dist/server/src/assistant/tools/cameras.js.map +1 -1
  478. package/dist/server/src/assistant/tools/docs.js +5 -6
  479. package/dist/server/src/assistant/tools/docs.js.map +1 -1
  480. package/dist/server/src/assistant/tools/instance.js +19 -19
  481. package/dist/server/src/assistant/tools/instance.js.map +1 -1
  482. package/dist/server/src/assistant/tools/memory.js +3 -4
  483. package/dist/server/src/assistant/tools/memory.js.map +1 -1
  484. package/dist/server/src/assistant/tools/metrics.js +1 -2
  485. package/dist/server/src/assistant/tools/metrics.js.map +1 -1
  486. package/dist/server/src/assistant/tools/notifications.js +4 -11
  487. package/dist/server/src/assistant/tools/notifications.js.map +1 -1
  488. package/dist/server/src/assistant/tools/plugins.js +12 -14
  489. package/dist/server/src/assistant/tools/plugins.js.map +1 -1
  490. package/dist/server/src/assistant/tools/report.js +17 -12
  491. package/dist/server/src/assistant/tools/report.js.map +1 -1
  492. package/dist/server/src/assistant/tools/schedules.js +6 -11
  493. package/dist/server/src/assistant/tools/schedules.js.map +1 -1
  494. package/dist/server/src/assistant/tools/sensors.js +63 -4
  495. package/dist/server/src/assistant/tools/sensors.js.map +1 -1
  496. package/dist/server/src/assistant/tools/settings.js +2 -3
  497. package/dist/server/src/assistant/tools/settings.js.map +1 -1
  498. package/dist/server/src/assistant/tools/system.js +3 -5
  499. package/dist/server/src/assistant/tools/system.js.map +1 -1
  500. package/dist/server/src/assistant/tools/terminal.js +4 -5
  501. package/dist/server/src/assistant/tools/terminal.js.map +1 -1
  502. package/dist/server/src/assistant/types.d.ts +10 -1
  503. package/dist/server/src/assistant/uploads.d.ts +2 -1
  504. package/dist/server/src/assistant/uploads.js +25 -3
  505. package/dist/server/src/assistant/uploads.js.map +1 -1
  506. package/dist/server/src/camera/decoder/detection-coordinator.d.ts +5 -0
  507. package/dist/server/src/camera/decoder/detection-coordinator.js +45 -14
  508. package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
  509. package/dist/server/src/camera/decoder/detection-pipeline.js +2 -1
  510. package/dist/server/src/camera/decoder/detection-pipeline.js.map +1 -1
  511. package/dist/server/src/camera/decoder/event-manager.d.ts +27 -4
  512. package/dist/server/src/camera/decoder/event-manager.js +175 -48
  513. package/dist/server/src/camera/decoder/event-manager.js.map +1 -1
  514. package/dist/server/src/camera/decoder/nvr-sink.d.ts +4 -1
  515. package/dist/server/src/camera/decoder/nvr-sink.js +1 -1
  516. package/dist/server/src/camera/decoder/nvr-sink.js.map +1 -1
  517. package/dist/server/src/camera/decoder/perf-tracker.d.ts +10 -0
  518. package/dist/server/src/camera/decoder/perf-tracker.js +20 -0
  519. package/dist/server/src/camera/decoder/perf-tracker.js.map +1 -1
  520. package/dist/server/src/camera/decoder/secondary-stage.d.ts +21 -1
  521. package/dist/server/src/camera/decoder/secondary-stage.js +301 -59
  522. package/dist/server/src/camera/decoder/secondary-stage.js.map +1 -1
  523. package/dist/server/src/camera/decoder/side-queue.d.ts +13 -0
  524. package/dist/server/src/camera/decoder/side-queue.js +53 -0
  525. package/dist/server/src/camera/decoder/side-queue.js.map +1 -0
  526. package/dist/server/src/camera/decoder/sources/buffered-source.d.ts +2 -0
  527. package/dist/server/src/camera/decoder/sources/buffered-source.js +7 -1
  528. package/dist/server/src/camera/decoder/sources/buffered-source.js.map +1 -1
  529. package/dist/server/src/camera/decoder/types.d.ts +11 -1
  530. package/dist/server/src/camera/decoder/types.js +9 -1
  531. package/dist/server/src/camera/decoder/types.js.map +1 -1
  532. package/dist/server/src/camera/sensors/controller.d.ts +1 -0
  533. package/dist/server/src/camera/sensors/controller.js +28 -4
  534. package/dist/server/src/camera/sensors/controller.js.map +1 -1
  535. package/dist/server/src/main.js +11 -2
  536. package/dist/server/src/main.js.map +1 -1
  537. package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +1 -14
  538. package/dist/server/src/plugins/runtime/python/proxy/sensor.py +14 -1
  539. package/dist/server/src/plugins/runtime/python/proxy/sensor_manager.py +1 -13
  540. package/dist/server/src/rpc/interfaces/detection.d.ts +14 -2
  541. package/dist/server/src/rpc/server.js +1 -0
  542. package/dist/server/src/rpc/server.js.map +1 -1
  543. package/dist/server/src/services/config/index.d.ts +1 -0
  544. package/dist/server/src/services/config/index.js +6 -11
  545. package/dist/server/src/services/config/index.js.map +1 -1
  546. package/dist/server/src/utils/camera.js +8 -5
  547. package/dist/server/src/utils/camera.js.map +1 -1
  548. package/dist/server/src/utils/instance-lock.d.ts +1 -0
  549. package/dist/server/src/utils/instance-lock.js +57 -0
  550. package/dist/server/src/utils/instance-lock.js.map +1 -0
  551. package/dist/server/src/workers/agent.d.ts +2 -0
  552. package/dist/server/src/workers/agent.js +11 -1
  553. package/dist/server/src/workers/agent.js.map +1 -1
  554. package/dist/server/src/workers/manager.js +9 -2
  555. package/dist/server/src/workers/manager.js.map +1 -1
  556. package/dist/server/src/workers/types.d.ts +1 -0
  557. package/npm-shrinkwrap.json +209 -209
  558. package/package.json +28 -28
  559. package/dist/interface/assets/Assistant-bB8RBo-m.js +0 -1
  560. package/dist/interface/assets/Automations-BdZZW2eN.js +0 -2
  561. package/dist/interface/assets/Camera-Ct7ndOxr.js +0 -2
  562. package/dist/interface/assets/Camview-BjQdTHNh.js +0 -1
  563. package/dist/interface/assets/Config-CBTbYd5v.js +0 -2
  564. package/dist/interface/assets/ConfigTriggerGeofence-Bl2ZacbY.js +0 -1
  565. package/dist/interface/assets/Console-Cfk9MA9m.js +0 -1
  566. package/dist/interface/assets/CuiAssistantConversation-BHK_i56I.js +0 -5
  567. package/dist/interface/assets/CuiAutomationRunsDialog-B0ohEHw0.js +0 -1
  568. package/dist/interface/assets/CuiBottomSheet-NgX7VFao.js +0 -1
  569. package/dist/interface/assets/CuiCameraRecordings-BTD-CQAg.js +0 -1
  570. package/dist/interface/assets/CuiCameraTable-KPk46Xcl.js +0 -1
  571. package/dist/interface/assets/CuiDataTable-CsqH-RB1.js +0 -1
  572. package/dist/interface/assets/CuiMarkdownContent-DSArmS0V.js +0 -1
  573. package/dist/interface/assets/CuiSchema-ytExUVhI.js +0 -1
  574. package/dist/interface/assets/Faces-Cb6XMxDC.js +0 -1
  575. package/dist/interface/assets/Floorplan-DbqADtN1.js +0 -1
  576. package/dist/interface/assets/Instances-DrMzPD65.js +0 -1
  577. package/dist/interface/assets/Metrics-BUP_-7o7.css +0 -1
  578. package/dist/interface/assets/Metrics-CqhUnVRA.js +0 -12
  579. package/dist/interface/assets/Plugin-BDqNeTCT.css +0 -1
  580. package/dist/interface/assets/Plugin-DyOg_fbg.js +0 -1
  581. package/dist/interface/assets/PluginSearch-BgecD9Ob.js +0 -2
  582. package/dist/interface/assets/PluginSearch-C8xHKikH.js +0 -1
  583. package/dist/interface/assets/Plugins-CuujWEtM.js +0 -1
  584. package/dist/interface/assets/Recordings-9FJqCfdM.css +0 -1
  585. package/dist/interface/assets/Recordings-ths9khZr.js +0 -1
  586. package/dist/interface/assets/SensorEdit-BzoIH7QC.js +0 -1
  587. package/dist/interface/assets/Sensors-CK5uExfU.js +0 -2
  588. package/dist/interface/assets/Settings-DN5hFtw_.js +0 -1
  589. package/dist/interface/assets/SettingsAccount-BCrmon5O.js +0 -1
  590. package/dist/interface/assets/SettingsAccount-CSy1BAIH.js +0 -1
  591. package/dist/interface/assets/SettingsAppearance-h_XPZfQl.js +0 -1
  592. package/dist/interface/assets/SettingsAssistant-BESab92C.css +0 -1
  593. package/dist/interface/assets/SettingsAssistant-D8FmVbUL.js +0 -1
  594. package/dist/interface/assets/SettingsMqtt-DCkLIYpF.js +0 -1
  595. package/dist/interface/assets/SettingsRemote-DXlQKwlT.js +0 -2
  596. package/dist/interface/assets/Terminal-Dl-aAZME.js +0 -4
  597. package/dist/interface/assets/Training-B1oQjAr8.css +0 -1
  598. package/dist/interface/assets/Training-DdZjXgt1.js +0 -1
  599. package/dist/interface/assets/Updates-CkB1lXuo.js +0 -2
  600. package/dist/interface/assets/Workers-7yiebNkl.js +0 -2
  601. package/dist/interface/assets/api-DK2Bav9D.js +0 -4
  602. package/dist/interface/assets/api-DTCqDA-h.css +0 -2
  603. package/dist/interface/assets/assistant-BJ6xKcw_.js +0 -1
  604. package/dist/interface/assets/cloudHandoff-DtlquYGZ.js +0 -1
  605. package/dist/interface/assets/esm-4Hzzm93H.js +0 -1
  606. package/dist/interface/assets/esm-BrFPi5_4.js +0 -1
  607. package/dist/interface/assets/esm-C7pcdfXf.js +0 -1
  608. package/dist/interface/assets/esm-C8bsO829.js +0 -1
  609. package/dist/interface/assets/esm-CXzdnAMk.js +0 -1
  610. package/dist/interface/assets/esm-CZNGZkPu.js +0 -1
  611. package/dist/interface/assets/esm-D0iI7OVb.js +0 -1
  612. package/dist/interface/assets/esm-DKolm6KU.js +0 -1
  613. package/dist/interface/assets/esm-DTywI9gs.js +0 -1
  614. package/dist/interface/assets/esm-DifXcK9i.js +0 -1
  615. package/dist/interface/assets/esm-Dq5o-Xb4.js +0 -1
  616. package/dist/interface/assets/esm-IbQuUZ5l.js +0 -1
  617. package/dist/interface/assets/esm-Xre_AP5i.js +0 -1
  618. package/dist/interface/assets/esm-zYnXHhpH.js +0 -1
  619. package/dist/interface/assets/main-D74mRIxc.js +0 -3
  620. package/dist/interface/assets/native-CAujTO6L.js +0 -1
  621. package/dist/interface/assets/native-sQ88qazf.js +0 -1
  622. package/dist/interface/assets/plugin-D7K50k_y.js +0 -1
  623. package/dist/interface/assets/sensorIcons-DQVgryYP.js +0 -1
  624. package/dist/interface/assets/types-5rE8Tz0_.js +0 -1
  625. package/dist/interface/assets/ungrouped-D56FGIrg.js +0 -1
  626. package/dist/interface/assets/useBackupRestore-Crfd592q.js +0 -1
  627. package/dist/interface/assets/useUserOptions-BTRBUuE2.js +0 -1
  628. package/dist/interface/assets/vendor-gridstack-anPyIu9V.js +0 -3
  629. package/dist/interface/assets/web-3M-ddn4G.js +0 -1
  630. package/dist/interface/assets/web-BY80VGyU.js +0 -1
  631. package/dist/interface/assets/web-B_tUYyM0.js +0 -1
  632. package/dist/interface/assets/web-BjKL51lK-Bb5NYhpJ.js +0 -1
  633. package/dist/interface/assets/web-Bv-4PJGI.js +0 -1
  634. package/dist/interface/assets/web-C3Pk8qeB.js +0 -1
  635. package/dist/interface/assets/web-CLcvGPH6.js +0 -1
  636. package/dist/interface/assets/web-DO8gTOVJ.js +0 -1
  637. package/dist/interface/assets/web-DR5q_DmI.js +0 -1
  638. package/dist/interface/assets/web-DRHbG4Te.js +0 -1
  639. package/dist/interface/assets/web-DaQ8d8yk.js +0 -1
  640. package/dist/interface/assets/web-EVRW5whF.js +0 -1
  641. package/dist/interface/assets/web-S6Dk3UWN.js +0 -1
  642. package/dist/interface/assets/web-pWIp0wf0.js +0 -1
  643. package/dist/interface/assets/workbox-window.prod.es5-Dz5rcO1z.js +0 -1
  644. package/dist/interface/ha/Faces-C_svyTrr.js +0 -1282
  645. package/dist/interface/ha/Training-BEzPiXZg.js +0 -1512
@@ -3,6 +3,7 @@ import { chat, chatParamsFromRequestBody, EventType, maxIterations, modelMessage
3
3
  import { clearToolResults, composeStrategies, evictOldest, withCompaction } from '@tanstack/ai-compaction';
4
4
  import { memoryMiddleware } from '@tanstack/ai-memory';
5
5
  import { withPersistence } from '@tanstack/ai-persistence';
6
+ import { withSkills } from '@tanstack/ai-skills';
6
7
  import { toolCacheMiddleware } from '@tanstack/ai/middlewares';
7
8
  import { randomUUID } from 'node:crypto';
8
9
  import { hostname } from 'node:os';
@@ -13,24 +14,32 @@ import { PluginsService } from '../api/services/plugins.service.js';
13
14
  import { RoomsService } from '../api/services/rooms.service.js';
14
15
  import { UsersService } from '../api/services/users.service.js';
15
16
  import { decryptPassword, encryptPassword } from '../api/utils/encryption.js';
17
+ import { ALWAYS_EAGER, planRun, promote, toolTokens } from './budget.js';
18
+ import { clearDiscoveryResults, estimateMessage, keepQuestion, keepSkills, PICTURE_TOKENS, trimToolResults } from './compaction.js';
16
19
  import { secretGuard } from './guard.js';
17
- import { repairHistory } from './history.js';
20
+ import { flattenToolHistory, repairHistory } from './history.js';
18
21
  import { ASK_USER_INTERRUPT } from './interrupts.js';
19
22
  import { AssistantMcp } from './mcp.js';
20
23
  import { AssistantMemoryStore, memoryAdapter } from './memory.js';
21
24
  import { abortStaleRuns, lmdbPersistence } from './persistence.js';
25
+ import { pluginOfProvider } from './plugin-models.js';
22
26
  import { estimateCost, warmPrices } from './pricing.js';
23
27
  import { AssistantProfileStore } from './profiles.js';
24
- import { buildSystemPrompt } from './prompt.js';
28
+ import { composePrompt, promptSections } from './prompt.js';
25
29
  import { createAdapter, listModels, providerNeedsKey } from './providers.js';
26
30
  import { modelOptionsFor } from './reasoning.js';
31
+ import { RECAP_TOOL, recapCard } from './recap.js';
27
32
  import { AssistantToolRegistry, toolGroup } from './registry.js';
28
33
  import { withEmptyTurnRetry } from './retry.js';
34
+ import { questionText, ROUTE_TIMEOUT_MS, ROUTED_TOOLS, routeTools } from './router.js';
29
35
  import { AssistantScheduler, PUSH_BODY_MAX } from './scheduler.js';
30
36
  import { SEARCH_SCHEMA, searchPrompt, toSearchResult } from './search.js';
37
+ import { skillSources, toolsNamedBySkills, withNextSteps } from './skills.js';
31
38
  import { AssistantThreadStore, contentParts } from './threads.js';
32
39
  import { withToolNameRepair } from './tool-names.js';
40
+ import { leanTools } from './tool-schema.js';
33
41
  import { isBrowserTool } from './tools/index.js';
42
+ import { ASSISTANT_CARD_EVENT } from './tools/shared.js';
34
43
  import { describeUploads, extractUploads, messagesForModel } from './uploads.js';
35
44
  import { AssistantUsageStore } from './usage.js';
36
45
  const DEFAULT_CONTEXT_TOKENS = 48_000;
@@ -50,12 +59,25 @@ const CACHED_TOOLS = [
50
59
  'automation_catalog',
51
60
  ];
52
61
  const USAGE_EVENT = 'assistant.usage';
62
+ // what a model without a declared window is assumed to hold on top of the history budget
63
+ const ASSUMED_HEADROOM_TOKENS = 16_384;
64
+ const MIN_CONTEXT_TOKENS = 2_000;
65
+ // a single tool result never takes more than this share of the history budget
66
+ const TOOL_RESULT_SHARE = 3;
67
+ const MIN_TOOL_RESULT_TOKENS = 600;
68
+ const SKILL_TOOLS_SHARE = 0.25;
69
+ const SKILL_TOOLS_TOKENS = 1_200;
70
+ // discovery costs a round of its own, so a plan that hides tools gets its rounds back
71
+ const DISCOVERY_ITERATIONS = 4;
72
+ const MODEL_REFRESH_MS = 5_000;
53
73
  const ASK_TIMEOUT_MS = 45_000;
54
74
  const ASK_TIMEOUT_MAX_MS = 300_000;
55
75
  const ASK_CONCURRENCY = 4;
56
76
  const EMPTY_TURN_LOG = 'Assistant: the model ended a turn without text or tool call, asking once more';
57
77
  const EXTRACT_TIMEOUT_MS = 30_000;
58
78
  const EXTRACT_MAX_CHARS = 1500;
79
+ // a small model stores the questions themselves as facts and they crowd its window, only remembering on request stays
80
+ const EXTRACT_MIN_CONTEXT_TOKENS = 16_000;
59
81
  // prettier-ignore
60
82
  const EXTRACT_PROMPT = 'You maintain a short list of durable facts about the user of a home camera system: names of people and pets, which camera watches what, ' +
61
83
  'how they want answers, routines. From the exchange you get, output JSON {"add": [...], "remove": [...]}: add = new facts as short third-person ' +
@@ -69,7 +91,10 @@ const REPLAY_RETENTION_MS = 5 * 60_000;
69
91
  const NO_MIDDLEWARE = { name: 'camera.ui-memory-off' };
70
92
  const SEARCH_TIMEOUT_MS = 45_000;
71
93
  const REFERENCE_KINDS = new Set(['event', 'episode', 'camera', 'download']);
72
- const FINAL_TURN_PROMPT = 'The tool budget of this run is used up. Answer now with what you already know and say plainly what you could not check.';
94
+ // prettier-ignore
95
+ const FINAL_TURN_PROMPT = 'The tool budget of this run is used up and no tool is available anymore. Write the answer now as plain text from what the tools already returned, ' +
96
+ 'and say plainly what you could not check. Do not write a tool call or a tool name with arguments into the answer.';
97
+ const DUPLICATE_CALL_RESULT = 'Same call as the one before in this answer, its result is above.';
73
98
  const TEST_TIMEOUT_MS = 45_000;
74
99
  const PROBE_IMAGE = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII=';
75
100
  export class AssistantManager {
@@ -82,6 +107,7 @@ export class AssistantManager {
82
107
  mcp;
83
108
  runs = new Map();
84
109
  askSlots = new Map();
110
+ modelProvidersCheckedAt = 0;
85
111
  memoryAdapter;
86
112
  memoryMiddleware;
87
113
  logger;
@@ -169,6 +195,13 @@ export class AssistantManager {
169
195
  pluginToolCount: this.registry.pluginToolCount,
170
196
  };
171
197
  }
198
+ // the settings page asks for this on every open, the plugins answer from their own state
199
+ async refreshModelProviders() {
200
+ if (Date.now() - this.modelProvidersCheckedAt < MODEL_REFRESH_MS)
201
+ return;
202
+ this.modelProvidersCheckedAt = Date.now();
203
+ await this.registry.refreshModels();
204
+ }
172
205
  info(role) {
173
206
  const { apiKey: _apiKey, provider: _provider, baseURL: _baseURL, model: _model, sendImages: _sendImages, mcpServers, models, ...settings } = this.settings();
174
207
  const servers = mcpServers.map(({ token, ...server }) => ({ ...server, tokenSet: token !== null }));
@@ -180,6 +213,7 @@ export class AssistantManager {
180
213
  .listPlugins()
181
214
  .filter((plugin) => hasInterface(plugin.contract, PluginInterface.AssistantTools))
182
215
  .map((plugin) => ({ id: plugin.id, name: plugin.displayName })),
216
+ modelProviders: this.registry.modelProviders,
183
217
  tools: this.registry.describe(role).filter((tool) => settings.terminalEnabled ?? tool.group !== TERMINAL_GROUP),
184
218
  external: this.registry.externalStatus(this.externalServers(this.settings())),
185
219
  };
@@ -296,6 +330,7 @@ export class AssistantManager {
296
330
  async ask(request) {
297
331
  const settings = this.settings();
298
332
  const entry = this.pluginModel(request.pluginId);
333
+ await this.ensureModel(entry);
299
334
  if (!entry)
300
335
  return { ok: false, reason: 'not_allowed', message: `Plugin ${request.pluginId} may not use the assistant model, allow it under Settings, Assistant` };
301
336
  if (!settings.enabled || !entryConfigured(entry))
@@ -309,15 +344,15 @@ export class AssistantManager {
309
344
  const images = entry.capabilities?.vision !== false
310
345
  ? (request.images ?? []).map((img) => ({ type: 'image', source: { type: 'data', value: Buffer.from(img.data).toString('base64'), mimeType: img.mimeType } }))
311
346
  : [];
312
- const base = {
313
- adapter: createAdapter(model, this.decryptKey(entry)),
314
- systemPrompts: request.system ? [request.system] : [],
315
- messages: [{ role: 'user', content: [{ type: 'text', content: request.prompt }, ...images] }],
316
- modelOptions: modelOptionsFor(model),
317
- middleware: [countUsage(stats)],
318
- abortController: abort,
319
- };
320
347
  try {
348
+ const base = {
349
+ adapter: this.baseAdapter(model, entry, 'en', timeoutMs),
350
+ systemPrompts: request.system ? [request.system] : [],
351
+ messages: [{ role: 'user', content: [{ type: 'text', content: request.prompt }, ...images] }],
352
+ modelOptions: modelOptionsFor(model),
353
+ middleware: [countUsage(stats)],
354
+ abortController: abort,
355
+ };
321
356
  if (request.outputSchema) {
322
357
  const json = await chat({ ...base, outputSchema: request.outputSchema });
323
358
  return { ok: true, text: JSON.stringify(json), json, usage: { promptTokens: stats.promptTokens, completionTokens: stats.completionTokens } };
@@ -354,7 +389,15 @@ export class AssistantManager {
354
389
  if (providerNeedsKey(entry.provider) && !apiKey) {
355
390
  return { ok: false, toolCalling: false, vision: null, latencyMs: 0, model, error: 'This provider needs an API key' };
356
391
  }
357
- const adapter = createAdapter({ ...entry, model }, apiKey);
392
+ await this.ensureModel({ provider: entry.provider, model });
393
+ const spec = this.modelSpec(entry.provider, model);
394
+ let adapter;
395
+ try {
396
+ adapter = this.baseAdapter({ ...entry, model }, { ...entry, model }, 'en', TEST_TIMEOUT_MS);
397
+ }
398
+ catch (error) {
399
+ return { ok: false, toolCalling: false, vision: null, latencyMs: 0, model, error: describeError(error) };
400
+ }
358
401
  let toolCalled = false;
359
402
  const probe = toolDefinition({
360
403
  name: 'assistant_probe',
@@ -366,43 +409,51 @@ export class AssistantManager {
366
409
  });
367
410
  const abort = new AbortController();
368
411
  const timer = setTimeout(() => abort.abort(), TEST_TIMEOUT_MS);
412
+ const probeTools = spec?.toolCalling !== false;
369
413
  try {
370
414
  await this.drain(chat({
371
415
  adapter,
372
416
  systemPrompts: ['You are a connectivity probe. Follow the instruction literally.'],
373
- messages: [{ role: 'user', content: 'Call the tool assistant_probe with value 42, then answer with the single word OK.' }],
374
- tools: [probe],
375
- agentLoopStrategy: maxIterations(3),
376
- abortController: abort,
377
- }));
378
- }
379
- catch (error) {
380
- clearTimeout(timer);
381
- return { ok: false, toolCalling: false, vision: null, latencyMs: Date.now() - started, model, error: describeError(error) };
382
- }
383
- let vision = null;
384
- try {
385
- await this.drain(chat({
386
- adapter,
387
417
  messages: [
388
418
  {
389
419
  role: 'user',
390
- content: [
391
- { type: 'text', content: 'Answer with one word: what color is this image?' },
392
- { type: 'image', source: { type: 'data', value: PROBE_IMAGE, mimeType: 'image/png' } },
393
- ],
420
+ content: probeTools ? 'Call the tool assistant_probe with value 42, then answer with the single word OK.' : 'Answer with the single word OK.',
394
421
  },
395
422
  ],
396
- agentLoopStrategy: maxIterations(1),
423
+ tools: probeTools ? [probe] : [],
424
+ agentLoopStrategy: maxIterations(3),
397
425
  abortController: abort,
398
426
  }));
399
- vision = true;
400
427
  }
401
- catch {
402
- vision = false;
428
+ catch (error) {
429
+ clearTimeout(timer);
430
+ return { ok: false, toolCalling: false, vision: null, latencyMs: Date.now() - started, model, error: describeError(error) };
431
+ }
432
+ let vision = spec?.vision === false ? false : null;
433
+ if (vision === null) {
434
+ try {
435
+ await this.drain(chat({
436
+ adapter,
437
+ messages: [
438
+ {
439
+ role: 'user',
440
+ content: [
441
+ { type: 'text', content: 'Answer with one word: what color is this image?' },
442
+ { type: 'image', source: { type: 'data', value: PROBE_IMAGE, mimeType: 'image/png' } },
443
+ ],
444
+ },
445
+ ],
446
+ agentLoopStrategy: maxIterations(1),
447
+ abortController: abort,
448
+ }));
449
+ vision = true;
450
+ }
451
+ catch {
452
+ vision = false;
453
+ }
403
454
  }
404
455
  clearTimeout(timer);
405
- return { ok: true, toolCalling: toolCalled, vision, latencyMs: Date.now() - started, model };
456
+ return { ok: true, toolCalling: probeTools && toolCalled, vision, latencyMs: Date.now() - started, model };
406
457
  }
407
458
  async models(entry, rawKey) {
408
459
  try {
@@ -422,6 +473,7 @@ export class AssistantManager {
422
473
  const params = await chatParamsFromRequestBody(request.body);
423
474
  const forwarded = params.forwardedProps ?? {};
424
475
  const entry = this.resolveModel(request.user, { modelId: pickString(forwarded.modelId), profileId: pickString(forwarded.profileId) });
476
+ await this.ensureModel(entry);
425
477
  const model = this.modelSettings(settings, entry);
426
478
  const ctx = {
427
479
  userId: request.user._id,
@@ -450,18 +502,36 @@ export class AssistantManager {
450
502
  if (params.resume?.length ? !resume.length : forwarded.regenerate !== true && repeatsStored(stored?.messages, params.messages)) {
451
503
  throw Object.assign(new Error('The conversation changed since this device loaded it'), { statusCode: 409 });
452
504
  }
453
- const adapter = this.chatAdapter(model, entry);
505
+ const adapter = this.chatAdapter(model, entry, ctx.language);
454
506
  const disabledGroups = new Set(Array.isArray(forwarded.disabledGroups) ? forwarded.disabledGroups.filter((group) => typeof group === 'string') : []);
455
507
  if (!settings.terminalEnabled)
456
508
  disabledGroups.add(TERMINAL_GROUP);
457
509
  const available = entry.capabilities?.toolCalling === false ? [] : this.registry.toolsFor(ctx.role).filter((tool) => !disabledGroups.has(toolGroup(tool)));
458
- const tools = resume.length ? available.map((tool) => (tool.lazy ? { ...tool, lazy: false } : tool)) : available;
510
+ const sections = promptSections(ctx, this.promptFacts(request.user));
511
+ const plan = this.plan(settings, entry, sections, available);
512
+ const stats = newStats();
513
+ const picks = !resume.length && this.routesTools(entry) ? await this.route(model, entry, params.messages, available, plan, stats) : null;
514
+ const routed = picks !== null;
515
+ // a routed run has no catalog, so what follows a search has to be there from the start
516
+ if (routed)
517
+ promote(plan, available, [...ROUTED_TOOLS, ...picks]);
518
+ const planned = applyPlan(available, plan);
519
+ // a routed model gets the few tools that matter and no catalog: it calls what it sees and never opened one
520
+ const offered = routed ? planned.filter((tool) => !tool.lazy) : planned;
521
+ const hiddenTools = planned.filter((tool) => tool.lazy).map((tool) => ({ ...tool, lazy: false }));
522
+ const tools = resume.length ? offered.map((tool) => (tool.lazy ? { ...tool, lazy: false } : tool)) : offered;
523
+ const prompt = composePrompt(sections, routed ? { ...plan, demoted: 0, hidden: [], routed: picks } : plan);
524
+ // a procedure names tools the router did not pick, the room for them comes off the history
525
+ const skillRoom = routed && plan.skillsOnDemand ? Math.min(SKILL_TOOLS_TOKENS, Math.floor(plan.historyTokens * SKILL_TOOLS_SHARE)) : 0;
526
+ const skillTools = skillRoom ? this.skillTools(model, entry, params.messages, hiddenTools, skillRoom, stats) : undefined;
527
+ const contextBudget = Math.min(settings.contextTokens, plan.historyTokens - skillRoom);
528
+ const rounds = settings.maxIterations + (plan.demoted && !routed ? DISCOVERY_ITERATIONS : 0);
459
529
  const thread = await this.threads.ensure(request.user._id, params.threadId || randomUUID(), params.messages);
460
530
  ctx.threadId = thread._id;
531
+ await this.threads.setModel(ctx.userId, thread._id, entry._id);
461
532
  await this.storeUploads(ctx, thread._id, params.messages.length - 1);
462
533
  const abortController = new AbortController();
463
534
  request.signal?.addEventListener('abort', () => abortController.abort(), { once: true });
464
- const stats = newStats();
465
535
  warmPrices(model.provider);
466
536
  const runId = params.runId ?? randomUUID();
467
537
  this.runs.set(runId, { userId: ctx.userId, threadId: thread._id, abort: abortController });
@@ -475,24 +545,28 @@ export class AssistantManager {
475
545
  tools,
476
546
  interrupts: [ASK_USER_INTERRUPT],
477
547
  context: ctx,
478
- systemPrompts: [...cachedPrompts(buildSystemPrompt(ctx, this.promptFacts(request.user)), model.provider), describeUploads(ctx.uploads, ctx.sendImages)].filter(Boolean),
479
- agentLoopStrategy: maxIterations(settings.maxIterations + 1),
480
- lazyToolsConfig: { includeDescription: 'first-sentence' },
548
+ systemPrompts: [...cachedPrompts(prompt, model.provider), describeUploads(ctx.uploads, ctx.sendImages)].filter(Boolean),
549
+ agentLoopStrategy: maxIterations(rounds + 1),
550
+ lazyToolsConfig: { includeDescription: plan.catalogDescriptions },
481
551
  modelOptions: modelOptionsFor(model),
482
552
  middleware: [
483
553
  withPersistence(persistence),
484
554
  settings.memoryEnabled ? this.memoryMiddleware : NO_MIDDLEWARE,
555
+ plan.skillsOnDemand ? withSkills(skillSources()) : NO_MIDDLEWARE,
485
556
  withCompaction({
486
- maxTokens: settings.contextTokens,
487
- strategy: composeStrategies(clearToolResults({ keepRecentToolResults: 6 }), evictOldest({ keepRecentTokens: Math.floor(settings.contextTokens / 2) })),
557
+ maxTokens: contextBudget,
558
+ estimateTokens: estimateMessage,
559
+ strategyKey: `discovery-trim-clear-evict-skills:${contextBudget}`,
560
+ strategy: composeStrategies(clearDiscoveryResults(), trimToolResults({ maxTokens: toolResultTokens(contextBudget) }), keepSkills(clearToolResults({ keepRecentToolResults: 6 })), keepQuestion(keepSkills(evictOldest({ keepRecentTokens: Math.floor(contextBudget / 2) })))),
488
561
  }),
489
- this.runMiddleware(model, ctx, thread._id, params.messages, stats),
562
+ this.runMiddleware({ ...model, maxIterations: rounds }, ctx, thread._id, params.messages, stats, pictureLimit(contextBudget), skillTools),
490
563
  toolCacheMiddleware({ ttl: TOOL_CACHE_TTL_MS, toolNames: CACHED_TOOLS }),
491
564
  secretGuard(this.logger),
492
565
  ],
493
566
  abortController,
494
567
  });
495
568
  const attachments = {};
569
+ const recap = tools.some((tool) => tool.name === 'show_report') ? { language: ctx.language, timezone: ctx.timezone } : undefined;
496
570
  const observed = this.collectAttachments(stream, attachments, ctx.userId, thread._id, () => {
497
571
  const event = usageEvent(model, stats);
498
572
  this.usage.record(ctx.userId, event).catch((error) => this.logger.warn(`Assistant: could not record usage: ${error.message}`));
@@ -502,7 +576,7 @@ export class AssistantManager {
502
576
  if (run)
503
577
  run.finishedAt = Date.now();
504
578
  setTimeout(() => this.runs.delete(runId), REPLAY_RETENTION_MS).unref();
505
- });
579
+ }, recap);
506
580
  return toServerSentEventsResponse(observed, { abortController, ...(request.durability ? { durability: { adapter: request.durability } } : {}) });
507
581
  }
508
582
  async runMcp(request, reply, opts) {
@@ -522,6 +596,7 @@ export class AssistantManager {
522
596
  if (!settings.enabled || this.status(user.role).state !== 'ready')
523
597
  throw new Error('The assistant is not ready');
524
598
  const entry = this.resolveModel(user, { profileId: opts.profile?._id });
599
+ await this.ensureModel(entry);
525
600
  const model = this.modelSettings(settings, entry);
526
601
  const ctx = {
527
602
  userId: user._id,
@@ -531,11 +606,14 @@ export class AssistantManager {
531
606
  sendImages: model.sendImages,
532
607
  };
533
608
  const disabledGroups = new Set(opts.profile?.disabledGroups ?? []);
534
- const tools = entry.capabilities?.toolCalling === false
609
+ const available = entry.capabilities?.toolCalling === false
535
610
  ? []
536
611
  : this.registry.toolsFor(ctx.role).filter((tool) => !tool.needsApproval && !isBrowserTool(tool) && !disabledGroups.has(toolGroup(tool)));
612
+ const sections = promptSections(ctx, this.promptFacts(user));
613
+ const plan = this.plan(settings, entry, sections, available);
614
+ const tools = applyPlan(available, plan);
537
615
  const systemPrompts = [
538
- ...cachedPrompts(buildSystemPrompt(ctx, this.promptFacts(user)), model.provider),
616
+ ...cachedPrompts(composePrompt(sections, plan), model.provider),
539
617
  // prettier-ignore
540
618
  'This run is scheduled and unattended: nobody reads along and nobody can confirm anything. ' +
541
619
  'Answer completely in one go, as a report the user reads later on the phone. No questions back, no markdown headings.',
@@ -555,14 +633,15 @@ export class AssistantManager {
555
633
  const stats = newStats();
556
634
  try {
557
635
  const stream = chat({
558
- adapter: this.chatAdapter(model, entry),
636
+ adapter: this.chatAdapter(model, entry, ctx.language),
559
637
  messages: [{ id: `${Date.now()}-user`, role: 'user', parts: parts }],
560
638
  tools,
561
639
  context: ctx,
562
640
  systemPrompts,
563
641
  agentLoopStrategy: maxIterations(settings.maxIterations),
642
+ lazyToolsConfig: { includeDescription: plan.catalogDescriptions },
564
643
  modelOptions: modelOptionsFor(model),
565
- middleware: [countUsage(stats)],
644
+ middleware: [countUsage(stats), plan.skillsOnDemand ? withSkills(skillSources()) : NO_MIDDLEWARE],
566
645
  abortController,
567
646
  });
568
647
  for await (const chunk of stream) {
@@ -586,6 +665,7 @@ export class AssistantManager {
586
665
  if (!settings.enabled || this.status(user.role).state !== 'ready')
587
666
  throw new Error('The assistant is not ready');
588
667
  const entry = this.resolveModel(user);
668
+ await this.ensureModel(entry);
589
669
  const model = this.modelSettings(settings, entry);
590
670
  const rooms = new RoomsService();
591
671
  const cameras = new CamerasService().list().map((camera) => ({ id: camera._id, name: camera.name, room: rooms.label(camera.roomId) ?? camera.room ?? undefined }));
@@ -601,7 +681,7 @@ export class AssistantManager {
601
681
  const stats = newStats();
602
682
  try {
603
683
  const output = await chat({
604
- adapter: createAdapter(model, this.decryptKey(entry)),
684
+ adapter: this.baseAdapter(model, entry, 'en'),
605
685
  systemPrompts: [searchPrompt(cameras, ctx.language === 'auto' ? 'en' : ctx.language, ctx.timezone)],
606
686
  messages: [{ role: 'user', content: text }],
607
687
  outputSchema: SEARCH_SCHEMA,
@@ -616,9 +696,10 @@ export class AssistantManager {
616
696
  this.usage.record(user._id, usageEvent(model, stats)).catch((error) => this.logger.warn(`Assistant: could not record usage: ${error.message}`));
617
697
  }
618
698
  }
619
- runMiddleware(settings, runCtx, threadId, incoming, stats) {
699
+ runMiddleware(settings, runCtx, threadId, incoming, stats, maxPictures = Infinity, skillTools) {
620
700
  const log = this.logger;
621
701
  const userId = runCtx.userId;
702
+ const calls = new Set();
622
703
  return {
623
704
  name: 'camera.ui-assistant',
624
705
  onInterruptBoundary: (ctx) => {
@@ -640,14 +721,22 @@ export class AssistantManager {
640
721
  }
641
722
  return undefined;
642
723
  },
643
- onConfig: (ctx, config) => {
724
+ onConfig: async (ctx, config) => {
644
725
  const exhausted = ctx.iteration >= settings.maxIterations || stats.toolCalls >= settings.maxToolCalls;
645
- const providerMessages = messagesForModel(repairHistory(config.providerMessages ?? config.messages), settings.sendImages);
646
- if (!exhausted || !config.tools.length)
647
- return { providerMessages };
648
- return { providerMessages, tools: [], systemPrompts: [...config.systemPrompts, FINAL_TURN_PROMPT] };
726
+ const providerMessages = messagesForModel(repairHistory(config.providerMessages ?? config.messages), settings.sendImages, maxPictures);
727
+ if (exhausted && config.tools.length) {
728
+ return { providerMessages: flattenToolHistory(providerMessages), tools: [], systemPrompts: [...config.systemPrompts, FINAL_TURN_PROMPT] };
729
+ }
730
+ const offered = new Set(config.tools.map((tool) => tool.name));
731
+ const named = ((await skillTools?.(config.messages)) ?? []).filter((tool) => !offered.has(tool.name));
732
+ return { providerMessages: withNextSteps(providerMessages, offered), tools: leanTools([...config.tools, ...named]) };
649
733
  },
650
- onBeforeToolCall: (_ctx, hook) => {
734
+ onBeforeToolCall: (ctx, hook) => {
735
+ // small models repeat the same call many times in one answer, every copy of the result would fill the window
736
+ const key = `${ctx.iteration}:${hook.toolName}:${JSON.stringify(hook.args ?? {})}`;
737
+ if (calls.has(key))
738
+ return { type: 'skip', result: DUPLICATE_CALL_RESULT };
739
+ calls.add(key);
651
740
  stats.toolCalls += 1;
652
741
  if (stats.toolCalls > settings.maxToolCalls) {
653
742
  return { type: 'skip', result: { error: `Tool call budget of ${settings.maxToolCalls} per run is used up, answer with what you have.` } };
@@ -677,15 +766,18 @@ export class AssistantManager {
677
766
  }
678
767
  async extractFacts(userId, turn, existing) {
679
768
  const entry = this.resolveModel({ _id: userId, role: new UsersService().findById(userId)?.role ?? 'user' });
769
+ await this.ensureModel(entry);
680
770
  if (!entry)
681
771
  return { add: [], remove: [] };
682
772
  const model = this.modelSettings(this.settings(), entry);
773
+ if (model.contextTokens < EXTRACT_MIN_CONTEXT_TOKENS)
774
+ return { add: [], remove: [] };
683
775
  const abort = new AbortController();
684
776
  const timer = setTimeout(() => abort.abort(), EXTRACT_TIMEOUT_MS);
685
777
  let text = '';
686
778
  try {
687
779
  const stream = chat({
688
- adapter: createAdapter(model, this.decryptKey(entry)),
780
+ adapter: this.baseAdapter(model, entry, 'en'),
689
781
  systemPrompts: [EXTRACT_PROMPT],
690
782
  messages: [
691
783
  {
@@ -721,11 +813,36 @@ export class AssistantManager {
721
813
  return;
722
814
  await this.threads.addAttachments(ctx.userId, threadId, attachments).catch((error) => this.logger.warn(`Assistant: could not store uploads: ${error.message}`));
723
815
  }
724
- async *collectAttachments(stream, attachments, userId, threadId, usage, done) {
816
+ async *collectAttachments(stream, attachments, userId, threadId, usage, done, recap) {
817
+ const names = new Map();
818
+ let summary;
819
+ let carded = false;
725
820
  try {
726
821
  for await (const chunk of stream) {
727
822
  collectAttachment(chunk, attachments);
823
+ if (chunk.type === EventType.TOOL_CALL_START)
824
+ names.set(chunk.toolCallId, chunk.toolCallName);
825
+ else if (recap && chunk.type === EventType.TOOL_CALL_RESULT && names.get(chunk.toolCallId) === RECAP_TOOL) {
826
+ // a later summary of an empty day must not replace one that had moments
827
+ const card = recapCard(chunk.content, recap.language, recap.timezone);
828
+ if (card)
829
+ summary = { toolCallId: chunk.toolCallId, card };
830
+ }
831
+ else if (chunk.type === EventType.CUSTOM && chunk.name === ASSISTANT_CARD_EVENT)
832
+ carded = true;
728
833
  if (chunk.type === EventType.RUN_FINISHED && finishReasonOf(chunk) !== 'tool_calls') {
834
+ // many models answer a recap with a text list although the procedure asks for the card, the episodes are there to build it
835
+ if (summary && !carded) {
836
+ const event = {
837
+ type: EventType.CUSTOM,
838
+ name: ASSISTANT_CARD_EVENT,
839
+ value: { toolCallId: summary.toolCallId, card: summary.card },
840
+ timestamp: Date.now(),
841
+ };
842
+ collectAttachment(event, attachments);
843
+ carded = true;
844
+ yield event;
845
+ }
729
846
  yield { type: EventType.CUSTOM, name: USAGE_EVENT, value: usage(), timestamp: Date.now() };
730
847
  }
731
848
  yield chunk;
@@ -785,12 +902,82 @@ export class AssistantManager {
785
902
  const access = settings.plugins.find((row) => row.pluginId === pluginId);
786
903
  return access ? (settings.models.find((entry) => entry._id === access.modelId) ?? defaultEntry(settings)) : undefined;
787
904
  }
788
- chatAdapter(model, entry) {
789
- const adapter = withEmptyTurnRetry(createAdapter(model, this.decryptKey(entry)), () => this.logger.debug(EMPTY_TURN_LOG));
905
+ chatAdapter(model, entry, language = 'en') {
906
+ const adapter = withEmptyTurnRetry(this.baseAdapter(model, entry, language), () => this.logger.debug(EMPTY_TURN_LOG));
790
907
  return withToolNameRepair(adapter, (from, to) => this.logger.debug(`Assistant: repaired tool name ${from} to ${to}`));
791
908
  }
909
+ modelSpec(provider, model) {
910
+ return this.registry.modelProvider(provider)?.models.find((candidate) => candidate.id === model);
911
+ }
912
+ plan(settings, entry, sections, tools) {
913
+ const plan = planRun(this.window(settings, entry), sections, tools);
914
+ if (plan.compactPrompt || plan.demoted) {
915
+ const steps = `${plan.demoted} tools behind discovery${plan.skillsOnDemand ? ', skills on demand' : ''}`;
916
+ this.logger.debug(`Assistant: ${entry.name} holds ${plan.window} tokens, the request takes ${plan.overheadTokens} (${steps})`);
917
+ }
918
+ return plan;
919
+ }
920
+ async route(model, entry, messages, available, plan, stats) {
921
+ const hidden = available.filter((tool) => !plan.eagerTools.has(tool.name) && !ROUTED_TOOLS.includes(tool.name));
922
+ const adapter = this.baseAdapter(model, entry, 'en', ROUTE_TIMEOUT_MS);
923
+ const inFront = available.filter((tool) => tool.name === 'api_search' || (plan.eagerTools.has(tool.name) && !ROUTED_TOOLS.includes(tool.name) && !ALWAYS_EAGER.includes(tool.name)));
924
+ const picks = await routeTools(adapter, questionText(messages), hidden, inFront, [countUsage(stats)], (message) => this.logger.debug(`Assistant: could not route tools for ${entry.name}: ${message}`));
925
+ if (picks?.length)
926
+ this.logger.debug(`Assistant: routed ${picks.join(', ')} in front of ${entry.name}`);
927
+ return picks;
928
+ }
929
+ skillTools(model, entry, messages, hidden, room, stats) {
930
+ const chosen = new Map();
931
+ return async (history) => {
932
+ const named = toolsNamedBySkills(history, hidden);
933
+ const key = named.map((tool) => tool.name).join();
934
+ const known = chosen.get(key);
935
+ if (known || !named.length)
936
+ return known ?? [];
937
+ let tools = named;
938
+ if (toolTokens(named) > room) {
939
+ const adapter = this.baseAdapter(model, entry, 'en', ROUTE_TIMEOUT_MS);
940
+ const picks = await routeTools(adapter, questionText(messages), named, [], [countUsage(stats)], (message) => this.logger.debug(`Assistant: could not pick the tools of a procedure for ${entry.name}: ${message}`));
941
+ tools = picks ? named.filter((tool) => picks.includes(tool.name)) : named.filter((_, index) => toolTokens(named.slice(0, index + 1)) <= room);
942
+ }
943
+ chosen.set(key, tools);
944
+ return tools;
945
+ };
946
+ }
947
+ routesTools(entry) {
948
+ return entry.toolRouting ?? this.modelSpec(entry.provider, entry.model)?.toolRouting ?? false;
949
+ }
950
+ window(settings, entry) {
951
+ const spec = this.modelSpec(entry.provider, entry.model);
952
+ if (spec)
953
+ return Math.max(MIN_CONTEXT_TOKENS, spec.contextTokens);
954
+ return entry.contextTokens ?? settings.contextTokens + ASSUMED_HEADROOM_TOKENS;
955
+ }
956
+ // a plugin is asked for its models once when it starts, an answer from a bad moment must not outlive the next question
957
+ async ensureModel(entry) {
958
+ if (!entry || !pluginOfProvider(entry.provider) || this.modelSpec(entry.provider, entry.model))
959
+ return;
960
+ await this.refreshModelProviders();
961
+ }
962
+ baseAdapter(model, entry, language, timeoutMs) {
963
+ const provider = this.registry.modelProvider(entry.provider);
964
+ const spec = this.modelSpec(entry.provider, entry.model);
965
+ if (provider && spec)
966
+ return this.registry.modelAdapter(provider, spec, language, timeoutMs);
967
+ if (pluginOfProvider(entry.provider))
968
+ throw new Error(provider?.status?.message ?? `The plugin behind the model ${entry.name || entry.model} is not running`);
969
+ return createAdapter(model, this.decryptKey(entry));
970
+ }
792
971
  modelSettings(settings, entry) {
793
- return { ...settings, provider: entry.provider, baseURL: entry.baseURL, apiKey: entry.apiKey, model: entry.model, sendImages: sendsImages(entry) };
972
+ return {
973
+ ...settings,
974
+ provider: entry.provider,
975
+ baseURL: entry.baseURL,
976
+ apiKey: entry.apiKey,
977
+ model: entry.model,
978
+ sendImages: sendsImages(entry),
979
+ contextTokens: this.window(settings, entry),
980
+ };
794
981
  }
795
982
  askSlot(pluginId) {
796
983
  const slot = this.askSlots.get(pluginId) ?? { active: 0, waiters: [] };
@@ -935,6 +1122,18 @@ function imageParts(content) {
935
1122
  }
936
1123
  return images;
937
1124
  }
1125
+ function applyPlan(tools, plan) {
1126
+ return tools.map((tool) => {
1127
+ const lazy = !plan.eagerTools.has(tool.name);
1128
+ return lazy === Boolean(tool.lazy) ? tool : { ...tool, lazy };
1129
+ });
1130
+ }
1131
+ function pictureLimit(contextBudget) {
1132
+ return Math.max(1, Math.floor(contextBudget / 2 / PICTURE_TOKENS));
1133
+ }
1134
+ function toolResultTokens(contextBudget) {
1135
+ return Math.max(MIN_TOOL_RESULT_TOKENS, Math.floor(contextBudget / TOOL_RESULT_SHARE));
1136
+ }
938
1137
  function cachedPrompts(prompts, provider) {
939
1138
  if (provider !== 'anthropic')
940
1139
  return prompts;