@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.
- package/dist/interface/assets/{404-YZOLos9r.js → 404-CiOxoqnT.js} +1 -1
- package/dist/interface/assets/{About-HtxMc8JZ.js → About-DWOlfWEm.js} +1 -1
- package/dist/interface/assets/Assistant-B1xdMAkA.js +1 -0
- package/dist/interface/assets/{Assistant-BMscGKnc.css → Assistant-CXx7EY1W.css} +1 -1
- package/dist/interface/assets/{Automation-D3DcUyui.js → Automation-BJgwUkUB.js} +3 -3
- package/dist/interface/assets/{AutomationImport-Dp_hT6hQ.js → AutomationImport-9GRAndAt.js} +2 -2
- package/dist/interface/assets/{AutomationStore-BKR7GXMk.js → AutomationStore-D_HR2Xby.js} +2 -2
- package/dist/interface/assets/{AutomationStoreDetail-B9yh51WQ.js → AutomationStoreDetail-B9MxV2py.js} +2 -2
- package/dist/interface/assets/Automations-Bpw8olkc.js +2 -0
- package/dist/interface/assets/Camera-BpFfZDaS.js +2 -0
- package/dist/interface/assets/{CameraConsole-BI93OaRt.js → CameraConsole-BKPTLSTO.js} +1 -1
- package/dist/interface/assets/{Cameras-Ctub8sVt.js → Cameras-DcrVCgLy.js} +2 -2
- package/dist/interface/assets/Camview-C16pyCZk.js +1 -0
- package/dist/interface/assets/{Camview-CZct5cnP.css → Camview-DasO326h.css} +1 -1
- package/dist/interface/assets/{CertificateUpload-xW55NA1Q.js → CertificateUpload-BYFKZCP9.js} +1 -1
- package/dist/interface/assets/Config-BmEL5EaW.js +2 -0
- package/dist/interface/assets/{ConfigActionAssistant-B488rOp5.js → ConfigActionAssistant-DM4tIhoa.js} +1 -1
- package/dist/interface/assets/{ConfigActionCameraControl-ZMUuBxOs.js → ConfigActionCameraControl-Deo0eDPS.js} +1 -1
- package/dist/interface/assets/{ConfigActionDelay-BJ11xvOW.js → ConfigActionDelay-_EqbfWgo.js} +1 -1
- package/dist/interface/assets/{ConfigActionHttp-DOUo69OR.js → ConfigActionHttp-BxJmoshF.js} +1 -1
- package/dist/interface/assets/{ConfigActionImageInput-BMzuVZW9.js → ConfigActionImageInput-KrzXFQDm.js} +1 -1
- package/dist/interface/assets/{ConfigActionMqtt-Co_uksca.js → ConfigActionMqtt-BoYBomRC.js} +1 -1
- package/dist/interface/assets/{ConfigActionNotification-CcZkstYx.js → ConfigActionNotification-CSAOijDt.js} +1 -1
- package/dist/interface/assets/{ConfigActionNotificationControl--VeucoTw.js → ConfigActionNotificationControl-BOdyKiOs.js} +1 -1
- package/dist/interface/assets/{ConfigActionOutput-CyDa1LGA.js → ConfigActionOutput-CwsPcnd_.js} +1 -1
- package/dist/interface/assets/{ConfigActionPlugin-Kfg3ZEQF.js → ConfigActionPlugin-D3wyULpp.js} +1 -1
- package/dist/interface/assets/{ConfigActionSensor-DhAF0HPw.js → ConfigActionSensor-BmeaIxYY.js} +1 -1
- package/dist/interface/assets/{ConfigActionSnapshot-zMe3SPvW.js → ConfigActionSnapshot-DbyFKcYr.js} +1 -1
- package/dist/interface/assets/{ConfigActionVariable-BE5q3NwY.js → ConfigActionVariable-cThGJ1Pc.js} +1 -1
- package/dist/interface/assets/{ConfigConditionIfElse-BNIRtSVD.js → ConfigConditionIfElse-BugkJeXR.js} +1 -1
- package/dist/interface/assets/{ConfigConditionSensorState-DTNd-SzI.js → ConfigConditionSensorState-Bf-mMf4E.js} +1 -1
- package/dist/interface/assets/{ConfigConditionSwitch-BU5wWMU1.js → ConfigConditionSwitch-DcpFoYET.js} +1 -1
- package/dist/interface/assets/{ConfigConditionTime-KXTCIVIV.js → ConfigConditionTime-CM4bSMyU.js} +1 -1
- package/dist/interface/assets/{ConfigSensorValueInput-BC1FpMm-.js → ConfigSensorValueInput-CgAI34__.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerDetection-hIN1hi53.js → ConfigTriggerDetection-BWK6gfwM.js} +1 -1
- package/dist/interface/assets/ConfigTriggerGeofence-Cm3CU7Tl.js +1 -0
- package/dist/interface/assets/{ConfigTriggerManual-C5vwxS-e.js → ConfigTriggerManual-DgkR-GWy.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerMqtt-B4PtWC3E.js → ConfigTriggerMqtt-BMFjTAso.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerSchedule-BZzUdGBa.js → ConfigTriggerSchedule-E_QWfNKy.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerSensor-D18nwMsj.js → ConfigTriggerSensor-DOdJkZRo.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerSystem-BhygWLB4.js → ConfigTriggerSystem-BFDIbZsE.js} +1 -1
- package/dist/interface/assets/{ConfigTriggerWebhook-yyuBuhLD.js → ConfigTriggerWebhook-DDoUEVHb.js} +1 -1
- package/dist/interface/assets/Console-BIj7cIqO.js +1 -0
- package/dist/interface/assets/CuiAssistantConversation-CRNCKRHz.js +5 -0
- package/dist/interface/assets/{CuiAssistantConversation-lkpZg3ML.css → CuiAssistantConversation-DQ0wOJvV.css} +1 -1
- package/dist/interface/assets/CuiAutomationRunsDialog-DMUfNcsf.js +1 -0
- package/dist/interface/assets/CuiBottomSheet-CYi5c3fP.js +1 -0
- package/dist/interface/assets/{CuiBottomSheet-DWefGWK2.js → CuiBottomSheet-FwsPnJ3n.js} +1 -1
- package/dist/interface/assets/{CuiCameraPipCard-C2qaGJlH.js → CuiCameraPipCard-Cb_Qbly6.js} +1 -1
- package/dist/interface/assets/CuiCameraRecordings-BeciatDY.js +1 -0
- package/dist/interface/assets/{CuiCameraShares-DcqOcePX.js → CuiCameraShares-CSFwIYsg.js} +1 -1
- package/dist/interface/assets/CuiCameraTable-BgL5FZso.js +1 -0
- package/dist/interface/assets/{CuiCameraTable-BOkfp_5M.js → CuiCameraTable-DBRfGX3I.js} +2 -2
- package/dist/interface/assets/{CuiChartTable-DP38uBwK.js → CuiChartTable-CtasoxMM.js} +1 -1
- package/dist/interface/assets/{CuiConsole-C7xE_nQg.js → CuiConsole-DQbAafiz.js} +2 -2
- package/dist/interface/assets/CuiDataTable-JlD7Agky.js +1 -0
- package/dist/interface/assets/{CuiLightControl-ChGYpQAK.js → CuiLightControl-CLYl5pfN.js} +1 -1
- package/dist/interface/assets/{CuiList-DJp0__mV.js → CuiList-Dsu5m0TA.js} +1 -1
- package/dist/interface/assets/{CuiMarkdownContent-BUYtK_wD.js → CuiMarkdownContent-BYBQX_aF.js} +1 -1
- package/dist/interface/assets/CuiMarkdownContent-DTAm-EDR.js +1 -0
- package/dist/interface/assets/{CuiPluginCard-CWImTZ6l.js → CuiPluginCard-CC1oXY16.js} +2 -2
- package/dist/interface/assets/{CuiPluginCategoryChip-Ch_upS6Y.js → CuiPluginCategoryChip-B2bR5LQa.js} +1 -1
- package/dist/interface/assets/{CuiPluginOAuthButton-DEQ9xILN.js → CuiPluginOAuthButton-DfEjfcY-.js} +2 -2
- package/dist/interface/assets/{CuiPluginTrustBadge-sVWdvHcM.js → CuiPluginTrustBadge-C6CW6Soh.js} +1 -1
- package/dist/interface/assets/{CuiQRCode-DqSF4SkD.js → CuiQRCode-DGKBhDib.js} +1 -1
- package/dist/interface/assets/CuiSchema-pAAVh28m.js +1 -0
- package/dist/interface/assets/{CuiTopNavbarItem-B_KWykgq.js → CuiTopNavbarItem-ve-3Dsc3.js} +1 -1
- package/dist/interface/assets/Faces-1xd5yGuO.js +1 -0
- package/dist/interface/assets/{FirstSteps-QNYTkEJo.js → FirstSteps-E9cMqa0a.js} +1 -1
- package/dist/interface/assets/Floorplan-BovV_ATh.js +1 -0
- package/dist/interface/assets/Instances-BbxyB7vR.js +1 -0
- package/dist/interface/assets/{Logs-BSPT80vP.js → Logs-BhRactvQ.js} +2 -2
- package/dist/interface/assets/{Menu-HHtuhIS2.js → Menu-DMCmUVDs.js} +1 -1
- package/dist/interface/assets/Metrics-BgXrNl38.js +12 -0
- package/dist/interface/assets/Metrics-ChVnC6f6.css +1 -0
- package/dist/interface/assets/{OAuthDeviceFlow-Bn1nlWNa.js → OAuthDeviceFlow-BMEwVkIa.js} +1 -1
- package/dist/interface/assets/Plugin-CDNywaVE.js +1 -0
- package/dist/interface/assets/Plugin-Qr_Q_Qfi.css +1 -0
- package/dist/interface/assets/{PluginConsole-Cv-uhnPY.js → PluginConsole-C4Ba_U_1.js} +1 -1
- package/dist/interface/assets/{PluginDetail-cpOz7FkA.js → PluginDetail-13OWIzdd.js} +2 -2
- package/dist/interface/assets/{PluginSchema-DW3TGeTM.js → PluginSchema-DN0cSU8s.js} +1 -1
- package/dist/interface/assets/PluginSearch-sPkO8aH3.js +2 -0
- package/dist/interface/assets/PluginSearch-xNIlfXk4.js +1 -0
- package/dist/interface/assets/{PluginUpdateProgress-n6q6vzyd.js → PluginUpdateProgress-CeWuRp3Z.js} +1 -1
- package/dist/interface/assets/Plugins-C8yjhxnQ.js +1 -0
- package/dist/interface/assets/{RecentEventsFilter-CTR5JK_P.js → RecentEventsFilter-Kp_lTOuG.js} +1 -1
- package/dist/interface/assets/Recordings-BHT8Vvv_.js +1 -0
- package/dist/interface/assets/Recordings-DwuojaAw.css +1 -0
- package/dist/interface/assets/SensorEdit-C-yJdJuP.js +1 -0
- package/dist/interface/assets/{SensorHistory-9CdOpCPs.js → SensorHistory-ClAcOgHj.js} +1 -1
- package/dist/interface/assets/Sensors-Cza4Et2c.js +2 -0
- package/dist/interface/assets/Settings-Cj0leoGd.js +1 -0
- package/dist/interface/assets/SettingsAccount-COkcBBSz.js +1 -0
- package/dist/interface/assets/SettingsAccount-DjrJdssy.js +1 -0
- package/dist/interface/assets/{SettingsAppearance-BY1xQMx4.js → SettingsAppearance-CJt4xJEW.js} +1 -1
- package/dist/interface/assets/SettingsAppearance-D20YW7Vq.js +1 -0
- package/dist/interface/assets/SettingsAssistant-CDdbbG-c.css +1 -0
- package/dist/interface/assets/SettingsAssistant-DKWDp1AI.js +1 -0
- package/dist/interface/assets/{SettingsBackup-D_weokqu.js → SettingsBackup-DIJmci05.js} +1 -1
- package/dist/interface/assets/{SettingsList-Bq24WTDU.js → SettingsList-Cb_dLy5T.js} +1 -1
- package/dist/interface/assets/SettingsMqtt-LIuCRPT5.js +1 -0
- package/dist/interface/assets/{SettingsNotifications-8TZOUxg2.js → SettingsNotifications-CZxqqH_8.js} +1 -1
- package/dist/interface/assets/{SettingsPermissions-M8u_jrN0.js → SettingsPermissions-CJiz0Z7B.js} +1 -1
- package/dist/interface/assets/{SettingsRecordings-C1Kp5xW_.js → SettingsRecordings-BEpwMh-y.js} +1 -1
- package/dist/interface/assets/SettingsRemote-DRt-N_yA.js +2 -0
- package/dist/interface/assets/{SettingsSystem-Cetu2faJ.js → SettingsSystem-Cncdpx8T.js} +2 -2
- package/dist/interface/assets/{SettingsUsers-CDwtQLdV.js → SettingsUsers-DZkz8WlI.js} +1 -1
- package/dist/interface/assets/Terminal-U4yfJN3O.js +4 -0
- package/dist/interface/assets/Training-Bkn52mPJ.css +1 -0
- package/dist/interface/assets/Training-DfgE_dA8.js +1 -0
- package/dist/interface/assets/Updates-cCvbFq3w.js +2 -0
- package/dist/interface/assets/{VariableInput-BxPj5wo6.js → VariableInput-PVsqGYW0.js} +1 -1
- package/dist/interface/assets/{VariableSuggestions-CbizvAkz.js → VariableSuggestions-DwLtlzVz.js} +1 -1
- package/dist/interface/assets/{VersionsHandler-CePyEUVO.js → VersionsHandler-Df7dhddp.js} +2 -2
- package/dist/interface/assets/{VirtualSensorCreate-D_GVoeL7.js → VirtualSensorCreate-FTKANjd-.js} +1 -1
- package/dist/interface/assets/Workers-Ba37_3cY.js +2 -0
- package/dist/interface/assets/{account-Bu30He0P.js → account-DwW7pBOb.js} +1 -1
- package/dist/interface/assets/{alert-circle-D2fAQwTX.js → alert-circle-BdUVAt1B.js} +1 -1
- package/dist/interface/assets/{alert-outline-D7zaSJH_.js → alert-outline-IRxYbw0j.js} +1 -1
- package/dist/interface/assets/api-C1mraOYr.js +4 -0
- package/dist/interface/assets/{api-DW2niHRN.js → api-DpqXhwcx.js} +1 -1
- package/dist/interface/assets/api-z8ZVnoOl.css +2 -0
- package/dist/interface/assets/{arrow-left-BGLyEqqa.js → arrow-left-Bk-ZrOVr.js} +1 -1
- package/dist/interface/assets/assistant-Lz3mFLDo.js +1 -0
- package/dist/interface/assets/{assistantModels-D0soYqq7.js → assistantModels-BsSgRsws.js} +1 -1
- package/dist/interface/assets/{auth-Dc8bUpc-.js → auth-L7_5vsJs.js} +1 -1
- package/dist/interface/assets/{automations-DXrjbArj.js → automations-D1XFFSrm.js} +1 -1
- package/dist/interface/assets/{back-filled-BPBVnQjx.js → back-filled-D-X19YMO.js} +1 -1
- package/dist/interface/assets/{bell-ring-CyCFPUL_.js → bell-ring-DreEHgoT.js} +1 -1
- package/dist/interface/assets/{brain-CIJB1ree.js → brain-DuDAg544.js} +1 -1
- package/dist/interface/assets/{cameraSources-QJfUDOQJ.js → cameraSources-DEGJDtmK.js} +1 -1
- package/dist/interface/assets/{cctv-D6kxZ-lp.js → cctv-DM-C_8_6.js} +1 -1
- package/dist/interface/assets/{check-circle-DHAAn6A6.js → check-circle-Bevuw8-0.js} +1 -1
- package/dist/interface/assets/{check-circle-outline-BbqeKfIK.js → check-circle-outline-aMxkvksr.js} +1 -1
- package/dist/interface/assets/{chevron-down-ZYTrU871.js → chevron-down-CCFn9Z56.js} +1 -1
- package/dist/interface/assets/{chevron-up-LQXNz9CE.js → chevron-up-CSImUM3_.js} +1 -1
- package/dist/interface/assets/{clock-outline-CKTiLKoR.js → clock-outline-DH3WIEJt.js} +1 -1
- package/dist/interface/assets/{close-BbEPZQqa.js → close-CMxyM4v9.js} +1 -1
- package/dist/interface/assets/{close-circle-BSUSUs4K.js → close-circle-CfgJCZ9A.js} +1 -1
- package/dist/interface/assets/{cloud-check-BTGbrAQ_.js → cloud-check-CbdFLIdR.js} +1 -1
- package/dist/interface/assets/cloudHandoff-DkUx4m3P.js +1 -0
- package/dist/interface/assets/{config-CiQDwB4t.js → config-CVqy37fG.js} +1 -1
- package/dist/interface/assets/{content-copy-V0DW9ZbH.js → content-copy-Bz49QPOI.js} +1 -1
- package/dist/interface/assets/{copy-DsmMEtSH.js → copy-DA6QQHRt.js} +1 -1
- package/dist/interface/assets/{cube-scan-DGhUFV1x.js → cube-scan-IiH8zwm2.js} +1 -1
- package/dist/interface/assets/database-refresh-outline-CIUDpcuq.js +1 -0
- package/dist/interface/assets/{delete-CY8fsIW6.js → delete-Btu-UVx9.js} +1 -1
- package/dist/interface/assets/{dist-DNyx_J8o.js → dist-D_qWDAKp.js} +1 -1
- package/dist/interface/assets/{dots-vertical-pP1vP0Qa.js → dots-vertical-D496SIss.js} +1 -1
- package/dist/interface/assets/{download-CyjJ7yJW.js → download-BSC7lwq_.js} +1 -1
- package/dist/interface/assets/esm-0kxqa_1s.js +1 -0
- package/dist/interface/assets/esm-4p_M5mFV.js +1 -0
- package/dist/interface/assets/esm-8G-vO1KQ.js +1 -0
- package/dist/interface/assets/esm-8cB56ICb.js +1 -0
- package/dist/interface/assets/esm-B92csSEb.js +1 -0
- package/dist/interface/assets/esm-BHiNTIiN.js +1 -0
- package/dist/interface/assets/esm-Bu9PMLmw.js +1 -0
- package/dist/interface/assets/esm-CS6Ra46d.js +1 -0
- package/dist/interface/assets/esm-CWvQWALL.js +1 -0
- package/dist/interface/assets/esm-D2UDrwmt.js +1 -0
- package/dist/interface/assets/esm-D8OHF2X1.js +1 -0
- package/dist/interface/assets/esm-DrXkS8eG.js +1 -0
- package/dist/interface/assets/esm-pfoHiO1a.js +1 -0
- package/dist/interface/assets/esm-tJSCF7Vh.js +1 -0
- package/dist/interface/assets/{eventIcons-cdzqQc0W.js → eventIcons-UQutPG3p.js} +1 -1
- package/dist/interface/assets/{eye-off-JCu1iUer.js → eye-off-CSU0U8g7.js} +1 -1
- package/dist/interface/assets/{eye-off-outline-GErp76H2.js → eye-off-outline-DCxLRGo_.js} +1 -1
- package/dist/interface/assets/{flowSchema-BRTZHQ1w.js → flowSchema-CppNBDy1.js} +1 -1
- package/dist/interface/assets/{help-circle-outline-G43EJuch.js → help-circle-outline-Cr_yNhPi.js} +1 -1
- package/dist/interface/assets/{history-CNJREqJG.js → history-anuCbp1T.js} +1 -1
- package/dist/interface/assets/{home-B-_OQpZ6.js → home-N3bDR1vX.js} +1 -1
- package/dist/interface/assets/{information-outline-Blt4EtWJ.js → information-outline-CMWIvLNB.js} +1 -1
- package/dist/interface/assets/{intercomService-BnA-FQ0Q.js → intercomService-CjoJaOZ7.js} +1 -1
- package/dist/interface/assets/{lan-C3jliANx.js → lan-CYXjdk7L.js} +1 -1
- package/dist/interface/assets/main-BK3kmiG2.js +3 -0
- package/dist/interface/assets/{main-BoGhBedC.css → main-Bo0Lb1y2.css} +1 -1
- package/dist/interface/assets/{microphone-B6xc9JQ2.js → microphone-BB2pATI_.js} +1 -1
- package/dist/interface/assets/{minus-BI5qXFwJ.js → minus-BCp3ZNKO.js} +1 -1
- package/dist/interface/assets/{mqtt-iD9XHYO_.js → mqtt-BENV9Fx4.js} +1 -1
- package/dist/interface/assets/native-BEkWOGyD.js +1 -0
- package/dist/interface/assets/native-ugMg173F.js +1 -0
- package/dist/interface/assets/{nodeDefinitions-Dop49tx8.js → nodeDefinitions-ByrqsENY.js} +1 -1
- package/dist/interface/assets/{notifications-CbAJX7RF.js → notifications-By40oPng.js} +1 -1
- package/dist/interface/assets/{pause-DKzvPG2b.js → pause-BQlxwAW2.js} +1 -1
- package/dist/interface/assets/{pencil-DKbi9SsG.js → pencil-CDsNnEXi.js} +1 -1
- package/dist/interface/assets/{pencil-outline-CD3Xv98d.js → pencil-outline-CIQL5Kui.js} +1 -1
- package/dist/interface/assets/plugin-eafNQWg2.js +1 -0
- package/dist/interface/assets/{plugins-eIUrXNeM.js → plugins-09rEDbMz.js} +1 -1
- package/dist/interface/assets/{plus-CHPYoMO_.js → plus-Bp4q9G7S.js} +1 -1
- package/dist/interface/assets/{plus--kDl8ben.js → plus-CySoovdr.js} +1 -1
- package/dist/interface/assets/{power-C9wmNlFS.js → power-WmBLDR0-.js} +1 -1
- package/dist/interface/assets/{radar-B3ra28GD.js → radar-CyYAmume.js} +1 -1
- package/dist/interface/assets/{refresh-DfqyhMOh.js → refresh-CHTA3jVN.js} +1 -1
- package/dist/interface/assets/{restore-FMacmqd_.js → restore-C8RNM5yX.js} +1 -1
- package/dist/interface/assets/{rooms-BqPyo8jc.js → rooms-LBxn-Uuu.js} +1 -1
- package/dist/interface/assets/{round-alt-arrow-left-bold-56eF9Bol.js → round-alt-arrow-left-bold-Gh5mi_yR.js} +1 -1
- package/dist/interface/assets/{search-BXbDWhLk.js → search-BajCVmOI.js} +1 -1
- package/dist/interface/assets/sensorIcons-Csu5s0uk.js +1 -0
- package/dist/interface/assets/{sensorSlots-BZCXtnb6.js → sensorSlots-CtbKmsGG.js} +1 -1
- package/dist/interface/assets/{sensors-DttBNEEt.js → sensors-CbzNs18A.js} +1 -1
- package/dist/interface/assets/{server-DUFhf2c_.js → server-Btp5KILd.js} +1 -1
- package/dist/interface/assets/{settings-Cw63SIJl.js → settings-DnksaK7m.js} +1 -1
- package/dist/interface/assets/{source-branch-oyzrlfCD.js → source-branch-CzqIPffP.js} +1 -1
- package/dist/interface/assets/{theme-BMmjtQ4w.js → theme-GhzGwpqd.js} +1 -1
- package/dist/interface/assets/{trash-2-BQc04l9M.js → trash-2-DJeEhHf4.js} +1 -1
- package/dist/interface/assets/{trash-can-outline-Bk5eENNM.js → trash-can-outline-DrT6iw7I.js} +1 -1
- package/dist/interface/assets/{trash-fill-CXk8BmtF.js → trash-fill-Bb_-UicM.js} +1 -1
- package/dist/interface/assets/{trash2-2rUvghml.js → trash2-Dsl8gfxq.js} +1 -1
- package/dist/interface/assets/types-BAwhu9iv.js +1 -0
- package/dist/interface/assets/{types-DWTSNJ79.js → types-CklFkUXk.js} +1 -1
- package/dist/interface/assets/{types-CXw7CEzu.js → types-D8QWPhe-.js} +1 -1
- package/dist/interface/assets/{undo-Dcf7vcsv.js → undo-DoqJW-k7.js} +1 -1
- package/dist/interface/assets/ungrouped-BMk56E3L.js +1 -0
- package/dist/interface/assets/{ungrouped-DHMJ9Rg1.css → ungrouped-BnQIcSQd.css} +1 -1
- package/dist/interface/assets/{updates-TIPWXKzL.js → updates-CGo0T4sn.js} +1 -1
- package/dist/interface/assets/{upload-nnbfDypK.js → upload-C3w1XH-o.js} +1 -1
- package/dist/interface/assets/{upload-B-ZYPekV.js → upload-DtIcwiNC.js} +1 -1
- package/dist/interface/assets/{useAppVersion-BIz44Bg4.js → useAppVersion-CJlexqyz.js} +1 -1
- package/dist/interface/assets/{useAssistantActions-CLkkw9kB.js → useAssistantActions-Cc_O6M9_.js} +1 -1
- package/dist/interface/assets/useBackupRestore-_s8vS5WF.js +1 -0
- package/dist/interface/assets/{useCameraOptions-A97teAIr.js → useCameraOptions-CFISVNgk.js} +1 -1
- package/dist/interface/assets/{useKeyboardInset-DXVi1dLG.js → useKeyboardInset-DkUn62i7.js} +1 -1
- package/dist/interface/assets/{useLogsSocket-BlFxVXjF.js → useLogsSocket-D-ndWAg0.js} +1 -1
- package/dist/interface/assets/{useNavLayout-C5obaCNv.js → useNavLayout-CG0X_3kt.js} +1 -1
- package/dist/interface/assets/{usePermissions-C8hB_pG1.js → usePermissions-BXTw4tII.js} +1 -1
- package/dist/interface/assets/{usePluginUpdates-DO0-Gk4Q.js → usePluginUpdates-nW_dt66E.js} +1 -1
- package/dist/interface/assets/{usePushRegistration-BUttCraQ.js → usePushRegistration-DCqOAxR4.js} +2 -2
- package/dist/interface/assets/{useServerRestart-Cz9eVHUE.js → useServerRestart-CxJGxAcU.js} +1 -1
- package/dist/interface/assets/{useStreamStatus-BhS_MCCB.js → useStreamStatus-CXb1HbAq.js} +1 -1
- package/dist/interface/assets/{useTabSwipe-D4k8lm1M.js → useTabSwipe-DHb8__wU.js} +1 -1
- package/dist/interface/assets/{useUpdateChannel-D9lhfW0y.js → useUpdateChannel-BR4PMh1R.js} +1 -1
- package/dist/interface/assets/{useUpdatesSocket-DnH9sON5.js → useUpdatesSocket-DKDRZhvc.js} +1 -1
- package/dist/interface/assets/useUserOptions-lyc4WJ4L.js +1 -0
- package/dist/interface/assets/{variable-CcE0ZwTr.js → variable-ywTlRfo5.js} +1 -1
- package/dist/interface/assets/{vendor-cameraui-QXD8jkcj.js → vendor-cameraui-CK4yHsJi.js} +45 -45
- package/dist/interface/assets/{vendor-capacitor-COL6Kz75.js → vendor-capacitor-f9ShAzys.js} +2 -2
- package/dist/interface/assets/{vendor-chart-80wrH3md.js → vendor-chart-DBK083Hu.js} +1 -1
- package/dist/interface/assets/{vendor-core-CnhnyKDl.js → vendor-core-B-Q4es-f.js} +1 -1
- package/dist/interface/assets/{vendor-dnd-CEJS9JKU.js → vendor-dnd-DGQLvX6Y.js} +1 -1
- package/dist/interface/assets/{vendor-draggabilly-BY7O1F_Z.js → vendor-draggabilly-D8CK6M-y.js} +1 -1
- package/dist/interface/assets/{vendor-DGke_6M4.js → vendor-gFkr2qsZ.js} +1 -1
- package/dist/interface/assets/vendor-gridstack-DtDG3os6.js +3 -0
- package/dist/interface/assets/{vendor-markdown-DD4teg2u.js → vendor-markdown-qHIinIUE.js} +1 -1
- package/dist/interface/assets/{vendor-primevue-CCUqY55W.js → vendor-primevue-Cmp3VjIC.js} +72 -72
- package/dist/interface/assets/{vendor-vueflow-Bmwd2les.js → vendor-vueflow-bSwRZ9X8.js} +1 -1
- package/dist/interface/assets/web-3OOGlctS.js +1 -0
- package/dist/interface/assets/web-5NFVd9gs.js +1 -0
- package/dist/interface/assets/web-A4yovlXr.js +1 -0
- package/dist/interface/assets/web-BBC3YoWX.js +1 -0
- package/dist/interface/assets/web-B_9Qyt8E.js +1 -0
- package/dist/interface/assets/web-BjKL51lK-DUIsII0n.js +1 -0
- package/dist/interface/assets/web-C2-YAfsx.js +1 -0
- package/dist/interface/assets/web-CUL_MhvM.js +1 -0
- package/dist/interface/assets/web-CZVCXYLV.js +1 -0
- package/dist/interface/assets/web-DJ-LUxlV.js +1 -0
- package/dist/interface/assets/web-DNsEGLGS.js +1 -0
- package/dist/interface/assets/web-DZsU0QT_.js +1 -0
- package/dist/interface/assets/web-MoyOTbiU.js +1 -0
- package/dist/interface/assets/web-avRH_3t7.js +1 -0
- package/dist/interface/assets/{webhook-oVbP79Yk.js → webhook-CWKf2Qxu.js} +1 -1
- package/dist/interface/assets/workbox-window.prod.es5-BEYAF-e-.js +1 -0
- package/dist/interface/assets/{zoom-in-GKNy8xA7.js → zoom-in-CHkXAWHy.js} +1 -1
- package/dist/interface/ha/{404-DLhJqxRl.js → 404-B2T8Gktj.js} +1 -1
- package/dist/interface/ha/{About-DC0i1iE4.js → About-CrTKzU9_.js} +6 -6
- package/dist/interface/ha/{Assistant-BmazMPIg.js → Assistant-BDHJmYx_.js} +823 -820
- package/dist/interface/ha/{Automation-gabF9YzQ.js → Automation-Czo5EsAg.js} +337 -337
- package/dist/interface/ha/{AutomationImport-DaqZNs9s.js → AutomationImport-CuFAQbiX.js} +6 -6
- package/dist/interface/ha/{AutomationStore-DzM4huo5.js → AutomationStore-D-6x0JIt.js} +16 -16
- package/dist/interface/ha/{AutomationStoreDetail-CpzQMt_D.js → AutomationStoreDetail-Dad4q1MN.js} +19 -19
- package/dist/interface/ha/{Automations-Dcm4Us50.js → Automations-C-oGM5SR.js} +71 -71
- package/dist/interface/ha/{Camera-CNK3QR7l.js → Camera-CerkQGbZ.js} +214 -214
- package/dist/interface/ha/{CameraConsole-CpcF0411.js → CameraConsole-hRGwbjsD.js} +3 -3
- package/dist/interface/ha/{Cameras-Cf9rwRyf.js → Cameras-Bk5TFXA8.js} +92 -92
- package/dist/interface/ha/{Camview-BFKR2t6C.js → Camview-CsKKqxxY.js} +382 -382
- package/dist/interface/ha/{Config-1XH3zfr2.js → Config-Vl4-K3A_.js} +11 -11
- package/dist/interface/ha/{ConfigActionAssistant-C0-NFoTB.js → ConfigActionAssistant-OWUX8glZ.js} +4 -4
- package/dist/interface/ha/{ConfigActionCameraControl-DNSKZPSZ.js → ConfigActionCameraControl-DEaOot8w.js} +3 -3
- package/dist/interface/ha/{ConfigActionHttp-DVJAcGkl.js → ConfigActionHttp-CSr2BpKL.js} +2 -2
- package/dist/interface/ha/{ConfigActionImageInput-VVbHHHZs.js → ConfigActionImageInput--O8Tyca-.js} +1 -1
- package/dist/interface/ha/{ConfigActionMqtt-N5OUJDzM.js → ConfigActionMqtt-DQJ4-gs2.js} +4 -4
- package/dist/interface/ha/{ConfigActionNotification-s142tQoU.js → ConfigActionNotification-wR8CCA_T.js} +3 -3
- package/dist/interface/ha/{ConfigActionNotificationControl-Dh7kaKVP.js → ConfigActionNotificationControl-DNMrHwPz.js} +2 -2
- package/dist/interface/ha/{ConfigActionOutput-B4HHTg5C.js → ConfigActionOutput-C-LVFxFP.js} +1 -1
- package/dist/interface/ha/{ConfigActionPlugin-D20G2Dqf.js → ConfigActionPlugin-BCREAkNo.js} +5 -5
- package/dist/interface/ha/{ConfigActionSensor-BS3jrFaG.js → ConfigActionSensor-D48CQ6qR.js} +5 -5
- package/dist/interface/ha/{ConfigActionSnapshot-CInLAcwK.js → ConfigActionSnapshot-DpDy88Mg.js} +2 -2
- package/dist/interface/ha/{ConfigActionVariable-C5vADGNF.js → ConfigActionVariable-D9BxmwvB.js} +1 -1
- package/dist/interface/ha/{ConfigConditionIfElse-CPeWDD31.js → ConfigConditionIfElse-CW42tQFY.js} +3 -3
- package/dist/interface/ha/{ConfigConditionSensorState-BM5GmpN6.js → ConfigConditionSensorState-BZpij7kB.js} +4 -4
- package/dist/interface/ha/{ConfigConditionSwitch-Dmz9FduJ.js → ConfigConditionSwitch-DlTuJ9Sf.js} +5 -5
- package/dist/interface/ha/{ConfigSensorValueInput-Ch5njvtv.js → ConfigSensorValueInput-2QLHESlE.js} +5 -5
- package/dist/interface/ha/{ConfigTriggerDetection-BR2QWNyO.js → ConfigTriggerDetection-DPmUkmUJ.js} +3 -3
- package/dist/interface/ha/{ConfigTriggerGeofence-CaImOjyW.js → ConfigTriggerGeofence--T9OXhGl.js} +2 -2
- package/dist/interface/ha/{ConfigTriggerMqtt-DWz1XwZQ.js → ConfigTriggerMqtt-fZn_X6yY.js} +1 -1
- package/dist/interface/ha/{ConfigTriggerSensor-lfnhz0im.js → ConfigTriggerSensor-_3O6iBFX.js} +1 -1
- package/dist/interface/ha/{ConfigTriggerSystem-CwUhyFAj.js → ConfigTriggerSystem-CC9lqi8Q.js} +2 -2
- package/dist/interface/ha/{ConfigTriggerWebhook-J6Xts7GQ.js → ConfigTriggerWebhook-BuBcgXqf.js} +1 -1
- package/dist/interface/ha/{Console-BSdKFm6Y.js → Console-DNc49UEt.js} +13 -13
- package/dist/interface/ha/{CuiAutomationRunsDialog-BU8sympp.js → CuiAutomationRunsDialog-Dj_iiZht.js} +2 -2
- package/dist/interface/ha/{CuiBottomSheet-Bnp7ta7V.js → CuiBottomSheet-DG7wOV7m.js} +1 -1
- package/dist/interface/ha/{CuiCameraRecordings-E-mMqKSs.js → CuiCameraRecordings-BlOZTfQ4.js} +12 -12
- package/dist/interface/ha/{CuiCameraShares-DcNwd2OC.js → CuiCameraShares-BOn-mobi.js} +2 -2
- package/dist/interface/ha/{CuiCameraTable-DNW9Vm_A.js → CuiCameraTable-D50FLiK8.js} +9 -9
- package/dist/interface/ha/{CuiChartTable-muC7jL2H.js → CuiChartTable-CfcVRvdZ.js} +42 -42
- package/dist/interface/ha/{CuiConsole-ND8bcuTg.js → CuiConsole-UpN0Wihm.js} +6 -6
- package/dist/interface/ha/{CuiDataTable-CN4T8DgP.js → CuiDataTable-CpADXKNF.js} +6 -6
- package/dist/interface/ha/{CuiPluginCard-nIQiyQvH.js → CuiPluginCard-CT6ZfL9o.js} +52 -52
- package/dist/interface/ha/{CuiPluginOAuthButton-FJ49NfUh.js → CuiPluginOAuthButton-BJVKd6Ac.js} +6 -6
- package/dist/interface/ha/{CuiPluginTrustBadge-D6eanMyI.js → CuiPluginTrustBadge-gb9GI24w.js} +3 -3
- package/dist/interface/ha/{CuiQRCode-BdJzeeoE.js → CuiQRCode-DqKDx9zR.js} +7 -7
- package/dist/interface/ha/{CuiSchema-DY0V-8xP.js → CuiSchema-CHeJkx0k.js} +129 -129
- package/dist/interface/ha/{CuiTopNavbarItem-DT5pAKHp.js → CuiTopNavbarItem-CFeI6ZYU.js} +5 -5
- package/dist/interface/ha/Faces-CTfvhhCj.js +1441 -0
- package/dist/interface/ha/{FirstSteps-yS2M2cor.js → FirstSteps-C-WXJ8IL.js} +80 -80
- package/dist/interface/ha/{Floorplan-DSOeScjI.js → Floorplan-CDKTYN7B.js} +307 -307
- package/dist/interface/ha/{Instances-B4h5EKpF.js → Instances-n23yvN3L.js} +62 -62
- package/dist/interface/ha/{Logs-BH0Lxvs6.js → Logs-Dfm0BWOQ.js} +10 -10
- package/dist/interface/ha/{Menu-COH7QXuE.js → Menu-76kvdAEF.js} +15 -15
- package/dist/interface/ha/{Metrics-BtnRqL_I.js → Metrics-lnivlTWm.js} +101 -100
- package/dist/interface/ha/{OAuthDeviceFlow-D2QJ9MnP.js → OAuthDeviceFlow-4ChaymHu.js} +7 -7
- package/dist/interface/ha/{Plugin-EfUSqwyh.js → Plugin-BV8YA8aN.js} +486 -347
- package/dist/interface/ha/{PluginConsole-hh_o15f7.js → PluginConsole-csf1Km7f.js} +4 -4
- package/dist/interface/ha/{PluginDetail-DFiXGkrY.js → PluginDetail-DTff6cbA.js} +185 -185
- package/dist/interface/ha/{PluginSearch-Cdrfubrj.js → PluginSearch-CdjxmFPN.js} +116 -116
- package/dist/interface/ha/{PluginUpdateProgress-BD2g2kVj.js → PluginUpdateProgress-ClyF4pbA.js} +3 -3
- package/dist/interface/ha/{Plugins-qFiHW-Nk.js → Plugins-_xOrqP36.js} +34 -34
- package/dist/interface/ha/{RecentEventsFilter-UWrXnvfq.js → RecentEventsFilter-9ZkDHD1g.js} +1 -1
- package/dist/interface/ha/{Recordings-BzeC6tOz.js → Recordings-dTZv0pkp.js} +483 -458
- package/dist/interface/ha/{SensorEdit-BSgy7lkZ.js → SensorEdit-DDRkZjmm.js} +40 -40
- package/dist/interface/ha/{SensorHistory-IDvP8LKH.js → SensorHistory-DSGlRITr.js} +2 -2
- package/dist/interface/ha/{Sensors-Diqp4oZ0.js → Sensors-DjhGRUzM.js} +477 -462
- package/dist/interface/ha/{Settings-BgDsxAlx.js → Settings-DYuvz4de.js} +17 -17
- package/dist/interface/ha/{SettingsAccount-DBXMQPYk.js → SettingsAccount-DQAo8SnK.js} +146 -146
- package/dist/interface/ha/{SettingsAppearance-VmbjnT3o.js → SettingsAppearance-_tbhpUA0.js} +8 -8
- package/dist/interface/ha/{SettingsAssistant-C2R4ZetE.js → SettingsAssistant-DSf-dYuD.js} +656 -533
- package/dist/interface/ha/{SettingsBackup-BqY9TwYn.js → SettingsBackup-wLOa7xtw.js} +40 -40
- package/dist/interface/ha/{SettingsList-CzHcfo2N.js → SettingsList-CYujivw5.js} +4 -4
- package/dist/interface/ha/{SettingsMqtt-DqV3h3Ow.js → SettingsMqtt-DbxJ-h3J.js} +115 -115
- package/dist/interface/ha/{SettingsNotifications-yn5fIR_7.js → SettingsNotifications-DO2-KJvq.js} +118 -118
- package/dist/interface/ha/{SettingsRecordings-DDs1lyfY.js → SettingsRecordings-C47i1UhI.js} +9 -9
- package/dist/interface/ha/{SettingsRemote-jBw3l5E0.js → SettingsRemote-BPvb-KLI.js} +335 -335
- package/dist/interface/ha/{SettingsSystem-BOv9hNlk.js → SettingsSystem-BJPrv9JE.js} +9 -9
- package/dist/interface/ha/{SettingsUsers-Biv-2F4C.js → SettingsUsers-CcpCz6Y1.js} +89 -89
- package/dist/interface/ha/{Terminal-CmcrGEV0.js → Terminal-DT7-WNH1.js} +16 -16
- package/dist/interface/ha/Training-CqGBf8k1.js +1694 -0
- package/dist/interface/ha/{Updates-DJAcmDQJ.js → Updates-CgdrqX6R.js} +13 -13
- package/dist/interface/ha/{VariableInput-DlYg7t0m.js → VariableInput-DOzSFgxT.js} +1 -1
- package/dist/interface/ha/{VersionsHandler-UnrAWn-b.js → VersionsHandler-ItklhE2t.js} +10 -10
- package/dist/interface/ha/{VirtualSensorCreate-CssxeaCC.js → VirtualSensorCreate-DbS3VqHC.js} +2 -2
- package/dist/interface/ha/{Workers-CLpqLugC.js → Workers-6PU7yUv1.js} +36 -36
- package/dist/interface/ha/{api-BP7mlzjP.js → api-Dv3Lk_g5.js} +8832 -8608
- package/dist/interface/ha/{api-B_tDa73J.js → api-anWolhVj.js} +3 -3
- package/dist/interface/ha/{assistant-Cb6ACguQ.js → assistant-B3m0Kgev.js} +101 -97
- package/dist/interface/ha/{auth-DOYDRgFm.js → auth-CAkpM_7A.js} +33 -33
- package/dist/interface/ha/{automationBlueprint-CbbG_ku4.js → automationBlueprint-DwVvbKbw.js} +4 -4
- package/dist/interface/ha/cameraui-cards.js +1 -1
- package/dist/interface/ha/{cards-BpBP1zVW.js → cards-B0qagpBw.js} +743 -667
- package/dist/interface/ha/{config-DroY1HBs.js → config-C20itAPE.js} +14 -14
- package/dist/interface/ha/database-refresh-outline-PiqlCkA7.js +19 -0
- package/dist/interface/ha/{dist-BTp4AyuI.js → dist-BIngHzHx.js} +5 -5
- package/dist/interface/ha/{dist-C6MBHJhs.js → dist-oFWkn6pD.js} +5 -8
- package/dist/interface/ha/{mqtt-NJTVdd53.js → mqtt-C6JvkA5E.js} +14 -14
- package/dist/interface/ha/{notifications-BPTvvgvv.js → notifications-gLmNZxwZ.js} +19 -19
- package/dist/interface/ha/{pinia-C6gt7A_Q.js → pinia-Du8AM917.js} +639 -625
- package/dist/interface/ha/{plugins-B29K3nQP.js → plugins-6x0kBuQb.js} +53 -53
- package/dist/interface/ha/{rooms-DLw0WUy_.js → rooms-C-mLT6mX.js} +11 -11
- package/dist/interface/ha/{server-B4b5_Ecu.js → server-DuikIt69.js} +28 -28
- package/dist/interface/ha/{types-DJHHL7nn.js → types-C0NcQ4Cz.js} +49 -38
- package/dist/interface/ha/{types-XqA3YJPD.js → types-wLECk3Ml.js} +3 -1
- package/dist/interface/ha/{ungrouped-xyK1QrsM.js → ungrouped-ooCH0Izh.js} +120 -120
- package/dist/interface/ha/{updates-XFSu9Tfm.js → updates-H8MlOQLC.js} +36 -36
- package/dist/interface/ha/{useAppVersion-BH3rU1zz.js → useAppVersion-DAUCV_cn.js} +1 -1
- package/dist/interface/ha/{useLogsSocket-CaTRzvgU.js → useLogsSocket-BOLAXPuD.js} +1 -1
- package/dist/interface/ha/{useNavLayout-DV0_OQx0.js → useNavLayout-B7VoHzM1.js} +2 -2
- package/dist/interface/ha/{useServerRestart-C8tynLUf.js → useServerRestart-qSH0bqwY.js} +1 -1
- package/dist/interface/ha/{useTabSwipe-CFoLDp3j.js → useTabSwipe-DYzG_gVG.js} +1 -1
- package/dist/interface/ha/{useUpdateChannel-DSG2RTPe.js → useUpdateChannel-CK7JiWbG.js} +2 -2
- package/dist/interface/ha/{useUpdatesSocket-CSQ0g7-6.js → useUpdatesSocket-DrqkGMuR.js} +1 -1
- package/dist/interface/ha/{useUserOptions-CFaCy6L1.js → useUserOptions-BteVUdaT.js} +1 -1
- package/dist/interface/index.html +70 -70
- package/dist/interface/sw.js +1 -1
- package/dist/server/package.json +28 -28
- package/dist/server/requirements.txt +2 -2
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/__init__.py +44 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/config.py +2 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/camera/detection.py +7 -2
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/__init__.py +42 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/assistant_models.py +300 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/contract.py +9 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/helper.py +21 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/plugin/interfaces.py +80 -4
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/__init__.py +6 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/base.py +2 -0
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/face.py +3 -7
- package/dist/server/src/_camera_ui_tools/camera_ui_sdk/sensor/face_embedder.py +69 -0
- package/dist/server/src/api/controllers/assistant.controller.js +1 -1
- package/dist/server/src/api/controllers/assistant.controller.js.map +1 -1
- package/dist/server/src/api/database/index.d.ts +1 -1
- package/dist/server/src/api/database/index.js +1 -1
- package/dist/server/src/api/database/migrations/v2-2-5.d.ts +3 -0
- package/dist/server/src/api/database/migrations/v2-2-5.js +19 -0
- package/dist/server/src/api/database/migrations/v2-2-5.js.map +1 -0
- package/dist/server/src/api/database/record-schemas.d.ts +4 -2
- package/dist/server/src/api/database/record-schemas.js +4 -1
- package/dist/server/src/api/database/record-schemas.js.map +1 -1
- package/dist/server/src/api/database/types.d.ts +5 -1
- package/dist/server/src/api/schemas/assistant.schema.d.ts +21 -7
- package/dist/server/src/api/schemas/assistant.schema.js +4 -1
- package/dist/server/src/api/schemas/assistant.schema.js.map +1 -1
- package/dist/server/src/api/schemas/cameras.schema.d.ts +56 -8
- package/dist/server/src/api/schemas/cameras.schema.js +4 -3
- package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
- package/dist/server/src/api/services/assistant.service.d.ts +1 -1
- package/dist/server/src/api/services/assistant.service.js +4 -1
- package/dist/server/src/api/services/assistant.service.js.map +1 -1
- package/dist/server/src/api/services/cameras.service.js +2 -2
- package/dist/server/src/api/services/cameras.service.js.map +1 -1
- package/dist/server/src/api/websocket/nsp/logs.js +3 -3
- package/dist/server/src/api/websocket/nsp/logs.js.map +1 -1
- package/dist/server/src/api/websocket/nsp/worker-perf.js +13 -0
- package/dist/server/src/api/websocket/nsp/worker-perf.js.map +1 -1
- package/dist/server/src/api/websocket/types.d.ts +12 -0
- package/dist/server/src/assistant/budget.d.ts +27 -0
- package/dist/server/src/assistant/budget.js +118 -0
- package/dist/server/src/assistant/budget.js.map +1 -0
- package/dist/server/src/assistant/compaction.d.ts +10 -0
- package/dist/server/src/assistant/compaction.js +83 -0
- package/dist/server/src/assistant/compaction.js.map +1 -0
- package/dist/server/src/assistant/docs.js +4 -3
- package/dist/server/src/assistant/docs.js.map +1 -1
- package/dist/server/src/assistant/history.d.ts +1 -0
- package/dist/server/src/assistant/history.js +28 -0
- package/dist/server/src/assistant/history.js.map +1 -1
- package/dist/server/src/assistant/manager.d.ts +10 -0
- package/dist/server/src/assistant/manager.js +261 -62
- package/dist/server/src/assistant/manager.js.map +1 -1
- package/dist/server/src/assistant/plugin-models.d.ts +34 -0
- package/dist/server/src/assistant/plugin-models.js +266 -0
- package/dist/server/src/assistant/plugin-models.js.map +1 -0
- package/dist/server/src/assistant/prompt.d.ts +7 -1
- package/dist/server/src/assistant/prompt.js +75 -11
- package/dist/server/src/assistant/prompt.js.map +1 -1
- package/dist/server/src/assistant/providers.js +7 -3
- package/dist/server/src/assistant/providers.js.map +1 -1
- package/dist/server/src/assistant/recap.d.ts +3 -0
- package/dist/server/src/assistant/recap.js +65 -0
- package/dist/server/src/assistant/recap.js.map +1 -0
- package/dist/server/src/assistant/registry.d.ts +16 -1
- package/dist/server/src/assistant/registry.js +49 -1
- package/dist/server/src/assistant/registry.js.map +1 -1
- package/dist/server/src/assistant/retry.js +38 -24
- package/dist/server/src/assistant/retry.js.map +1 -1
- package/dist/server/src/assistant/router.d.ts +7 -0
- package/dist/server/src/assistant/router.js +67 -0
- package/dist/server/src/assistant/router.js.map +1 -0
- package/dist/server/src/assistant/skills.d.ts +8 -0
- package/dist/server/src/assistant/skills.js +59 -1
- package/dist/server/src/assistant/skills.js.map +1 -1
- package/dist/server/src/assistant/threads.d.ts +1 -0
- package/dist/server/src/assistant/threads.js +7 -1
- package/dist/server/src/assistant/threads.js.map +1 -1
- package/dist/server/src/assistant/tool-names.js +9 -1
- package/dist/server/src/assistant/tool-names.js.map +1 -1
- package/dist/server/src/assistant/tool-rank.d.ts +2 -0
- package/dist/server/src/assistant/tool-rank.js +48 -0
- package/dist/server/src/assistant/tool-rank.js.map +1 -0
- package/dist/server/src/assistant/tool-schema.d.ts +3 -0
- package/dist/server/src/assistant/tool-schema.js +65 -0
- package/dist/server/src/assistant/tool-schema.js.map +1 -0
- package/dist/server/src/assistant/tools/api.js +7 -9
- package/dist/server/src/assistant/tools/api.js.map +1 -1
- package/dist/server/src/assistant/tools/ask.js +1 -2
- package/dist/server/src/assistant/tools/ask.js.map +1 -1
- package/dist/server/src/assistant/tools/automations.js +3 -5
- package/dist/server/src/assistant/tools/automations.js.map +1 -1
- package/dist/server/src/assistant/tools/cameras.js +3 -4
- package/dist/server/src/assistant/tools/cameras.js.map +1 -1
- package/dist/server/src/assistant/tools/docs.js +5 -6
- package/dist/server/src/assistant/tools/docs.js.map +1 -1
- package/dist/server/src/assistant/tools/instance.js +19 -19
- package/dist/server/src/assistant/tools/instance.js.map +1 -1
- package/dist/server/src/assistant/tools/memory.js +3 -4
- package/dist/server/src/assistant/tools/memory.js.map +1 -1
- package/dist/server/src/assistant/tools/metrics.js +1 -2
- package/dist/server/src/assistant/tools/metrics.js.map +1 -1
- package/dist/server/src/assistant/tools/notifications.js +4 -11
- package/dist/server/src/assistant/tools/notifications.js.map +1 -1
- package/dist/server/src/assistant/tools/plugins.js +12 -14
- package/dist/server/src/assistant/tools/plugins.js.map +1 -1
- package/dist/server/src/assistant/tools/report.js +17 -12
- package/dist/server/src/assistant/tools/report.js.map +1 -1
- package/dist/server/src/assistant/tools/schedules.js +6 -11
- package/dist/server/src/assistant/tools/schedules.js.map +1 -1
- package/dist/server/src/assistant/tools/sensors.js +63 -4
- package/dist/server/src/assistant/tools/sensors.js.map +1 -1
- package/dist/server/src/assistant/tools/settings.js +2 -3
- package/dist/server/src/assistant/tools/settings.js.map +1 -1
- package/dist/server/src/assistant/tools/system.js +3 -5
- package/dist/server/src/assistant/tools/system.js.map +1 -1
- package/dist/server/src/assistant/tools/terminal.js +4 -5
- package/dist/server/src/assistant/tools/terminal.js.map +1 -1
- package/dist/server/src/assistant/types.d.ts +10 -1
- package/dist/server/src/assistant/uploads.d.ts +2 -1
- package/dist/server/src/assistant/uploads.js +25 -3
- package/dist/server/src/assistant/uploads.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-coordinator.d.ts +5 -0
- package/dist/server/src/camera/decoder/detection-coordinator.js +45 -14
- package/dist/server/src/camera/decoder/detection-coordinator.js.map +1 -1
- package/dist/server/src/camera/decoder/detection-pipeline.js +2 -1
- package/dist/server/src/camera/decoder/detection-pipeline.js.map +1 -1
- package/dist/server/src/camera/decoder/event-manager.d.ts +27 -4
- package/dist/server/src/camera/decoder/event-manager.js +175 -48
- package/dist/server/src/camera/decoder/event-manager.js.map +1 -1
- package/dist/server/src/camera/decoder/nvr-sink.d.ts +4 -1
- package/dist/server/src/camera/decoder/nvr-sink.js +1 -1
- package/dist/server/src/camera/decoder/nvr-sink.js.map +1 -1
- package/dist/server/src/camera/decoder/perf-tracker.d.ts +10 -0
- package/dist/server/src/camera/decoder/perf-tracker.js +20 -0
- package/dist/server/src/camera/decoder/perf-tracker.js.map +1 -1
- package/dist/server/src/camera/decoder/secondary-stage.d.ts +21 -1
- package/dist/server/src/camera/decoder/secondary-stage.js +301 -59
- package/dist/server/src/camera/decoder/secondary-stage.js.map +1 -1
- package/dist/server/src/camera/decoder/side-queue.d.ts +13 -0
- package/dist/server/src/camera/decoder/side-queue.js +53 -0
- package/dist/server/src/camera/decoder/side-queue.js.map +1 -0
- package/dist/server/src/camera/decoder/sources/buffered-source.d.ts +2 -0
- package/dist/server/src/camera/decoder/sources/buffered-source.js +7 -1
- package/dist/server/src/camera/decoder/sources/buffered-source.js.map +1 -1
- package/dist/server/src/camera/decoder/types.d.ts +11 -1
- package/dist/server/src/camera/decoder/types.js +9 -1
- package/dist/server/src/camera/decoder/types.js.map +1 -1
- package/dist/server/src/camera/sensors/controller.d.ts +1 -0
- package/dist/server/src/camera/sensors/controller.js +28 -4
- package/dist/server/src/camera/sensors/controller.js.map +1 -1
- package/dist/server/src/main.js +11 -2
- package/dist/server/src/main.js.map +1 -1
- package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +1 -14
- package/dist/server/src/plugins/runtime/python/proxy/sensor.py +14 -1
- package/dist/server/src/plugins/runtime/python/proxy/sensor_manager.py +1 -13
- package/dist/server/src/rpc/interfaces/detection.d.ts +14 -2
- package/dist/server/src/rpc/server.js +1 -0
- package/dist/server/src/rpc/server.js.map +1 -1
- package/dist/server/src/services/config/index.d.ts +1 -0
- package/dist/server/src/services/config/index.js +6 -11
- package/dist/server/src/services/config/index.js.map +1 -1
- package/dist/server/src/utils/camera.js +8 -5
- package/dist/server/src/utils/camera.js.map +1 -1
- package/dist/server/src/utils/instance-lock.d.ts +1 -0
- package/dist/server/src/utils/instance-lock.js +57 -0
- package/dist/server/src/utils/instance-lock.js.map +1 -0
- package/dist/server/src/workers/agent.d.ts +2 -0
- package/dist/server/src/workers/agent.js +11 -1
- package/dist/server/src/workers/agent.js.map +1 -1
- package/dist/server/src/workers/manager.js +9 -2
- package/dist/server/src/workers/manager.js.map +1 -1
- package/dist/server/src/workers/types.d.ts +1 -0
- package/npm-shrinkwrap.json +209 -209
- package/package.json +28 -28
- package/dist/interface/assets/Assistant-bB8RBo-m.js +0 -1
- package/dist/interface/assets/Automations-BdZZW2eN.js +0 -2
- package/dist/interface/assets/Camera-Ct7ndOxr.js +0 -2
- package/dist/interface/assets/Camview-BjQdTHNh.js +0 -1
- package/dist/interface/assets/Config-CBTbYd5v.js +0 -2
- package/dist/interface/assets/ConfigTriggerGeofence-Bl2ZacbY.js +0 -1
- package/dist/interface/assets/Console-Cfk9MA9m.js +0 -1
- package/dist/interface/assets/CuiAssistantConversation-BHK_i56I.js +0 -5
- package/dist/interface/assets/CuiAutomationRunsDialog-B0ohEHw0.js +0 -1
- package/dist/interface/assets/CuiBottomSheet-NgX7VFao.js +0 -1
- package/dist/interface/assets/CuiCameraRecordings-BTD-CQAg.js +0 -1
- package/dist/interface/assets/CuiCameraTable-KPk46Xcl.js +0 -1
- package/dist/interface/assets/CuiDataTable-CsqH-RB1.js +0 -1
- package/dist/interface/assets/CuiMarkdownContent-DSArmS0V.js +0 -1
- package/dist/interface/assets/CuiSchema-ytExUVhI.js +0 -1
- package/dist/interface/assets/Faces-Cb6XMxDC.js +0 -1
- package/dist/interface/assets/Floorplan-DbqADtN1.js +0 -1
- package/dist/interface/assets/Instances-DrMzPD65.js +0 -1
- package/dist/interface/assets/Metrics-BUP_-7o7.css +0 -1
- package/dist/interface/assets/Metrics-CqhUnVRA.js +0 -12
- package/dist/interface/assets/Plugin-BDqNeTCT.css +0 -1
- package/dist/interface/assets/Plugin-DyOg_fbg.js +0 -1
- package/dist/interface/assets/PluginSearch-BgecD9Ob.js +0 -2
- package/dist/interface/assets/PluginSearch-C8xHKikH.js +0 -1
- package/dist/interface/assets/Plugins-CuujWEtM.js +0 -1
- package/dist/interface/assets/Recordings-9FJqCfdM.css +0 -1
- package/dist/interface/assets/Recordings-ths9khZr.js +0 -1
- package/dist/interface/assets/SensorEdit-BzoIH7QC.js +0 -1
- package/dist/interface/assets/Sensors-CK5uExfU.js +0 -2
- package/dist/interface/assets/Settings-DN5hFtw_.js +0 -1
- package/dist/interface/assets/SettingsAccount-BCrmon5O.js +0 -1
- package/dist/interface/assets/SettingsAccount-CSy1BAIH.js +0 -1
- package/dist/interface/assets/SettingsAppearance-h_XPZfQl.js +0 -1
- package/dist/interface/assets/SettingsAssistant-BESab92C.css +0 -1
- package/dist/interface/assets/SettingsAssistant-D8FmVbUL.js +0 -1
- package/dist/interface/assets/SettingsMqtt-DCkLIYpF.js +0 -1
- package/dist/interface/assets/SettingsRemote-DXlQKwlT.js +0 -2
- package/dist/interface/assets/Terminal-Dl-aAZME.js +0 -4
- package/dist/interface/assets/Training-B1oQjAr8.css +0 -1
- package/dist/interface/assets/Training-DdZjXgt1.js +0 -1
- package/dist/interface/assets/Updates-CkB1lXuo.js +0 -2
- package/dist/interface/assets/Workers-7yiebNkl.js +0 -2
- package/dist/interface/assets/api-DK2Bav9D.js +0 -4
- package/dist/interface/assets/api-DTCqDA-h.css +0 -2
- package/dist/interface/assets/assistant-BJ6xKcw_.js +0 -1
- package/dist/interface/assets/cloudHandoff-DtlquYGZ.js +0 -1
- package/dist/interface/assets/esm-4Hzzm93H.js +0 -1
- package/dist/interface/assets/esm-BrFPi5_4.js +0 -1
- package/dist/interface/assets/esm-C7pcdfXf.js +0 -1
- package/dist/interface/assets/esm-C8bsO829.js +0 -1
- package/dist/interface/assets/esm-CXzdnAMk.js +0 -1
- package/dist/interface/assets/esm-CZNGZkPu.js +0 -1
- package/dist/interface/assets/esm-D0iI7OVb.js +0 -1
- package/dist/interface/assets/esm-DKolm6KU.js +0 -1
- package/dist/interface/assets/esm-DTywI9gs.js +0 -1
- package/dist/interface/assets/esm-DifXcK9i.js +0 -1
- package/dist/interface/assets/esm-Dq5o-Xb4.js +0 -1
- package/dist/interface/assets/esm-IbQuUZ5l.js +0 -1
- package/dist/interface/assets/esm-Xre_AP5i.js +0 -1
- package/dist/interface/assets/esm-zYnXHhpH.js +0 -1
- package/dist/interface/assets/main-D74mRIxc.js +0 -3
- package/dist/interface/assets/native-CAujTO6L.js +0 -1
- package/dist/interface/assets/native-sQ88qazf.js +0 -1
- package/dist/interface/assets/plugin-D7K50k_y.js +0 -1
- package/dist/interface/assets/sensorIcons-DQVgryYP.js +0 -1
- package/dist/interface/assets/types-5rE8Tz0_.js +0 -1
- package/dist/interface/assets/ungrouped-D56FGIrg.js +0 -1
- package/dist/interface/assets/useBackupRestore-Crfd592q.js +0 -1
- package/dist/interface/assets/useUserOptions-BTRBUuE2.js +0 -1
- package/dist/interface/assets/vendor-gridstack-anPyIu9V.js +0 -3
- package/dist/interface/assets/web-3M-ddn4G.js +0 -1
- package/dist/interface/assets/web-BY80VGyU.js +0 -1
- package/dist/interface/assets/web-B_tUYyM0.js +0 -1
- package/dist/interface/assets/web-BjKL51lK-Bb5NYhpJ.js +0 -1
- package/dist/interface/assets/web-Bv-4PJGI.js +0 -1
- package/dist/interface/assets/web-C3Pk8qeB.js +0 -1
- package/dist/interface/assets/web-CLcvGPH6.js +0 -1
- package/dist/interface/assets/web-DO8gTOVJ.js +0 -1
- package/dist/interface/assets/web-DR5q_DmI.js +0 -1
- package/dist/interface/assets/web-DRHbG4Te.js +0 -1
- package/dist/interface/assets/web-DaQ8d8yk.js +0 -1
- package/dist/interface/assets/web-EVRW5whF.js +0 -1
- package/dist/interface/assets/web-S6Dk3UWN.js +0 -1
- package/dist/interface/assets/web-pWIp0wf0.js +0 -1
- package/dist/interface/assets/workbox-window.prod.es5-Dz5rcO1z.js +0 -1
- package/dist/interface/ha/Faces-C_svyTrr.js +0 -1282
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
423
|
+
tools: probeTools ? [probe] : [],
|
|
424
|
+
agentLoopStrategy: maxIterations(3),
|
|
397
425
|
abortController: abort,
|
|
398
426
|
}));
|
|
399
|
-
vision = true;
|
|
400
427
|
}
|
|
401
|
-
catch {
|
|
402
|
-
|
|
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
|
|
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(
|
|
479
|
-
agentLoopStrategy: maxIterations(
|
|
480
|
-
lazyToolsConfig: { includeDescription:
|
|
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:
|
|
487
|
-
|
|
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
|
|
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(
|
|
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:
|
|
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 (
|
|
647
|
-
return { providerMessages };
|
|
648
|
-
|
|
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: (
|
|
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:
|
|
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(
|
|
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 {
|
|
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;
|