@camstack/addon-admin-ui 1.2.523 → 1.2.524

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 (152) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/assets/{AddonAssetIcon-VXnpNoSj.js → AddonAssetIcon-CYhJlTNc.js} +1 -1
  3. package/dist/assets/Addons-BRZelwav.js +5 -0
  4. package/dist/assets/{AdminPage-B9JLs4rT.js → AdminPage-B1Q3Lunl.js} +1 -1
  5. package/dist/assets/{AdminSectionedPage-EY_w3HY7.js → AdminSectionedPage-CDZfKkL5.js} +1 -1
  6. package/dist/assets/AiProfiles-DC8OxOmV.js +3 -0
  7. package/dist/assets/BrokerEditorDialog-BX5w7CMy.js +1 -0
  8. package/dist/assets/Build-BVaH843t.js +40 -0
  9. package/dist/assets/{Calendars-ClQsQ24o.js → Calendars-q3MUFOBU.js} +1 -1
  10. package/dist/assets/Cluster-BKvY1r-a.js +1 -0
  11. package/dist/assets/ComposedDeviceEditDialog-BLfm22uf.js +1 -0
  12. package/dist/assets/CompositionBlockEditor-CJhCzXua.js +2 -0
  13. package/dist/assets/{CompositionEditorPage-NlrSqavW.js → CompositionEditorPage-dOMxAK9V.js} +1 -1
  14. package/dist/assets/Data-BVPL4yIo.js +2 -0
  15. package/dist/assets/DeviceDetail-BO5_O1mV.js +2 -0
  16. package/dist/assets/{DeviceDoActionFields-CSKUhZmq.js → DeviceDoActionFields-B50ODgPq.js} +1 -1
  17. package/dist/assets/{Devices-DtEGEpYK.js → Devices-CrdlW5-A.js} +1 -1
  18. package/dist/assets/{EmbedPlayerPage-Er_9ZZbp.js → EmbedPlayerPage-JBC0G-2I.js} +1 -1
  19. package/dist/assets/History-BP1mlcwA.js +1 -0
  20. package/dist/assets/Identity-CY_zYbdN.js +1 -0
  21. package/dist/assets/IntegrationDetail-DCjuDqWm.js +1 -0
  22. package/dist/assets/IntegrationHub-DE2mwBdj.js +1 -0
  23. package/dist/assets/Integrations-BmHL7d-i.js +1 -0
  24. package/dist/assets/Integrations-CKAi9srg.js +1 -0
  25. package/dist/assets/{Library-CWzUsm1c.js → Library-BrWQ54N7.js} +1 -1
  26. package/dist/assets/Locations-3qWlGxP3.js +3 -0
  27. package/dist/assets/{Logs-CkwhOBrz.js → Logs-DYi_B3vg.js} +1 -1
  28. package/dist/assets/{MaskShapeCanvas-B_J8Nub8.js → MaskShapeCanvas-D8Ke0Dim.js} +1 -1
  29. package/dist/assets/{MotionZonesSettings-DSDOgPiK.js → MotionZonesSettings--YqW3Onz.js} +1 -1
  30. package/dist/assets/MyAccess-DswPvXxB.js +2 -0
  31. package/dist/assets/Network-ChYmByS2.js +1 -0
  32. package/dist/assets/{NodeAddonsSettingsPanel-CNSfsu26.js → NodeAddonsSettingsPanel-DtvhgNC4.js} +1 -1
  33. package/dist/assets/Notifications-5onsUC_w.js +1 -0
  34. package/dist/assets/Pipeline-CgmB5Be8.js +1 -0
  35. package/dist/assets/{PrivacyMaskSettings-Zr9fXd19.js → PrivacyMaskSettings-B-vpuYKA.js} +1 -1
  36. package/dist/assets/Recordings-Bglrn4rQ.js +1 -0
  37. package/dist/assets/RemoteGrid-C_9BszV-.js +1 -0
  38. package/dist/assets/{ScanNetworkModal-BO8EFEZ1.js → ScanNetworkModal-BnhOMFd1.js} +1 -1
  39. package/dist/assets/{SceneMonitorEditor-CvqEBzUw.js → SceneMonitorEditor-CkaBEtmE.js} +1 -1
  40. package/dist/assets/SessionsList--FQem8XB.js +2 -0
  41. package/dist/assets/{Showroom-ClQBf_59.js → Showroom-B9J1IdLQ.js} +1 -1
  42. package/dist/assets/{System-d-rVWfA6.js → System-BVE97mrs.js} +1 -1
  43. package/dist/assets/Templates-CvoAkIdF.js +1 -0
  44. package/dist/assets/{Terminal-dvCiPiu7.js → Terminal-ieNh6d83.js} +5 -5
  45. package/dist/assets/{Viewer-D04RI6WE.js → Viewer-CAf7sAU0.js} +1 -1
  46. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-CO8DU_dY.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-Bi1zqe4S.js} +1 -1
  47. package/dist/assets/{addon-icons-context-BsBIxYDH.js → addon-icons-context-RPiI9H0L.js} +1 -1
  48. package/dist/assets/{archive-Do2e48DU.js → archive-DQvuyIac.js} +1 -1
  49. package/dist/assets/{assignment-candidates-8RM__6oC.js → assignment-candidates-83kFfE1Z.js} +1 -1
  50. package/dist/assets/{authed-media-BYa-9dIZ.js → authed-media-BSoR_xYF.js} +1 -1
  51. package/dist/assets/{bell-off-RPYQoGP1.js → bell-off-C3u183tq.js} +1 -1
  52. package/dist/assets/{board-model-C9BgTio0.js → board-model-sARab1AV.js} +1 -1
  53. package/dist/assets/{boxes-BEverhi4.js → boxes-CVkAEP7e.js} +1 -1
  54. package/dist/assets/circle-slash-C86XHeiD.js +1 -0
  55. package/dist/assets/client-DcvpIFoh.js +674 -0
  56. package/dist/assets/{cloud-upload-nVfWiPdO.js → cloud-upload-CHQjI4ZF.js} +1 -1
  57. package/dist/assets/crop-Ct8elLRy.js +1 -0
  58. package/dist/assets/{device-integration-icon-C2pH_5Gl.js → device-integration-icon-DCuiIOlj.js} +1 -1
  59. package/dist/assets/device-picker-model-BvJkcx-a.js +1 -0
  60. package/dist/assets/{dist-BVH-vBQM.js → dist-B5lzpDFY.js} +1 -1
  61. package/dist/assets/{dist-ByEQfnSV.js → dist-BSrNHoV1.js} +1 -1
  62. package/dist/assets/{file-up-CUjXrmMK.js → file-up-C9_pj2VT.js} +1 -1
  63. package/dist/assets/{format-BccZ2tds.js → format-DGQA45Ye.js} +1 -1
  64. package/dist/assets/grip-vertical-C_VoFjYu.js +1 -0
  65. package/dist/assets/{hard-drive-download-DiXdli_I.js → hard-drive-download-DiC0khcq.js} +1 -1
  66. package/dist/assets/{hostInit-Bta217FF.js → hostInit-Dq6hIrVo.js} +1 -1
  67. package/dist/assets/{i18n-COiZcYwm.js → i18n-C-H4BlYV.js} +1 -1
  68. package/dist/assets/icons-C7pfBl-Q.js +1 -0
  69. package/dist/assets/index-DjwiZ7qT.css +2 -0
  70. package/dist/assets/index-o6kBNilE.js +4 -0
  71. package/dist/assets/{key-C0PivC5X.js → key-Cz6uvkUc.js} +1 -1
  72. package/dist/assets/{key-round-Cu5Tucyk.js → key-round-B9WTP907.js} +1 -1
  73. package/dist/assets/{layers-Cd1UYZNk.js → layers-DGMlfnn4.js} +1 -1
  74. package/dist/assets/{linked-devices-model-CFrDp7fw.js → linked-devices-model-D6PgoQtW.js} +1 -1
  75. package/dist/assets/{list-ordered-Bkr6PCeB.js → list-ordered-wHEw5a_e.js} +1 -1
  76. package/dist/assets/location-owned-usage-B-4MuD-Z.js +1 -0
  77. package/dist/assets/{log-in-DV8GfIgr.js → log-in-Da7IGp_j.js} +1 -1
  78. package/dist/assets/{memory-stick-C6TRN6ht.js → memory-stick-BLbgKSl7.js} +1 -1
  79. package/dist/assets/{message-square-plus-DTJ5QsLH.js → message-square-plus-CMdSHNUk.js} +1 -1
  80. package/dist/assets/{mf-entry-bootstrap-0-c0dc6497.js → mf-entry-bootstrap-0-e016a0f6.js} +2 -2
  81. package/dist/assets/{mic-off-gUMH3Z4J.js → mic-off-CIzR-elk.js} +1 -1
  82. package/dist/assets/{monitor-off-C4w1KSTZ.js → monitor-off-lToaeJ-K.js} +1 -1
  83. package/dist/assets/{monitor-smartphone-CpCqKvAV.js → monitor-smartphone-Dr1ELple.js} +1 -1
  84. package/dist/assets/mount-BvJkcx-a.js +1 -0
  85. package/dist/assets/{player-overlays-CZbAbeZY.js → player-overlays-oTS1TZZY.js} +1 -1
  86. package/dist/assets/{recycle-BaznD-UX.js → recycle-BNUPyJ7u.js} +1 -1
  87. package/dist/assets/remoteEntry-BK4ei3jy.js +1 -0
  88. package/dist/assets/{ruler-BSo-rKM0.js → ruler-CvDT4Z7Y.js} +1 -1
  89. package/dist/assets/{scan-eye-DN1vlvLP.js → scan-eye-BhxGMB3E.js} +1 -1
  90. package/dist/assets/{scissors-CC58_qMU.js → scissors-C-pdrglA.js} +1 -1
  91. package/dist/assets/{search-x-tQuhnR8q.js → search-x-wBrdZZXu.js} +1 -1
  92. package/dist/assets/{send-CAZEgHzo.js → send-D5hwnH6i.js} +1 -1
  93. package/dist/assets/{settings-2-BuBH9G2o.js → settings-2-D64sFGFI.js} +1 -1
  94. package/dist/assets/{shapes-D2hlOKTD.js → shapes-HTfCvSL2.js} +1 -1
  95. package/dist/assets/{sigma-Ceyn_S95.js → sigma-BYdS13dc.js} +1 -1
  96. package/dist/assets/{speaker-BRYEJSzP.js → speaker-DCCyafUF.js} +1 -1
  97. package/dist/assets/src-XEHc18wE.js +67 -0
  98. package/dist/assets/{step-inspector-model-BfR3NdqL.js → step-inspector-model-a05i0m0c.js} +1 -1
  99. package/dist/assets/{table-2-CuSc759e.js → table-2-BgDon14h.js} +1 -1
  100. package/dist/assets/{timer-reset-Bvn2aK40.js → timer-reset-Dst_i1Qg.js} +1 -1
  101. package/dist/assets/{unlink-BU_py8I2.js → unlink-CmmNdYky.js} +1 -1
  102. package/dist/assets/{usb-TZrC9eYC.js → usb-BCFcIAg4.js} +1 -1
  103. package/dist/assets/{use-device-bound-caps-CYR80PtH.js → use-device-bound-caps-CI6zlnII.js} +1 -1
  104. package/dist/assets/{use-scenes-feed-Ddftx740.js → use-scenes-feed-junBfGeR.js} +1 -1
  105. package/dist/assets/{use-stationary-objects-CJ3xxs43.js → use-stationary-objects-blP9Y5SS.js} +1 -1
  106. package/dist/assets/useEventInvalidation-BvJkcx-a.js +1 -0
  107. package/dist/assets/{useNodeUrlSelection-DNEz-JoD.js → useNodeUrlSelection-Cb470tqR.js} +1 -1
  108. package/dist/assets/user-round-D3ZUZuP3.js +1 -0
  109. package/dist/assets/{user-x-CYHlbR6F.js → user-x-891p2Gny.js} +1 -1
  110. package/dist/assets/{variable-BNQlwoos.js → variable-HM7A54CP.js} +1 -1
  111. package/dist/assets/{video-CrmOxhYy.js → video-Dx3E7zlj.js} +1 -1
  112. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-Bucq-FfY.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DHe9cBRl.js} +2 -2
  113. package/dist/index.html +10 -10
  114. package/dist/server/addon.js +43 -6
  115. package/package.json +1 -1
  116. package/dist/assets/Addons-DlINdzv0.js +0 -5
  117. package/dist/assets/AiProfiles-fuyzr8D4.js +0 -3
  118. package/dist/assets/BrokerEditorDialog-DoEQXizE.js +0 -1
  119. package/dist/assets/Build-CvZFLBc9.js +0 -40
  120. package/dist/assets/Cluster-D31IV0wr.js +0 -1
  121. package/dist/assets/ComposedDeviceEditDialog-Chymp38w.js +0 -1
  122. package/dist/assets/CompositionBlockEditor-CpPHLcVD.js +0 -2
  123. package/dist/assets/Data-BBsE7UVR.js +0 -2
  124. package/dist/assets/DeviceDetail-zZcKfcTs.js +0 -2
  125. package/dist/assets/History-DEuMaAFu.js +0 -1
  126. package/dist/assets/Identity-Bo-ulITU.js +0 -1
  127. package/dist/assets/IntegrationDetail-IopkO40B.js +0 -1
  128. package/dist/assets/IntegrationHub-CaKFrwmD.js +0 -1
  129. package/dist/assets/Integrations-B0XFfGvM.js +0 -1
  130. package/dist/assets/Integrations-DrmJI4oI.js +0 -1
  131. package/dist/assets/Locations-CUYgtHWg.js +0 -3
  132. package/dist/assets/MyAccess-kZWZLQ6w.js +0 -2
  133. package/dist/assets/Network-CsAvssW1.js +0 -1
  134. package/dist/assets/Notifications-eEXyaFax.js +0 -1
  135. package/dist/assets/Pipeline-CL-VwLPy.js +0 -1
  136. package/dist/assets/Recordings-BrITac0q.js +0 -1
  137. package/dist/assets/RemoteGrid-BGbiDThN.js +0 -1
  138. package/dist/assets/SessionsList-BkbXjQt1.js +0 -2
  139. package/dist/assets/Templates-BY9R_5lz.js +0 -1
  140. package/dist/assets/circle-slash-Bb_aa_QL.js +0 -1
  141. package/dist/assets/client-D-g0nOrC.js +0 -674
  142. package/dist/assets/crop-DVR1vsA9.js +0 -1
  143. package/dist/assets/device-picker-model-DBfk1Co5.js +0 -1
  144. package/dist/assets/icons-CDeaov6N.js +0 -1
  145. package/dist/assets/index-DnHMM2c9.css +0 -2
  146. package/dist/assets/index-Dqmlzvdc.js +0 -4
  147. package/dist/assets/location-owned-usage-E6eX4phu.js +0 -1
  148. package/dist/assets/mount-DBfk1Co5.js +0 -1
  149. package/dist/assets/remoteEntry-8jIMK97P.js +0 -1
  150. package/dist/assets/src-iRjUEwun.js +0 -67
  151. package/dist/assets/useEventInvalidation-DBfk1Co5.js +0 -1
  152. package/dist/assets/user-round-jCdxL4f8.js +0 -1
@@ -0,0 +1 @@
1
+ import{C as e,J as t,K as n,R as r,S as i,V as a,Y as o,et as s,o as c,x as l}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{D as u,Dn as d,Ei as f,En as p,Fn as m,Gn as h,Ht as g,Kr as _,Oi as v,Ri as y,Si as b,Vn as x,_n as S,aa as C,bi as w,dt as T,fr as E,gt as D,ki as O,kn as k,mi as A,pn as j,ri as M,st as N,vn as P,wn as F,yn as I,zt as L}from"./player-overlays-oTS1TZZY.js";import{co as R,lo as ee,po as te,so as ne}from"./client-DcvpIFoh.js";import{t as re}from"./hard-drive-download-DiC0khcq.js";import{t as ie}from"./memory-stick-BLbgKSl7.js";import{t as ae}from"./unlink-CmmNdYky.js";import{An as z,Cr as oe,Ct as se,Dc as ce,Dl as le,Ec as ue,Et as B,Fd as V,Fo as de,I as fe,Ln as pe,Mr as me,Nl as he,Nr as ge,Oc as _e,On as ve,Pr as ye,Sr as be,Tr as xe,Vu as Se,Wd as Ce,_i as we,_u as Te,bc as Ee,br as De,bu as Oe,cn as ke,di as Ae,gi as je,gu as Me,hi as Ne,jn as Pe,kc as Fe,kn as Ie,nf as Le,of as H,rf as U,ri as W,sn as Re,ul as ze,ut as Be,vi as Ve,vl as He,vu as Ue,wr as We,xr as Ge,yc as Ke,yr as qe,yu as Je}from"./src-XEHc18wE.js";import{t as G}from"./i18n-C-H4BlYV.js";import{t as K}from"./useTranslation-BJr-n0es.js";import{x as Ye,yr as Xe}from"./index-o6kBNilE.js";import{n as Ze}from"./format-DGQA45Ye.js";import{t as Qe}from"./AdminPage-B1Q3Lunl.js";import{t as $e}from"./NodeAddonsSettingsPanel-DtvhgNC4.js";import{f as et,l as tt,m as nt,u as rt}from"./board-model-sARab1AV.js";import{t as q}from"./format-size-DIxKXxtj.js";import{n as it,t as at}from"./useNodeUrlSelection-Cb470tqR.js";s();var ot={unpaired:`Not paired`,pending:`Pairing…`,paired:`Paired`},st=new Set([`paired`,`rejected`,`failed`,`expired`]);function J(e){return st.has(e)}function ct(e){return e.replace(/\D/g,``).slice(0,6)}function lt(e){return e.length===6}function ut(e,t){let n=Math.max(0,Math.ceil((e-t)/1e3)),r=Math.floor(n/60),i=n%60;return`${r}:${String(i).padStart(2,`0`)}`}function dt(e,t){return e.includes(`:`)?`[${e}]:${t}`:`${e}:${t}`}function ft(e){return e.length<=23?e:`${e.slice(0,20)}…`}function pt({view:e,beginError:t}){if(e===null)return t===null?`sending`:`send-failed`;switch(e.state){case`paired`:return`paired`;case`rejected`:return`rejected`;case`failed`:return`failed`;case`expired`:return`expired`;case`completing`:return`completing`;case`awaiting-confirmation`:return e.hubConfirmed&&!e.agentConfirmed?`awaiting-agent`:e.agentConfirmed&&!e.hubConfirmed?`awaiting-hub`:`awaiting-both`}}function mt(e){return e===`awaiting-both`||e===`awaiting-hub`}var ht={sending:`Sending the pairing offer to the agent…`,"send-failed":`The agent could not be reached`,"awaiting-both":`Waiting for both confirmations`,"awaiting-agent":`Confirmed here — waiting for the agent`,"awaiting-hub":`The agent is confirmed — now confirm here`,completing:`Issuing the node certificate…`,paired:`Paired`,rejected:`Pairing was rejected`,failed:`Pairing failed`,expired:`The pairing expired`},gt=2e3,_t=1e3;function vt(e){return e.message.length>0?e.message:G.t(`pairing.agentsFoundSection.requestFailed`)}function yt(e){return e.length===6?`${e.slice(0,3)} ${e.slice(3)}`:e}function bt(e){let[t,n]=o(()=>Date.now());return a(()=>{if(!e)return;let t=setInterval(()=>n(Date.now()),_t);return()=>clearInterval(t)},[e]),t}function xt({target:n,onClose:r,onSettled:s,onOpenNode:c}){let{t:u}=K(),[d,f]=o(null),[p,m]=o(null),[h,g]=o(``),[_,v]=o(null),y=t(null),b=H.agentPairing.beginPairing.useMutation(),x=H.agentPairing.confirmPairing.useMutation(),S=H.agentPairing.rejectPairing.useMutation();a(()=>{if(n===null){y.current=null,f(null),m(null),g(``),v(null);return}if(y.current!==n){if(y.current=n,n.pairingId!==void 0){f(n.pairingId);return}b.mutateAsync({host:n.host,port:n.port}).then(e=>{y.current===n&&f(e.pairingId)}).catch(e=>{y.current===n&&m(vt(e))})}},[n]);let C=H.agentPairing.getPairing.useQuery({pairingId:d??``},{enabled:d!==null,refetchInterval:e=>{let t=e.state.data?.state;return t!==void 0&&J(t)?!1:gt}}),w=St(x.data??S.data??null,C.data??null),T=pt({view:w,beginError:p}),D=w!==null&&J(w.state),O=t(!1);a(()=>{if(!D){O.current=!1;return}O.current||(O.current=!0,s())},[D,s]);let k=bt(w!==null&&!D),A=()=>{d===null||!lt(h)||(v(null),x.mutate({pairingId:d,code:h},{onError:e=>{v(vt(e)),g(``)}}))};return i(qe,{open:n!==null,onOpenChange:e=>!e&&r(),children:e(Ge,{width:`md`,placement:`sheet-on-mobile`,scroll:`body`,children:[e(We,{children:[i(xe,{children:u(`pairing.pairingDialog.title`,{node:n?.nodeId??``})}),i(be,{children:n===null?``:u(`pairing.pairingDialog.eachScreenShowsACode`,`Both screens show the same six digits. Check they match, then type the code you read on the agent. Agent at {{value1}}`,{value1:dt(n.host,n.port)})})]}),e(De,{className:`space-y-4`,children:[i(Ct,{phase:T}),T===`send-failed`&&p!==null&&i(ge,{title:u(`pairing.pairingDialog.couldNotStartThePairing`,`Could not start the pairing`),message:p}),w!==null&&!D&&i(wt,{view:w,phase:T,now:k,typed:h,onType:e=>g(ct(e)),onSubmit:A,confirmError:_,busy:x.isPending}),T===`paired`&&w!==null&&i(Tt,{nodeId:w.nodeId,onOpenNode:c,onClose:r}),D&&T!==`paired`&&w?.failure!=null&&i(ge,{message:w.failure})]}),i(oe,{children:D||T===`send-failed`?i(W,{type:`button`,variant:`outline`,onClick:r,children:u(`common.close`,`Close`)}):e(l,{children:[i(W,{type:`button`,variant:`outline`,disabled:S.isPending,onClick:()=>{if(d===null){r();return}S.mutate({pairingId:d},{onSettled:r})},children:u(`pairing.pairingDialog.reject`,`Reject`)}),mt(T)&&e(W,{type:`button`,disabled:!lt(h)||x.isPending,onClick:A,children:[x.isPending&&i(E,{className:`h-4 w-4 animate-spin`}),u(`common.confirm`,`Confirm`)]})]})})]})})}function St(e,t){if(t===null)return e;if(e===null)return t;let n=e=>(J(e.state)?10:e.state===`completing`?5:0)+ +!!e.hubConfirmed+ +!!e.agentConfirmed;return n(e)>n(t)?e:t}function Ct({phase:t}){let n=t===`sending`||t===`completing`,r=t===`paired`,a=t===`rejected`||t===`failed`||t===`expired`||t===`send-failed`;return e(`p`,{role:`status`,className:`flex items-center gap-2 text-sm font-medium ${r?`text-success`:a?`text-danger`:`text-foreground`}`,children:[n&&i(E,{className:`h-4 w-4 animate-spin`}),r&&i(w,{className:`h-4 w-4`}),a&&i(A,{className:`h-4 w-4`}),ht[t]]})}function wt({view:t,phase:n,now:r,typed:a,onType:o,onSubmit:s,confirmError:c,busy:l}){let{t:u}=K();return e(`div`,{className:`space-y-4`,children:[e(`section`,{"aria-label":u(`pairing.pairingDialog.codeOnThisHub`,`Code on this hub`),className:`rounded-md border border-border bg-surface p-3`,children:[i(`p`,{className:`text-xs text-foreground-muted`,children:u(`pairing.pairingDialog.codeOnThisHubRead`,`Code on this hub: the agent must show the same digits`)}),i(`p`,{"data-testid":`hub-code`,className:`mt-1 font-mono text-3xl font-semibold tracking-widest text-foreground`,children:yt(t.code)}),i(`p`,{className:`mt-2 text-xs text-foreground-muted`,children:u(`pairing.pairingDialog.onTheAgentEnterThis`,`On the agent, enter this code and the agent’s local PIN (shown on the agent’s console or log, or on its own screen).`)})]}),mt(n)?i(`form`,{className:`space-y-2`,onSubmit:e=>{e.preventDefault(),s()},children:i(B,{label:u(`pairing.pairingDialog.codeShownOnTheAgent`,`Code shown on the agent`),description:u(`pairing.pairingDialog.typeTheSixDigitsThe`,`Type the six digits you read on the agent; do not paste. If they differ from the code above, stop and press Reject.`),...c===null?{}:{error:c},children:i(V,{value:a,onChange:e=>o(e.target.value),inputMode:`numeric`,autoComplete:`off`,spellCheck:!1,placeholder:`000000`,maxLength:6,disabled:l,"aria-label":u(`pairing.pairingDialog.codeShownOnTheAgent`,`Code shown on the agent`),className:`font-mono tracking-widest`})})}):i(`p`,{className:`text-xs text-foreground-muted`,children:n===`awaiting-agent`?u(`pairing.pairingDialog.youConfirmedHereTheAgent`,`You confirmed here. The agent still has to enter the hub code and its PIN.`):u(`pairing.pairingDialog.working`,`Working…`)}),e(`ul`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-xs text-foreground-muted`,children:[i(`li`,{children:t.hubConfirmed?u(`pairing.pairingDialog.hubConfirmed`,`Hub: confirmed`):u(`pairing.pairingDialog.hubNotConfirmed`,`Hub: not confirmed`)}),i(`li`,{children:t.agentConfirmed?u(`pairing.pairingDialog.agentConfirmed`,`Agent: confirmed`):u(`pairing.pairingDialog.agentNotConfirmed`,`Agent: not confirmed`)}),i(`li`,{"data-testid":`countdown`,children:u(`pairing.pairingDialog.expiresIn`,{countdown:ut(t.expiresAt,r)})})]})]})}function Tt({nodeId:t,onOpenNode:n,onClose:r}){let{t:a}=K(),{nodes:o}=Le(),s=o?.some(e=>e.id===t&&e.isOnline)===!0;return e(`div`,{className:`space-y-2 rounded-md border border-success/40 bg-success/10 p-3 text-sm`,children:[e(`p`,{className:`flex items-center gap-2 text-success`,children:[i(j,{className:`h-4 w-4`}),s?a(`pairing.pairingDialog.joinedAndRegisteredItsCapabilities`,`{{nodeId}} joined and registered its capabilities.`,{nodeId:t}):a(`pairing.pairingDialog.holdsItsCertificateWaitingFor`,`{{nodeId}} holds its certificate. Waiting for it to connect and register its capabilities…`,{nodeId:t})]}),i(W,{type:`button`,size:`sm`,variant:`outline`,disabled:!s,onClick:()=>{r(),n(t)},children:a(`pairing.pairingDialog.openNode`,`Open node`)})]})}var Et={paired:`success`,pending:`warning`,unpaired:`default`};function Dt({state:t,connected:n}){let{t:r}=K();return e(`span`,{className:`inline-flex items-center gap-1.5`,children:[i(Ae,{variant:Et[t],className:`text-[10px]`,children:ot[t]}),t===`paired`&&i(`span`,{className:`text-[10px] text-foreground-muted`,children:n?r(`common.connected`):r(`pairing.agentStateBadge.notConnected`,`not connected`)})]})}s();var Y={pending:0,unpaired:1,paired:2};function Ot(e){if(e.trim().length===0)return;let t=Number(e);return Number.isInteger(t)&&t>=1&&t<=65535?t:null}function kt({onOpenNode:t}){let{t:r}=K(),a=N(),s=H.useUtils(),c=H.agentPairing.listDiscoveredAgents.useQuery(void 0,{refetchInterval:15e3}),[d,f]=o(null),[h,g]=o(null),[_,v]=o(!1),[y,b]=o(``),[x,S]=o(``),[C,w]=o(null),[T,D]=o(!1),O=()=>void s.agentPairing.listDiscoveredAgents.invalidate(),A=H.agentPairing.addAgentByAddress.useMutation({onSuccess:()=>{v(!1),b(``),S(``),w(null),O()},onError:e=>w(e.message)}),j=H.agentPairing.unpairAgent.useMutation({onSuccess:e=>{g({tone:`success`,message:`${e.nodeId}: ${e.next}${e.agentNotified?``:` The agent could not be told; forget the hub on its own page.`}`}),O()},onError:e=>g({tone:`danger`,message:r(`pairing.agentsFoundSection.unpairFailed`,`Unpair failed: {{message}}`,{message:e.message})})}),M=n(()=>(c.data?.agents??[]).toSorted((e,t)=>Y[e.state]-Y[t.state]),[c.data]),P=async()=>{D(!0);try{await s.agentPairing.listDiscoveredAgents.fetch({refresh:!0}),O()}finally{D(!1)}},F=()=>{let e=Ot(x);if(e===null){w(`The port must be a whole number between 1 and 65535.`);return}w(null),A.mutate({host:y.trim(),...e===void 0?{}:{port:e}})},I=async e=>{await a({title:r(`pairing.agentsFoundSection.unpair`,`Unpair {{nodeId}}`,{nodeId:e.nodeId}),message:r(`pairing.agentsFoundSection.sCertificatesAreRevokedAt`,`{{nodeId}}'s certificates are revoked at once and it is disconnected from the mesh. It must be paired again before it can rejoin.`,{nodeId:e.nodeId}),confirmLabel:r(`pairing.agentsFoundSection.unpair2`,`Unpair`),variant:`danger`})&&(g(null),j.mutate({nodeId:e.nodeId}))},L=n(()=>[{key:`name`,header:r(`pairing.agentsFoundSection.name`,`Name`),render:e=>e.name??`—`,sortValue:e=>e.name},{key:`node`,header:r(`pairing.agentsFoundSection.node`,`Node`),render:e=>i(`span`,{className:`font-medium text-foreground`,children:e.nodeId}),sortValue:e=>e.nodeId},{key:`address`,header:r(`pairing.agentsFoundSection.address`,`Address`),render:e=>i(`span`,{className:`font-mono text-xs`,children:dt(e.host,e.port)}),sortValue:e=>e.host},{key:`version`,header:r(`pairing.agentsFoundSection.version`,`Version`),render:e=>e.version??`—`,sortValue:e=>e.version},{key:`state`,header:r(`pairing.agentsFoundSection.state`,`State`),render:e=>i(Dt,{state:e.state,connected:e.connected}),sortValue:e=>Y[e.state]},{key:`fingerprint`,header:r(`pairing.agentsFoundSection.certificate`,`Certificate`),render:e=>e.fingerprint===null?`—`:i(`span`,{className:`font-mono text-xs`,title:e.fingerprint,children:ft(e.fingerprint)}),sortValue:e=>e.fingerprint},{key:`actions`,header:``,align:`right`,notSortableReason:`Row actions`,render:e=>{let t=e.pairing;return e.state===`unpaired`?i(W,{type:`button`,size:`sm`,onClick:()=>f({nodeId:e.nodeId,host:e.host,port:e.port}),children:r(`pairing.agentsFoundSection.pair`,`Pair`)}):e.state===`paired`?i(W,{type:`button`,size:`sm`,variant:`outline`,disabled:j.isPending,onClick:()=>void I(e),children:r(`pairing.agentsFoundSection.unpair2`,`Unpair`)}):e.state===`pending`&&t!==null?i(W,{type:`button`,size:`sm`,onClick:()=>f({nodeId:e.nodeId,host:e.host,port:e.port,pairingId:t.pairingId}),children:r(`pairing.agentsFoundSection.resume`,`Resume`)}):null}}],[j.isPending,r]);return e(ve,{headingId:`agents-found`,title:r(`pairing.agentsFoundSection.agentsFoundOnTheNetwork`,`Agents found on the network`),icon:k,testId:`agents-found`,actions:e(l,{children:[e(W,{type:`button`,size:`sm`,variant:`outline`,disabled:T,onClick:()=>void P(),children:[T?i(E,{className:`h-3.5 w-3.5 animate-spin`}):i(p,{className:`h-3.5 w-3.5`}),r(`pairing.agentsFoundSection.scan`,`Scan`)]}),e(W,{type:`button`,size:`sm`,onClick:()=>v(e=>!e),children:[i(m,{className:`h-3.5 w-3.5`}),r(`pairing.agentsFoundSection.addByAddress`,`Add by address`)]})]}),children:[e(`div`,{className:`${u} space-y-3`,children:[i(`p`,{className:`text-[11px] leading-relaxed text-foreground-muted`,children:r(`pairing.agentsFoundSection.anAgentHoldsNoSecret`,`An agent holds no secret: pairing issues it a certificate after you confirm the same six digits on this page and on the agent. Discovery needs the agent on its own IP or host networking; a Docker bridge hides it — add it by address.`)}),_&&e(`form`,{"aria-label":r(`pairing.agentsFoundSection.addAgentByAddress`,`Add agent by address`),className:`flex flex-wrap items-start gap-2`,onSubmit:e=>{e.preventDefault(),y.trim().length>0&&!A.isPending&&F()},children:[i(B,{label:r(`pairing.agentsFoundSection.address`,`Address`),description:r(`pairing.agentsFoundSection.aPrivateOrLocalAddress`,`A private or local address only.`),...C===null?{}:{error:C},children:i(V,{value:y,onChange:e=>b(e.target.value),placeholder:`192.0.2.20`,"aria-label":r(`pairing.agentsFoundSection.agentAddress`,`Agent address`),autoComplete:`off`})}),i(B,{label:r(`pairing.agentsFoundSection.port`,`Port`),description:r(`pairing.agentsFoundSection.optional`,`Optional.`),children:i(V,{value:x,onChange:e=>S(e.target.value),placeholder:`4444`,inputMode:`numeric`,"aria-label":r(`pairing.agentsFoundSection.agentPort`,`Agent port`),className:`w-24`})}),e(W,{type:`submit`,size:`sm`,className:`mt-5`,disabled:y.trim().length===0||A.isPending,children:[A.isPending&&i(E,{className:`h-3.5 w-3.5 animate-spin`}),r(`common.add`,`Add`)]})]}),h!==null&&i(`p`,{role:`status`,className:`rounded border px-3 py-2 text-xs ${h.tone===`success`?`border-success/30 text-foreground`:`border-danger/40 text-danger`}`,children:h.message}),c.isError?i(ge,{title:r(`pairing.agentsFoundSection.couldNotListAgents`,`Could not list agents`),message:c.error?.message??r(`pairing.agentsFoundSection.requestFailed`,`Request failed`),onRetry:O}):c.isLoading?i(`p`,{className:`py-4 text-center text-xs text-foreground-muted`,children:r(`pairing.agentsFoundSection.lookingForAgents`,`Looking for agents…`)}):M.length===0?i(ye,{icon:k,title:r(`pairing.agentsFoundSection.noAgentsFound`,`No agents found`),description:r(`pairing.agentsFoundSection.nothingIsAdvertisingOnThis`,`Nothing is advertising on this network. Start the agent on its own IP (or host networking), or add it by address.`)}):i(z,{columns:L,rows:M,rowKey:e=>e.nodeId,minWidthPx:720,defaultSort:{columnKey:`state`,dir:`asc`}})]}),i(xt,{target:d,onClose:()=>f(null),onSettled:O,onOpenNode:t})]})}function At(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function jt(e){if(!At(e))return null;let t=e.ticket;if(typeof t!=`string`||t.length===0)return null;let n=e.dashboardUrl;return typeof n==`string`&&n.length>0?{ticket:t,dashboardUrl:n}:{ticket:t}}function Mt(e){let t=e.trim();return!(t.length===0||t.includes(`/`)||t.includes(`?`)||t.includes(`#`)||t.includes(`@`)||t.includes(`:`))}function X(e){return e.startsWith(`172.17.`)}function Nt(e){let t=/^100\.(\d+)\./.exec(e);if(t===null)return!1;let n=Number(t[1]);return n>=64&&n<=127}function Pt(e){if(e.startsWith(`10.`)||e.startsWith(`192.168.`))return!0;let t=/^172\.(\d+)\./.exec(e);if(t===null)return!1;let n=Number(t[1]);return n>=16&&n<=31&&!X(e)}function Ft(e,t){if(typeof t==`string`&&Mt(t))return t.trim();let n=e.filter(e=>!e.includes(`:`)),r=n.find(e=>!e.startsWith(`127.`)&&!e.startsWith(`169.254.`)&&!X(e)&&!Nt(e)&&Pt(e));if(r!==void 0)return r;for(let e of n)if(!e.startsWith(`127.`)&&!e.startsWith(`169.254.`)&&!X(e))return e;return null}function It(e){return`http://${e}:4444/`}function Lt(e,t){let n=new URL(It(e));return n.searchParams.set(`ticket`,t),n.toString()}function Rt(){return window.open(`about:blank`,`_blank`)}function zt(e,t){return e===null||e.closed?!1:(e.location.href=t,!0)}function Bt({node:t}){let{info:n}=Ye();return!t.isHub||n===null?i(`span`,{className:`text-sm font-semibold shrink-0`,children:t.name}):e(l,{children:[i(`span`,{className:`text-sm font-semibold shrink-0`,"data-testid":`node-title-name`,children:n.name}),n.name!==t.id&&i(`span`,{className:`text-xs text-foreground-subtle shrink-0`,"data-testid":`node-title-id`,children:t.id})]})}s();function Vt(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}function Ht(e){return e===`running`?`running`:e===`crashed`||e===`failed`?`error`:`stopped`}var Ut=[`trace`,`debug`,`info`,`warn`,`error`];function Wt({proc:t,nodeId:n,defaultExpanded:r,activePanel:a,onTogglePanel:s}){let{t:c}=K(),l=t.services??[],u=l.length===1,[p,m]=o(u||r),[h,g]=o(null),[_,b]=o(`info`),x=t.name.includes(`(core)`),C=ce(),w=_e(),T=Fe(),E=async e=>{g(e);try{await C.mutateAsync({nodeId:n,addonId:e})}catch(e){console.error(`Failed to restart addon:`,e)}finally{g(null)}},D=async()=>{g(t.name);try{await w.mutateAsync({nodeId:n,processName:t.name})}catch(e){console.error(`Failed to restart process:`,e)}finally{g(null)}},O=async e=>{let r=`${n}/${t.name}`;try{await T.mutateAsync({nodeId:r,level:e}),b(e)}catch(e){console.error(`Failed to set log level:`,e)}};return e(`div`,{className:`border border-border/50 rounded-lg overflow-hidden`,children:[e(`div`,{role:u?void 0:`button`,tabIndex:u?void 0:0,onClick:u?void 0:()=>m(!p),onKeyDown:u?void 0:e=>{(e.key===`Enter`||e.key===` `)&&m(!p)},className:`flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 w-full px-3 py-2 bg-muted/20 transition-colors text-left select-none ${u?``:`hover:bg-muted/40 cursor-pointer`}`,children:[u?i(`span`,{className:`h-3 w-3 shrink-0`}):i(p?v:f,{className:`h-3 w-3 text-muted-foreground shrink-0`}),x?i(S,{className:`h-3.5 w-3.5 text-primary shrink-0`}):i(y,{className:`h-3.5 w-3.5 text-warning shrink-0`}),i(`span`,{className:`text-xs font-semibold min-w-0 flex-1 basis-full truncate sm:basis-auto`,children:t.name}),e(`span`,{className:`text-[10px] text-muted-foreground tabular-nums shrink-0`,children:[`PID `,t.pid]}),i(Be,{status:Ht(t.state),label:t.state}),i(`span`,{className:`text-[10px] text-muted-foreground tabular-nums shrink-0`,children:c(`cluster.forksTab.cpu`,{percent:t.cpuPercent})}),i(`span`,{className:`text-[10px] text-muted-foreground tabular-nums shrink-0`,children:q(t.memoryRss)}),i(`span`,{className:`text-[10px] text-muted-foreground tabular-nums shrink-0`,children:Vt(t.uptimeSeconds)}),!x&&e(`div`,{className:`flex items-center gap-1`,onClick:e=>e.stopPropagation(),children:[e(Ne,{children:[i(Ve,{className:`text-[9px] px-1.5 py-0.5 rounded border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors font-mono`,title:c(`cluster.forksTab.setLogLevel`,`Set log level`),children:_}),i(je,{align:`end`,className:`min-w-[70px] py-0.5`,children:Ut.map(e=>i(we,{onClick:()=>O(e),className:`h-auto px-2 py-1 text-[10px] font-mono ${e===_?`text-primary font-semibold`:``}`,children:e},e))})]}),i(`button`,{onClick:D,disabled:h===t.name,className:`p-1 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50`,title:c(`cluster.forksTab.restartProcess`,`Restart process`),children:i(F,{className:`h-3 w-3 ${h===t.name?`animate-spin`:``}`})})]})]}),p&&l.length>0&&i(`div`,{className:`divide-y divide-border/30`,children:l.map(t=>e(`div`,{children:[e(`div`,{className:`flex items-center gap-2 px-3 py-1.5 pl-9 hover:bg-muted/10 transition-colors`,children:[i(`div`,{className:`h-1.5 w-1.5 rounded-full shrink-0 ${t.status===`running`?`bg-success`:`bg-muted-foreground/30`}`}),i(`span`,{className:`text-xs font-medium flex-1 min-w-0 truncate`,children:t.addonId}),t.capabilities.length>0&&e(`div`,{className:`flex gap-1 flex-shrink-0`,children:[t.capabilities.slice(0,3).map(e=>i(`span`,{className:`text-[9px] px-1 py-0.5 rounded bg-info/10 text-info truncate max-w-[80px]`,children:e},e)),t.capabilities.length>3&&e(`span`,{className:`text-[9px] text-muted-foreground`,children:[`+`,t.capabilities.length-3]})]}),e(`div`,{className:`flex items-center gap-1 shrink-0`,children:[i(`button`,{onClick:()=>s(t.addonId,`logs`),className:`p-0.5 rounded transition-colors ${a?.addonId===t.addonId&&a.type===`logs`?`bg-primary/10 text-primary`:`hover:bg-muted text-muted-foreground hover:text-foreground`}`,title:c(`cluster.forksTab.showLogsFor`,`Show logs for {{addonId}}`,{addonId:t.addonId}),children:i(I,{className:`h-3 w-3`})}),i(`button`,{onClick:()=>s(t.addonId,`events`),className:`p-0.5 rounded transition-colors ${a?.addonId===t.addonId&&a.type===`events`?`bg-primary/10 text-primary`:`hover:bg-muted text-muted-foreground hover:text-foreground`}`,title:c(`cluster.forksTab.showEventsFor`,`Show events for {{addonId}}`,{addonId:t.addonId}),children:i(d,{className:`h-3 w-3`})}),i(`button`,{onClick:()=>E(t.addonId),disabled:h===t.addonId,className:`p-0.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50`,title:c(`cluster.forksTab.restart`,`Restart {{addonId}}`,{addonId:t.addonId}),children:i(F,{className:`h-3 w-3 ${h===t.addonId?`animate-spin`:``}`})})]})]}),a?.addonId===t.addonId&&a.type===`logs`&&i(`div`,{className:`border-t border-border/40 bg-muted/5`,children:i(ke,{addonId:t.addonId,agentId:n,maxHeight:`max-h-48`,showFilters:!1,onClose:()=>s(t.addonId,`logs`)})}),a?.addonId===t.addonId&&a.type===`events`&&i(`div`,{className:`border-t border-border/40 bg-muted/5`,children:i(Re,{addonId:t.addonId,category:`addon.*`,maxHeight:`max-h-48`,onClose:()=>s(t.addonId,`events`)})})]},t.addonId))}),p&&l.length===0&&i(`div`,{className:`px-3 py-2 pl-9 text-[10px] text-muted-foreground`,children:c(`cluster.forksTab.noServices`,`No services`)})]})}function Gt({nodeId:e,processes:t}){let{t:n}=K(),[r,a]=o(null),s=(e,t)=>{a(n=>n?.addonId===e&&n.type===t?null:{addonId:e,type:t})};return t.length===0?i(`div`,{className:`py-4 text-xs text-muted-foreground text-center`,children:n(`cluster.forksTab.noProcessesOnThisNode`,`No processes on this node`)}):i(`div`,{className:`space-y-2 py-1`,children:t.map((t,n)=>i(Wt,{proc:t,nodeId:e,defaultExpanded:n===0,activePanel:r,onTogglePanel:s},t.name))})}var Kt={system:0,managed:1,root:2};s();function qt(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m ${e%60}s`:e<86400?`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`:`${Math.floor(e/86400)}d ${Math.floor(e%86400/3600)}h`}function Jt(e,t=80){return e.length<=t?e:`…${e.slice(e.length-t+1)}`}function Yt({nodeId:t}){let{t:r}=K(),a=c(),o=U(`metrics.node-processes-snapshot`,e=>e.nodeId===t),{data:s}=Ee({nodeId:t}),l=o?.processes??s,u=n(()=>l?[...l]:[],[l]),d=n(()=>[{key:`classification`,header:r(`cluster.processesTab.class`,`Class`),sortValue:e=>Kt[e.classification],render:e=>i(`span`,{className:`inline-block rounded-full px-1.5 py-0.5 text-[10px] font-medium ${e.classification===`root`?`bg-info/20 text-info`:e.classification===`system`?`bg-foreground-subtle/20 text-foreground-subtle`:`bg-success/20 text-success`}`,children:e.classification})},{key:`pid`,header:`PID`,align:`right`,sortValue:e=>e.pid,render:e=>i(`span`,{className:`font-mono`,children:e.pid})},{key:`ppid`,header:`PPID`,align:`right`,sortValue:e=>e.ppid,render:e=>i(`span`,{className:`font-mono text-foreground-subtle`,children:e.ppid})},{key:`addonId`,header:r(`cluster.processesTab.addon`,`Addon`),sortValue:e=>e.addonId,render:e=>i(`span`,{className:`text-foreground-subtle text-[11px]`,children:e.addonId??`—`})},{key:`command`,header:r(`cluster.processesTab.command`,`Command`),nowrap:!1,render:e=>i(`span`,{className:`font-mono text-[10px] text-foreground-subtle break-all`,children:Jt(e.command)})},{key:`cpuPercent`,header:r(`cluster.processesTab.cpu`,`CPU%`),align:`right`,sortValue:e=>e.cpuPercent,render:e=>e.cpuPercent.toFixed(1)},{key:`memoryRssBytes`,header:`RSS`,align:`right`,sortValue:e=>e.memoryRssBytes,render:e=>q(e.memoryRssBytes)},{key:`uptimeSec`,header:r(`cluster.processesTab.uptime`,`Uptime`),align:`right`,sortValue:e=>e.uptimeSec,render:e=>i(`span`,{className:`text-foreground-subtle`,children:qt(e.uptimeSec)})}],[r]);return e(`div`,{className:`space-y-4`,children:[i(`div`,{className:`flex items-start justify-end gap-4`,children:e(`button`,{type:`button`,onClick:()=>a.invalidateQueries({queryKey:[[`metricsProvider`,`listNodeProcesses`]]}),className:`inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-[11px] text-foreground hover:bg-surface-hover`,children:[i(p,{className:`h-3 w-3`}),` `,r(`common.refresh`)]})}),i(z,{columns:d,rows:u,rowKey:e=>e.pid,minWidthPx:880,maxBodyHeight:Pe,emptyMessage:r(`cluster.processesTab.scanning`,`Scanning…`)})]})}s();var Xt=96;function Zt({title:e,points:t,mainLabel:r,gcLabel:a,formatValue:o,emptyMessage:s,gapMs:c}){return i(fe,{title:e,series:n(()=>[{id:`main`,label:r,unit:`%`,colorIndex:0,gapMs:c,points:t.map(e=>({t:e.atMs,v:e.main}))},{id:`gc`,label:a,unit:`%`,colorIndex:1,gapMs:c,points:t.map(e=>({t:e.atMs,v:e.gc}))}],[t,r,a,c]),stacked:!0,height:Xt,formatValue:e=>o(e),axisFor:()=>({floor:25}),emptyMessage:s})}function Z({title:e,points:t,formatValue:r,emptyMessage:a,axisFloor:o,axisScale:s=`linear`,gapMs:c}){return i(fe,{title:e,series:n(()=>[{id:`value`,label:e,unit:s===`bytes`?`B`:null,colorIndex:0,gapMs:c,points:t.map(e=>({t:e.atMs,v:e.value}))}],[t,e,s,c]),height:Xt,formatValue:e=>r(e),axisFor:()=>({floor:o,scale:s}),emptyMessage:a})}function Qt(e,t){let n=e.at(-1);return n===void 0?[t]:t.atMs>n.atMs?[...e,t]:e.some(e=>e.atMs===t.atMs)?e:[...e,t].toSorted((e,t)=>e.atMs-t.atMs)}function $t(e,t,n,r){let i=e.get(t),a=Qt(i?.points??[],r);if(i!==void 0&&a===i.points)return e;let o=new Map(e);return o.set(t,{key:t,kind:n,points:a.slice(Math.max(0,a.length-720))}),o}function en(e,t,n){let r=e;for(let e of te(t,n))r=$t(r,e.key,e.kind,e.point);return r}function tn(e,t){let n=e;for(let e of t)for(let t of e.points)n=$t(n,e.key,e.kind,t);return n}function nn(e){let t=null;for(let n of e.values()){let e=n.points.at(-1);e!==void 0&&(t===null||e.atMs>t)&&(t=e.atMs)}return t}var rn=12e4;function an(e,t){return e===null?!1:t-e>rn}function on(e){let t=e=>{let t=e.points.at(-1);return t===void 0?-1:t.cpuMainPercent!==null&&t.cpuGcPercent!==null?t.cpuMainPercent+t.cpuGcPercent:t.cpuLifetimePercent};return[...e.values()].toSorted((e,n)=>{let r=t(n)-t(e);return r===0?e.key.localeCompare(n.key):r})}function sn(e){for(let t of e.values()){let e=t.points.at(-1);if(e&&e.cpuMainPercent!==null)return!0}return!1}var cn={key:`cpu`,dir:`desc`};function ln(e){let t=e.points.at(-1);return t===void 0?null:t.cpuMainPercent!==null&&t.cpuGcPercent!==null?t.cpuMainPercent+t.cpuGcPercent:t.cpuLifetimePercent}function un(e){return e.points.at(-1)?.memoryRssBytes??null}function dn(e,t,n){let r=n.trim().toLowerCase();return r===``?!0:e.toLowerCase().includes(r)||t.toLowerCase().includes(r)}function fn(e,t){return t===`memory`?un(e):ln(e)}function pn(e,t,n){let r=e.filter(e=>t.selectedKeys.size>0&&!t.selectedKeys.has(e.key)?!1:dn(n(e),e.key,t.search)),i=(e,t)=>e.key.localeCompare(t.key);return[...r].toSorted((e,r)=>{if(t.sort.key===`name`){let a=n(e).localeCompare(n(r)),o=t.sort.dir===`asc`?a:-a;return o===0?i(e,r):o}let a=fn(e,t.sort.key),o=fn(r,t.sort.key);if(a===null&&o===null)return i(e,r);if(a===null)return 1;if(o===null)return-1;let s=t.sort.dir===`desc`?o-a:a-o;return s===0?i(e,r):s})}s();function mn(e,n=720){let r=U(`metrics.node-processes-snapshot`,t=>t.nodeId===e),[i,s]=o(new Map),[c,l]=o(void 0),u=t(null),{data:d,isPending:f}=Ke({forNodeId:e,sinceMs:c,maxPoints:n});a(()=>{d!==void 0&&s(e=>{let t=tn(e,d.series);return u.current=nn(t),t})},[d]);let p=r?.timestamp;a(()=>{r==null||p===void 0||(an(u.current,p)&&l(u.current??0),s(e=>{let t=en(e,r.processes,p);return u.current=nn(t),t}))},[p]),a(()=>{s(new Map),l(void 0),u.current=null},[e]);let m=0;for(let e of i.values())m=Math.max(m,e.points.length);return{series:on(i),sampleCount:m,threadSplitAvailable:sn(i),loadingRetained:f,durable:d?.durable??null,bucketMs:d?.bucketMs??null,cadenceMs:d?.cadenceMs??null,retainedSamples:d?.retainedSamples??null}}var hn=`__unclaimed__`;function gn(e,t){return{kind:e,deviceId:t,cpu:0,cpuKnown:!0,rss:0,rssKnown:!0,count:0,roles:new Set}}function _n(e,t){return{key:e,kind:t.kind,deviceId:t.deviceId,cpuSeconds:t.cpuKnown?Math.round(t.cpu*100)/100:null,rssBytes:t.rssKnown?t.rss:null,unitCount:t.count,roles:[...t.roles].sort()}}function vn(e,t){let n=new Map,r=new Set;for(let t of e){t.pid!==void 0&&r.add(t.pid);let e=t.deviceId!==null&&t.attribution!==`unattributable`,i=e?`device:${t.deviceId}`:`shared:${t.role}`,a=n.get(i)??gn(e?`camera`:`shared`,e?t.deviceId:null);a.count+=1,a.roles.add(t.role),t.cpuSeconds===void 0?a.cpuKnown=!1:a.cpu+=t.cpuSeconds,t.rssBytes===void 0?a.rssKnown=!1:a.rss+=t.rssBytes,n.set(i,a)}let i=[...n.entries()].map(([e,t])=>_n(e,t));if(t===void 0)return i;let a=t.filter(e=>!r.has(e.pid));if(a.length===0)return i;let o=gn(`unclaimed`,null);for(let e of a)o.count+=1,o.rss+=e.memoryRssBytes;return o.cpuKnown=!1,[...i,_n(hn,o)]}var yn=[{family:`decode`,attribution:`measured`,unit:`one forked decode-worker child per decode SESSION`,perCamera:!0,wiredToday:!0,missingLink:``,evidence:[`packages/addon-pipeline/src/session-decode/fork-decode-worker.ts:118`,`packages/addon-pipeline/src/session-decode/fork-decode-worker.ts:131`,`packages/addon-pipeline/src/pipeline-runner/index.ts:2765`,`packages/types/src/process/child-cost-registry.ts:188`]},{family:`transcode`,attribution:`measured`,unit:`one ffmpeg child per (camera, encode plan)`,perCamera:!0,wiredToday:!0,missingLink:``,evidence:[`packages/addon-pipeline/src/stream-broker/stream-broker/egress-transcode-manager.ts:960`,`packages/addon-pipeline/src/stream-broker/stream-broker/transcode-egress.ts:282`,`packages/addon-pipeline/src/stream-broker/stream-broker/transcode-egress.ts:324`,`packages/types/src/ffmpeg/sharing-key.ts:139`]},{family:`recording`,attribution:`measured`,unit:`one passthrough ffmpeg per (camera, profile)`,perCamera:!0,wiredToday:!0,missingLink:``,evidence:[`packages/addon-pipeline/src/recorder/addon/segment-writer.ts:33`,`packages/addon-pipeline/src/recorder/addon/segment-writer.ts:217`,`packages/addon-pipeline/src/recorder/addon/segment-writer.ts:279`,`packages/addon-pipeline/src/recorder/addon/recording-controller.ts:1710`]},{family:`detection`,attribution:`accounted`,unit:`a SHARED inference pool per (node, runtime, device) — no per-camera process`,perCamera:!1,wiredToday:!0,missingLink:"Nothing is missing for COUNTING — per-camera inference milliseconds, processed/shed frames and bytes-to-pool are already accumulated. What is missing is any basis for CPU seconds: `deviceId` reaches the pool as a diagnostic label and selects nothing, so cost can only ever be apportioned, never measured. Since 2026-08-27 the pool DECLARES this itself, contributing `deviceId: null` + `attribution: unattributable` rather than leaving an observer to infer it — the renunciation is data, and it is still refused by the chart gate.",evidence:[`packages/addon-pipeline/src/detection-pipeline/provider.ts:540`,`packages/addon-pipeline/src/detection-pipeline/engine/shared-inference-pool.ts:413`,`packages/types/src/interfaces/inference-engine.ts:24`,`packages/addon-pipeline/src/pipeline-runner/timing-sampler.ts:63`,`packages/addon-pipeline/src/pipeline-runner/runner.ts:353`,`packages/addon-pipeline/src/pipeline-runner/runner.ts:849`,`packages/addon-pipeline/src/pipeline-runner/frame-lazy-metrics.ts:100`]},{family:`streaming`,attribution:`measured`,unit:"one StreamBroker per `${deviceId}/${camStreamId}`, with an exact RTP ring byte counter",perCamera:!0,wiredToday:!1,missingLink:"The ffmpeg-backed ingest is now reported per camera, but that is the minority path. `rtpRingBytes` — the exact figure for the in-process case — is maintained on every push and drop and is still private and absent from `getStats()`. The three `EncodedRingBuffer`s track packets and duration and have no byte accumulator at all; the only byte figure they offer is `preRollBudgetBytes`, which is a BUDGET, not an occupancy.",evidence:[`packages/addon-pipeline/src/stream-broker/stream-broker/stream-broker.ts:2895`,`packages/addon-pipeline/src/stream-broker/rtsp/ffmpeg-push-reader.ts:189`,`packages/addon-pipeline/src/stream-broker/stream-broker/stream-broker.ts:494`,`packages/addon-pipeline/src/stream-broker/stream-broker/stream-broker.ts:498`,`packages/addon-pipeline/src/stream-broker/stream-broker/stream-broker.ts:2505`,`packages/addon-pipeline/src/stream-broker/stream-broker/pre-roll.ts:269`]}];function bn(e){return e.attribution===`measured`&&e.wiredToday}function xn(){let e=new Set;for(let t of yn)bn(t)&&e.add(t.family);return e}var Sn=xn();function Cn(e){return!Sn.has(e.role)||e.deviceId===null?!1:e.attribution===`measured`}function wn(e){return`${e.addonId}${e.role}${e.unit}${e.pid??`-`}`}function Tn(){return{cpuSeconds:0,cpuKnown:!0,rssBytes:0,rssKnown:!0,unitCount:0,roles:new Set}}function En(e,t,n){if(t.cpuSeconds===void 0)return null;if(e===void 0)return t.startedAtMs===void 0||t.startedAtMs<n?null:t.cpuSeconds;if(e.cpuSeconds===void 0||e.startedAtMs===void 0||t.startedAtMs===void 0||e.startedAtMs!==t.startedAtMs)return null;let r=t.cpuSeconds-e.cpuSeconds;return r<0?null:r}function Dn(e){return Math.round(e*10)/10}function On(e,t){let n=t.atMs-e.atMs;if(n<=0)return[];let r=n/1e3,i=new Map;for(let t of e.entries)Cn(t)&&i.set(wn(t),t);let a=new Map,o=new Set;for(let n of t.entries){if(!Cn(n)||n.deviceId===null)continue;let t=wn(n);o.add(t);let r=a.get(n.deviceId)??Tn();r.unitCount+=1,r.roles.add(n.role);let s=En(i.get(t),n,e.atMs);s===null?r.cpuKnown=!1:r.cpuSeconds+=s,n.rssBytes===void 0?r.rssKnown=!1:r.rssBytes+=n.rssBytes,a.set(n.deviceId,r)}for(let[e,t]of i){if(o.has(e)||t.deviceId===null)continue;let n=a.get(t.deviceId);n!==void 0&&(n.cpuKnown=!1)}return[...a.entries()].map(([e,n])=>({deviceId:e,point:{atMs:t.atMs,cpuPercent:n.cpuKnown?Dn(n.cpuSeconds/r*100):null,rssBytes:n.rssKnown?n.rssBytes:null,unitCount:n.unitCount,roles:[...n.roles].toSorted()}}))}function kn(e,t){if(t.length===0)return e;let n=new Map(e);for(let e of t){let t=n.get(e.deviceId),r=t?.points.at(-1);if(r!==void 0&&e.point.atMs<=r.atMs)continue;let i=[...t?.points??[],e.point];n.set(e.deviceId,{deviceId:e.deviceId,points:i.slice(Math.max(0,i.length-720))})}return n}function An(e){let t=e=>{for(let t=e.points.length-1;t>=0;t--){let n=e.points[t]?.cpuPercent;if(n!=null)return n}return-1};return[...e.values()].toSorted((e,n)=>{let r=t(n)-t(e);return r===0?e.deviceId-n.deviceId:r})}function jn(e){let t=e.indexOf(`@`);return t===-1?{addonId:e,nodeId:null}:{addonId:e.slice(0,t),nodeId:e.slice(t+1)}}function Mn(e,t){let n=jn(e);return n.nodeId===null?t.isHub:n.nodeId===t.nodeId}function Nn(e,t){return e.filter(e=>Mn(e.addonId,t))}s();function Pn(e){let n=U(`metrics.node-processes-snapshot`,t=>t.nodeId===e.nodeId),r=Se(void 0,{staleTime:1/0,refetchOnWindowFocus:!1}),[i,s]=o(new Map),c=t(null),l=t(r.refetch);l.current=r.refetch;let u=n?.timestamp;a(()=>{u!==void 0&&l.current()},[u]),a(()=>{s(new Map),c.current=null},[e.nodeId,e.isHub]);let d=r.data,f=r.dataUpdatedAt;a(()=>{if(d===void 0||f===0)return;let t={atMs:f,entries:Nn(d,e)},n=c.current;if(c.current=t,n===null)return;let r=On(n,t);r.length!==0&&s(e=>kn(e,r))},[d,f,e.nodeId,e.isHub]);let p=d===void 0?[]:Nn(d,e),m=n?.processes,h=vn(p,m);return{series:An(i),unclaimed:h.find(e=>e.kind===`unclaimed`)??null,loading:r.isPending,error:r.error===null?null:r.error.message}}function Fn(e){let t=new Map;for(let n of e){let e=n.name?.trim();e===void 0||e===``||t.set(n.id,e)}return t}var In=25,Ln=64*1024*1024,Rn=1e4;function zn({scope:t,cadenceMs:n}){let{t:r}=K(),a=Pn(t),{data:o=[]}=de({isCamera:!0,projection:`slim`}),s=Fn(o),c=me(n??Rn);return e(`section`,{className:`space-y-3`,children:[a.error!==null&&e(`div`,{className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/5 px-3 py-2 text-[11px] text-destructive`,children:[i(L,{className:`h-3 w-3 mt-0.5 shrink-0`}),i(`span`,{children:r(`cameraLoad.readFailed`,`Could not read the load contributions: {{error}}. This is a failed read, NOT an idle cluster.`,{error:a.error})})]}),i(Vn,{unclaimed:a.unclaimed}),a.series.length===0&&a.error===null&&i(`div`,{className:`rounded-md border border-dashed border-border px-3 py-6 text-center text-[11px] text-foreground-subtle`,children:a.loading?r(`cameraLoad.loading`,`Reading what the addons report…`):r(`cameraLoad.waitingWindow`,`No per-camera window yet.`)}),i(`div`,{className:`space-y-3`,children:a.series.map(t=>e(`div`,{className:`rounded-lg border border-border p-3`,children:[e(`div`,{className:`flex items-baseline justify-between gap-2 mb-2`,children:[i(Bn,{deviceId:t.deviceId,name:s.get(t.deviceId)}),i(`span`,{className:`text-[10px] text-foreground-subtle`,children:r(`cameraLoad.unitCount`,`{{count}} unit(s): {{roles}}`,{count:t.points.at(-1)?.unitCount??0,roles:(t.points.at(-1)?.roles??[]).join(`, `)})})]}),e(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[i(Z,{title:r(`cameraLoad.cpuTitle`,`CPU % of one core (delta)`),points:t.points.map(e=>({atMs:e.atMs,value:e.cpuPercent})),formatValue:e=>`${e.toFixed(1)}%`,axisFloor:In,gapMs:c,emptyMessage:r(`cameraLoad.cpuUnavailable`,`No measurable window yet.`)}),i(Z,{title:r(`cameraLoad.memoryTitle`,`Memory RSS`),points:t.points.map(e=>({atMs:e.atMs,value:e.rssBytes})),formatValue:q,axisFloor:Ln,axisScale:`bytes`,gapMs:c,emptyMessage:r(`cameraLoad.memoryUnavailable`,`No memory reported.`)})]})]},t.deviceId))})]})}function Bn({deviceId:t,name:n}){let{t:r}=K();return n===void 0?i(`span`,{className:`text-xs font-medium text-foreground`,children:r(`cameraLoad.deviceLabel`,`Camera {{deviceId}}`,{deviceId:t})}):e(`span`,{className:`flex items-baseline gap-1.5 min-w-0`,children:[i(`span`,{className:`text-xs font-medium text-foreground truncate`,children:n}),e(`span`,{className:`shrink-0 text-[10px] font-mono text-foreground-subtle`,children:[`#`,t]})]})}function Vn({unclaimed:e}){let{t}=K();return e===null||e.unitCount===0?null:i(`div`,{className:`flex items-center gap-2`,children:i(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded-full bg-warning/10 text-warning font-medium tabular-nums`,children:t(`cameraLoad.unclaimedBadge`,`{{count}} unclaimed · {{rss}}`,{count:e.unitCount,rss:e.rssBytes===null?`—`:q(e.rssBytes)})})})}s();var Hn=256*1024*1024,Un=1e4;function Wn({nodeId:r,isHub:a}){let s=t(null);Ce(s);let{t:c}=K(),{series:l,sampleCount:u,threadSplitAvailable:d,loadingRetained:f,bucketMs:p,cadenceMs:m}=mn(r),[h,g]=o(``),[_,v]=o(new Set),[y,b]=o(cn),x=e=>e.key===`__root__`?c(`clusterLoad.bucketRoot`,`Node supervisor`):e.key===`__unattributed__`?c(`clusterLoad.bucketUnattributed`,`Unattributed processes`):e.key,S=me(p??m??Un),C=n(()=>pn(l,{search:h,selectedKeys:_,sort:y},x),[l,h,_,y]),w=e=>{v(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};return e(`div`,{className:`space-y-4`,children:[i(Gn,{bucketMs:p,cadenceMs:m}),!d&&u>0&&e(`div`,{className:`flex items-start gap-2 rounded-md border border-warning/40 bg-warning/5 px-3 py-2 text-[11px] text-warning`,children:[i(L,{className:`h-3 w-3 mt-0.5 shrink-0`}),i(`span`,{children:c(`clusterLoad.noThreadSplit`,`No thread-level CPU split on this node — /proc/<pid>/task is Linux-only, and the first sample after a restart has no window to measure. CPU below falls back to the ps lifetime AVERAGE, which is not a rate.`)})]}),u===0&&i(`div`,{className:`rounded-md border border-dashed border-border px-3 py-6 text-center text-[11px] text-foreground-subtle`,children:f?c(`clusterLoad.loadingRetained`,`Reading the retained series from this node…`):c(`clusterLoad.waitingFirstSample`,`No retained samples for this node — waiting for the next snapshot (up to 20s). The chart needs two to draw a rate.`)}),l.length>0&&e(`div`,{className:`space-y-2`,children:[e(`div`,{className:`flex flex-wrap items-center gap-2`,children:[e(`label`,{className:`relative flex-1 min-w-[160px]`,children:[i(P,{className:`pointer-events-none absolute left-2 top-1/2 h-3 w-3 -translate-y-1/2 text-foreground-subtle`}),i(`input`,{ref:s,type:`search`,value:h,onChange:e=>g(e.target.value),placeholder:c(`clusterLoad.searchPlaceholder`,`Find a runner…`),"aria-label":c(`clusterLoad.searchLabel`,`Find a runner`),className:`w-full rounded border border-border bg-background py-1 pl-7 pr-2 text-[11px] text-foreground placeholder:text-foreground-subtle`})]}),i(Kn,{sort:y,onChange:b})]}),e(`div`,{className:`flex flex-wrap items-center gap-1`,children:[l.map(e=>{let t=_.has(e.key);return i(`button`,{type:`button`,"aria-pressed":t,onClick:()=>w(e.key),className:`rounded-full border px-2 py-0.5 text-[10px] transition-colors ${t?`border-primary bg-primary/10 text-primary`:`border-border text-foreground-subtle hover:text-foreground`}`,children:x(e)},e.key)}),_.size>0&&e(`button`,{type:`button`,onClick:()=>v(new Set),className:`inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-[10px] text-foreground-subtle hover:text-foreground`,children:[i(D,{className:`h-2.5 w-2.5`}),c(`clusterLoad.clearFilter`,`All runners`)]})]})]}),l.length>0&&C.length===0&&i(`div`,{className:`rounded-md border border-dashed border-border px-3 py-6 text-center text-[11px] text-foreground-subtle`,children:c(`clusterLoad.noMatches`,`No runner matches this search on {{count}} present. The node is reporting — the filter is hiding them.`,{count:l.length})}),i(`div`,{className:`space-y-3`,children:C.map(t=>e(`div`,{className:`rounded-lg border border-border p-3`,children:[e(`div`,{className:`flex items-baseline justify-between gap-2 mb-2`,children:[i(`span`,{className:`text-xs font-medium text-foreground`,children:x(t)}),i(`span`,{className:`text-[10px] text-foreground-subtle`,children:c(`clusterLoad.processCount`,`{{count}} process(es)`,{count:t.points.at(-1)?.processCount??0})})]}),e(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[i(Zt,{title:d?c(`clusterLoad.cpuTitle`,`CPU % of one core`):c(`clusterLoad.cpuTitleLifetime`,`CPU % (ps lifetime average)`),mainLabel:c(`clusterLoad.seriesMain`,`Main threads`),gcLabel:c(`clusterLoad.seriesGc`,`GC / V8 helpers`),points:t.points.map(e=>({atMs:e.atMs,main:e.cpuMainPercent,gc:e.cpuGcPercent})),formatValue:e=>`${e.toFixed(0)}%`,gapMs:S,emptyMessage:c(`clusterLoad.cpuUnavailable`,`No thread split on this node. Lifetime average: {{avg}}%`,{avg:(t.points.at(-1)?.cpuLifetimePercent??0).toFixed(1)})}),i(Z,{title:c(`clusterLoad.memoryTitle`,`Memory RSS`),points:t.points.map(e=>({atMs:e.atMs,value:e.memoryRssBytes})),formatValue:q,axisFloor:Hn,axisScale:`bytes`,gapMs:S,emptyMessage:c(`clusterLoad.memoryUnavailable`,`No memory samples yet.`)})]})]},t.key))}),i(zn,{scope:{nodeId:r,isHub:a},cadenceMs:m})]})}function Gn({bucketMs:e,cadenceMs:t}){let{t:n}=K();return e===null?null:i(`p`,{className:`text-[10px] text-foreground-subtle`,children:t!==null&&e>t?n(`clusterLoad.captionBucket`,`1 point = {{bucket}}s (bucket MAXIMUM, not a mean)`,{bucket:Math.round(e/1e3)}):n(`clusterLoad.captionRaw`,`1 point = 1 snapshot`)})}function Kn({sort:t,onChange:n}){let{t:r}=K(),a=[{key:`cpu`,label:r(`clusterLoad.sortCpu`,`CPU`)},{key:`memory`,label:r(`clusterLoad.sortMemory`,`Memory`)},{key:`name`,label:r(`clusterLoad.sortName`,`Name`)}];return e(`div`,{className:`flex items-center gap-1`,children:[i(`span`,{className:`text-[10px] text-foreground-subtle`,children:r(`clusterLoad.sortBy`,`Sort by`)}),a.map(r=>{let i=t.key===r.key;return e(`button`,{type:`button`,"aria-pressed":i,onClick:()=>n(i?{key:r.key,dir:t.dir===`desc`?`asc`:`desc`}:{key:r.key,dir:r.key===`name`?`asc`:`desc`}),className:`rounded border px-1.5 py-0.5 text-[10px] transition-colors ${i?`border-primary bg-primary/10 text-primary`:`border-border text-foreground-subtle hover:text-foreground`}`,children:[r.label,i&&(t.dir===`desc`?` ↓`:` ↑`)]},r.key)})]})}var qn=`No per-node settings on this node. Every other setting these addons expose is one value for the whole cluster — edit those in System → Settings, not here.`;function Jn({nodeId:e,addonIds:t}){let{t:n}=K();return t.length===0?i(`div`,{className:`py-4 text-xs text-muted-foreground text-center`,children:n(`cluster.nodeDetailSettingsTab.noAddonsOnThisNode`,`No addons on this node`)}):i(`div`,{className:`w-full py-2`,children:i($e,{nodeId:e,addonIds:t,level:`global`,fieldScope:`perNode`,emptyMessage:qn,selfTabbed:!0})})}s();function Yn({nodeId:e,addons:t}){let{t:r}=K(),a=c(),{data:o,isLoading:s}=ze({nodeId:e}),l=n(()=>{let e=new Map;for(let n of t)for(let t of n.capabilities){let r=e.get(t)??[];r.push(n.id),e.set(t,r)}return[...e.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({capName:e,providers:t}))},[t]),u=he({onSuccess:()=>{a.invalidateQueries({queryKey:[[`pipelineOrchestrator`,`getCapabilityBindings`]]})}});return l.length===0?i(`div`,{className:`py-4 text-xs text-muted-foreground text-center`,children:r(`cluster.nodeDetailCapabilitiesTab.noCapabilitiesOnThisNode`,`No capabilities on this node`)}):i(z,{columns:[{key:`capName`,header:r(`cluster.nodeDetailCapabilitiesTab.capability`,`Capability`),width:`w-1/2`,sortValue:e=>e.capName,render:e=>i(`span`,{className:`font-medium`,children:e.capName})},{key:`provider`,header:r(`cluster.nodeDetailCapabilitiesTab.boundProvider`,`Bound provider`),render:t=>{let n=o?.[t.capName]??t.providers[0]??``,a=t.providers.length===1;return i(`select`,{value:n,onChange:n=>u.mutate({nodeId:e,capName:t.capName,addonId:n.target.value}),disabled:a||u.isPending||s,className:`w-full rounded-md border border-border bg-surface px-2 py-1 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary disabled:opacity-60`,title:a?r(`cluster.nodeDetailCapabilitiesTab.onlyOneProviderInstalledChoice`,`Only one provider installed — choice becomes available once a second addon registers this capability`):void 0,children:t.providers.map(e=>i(`option`,{value:e,children:e},e))})}}],rows:l,rowKey:e=>e.capName,minWidthPx:520,maxBodyHeight:Pe})}s();function Xn(e){if(e==null)return`—`;let t=Math.floor(e/1e3),n=Math.floor(t/86400),r=Math.floor(t%86400/3600),i=Math.floor(t%3600/60);return n>0?`${n}d ${r}h ${i}m`:r>0?`${r}h ${i}m`:`${i}m`}function Zn(t){let{t:n}=K(),[r,a]=o(!1),[s,l]=o(t.name),u=c(),d=ue({onSuccess:()=>{u.invalidateQueries({queryKey:[[`nodes`,`topology`]]})}}),f=(t.localIps??[]).filter(e=>!e.includes(`:`)),p=(t.localIps??[]).filter(e=>e.includes(`:`)),m=async()=>{if(!s.trim()||s===t.name){a(!1);return}try{await d.mutateAsync({nodeId:t.nodeId,name:s.trim()}),a(!1)}catch(e){console.error(`Rename failed:`,e)}},h=[[`Node ID`,i(`span`,{className:`font-mono text-xs`,children:t.nodeId})],[`Display Name`,r?e(`div`,{className:`flex items-center gap-1.5`,children:[i(`input`,{type:`text`,className:`flex-1 px-2 py-0.5 text-xs border border-border rounded bg-background focus:outline-none focus:ring-1 focus:ring-primary`,value:s,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&m(),e.key===`Escape`&&a(!1)},disabled:d.isPending,autoFocus:!0}),i(`button`,{onClick:()=>void m(),disabled:d.isPending,className:`p-0.5 text-success hover:bg-success/10 rounded`,title:n(`common.save`,`Save`),children:i(O,{className:`h-3.5 w-3.5`})}),i(`button`,{onClick:()=>a(!1),className:`p-0.5 text-muted-foreground hover:bg-muted rounded`,title:n(`common.cancel`,`Cancel`),children:i(D,{className:`h-3.5 w-3.5`})})]}):e(`div`,{className:`flex items-center gap-1.5`,children:[i(`span`,{className:`text-xs`,children:t.name}),!t.isHub&&i(`button`,{onClick:()=>{l(t.name),a(!0)},className:`p-0.5 text-muted-foreground hover:text-primary rounded`,title:n(`cluster.nodeInfoTab.rename`,`Rename`),children:i(x,{className:`h-3 w-3`})})]})],[`Hostname`,i(`span`,{className:`text-xs`,children:t.hostname})],[`Role`,t.isHub?i(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded bg-primary/10 text-primary font-medium`,children:n(`cluster.nodeInfoTab.hub`,`Hub`)}):i(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded bg-muted text-muted-foreground font-medium`,children:n(`cluster.nodeInfoTab.agent`,`Agent`)})],[`Root Package`,t.rootPackage?e(`span`,{className:`font-mono text-xs`,children:[t.rootPackage.name,`@`,t.rootPackage.version]}):i(`span`,{className:`text-xs text-muted-foreground`,children:`—`})],[`Platform`,e(`span`,{className:`text-xs`,children:[t.platform,` / `,t.arch]})],[`CPU`,e(`span`,{className:`text-xs`,children:[t.cpuModel??`—`,` (`,n(`cluster.nodeInfoTab.cores`,{count:t.cpuCores}),`)`]})],[`Memory`,i(`span`,{className:`text-xs`,children:t.memoryMB>0?n(`cluster.nodeInfoTab.gb`,`{{value1}} GB`,{value1:(t.memoryMB/1024).toFixed(1)}):`—`})],[`Uptime`,i(`span`,{className:`text-xs`,children:Xn(t.uptime)})],[n(`cluster.nodeInfoTab.installedRuntimes`,`Installed runtimes`),t.engines.length>0?i(`div`,{className:`flex flex-wrap gap-1`,title:n(`cluster.nodeInfoTab.installedRuntimesHint`,`Inference runtimes installed on this node. Its live inference devices are on Pipeline → Load balancing.`),children:t.engines.map(e=>i(`span`,{className:`text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary font-medium`,children:e},e))}):i(`span`,{className:`text-xs text-muted-foreground`,children:`—`})]];return f.length>0&&h.push([`IPv4`,i(`div`,{className:`flex flex-wrap gap-1.5`,children:f.map((e,t)=>i(`span`,{className:`font-mono text-xs px-1.5 py-0.5 rounded bg-muted`,children:e},`${e}-${t}`))})]),p.length>0&&h.push([`IPv6`,i(`div`,{className:`flex flex-wrap gap-1.5`,children:p.map((e,t)=>i(`span`,{className:`font-mono text-[10px] px-1.5 py-0.5 rounded bg-muted truncate max-w-[280px]`,title:e,children:e},`${e}-${t}`))})]),i(`div`,{className:`py-2`,children:i(`table`,{className:`w-full text-sm`,children:i(`tbody`,{children:h.map(([t,n],r)=>e(`tr`,{className:r%2==0?`bg-muted/20`:``,children:[i(`td`,{className:`py-1.5 px-2 text-xs font-medium text-muted-foreground w-28 align-top whitespace-nowrap`,children:t}),i(`td`,{className:`py-1.5 px-2`,children:n})]},t))})})})}s();function Qn({nodeId:t,value:n,detectedHosts:r,status:s,errorMessage:c,onCommit:l}){let{t:u}=K(),[d,f]=o(n??``);a(()=>{f(n??``)},[n]);let p=r[0],m=p===void 0?`auto-detect`:`auto: ${p}`,h=s===`pending`,g=d.trim(),_=g!==(n??``),v=_&&!h,y=()=>{v&&l(t,g.length>0?g:null)};return e(`div`,{className:`flex items-center gap-1.5`,children:[i(V,{"aria-label":u(`placementBoard.reachableHostInput.reachableHostFor`,`Reachable host for {{nodeId}}`,{nodeId:t}),type:`text`,inputMode:`url`,autoComplete:`off`,spellCheck:!1,placeholder:m,value:d,disabled:h,onChange:e=>f(e.target.value),onBlur:y,onKeyDown:e=>{e.key===`Enter`&&y(),e.key===`Escape`&&f(n??``)},className:`w-36`}),e(W,{variant:`outline`,size:`sm`,onClick:y,disabled:!v,"aria-label":u(`placementBoard.reachableHostInput.saveReachableHostFor`,`Save reachable host for {{nodeId}}`,{nodeId:t}),title:u(`placementBoard.reachableHostInput.saveReachableHost`,`Save reachable host`),children:[h?i(E,{className:`h-3 w-3 animate-spin`,"aria-hidden":`true`}):i(O,{className:`h-3 w-3`,"aria-hidden":`true`}),u(`common.save`,`Save`)]}),!_&&!h&&s===`success`&&i(O,{className:`h-3.5 w-3.5 shrink-0 text-success`,"aria-label":u(`placementBoard.reachableHostInput.saved`,`Saved`),role:`img`}),s===`error`&&i(`span`,{title:c??u(`placementBoard.reachableHostInput.failedToSaveReachableHost`,`Failed to save reachable host`),children:i(b,{className:`h-3.5 w-3.5 shrink-0 text-danger`,"aria-label":c??u(`placementBoard.reachableHostInput.failedToSaveReachableHost`,`Failed to save reachable host`),role:`img`})})]})}s();function $n(e){let t=R.safeParse(et(e,`color`));return t.success?t.data:null}function er(e,t){return t.variables?.agentNodeId===e?t.isPending?`pending`:t.isError?`error`:t.isSuccess?`success`:`idle`:`idle`}function tr({nodeId:t,detectedHosts:r}){let{t:a}=K(),o=c(),s=He(void 0),l=le({onSuccess:()=>tt(o)}),u=le({onSuccess:()=>tt(o)}),d=n(()=>s.data?.find(e=>e.nodeId===t)?.settings,[s.data,t]),f=$n(d)??(s.isLoading?null:ee(t)),p=nt(d,`reachableHost`),m=er(t,l),h=m===`error`?rt(l.error):null,g=r.filter(e=>!e.includes(`:`)),_=e=>{e!==f&&u.mutate({agentNodeId:t,color:e})};return e(`div`,{className:`rounded-lg border border-border bg-surface/40 divide-y divide-border px-3`,children:[i(Ie,{label:a(`nodes.general.nodeColour`,`Node colour`),children:i(`div`,{role:`group`,"aria-label":a(`nodes.general.nodeColourGroup`,`Node colour`),className:`flex flex-wrap gap-2`,children:ne.map(e=>{let t=f===e;return i(W,{type:`button`,role:`radio`,"aria-checked":t,"aria-label":e,variant:`outline`,size:`sm`,disabled:s.isLoading||u.isPending,title:e,onClick:()=>_(e),className:`h-6 w-6 min-w-6 shrink-0 rounded-full border-0 p-0 ${pe(e)} ${t?`ring-2 ring-primary ring-offset-2 ring-offset-background`:`opacity-80 hover:opacity-100`}`,children:i(`span`,{className:`sr-only`,children:e})},e)})})}),i(Ie,{label:a(`nodes.general.reachableHost`,`Reachable host`),children:i(Qn,{nodeId:t,value:p,detectedHosts:g,status:m,errorMessage:h,onCommit:(e,t)=>{l.mutate({agentNodeId:e,reachableHost:t})}})})]})}s();var nr=3*6e4,rr={neutral:`bg-surface-muted text-foreground-subtle`,ok:`bg-success/15 text-success`,info:`bg-info/15 text-info`,warn:`bg-warning/15 text-warning`,error:`bg-danger/15 text-danger`};function ir({desktopApp:t,nodeName:n,routingInput:s,onSettled:c}){let{t:l}=K(),u=N(),d=Je({onSettled:c}),[f,p]=o(null),[m,h]=o(!1),[g,_]=o(null);a(()=>{f!=null&&t.version!==f.fromVersion&&(p(null),h(!1))},[t.version,f]),a(()=>{if(f==null)return;let e=Math.max(0,f.startedAtMs+nr-Date.now()),t=setTimeout(()=>h(!0),e);return()=>clearTimeout(t)},[f]);let v=r(e=>{switch(e){case`not-electron`:return l(`serverManagement.desktopRefusedNotElectron`,`This node does not run inside the desktop app.`);case`no-app-state`:return l(`serverManagement.desktopRefusedNoState`,`The desktop app has not reported its state yet.`);case`app-state-stale`:return l(`serverManagement.desktopRefusedStale`,`The desktop app stopped reporting — it is probably not running.`);case`not-downloaded`:return l(`serverManagement.desktopRefusedNotDownloaded`,`No update is downloaded yet.`)}},[l]),y=r(async()=>{if(await u({title:l(`serverManagement.desktopConfirmTitle`,`Install desktop app update`),message:l(`serverManagement.desktopConfirmBody`,`Install {{version}} on "{{node}}" and restart the desktop app? The node is offline while it restarts.`,{version:t.update.version??``,node:n}),confirmLabel:l(`serverManagement.desktopInstallAction`,`Install update & restart`),variant:`warning`})){_(null),h(!1);try{let e=await d.mutateAsync(s);e.accepted?p({fromVersion:t.version,startedAtMs:Date.now()}):e.reason!=null&&_(v(e.reason))}catch(e){_(e instanceof Error?e.message:String(e))}}},[u,t,d,n,v,s,l]),b=f!=null&&!m,{update:x}=t,S=null;t.stale?S={label:l(`serverManagement.desktopStale`,`app state unknown (last seen {{when}})`,{when:Ze(t.stateAtMs)}),tone:`warn`}:x.downloaded?S={label:l(`serverManagement.desktopReady`,`update {{version}} ready`,{version:x.version??``}),tone:`ok`}:x.available?S={label:l(`serverManagement.desktopDownloading`,`update {{version}} available — downloading`,{version:x.version??``}),tone:`info`}:x.checking?S={label:l(`serverManagement.stateChecking`,`checking…`),tone:`info`}:x.error??(S={label:l(`serverManagement.stateUpToDate`,`up to date`),tone:`ok`});let C=!t.stale&&x.downloaded&&!b&&!d.isPending;return e(`div`,{className:`space-y-1.5`,children:[e(`div`,{className:`flex flex-wrap items-center justify-between gap-x-4 gap-y-1 text-sm`,children:[e(`span`,{className:`inline-flex items-baseline gap-1`,children:[i(`span`,{className:`text-foreground-subtle`,children:l(`serverManagement.desktopApp`,`Desktop app`)}),i(`span`,{className:`font-mono text-foreground`,children:t.version})]}),S!=null&&i(`span`,{className:`inline-flex items-center rounded px-2 py-0.5 text-[11px] font-medium ${rr[S.tone]}`,children:S.label})]}),!t.stale&&x.error!=null&&i(`p`,{className:`text-xs text-danger`,children:l(`serverManagement.desktopUpdateError`,`Update check failed: {{error}}`,{error:x.error})}),C&&e(W,{size:`sm`,onClick:()=>void y(),children:[i(F,{className:`h-3.5 w-3.5`}),l(`serverManagement.desktopInstallAction`,`Install update & restart`)]}),(d.isPending||b)&&e(`div`,{className:`flex items-center gap-2 text-sm text-warning`,children:[i(E,{className:`h-4 w-4 animate-spin`}),l(`serverManagement.desktopRestarting`,`The desktop app is restarting to install the update…`)]}),f!=null&&m&&i(`p`,{role:`status`,className:`text-xs text-warning`,children:l(`serverManagement.desktopRestartTimeout`,`The desktop app has not come back with a new version after 3 minutes. Check the machine.`)}),g!=null&&i(`p`,{role:`status`,className:`text-xs text-warning`,children:g})]})}s();var ar=[[`serverManagement`,`getServerPackageStatus`]];function or({label:e,tone:t}){return i(`span`,{className:`inline-flex items-center rounded px-2 py-0.5 text-[11px] font-medium ${{neutral:`bg-surface-muted text-foreground-subtle`,ok:`bg-success/15 text-success`,info:`bg-info/15 text-info`,warn:`bg-warning/15 text-warning`,error:`bg-danger/15 text-danger`}[t]}`,children:e})}function Q({label:t,value:n}){return e(`div`,{className:`flex items-center justify-between gap-4 text-sm`,children:[i(`span`,{className:`text-foreground-subtle`,children:t}),i(`span`,{className:`font-mono text-foreground`,children:n??`—`})]})}function sr({runningVersion:t,latestVersion:n,seedVersion:r,nodeRuntimeVersion:a,labelRunning:o,labelLatest:s,labelSeed:c,labelRuntime:l}){return i(`div`,{className:`flex flex-wrap gap-x-3 gap-y-1 text-sm`,children:[{key:`running`,label:o,value:t},{key:`latest`,label:s,value:n},{key:`seed`,label:c,value:r},{key:`runtime`,label:l,value:a}].map(({key:t,label:n,value:r})=>e(`span`,{className:`inline-flex items-baseline gap-1`,children:[i(`span`,{className:`text-foreground-subtle`,children:n}),i(`span`,{className:`font-mono text-foreground`,children:r??`—`})]},t))})}var cr={ok:`border-success/40 bg-success/10 text-success`,warn:`border-warning/40 bg-warning/10 text-warning`,error:`border-danger/40 bg-danger/10 text-danger`};function lr(e){return e.outcome===`failed`?`error`:(e.outcome,e.accepted?`ok`:`warn`)}function ur(e,t){let n=t instanceof Error?t.message:String(t);return`${e(`serverManagement.outcomeDropped`,`The connection dropped and the result could not be confirmed. The node may be restarting — re-check the version above.`)} — ${n}`}function dr({node:t}){let{t:n}=K(),a=c(),s=N(),[l,u]=o(!1),[d,f]=o(null),m=t.isHub?void 0:{nodeId:t.id},h=Ue(m,{refetchInterval:1e4,enabled:t.isOnline,retry:1}),g=h.data??null,_=r(()=>{a.invalidateQueries({queryKey:ar})},[a]),v=Te({onSettled:_}),y=Me({onSettled:_}),b=Oe({onSettled:_}),x=r(async()=>{if(g?.latestVersion==null){f({tone:`warn`,text:n(`serverManagement.outcomeNoTarget`,`No target version is known for this node — run "Check for update" first.`)});return}if(await s({title:n(`serverManagement.confirmUpdateTitle`,`Update node root package`),message:n(`serverManagement.confirmUpdateBody`,`Install {{pkg}}@{{version}} on "{{node}}" and restart to apply.`,{pkg:g.packageName,version:g.latestVersion,node:t.name}),confirmLabel:n(`serverManagement.confirmUpdateAction`,`Update & restart`)})){f(null);try{let e=await y.mutateAsync({version:g.latestVersion,...m});f({tone:lr(e),text:e.message}),e.restarting&&u(!0)}catch(e){f({tone:`warn`,text:ur(n,e)})}}},[y,s,t.name,m,g,n]),S=r(async()=>{if(await s({title:n(`serverManagement.confirmRestartTitle`,`Restart node`),message:n(`serverManagement.confirmRestartBody`,`Restart "{{node}}"? In-flight requests to this node are dropped.`,{node:t.name}),confirmLabel:n(`serverManagement.confirmRestartAction`,`Restart`),variant:`warning`})){f(null);try{let e=await b.mutateAsync(m);f({tone:lr(e),text:e.message}),e.restarting&&u(!0)}catch(e){f({tone:`warn`,text:ur(n,e)})}}},[s,t.name,b,m,n]),w=()=>{switch(g?.bootMode){case`data-root`:return{label:n(`serverManagement.bootDataRoot`,`runtime-updatable`),tone:`ok`};case`workspace`:return{label:n(`serverManagement.bootWorkspace`,`dev workspace`),tone:`info`};default:return{label:n(`serverManagement.bootBaked`,`baked image seed`),tone:`neutral`}}},T=()=>{if(g==null)return null;switch(g.updateState){case`checking`:return{label:n(`serverManagement.stateChecking`,`checking…`),tone:`info`};case`staging`:return{label:n(`serverManagement.stateStaging`,`updating…`),tone:`info`};case`pending-restart`:return{label:n(`serverManagement.statePending`,`restart pending`),tone:`warn`};default:return g.restartRequired===!0?{label:n(`serverManagement.stateRestartRequired`,`restart required`),tone:`warn`}:g.updateAvailable?{label:n(`serverManagement.stateUpdateAvailable`,`update available`),tone:`warn`}:{label:n(`serverManagement.stateUpToDate`,`up to date`),tone:`ok`}}},D=g?.bootMode===`workspace`,O=t.isOnline&&g!=null&&!D&&g.updateAvailable&&g.updateState===`idle`&&!y.isPending,k=t.isOnline&&g!=null&&g.updateState===`idle`&&!b.isPending,A=t.isOnline?T():null;return e(`div`,{className:`space-y-4 py-2`,children:[e(`div`,{className:`flex items-center justify-between gap-3`,children:[e(`div`,{className:`flex items-center gap-2 min-w-0`,children:[i(`span`,{className:`font-mono text-xs text-foreground-subtle truncate`,children:g?.packageName??t.rootPackage?.name??`@camstack/server`}),t.isOnline&&g!=null&&i(or,{...w()})]}),A!=null&&i(or,{...A})]}),!t.isOnline&&i(Q,{label:n(`serverManagement.lastReportedVersion`,`Last reported version`),value:t.rootPackage?.version??null}),t.isOnline&&h.isLoading&&e(`div`,{className:`flex items-center gap-2 text-sm text-foreground-subtle`,children:[i(E,{className:`h-4 w-4 animate-spin`}),n(`common.loading`,`Loading…`)]}),t.isOnline&&h.isError&&e(`div`,{className:`space-y-1.5`,children:[i(`p`,{className:`text-sm text-danger`,children:n(`serverManagement.loadError`,`Could not load the node root-package status.`)}),t.rootPackage!=null&&i(Q,{label:n(`serverManagement.lastReportedVersion`,`Last reported version`),value:t.rootPackage.version})]}),t.isOnline&&g!=null&&e(`div`,{className:`space-y-1.5`,children:[i(sr,{runningVersion:g.runningVersion,latestVersion:g.latestVersion,seedVersion:g.seedVersion,nodeRuntimeVersion:g.nodeRuntimeVersion,labelRunning:n(`serverManagement.runningVersionShort`,`Running`),labelLatest:n(`serverManagement.latestVersionShort`,`Latest`),labelSeed:n(`serverManagement.imageSeedShort`,`Seed`),labelRuntime:n(`serverManagement.nodeRuntimeVersionShort`,`Node.js`)}),g.desktopApp!=null&&i(ir,{desktopApp:g.desktopApp,nodeName:t.name,routingInput:m,onSettled:_}),g.pendingVersion!=null&&i(Q,{label:n(`serverManagement.pendingVersion`,`Staged (applies on restart)`),value:g.pendingVersion}),g.installedVersion!=null&&g.installedVersion!==g.runningVersion&&i(Q,{label:n(`serverManagement.installedVersion`,`Installed on disk (runs after restart)`),value:g.installedVersion})]}),t.isOnline&&g?.imageContract?.state===`behind-series`&&e(`div`,{className:`rounded-md border border-danger/40 bg-danger/10 px-3 py-2 text-xs leading-relaxed text-danger`,children:[i(`p`,{className:`mb-0.5 font-semibold`,children:n(`serverManagement.imageContractDiverged`,`Container image diverges from the deployment contract`)}),i(`p`,{children:g.imageContract.message})]}),t.isOnline&&D&&i(`p`,{className:`text-xs text-foreground-subtle`,children:n(`serverManagement.workspaceNote`,`Development workspace detected — runtime updates are disabled (the dev loop resolves code from the workspace).`)}),d!=null&&i(`p`,{role:`status`,className:`rounded border px-2 py-1.5 text-xs leading-relaxed ${cr[d.tone]}`,children:d.text}),l&&e(`div`,{className:`flex items-center gap-2 text-sm text-warning`,children:[i(E,{className:`h-4 w-4 animate-spin`}),n(`serverManagement.nodeRestarting`,`The node is restarting to apply the change…`)]}),t.isOnline&&e(`div`,{className:`flex flex-wrap items-center gap-2 pt-1`,children:[e(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded border border-border px-2.5 py-1.5 text-xs font-medium text-foreground hover:bg-surface-muted disabled:opacity-50`,disabled:v.isPending||g?.updateState===`staging`,onClick:()=>v.mutate(m),children:[v.isPending?i(E,{className:`h-3.5 w-3.5 animate-spin`}):i(p,{className:`h-3.5 w-3.5`}),n(`serverManagement.checkForUpdate`,`Check for update`)]}),O&&e(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded bg-primary px-2.5 py-1.5 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50`,onClick:()=>void x(),children:[y.isPending?i(E,{className:`h-3.5 w-3.5 animate-spin`}):i(C,{className:`h-3.5 w-3.5`}),n(`serverManagement.updateTo`,`Update to {{version}}`,{version:g?.latestVersion??``})]}),e(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded border border-border px-2.5 py-1.5 text-xs font-medium text-foreground hover:bg-surface-muted disabled:opacity-50`,disabled:!k,onClick:()=>void S(),children:[b.isPending?i(E,{className:`h-3.5 w-3.5 animate-spin`}):i(F,{className:`h-3.5 w-3.5`}),n(`serverManagement.restart`,`Restart`)]})]}),t.isOnline&&g?.lastCheckedAtMs!=null&&e(`p`,{className:`flex items-center gap-1.5 text-[11px] text-foreground-subtle`,children:[i(re,{className:`h-3 w-3`}),n(`serverManagement.lastChecked`,`Last checked: {{when}}`,{when:new Date(g.lastCheckedAtMs).toLocaleString()})]})]})}s();function fr(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=Reflect.get(e,`reachableHost`);return typeof t==`string`&&t.length>0?t:null}function pr({node:t}){let{t:a}=K(),s=T(),u=c(),d=N(),[f,p]=o(!1),[m,h]=o(`info`),[v,y]=o(!1),[b,x]=o(null),S=t.processes??[],C=t.addons.map(e=>e.id),w=He(void 0),E=n(()=>{let e=w.data?.find(e=>e.nodeId===t.id);return fr(e?.settings)},[w.data,t.id]),[D,O]=o(!1),[k,A]=o(null),[j,P]=o(null),F=r(async()=>{if(D||t.isHub)return;let e=Ft(t.localIps??[],E);if(e===null){A(`No LAN IPv4 on this node — open its :4444 URL by hand.`),P(null);return}let n=Rt();O(!0),A(null),P(null);try{let r=jt(await s.trpcClient.addons.custom.mutate({addonId:`system-config`,action:`mintAgentUiUnlockTicket`,input:{nodeId:t.id,dashboardBaseUrl:It(e)}})),i=r===null?null:r.dashboardUrl??Lt(e,r.ticket);if(i===null){n?.close(),A(`Hub did not return an unlock ticket.`);return}zt(n,i)||(P(i),A(`Browser blocked the new tab — click the link below (or allow popups for this site).`))}catch(e){n?.close(),A(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t.id,t.isHub,t.localIps,D,E,s.trpcClient]),I=async()=>{if(!v){y(!0),x(null);try{await s.trpcClient.pipelineOrchestrator.removeAgentSettings.mutate({agentNodeId:t.id}).catch(()=>void 0);let e=await s.trpcClient.clusterNodes.forgetNode.mutate({nodeId:t.id});x({tone:e.stillListed?`warn`:`ok`,text:e.message}),e.stillListed||u.invalidateQueries({queryKey:[[`nodes`,`topology`]]})}catch(e){x({tone:`warn`,text:a(`cluster.nodeCard.forgetFailed`,{error:e instanceof Error?e.message:String(e)})})}finally{y(!1)}}},L=async()=>{if(!f&&await d({title:a(`cluster.nodeCard.unpair`,`Unpair {{name}}`,{name:t.name}),message:a(`cluster.nodeCard.unpairItDisconnectsAndMust`,`Unpair {{name}}? It disconnects and must be paired again.`,{name:t.name}),confirmLabel:a(`cluster.nodeCard.unpair2`,`Unpair`),variant:`danger`})){p(!0),x(null);try{let e=await s.trpcClient.agentPairing.unpairAgent.mutate({nodeId:t.id});x({tone:e.agentNotified?`ok`:`warn`,text:`${e.nodeId}: ${e.next}${e.agentNotified?``:` The agent could not be told; forget the hub on its own page.`}`}),u.invalidateQueries({queryKey:[[`nodes`,`topology`]]})}catch(e){x({tone:`warn`,text:a(`cluster.nodeCard.unpairFailed`,{error:e instanceof Error?e.message:String(e)})})}finally{p(!1)}}},R=t.isHub?null:e(W,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>void L(),disabled:f,title:a(`cluster.nodeCard.unpairThisNodeRevokesIts`,`Unpair this node — revokes its certificates; it must be paired again to rejoin`),children:[i(ae,{className:`h-3 w-3`,"aria-hidden":!0}),f?a(`cluster.nodeCard.unpairing`,`Unpairing…`):a(`cluster.nodeCard.unpair2`,`Unpair`)]});return t.isOnline?e(`div`,{className:`border border-border rounded-xl`,children:[e(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2 px-4 py-3 bg-muted/30 border-b border-border rounded-t-xl`,children:[e(`div`,{className:`flex min-w-0 flex-1 basis-full items-center gap-x-2 gap-y-1 sm:basis-auto sm:flex-initial`,children:[i(`div`,{className:`w-2.5 h-2.5 rounded-full bg-success shrink-0`}),i(Bt,{node:t}),e(`span`,{className:`text-xs text-muted-foreground min-w-0 truncate`,children:[t.cpuModel??t.platform,` ·`,` `,t.memoryMB>0?a(`cluster.nodeCard.gb`,`{{value1}}GB`,{value1:Math.round(t.memoryMB/1024)}):``,` `,`· `,t.arch]})]}),t.engines.map(e=>i(`span`,{className:`text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary font-medium shrink-0`,title:a(`cluster.nodeInfoTab.installedRuntimesHint`,`Inference runtimes installed on this node. Its live inference devices are on Pipeline → Load balancing.`),children:e},e)),e(`div`,{className:`flex min-w-0 flex-wrap items-center justify-end gap-x-3 gap-y-1 text-xs text-muted-foreground w-full sm:ml-auto sm:w-auto`,children:[!t.isHub&&e(`button`,{type:`button`,onClick:()=>void F(),disabled:D,title:a(`cluster.nodeCard.openThisAgentSStatus`,`Open this agent's status dashboard (unlocks with a short-lived hub ticket)`),className:`inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-xs text-foreground hover:bg-surface-hover disabled:opacity-50`,children:[i(_,{className:`h-3 w-3`}),D?a(`cluster.nodeCard.opening`,`Opening…`):a(`cluster.nodeCard.openDashboard`,`Open dashboard`)]}),R,e(`span`,{className:`flex items-center gap-1`,children:[i(M,{className:`h-3 w-3`}),` `,t.cpuPercent,`%`]}),e(`span`,{className:`flex items-center gap-1`,children:[i(ie,{className:`h-3 w-3`}),` `,t.memoryPercent===null?a(`cluster.memoryUnknown`):`${t.memoryPercent}%`]})]})]}),b!=null&&i(`p`,{role:`status`,className:`px-4 pt-2 text-xs ${b.tone===`ok`?`text-success`:`text-warning`}`,children:b.text}),(k!==null||j!==null)&&e(`p`,{role:`status`,className:`px-4 pt-2 text-xs text-warning`,children:[k,j!==null&&e(l,{children:[` `,i(`a`,{href:j,target:`_blank`,rel:`noreferrer`,className:`underline text-foreground`,children:a(`cluster.nodeCard.openDashboard`,`Open dashboard`)})]})]}),i(`div`,{className:`sticky top-0 z-20 flex border-b border-border px-4 bg-background overflow-x-auto`,children:[`info`,`forks`,`processes`,`load`,`settings`,`capabilities`].map(e=>i(`button`,{onClick:()=>h(e),className:`shrink-0 whitespace-nowrap px-3 py-2 text-xs font-medium border-b-2 transition-colors ${m===e?`border-primary text-primary`:`border-transparent text-muted-foreground hover:text-foreground`}`,children:e===`info`?a(`cluster.nodeCard.general`,`General`):e===`forks`?a(`cluster.nodeCard.forks`,`Forks ({{length}})`,{length:S.length}):e===`processes`?a(`cluster.nodeCard.processes`,`Processes`):e===`load`?a(`cluster.nodeCard.load`,`Load`):e===`settings`?a(`cluster.nodeCard.settings`,`Settings`):a(`cluster.nodeCard.capabilities`,`Capabilities`)},e))}),e(`div`,{className:`px-4 py-2`,children:[m===`info`&&e(`div`,{className:`space-y-3`,children:[i(Zn,{nodeId:t.id,name:t.name,hostname:t.hostname,platform:t.platform,arch:t.arch,cpuModel:t.cpuModel,cpuCores:t.cpuCores,memoryMB:t.memoryMB,engines:t.engines,isHub:t.isHub,uptime:t.uptime,localIps:t.localIps,rootPackage:t.rootPackage}),i(tr,{nodeId:t.id,detectedHosts:t.localIps??[]}),i(`div`,{className:`border-t border-border pt-1`,children:i(dr,{node:{id:t.id,name:t.name,isHub:t.isHub,isOnline:t.isOnline,rootPackage:t.rootPackage??null}})})]}),m===`forks`&&i(Gt,{nodeId:t.id,processes:S}),m===`processes`&&i(Yt,{nodeId:t.id}),m===`load`&&i(Wn,{nodeId:t.id,isHub:t.isHub}),m===`settings`&&i(Jn,{nodeId:t.id,addonIds:C}),m===`capabilities`&&i(Yn,{nodeId:t.id,addons:t.addons})]})]}):e(`div`,{className:`border border-border rounded-xl overflow-hidden opacity-60`,children:[e(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2 px-4 py-3 bg-muted/30`,children:[i(`div`,{className:`w-2.5 h-2.5 rounded-full bg-destructive shrink-0`}),i(Bt,{node:t}),e(`span`,{className:`text-xs text-muted-foreground min-w-0 truncate`,children:[t.cpuModel??t.platform,` ·`,` `,t.memoryMB>0?a(`cluster.nodeCard.gb`,`{{value1}}GB`,{value1:Math.round(t.memoryMB/1024)}):``,` `,`· `,t.arch]}),t.engines.map(e=>i(`span`,{className:`text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary font-medium`,title:a(`cluster.nodeInfoTab.installedRuntimesHint`,`Inference runtimes installed on this node. Its live inference devices are on Pipeline → Load balancing.`),children:e},e)),t.rootPackage&&e(`span`,{className:`text-[10px] font-mono px-1.5 py-0.5 rounded bg-muted text-muted-foreground`,children:[t.rootPackage.name,`@`,t.rootPackage.version]}),i(`span`,{className:`ml-auto text-xs px-2 py-0.5 rounded-full bg-destructive/10 text-destructive`,children:a(`common.offline`)})]}),e(`div`,{className:`flex items-center justify-between gap-3 px-4 py-3`,children:[e(`span`,{className:`text-xs text-muted-foreground`,children:[t.lastSeen?i(`span`,{className:`mr-1`,children:a(`cluster.nodeCard.lastSeen`,{when:new Date(t.lastSeen).toLocaleString()})}):null,a(`cluster.nodeCard.addonsAssigned`,{count:t.addons.length})]}),e(`div`,{className:`flex shrink-0 items-center gap-2`,children:[R,e(`button`,{type:`button`,onClick:()=>void I(),disabled:v,title:a(`cluster.nodeCard.forgetThisNodeRemovesIts`,`Forget this node — removes its saved history and pipeline assignments`),className:`flex items-center gap-1 text-xs px-2 py-1 rounded-md border border-border text-muted-foreground hover:text-destructive hover:border-destructive/50 disabled:opacity-50 transition-colors`,children:[i(g,{className:`h-3 w-3`}),v?a(`cluster.nodeCard.forgetting`,`Forgetting…`):a(`cluster.nodeCard.forgetNode`,`Forget node`)]})]})]}),b!=null&&i(`p`,{role:`status`,className:`px-4 pb-3 text-xs leading-relaxed ${b.tone===`ok`?`text-success`:`text-warning`}`,children:b.text})]})}var $=3,mr=7e3;function hr(e){return[...e].sort((e,t)=>e.isHub===t.isHub?0:e.isHub?1:-1)}function gr(e){return e.isHub?{}:{nodeId:e.id}}function _r(e){return e.updateState===`staging`||e.updateState===`pending-restart`||e.pendingVersion!==null?!0:!e.updateAvailable}async function vr(e,t){let n=gr(e),r=G.t(`helpers.clusterUpdateAll.noAnswer`);for(let i=1;i<=$;i+=1)try{let r=await t.readStatus(n);return _r(r)?{nodeId:e.id,nodeName:e.name,outcome:`applied`,detail:G.t(`helpers.clusterUpdateAll.landed`,{state:r.updateState,version:r.runningVersion??G.t(`helpers.clusterUpdateAll.unknown`)})}:{nodeId:e.id,nodeName:e.name,outcome:`failed`,detail:G.t(`helpers.clusterUpdateAll.unchanged`,{version:r.runningVersion??G.t(`helpers.clusterUpdateAll.unknown`)})}}catch(e){r=e instanceof Error?e.message:String(e),i<$&&await t.wait(mr)}return{nodeId:e.id,nodeName:e.name,outcome:`unconfirmed`,detail:G.t(`helpers.clusterUpdateAll.unconfirmed`,{attempts:$,error:r})}}function yr(e){return e.accepted?`applied`:e.outcome===`failed`?`failed`:`refused`}async function br(e,t){let n=[];for(let r of hr(e))try{let e=await t.apply(gr(r));n.push({nodeId:r.id,nodeName:r.name,outcome:yr(e),detail:e.message})}catch{n.push(await vr(r,t))}return n}s();function xr(){let{nodes:e,isLoading:t}=Le(),r=n(()=>e??[],[e]);return{nodes:r,isLoading:t&&r.length===0}}var Sr={applied:`border-success/40 bg-success/10 text-success`,refused:`border-warning/40 bg-warning/10 text-warning`,failed:`border-danger/40 bg-danger/10 text-danger`,unconfirmed:`border-warning/40 bg-warning/10 text-warning`};function Cr(){let{t}=K(),s=N(),{nodes:c,isLoading:u}=xr(),[d,f]=Xe(),{selection:p,selectNode:m}=at(c),g=p.node,_=n(()=>c.filter(e=>e.isOnline),[c]),v=_.length,y=c.filter(e=>!e.isOnline).length,b=Me(),x=T(),[S,w]=o(!1),[D,O]=o([]),k=d.get(`unlockNode`),A=d.get(`returnTo`),[j,M]=o(null);a(()=>{if(k===null||A===null)return;let e=!1;return(async()=>{try{let t=await x.trpcClient.addons.custom.mutate({addonId:`system-config`,action:`mintAgentUiUnlockTicket`,input:{nodeId:k,dashboardBaseUrl:A}});if(e)return;let n=jt(t),r=n===null?null:n.dashboardUrl??(()=>{let e=new URL(A);return e.searchParams.set(`ticket`,n.ticket),e.toString()})();if(r===null){M(`Could not mint an unlock ticket.`);return}let i=new URLSearchParams(d);i.delete(`unlockNode`),i.delete(`returnTo`),f(i,{replace:!0}),window.location.assign(r)}catch(t){e||M(t instanceof Error?t.message:String(t))}})(),()=>{e=!0}},[k,A,d,f,x.trpcClient]);let P=r(async()=>{let e=_.map(e=>({id:e.id,name:e.name,isHub:e.isHub}));if(await s({title:t(`serverManagement.confirmUpdateAllTitle`,`Update all nodes`),message:t(`serverManagement.confirmUpdateAllBody`,`Update and restart every online node, agents first, hub last. Up-to-date nodes are skipped; this page reconnects when the hub comes back.`),confirmLabel:t(`serverManagement.confirmUpdateAllAction`,`Update all & restart`),variant:`warning`})){w(!0),O([]);try{O(await br(e,{apply:e=>b.mutateAsync(e),readStatus:e=>x.trpcClient.serverManagement.getServerPackageStatus.query(e),wait:e=>new Promise(t=>setTimeout(t,e))}))}finally{w(!1)}}},[b,s,_,x,t]);return e(Qe,{icon:h,title:t(`nav.nodes`,`Nodes`),subtitle:t(`cluster.subtitle`,`One node at a time — topology and packages. Agents join by pairing (certificate, no shared secret).`),actions:e(l,{children:[v>0&&i(`span`,{className:`rounded-full bg-success/10 px-2 py-0.5 text-xs text-success`,children:t(`common.onlineCount`,{count:v})}),y>0&&i(`span`,{className:`rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive`,children:t(`common.offlineCount`,{count:y})}),v>1&&e(W,{type:`button`,size:`sm`,disabled:S,title:t(`serverManagement.updateAllHint`,`Sequenced agents-first, hub-last — up-to-date nodes are skipped.`),onClick:()=>void P(),children:[S?i(E,{className:`h-3.5 w-3.5 animate-spin`}):i(C,{className:`h-3.5 w-3.5`}),t(`serverManagement.updateAll`,`Update all nodes`)]})]}),children:[D.length>0&&i(`ul`,{"aria-label":`update-all-report`,className:`flex flex-col gap-1 text-xs`,children:D.map(t=>e(`li`,{"data-outcome":t.outcome,className:`rounded border px-2 py-1 ${Sr[t.outcome]}`,children:[i(`span`,{className:`font-medium`,children:t.nodeName}),i(`span`,{className:`mx-1 uppercase tracking-wide`,children:t.outcome}),i(`span`,{className:`opacity-80`,children:t.detail})]},t.nodeId))}),j!==null&&e(`p`,{role:`alert`,className:`rounded border border-warning/40 bg-warning/10 px-3 py-2 text-xs text-warning`,children:[t(`system.cluster.unlockFromAgentFailed`,`Unlock from agent failed:`),` `,j]}),i(kt,{onOpenNode:m}),u?i(`div`,{className:`flex items-center justify-center py-12 text-muted-foreground`,children:t(`system.cluster.loadingClusterTopology`,`Loading cluster topology...`)}):g===null?i(`div`,{className:`rounded-md border border-dashed border-border px-3 py-6 text-center text-xs text-foreground-subtle`,children:t(`cluster.noNodes`,`No nodes in this cluster yet.`)}):e(`div`,{className:`flex flex-col gap-3`,children:[i(it,{staleNodeId:p.staleNodeId,shownNodeName:g.name}),i(se,{selectedNodeId:g.id,onSelect:m,allowOffline:!0,alwaysShow:!0}),i(pr,{node:g})]})]})}export{Cr as ClusterPage};
@@ -0,0 +1 @@
1
+ import{C as e,K as t,S as n,Y as r,a as i,et as a,x as o}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{dt as s}from"./player-overlays-oTS1TZZY.js";import{pn as c,sn as l}from"./client-DcvpIFoh.js";import{t as u}from"./boxes-CVkAEP7e.js";import{Ad as d,B as f,Fd as p,Fo as m,R as h,U as g,_i as _,di as v,gi as y,hi as b,oi as x,ri as S,si as C,vi as w,yt as T,z as E}from"./src-XEHc18wE.js";import{t as D}from"./useTranslation-BJr-n0es.js";import{t as O}from"./use-device-bound-caps-CI6zlnII.js";import{t as k}from"./DeviceDoActionFields-B50ODgPq.js";import{t as A}from"./CompositionBlockEditor-CJhCzXua.js";a();function j(e){return e===void 0||!Number.isFinite(e)?``:String(e)}function M({value:e,onValue:t,onBrace:i,onBlur:a,...o}){let[s,c]=r(null);return n(p,{...o,inputMode:`decimal`,value:s??j(e),onChange:e=>{let n=e.target.value;if(n.includes(`{`)){i?.();return}c(n);let r=n.trim()===``?NaN:Number(n);t(Number.isFinite(r)?r:null)},onBlur:e=>{c(null),a?.(e)}})}function N({widthClass:e,...t}){return n(`span`,{className:`block max-w-full ${e}`,children:n(d,{...t})})}var ee=/(\{[A-Za-z0-9_]+\})/;function te(e){return e.toLowerCase().startsWith(`it`)?`it`:`en`}function P(e){return`${e.cap}:${e.id}`}function F(e){if(typeof e!=`object`||!e)return!1;let t=Object.keys(e);return t.length===1&&t[0]===`$var`&&typeof Reflect.get(e,`$var`)==`string`}function I(e){let t=[];for(let n of e.split(ee))n!==``&&(n.startsWith(`{`)&&n.endsWith(`}`)?t.push({kind:`slot`,key:n.slice(1,-1)}):t.push({kind:`text`,text:n}));return t}function L(e){let t=e.offer;switch(t.kind){case`number`:return{kind:`fixed`,value:t.min??0,...t.quantity===void 0||t.unit===void 0?{}:{unit:t.unit}};case`enum`:{let e=t.values[0];return{kind:`fixed`,value:e===void 0?``:e.value}}case`boolean`:return{kind:`fixed`,value:!1};default:return{kind:`fixed`,value:``}}}function R(e){return Object.fromEntries(e.openArgs.map(e=>[e.key,L(e)]))}function z(e,t,n){if(F(e))return{kind:`var`,name:e.$var};let r=B(t);return typeof e==`number`&&r!==void 0?{kind:`fixed`,value:e,unit:n??r.unit}:typeof e==`string`||typeof e==`number`||typeof e==`boolean`?{kind:`fixed`,value:e}:L(t)}function B(e){let t=e.offer;if(!(t.kind!==`number`||t.quantity===void 0||t.unit===void 0))return{quantity:t.quantity,unit:t.unit,min:t.min,max:t.max}}function V(e,t){return JSON.stringify(e)===JSON.stringify(t)}function H(e,t){if(typeof t.deviceId!=`number`)return null;let n=t.args??{},r=null,i=-1;for(let a of e){if(a.cap!==t.cap||a.method!==t.method)continue;let e=Object.entries(a.args);e.every(([e,t])=>V(n[e],t))&&e.length>i&&(r=a,i=e.length)}if(r===null)return null;let a=Object.fromEntries(r.openArgs.map(e=>[e.key,z(n[e.key],e,t.argUnits?.[e.key])]));return{action:r,values:a}}function U(e){return e.kind===`var`?{$var:e.name}:e.value}function W(e){return e.kind===`fixed`&&e.value===``}function G(e,t,n){let r={},i={};for(let t of e.openArgs){let e=n[t.key]??L(t);t.optional===!0&&W(e)||(r[t.key]=U(e),e.kind===`fixed`&&e.unit!==void 0&&B(t)!==void 0&&(i[t.key]=e.unit))}let a={...e.args,...r};return{kind:`cap`,deviceId:t,cap:e.cap,method:e.method,...Object.keys(a).length===0?{}:{args:a},...Object.keys(i).length===0?{}:{argUnits:i}}}function K(e,t){if(t.kind===`var`)return null;let n=e.offer;return n.kind===`number`?typeof t.value!=`number`||!Number.isFinite(t.value)?`empty`:n.min!==void 0&&t.value<n.min?`below`:n.max!==void 0&&t.value>n.max?`above`:null:n.kind===`text`||n.kind===`dynamic`?e.optional===!0||t.value!==``?null:`empty`:null}a();function q(e){return e.kind===`fixed`?String(e.value):``}function J({arg:t,locale:i,variables:a,value:o,onChange:s}){let{t:c}=D(),[l,u]=r(!1),d=t.label[i],f=K(t,o),p=o.kind===`var`?n(C,{label:o.name,onRemove:()=>s(L(t))}):n(Y,{arg:t,locale:i,value:o,onChange:s,onBrace:()=>u(!0)});return e(`span`,{className:`inline-flex flex-col gap-0.5 align-top`,"data-testid":`arg-${t.key}`,children:[e(`span`,{className:`inline-flex items-center gap-1`,children:[p,a.length>0&&e(b,{open:l,onOpenChange:u,children:[n(w,{"aria-label":c(`flow.arg.useVariable`,`Use a variable for {{label}}`,{label:d}),className:`h-8 rounded-md border border-border bg-surface px-2 font-mono text-xs text-foreground hover:bg-surface-hover`,children:`{x}`}),n(y,{children:a.map(e=>n(_,{onClick:()=>s({kind:`var`,name:e.name}),children:`${e.name} · ${e.hint}`},e.name))})]})]}),n(Z,{arg:t,value:o,issue:f})]})}function Y({arg:e,locale:t,value:r,onChange:i,onBrace:a}){let{t:o}=D(),s=e.offer,c=e.label[t];if(s.kind===`enum`)return n(N,{widthClass:`w-40`,"aria-label":c,value:String(r.value),onChange:e=>{let t=s.values.find(t=>String(t.value)===e.target.value);t!==void 0&&i({kind:`fixed`,value:t.value})},options:s.values.map(e=>({value:String(e.value),label:e.label[t]}))});if(s.kind===`boolean`)return n(N,{widthClass:`w-28`,"aria-label":c,value:r.value===!0?`yes`:`no`,onChange:e=>i({kind:`fixed`,value:e.target.value===`yes`}),options:[{value:`yes`,label:o(`common.yes`,`Yes`)},{value:`no`,label:o(`common.no`,`No`)}]});let l=B(e);return l===void 0?s.kind===`number`?n(X,{label:c,unit:s.unit,value:r,onChange:i,onBrace:a}):n(p,{"aria-label":c,type:s.kind===`text`&&s.secret===!0?`password`:`text`,className:`w-40`,value:q(r),onChange:e=>{if(e.target.value.includes(`{`)){a();return}i({kind:`fixed`,value:e.target.value})}}):n(h,{quantity:l.quantity,storedUnit:l.unit,value:typeof r.value==`number`?r.value:void 0,unit:r.unit,min:l.min,max:l.max,"aria-label":c,onBrace:a,onChange:e=>{let t=f(e,l.unit);i({kind:`fixed`,value:t.value,unit:t.unit})}})}function X({label:t,unit:r,value:i,onChange:a,onBrace:s}){return e(o,{children:[n(M,{"aria-label":t,className:`w-20`,value:typeof i.value==`number`?i.value:void 0,onValue:e=>a({kind:`fixed`,value:e??NaN}),onBrace:s}),r!==void 0&&n(`span`,{className:`text-sm text-foreground-muted`,children:r})]})}function Z({arg:e,value:t,issue:r}){let{t:i}=D(),a=e.offer;if(t.kind!==`fixed`||a.kind!==`number`||a.min===void 0&&a.max===void 0)return null;let o=B(e),s=o===void 0?a.unit:t.unit??o.unit,c=o===void 0?{min:a.min,max:a.max}:E({min:a.min,max:a.max},o.unit,s??o.unit),l=s??``,u=e=>e===void 0||o===void 0?e:Number(e.toPrecision(4)),d={min:u(c.min),max:u(c.max)},f=d.min!==void 0&&d.max!==void 0?i(`flow.arg.range`,`{{min}} to {{max}} {{unit}}`,{min:d.min,max:d.max,unit:l}):d.min===void 0?i(`flow.arg.atMost`,`at most {{max}} {{unit}}`,{max:d.max,unit:l}):i(`flow.arg.atLeast`,`at least {{min}} {{unit}}`,{min:d.min,unit:l});return n(`span`,{className:`text-[11px] ${r===null?`text-foreground-subtle`:`text-danger`}`,role:r===null?void 0:`alert`,children:f.trim()})}a();function Q({devices:e,value:r,onChange:i,selection:a,noun:o=`device`,listState:s=`answered`,emptyLabel:c,testId:l}){return n(g,{devices:t(()=>e.map(e=>({id:e.id,name:e.name,...e.type===void 0?{}:{type:e.type},location:e.location??null})),[e]),listState:s,value:[...r],onChange:e=>i(e),selection:a,noun:o,groupBy:`location`,...c===void 0?{}:{emptyLabel:c},testId:l})}a();function ne(e){return typeof e==`number`?e:typeof e==`object`&&e&&`$var`in e?{$var:e.$var}:[...e]}function re(e,t,n){return e.map(e=>({value:P(e),label:e.label[t],description:e.phrase[t].replace(`{device}`,n)}))}function ie({step:i,devices:a,devicesState:o=`answered`,variables:s,onChange:u}){let{t:d,i18n:f}=D(),p=te(f.language),[m,h]=r(!1),g=typeof i.deviceId==`number`,_=typeof i.deviceId==`number`?i.deviceId:0,y=a.find(e=>e.id===_),b=O(g?_:0),C=t(()=>b.data===void 0?[]:l(b.data,y?.type),[b.data,y?.type]),w=t(()=>H(C,i),[C,i]),T=i.cap===``,E=g&&_>0&&b.data===void 0&&!b.isError;if(!(g&&!m&&(T||w!==null||E)))return n($,{step:i,devices:a,devicesState:o,onChange:u,onBack:g&&!T&&w!==null?()=>h(!1):null});let k=a.filter(e=>c(e.type??``));return e(`div`,{className:`space-y-2`,"data-testid":`command-step`,children:[e(`div`,{className:`flex flex-wrap items-center gap-2`,children:[y?.type!==void 0&&n(v,{variant:`neutral`,children:y.type}),n(S,{variant:`ghost`,size:`sm`,className:`ml-auto`,onClick:()=>h(!0),"data-testid":`command-step-advanced`,children:d(`flow.command.advanced`,`Advanced`)})]}),e(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[n(Q,{devices:k,selection:`single`,listState:o,value:_>0?[_]:[],testId:`command-step-device`,onChange:e=>{let t=e[0]??0;t!==_&&u({kind:`cap`,deviceId:t,cap:``,method:``})}}),n(x,{mode:`single`,singleDisplay:`field`,options:re(C,p,y?.name??``),value:w===null?``:P(w.action),placeholder:_===0?d(`flow.command.pickDeviceFirst`,`Pick a device first`):d(`flow.command.pickCommand`,`Pick a command`),disabled:_===0||E,searchable:C.length>=8,emptyMessage:d(`flow.command.noCommands`,`This device has no commands to offer.`),onChange:e=>{let t=C.find(t=>P(t)===e);t!==void 0&&u(G(t,_,R(t)))}})]}),w!==null&&n(ae,{action:w.action,values:w.values,deviceName:y?.name??``,locale:p,variables:s,onChange:e=>u(G(w.action,_,e))})]})}function ae({action:e,values:t,deviceName:r,locale:i,variables:a,onChange:o}){let s=[];return I(e.phrase[i]).forEach((c,l)=>{if(c.kind===`text`){s.push(n(`span`,{children:c.text},`t${String(l)}`));return}if(c.key===`device`){s.push(n(`span`,{className:`font-medium`,children:r},`device`));return}let u=e.openArgs.find(e=>e.key===c.key),d=t[c.key];u===void 0||d===void 0||s.push(n(J,{arg:u,locale:i,variables:a,value:d,onChange:e=>o({...t,[c.key]:e})},c.key))}),n(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-2 text-sm`,children:s})}function $({step:t,devices:r,devicesState:i,onChange:a,onBack:o}){let{t:s}=D();return e(`div`,{className:`space-y-2`,"data-testid":`command-step-generic`,children:[o!==null&&n(S,{variant:`ghost`,size:`sm`,onClick:o,children:s(`flow.command.backToSentence`,`Back to the sentence`)}),n(k,{value:t,allowTriggerDevice:!0,allowMultiSameFamily:!0,devices:r,listState:i,onChange:e=>a({kind:`cap`,deviceId:ne(e.deviceId),cap:e.cap,method:e.method,...e.args===void 0?{}:{args:{...e.args}}})})]})}a();var oe=6e4;function se(){let e=m({projection:`slim`});return t(()=>(e.data??[]).filter(e=>c(String(e.type))).map(e=>({id:e.id,name:e.name,stableId:e.stableId,type:String(e.type),location:e.location??null})).toSorted((e,t)=>e.name.localeCompare(t.name)),[e.data])}function ce(e){let t=s();return i({queryKey:[`automation`,`wireable-fields`,e],enabled:e>0,staleTime:oe,queryFn:async()=>(await t.trpcClient.deviceManager.getWireableFields.query({deviceId:e})).caps})}function le(e,t){return e.find(e=>e.cap===t)?.fields??[]}function ue({blockId:e,onClose:t}){let{t:r}=D();return n(T,{open:e!==null,onClose:t,title:r(`build.customDeviceTab.editComposedDevice`,`Edit composed device`),icon:u,width:`xl`,testId:`composed-device-editor`,fill:!0,children:e!==null&&n(A,{blockId:e,fillHeight:!0})})}export{ie as a,N as c,ce as i,M as l,le as n,Q as o,se as r,F as s,ue as t};
@@ -0,0 +1,2 @@
1
+ import{C as e,J as t,K as n,R as r,S as i,V as a,Y as o,et as s,x as c}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{Di as l,Fn as u,Ji as d,Oi as f,Pr as p,T as m,V as h,Vt as g,Wn as _,ca as v,dt as y,er as b,gt as x,ht as S,st as C}from"./player-overlays-oTS1TZZY.js";import{$n as w,$t as T,An as E,Ba as D,Bi as O,Dn as k,En as A,Fi as j,Fn as M,Ga as N,Gi as P,Gn as F,Ha as I,Hi as L,Hn as R,Ii as z,In as ee,Ji as te,Jn as ne,Ki as re,Kn as ie,Kt as ae,Ln as oe,Mn as se,Nn as ce,On as le,Pi as ue,Pn as de,Qi as fe,Qn as pe,Rn as me,Tn as he,Ua as ge,Ui as _e,Un as ve,Va as ye,Vi as be,Wa as xe,Wi as Se,Wn as Ce,Xn as we,Ya as Te,Yn as Ee,Zi as De,Zn as Oe,_a as ke,aa as Ae,ca as je,ea as Me,en as Ne,er as Pe,fa as Fe,fr as Ie,ga as Le,gn as Re,ha as ze,ia as Be,ji as Ve,jn as He,kn as Ue,la as We,ma as Ge,mr as Ke,na as qe,nn as Je,oa as Ye,pa as Xe,qi as Ze,qn as Qe,ra as B,sa as $e,ta as et,ua as tt,va as nt,ya as rt,zi as it}from"./client-DcvpIFoh.js";import{c as at,d as ot,f as st,i as ct,l as lt,o as ut}from"./__vite-browser-external-BCAtXlNQ.js";import{i as dt,n as ft,r as pt,t as mt}from"./sigma-BYdS13dc.js";import{t as ht}from"./boxes-CVkAEP7e.js";import{n as gt}from"./video-Dx3E7zlj.js";import{$d as _t,$o as vt,Ad as V,Br as yt,Cr as bt,Fd as H,Fo as xt,Hn as St,Hr as Ct,Id as wt,It as Tt,Jr as Et,Kr as Dt,Lr as Ot,Nr as U,On as kt,Po as At,Ps as jt,Rr as Mt,Tr as Nt,Tt as Pt,U as Ft,Un as It,Ur as Lt,Vr as Rt,Wn as zt,Wr as Bt,Xn as Vt,Zd as Ht,Zn as Ut,_i as Wt,br as Gt,di as Kt,ds as qt,fs as Jt,gi as Yt,hi as Xt,mi as Zt,of as Qt,pi as $t,qa as en,ri as W,s as tn,to as nn,vi as rn,wr as an,xr as on,yr as sn,zr as cn}from"./src-XEHc18wE.js";import{t as G}from"./i18n-C-H4BlYV.js";import{t as K}from"./useTranslation-BJr-n0es.js";import{h as ln,mr as un,pr as dn}from"./index-o6kBNilE.js";import{t as fn}from"./use-device-bound-caps-CI6zlnII.js";import{n as pn,r as mn,t as hn}from"./assignment-candidates-83kFfE1Z.js";s();function gn(e,t){let n=e===`enum`?`string`:e,r=t.kind===`enum`?`string`:t.kind,i={source:t.source,cap:t.cap,fieldPath:t.fieldPath};return r===n?{kind:`from`,...i}:n===`number`&&r===`string`?{kind:`expression`,expr:`number(x)`,bindings:{x:{kind:`from`,...i}}}:null}function _n(e){return e.map(e=>({id:e.id,name:e.name,addonId:e.addonId,stableId:e.stableId,location:e.location,type:e.type,parentDeviceId:e.parentDeviceId}))}function q(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=Object.getOwnPropertyDescriptor(n,e)?.value}return n}function vn(e,t,n,r){return r===null?{kind:`from`,source:e,cap:t,fieldPath:n.path}:gn(r,{source:e,cap:t,fieldPath:n.path,kind:n.kind})}function yn(e,t,n,r){let i={addonId:e.addonId,stableId:e.stableId};return t.caps.flatMap(e=>e.fields.filter(e=>e.item!==!0).map(t=>({cap:e.cap,path:t.path,kind:t.kind,value:n===null?void 0:q(n[e.cap],t.path),source:vn(i,e.cap,t,r)})))}function bn(e,t){return t?e===void 0?`—`:e===null?`null`:typeof e==`string`||typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e):`…`}function xn({device:t,action:n,onPick:r}){let{t:a}=K(),o=Bt(t.id,`compact`,t.name),s=[t.container===null||o.includes(t.container)?null:a(`customize.suggest.in`,{container:t.container}),t.detail].filter(e=>e!==null&&e!==``).join(` · `);return e(`li`,{className:`${m} flex items-center gap-3`,children:[e(`div`,{className:`min-w-0 flex-1`,children:[i(`div`,{className:`text-xs text-foreground break-words`,children:o}),s!==``&&i(`div`,{className:`text-[11px] text-foreground-subtle break-words`,children:s})]}),i(W,{variant:`outline`,size:`sm`,"aria-label":a(n===`add`?`customize.suggest.addNamed`:`customize.suggest.useNamed`,{name:o}),onClick:()=>r(t.id),children:a(n===`add`?`customize.suggest.add`:`customize.suggest.use`)})]})}function Sn({location:t,devices:n,action:r,onPick:a,onPickAll:o}){let{t:s}=K();if(n.length===0)return null;let c=s(`customize.suggest.heading`,{location:t});return e(`section`,{"aria-label":c,className:`flex flex-col gap-1`,children:[e(`div`,{className:`flex min-h-7 items-center gap-2`,children:[i(`h3`,{className:`${h} min-w-0 flex-1`,children:c}),o!==void 0&&n.length>1&&i(W,{variant:`ghost`,size:`sm`,onClick:o,children:s(`customize.suggest.addAll`,{count:n.length})})]}),i(`ul`,{className:`flex flex-col divide-y divide-border rounded-md border border-border`,children:n.map(e=>i(xn,{device:e,action:r,onPick:a},e.id))})]})}function Cn(e,t){let n=Qt.useQueries(n=>e.map(e=>n.deviceManager.listDeviceIdsByCaps({capNames:[e]},{enabled:t})));return pn(e.map((e,t)=>{let r=n[t];return{cap:e,query:r===void 0?{status:`pending`}:{status:r.status,data:r.data,error:r.error===null?null:{message:r.error.message}}}}))}function wn(e){return e===`identity`||e===`invert`||e===`threshold`||e===`linear`}function Tn(e){return Object.hasOwn(R,e)}function En(e){return Tn(e)?R[e].targets:[]}function Dn(e,t){let n=En(e).find(e=>e.id===t);return n?.cardinality===`keyedArray`?n.fields??[]:[]}function On(e,t){return En(e).find(e=>e.id===t)?.traits??[]}function kn(e,t){return e.caps.flatMap(e=>{let n=An(t,e.cap);return e.fields.filter(e=>e.item!==!0).map(t=>({cap:e.cap,path:t.path,kind:t.kind,unit:n,enumValues:t.enumValues??[]}))})}function An(e,t){if(e===null)return null;let n=q(e[t],`unit`);return typeof n==`string`&&n.length>0?n:null}function jn(e,t){return t.kind===`number`?e.find(e=>e.kind===`numeric`)??null:t.kind===`enum`||t.kind===`string`?e.find(e=>e.kind===`enum`)??null:null}function Mn(e,t,n,r){let i=Dn(e,t).find(e=>e.path===n);if(i===void 0)return{ok:!1,reason:`kind`};let a=jn(i.sources,r);if(a===null)return{ok:!1,reason:`kind`};if(a.requiredUnit!==void 0&&r.unit===null)return{ok:!1,reason:`unit-unknown`};if(a.requiredUnit!==void 0&&r.unit!==a.requiredUnit)return{ok:!1,reason:`unit`};if(a.transformKinds.includes(`enum-map`))return{ok:!0,mode:`enum`};let o=a.transformKinds.filter(wn);return o.length===0||r.kind!==`number`?{ok:!1,reason:`kind`}:{ok:!0,mode:`scalar`,fit:{ok:!0,valueKind:`number`,sourceUnit:a.requiredUnit??null,transforms:o,declared:a.transforms}}}function Nn(e,t,n){return Dn(e,t).find(e=>e.path===n)?.enumValues??[]}function Pn(e){return e.length===1&&e[0]===`threshold`?`threshold`:e.length===1&&e[0]===`invert`||e.includes(`invert`)&&e.every(e=>e===`identity`||e===`invert`)?`invert`:e.length>1?`choice`:`none`}function Fn(e){if(e.transforms.includes(`identity`))return{kind:`identity`};if(e.transforms.includes(`threshold`)){let t=Ln(e.declared,`threshold`);if(t!==null)return In(t)}if(e.transforms.includes(`linear`)){let t=Ln(e.declared,`linear`);if(t!==null)return In(t)}return{kind:`invert`}}function In(e){switch(e.kind){case`identity`:return{kind:`identity`};case`invert`:return{kind:`invert`};case`threshold`:return{kind:`threshold`,comparison:e.comparison,threshold:e.defaultThreshold,startDwellMs:e.defaultStartDwellMs,stopDwellMs:e.defaultStopDwellMs};case`linear`:return Rn(e);case`enum-map`:return{kind:`identity`}}}function Ln(e,t){return e.find(e=>e.kind===t)??null}function Rn(e){return{kind:`linear`,scale:e.defaultScale,offset:e.defaultOffset,...e.clampMin!==void 0&&e.clampMax!==void 0?{clampMin:e.clampMin,clampMax:e.clampMax}:{}}}function zn(e){let t=me({draft:{kind:`scalar`,cap:e.cap,targetId:e.targetId,source:{addonId:e.source.addonId,stableId:e.source.stableId,cap:e.source.cap,fieldPath:e.source.fieldPath},transform:e.transform},device:e.device,apply:e.apply,sourceValueKind:e.source.valueKind,changedAtField:e.source.changedAtField,sourceUnit:e.source.sourceUnit});return t.ok?t.value:null}function Bn({control:t,transforms:n,declared:r,unit:a,value:o,onChange:s}){let{t:c}=K();return t===`none`?null:e(`div`,{className:`flex flex-col gap-2`,children:[i(`h3`,{className:`text-[11px] font-medium text-foreground-muted`,children:c(`customize.scalar.stepTransform`)}),t===`choice`&&i(V,{"aria-label":c(`customize.scalar.stepTransform`),value:o.kind,options:n.map(e=>({value:e,label:c(`customize.scalar.transform.${e}`)})),onChange:e=>s(Vn(e.target.value,r))}),o.kind===`invert`||t===`invert`&&o.kind!==`threshold`?e(`label`,{className:`flex items-center gap-2 text-[11px] text-foreground`,children:[i(Ut,{checked:o.kind===`invert`,onChange:e=>s(e.target.checked?{kind:`invert`}:{kind:`identity`})}),c(`customize.scalar.invert`)]}):null,o.kind===`threshold`&&i(Un,{declared:r,unit:a,value:o,onChange:s}),o.kind===`linear`&&i(Gn,{declared:r,value:o,onChange:s})]})}function Vn(e,t){let n=Ln(t,Hn(e));return n===null?e===`invert`?{kind:`invert`}:{kind:`identity`}:In(n)}function Hn(e){return e===`invert`||e===`threshold`||e===`linear`||e===`enum-map`?e:`identity`}function Un({declared:t,unit:n,value:r,onChange:a}){let{t:o}=K(),s=n??``,c=Ln(t,`threshold`),l=c?.kind===`threshold`?c.comparisons:[];return e(`div`,{className:`flex flex-col gap-2 text-[11px] text-foreground`,children:[l.length>0&&e(`label`,{className:`flex flex-col gap-1`,children:[o(`customize.scalar.comparison`),i(V,{"aria-label":o(`customize.scalar.comparison`),value:r.comparison,options:l.map(e=>({value:e,label:o(`customize.scalar.comparisonValue.${e}`)})),onChange:e=>{let t=l.find(t=>t===e.target.value);t!==void 0&&a({...r,comparison:t})}})]}),i(Kn,{label:o(`customize.scalar.threshold`,{unit:s}),value:r.threshold,onChange:e=>a({...r,threshold:e})}),i(Kn,{label:o(`customize.scalar.startDwell`),value:r.startDwellMs/1e3,onChange:e=>a({...r,startDwellMs:e*1e3})}),i(Kn,{label:o(`customize.scalar.stopDwell`),value:r.stopDwellMs/1e3,onChange:e=>a({...r,stopDwellMs:e*1e3})})]})}function Wn(e){return e===null||e.kind!==`linear`||e.clampMin===void 0||e.clampMax===void 0?null:{min:e.clampMin,max:e.clampMax}}function Gn({declared:t,value:n,onChange:r}){let{t:a}=K(),o=Wn(Ln(t,`linear`));return e(`div`,{className:`flex flex-col gap-2 text-[11px] text-foreground`,children:[i(Kn,{label:a(`customize.scalar.scale`),value:n.scale,onChange:e=>r({...n,scale:e})}),i(Kn,{label:a(`customize.scalar.offset`),value:n.offset,onChange:e=>r({...n,offset:e})}),o!==null&&i(Kn,{label:a(`customize.scalar.clampMin`),value:n.clampMin??o.min,onChange:e=>r({...n,clampMin:e,clampMax:n.clampMax??o.max})}),o!==null&&i(Kn,{label:a(`customize.scalar.clampMax`),value:n.clampMax??o.max,onChange:e=>r({...n,clampMin:n.clampMin??o.min,clampMax:e})})]})}function Kn({label:t,value:n,onChange:r}){return e(`label`,{className:`flex flex-col gap-1`,children:[t,i(H,{type:`number`,value:Number.isFinite(n)?n:0,onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&r(t)}})]})}var qn=`kind`,Jn=`unit`,Yn=`unit-unknown`,Xn=`compile`,Zn=`dwell`,Qn=`no-value`,$n=`empty`;function er(e){return`customize.scalar.previewFailure.${e}`}function tr(e){return e===`compile`||e===`dwell`||e===`no-value`||e===`empty`}function nr(e){return e===`identity`||e===`invert`||e===`threshold`||e===`linear`}function rr(e,t){let n=Object.entries(R).find(([t])=>t===e)?.[1];return n===void 0?null:n.targets.find(e=>e.id===t)??null}function ir(e,t){return rr(e,t)?.path??null}function ar(e,t){return e.caps.flatMap(e=>{let n=sr(t,e.cap);return e.fields.filter(e=>e.item!==!0).map(t=>({cap:e.cap,path:t.path,kind:t.kind,unit:or(n,e.cap,t.path)}))})}function or(e,t,n){return e??Ne(t,n)??null}function sr(e,t){if(e===null)return null;let n=q(e[t],`unit`);return typeof n==`string`&&n.length>0?n:null}function cr(e,t){if(t.kind===`boolean`){let n=xe[t.cap];return n===void 0||n!==t.path?null:t.cap===`switch`?e.find(e=>e.kind===`switch`)??e.find(e=>e.kind===`binary`)??null:e.find(e=>e.kind===`binary`)??e.find(e=>e.kind===`field`&&e.valueKinds?.includes(`boolean`))??null}return t.kind===`number`?e.find(e=>e.kind===`numeric`)??e.find(e=>e.kind===`field`&&e.valueKinds?.includes(`number`))??null:t.kind===`string`?e.find(e=>e.kind===`field`&&e.valueKinds?.includes(`string`))??null:null}function lr(e,t,n){let r=rr(e,t);if(r===null||r.cardinality!==`scalar`||n.kind===`enum`)return{ok:!1,reason:qn};let i=cr(r.sources,n);if(i===null)return{ok:!1,reason:qn};if(i.requiredUnit!==void 0&&n.unit===null)return{ok:!1,reason:Yn};if(i.requiredUnit!==void 0&&n.unit!==i.requiredUnit)return{ok:!1,reason:Jn};let a=i.transformKinds.filter(nr);return a.length===0?{ok:!1,reason:qn}:{ok:!0,valueKind:n.kind,sourceUnit:i.requiredUnit??null,transforms:a,declared:i.transforms}}function ur(e,t){return t.find(t=>t===e)??null}function dr({mode:t,modes:n,name:r,onChange:a}){let{t:o}=K();return n.length===0?null:e(`div`,{className:`flex flex-col gap-1`,children:[i(V,{"aria-label":o(`customize.motion.modeFor`,{name:r}),value:t,options:n.map(e=>({value:e,label:o(`customize.motion.mode.${e}`)})),onChange:e=>{let t=ur(e.target.value,n);t!==null&&a(t)}}),i(`p`,{className:`text-[11px] text-foreground-muted`,children:o(`customize.motion.modeLine.${t}`)})]})}var fr={lastChangedAt:{en:`Last change`,it:`Ultima variazione`},lastFetchedAt:{en:`Last update`,it:`Ultimo aggiornamento`},lastDetectedAt:{en:`Last detection`,it:`Ultimo rilevamento`},lastPressedAt:{en:`Last press`,it:`Ultima pressione`},pressCountSinceStart:{en:`Press count`,it:`Conteggio pressioni`},since:{en:`Since`,it:`Da`}};function pr(e,t){return t.startsWith(`it`)?e.it:e.en}function mr(e){if(!(`unit`in e))return;let t=e.unit;return typeof t==`string`&&t.length>0?t:void 0}function hr(e,t){let n=Re[e]?.noun;return n===void 0?e.split(`-`).filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `):pr(n,t)}function J(e,t,n){let r=Re[e]?.state?.find(e=>e.field===t);if(r!==void 0){let e=pr(r.label,n),t=mr(r);return t===void 0?e:`${e} (${t})`}let i=fr[t];return i===void 0?t:pr(i,n)}function gr(e){return e===`single`?`values`:`devices`}function _r(e){return e<=0?null:`values`}function vr(){return`devices`}function yr(e,t){return!e&&(t.seenDevice||t.step!==`devices`)?{seenDevice:!1,step:`devices`}:e&&!t.seenDevice?{seenDevice:!0,step:`values`}:null}function br(e,t){return e===t}function xr(e,t,n){let r=br(e,t);return n?r?`flex min-h-0 flex-col`:`hidden min-h-0 flex-col sm:flex`:r?void 0:`hidden sm:block`}function Sr({step:t,devices:n,values:r,back:a,onBack:o,done:s,onDone:c,fillHeight:u=!1}){return e(`div`,{"data-testid":`source-selector`,"data-step":t,className:u?`flex min-h-0 flex-1 flex-col gap-3 sm:grid sm:grid-cols-2 sm:grid-rows-[minmax(0,1fr)] sm:gap-4`:`flex flex-col gap-3 sm:grid sm:grid-cols-2 sm:gap-4`,children:[e(`div`,{"data-testid":`source-selector-devices`,className:xr(t,`devices`,u),children:[s!==null&&e(`div`,{className:`mb-2 flex items-center justify-between gap-2 sm:hidden`,children:[i(`p`,{"data-testid":`source-selector-picked-count`,className:`text-[11px] text-foreground-muted`,children:s.countLabel}),i(W,{size:`sm`,"data-testid":`source-selector-done`,disabled:s.disabled,onClick:c,children:s.label})]}),n]}),e(`div`,{"data-testid":`source-selector-values`,className:xr(t,`values`,u),children:[a!==null&&e(W,{variant:`ghost`,size:`sm`,className:`mb-2 sm:hidden`,"data-testid":`source-selector-back`,"aria-label":a.ariaLabel,onClick:o,children:[i(l,{className:`size-3`}),a.label]}),u?i(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:r}):r]})]})}function Cr(e){return[...new Set(e.accept.map(e=>e.cap))]}function wr(e,t){let n=new Set(Cr(t)),r=new Set(t.exclude.map(e=>`${e.addonId}/${e.stableId}`)),i=[],a=[];for(let o of e)r.has(`${o.addonId}/${o.stableId}`)||(Pr(o.type,t.deviceTypes)&&o.caps.some(e=>n.has(e))?i.push(o):a.push(o));return{compatible:i,incompatible:a}}function Tr(e,t){return e.filter(e=>Ar(t,e)&&jr(t,e))}function Er(e,t){return t.history.required?e.filter(e=>Ar(t,e)&&!Mr(e)):[]}function Dr(e,t){return e.flatMap(e=>{let n=t.find(t=>t.addonId===e.source.addonId&&t.stableId===e.source.stableId);return n===void 0?[]:[n.id]})}function Or(e){if(e.selectedIds.length>e.request.max)return{members:e.previous.map(Ir),refused:`max`,needsField:[]};let t=[];return{members:e.selectedIds.flatMap(n=>{let r=e.devices.find(e=>e.id===n);if(r===void 0)return[];let i=kr(r,e);return i===null?(t.push(n),[]):[Fr(r,i.cap,i.fieldPath)]}),refused:null,needsField:t}}function kr(e,t){if(t.choiceDeviceId===e.id&&t.choice!==null&&Nr(t.request,t.choice))return t.choice;let n=t.previous.find(t=>t.source.addonId===e.addonId&&t.source.stableId===e.stableId);if(n!==void 0&&Nr(t.request,n))return n;let r=t.request.fieldChoice===`first-match`?t.request.accept.filter(t=>e.caps.includes(t.cap)):t.request.accept,i=t.request.fieldChoice===`first-match`||r.length===1?r[0]:void 0;return i===void 0?null:{cap:i.cap,fieldPath:i.fieldPath}}function Ar(e,t){return e.accept.some(e=>e.cap===t.cap&&e.fieldPath===t.fieldPath&&e.valueKind===t.kind)}function jr(e,t){return!e.history.required||Mr(t)}function Mr(e){return it(e.cap)[e.fieldPath]!==void 0}function Nr(e,t){return e.accept.some(e=>e.cap===t.cap&&e.fieldPath===t.fieldPath)}function Pr(e,t){return t.length===0?!0:t.some(t=>t===e)}function Fr(e,t,n){return{source:{addonId:e.addonId,stableId:e.stableId},cap:t,fieldPath:n}}function Ir(e){return{source:{addonId:e.source.addonId,stableId:e.source.stableId},cap:e.cap,fieldPath:e.fieldPath}}function Lr(e){return{id:e.id,name:e.name,type:e.type,stableId:e.stableId,parentDeviceId:e.parentDeviceId??null,...e.location!==void 0&&e.location!==null?{location:e.location}:{},...e.role!==void 0&&e.role!==null?{role:e.role}:{},...e.primaryChildEntityId!==void 0&&e.primaryChildEntityId!==null?{primaryChildEntityId:e.primaryChildEntityId}:{}}}function Rr(e,t,n=Dt(`en`)){return Ct(e,`compact`,Et(t),n)}function zr(e){return e.map(e=>({id:e.id,name:e.name,type:e.type,parentDeviceId:e.parentDeviceId,...e.location===null?{}:{location:e.location}}))}function Br(e,t){return e===`pending`||t.kind===`pending`?`pending`:e===`error`||t.kind===`unknown`?`failed`:`answered`}function Vr(e,t){return e.map(e=>({id:e.id,name:e.name,type:e.type,location:e.location,parentDeviceId:e.parentDeviceId,addonId:e.addonId,stableId:e.stableId,caps:t.get(e.id)??[]}))}function Hr(e){return e.caps.flatMap(e=>e.fields.flatMap(t=>t.item===!0?[]:[{cap:e.cap,fieldPath:t.path,kind:t.kind}]))}function Ur(e,t,n){return t?e==null?n:bn(e,!0):`…`}function Wr({device:t,request:n,members:r,onChoose:a}){let{t:o,i18n:s}=K(),c=At({deviceId:t.id}),l=Jt({deviceId:t.id}),u=c.status===`success`?c.data:{caps:[]},d=Tr(Hr(u),n),f=Er(Hr(u),n),p=`helper-member-value-${t.id}`;return e(`section`,{className:`flex flex-col gap-1`,"data-testid":`helper-member-section-${t.id}`,children:[i(`h3`,{className:`text-[11px] font-medium text-foreground`,children:i(Rt,{device:t,form:`compact`})}),c.status===`pending`||l.status===`pending`?i(`p`,{role:`status`,className:`text-[11px] text-foreground-subtle`,children:o(`customize.picker.loadingFields`)}):c.status===`error`?i(U,{title:o(`customize.picker.fieldsFailed`),message:c.error?.message??``}):d.length===0?i(`p`,{className:`text-[11px] text-foreground-muted`,children:o(`helper.noUsableValue`)}):i(`ul`,{className:`flex flex-col gap-1`,children:d.map(n=>{let c=r.some(e=>e.source.addonId===t.addonId&&e.source.stableId===t.stableId&&e.cap===n.cap&&e.fieldPath===n.fieldPath),u=l.status===`success`?q(l.data[n.cap],n.fieldPath):void 0;return i(`li`,{children:e(`label`,{className:`flex flex-wrap items-center gap-2 text-[11px] text-foreground`,children:[i(`input`,{type:`radio`,name:p,checked:c,"data-testid":`helper-value-${t.id}-${n.cap}.${n.fieldPath}`,onChange:()=>a(n)}),i(`span`,{children:J(n.cap,n.fieldPath,s.language)}),i(`span`,{className:`text-foreground-muted`,children:Ur(u,l.status===`success`,o(`helper.valueUnknown`))})]})},`${n.cap}.${n.fieldPath}`)})}),f.length>0&&i(`p`,{className:`text-[11px] text-foreground-muted`,"data-testid":`helper-no-history`,children:o(`helper.noHistory`)})]})}function Gr({request:t,enabled:r,members:a,onMembersChange:s,onRefuse:c,fillHeight:l=!1}){let{t:u,i18n:d}=K(),[f,p]=o([]),[m,h]=o(`devices`),g=xt({projection:`slim`}),_=n(()=>g.status===`success`?_n(g.data):[],[g.status,g.data]),v=Cn(n(()=>Cr(t),[t]),r),y=n(()=>v.kind===`known`?wr(Vr(_,v.value),t):{compatible:[],incompatible:[]},[v,_,t]),b=Br(g.status,v),x=Dr(a,y.compatible),S=[...f,...x.filter(e=>!f.includes(e))].filter(e=>y.compatible.some(t=>t.id===e)),C=n(()=>zr(y.compatible.map(Kr)),[y.compatible]),w=(e,n,r)=>{if(v.kind!==`known`)return;let i=Or({request:t,devices:y.compatible,selectedIds:e,previous:a,choiceDeviceId:n,choice:r});if(i.refused===`max`){c({code:`max`,max:t.max});return}c(null),s(i.members)},T=e(`div`,{className:l?`flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto`:`flex max-h-72 min-h-0 flex-col gap-2 overflow-y-auto sm:max-h-[min(24rem,60vh)]`,children:[i(`h3`,{className:`text-[11px] font-medium text-foreground-muted`,children:u(`helper.pickMembers`)}),g.status===`error`?i(U,{title:u(`customize.picker.devicesFailed`),message:g.error?.message??``}):v.kind===`unknown`?i(U,{title:u(`customize.picker.devicesFailed`),message:v.reason}):i(Ft,{devices:C,listState:b,value:S,selection:`multiple`,groupBy:`location`,onChange:e=>{p(e),w(e,null,null)},noun:`device`,showAll:!0,testId:`helper-member-picker`})]}),E=S.flatMap(e=>{let t=y.compatible.find(t=>t.id===e);return t===void 0?[]:[t]});return i(Sr,{step:m,devices:T,values:i(`div`,{className:`flex min-h-0 flex-col gap-3`,children:E.length===0?i(`p`,{className:`text-[11px] text-foreground-subtle`,children:u(`helper.pickMembersHint`)}):E.map(e=>i(Wr,{device:e,request:t,members:a,onChoose:t=>w(qr(S,e.id),e.id,t)},e.id))}),back:S.length===0?null:{label:u(`customize.sourceSelector.backToDevices`),ariaLabel:u(`customize.sourceSelector.backToDevices`)},onBack:()=>h(vr()),done:{countLabel:u(`customize.sourceSelector.pickedCount`,{count:S.length}),label:u(`customize.sourceSelector.done`),disabled:S.length===0},onDone:()=>{let e=_r(S.length);e!==null&&h(e)},fillHeight:l})}function Kr(e){return{id:e.id,name:e.name,type:e.type,location:e.location,parentDeviceId:e.parentDeviceId,addonId:e.addonId,stableId:e.stableId,caps:e.caps}}function qr(e,t){return e.includes(t)?e:[...e,t]}function Jr(e,t){let n=N[t]??null;if(n===null)return null;let r=e.caps.find(e=>e.cap===t);return r===void 0?null:r.fields.some(e=>e.path===n)?n:null}function Yr(e,t,n){let r=xe[t];if(r===void 0||r!==n)return!1;let i=e.caps.find(e=>e.cap===t);return i===void 0||!i.fields.some(e=>e.path===n)?!1:Jr(e,t)!==null}function Xr(e,t){return t===void 0?null:e.find(e=>e.addonId===t.addonId&&e.stableId===t.stableId)??null}function Zr(e,t,n,r,i){let a=e.find(e=>e.addonId===t.addonId&&e.stableId===t.stableId),o=r===`pulse`?N[n.cap]:void 0;if(a!==void 0&&a.deviceId===t.id&&a.cap===n.cap&&a.fieldPath===n.path&&(r!==`pulse`||a.changedAtField===o))return null;let s=e.filter(e=>!(e.addonId===t.addonId&&e.stableId===t.stableId)),c={deviceId:t.id,addonId:t.addonId,stableId:t.stableId,cap:n.cap,fieldPath:n.path,deviceName:t.name,mode:a?.mode??i,...o===void 0?{}:{changedAtField:o}};return[...s,c]}function Qr(e){return`${e.addonId}/${e.stableId}/${e.cap}.${e.fieldPath}`}function $r(e,t){let n=Qr(t);return e.filter(e=>Qr(e)!==n)}function ei(e,t,n){let r=Qr(t);return e.map(e=>Qr(e)===r?{...e,mode:n}:e)}function ti({edges:t,edge:n,onChange:r}){let{t:a}=K();return t.length===0?null:e(`label`,{className:`flex flex-col gap-1 text-[11px] text-foreground`,children:[a(`customize.event.edge`),i(V,{"aria-label":a(`customize.event.edge`),value:n,options:t.map(e=>({value:e,label:a(`customize.event.edgeValue.${e}`)})),onChange:e=>{let n=t.find(t=>t===e.target.value);n!==void 0&&r(n)}})]})}function ni({label:t,value:n,onChange:r}){return e(`label`,{className:`flex flex-col gap-1 text-[11px] text-foreground`,children:[t,i(H,{type:`number`,"aria-label":t,value:Number.isFinite(n)?n:0,onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&t>=0&&r(t)}})]})}function ri(e){return Object.hasOwn(R,e)}function ii(e,t){return ri(e)?R[e].targets.find(e=>e.id===t)??null:null}function ai(e){let t=ii(e.cap,e.targetId);if(t===null)return[];if(t.cardinality===`keyedArray`){let t=e.fieldPath;return t===void 0?[]:Dn(e.cap,e.targetId).find(e=>e.path===t)?.sources??[]}return t.sources}function oi(e){return{cap:e.cap,path:e.path,kind:e.kind,unit:e.unit}}function si(e,t){return t.kind===`number`?e.find(e=>e.kind===`numeric`)??null:t.kind===`enum`||t.kind===`string`?e.find(e=>e.kind===`enum`)??null:null}function ci(e){return e===`identity`||e===`invert`||e===`threshold`||e===`linear`}function li(e,t){if(e.requiredUnit!==void 0&&t.unit===null)return{kind:`incompatible`,reason:`unit-unknown`};if(e.requiredUnit!==void 0&&t.unit!==e.requiredUnit)return{kind:`incompatible`,reason:`unit`};if(e.transformKinds.includes(`enum-map`))return{kind:`conversion`,name:`enum-map`};let n=e.transformKinds.filter(ci);return n.length===0?{kind:`incompatible`,reason:`kind`}:n.includes(`identity`)?{kind:`direct`}:n.includes(`threshold`)?{kind:`conversion`,name:`threshold`}:n.includes(`linear`)?{kind:`conversion`,name:`scale`}:n.includes(`invert`)?{kind:`conversion`,name:`invert`}:{kind:`incompatible`,reason:`kind`}}function ui(e,t){if(e.pickerTargetKind!==void 0){let n=e.pickerTargetKind,r={addonId:`x`,stableId:`y`};return(n===null?{kind:`from`,source:r,cap:t.cap,fieldPath:t.path}:gn(n,{source:r,cap:t.cap,fieldPath:t.path,kind:t.kind}))===null?{kind:`incompatible`,reason:`kind`}:{kind:`direct`}}if(e.acceptAnyField===!0)return t.kind===`enum`?{kind:`incompatible`,reason:`kind`}:{kind:`direct`};let n=ii(e.cap,e.targetId);if(n?.cardinality===`event`&&t.kind===`boolean`&&cr(ai(e),oi(t))!==null)return{kind:`direct`};let r=ai(e);if(r.length===0)return{kind:`incompatible`,reason:`kind`};let i=n?.cardinality===`keyedArray`&&e.fieldPath!==void 0;if(t.kind===`enum`&&!i)return{kind:`incompatible`,reason:`kind`};let a=i?si(r,t):cr(r,oi(t));return a===null?{kind:`incompatible`,reason:`kind`}:li(a,t)}function di(e,t){let n=ve[e];return n===void 0?!1:Object.values(n).includes(t)}function fi(){return Object.keys(ve)}function pi(e,t){if(t.kind===`binary`)return e.some(e=>Object.hasOwn(xe,e));if(t.kind===`switch`)return e.includes(`switch`);if(t.kind===`numeric`){let n=t.requiredUnit;return n===void 0?e.some(e=>fi().includes(e)||e===`numeric-sensor`):n===`W`?e.some(e=>e===`numeric-sensor`||e===`power-meter`||di(e,n)):e.some(e=>di(e,n))}return t.kind===`field`?e.some(e=>fi().includes(e)||e===`numeric-sensor`||e===`battery`):t.kind===`enum`?e.includes(`consumables`)||e.some(e=>fi().includes(e)):!1}function mi(e,t){if(t.pickerTargetKind!==void 0||t.acceptAnyField===!0)return!0;let n=ai(t);return n.length===0?!1:n.some(t=>pi(e.caps,t))}function hi(e,t,n){let r=[],i=[];for(let a of e)a.id!==n&&(mi(a,t)?r.push(a):i.push(a));return{compatible:r,incompatible:i}}function gi(e,t,n){let r=new Map,i=[];for(let a of e){let e=ui(t,a),o=J(a.cap,a.path,n),s={cap:a.cap,path:a.path,label:o,currentText:a.currentText,compatibility:e};if(e.kind===`incompatible`){i.push(s);continue}let c=r.get(a.cap)??[];c.push(s),r.set(a.cap,c)}return{groups:[...r.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({cap:e,title:hr(e,n),rows:t.toSorted((e,t)=>e.label.localeCompare(t.label))})),incompatible:i}}function _i(e){return ii(e.cap,e.targetId)?.cardinality===`keyedArray`&&e.fieldPath!==void 0}function vi(e){if(e.pickerTargetKind!==void 0)return[];if(e.acceptAnyField===!0)return fi();let t=ai(e),n=new Set;for(let e of t)if(e.kind===`binary`)for(let e of Object.keys(xe))n.add(e);else if(e.kind===`switch`)n.add(`switch`);else if(e.kind===`numeric`){n.add(`numeric-sensor`),n.add(`power-meter`);for(let t of fi())(e.requiredUnit===void 0||di(t,e.requiredUnit))&&n.add(t)}else if(e.kind===`field`){n.add(`battery`),n.add(`numeric-sensor`);for(let e of fi())n.add(e)}else if(e.kind===`enum`){n.add(`consumables`);for(let e of fi())n.add(e)}return[...n]}function yi(e,t,n,r,i){let a=ai(e);if(a.length===0)return[];let o=ar(t,i).filter(e=>e.kind===`boolean`),s=[];for(let e of o){if(cr(a,e)===null||n===`pulse`&&!Yr(t,e.cap,e.path))continue;let o=i===null?void 0:q(i[e.cap],e.path);s.push({cap:e.cap,path:e.path,kind:`boolean`,unit:null,currentText:bn(o,r)})}return s}function bi(e,t,n,r,i,a=null){return a===null?e.pickerTargetKind!==void 0&&i!==null?yn(i,t,r,e.pickerTargetKind).map(e=>({cap:e.cap,path:e.path,kind:e.kind,unit:null,currentText:bn(e.value,n)})):(_i(e)?kn(t,r):ar(t,r)).map(e=>{let t=r===null?void 0:q(r[e.cap],e.path);return{cap:e.cap,path:e.path,kind:e.kind,unit:e.unit,currentText:bn(t,n)}}):yi(e,t,a,n,r)}function xi(e,t,n){return n!==null&&e.parentDeviceId===n?0:e.parentDeviceId===t?1:null}function Si(e,t,n){let r=t.find(e=>e.id===n),i=r?.parentDeviceId??null,a=t.find(e=>e.id===(i??n));if(r===void 0||a===void 0)return null;let o=e.flatMap(e=>{let t=xi(e,n,i);return t===null?[]:[{candidate:e,place:t}]}).toSorted((e,t)=>e.place-t.place||e.candidate.name.localeCompare(t.candidate.name));return o.length===0?null:{container:a.name,devices:o.map(e=>e.candidate)}}s();function Ci(e,t){return e===`pending`||t.kind===`pending`?`pending`:e===`error`?`failed`:`answered`}function wi(e,t){return e.map(e=>({id:e.id,name:e.name,type:e.type,location:e.location,parentDeviceId:e.parentDeviceId,addonId:e.addonId,stableId:e.stableId,caps:t.get(e.id)??[]}))}function Ti(e,t){return e.kind===`direct`?t(`customize.sourceSelector.direct`):e.kind===`conversion`?t(`customize.sourceSelector.withConversion`,{name:t(`customize.scalar.transform.${Ei(e.name)}`)}):``}function Ei(e){return e===`scale`?`linear`:e===`enum-map`?`enumMap`:e}function Di(e){return e.kind===`members`?i(Gr,{...e}):i(Oi,{...e})}function Oi(t){let{t:r,i18n:s}=K(),[l,u]=o(`devices`),[d,p]=o(!1),m=yr(t.device!==null,{seenDevice:d,step:l});m!==null&&(p(m.seenDevice),u(m.step));let[h,g]=o(!1),[_,v]=o(!1),y=xt({projection:`slim`}),b=t.kind===`formula`?t.deviceFilter:void 0,x=n(()=>{if(y.status!==`success`)return[];let e=_n(y.data);return b===void 0?e:e.filter(b)},[y.status,y.data,b]),S=Cn(n(()=>vi(t.destination),[t.destination]),t.enabled),{compatible:C,incompatible:w}=n(()=>S.kind===`known`?hi(wi(x,S.value),t.destination,t.hostId):{compatible:[],incompatible:[]},[S,x,t.destination,t.hostId]),T=n(()=>S.kind===`known`?Si(C,wi(x,S.value),t.hostId):null,[S,C,x,t.hostId]),E=Ci(y.status,S),D=t.device?.id??0,O=At({deviceId:D}),k=Jt({deviceId:t.device===null?0:D}),A=O.status===`success`?O.data:{caps:[]},j=t.kind===`event`?t.shape:null,M=bi(t.destination,A,k.status===`success`,k.status===`success`?k.data:null,t.device,j),N=t.kind===`event`?t.devicePickerTestId:`source-selector-device-picker`,{groups:P,incompatible:F}=gi(M,t.destination,s.language),I=Ai(t,A,k.status===`success`?k.data:null),L=e=>{let n=e[0];if(n===void 0){t.onDeviceChange(null),t.kind!==`event`&&t.onFieldChange(null),u(vr());return}if(t.device?.id!==n){let e=x.find(e=>e.id===n)??null;t.onDeviceChange(e),t.kind!==`event`&&t.onFieldChange(null)}u(gr(`single`))},R=t.kind===`event`?M[0]??null:null,z=t.kind===`event`?t:null;a(()=>{if(z===null||z.device===null||R===null)return;let e=Zr(z.picked,z.device,{cap:R.cap,path:R.path},z.shape,z.sourceModes[0]??`in-addition`);e!==null&&z.onPickedChange(e)},[z,R]);let ee=n(()=>zr(C),[C]),te=e(`div`,{className:`flex max-h-72 min-h-0 flex-col gap-2 overflow-y-auto sm:max-h-[min(24rem,60vh)]`,children:[i(`h3`,{className:`text-[11px] font-medium text-foreground-muted`,children:r(`customize.sourceSelector.pickDevice`,{title:t.destination.title})}),y.status===`error`?i(U,{title:r(`customize.picker.devicesFailed`),message:y.error?.message??``}):e(c,{children:[T!==null&&i(Sn,{location:T.container,devices:T.devices.map(e=>({id:e.id,name:e.name,container:null,detail:null})),action:`use`,onPick:e=>L([e])}),i(Ft,{devices:ee,listState:E,value:t.device===null?[]:[t.device.id],selection:`single`,groupBy:`location`,onChange:L,noun:`device`,showAll:!0,testId:N})]}),w.length>0&&e(`div`,{"data-testid":`source-incompatible-devices`,children:[e(W,{variant:`ghost`,size:`sm`,className:`h-auto w-full justify-start gap-1 px-0 text-[11px] text-foreground-muted`,onClick:()=>g(e=>!e),children:[i(f,{className:`size-3 transition-transform ${h?`rotate-180`:``}`}),r(`customize.sourceSelector.notCompatibleDevices`,{count:w.length})]}),h&&i(`ul`,{className:`mt-1 flex flex-col gap-0.5 pl-4 text-[11px] text-foreground-subtle`,children:w.map(e=>i(`li`,{children:e.name},e.id))})]})]}),ne=t.kind===`event`&&t.picked.length>0?i(`ul`,{"data-testid":`source-picked-list`,className:`flex flex-col gap-2`,children:t.picked.map(n=>e(`li`,{className:`flex flex-col gap-1 text-xs`,children:[e(`span`,{className:`text-foreground`,children:[n.deviceName,` · `,J(n.cap,n.fieldPath,s.language)]}),t.shape===`span`&&n.mode!==void 0&&i(dr,{mode:n.mode,modes:t.sourceModes,name:n.stableId,onChange:e=>t.onPickedChange(ei(t.picked,n,e))}),i(W,{variant:`ghost`,size:`sm`,onClick:()=>t.onPickedChange($r(t.picked,n)),children:r(`customize.event.clear`)})]},`${n.addonId}/${n.stableId}/${n.cap}.${n.fieldPath}`))}):null,re=t.kind===`event`?e(`div`,{className:`flex flex-col gap-2`,children:[t.shape===`pulse`&&e(c,{children:[i(ti,{edges:t.edges,edge:t.edge,onChange:t.onEdgeChange}),e(`label`,{className:`flex flex-col gap-1 text-[11px] text-foreground`,children:[r(`customize.event.debounce`),i(H,{type:`number`,"aria-label":r(`customize.event.debounce`),value:Number.isFinite(t.debounceSec)?t.debounceSec:0,onChange:e=>{let n=Number(e.target.value);Number.isFinite(n)&&n>=0&&t.onDebounceSecChange(n)}})]})]}),t.shape===`span`&&e(c,{children:[i(ni,{label:r(`customize.event.timeout`),value:t.timeoutSec,onChange:t.onTimeoutSecChange}),t.cooldownSec!==null&&i(ni,{label:r(`customize.event.cooldown`),value:t.cooldownSec,onChange:t.onCooldownSecChange})]})]}):null;return i(Sr,{step:l,devices:te,values:e(`div`,{className:`flex min-h-0 flex-col gap-2`,children:[ne,t.device!==null&&i(Rt,{device:t.device,form:`full`,className:`text-[11px] font-medium text-foreground`}),t.device===null?i(`p`,{className:`text-[11px] text-foreground-subtle`,children:r(`customize.sourceSelector.noDevice`)}):O.status===`pending`?i(`p`,{role:`status`,className:`text-[11px] text-foreground-subtle`,children:r(`customize.picker.loadingFields`)}):O.status===`error`?i(U,{title:r(`customize.picker.fieldsFailed`),message:O.error?.message??``}):e(`div`,{className:`flex flex-col gap-3`,children:[t.kind===`event`?i(Mi,{fields:R===null?[]:[R],language:s.language,emptyLabel:r(`customize.sourceSelector.noStateField`)}):null,t.kind!==`event`&&P.map(n=>e(`section`,{"aria-label":n.title,children:[i(`h4`,{className:`text-[10px] font-medium uppercase tracking-wide text-foreground-muted`,children:n.title}),i(`ul`,{className:`mt-1 flex flex-col gap-1`,children:n.rows.map(n=>i(`li`,{children:e(`label`,{className:`flex flex-wrap items-center gap-2 text-[11px] text-foreground`,children:[i(`input`,{type:`radio`,name:`source-value`,checked:t.field?.cap===n.cap&&t.field.path===n.path,"data-testid":`source-value-${n.cap}.${n.path}`,onChange:()=>{if(t.onFieldChange({cap:n.cap,path:n.path}),t.kind===`formula`)return;let e=ki(t,A,k.status===`success`?k.data:null,n.cap,n.path);e!==null&&e.ok&&t.onTransformChange(Fn(e))}}),i(`span`,{children:n.label}),i(`span`,{className:`text-foreground-muted`,children:n.currentText}),i(`span`,{className:`text-foreground-subtle`,children:Ti(n.compatibility,r)})]})},`${n.cap}.${n.path}`))})]},n.cap)),t.kind!==`event`&&F.length>0&&e(`div`,{"data-testid":`source-incompatible-values`,children:[e(W,{variant:`ghost`,size:`sm`,className:`h-auto w-full justify-start gap-1 px-0 text-[11px] text-foreground-muted`,onClick:()=>v(e=>!e),children:[i(f,{className:`size-3 transition-transform ${_?`rotate-180`:``}`}),r(`customize.sourceSelector.otherValues`)]}),_&&i(`ul`,{className:`mt-1 flex flex-col gap-1 pl-4 text-[11px] text-foreground-subtle`,children:F.map(t=>e(`li`,{children:[t.label,` · `,t.currentText]},`${t.cap}.${t.path}`))})]})]}),t.kind===`scalar`&&I!==null&&I.ok&&i(Bn,{control:Pn(I.transforms),transforms:I.transforms,declared:I.declared,unit:I.sourceUnit,value:t.transform,onChange:t.onTransformChange}),t.kind===`keyed`&&I!==null&&I.ok&&t.field!==null&&i(Bn,{control:Pn(I.transforms),transforms:I.transforms,declared:I.declared,unit:I.sourceUnit,value:t.transform,onChange:t.onTransformChange}),re]}),back:t.device===null?null:{label:i(Rt,{device:t.device,form:`compact`}),ariaLabel:r(`customize.sourceSelector.backToDevice`,{name:t.device.name})},onBack:()=>u(vr()),done:null,onDone:()=>void 0})}function ki(e,t,n,r,i){if(e.kind===`keyed`){let a=t.caps.flatMap(e=>e.fields.filter(e=>e.item!==!0).map(t=>({cap:e.cap,path:t.path,kind:t.kind,unit:ji(n,e.cap),enumValues:t.enumValues??[]}))).find(e=>e.cap===r&&e.path===i);if(a===void 0)return null;let o=Mn(e.destination.cap,e.destination.targetId,e.fieldPath,a);return!o.ok||o.mode!==`scalar`?null:o.fit}let a=t.caps.flatMap(e=>e.fields.filter(e=>e.item!==!0).map(t=>({cap:e.cap,path:t.path,kind:t.kind,unit:or(ji(n,e.cap),e.cap,t.path)}))).find(e=>e.cap===r&&e.path===i&&(e.kind===`boolean`||e.kind===`number`||e.kind===`string`));if(a===void 0)return null;let o=lr(e.destination.cap,e.destination.targetId,a);return o.ok?o:null}function Ai(e,t,n){return e.kind===`formula`||e.kind===`event`||e.device===null||e.field===null?null:ki(e,t,n,e.field.cap,e.field.path)}function ji(e,t){if(e===null)return null;let n=e[t]?.unit;return typeof n==`string`&&n.length>0?n:null}function Mi({fields:t,language:n,emptyLabel:r}){return t.length===0?i(`p`,{className:`text-[11px] text-foreground-subtle`,children:r}):i(`ul`,{className:`flex flex-col gap-1`,children:t.map(t=>e(`li`,{"data-testid":`source-declared-field`,className:`text-[11px] text-foreground`,children:[i(`span`,{className:`font-medium`,children:hr(t.cap,n)}),` · `,J(t.cap,t.path,n),` `,i(`span`,{className:`text-foreground-muted`,children:t.currentText})]},`${t.cap}.${t.path}`))})}function Ni({id:e,...t}){return i(kt,{headingId:`customize-${e}`,...t})}function Pi(e,t){if(e.status===`error`)return{kind:`unknown`,reason:e.error?.message??G.t(`helpers.customize.requestFailed`)};let n=e.data;return e.status===`pending`||n===void 0?{kind:`pending`}:{kind:`known`,value:t(n)}}s();function Fi(e,t){let n=Tt(e,t);return n.kind===`resolved`?n.integration.name:null}function Ii(e){let t=xt({projection:`slim`},{enabled:e}),{data:r}=jt(void 0,{enabled:e}),i=t.error===null||t.error===void 0?null:t.error.message;return n(()=>Pi({status:t.status,data:t.data,error:i===null?null:{message:i}},e=>e.map(e=>({id:e.id,name:e.name,addonId:e.addonId,stableId:e.stableId,type:e.type,location:e.location,isCamera:e.isCamera,integration:Fi(e,r),parentDeviceId:e.parentDeviceId,primaryChildEntityId:e.primaryChildEntityId??null,role:e.role??null}))),[t.status,t.data,i,r])}function Li(e){let t=e?.trim()??``;return t.length>0?t:G.t(`helpers.customize.requestFailed`)}function Ri(e){let t=e.data;if(t!==void 0){if(t.state===`not-loaded`)return{kind:`not-loaded`,reason:t.reason};if(t.view===null)return{kind:`none`};let e=Ve(t.view.block);return e===null?{kind:`unknown`,reason:G.t(`helpers.customizationRead.notAComposition`,{id:t.view.block.id})}:{kind:`present`,view:t.view,composition:e}}return e.status===`pending`?{kind:`pending`}:e.status===`error`?{kind:`unknown`,reason:Li(e.error?.message)}:{kind:`pending`}}function zi(e){return e.kind===`present`?e.composition:null}function Bi(e){return Je.find(t=>t.name===e)}function Vi(e){return e===`lastFetchedAt`||e.endsWith(`At`)}function Hi(e){let t=A(e.role);if(t===null||Bi(t)?.status===void 0)return null;let n={};return{target:{kind:`new`,type:e.type,...e.role===null?{}:{role:e.role}},features:[{kind:`fields`,cap:t,fields:n}]}}function Ui(e){return e===null?`incomplete`:he(j(e,{lookupCap:ue(Je),sources:new Map,self:null,blockId:null,target:null,peers:[]}).problems)}function Wi(e,t){let n=Bi(e);return n?.status===void 0?[]:te(n.status.schema).filter(e=>!Vi(e)&&!t.has(e))}function Gi(e,t,n){let r=e?.features??[],i=r.findIndex(e=>e.cap===n.cap);return{target:e?.target??{kind:`existing`,device:t},features:i===-1?[...r,n]:r.map((e,t)=>t===i?n:e)}}function Ki(e,t,n,r,i){return Gi(e,t,de(Y(e,r),n,r,i))}function qi(e,t,n){let r=M(Y(e,t),t,n);return r===null?Ji(e,t):{target:e.target,features:e.features.map(e=>e.cap===t?r:e)}}function Ji(e,t){let n=e.features.filter(e=>e.cap!==t);return n.length===0?null:{target:e.target,features:n}}function Y(e,t){let n=e?.features.find(e=>e.cap===t);return n!==void 0&&n.kind===`fields`?n:null}function Yi(e){return Array.isArray(e)?e.map(Yi):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Yi(t)]))}function Xi(e){return JSON.stringify(Yi(e))}function Zi(e,t){switch(e.kind){case`pending`:return{kind:`refused`,reason:G.t(`helpers.customizationSave.notReadYet`)};case`unknown`:return{kind:`refused`,reason:`the customization could not be read: ${e.reason}`};case`not-loaded`:return{kind:`refused`,reason:`the customizations are not loaded yet: ${e.reason}`};case`none`:return t===null?{kind:`noop`}:{kind:`create`,input:{enabled:!0,composition:t}};case`present`:{let n=e.view.block.id;return t===null?{kind:`delete`,blockId:n}:Xi(t)===Xi(e.composition)?{kind:`noop`}:{kind:`update`,blockId:n,expectedUpdatedAt:e.view.block.updatedAt,composition:t}}}}function Qi(){let{t:e}=K(),t=C();return(n,r)=>t({title:e(`customize.assign.removeConfirm.title`),message:r?`${e(`customize.assign.removeConfirm.message`,{what:n})} ${e(`customize.assign.removeConfirm.last`)}`:e(`customize.assign.removeConfirm.message`,{what:n}),confirmLabel:e(`customize.assign.removeConfirm.confirm`),variant:`danger`})}function $i(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ea(e,t){let n=q(e,t);return n===void 0?{kind:`absent`}:t===`level`&&e.binary===!0?{kind:`value`,value:n,binary:!0}:{kind:`value`,value:n}}function ta(e,t,n){return $i(t)?ea(t,n):e.status===`error`?{kind:`unknown`,reason:e.error?.message??G.t(`helpers.liveValue.unreadable`)}:e.status===`pending`||e.data===void 0?{kind:`pending`}:e.data===null?{kind:`absent`}:ea(e.data,n)}function na(e,t,n){if(t.binary===!0&&n.cap===`battery`&&n.path===`level`){let t=zt(e);return{text:G.t(t?St:It),tone:t?`warning`:`normal`}}return{text:n.path===`level`?`${Math.round(e)} %`:String(e),tone:`normal`}}function ra(e,t,n){let r=e?`active`:`muted`;return t.cap===`contact`&&t.path===`entryOpen`?{text:e?n.open:n.closed,tone:r}:xe[t.cap]===t.path?{text:e?n.active:n.inactive,tone:r}:{text:String(e),tone:`normal`}}function ia(e,t,n){switch(e.kind){case`pending`:return{text:`…`,tone:`muted`};case`unknown`:return{text:`?`,title:e.reason,tone:`warning`};case`absent`:return{text:`—`,tone:`muted`};case`value`:{let r=e.value;return r===null?{text:`—`,tone:`muted`}:typeof r==`boolean`?ra(r,t,n):typeof r==`number`?na(r,e,t):typeof r==`string`?{text:r,tone:`normal`}:{text:JSON.stringify(r),tone:`normal`}}}}var aa=0;function oa(e){let t=y(),n=qt({deviceId:e?.deviceId??aa,capName:e?.cap??``},{enabled:e!==null}),r=tn(t.trpcClient,e?.deviceId??null,e?.cap??``);return e===null?{kind:`absent`}:ta({status:n.status,data:n.data,error:n.error===null||n.error===void 0?null:{message:n.error.message}},r,e.path)}var sa={muted:`text-foreground-subtle`,active:`text-success`,normal:`text-foreground`,warning:`text-warning`};function ca({target:e}){let{t}=K(),n=oa(e);return e===null?null:i(la,{display:ia(n,e,{active:t(`customize.assign.value.active`),inactive:t(`customize.assign.value.inactive`),open:t(`customize.assign.value.open`),closed:t(`customize.assign.value.closed`)})})}function la({display:e}){return i(`span`,{className:`text-xs ${sa[e.tone]}`,title:e.title,children:e.text})}function ua(e){return e===`avg-round-1`?`customize.fieldsCard.aggregate.avg`:`customize.fieldsCard.aggregate.latest`}function da(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function fa(e,t,n){let r=RegExp(`(?<![A-Za-z0-9_])${da(t)}(?![A-Za-z0-9_])`,`g`);return e.replace(r,()=>n)}function pa(e,t,n,r,i){let a=Object.keys(t).toSorted((e,t)=>t.length-e.length),o=e;for(let e of a){let a=t[e];if(a===void 0||a.kind!==`from`)continue;let s=n.get(B(a.source))??i,c=J(a.cap,a.fieldPath,r);o=fa(o,e,`${s} · ${c}`)}return Ca(o)}var ma=1e3,ha=60*ma,ga=60*ha,_a={within:[1],dwell:[1,2],rose:[2]};function va(e){if(!Number.isInteger(e)||e<ma)return null;if(e%ga===0){let t=e/ga;return t===1?`1 h`:`${t} h`}if(e%ha===0){let t=e/ha;return t===1?`1 min`:`${t} min`}if(e%ma===0){let t=e/ma;return t===1?`1 s`:`${t} s`}return null}function ya(e){return/^\d+$/.test(e.trim())?va(Number(e.trim())):null}function ba(e,t){let n=1,r=t+1,i=null,a=[];for(let o=t+1;o<e.length;o+=1){let t=e[o]??``;if(i!==null){if(t===`\\`){o+=1;continue}t===i&&(i=null);continue}if(t===`"`||t===`'`){i=t;continue}if(t===`(`){n+=1;continue}if(t===`)`){if(--n,n===0){let t=e.slice(r,o);return a.length===0&&t.trim()===``||a.push({text:t}),{args:a,close:o}}continue}t===`,`&&n===1&&(a.push({text:e.slice(r,o)}),r=o+1)}return null}function xa(e,t){let n=e[t-1];if(n!==void 0&&/[A-Za-z0-9_]/.test(n))return null;for(let n of Object.keys(_a)){if(!e.startsWith(n,t))continue;let r=t+n.length,i=e[r];if(i!==void 0&&/[A-Za-z0-9_]/.test(i))continue;let a=r;for(;e[a]===` `||e[a]===`
2
+ `;)a+=1;if(e[a]!==`(`)continue;let o=ba(e,a);return o===null?null:{name:n,close:o.close,args:o.args}}return null}function Sa(e){let t=e.args.map(e=>Ca(e.text)),n=_a[e.name]??[];if(e.name===`within`){let e=t[1],n=e===void 0?null:ya(e);if(n!==null)return`within ${n}`}let r=t.map((e,t)=>n.includes(t)?ya(e)??e.trim():e.trim());return`${e.name}(${r.join(`, `)})`}function Ca(e){let t=``,n=0;for(;n<e.length;){let r=xa(e,n);if(r===null){t+=e[n]??``,n+=1;continue}t+=Sa(r),n=r.close+1}return t}function wa(e){for(let t=1;;t++){let n=`s${t}`;if(!e.includes(n))return n}}var Ta={min:`min(a, b, …)`,max:`max(a, b, …)`,abs:`abs(x)`,floor:`floor(x)`,ceil:`ceil(x)`,sqrt:`sqrt(x)`,round:`round(x, digits?)`,pow:`pow(x, y)`,clamp:`clamp(x, lo, hi)`,avg:`avg(a, b, …)`,sum:`sum(a, b, …)`,coalesce:`coalesce(a, b, …)`,age:`age(now, ts)`,convert:`convert(x, "from", "to")`,any:`any(a, b, …)`,all:`all(a, b, …)`,within:`within(ts, ms)`,number:`number(x)`,latest:`latest(ts, …)`,rose:`rose(level, changedAt, debounceMs?)`,count:`count(x)`,dwell:`dwell(active, onForMs, offForMs)`,latchedAt:`latchedAt(value)`,schmitt:`schmitt(x, high, low, onForMs?, offForMs?)`},Ea=/[A-Za-z_][A-Za-z0-9_]*$/;function Da(e,t,n){let r=Ea.exec(e.slice(0,t))?.[0]??``;if(r===``)return[];let i=n.filter(e=>e.startsWith(r)).toSorted().map(e=>({kind:`binding`,label:e,insert:e,hintKey:null})),a=`now`.startsWith(r)?[{kind:`now`,label:`now`,insert:`now`,hintKey:`compositionEditor.now`}]:[],o=[...ge].filter(e=>e.startsWith(r)).toSorted().map(e=>({kind:`builtin`,label:Ta[e]??e,insert:`${e}(`,hintKey:`compositionEditor.builtins.${e}`}));return[...i,...a,...o].slice(0,8)}function Oa(e,t,n){let r=t-(Ea.exec(e.slice(0,t))?.[0]??``).length;return{text:`${e.slice(0,r)}${n.insert}${e.slice(t)}`,cursor:r+n.insert.length}}s();function ka({label:n,value:r,bindings:a,onChange:s}){let{t:c}=K(),l=t(null),[u,d]=o(r.length),f=Da(r,u,a);return e(`div`,{className:`flex flex-col gap-1`,children:[e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[n,i(`input`,{ref:l,className:`font-mono px-1.5 py-0.5 text-[11px] bg-background border border-border rounded`,value:r,onChange:e=>{s(e.target.value),d(e.target.selectionStart??e.target.value.length)},onSelect:e=>d(e.currentTarget.selectionStart??r.length)})]}),f.length>0&&i(`ul`,{role:`listbox`,"aria-label":c(`compositionEditor.suggestions`),className:`rounded border border-border bg-surface text-[11px]`,children:f.map(t=>e(`li`,{role:`option`,"aria-selected":!1,tabIndex:0,className:`flex justify-between gap-2 px-1 cursor-pointer hover:bg-surface-hover`,onClick:()=>{let e=Oa(r,u,t);s(e.text),d(e.cursor),l.current?.focus()},children:[i(`span`,{className:`font-mono`,children:t.label}),t.hintKey!==null&&i(`span`,{className:`text-foreground-subtle`,children:c(t.hintKey)})]},`${t.kind}:${t.label}`))})]})}function Aa(e){return{addonId:e.addonId,stableId:e.stableId}}function ja(e){return new Map(e.map(e=>[B(Aa(e)),e]))}function Ma(e,t,n){if(e.kind===`code`)return{kind:`unavailable`,reason:G.t(`helpers.fieldPreview.codeFields`)};if(e.kind===`series`||e.kind===`expression`&&(Ze(e.expr,`rose`)||Ze(e.expr,`count`)))return{kind:`runtime-only`};let r=Ae(e).filter(e=>t.get(qe(e.source,e.cap))?.kind!==`value`).map(et);if(r.length>0)return{kind:`waiting`,missing:r};let i=ne({source:e,now:n,read:e=>{let n=t.get(qe(e.source,e.cap)),r=n?.kind===`value`?q(n.slice,e.fieldPath):void 0,i=r===void 0?void 0:I(r);return i===void 0?{state:`unavailable`,reason:G.t(`helpers.fieldPreview.notReported`,{path:`${e.cap}.${e.fieldPath}`}),fatal:!1}:{state:`fresh`,value:i}}});return i.state===`unavailable`?{kind:`unavailable`,reason:i.reason}:{kind:`value`,value:i.value,stale:i.reason}}s();function Na({sliceKey:e,deviceId:t,capName:n,onReading:r}){let i=tn(y().trpcClient,t,n);return a(()=>{r(e,i===void 0?{kind:`pending`}:{kind:`value`,slice:i})},[e,i,r]),null}function Pa(e,t){return[...new Map(Ae(e).map(e=>[qe(e.source,e.cap),e]))].map(([e,n])=>({key:e,read:n,device:t.get(B(n.source))}))}function Fa({source:t}){let{t:n}=K(),a=xt({projection:`slim`}),[s,c]=o(new Map),l=r((e,t)=>{c(n=>new Map([...n,[e,t]]))},[]),u=Pa(t,ja(a.status===`success`?_n(a.data):[])),d=a.status===`success`?u.filter(e=>e.device===void 0).map(e=>B(e.read.source)):[];return e(`div`,{className:`flex flex-wrap items-center gap-2 text-[11px]`,children:[u.map(e=>e.device===void 0?null:i(Na,{sliceKey:e.key,deviceId:e.device.id,capName:e.read.cap,onReading:l},e.key)),i(`span`,{className:`text-foreground-subtle`,children:n(`compositionEditor.preview.label`)}),a.status===`error`?i(`span`,{className:`text-warning`,children:n(`compositionEditor.preview.devicesFailed`,{reason:a.error?.message??``})}):d.length>0?i(`span`,{className:`text-warning`,children:n(`compositionEditor.preview.unknownDevice`,{sources:d.join(`, `)})}):i(Ia,{preview:Ma(t,s,Date.now())})]})}function Ia({preview:t}){let{t:n}=K();switch(t.kind){case`value`:return e(`strong`,{children:[`→ `,bn(t.value,!0),t.stale===null?``:` (${t.stale})`]});case`unavailable`:return i(`span`,{className:`text-warning`,children:t.reason});case`waiting`:return i(`span`,{className:`text-foreground-subtle`,children:n(`compositionEditor.preview.waiting`,{sources:t.missing.join(`, `)})});case`runtime-only`:return i(`span`,{className:`text-foreground-subtle`,children:n(`compositionEditor.preview.runtimeOnly`)})}}function La(e,t,n,r,i,a){let o=yn(e,r,i,a).find(e=>e.cap===t&&e.path===n);return o===void 0||o.source===null?null:{device:e,ref:{addonId:e.addonId,stableId:e.stableId},cap:o.cap,path:o.path,kind:o.kind,source:o.source,value:o.value}}s();var Ra=new Map;function za(e,t,n,r){return e.kind===`from`?`${t.get(B(e.source))??r} · ${J(e.cap,e.fieldPath,n)}`:``}function Ba({open:t,title:n,fieldPath:r,fieldLabel:a,sourceNames:s=Ra,initial:c,selfNative:l=null,onClose:u,onSave:d}){let{t:f,i18n:p}=K(),[m,h]=o(c.kind===`expression`?c:{kind:`expression`,expr:`null`,bindings:{}}),[g,_]=o(`idle`),[v,y]=o(null),[b,x]=o(null),S=At({deviceId:v?.id??0}),C=Jt({deviceId:v?.id??0}),w=S.status===`success`?S.data:{caps:[]},T=k(m.expr,m.bindings),E=Object.keys(m.bindings);return i(sn,{open:t,onOpenChange:e=>{e||u()},children:e(on,{width:`lg`,scroll:`body`,placement:`sheet-on-mobile`,"data-testid":`formula-dialog`,children:[i(an,{children:i(Nt,{children:n})}),e(Gt,{className:`flex flex-col gap-2`,children:[i(`span`,{className:`text-xs text-foreground`,children:a??J(``,r,p.language)}),i(ka,{label:f(`compositionEditor.formulaFor`,{path:a??r}),value:m.expr,bindings:E,onChange:e=>h({...m,expr:e})}),i(`ul`,{className:`flex flex-col gap-0.5 text-[11px]`,children:Object.entries(m.bindings).map(([t,n])=>e(`li`,{className:`flex flex-wrap items-center gap-2`,children:[i(`span`,{className:`font-mono`,children:t}),i(`span`,{children:n.kind===`from`?za(n,s,p.language,f(`customize.fieldsCard.unknownDevice`)):JSON.stringify(n.value)}),i(W,{size:`sm`,variant:`ghost`,"aria-label":f(`compositionEditor.removeBinding`,{name:t}),onClick:()=>{let{[t]:e,...n}=m.bindings;h({...m,bindings:n})},children:`×`})]},t))}),e(`div`,{className:`flex flex-wrap gap-2`,children:[l!==null&&i(W,{size:`sm`,variant:`outline`,"data-testid":`formula-self-native`,onClick:()=>{let e=Object.keys(m.bindings),t=m.bindings.v===void 0?`v`:wa(e);h({...m,bindings:{...m.bindings,[t]:{kind:`from`,source:l.source,cap:l.cap,fieldPath:l.fieldPath}}})},children:f(`customize.override.selfNative`)}),i(W,{size:`sm`,variant:`outline`,onClick:()=>_(`add-binding`),children:f(`compositionEditor.addSource`)})]}),T!==null&&i(`p`,{role:`alert`,className:`text-xs text-danger`,children:T}),i(Fa,{source:m}),g===`add-binding`&&e(`div`,{className:`flex flex-col gap-2 border border-border rounded-md p-2`,children:[i(Di,{kind:`formula`,enabled:t,hostId:-1,destination:{cap:`formula`,targetId:`binding`,title:f(`compositionEditor.addSource`),acceptAnyField:!0},device:v,field:b,onDeviceChange:y,onFieldChange:x}),e(`div`,{className:`flex flex-wrap gap-2`,children:[i(W,{variant:`ghost`,size:`sm`,onClick:()=>_(`idle`),children:f(`customize.picker.cancel`)}),i(W,{size:`sm`,disabled:v===null||b===null,onClick:()=>{if(v===null||b===null)return;let e=La(v,b.cap,b.path,w,C.status===`success`?C.data:null,null);if(e===null)return;let t=wa(E);h({...m,bindings:{...m.bindings,[t]:{kind:`from`,source:e.ref,cap:e.cap,fieldPath:e.path}}}),y(null),x(null),_(`idle`)},children:f(`compositionEditor.addSource`)})]})]})]}),e(bt,{children:[i(W,{variant:`ghost`,onClick:u,children:f(`compositionEditor.cancel`)}),i(W,{"data-testid":`formula-dialog-save`,disabled:T!==null,onClick:()=>{d(m),u()},children:f(`compositionEditor.save`)})]})]})})}s();function Va({open:t,from:n,initialTo:r,onClose:a,onSave:s}){let{t:c}=K(),l=Ce(n),[u,d]=o(r??l[0]??``),f=l.includes(u)?u:l[0]??``;return i(sn,{open:t,onOpenChange:e=>{e||a()},children:e(on,{width:`sm`,scroll:`body`,placement:`sheet-on-mobile`,"data-testid":`convert-unit-dialog`,children:[i(an,{children:i(Nt,{children:c(`customize.override.convertTitle`)})}),e(Gt,{className:`flex flex-col gap-2`,children:[i(`p`,{className:`text-xs text-foreground`,children:c(`customize.override.convertSummary`,{from:n,to:f})}),l.length>1&&i(V,{"aria-label":c(`customize.override.targetUnit`),value:f,onChange:e=>d(e.target.value),options:l.map(e=>({value:e,label:e}))})]}),e(bt,{children:[i(W,{variant:`ghost`,onClick:a,children:c(`compositionEditor.cancel`)}),i(W,{"data-testid":`convert-unit-publish`,disabled:f===``||f===n,onClick:()=>{s(f),a()},children:c(`customize.override.publish`)})]})]})})}function Ha(e,t,n,r,i){return{kind:`expression`,expr:`convert(v, ${JSON.stringify(e)}, ${JSON.stringify(t)})`,bindings:{v:{kind:`from`,source:n,cap:r,fieldPath:i}}}}function Ua(e){return{kind:`expression`,expr:JSON.stringify(e),bindings:{}}}function Wa(e,t,n,r,i,a){let o=Y(e,n)??{kind:`fields`,cap:n,fields:{}},s={...o.fields,[r]:i},c=Object.fromEntries(Object.entries(s).filter(([e])=>!a.includes(e)));return Gi(e,t,{...o,fields:c})}function Ga(e,t,n,r){let i=Qe(t,n);if(i===null||e===null)return[];let a=e.fields[i];return a?.kind===`expression`&&a.expr===JSON.stringify(r)&&i!==n?[i]:[]}function Ka(e,t,n,r){let i=Y(e,n);if(i===null)return e;let a=new Set(r),o=Object.fromEntries(Object.entries(i.fields).filter(([e])=>!a.has(e))),s=i.commands!==void 0||i.items!==void 0;return Object.keys(o).length===0&&!s?Ji(e,n):Gi(e,t,{...i,fields:o})}s();function qa({deviceId:t,self:n,selfName:r,cap:a,fieldPath:s,label:l,unit:u,valueKind:d=null,handle:f,names:p,toFill:m=!1}){let{t:h,i18n:g}=K(),_=Qi(),[v,y]=o(`closed`),b=zi(f.state),x=Y(b,a),S=x?.fields[s]??null,C=S===null?null:F(S),w=u===void 0?[]:Ce(u),T=new Map(p);T.set(B(n),r);let E=()=>y(`closed`),D=(e,t)=>{f.save(Wa(b,n,a,s,e,t))},O=()=>C?.kind===`convert-unit`?Ga(x,a,s,C.to):[];return e(`div`,{className:`flex flex-col gap-1 border-t border-border pt-2 first:border-t-0 first:pt-0`,"data-testid":`override-row-${a}-${s}`,children:[e(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[i(`span`,{className:`text-xs text-foreground`,children:l}),m&&S===null&&i(Kt,{variant:`warning`,children:h(`compositionEditor.toFill`)})]}),e(`div`,{className:`flex flex-wrap items-baseline justify-between gap-2`,children:[i(`span`,{className:`text-xs text-foreground`,children:h(`customize.scalar.effective`)}),i(ca,{target:{deviceId:t,cap:a,path:s}})]}),C===null?i(`p`,{className:`text-xs text-foreground-subtle`,children:h(`customize.override.none`)}):i(Xa,{entry:C,names:T,language:g.language,unknownDevice:h(`customize.fieldsCard.unknownDevice`)}),i(`div`,{className:`flex flex-wrap gap-2`,children:C===null?i(Ya,{cap:a,fieldPath:s,saving:f.saving,convert:w.length>0,onFrom:()=>y(`from`),onFormula:()=>y(`formula`),onConvert:()=>y(`convert`)}):e(c,{children:[i(W,{variant:`outline`,size:`sm`,disabled:f.saving,onClick:()=>y(Ja(C)),children:h(`customize.scalar.change`)}),i(W,{variant:`ghost`,size:`sm`,disabled:f.saving,onClick:()=>{if(b===null)return;let e=Ka(b,n,a,[s,...O()]);_(h(`customize.fieldsCard.removeField`,{field:l}),e===null).then(t=>{t&&f.save(e)})},children:h(`customize.scalar.remove`)})]})}),i(sn,{open:v===`from`,onOpenChange:e=>{e||E()},children:e(on,{width:`lg`,scroll:`body`,placement:`sheet-on-mobile`,children:[i(an,{children:i(Nt,{children:l})}),i(Gt,{children:v===`from`&&i(Za,{title:h(`customize.override.fromDevice`),hostId:t,valueKind:d??(u===void 0?null:`number`),onCancel:E,onConfirm:e=>{D(e.source,O()),E()}})})]})}),v===`formula`&&i(Ba,{open:!0,title:h(`compositionEditor.formulaFor`,{path:l}),fieldPath:s,fieldLabel:l,sourceNames:T,initial:S?.kind===`expression`?S:{kind:`expression`,expr:`v`,bindings:{}},selfNative:{source:n,cap:a,fieldPath:s},onClose:E,onSave:e=>{D(e,O()),E()}}),v===`convert`&&u!==void 0&&i(Va,{open:!0,from:u,initialTo:C?.kind===`convert-unit`?C.to:null,onClose:E,onSave:e=>{let t=Qe(a,s),r=Wa(b,n,a,s,Ha(u,e,n,a,s),[]),i=t===null?r:Wa(r,n,a,t,Ua(e),[]);f.save(i),E()}})]})}function Ja(e){return e.kind===`convert-unit`?`convert`:e.kind===`from`?`from`:`formula`}function Ya({cap:t,fieldPath:n,saving:r,convert:a,onFrom:o,onFormula:s,onConvert:c}){let{t:l}=K();return e(Xt,{children:[i(rn,{className:`h-7 px-2.5 text-xs rounded-md border border-border bg-surface text-foreground`,disabled:r,"data-testid":`override-add-${t}-${n}`,children:l(`customize.override.add`)}),e(Yt,{children:[i(Wt,{onClick:o,children:l(`customize.override.fromDevice`)}),i(Wt,{onClick:s,children:l(`customize.override.formula`)}),a&&i(Wt,{onClick:c,children:l(`customize.override.convertUnit`)})]})]})}function Xa({entry:t,names:n,language:r,unknownDevice:a}){let{t:o}=K();return t.kind===`companion`?i(`span`,{className:`text-xs text-foreground`,children:o(`customize.fieldsCard.now`)}):t.kind===`convert-unit`?e(`p`,{className:`flex flex-wrap items-center gap-1 text-xs text-foreground`,children:[i(`span`,{children:o(`customize.override.convertSummary`,{from:t.from,to:t.to})}),i(Kt,{children:o(`customize.override.convertUnit`)})]}):t.kind===`formula`?e(`p`,{className:`flex flex-wrap items-center gap-1 text-xs text-foreground`,children:[i(`span`,{className:`break-words`,children:pa(t.expr,t.bindings,n,r,a)}),i(Kt,{children:o(`compositionEditor.formula`)})]}):e(`div`,{className:`flex flex-col gap-0.5`,children:[t.sources.map(e=>{let t=B(e.source);return i(`span`,{className:`text-xs text-foreground`,children:o(`customize.fieldsCard.from`,{name:n.get(t)??a,field:J(e.cap,e.fieldPath,r)})},`${t}:${e.cap}:${e.fieldPath}`)}),t.aggregate!==null&&i(`span`,{className:`text-xs text-foreground-muted`,children:o(ua(t.aggregate))})]})}function Za({title:t,hostId:n,valueKind:r,onCancel:a,onConfirm:s}){let{t:c}=K(),[l,u]=o(null),[d,f]=o(null),p=At({deviceId:l?.id??0}),m=Jt({deviceId:l?.id??0}),h=p.status===`success`?p.data:{caps:[]};return e(`div`,{className:`flex flex-col gap-2`,children:[i(Di,{kind:`formula`,enabled:!0,hostId:n,destination:{cap:`override`,targetId:`field`,title:t,pickerTargetKind:r},device:l,field:d,onDeviceChange:u,onFieldChange:f}),e(`div`,{className:`flex flex-wrap gap-2`,children:[i(W,{variant:`ghost`,onClick:a,children:c(`customize.picker.cancel`)}),i(W,{disabled:l===null||d===null,onClick:()=>{if(l===null||d===null)return;let e=La(l,d.cap,d.path,h,m.status===`success`?m.data:null,r);e!==null&&s(e)},children:c(`customize.override.save`)})]})]})}function Qa(e,t){return Ne(e,t)}function $a({deviceId:t,selfName:n,card:r,handle:a,names:o}){let{t:s,i18n:c}=K(),l=Qi(),u=zi(a.state),d=c.language,f=hr(r.cap,d),p=new Set(Object.keys(r.entries)),m=Wi(r.cap,p),h=()=>{if(u===null)return;let e=Ji(u,r.cap);l(s(`customize.fieldsCard.removeWhat`,{cap:f}),e===null).then(t=>{t&&a.save(e)})},g=(e,s)=>i(qa,{deviceId:t,self:a.target,selfName:n,cap:r.cap,fieldPath:e,label:J(r.cap,e,d),unit:Qa(r.cap,e),handle:a,names:o,toFill:s},e);return e(`div`,{className:`flex flex-col gap-3 px-3 py-2 sm:px-4`,children:[m.map(e=>g(e,!0)),Object.keys(r.entries).filter(e=>!m.includes(e)).map(e=>g(e,!1)),i(`div`,{className:`flex flex-wrap gap-2`,children:i(W,{variant:`ghost`,size:`sm`,disabled:a.saving,onClick:h,children:s(`customize.fieldsCard.removeFeature`,{cap:f})})})]})}s();function eo({device:e,handle:t,skipCaps:r}){let{i18n:a}=K(),o=Lt(e,`compact`),s=zi(t.state),l=Ii(s!==null),u=n(()=>l.kind===`known`?new Map(l.value.map(e=>[B({addonId:e.addonId,stableId:e.stableId}),e.name])):new Map,[l]);if(s===null)return null;let{model:d}=le(s),f=d.cards.filter(e=>e.card.cardKind===`fields`&&!r.has(e.card.cap));return f.length===0?null:i(c,{children:f.map(n=>{if(n.card.cardKind!==`fields`)return null;let r=n.card,s=hr(r.cap,a.language);return i(Ni,{id:r.cap,icon:ht,title:s,testId:`fields-card-${r.cap}`,children:i($a,{deviceId:e.id,selfName:o,card:r,handle:t,names:u})},r.cap)})})}function to(){return Object.entries(R).flatMap(([e,t])=>t.targets.filter(e=>e.cardinality===`event`).map(t=>({cap:e,pulse:no(t),span:ro(t)})).filter(e=>e.pulse!==null||e.span!==null))}function no(e){return e.shape===`pulse`?e.timestampPath===void 0||e.counterPath===void 0||e.debounceMs===void 0||e.edges===void 0||e.defaultEdge===void 0||!e.edges.includes(e.defaultEdge)?null:{id:e.id,timestampPath:e.timestampPath,counterPath:e.counterPath,debounceMs:e.debounceMs,edges:e.edges,defaultEdge:e.defaultEdge,apply:`add`,deviceTypes:e.deviceTypes}:null}function ro(e){return e.shape!==`span`||e.timeoutMs===void 0||e.applyAuthority?.kind!==`camera-sensors`?null:{id:e.id,timeoutMs:e.timeoutMs,cooldownMs:e.cooldownMs??null,sourceModes:e.sourceModes??[`in-addition`],deviceTypes:e.deviceTypes}}function io(e,t){return e===`Native`||e.startsWith(`Native`)?`customize.assign.native`:e===`pending`?`customize.event.checking`:e===`unknown`||e===`unreadable`?`customize.event.badge.unavailable`:`customize.event.badge.${t}`}function ao(e){return new Set(e.filter(e=>{let t=e.nativeAddonId?.trim()??``;return t!==``&&t!==`composer`}).map(e=>e.capName))}function oo(e,t){return{cap:e,apply:t.apply,authority:t.applyAuthority?.kind??`composition-claim`,nativeItemsReadOnly:t.nativeItems===`read-only`}}function so(e){return e.kind===`known`?null:e}function co(e,t){return e.composable.kind===`known`?e.composable.value.has(t)?{kind:`present`,mode:`add`}:{kind:`absent`}:e.composable}function lo(e){if(e.deviceType!==Te.Camera)return{kind:`absent`};switch(e.cameraSensors){case`pending`:return{kind:`pending`};case`unknown`:return{kind:`unknown`,reason:G.t(`helpers.assignmentAvailability.sensorsUnchecked`)};case`absent`:return{kind:`absent`};case`present`:return{kind:`present`,mode:`add`}}}function uo(e,t){if(e.authority===`camera-sensors`)return lo(t);let n=so(t.nativeCaps);if(n!==null)return n;let r=t.nativeCaps.kind===`known`?t.nativeCaps.value:new Set;return e.nativeItemsReadOnly?co(t,e.cap):r.has(e.cap)?{kind:`absent`}:co(t,e.cap)}s();var fo=new Map;function po({handle:t,cap:n,fieldPath:r,itemKey:a,label:s,testId:l,sourceNames:u=fo}){let{t:d,i18n:f}=K(),p=J(n,r,f.language),[m,h]=o(!1),g=zi(t.state),_=Y(g,n),v=a===void 0?_?.fields[r]:_?.items?.[a]?.fields[r];if(v===void 0)return null;let y=async e=>{if(_===null)return;let n;if(a===void 0)n={..._,fields:{..._.fields,[r]:e}};else{let t=_.items?.[a];if(t===void 0)return;n={..._,items:{..._.items,[a]:{...t,fields:{...t.fields,[r]:e}}}}}await t.save(Gi(g,t.target,n))};return e(c,{children:[i(W,{variant:`ghost`,size:`sm`,"data-testid":l??`formula-entry-${n}-${r}`,onClick:()=>h(!0),children:s??d(`compositionEditor.formula`)}),i(Ba,{open:m,title:d(`compositionEditor.formulaFor`,{path:p}),fieldPath:r,fieldLabel:p,sourceNames:u,initial:v,onClose:()=>h(!1),onSave:e=>void y(e)})]})}function mo({name:t,detail:n,meta:r,value:a,shown:o,readout:s,problem:c,onRemove:l,removeLabel:u,busy:d=!1}){return e(`li`,{className:`${m} grid grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 sm:grid-cols-[minmax(0,2fr)_minmax(0,1fr)_minmax(0,1fr)_1.75rem]`,children:[e(`div`,{className:`min-w-0`,children:[i(`div`,{className:`text-xs text-foreground break-words`,children:t}),n!==null&&i(`div`,{className:`text-[11px] text-foreground-subtle break-words`,children:n}),c!==void 0&&i(`div`,{role:`alert`,className:`text-[11px] text-warning break-words`,children:c})]}),i(`div`,{className:`row-start-2 col-start-1 text-[11px] text-foreground-subtle empty:hidden sm:row-start-auto sm:col-start-auto sm:empty:block`,children:r}),i(`div`,{className:`row-start-3 col-start-1 empty:hidden sm:row-start-auto sm:col-start-auto sm:empty:block`,children:s===void 0?o===void 0?i(ca,{target:a}):o!==null&&i(la,{display:o}):s}),i(`div`,{className:`row-start-1 col-start-2 flex justify-end sm:row-start-auto sm:col-start-auto`,children:l!==void 0&&i(wt,{icon:x,variant:`ghost`,size:`sm`,"aria-label":u,disabled:d,onClick:l})})]})}function ho(e){return e.toLowerCase().normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48)}function go({preview:t}){let{t:n}=K();return e(`p`,{className:`text-[11px] text-foreground`,"data-testid":`scalar-preview`,children:[e(`span`,{className:`text-foreground-muted`,children:[n(`customize.scalar.preview`),` `]}),t.kind===`pending`&&i(`span`,{children:`…`}),t.kind===`value`&&i(`span`,{children:t.text}),t.kind===`dwell`&&i(`span`,{children:n(`customize.scalar.previewDwell`,{value:t.sourceText,level:t.active?n(`customize.scalar.thresholdActive`):n(`customize.scalar.thresholdClear`),countdown:n(t.active?`customize.scalar.runningIn`:`customize.scalar.stopsAfter`,{seconds:Math.round(t.countdownMs/1e3)})})}),t.kind===`failed`&&i(`span`,{title:tr(t.reason)?n(er(t.reason)):t.reason,className:`text-warning`,children:`?`})]})}function _o(e){return!e.ok||e.mode===`enum`?{kind:`identity`}:Fn(e.fit)}function vo(e,t){return Object.fromEntries(e.map(e=>[e,t.includes(e)?e:null]))}function yo(e){let t={draft:{kind:`keyedArray`,cap:e.cap,targetId:e.targetId,key:e.key,label:e.label.trim(),fieldPath:e.fieldPath,source:{addonId:e.source.addonId,stableId:e.source.stableId,cap:e.source.cap,fieldPath:e.source.fieldPath},transform:e.transform},sourceValueKind:e.source.valueKind,sourceUnit:null,literals:e.literals},n=E({cap:e.cap,targetId:e.targetId,device:e.device,apply:e.apply,items:[t]});return n.ok?n.value:null}function bo(e,t,n){return(Dn(e,t).find(e=>e.path===n)?.literals??[]).map(e=>e.path)}function xo(e,t,n,r){return Dn(e,t).find(e=>e.path===n)?.literals?.find(e=>e.path===r)?.values??[]}function So(e,t,n){return Nn(e,t,n)}s();var Co={level:`customize.keyed.field.level`,"remaining.value":`customize.keyed.field.remaining`,status:`customize.keyed.field.status`};function wo(t){let{t:n}=K(),r=t.mode===`change`?n(`customize.keyed.changeTitle`):n(`customize.keyed.addTitle`);return i(sn,{open:t.open,onOpenChange:e=>e?void 0:t.onClose(),children:e(on,{width:`xl`,placement:`sheet-on-mobile`,scroll:`body`,"aria-label":r,children:[i(an,{children:i(Nt,{children:r})}),t.open&&i(To,{...t,heading:r})]})})}function To(t){let{t:r,i18n:a}=K(),s=On(t.cap,t.targetId),l=Dn(t.cap,t.targetId),[u,d]=o(t.seed?.label??``),[f,p]=o(t.seed?.key??``),[m,h]=o(t.mode===`change`),[g,_]=o(t.seed?.fieldPath??l[0]?.path??``),[v,y]=o(()=>Object.fromEntries(s.map(e=>[e.path,t.seed?.literals.find(t=>t.path===e.path)?.value??e.defaultValue]))),[b,x]=o(t.seed?.literals.find(e=>e.path===`remaining.kind`)?.value??xo(t.cap,t.targetId,`remaining.value`,`remaining.kind`)[0]??``),S=xt({projection:`slim`}),C=n(()=>S.status===`success`?_n(S.data):[],[S.status,S.data]),w=No(t.seed,C),[T,E]=o(null),[D,O]=o(!1);!D&&w!==null&&(E(w),O(!0));let k=At({deviceId:T?.id??0}),A=Jt({deviceId:T?.id??0}),j=kn(k.status===`success`?k.data:{caps:[]},A.status===`success`?A.data:null),[M,N]=o(t.seed===null?null:`${t.seed.source.cap}.${t.seed.source.fieldPath}`),[P,F]=o(t.seed?.transform??{kind:`identity`}),[I,L]=o(()=>t.seed?.transform.kind===`enum-map`?t.seed.transform.mapping:{}),R=j.find(e=>`${e.cap}.${e.path}`===M)??null,z=R===null?null:Mn(t.cap,t.targetId,g,R),ee=m?f:ho(u),te=Do(t.cap,t.targetId,g,v,b),ne=Oo(T,R,z,I,P),re=ne===null?null:yo({cap:t.cap,targetId:t.targetId,device:t.target,apply:t.apply,key:ee,label:u,fieldPath:g,source:ne,transform:ne.transform,literals:te}),ie=ko(re,ee,g,R,A.status===`success`?A.data:null),ae=e=>{if(e===null){N(null);return}let n=j.find(t=>t.cap===e.cap&&t.path===e.path);n!==void 0&&se(n,Mn(t.cap,t.targetId,g,n))},oe=e=>{d(e),m||p(ho(e))};return e(c,{children:[e(Gt,{className:`flex flex-col gap-3 p-2 sm:p-4`,children:[e(`label`,{className:`flex flex-col gap-1 text-xs text-foreground`,children:[r(`customize.keyed.name`),i(H,{value:u,onChange:e=>oe(e.target.value)})]}),e(`label`,{className:`flex flex-col gap-1 text-xs text-foreground`,children:[r(`customize.keyed.key`),i(H,{value:ee,disabled:t.mode===`change`,onChange:e=>{h(!0),p(e.target.value)}})]}),e(`label`,{className:`flex flex-col gap-1 text-xs text-foreground`,children:[r(`customize.keyed.assignField`),i(V,{value:g,options:l.map(e=>({value:e.path,label:r(Co[e.path]??e.path)})),onChange:e=>{_(e.target.value),E(null),N(null),F({kind:`identity`})}})]}),s.map(t=>e(`label`,{className:`flex flex-col gap-1 text-xs text-foreground`,children:[r(`customize.keyed.trait.${t.path}`),i(V,{value:v[t.path]??t.defaultValue,options:t.values.map(e=>({value:e,label:r(`customize.keyed.value.${e}`)})),onChange:e=>y(n=>({...n,[t.path]:e.target.value}))})]},t.path)),bo(t.cap,t.targetId,g).map(n=>e(`label`,{className:`flex flex-col gap-1 text-xs text-foreground`,children:[r(`customize.keyed.unit`),i(V,{value:b,options:xo(t.cap,t.targetId,g,n).map(e=>({value:e,label:r(`customize.keyed.value.${e}`)})),onChange:e=>x(e.target.value)})]},n)),i(Di,{kind:`keyed`,enabled:t.open,hostId:t.host.id,fieldPath:g,destination:{cap:t.cap,targetId:t.targetId,fieldPath:g,title:r(Co[g]??g)},device:T,field:Mo(M),transform:P,onDeviceChange:e=>{E(e),N(null),F({kind:`identity`})},onFieldChange:ae,onTransformChange:F}),z?.ok===!0&&z.mode===`enum`&&R!==null&&i(Eo,{values:R.enumValues,outputs:So(t.cap,t.targetId,g),mapping:I,onChange:L}),ie!==null&&i(go,{preview:ie})]}),e(bt,{className:`flex flex-wrap gap-2`,children:[i(W,{variant:`ghost`,onClick:t.onClose,children:r(`customize.scalar.cancel`)}),i(W,{"data-testid":`keyed-save-item`,disabled:!t.canSave||re===null||ee===``,onClick:()=>{re!==null&&t.onSave(re,ee)},children:r(`customize.keyed.save`)})]})]});function se(e,n){if(n.ok){if(N(`${e.cap}.${e.path}`),n.mode===`enum`){let n=vo(e.enumValues,So(t.cap,t.targetId,g));L(n),F({kind:`enum-map`,mapping:{...n}});return}F(_o(n))}}}function Eo(t){let{t:n}=K();return i(`div`,{className:`flex flex-col gap-1`,children:t.values.map(r=>e(`label`,{className:`flex flex-wrap items-center gap-2 text-xs text-foreground`,children:[r,i(V,{value:t.mapping[r]??``,options:[{value:``,label:n(`customize.keyed.unmapped`)},...t.outputs.map(e=>({value:e,label:n(`customize.keyed.value.${e}`)}))],onChange:e=>t.onChange({...t.mapping,[r]:e.target.value===``?null:e.target.value})})]},r))})}function Do(e,t,n,r,i){let a=Object.entries(r).map(([e,t])=>({path:e,value:t})),o=bo(e,t,n).flatMap(e=>i===``?[]:[{path:e,value:i}]);return[...a,...o]}function Oo(e,t,n,r,i){return e===null||t===null||n===null||!n.ok?null:n.mode===`enum`?Object.keys(r).length===0?null:{addonId:e.addonId,stableId:e.stableId,cap:t.cap,fieldPath:t.path,valueKind:`enum`,transform:{kind:`enum-map`,mapping:{...r}}}:{addonId:e.addonId,stableId:e.stableId,cap:t.cap,fieldPath:t.path,valueKind:`number`,transform:i}}function ko(e,t,n,r,i){if(e===null||r===null)return null;let a=e.items?.[t]?.fields[n];if(a===void 0)return{kind:`failed`,reason:`compile`};if(i===null)return{kind:`pending`};let o=q(i[r.cap],r.path);if(a.kind===`from`)return Ao(o);if(a.kind!==`expression`)return{kind:`failed`,reason:`compile`};let s=jo(o);if(s===void 0)return{kind:`failed`,reason:`no-value`};let c=ye(a.expr,{x:s},Date.now());return c.ok?Ao(c.value):{kind:`failed`,reason:c.error}}function Ao(e){return typeof e==`number`&&Number.isFinite(e)?{kind:`value`,text:String(e)}:typeof e==`string`&&e.length>0?{kind:`value`,text:e}:{kind:`failed`,reason:`empty`}}function jo(e){if(typeof e==`number`||typeof e==`string`||typeof e==`boolean`)return e;if(e===null)return null}function Mo(e){if(e===null)return null;let t=e.indexOf(`.`);return t<=0?null:{cap:e.slice(0,t),path:e.slice(t+1)}}function No(e,t){return e===null?null:t.find(t=>t.addonId===e.source.addonId&&t.stableId===e.source.stableId)??null}var Po=`consumables`,Fo=`items`,Io=Ke.shape.items;function Lo(e){let t=e.split(`.`).pop()??e,n=t.replace(/Level$/,``);return n===``?t:n}function Ro(e){let t=e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)}function zo(e,t){return e.caps.filter(e=>t.has(e.cap)&&e.cap!==`consumables`).flatMap(e=>e.fields.filter(e=>e.item!==!0&&cn(e)).map(t=>({kind:`field`,key:Lo(t.path),cap:e.cap,path:t.path})))}function Bo(e){switch(e.kind){case`pending`:return{kind:`pending`};case`unknown`:return{kind:`unknown`,reason:e.reason};case`absent`:return{kind:`known`,value:[]};case`value`:{if(e.value===null)return{kind:`known`,value:[]};let t=Io.safeParse(e.value);return t.success?{kind:`known`,value:t.data.map(e=>({kind:`item`,key:e.key,item:e}))}:{kind:`unknown`,reason:t.error.message}}}}function Vo(e,t,n){if(e.kind!==`known`)return e;if(t.kind!==`known`)return t;let r=zo(t.value,e.value);if(!e.value.has(`consumables`)||n===null)return{kind:`known`,value:r};let i=Bo(n);return i.kind===`known`?{kind:`known`,value:[...r,...i.value]}:i}function Ho(e){return e.defaults.map(t=>t.kind===`field`?i(Uo,{deviceId:e.deviceId,entry:t},`field:${t.cap}.${t.path}`):i(Go,{entry:t},`item:${t.key}`))}function Uo(e){let{t}=K(),n=oa({deviceId:e.deviceId,cap:e.entry.cap,path:e.entry.path});return i(mo,{name:t(`customize.consumables.fields.${e.entry.key}`,{defaultValue:Ro(e.entry.key)}),detail:t(`customize.consumables.builtIn`),meta:t(`customize.assign.native`),value:null,readout:i(Wo,{value:n}),removeLabel:``})}function Wo(e){switch(e.value.kind){case`pending`:return i(la,{display:{text:`…`,tone:`muted`}});case`unknown`:return i(la,{display:{text:`?`,title:e.value.reason,tone:`warning`}});case`absent`:return i(Ot,{level:null,size:`sm`});case`value`:return i(Ot,{level:yt(e.value.value),size:`sm`})}}function Go(e){let{t}=K(),{item:n}=e.entry,r=n.level===null?n.status===`replace`?t(`uiLibrary.consumablesPanel.replace`):void 0:`${Math.round(n.level)} %`;return i(mo,{name:n.label,detail:t(`customize.consumables.builtIn`),meta:t(`customize.assign.native`),value:null,readout:i(Ot,{level:Mt(n),label:r,size:`sm`}),removeLabel:``})}s();var Ko={consumables:_};function qo(){return Object.entries(R).flatMap(([e,t])=>t.targets.filter(e=>e.cardinality===`keyedArray`).map(t=>({cap:e,target:t})))}function Jo(t){let{t:n,i18n:r}=K(),a=Qi(),[s,l]=o(null),[u,d]=o(null),f=zi(t.handle.state),p=Y(f,t.cap),m=Zo(t.handle,p),h=m.kind===`known`&&m.value!==null?Ue(m.value,t.cap,t.target.id):null,g=Ii(h!==null),_=Qo(h,g),v=ae({cap:t.cap,targetId:t.target.id,device:t.handle.target,stored:m,sourcePresence:_,sourceUnknownReason:g.kind===`unknown`?g.reason:null});if(!Xo(t,p))return null;let y=t.handle.state.kind===`none`||t.handle.state.kind===`present`,b=t.availability.kind===`present`&&y,x=n(`customize.keyed.title.${t.cap}`),S=ts(n,v.text,v.assignedCount),C=async e=>{let n=await t.handle.save(e);d(n.kind===`refused`?n.reason:null)},w=async e=>{if(f===null||p===null)return;let r=se(p,e.key),i=r===null?Ji(f,t.cap):Gi(f,t.handle.target,r);await a(n(`customize.consumables.removeWhat`,{name:e.label}),i===null)&&await C(i)},T=s!==null&&s!==`add`?es(h,s):null;return e(c,{children:[i(Ni,{id:t.cap,icon:Ko[t.cap],title:x,testId:`keyed-card-${t.cap}`,actions:i(Kt,{children:S}),children:e(`div`,{className:`flex flex-col gap-2 px-3 py-2 sm:px-4`,children:[t.defaults.kind===`known`&&i(Ho,{deviceId:t.device.id,defaults:t.defaults.value}),t.defaults.kind===`unknown`&&i(U,{title:n(`customize.consumables.builtIn`),message:n(`customize.consumables.builtInUnreadable`,{reason:t.defaults.reason})}),h?.items.map(e=>i(Yo,{deviceId:t.device.id,cap:t.cap,item:e,language:r.language,sourceName:$o(e,g),saving:t.handle.saving,onChange:()=>l(e.key),onRemove:()=>void w(e),handle:t.handle},e.key)),u!==null&&i(`p`,{role:`alert`,className:`text-xs text-danger break-words`,children:u}),b&&i(W,{variant:`outline`,size:`sm`,"data-testid":`keyed-add-${t.cap}`,disabled:t.handle.saving,onClick:()=>l(`add`),children:n(`customize.keyed.add`)})]})}),i(wo,{open:s!==null,mode:s===`add`?`add`:`change`,cap:t.cap,targetId:t.target.id,host:t.device,target:t.handle.target,apply:`add`,seed:T,canSave:y&&!t.handle.saving,onClose:()=>l(null),onSave:(e,r)=>{if(s===`add`&&p?.items!==void 0&&p.items[r]!==void 0){d(n(`customize.keyed.duplicateKey`,{key:r}));return}let i=He(p,e,r);l(null),i!==null&&(d(null),C(Gi(f,t.handle.target,i)))}})]})}function Yo(t){let{t:n}=K(),r=t.item.compile,a=t.item.recognized&&r!==null,o=r===null?``:J(r.draft.source.cap,r.draft.source.fieldPath,t.language),s=a?[t.sourceName??``,o].filter(e=>e.length>0).join(` · `):n(`customize.consumables.otherFormula`),c=r===null?null:Me(De,t.item.key,r.draft.fieldPath);return e(`div`,{className:`flex flex-col gap-1`,"data-testid":`keyed-row-${t.item.key}`,children:[i(mo,{name:t.item.label,detail:s,meta:a?n(`customize.keyed.assigned`):null,value:c===null?null:{deviceId:t.deviceId,cap:t.cap,path:c},readout:c===null?null:i(ca,{target:{deviceId:t.deviceId,cap:t.cap,path:c}}),removeLabel:``}),e(`div`,{className:`flex flex-wrap gap-2`,children:[a&&i(W,{variant:`outline`,size:`sm`,disabled:t.saving,onClick:t.onChange,children:n(`customize.keyed.change`)}),a&&i(W,{variant:`ghost`,size:`sm`,disabled:t.saving,onClick:t.onRemove,children:n(`customize.keyed.remove`)}),!a&&i(po,{handle:t.handle,cap:t.cap,itemKey:t.item.key,fieldPath:`status`})]})]})}function Xo(e,t){return e.target.deviceTypes.includes(e.device.type)?e.availability.kind!==`absent`||e.defaults.kind!==`known`||e.defaults.value.length>0?!0:t!==null:!1}function Zo(e,t){return e.state.kind===`pending`?{kind:`pending`}:e.state.kind===`unknown`||e.state.kind===`not-loaded`?{kind:`unknown`,reason:e.state.reason}:{kind:`known`,value:t}}function Qo(e,t){let n=(e?.items??[]).filter(e=>e.recognized&&e.compile!==null);return n.length===0?`present`:t.kind===`pending`?`pending`:t.kind===`unknown`?`unknown`:n.every(e=>{let n=e.compile?.draft.source;if(n===void 0)return!1;let r=B(n);return t.value.some(e=>B({addonId:e.addonId,stableId:e.stableId})===r)})?`present`:`absent`}function $o(e,t){let n=e.compile?.draft.source;if(n===void 0||t.kind!==`known`)return null;let r=B(n);return t.value.find(e=>B({addonId:e.addonId,stableId:e.stableId})===r)?.name??null}function es(e,t){let n=e?.items.find(e=>e.key===t),r=n?.compile;return n===void 0||r==null?null:{key:n.key,label:n.label,fieldPath:r.draft.fieldPath,literals:r.literals,source:{addonId:r.draft.source.addonId,stableId:r.draft.source.stableId,cap:r.draft.source.cap,fieldPath:r.draft.source.fieldPath,valueKind:r.sourceValueKind},transform:r.draft.transform}}function ts(e,t,n){return t===`Native`?e(`customize.keyed.badge.native`):t===`pending`?e(`customize.keyed.badge.pending`):t===`unknown`?e(`customize.keyed.badge.unknown`):t.endsWith(`assigned`)?e(`customize.keyed.badge.assigned`,{count:n}):t}function ns(e){return i(c,{children:qo().map(t=>t.target.deviceTypes.includes(e.device.type)?i(Jo,{device:e.device,handle:e.handle,availability:uo(oo(t.cap,t.target),e.facts),cap:t.cap,target:t.target,defaults:e.defaults},t.cap):null)})}function rs(e){let t=zn(e);if(t===null)return{kind:`failed`,reason:Xn};if(e.transform.kind===`threshold`)return is(e.transform,e);let n=ir(e.cap,e.targetId),r=n===null?void 0:t.fields[n];if(r===void 0)return{kind:`failed`,reason:Xn};if(r.kind===`from`)return os(e.sourceValue);if(r.kind!==`expression`)return{kind:`failed`,reason:Xn};if(r.expr.startsWith(`dwell(`))return{kind:`failed`,reason:Zn};let i=as(e.sourceValue);if(i===void 0)return{kind:`failed`,reason:Qn};let a=ye(r.expr,{x:i},e.nowMs);return a.ok?os(a.value):{kind:`failed`,reason:a.error}}function is(e,t){if(typeof t.sourceValue!=`number`||!Number.isFinite(t.sourceValue))return{kind:`failed`,reason:Qn};let n=e.comparison===`gte`?t.sourceValue>=e.threshold:t.sourceValue<=e.threshold,r=t.source.sourceUnit;return{kind:`dwell`,sourceText:r===null?String(t.sourceValue):`${t.sourceValue} ${r}`,active:n,countdownMs:n?e.startDwellMs:e.stopDwellMs}}function as(e){if(typeof e==`number`||typeof e==`string`||typeof e==`boolean`)return e;if(e===null)return null}function os(e){return e==null||typeof e==`number`&&!Number.isFinite(e)?{kind:`failed`,reason:$n}:typeof e==`number`||typeof e==`string`||typeof e==`boolean`?{kind:`value`,text:String(e)}:{kind:`failed`,reason:$n}}s();function ss(t){let{t:n}=K(),r=t.mode===`change`?n(`customize.scalar.changeTitle`,{title:t.title}):n(`customize.scalar.addTitle`,{title:t.title});return i(sn,{open:t.open,onOpenChange:e=>e?void 0:t.onClose(),children:e(on,{width:`xl`,placement:`sheet-on-mobile`,scroll:`body`,"aria-label":r,children:[i(an,{children:i(Nt,{children:r})}),t.open&&i(cs,{...t,heading:r})]})})}function cs(t){let{t:r}=K(),a=xt({projection:`slim`}),s=n(()=>a.status===`success`?_n(a.data):[],[a.status,a.data]),l=ds(t.seed,s),[u,d]=o(null),[f,p]=o(!1);!f&&l!==null&&(d(l),p(!0));let m=At({deviceId:u?.id??0}),h=Jt({deviceId:u?.id??0}),g=m.status===`success`?m.data:{caps:[]},_=ar(g,h.status===`success`?h.data:null),[v,y]=o(fs(t.seed)),[b,x]=o(t.seed?.transform??{kind:`identity`}),S=v===null?null:(()=>{let[e,t]=v.split(`.`);return e===void 0||t===void 0?null:{cap:e,path:t}})(),C=_.find(e=>ls(e)===v)??null,w=C===null?null:lr(t.cap,t.targetId,C),T=C===null||w===null||!w.ok?null:us(u,C,w,g),E=T===null?null:zn({cap:t.cap,targetId:t.targetId,device:t.target,apply:t.apply,source:T,transform:b}),D=C===null||h.status!==`success`||u===null?void 0:q(h.data[C.cap],C.path),O=T===null?null:h.status===`pending`?{kind:`pending`}:rs({cap:t.cap,targetId:t.targetId,device:t.target,apply:t.apply,source:T,transform:b,sourceValue:D,nowMs:Date.now()});return e(c,{children:[e(Gt,{className:`flex flex-col gap-3 p-2 sm:p-4`,children:[i(Di,{kind:`scalar`,enabled:t.open,hostId:t.host.id,destination:{cap:t.cap,targetId:t.targetId,title:t.title},device:u,field:S,transform:b,onDeviceChange:e=>{d(e),y(null),x({kind:`identity`})},onFieldChange:e=>{if(e===null){y(null);return}y(`${e.cap}.${e.path}`)},onTransformChange:x}),O!==null&&i(go,{preview:O})]}),e(bt,{className:`flex flex-wrap gap-2`,children:[i(W,{variant:`ghost`,onClick:t.onClose,children:r(`customize.scalar.cancel`)}),i(W,{"data-testid":`scalar-save-override`,disabled:!t.canSave||E===null,onClick:()=>{E!==null&&t.onSave(E)},children:r(`customize.scalar.save`)})]})]})}function ls(e){return`${e.cap}.${e.path}`}function us(e,t,n,r){if(e===null||t.kind!==`boolean`&&t.kind!==`number`&&t.kind!==`string`)return null;let i=r.caps.find(e=>e.cap===t.cap),a=t.kind===`boolean`&&i?.fields.some(e=>e.path===`lastChangedAt`)?`lastChangedAt`:null;return{addonId:e.addonId,stableId:e.stableId,cap:t.cap,fieldPath:t.path,valueKind:t.kind,sourceUnit:n.sourceUnit,changedAtField:a}}function ds(e,t){return e===null?null:t.find(t=>t.addonId===e.source.addonId&&t.stableId===e.source.stableId)??null}function fs(e){return e===null?null:`${e.source.cap}.${e.source.fieldPath}`}var ps=`Assigned · `;function ms(e,t){if(e===`Native`)return{kind:`native`};if(e===`Native · source missing`)return{kind:`released`};if(e===`pending`)return{kind:`pending`};if(e===`unknown`)return{kind:`unknown`};if(e.startsWith(ps)){let n=e.slice(11);return{kind:`assigned`,source:t??n}}return{kind:`unknown`}}s();var hs={id:0,name:``,type:`unknown`,stableId:``,parentDeviceId:null},gs={battery:d,"running-state":v,"power-meter":S};function _s(){return Object.entries(R).flatMap(([e,t])=>t.targets.filter(e=>e.cardinality===`scalar`).map(t=>({cap:e,target:t})))}function vs({device:t,handle:n,availability:r,cap:a,target:s}){let{t:l,i18n:u}=K(),d=Qi(),[f,p]=o(!1),[m,h]=o(null),g=ee(a)>1,_=s.path??s.id,v=l(`customize.scalar.caps.${a}`),y=g?`${v} · ${J(a,_,u.language)}`:v,b=g?`${a}.${s.id}`:a,x=zi(n.state),S=bs(n,oe(Y(x,a),a,s.id)),C=S.kind===`known`&&S.value!==null?ce({feature:S.value,device:n.target,cap:a,targetId:s.id}):null,w=C!==null,E=Ii(w),D=C===null||E.kind!==`known`?null:E.value.find(e=>B({addonId:e.addonId,stableId:e.stableId})===B(C.draft.source))??null,O=Lt(D===null?hs:Lr(D),`compact`),k=D===null?null:O,A=Lt(t,`full`),j=xs(w,E.kind,D!==null),M=T({cap:a,targetId:s.id,device:n.target,stored:S,sourcePresence:j,sourceUnknownReason:E.kind===`unknown`?E.reason:null}),N=ms(M.text,k),P=n.state.kind===`none`||n.state.kind===`present`,F=r.kind===`present`?r.mode:null;if(r.kind===`absent`||!s.deviceTypes.includes(t.type))return null;let I=async e=>{let t=await n.save(e);h(t.kind===`refused`?t.reason:null)},L=async()=>{if(x===null)return;let e=qi(x,a,s.id);await d(l(`customize.scalar.removeWhat`,{name:k??(C===null?A:B(C.draft.source))}),e===null)&&await I(e)},R=C===null?null:{source:{addonId:C.draft.source.addonId,stableId:C.draft.source.stableId,cap:C.draft.source.cap,fieldPath:C.draft.source.fieldPath,valueKind:C.sourceValueKind,sourceUnit:C.sourceUnit,changedAtField:C.changedAtField},transform:C.draft.transform},z=N.kind===`assigned`?l(`customize.scalar.badge.assigned`,{source:N.source}):l(`customize.scalar.badge.${N.kind}`);return e(c,{children:[i(Ni,{id:b,icon:gs[a],title:y,testId:`scalar-card-${b}`,actions:i(Kt,{children:z}),children:i(ys,{availability:r,answered:P,deviceId:t.id,cap:a,cardKey:b,path:_,recognized:w,stored:S,presence:j,released:M.status.state===`released`,sourceName:k,sourceCap:C?.draft.source.cap??``,sourceField:C===null?``:J(C.draft.source.cap,C.draft.source.fieldPath,u.language),sourcePath:C?.draft.source.fieldPath??``,sourceDeviceId:D?.id??null,error:m,saving:n.saving,mode:F,onOpen:()=>p(!0),onRemove:()=>void L(),handle:n})}),F!==null&&i(ss,{open:f,mode:R===null?`add`:`change`,title:y,cap:a,targetId:s.id,host:t,target:n.target,apply:F,seed:R,canSave:P&&!n.saving,onClose:()=>p(!1),onSave:e=>{p(!1),I(Ki(x,n.target,e,a,s.id))}})]})}function ys(t){let{t:n}=K();if(t.availability.kind===`pending`||t.availability.kind===`present`&&!t.answered)return i(`p`,{role:`status`,className:`px-3 py-2 text-xs text-foreground-subtle sm:px-4`,children:n(`customize.scalar.checking`)});if(t.availability.kind===`unknown`)return i(`div`,{className:`px-3 py-2 sm:px-4`,children:i(U,{title:n(`customize.scalar.unreadable`),message:t.availability.reason})});let r=t.stored.kind===`known`&&t.stored.value===null,a=!t.recognized&&t.stored.kind===`known`&&t.stored.value!==null;return e(`div`,{className:`flex flex-col gap-2 px-3 py-2 sm:px-4`,children:[e(`div`,{className:`flex flex-wrap items-baseline justify-between gap-2`,children:[i(`span`,{className:`text-xs text-foreground`,children:n(`customize.scalar.effective`)}),i(ca,{target:{deviceId:t.deviceId,cap:t.cap,path:t.path}})]}),t.released&&i(`p`,{className:`text-xs text-foreground`,children:n(`customize.scalar.released`)}),t.presence===`unknown`&&t.recognized&&i(U,{title:n(`customize.scalar.sourceUnreadable`),message:n(`customize.scalar.sourceHeld`,{name:t.sourceName??t.sourceCap})}),t.recognized&&!t.released&&e(`div`,{className:`flex flex-wrap items-baseline justify-between gap-2`,children:[i(`span`,{className:`text-xs text-foreground`,children:n(`customize.scalar.override`,{name:t.sourceName??`…`,field:t.sourceField})}),t.sourceDeviceId!==null&&i(ca,{target:{deviceId:t.sourceDeviceId,cap:t.sourceCap,path:t.sourcePath}})]}),a&&e(`p`,{className:`text-xs text-foreground flex flex-wrap items-center gap-1`,children:[n(`customize.scalar.otherFormula`),i(po,{handle:t.handle,cap:t.cap,fieldPath:t.path})]}),r&&i(`p`,{className:`text-xs text-foreground-subtle`,children:n(`customize.scalar.noOverride`)}),t.error!==null&&i(`p`,{role:`alert`,className:`text-xs text-danger break-words`,children:t.error}),e(`div`,{className:`flex flex-wrap gap-2`,children:[t.recognized&&i(W,{variant:`outline`,size:`sm`,"data-testid":`scalar-change-${t.cardKey}`,onClick:t.onOpen,disabled:t.saving,children:t.released?n(`customize.scalar.chooseAnother`):n(`customize.scalar.change`)}),t.recognized&&i(W,{variant:`ghost`,size:`sm`,onClick:t.onRemove,disabled:t.saving,children:n(`customize.scalar.remove`)}),r&&i(W,{variant:`outline`,size:`sm`,"data-testid":`scalar-add-${t.cardKey}`,disabled:t.saving||t.mode===null,onClick:t.onOpen,children:n(`customize.scalar.add`)})]})]})}function bs(e,t){return e.state.kind===`pending`?{kind:`pending`}:e.state.kind===`unknown`||e.state.kind===`not-loaded`?{kind:`unknown`,reason:e.state.reason}:{kind:`known`,value:t}}function xs(e,t,n){return e?t===`pending`?`pending`:t===`unknown`?`unknown`:n?`present`:`absent`:`present`}function Ss({device:e,handle:t,facts:n}){return i(c,{children:_s().map(r=>r.target.deviceTypes.includes(e.type)?i(vs,{device:e,handle:t,availability:uo(oo(r.cap,r.target),n),cap:r.cap,target:r.target},`${r.cap}.${r.target.id}`):null)})}var Cs=ue(Je);function ws(e){return Je.find(t=>t.name===e)??null}function Ts(e,t){let n=t.commands??{},r=P(e),i=e=>{let t=n[e];return t!==void 0&&t.kind===`forward`?t:null},a=r.map(e=>({id:e,kind:`method`,method:e,itemKey:null,command:i(e),orphan:!1})),o=Object.entries(t.items??{}).map(([e,t])=>({id:`items.${e}.reset`,kind:`reset`,method:`reset`,itemKey:e,command:t.reset??null,orphan:!1})),s=Object.keys(n).filter(e=>!r.includes(e)).map(e=>({id:e,kind:`method`,method:e,itemKey:null,command:i(e),orphan:!0}));return[...a,...o,...s]}function Es(e,t,n){if(t.kind===`reset`&&t.itemKey!==null){let r=e.items?.[t.itemKey];if(r===void 0||e.items===void 0)return e;let{reset:i,...a}=r,o=n===null?a:{...a,reset:n};return{...e,items:{...e.items,[t.itemKey]:o}}}let r=e.commands??{};if(n!==null)return{...e,commands:{...r,[t.method]:n}};let i=Object.fromEntries(Object.entries(r).filter(([e])=>e!==t.method));if(Object.keys(i).length>0)return{...e,commands:i};let{commands:a,...o}=e;return o}function Ds(e,t,n){return{at:e.kind===`reset`?`features[${t}].items.${e.itemKey}.reset`:`features[${t}].commands.${e.method}`,method:e.method,...e.itemKey===null?{}:{itemKey:e.itemKey},command:n}}function Os(e,t,n,r,i){let a=r.orphan&&r.kind===`method`?Se(e,t,`features[${n}]`).filter(e=>e.path===`features[${n}].commands.${r.method}`):[];return i===null?a:[...a,...re(e,Ds(r,n,i),Cs)]}function ks(e,t){return Ts(e,t).filter(e=>e.kind===`method`&&!e.orphan&&e.command===null).map(e=>e.method)}function As(e){return Object.entries(e.methods).filter(([,e])=>e.kind===`mutation`&&e.systemOnly!==!0).map(([e])=>e)}function js(e){let t=new Set(e);return Je.filter(e=>t.has(e.name)&&As(e).length>0)}function Ms(e){let t=D(e);return t instanceof ct?`boolean`:t instanceof at?`number`:t instanceof ot||t instanceof ut?`string`:`structured`}function Ns(e,t){let n=e.methods[t]?.input;if(n===void 0)return[];let r=D(n);return r instanceof lt?Object.entries(r.shape).filter(([e])=>e!==_e).flatMap(([e,t])=>t instanceof st?[{name:e,required:!t.safeParse(void 0).success,type:Ms(t)}]:[]):[]}function Ps(e){return typeof e==`object`?Ye(e)?{kind:`input`,field:e.$input}:{kind:`structured`,value:e}:{kind:`constant`,value:e}}function Fs(e){return e.kind===`input`?{$input:e.field}:e.value}function Is(e,t,n){let r=Object.fromEntries(Object.entries(e).filter(([e])=>e!==t));return n===void 0?r:{...r,[t]:n}}function Ls(e,t){return t.includes(e.name)?{kind:`input`,field:e.name}:e.type===`boolean`?{kind:`constant`,value:!0}:e.type===`number`?{kind:`constant`,value:0}:e.type===`string`?{kind:`constant`,value:``}:{kind:`structured`,value:{}}}function Rs(e){try{let t=JSON.parse(e),n=fe.safeParse(t);return n.success?n.data:null}catch{return null}}var zs={source:null,cap:``,method:``,args:void 0};function Bs(e){return e===null?zs:{source:e.source,cap:e.cap,method:e.method,args:e.args}}function Vs(e){return e.source===null||e.cap===``||e.method===``?null:{kind:`forward`,source:e.source,cap:e.cap,method:e.method,...e.args===void 0?{}:{args:e.args}}}function Hs(e,t){let n=B(t);return e.find(e=>B({addonId:e.addonId,stableId:e.stableId})===n)??null}function Us(e,t=new Set){return e.filter(e=>e.type!==Te.Container&&!t.has(B({addonId:e.addonId,stableId:e.stableId}))).map(e=>({deviceId:e.id,ref:{addonId:e.addonId,stableId:e.stableId},name:e.name,detail:hn(e.integration,e.location),meta:e.type,caps:[],value:null})).toSorted((e,t)=>e.name.localeCompare(t.name))}function Ws(e,t,n){if(t===null)return null;let r=Hs(e,t);if(r===null)return null;let i=new Map(e.map(e=>[e.id,e])),a=r.parentDeviceId===null||r.parentDeviceId===void 0?void 0:i.get(r.parentDeviceId),o=e=>{if(e.type===Te.Container)return!1;if(a!==void 0)return e.parentDeviceId===a.id;let t=r.location??``;return t!==``&&e.location===t},s=a?.name??r.location??``,c=new Set(e.filter(e=>o(e)&&(n||e.id!==r.id)).map(e=>e.id));return c.size===0||s===``?null:{location:s,ids:c,containers:new Map([...c].flatMap(e=>{let t=i.get(e)?.parentDeviceId,n=t==null?void 0:i.get(t);return n!==void 0&&n.type===Te.Container?[[e,n.name]]:[]}))}}function Gs(e,t){if(e.kind!==`known`||typeof t!=`string`||t.length===0)return null;let n=Zt(e.value,t),r=new Map(e.value.map(e=>[e.id,e])),i=new Map;for(let e of n){let t=r.get(e)?.parentDeviceId,n=t==null?void 0:r.get(t);n!==void 0&&n.type===`container`&&i.set(e,n.name)}return{location:t,ids:n,containers:i}}function Ks(e,t,n){return $t(e,t?.ids??new Set,n)}function qs(e,t){return e?.containers.get(t)??null}function Js(e,t,n){return e.kind===`known`?Ks(e.value,t,n).suggested.length:0}s();function Ys(e){return e.kind===`pending`?`pending`:e.kind===`unknown`?`failed`:`answered`}function Xs(e){return e.map(e=>({id:e.deviceId,name:e.name,...e.meta===null?{}:{type:e.meta},...e.detail===null?{}:{location:e.detail.includes(` · `)?e.detail.split(` · `).at(-1)??null:e.detail},...e.detail===null?{}:{detail:e.detail}}))}function Zs({open:t,title:r,selection:s,candidates:c,filters:l,room:u=null,confirmLabel:d,onConfirm:f,onClose:p}){let{t:m}=K(),[h,g]=o(null),[_,v]=o([]),y=l?.find(e=>e.id===h)??l?.[0]??null,b=c.kind===`known`?c.value:[],x=c.kind===`known`?mn(c.value,``,y):[],S=Ks(b,u,e=>e.deviceId).suggested,C=Ks(x,u,e=>e.deviceId).others,w=n(()=>Xs(C),[C]),T=Ys(c),E=b.filter(e=>_.includes(e.deviceId));a(()=>{t||(v([]),g(null))},[t]);let D=()=>{v([]),g(null),p()},O=e=>{e.length!==0&&(f(e),v([]),g(null))},k=()=>O(E);return i(sn,{open:t,onOpenChange:e=>e?void 0:D(),children:e(on,{width:`lg`,placement:`sheet-on-mobile`,scroll:`body`,"aria-label":r,children:[i(an,{children:i(Nt,{children:r})}),e(Gt,{className:`flex flex-col gap-2 p-2 sm:p-4`,children:[l!==void 0&&l.length>0&&i(`div`,{className:`flex flex-wrap gap-1`,role:`tablist`,"aria-label":m(`customize.assign.filtersLabel`),children:l.map(e=>i(`button`,{type:`button`,role:`tab`,"aria-selected":(y?.id??null)===e.id,className:`inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium transition-colors ${(y?.id??null)===e.id?`border-primary/50 bg-primary/15 text-primary`:`border-border bg-surface text-foreground-subtle hover:bg-surface-hover`}`,onClick:()=>g(e.id),children:m(e.labelKey)},e.id))}),u!==null&&i(Sn,{location:u.location,devices:S.map(e=>({id:e.deviceId,name:e.name,container:qs(u,e.deviceId),detail:e.detail})),action:`add`,onPick:e=>O(S.filter(t=>t.deviceId===e)),...s===`multi`?{onPickAll:()=>O(S)}:{}}),c.kind===`unknown`?i(`p`,{role:`alert`,className:`text-xs text-warning`,children:m(`customize.assign.unknown`,{reason:c.reason})}):w.length===0&&S.length>0?null:i(Ft,{devices:w,listState:T,value:_,onChange:e=>v(s===`single`?e.length>0?[e[e.length-1]]:[]:e),noun:`device`,emptyLabel:m(`customize.assign.none`),showAll:!0,testId:`customize-device-picker`})]}),e(bt,{children:[i(W,{variant:`ghost`,onClick:D,children:m(`customize.picker.cancel`)}),i(W,{disabled:E.length===0,onClick:k,children:d(E.length)})]})]})})}s();function Qs({builtFields:t,sourceFields:n,args:r,onChange:a,testId:o}){let{t:s}=K();if(n.length===0)return null;let c=r!==void 0,l=()=>Object.fromEntries(n.filter(e=>e.required).map(e=>[e.name,Fs(Ls(e,t))]));return e(`div`,{className:`flex flex-col gap-2`,"data-testid":o,children:[i(Vt,{checked:!c,onCheckedChange:e=>a(e?void 0:l()),label:s(`commands.args.passThrough`),className:`text-[11px] text-foreground`}),c&&i(`ul`,{className:`flex flex-col gap-2`,"aria-label":s(`commands.args.template`),children:n.map(e=>i($s,{field:e,builtFields:t,arg:r[e.name],onChange:t=>a(Is(r,e.name,t))},e.name))})]})}function $s({field:t,builtFields:n,arg:r,onChange:a}){let{t:o}=K(),s=r===void 0?null:Ps(r),c=s===null?`unset`:s.kind,l=[...t.required?[]:[`unset`],...n.length>0?[`input`]:[],...t.type===`structured`?[]:[`constant`],`structured`],u=e=>{if(e===`unset`)return a(void 0);let r=l.find(t=>t===e);if(r===void 0||r===`unset`)return;let i=Ls(t,n);if(r===i.kind)return a(Fs(i));if(r===`input`)return a({$input:n[0]??``});if(r===`constant`)return a(ec(t));a({})};return e(`li`,{className:`grid grid-cols-1 gap-1 sm:grid-cols-[8rem_10rem_1fr] sm:items-start`,children:[e(`span`,{className:`font-mono text-[11px] text-foreground-muted break-words`,children:[t.name,t.required?` *`:``]}),l.length>1?i(V,{"aria-label":o(`commands.args.kind`,{field:t.name}),value:c,onChange:e=>u(e.target.value),options:l.map(e=>({value:e,label:o(`commands.args.kinds.${e}`)}))}):i(`span`,{className:`text-[11px] text-foreground-muted`,children:o(`commands.args.kinds.${l[0]??`structured`}`)}),i(tc,{field:t,builtFields:n,choice:s,onChange:a})]})}function ec(e){return e.type===`boolean`?!0:e.type===`number`?0:``}function tc({field:e,builtFields:t,choice:n,onChange:r}){let{t:a}=K();return n===null?i(`span`,{className:`text-[11px] text-foreground-subtle`,children:a(`commands.args.omitted`)}):n.kind===`input`?i(V,{"aria-label":a(`commands.args.fromInput`,{field:e.name}),value:n.field,onChange:e=>r({$input:e.target.value}),options:t.map(e=>({value:e,label:e}))}):n.kind===`structured`?i(nc,{field:e,value:n.value,onChange:r}):e.type===`boolean`?i(V,{"aria-label":a(`commands.args.constant`,{field:e.name}),value:String(n.value===!0),onChange:e=>r(e.target.value===`true`),options:[{value:`true`,label:a(`commands.args.true`)},{value:`false`,label:a(`commands.args.false`)}]}):i(H,{"aria-label":a(`commands.args.constant`,{field:e.name}),type:e.type===`number`?`number`:`text`,value:String(n.value),onChange:t=>{if(e.type!==`number`)return r(t.target.value);let n=Number(t.target.value);t.target.value!==``&&!Number.isNaN(n)&&r(n)}})}function nc({field:t,value:n,onChange:r}){let{t:a}=K(),[s,c]=o(JSON.stringify(n)),l=Rs(s)===null;return e(`div`,{className:`flex flex-col gap-1`,children:[i(H,{"aria-label":a(`commands.args.structured`,{field:t.name}),value:s,className:`font-mono`,onChange:e=>{c(e.target.value);let t=Rs(e.target.value);t!==null&&r(t)}}),l&&i(`p`,{role:`alert`,className:`text-[11px] text-danger`,children:a(`commands.args.invalidStructured`)})]})}var rc=[`threshold`,`sum`,`difference`,`ratio`,`expression`,`derivative`],ic=[`threshold`,`difference`,`ratio`,`derivative`];function ac(){return ic}function oc(e){return rc.some(t=>t===e)}function sc(e){return e===`sum`||e===`difference`||e===`ratio`?{kind:`arithmetic`,op:e}:{kind:e}}var cc=[`temperature`,`humidity`,`pressure`,`illuminance`,`power`,`energy`,`battery`,`numeric`],lc=[`motion`,`contact`,`leak`,`smoke`,`occupancy`,`binary`],uc=pe,dc=[nt],fc=`was refused — `,pc=/^(.+?) \[([a-z0-9-]+)\]: (.+)$/;function mc(){return[{id:`readings`,templateIds:cc},{id:`binary`,templateIds:lc},{id:`actuators`,templateIds:uc},{id:`appliances`,templateIds:dc}]}var hc={appliance:null,thresholdWatts:0,startDwellMs:0,stopDwellMs:0};function gc(e){if(e===`appliance`){let t=Le.washer;return{kind:`group`,templateId:e,aggregate:`any`,active:null,appliance:`washer`,thresholdWatts:t.thresholdWatts,startDwellMs:t.startDwellMs,stopDwellMs:t.stopDwellMs,name:``,room:``,members:[]}}let t=L(e);return t===null?null:{kind:`group`,templateId:e,aggregate:t.defaultAggregate,active:t.family===`actuator`?`at-least-one`:null,...hc,name:``,room:``,members:[]}}function _c(e){return e.kind===`group`?gc(e.templateId):e.kind===`appliance`?gc(nt):e.kind===`statistic`?{kind:`statistic`,stat:`mean`,window:{kind:`rolling`,span:`24h`},name:``,room:``,source:null}:e.kind===`threshold`?{kind:`threshold`,high:0,low:0,onForMs:0,offForMs:0,name:``,room:``,source:null}:e.kind===`arithmetic`?{kind:`arithmetic`,op:e.op,name:``,room:``,inputs:[]}:e.kind===`expression`?{kind:`expression`,expr:``,output:`number`,name:``,room:``,inputs:[]}:e.kind===`derivative`?{kind:`derivative`,window:{kind:`rolling`,span:`1h`},per:`hour`,name:``,room:``,source:null}:{kind:`integral`,reset:`daily`,name:``,room:``,source:null}}function vc(e,t,n){if(e.kind===`appliance`)return{kind:`group`,templateId:nt,aggregate:`any`,active:null,appliance:e.appliance,thresholdWatts:e.thresholdWatts,startDwellMs:e.startDwellMs,stopDwellMs:e.stopDwellMs,name:t,room:n,members:[X(e.member)]};if(e.kind===`statistic`)return{kind:`statistic`,stat:e.stat,window:e.window,name:t,room:n,source:X(e.source)};if(e.kind===`integral`)return{kind:`integral`,reset:e.reset,name:t,room:n,source:X(e.source)};if(e.kind===`threshold`)return{kind:`threshold`,high:e.high,low:e.low,onForMs:e.onForMs,offForMs:e.offForMs,name:t,room:n,source:X(e.source)};if(e.kind===`arithmetic`)return{kind:`arithmetic`,op:e.op,name:t,room:n,inputs:e.inputs.map(X)};if(e.kind===`expression`)return{kind:`expression`,expr:e.expr,output:e.output,name:t,room:n,inputs:e.inputs.map(e=>({name:e.name,member:X(e.member)}))};if(e.kind===`derivative`)return{kind:`derivative`,window:tl(e.window),per:e.per,name:t,room:n,source:X(e.source)};let r=L(e.templateId);return r===null||!r.aggregates.includes(e.aggregate)||r.family===`actuator`&&e.active===void 0||r.family!==`actuator`&&e.active!==void 0?null:{kind:`group`,templateId:e.templateId,aggregate:e.aggregate,active:e.active??null,...hc,name:t,room:n,members:e.members.map(X)}}function yc(e){return e.helper!==void 0}function bc(e,t){if(e.templateId===`appliance`)return e;let n=L(e.templateId);return n===null||!n.aggregates.includes(t)?e:{...e,aggregate:t}}function xc(e,t){if(e.templateId===`appliance`)return e;let n=L(e.templateId);return n===null||n.family!==`actuator`?e:{...e,active:t,aggregate:O(t)}}function Sc(e,t){return{...e,name:t}}function Cc(e,t){return t===e.templateId?e:gc(t)??e}function wc(e,t){if(e.templateId!==`appliance`)return e;let n=Le[t];return{...e,appliance:t,thresholdWatts:n.thresholdWatts,startDwellMs:n.startDwellMs,stopDwellMs:n.stopDwellMs}}function Tc(e){if(e.kind===`statistic`||e.kind===`integral`)return Ee(e.kind);if(e.kind===`threshold`)return we(`threshold`);if(e.kind===`arithmetic`)return we(e.op);if(e.kind===`expression`)return we(`expression`);if(e.kind===`derivative`)return we(`derivative`);if(e.templateId===`appliance`)return rt();let t=L(e.templateId);return t===null?null:Oe(t)}function Ec(e){return e.kind===`statistic`?Yc(e):e.kind===`integral`?Xc(e):e.kind===`threshold`?Zc(e):e.kind===`arithmetic`?Qc(e):e.kind===`expression`?$c(e):e.kind===`derivative`?el(e):e.templateId===`appliance`?Dc(e):Oc(e)}function Dc(e){let t=e.members[0];return t===void 0||e.appliance===null?null:{kind:`appliance`,templateId:nt,appliance:e.appliance,thresholdWatts:e.thresholdWatts,startDwellMs:e.startDwellMs,stopDwellMs:e.stopDwellMs,member:X(t)}}function Oc(e){if(e.templateId===`appliance`)return null;let t=L(e.templateId)?.family===`actuator`&&e.active!==null;return{kind:`group`,templateId:e.templateId,aggregate:t&&e.active!==null?O(e.active):e.aggregate,...t&&e.active!==null?{active:e.active}:{},members:e.members.map(X)}}var kc={code:`member-constraint`,path:`helper.member`,message:`an appliance helper needs one power reading`},Ac={code:`member-constraint`,path:`helper.source`,message:`pick one reading that declares history`},jc={code:`member-constraint`,path:`helper.source`,message:`pick one reading`},Mc={code:`member-constraint`,path:`helper.inputs`,message:`pick the readings this helper combines`};function Nc(e){return e.kind===`group`?e.templateId===`appliance`?kc:Mc:e.kind===`threshold`?jc:e.kind===`arithmetic`||e.kind===`expression`?Mc:Ac}function Pc(e){let t=Ec(e);return t===null?{ok:!1,problems:[Nc(e)]}:z(t)}async function Fc(e,t){let n=Pc(e);if(!n.ok)return Lc(n.problems);try{return await t(n.composition,e.name.trim()),[]}catch(e){return Rc(e instanceof Error?e.message:String(e))}}function Ic(e){return e.kind===`statistic`||e.kind===`integral`||e.kind===`derivative`?e.source!==null:e.kind===`threshold`?e.source!==null&&e.low<=e.high:e.kind===`arithmetic`?e.op===`sum`?e.inputs.length>=2:e.inputs.length===2:e.kind===`expression`?e.inputs.length>=1&&e.expr.trim()!==``:e.templateId===`appliance`?e.members.length===1:e.members.length>=1&&e.members.length<=64}function Lc(e){return e.map(e=>({path:e.path,code:e.code,message:e.message}))}function Rc(e){let t=e.indexOf(fc),n=(t===-1?e:e.slice(t+14)).split(/; (?=[^;]*\[[a-z0-9-]+\]:)/).flatMap(ll);return n.length>0?n:[{path:``,code:`refused`,message:e}]}function zc(e,t){if(e.kind===`pending`)return{kind:`pending`};if(e.kind===`error`)return{kind:`unavailable`,message:e.message};let n=e.caps[t.outputCap];if(n===void 0)return{kind:`empty`};let r=n[t.outputField];return typeof r==`number`&&Number.isFinite(r)?{kind:`number`,value:r,unit:t.baseUnit}:typeof r==`boolean`?{kind:`boolean`,value:r}:{kind:`empty`}}function Bc(e){if(e.kind===`pending`)return{kind:`pending`};if(e.kind===`error`)return{kind:`unavailable`,message:e.message};let t=e.caps[`group-status`];if(t===void 0)return{kind:`absent`};let n=cl(t.included),r=cl(t.excluded),i=cl(t.total);return n===null||r===null||i===null?{kind:`absent`}:{kind:`ready`,included:n,excluded:r,total:i}}function Vc(e,t){if(t.length===0||t.some(e=>e.kind===`pending`))return{kind:`pending`};if(t.some(e=>e.kind===`error`)||!Hc(e))return{kind:`unavailable`};let n=t.flatMap(e=>e.kind===`ready`?[e]:[]),r=Pe(e,n),i=e===`light`&&r.some(e=>e.cap===`color`)?be(n.map(e=>e.features)):w(e,n.map(e=>e.features));return{kind:`ready`,methods:r.map(e=>`${e.cap}.${e.method}`),modes:[...i]}}function Hc(e){return pe.some(t=>t===e)}function Uc(e){if(e.kind===`pending`)return{kind:`pending`};if(e.kind===`error`)return{kind:`unavailable`,message:e.message};let t=e.caps[`group-commands`];if(t===void 0)return{kind:`none`};let n=Ie.safeParse(t);return n.success?n.data.results.length===0?{kind:`none`}:{kind:`rows`,rows:n.data.results.map(e=>({deviceId:e.deviceId,cap:e.cap,method:e.method,ok:e.ok,error:e.error??null,at:e.at}))}:{kind:`unavailable`,message:`group-commands`}}function Wc(e,t,n,r,i=!1){if(e===`pending`)return`pending`;if(e===`error`)return`error`;let a=t?.[n];if(a===void 0)return`missing`;let o=a[r];return typeof o==`number`&&Number.isFinite(o)||typeof o==`boolean`||i&&typeof o==`string`&&o!==``?`value`:o===void 0?`missing`:`empty`}function Gc(e){return e.fleet===`answered`?e.deviceOnline===null||e.deviceOnline===!1?`excluded`:e.field===`pending`||e.field===`error`?`unknown`:e.field===`value`?`reporting`:`excluded`:`unknown`}function Kc(e){return e.some(e=>e.presence===`unknown`)?{kind:`pending`}:{kind:`named`,names:e.flatMap(e=>e.presence===`excluded`?[e.name]:[])}}function qc(e){if(!Jc(e))return{};let t={};for(let[n,r]of Object.entries(e))Jc(r)&&(t[n]=r);return t}function Jc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Yc(e){return e.source===null?null:{kind:`statistic`,stat:e.stat,window:sl(e.window),source:X(e.source)}}function Xc(e){if(e.source===null)return null;let t=e.source.cap===`power-meter`&&e.source.fieldPath===`power`;return{kind:`integral`,reset:e.reset,output:t?`energy`:`meter`,source:X(e.source)}}function Zc(e){return e.source===null?null:{kind:`threshold`,source:X(e.source),high:e.high,low:e.low,onForMs:e.onForMs,offForMs:e.offForMs}}function Qc(e){return e.inputs.length===0?null:{kind:`arithmetic`,op:e.op,inputs:e.inputs.map(X)}}function $c(e){return e.inputs.length===0?null:{kind:`expression`,expr:e.expr.trim(),output:e.output,inputs:e.inputs.map(e=>({name:e.name,member:X(e.member)}))}}function el(e){return e.source===null?null:{kind:`derivative`,window:tl(e.window),per:e.per,source:X(e.source)}}function tl(e){return e.customMinutes===void 0?{kind:`rolling`,span:e.span}:{kind:`rolling`,span:e.span,customMinutes:e.customMinutes}}var nl=`abcdefghijklmnopqrstuvwxyz`;function rl(e){return`${e.source.addonId}/${e.source.stableId}/${e.cap}.${e.fieldPath}`}function il(e){for(let t=0;t<64;t++)for(let n of nl){let r=t===0?n:`${n}${t}`;if(!e.has(r))return r}return`input${e.size+1}`}function al(e){return e.kind===`group`?e.members:e.kind===`arithmetic`?e.inputs:e.kind===`expression`?e.inputs.map(e=>e.member):e.source===null?[]:[e.source]}function ol(e,t){if(e.kind===`group`)return{...e,members:t};if(e.kind===`arithmetic`)return{...e,inputs:t};if(e.kind===`expression`){let n=new Map(e.inputs.map(e=>[rl(e.member),e.name])),r=new Set,i=[],a=new Set(n.values());for(let[e,o]of t.entries()){let t=n.get(rl(o)),s=nl[e]??``,c=t!==void 0&&!r.has(t)?t:s!==``&&!r.has(s)&&!a.has(s)?s:il(new Set([...r,...a]));r.add(c),i.push({name:c,member:o})}return{...e,inputs:i}}return{...e,source:t[0]??null}}function sl(e){return e.kind===`calendar`?{kind:`calendar`,period:e.period}:e.customMinutes===void 0?{kind:`rolling`,span:e.span}:{kind:`rolling`,span:e.span,customMinutes:e.customMinutes}}function X(e){return{source:{addonId:e.source.addonId,stableId:e.source.stableId},cap:e.cap,fieldPath:e.fieldPath}}function cl(e){return typeof e!=`number`||!Number.isInteger(e)||e<0?null:e}function ll(e){let t=pc.exec(e.trim());if(t===null)return[];let n=t[1],r=t[2],i=t[3];return n===void 0||r===void 0||i===void 0?[]:[{path:n,code:r,message:i}]}function ul({lines:t,testId:n=`helper-refusals`}){return t.length===0?null:i(`ul`,{role:`alert`,className:`flex flex-col gap-1`,"data-testid":n,children:t.map(t=>e(`li`,{className:`text-xs text-danger`,children:[i(`span`,{className:`font-medium`,children:t.code}),t.message===``?``:` — ${t.message}`]},`${t.path}:${t.code}:${t.message}`))})}s();function dl(e){return Lc(e)}function fl(t){let{t:n}=K(),{def:r,feature:a,featureIndex:s,row:c,itemLabel:l,names:u,saving:d,onApply:f}=t,[p,m]=o(!1),[h,g]=o(zs),[_,v]=o([]),y=e=>u.get(B(e.source))??e.source.stableId,b=dl(Os(r,a,s,c,c.command)),x=c.kind===`reset`?n(`commands.resetOf`,{item:l??c.itemKey}):c.method;return e(`li`,{className:`flex flex-col gap-2 border-b border-border-subtle pb-3 last:border-b-0 last:pb-0`,"data-testid":`command-row-${c.id}`,children:[e(`div`,{className:`flex flex-wrap items-start justify-between gap-2`,children:[e(`div`,{className:`min-w-0`,children:[i(`div`,{className:`font-mono text-xs text-foreground break-words`,children:x}),i(`div`,{className:`text-[11px] text-foreground-muted break-words`,children:c.command===null?n(`commands.none`):n(`commands.calls`,{device:y(c.command),call:`${c.command.cap}.${c.command.method}`})})]}),!p&&e(`div`,{className:`flex gap-1`,children:[i(W,{variant:`outline`,size:`sm`,disabled:d,onClick:()=>{g(Bs(c.command)),v([]),m(!0)},children:c.command===null?n(`commands.set`):n(`commands.change`)}),c.command!==null&&i(W,{variant:`ghost`,size:`sm`,disabled:d,onClick:()=>{f(c,null).then(e=>{e.kind===`refused`&&v(Rc(e.reason))})},children:n(`commands.remove`)})]})]}),i(ul,{lines:b,testId:`command-refusals-${c.id}`}),!p&&i(ul,{lines:_,testId:`command-server-${c.id}`}),p&&i(pl,{...t,draft:h,onDraft:g,serverLines:_,onClose:()=>m(!1),onServerLines:v})]})}function pl({def:t,feature:n,featureIndex:r,row:a,fleet:s,names:c,candidates:l,room:u,saving:d,onApply:f,draft:p,onDraft:m,serverLines:h,onClose:g,onServerLines:_}){let{t:v,i18n:y}=K(),[b,x]=o(!1),S=fn((p.source===null||s.kind!==`known`?null:Hs(s.value,p.source))?.id??0),C=js(S.data??[]),w=p.cap===``?C.length===1?C[0]?.name??``:``:p.cap,T=w===``?null:ws(w),E=T===null?[]:As(T),D=p.method===``?E.length===1?E[0]??``:``:p.method,O=Vs({...p,cap:w,method:D}),k=dl(Os(t,n,r,a,O)),A=T===null||D===``?[]:Ns(T,D),j=a.kind===`reset`?[]:Ns(t,a.method).map(e=>e.name),M=p.source===null?v(`commands.noDevice`):c.get(B(p.source))??p.source.stableId,N=e=>hr(e,y.language),P=()=>{O!==null&&f(a,O).then(e=>{e.kind===`refused`?_(Rc(e.reason)):g()})};return e(`div`,{className:`flex flex-col gap-3 rounded-md border border-border-subtle bg-background-elevated p-2 sm:p-3`,"data-testid":`command-editor-${a.id}`,children:[e(`div`,{className:`flex flex-wrap items-center gap-2`,children:[i(`span`,{className:`text-[11px] text-foreground-muted`,children:v(`commands.source`)}),i(W,{variant:`outline`,size:`sm`,onClick:()=>x(!0),children:p.source===null?v(`commands.chooseDevice`):M})]}),p.source!==null&&e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[i(ml,{label:v(`commands.cap`),children:S.isLoading?i(`span`,{role:`status`,className:`text-[11px] text-foreground-subtle`,children:v(`commands.loadingCaps`)}):C.length===0?i(`span`,{className:`text-[11px] text-warning`,children:v(`commands.noCaps`)}):C.length===1?i(`span`,{className:`text-xs text-foreground`,children:N(C[0]?.name??``)}):i(V,{"aria-label":v(`commands.cap`),value:w,onChange:e=>m({...p,cap:e.target.value,method:``,args:void 0}),options:[{value:``,label:v(`commands.pickCap`)},...C.map(e=>({value:e.name,label:N(e.name)}))]})}),T!==null&&i(ml,{label:v(`commands.method`),children:E.length===1?i(`span`,{className:`font-mono text-xs text-foreground`,children:E[0]}):i(V,{"aria-label":v(`commands.method`),value:D,onChange:e=>m({...p,cap:w,method:e.target.value,args:void 0}),options:[{value:``,label:v(`commands.pickMethod`)},...E.map(e=>({value:e,label:e}))]})})]}),D!==``&&i(Qs,{testId:`command-args-${a.id}`,builtFields:j,sourceFields:A,args:p.args,onChange:e=>m({...p,cap:w,method:D,args:e})}),i(ul,{lines:k,testId:`command-draft-refusals-${a.id}`}),i(ul,{lines:h,testId:`command-server-${a.id}`}),e(`div`,{className:`flex flex-wrap gap-2`,children:[i(W,{size:`sm`,disabled:O===null||k.length>0||d,onClick:P,children:v(`commands.apply`)}),i(W,{variant:`ghost`,size:`sm`,onClick:g,children:v(`commands.cancel`)})]}),i(Zs,{open:b,title:v(`commands.pickTitle`,{method:a.method}),selection:`single`,candidates:l,room:u,confirmLabel:()=>v(`commands.pickConfirm`),onConfirm:e=>{let t=e[0];x(!1),t!==void 0&&m({source:t.ref,cap:``,method:``,args:void 0})},onClose:()=>x(!1)}),i(`span`,{hidden:!0,children:c.size})]})}function ml({label:t,children:n}){return e(`label`,{className:`flex flex-col gap-1 text-[11px] text-foreground-muted`,children:[t,n]})}s();function hl(e){let t=Object.values(e.commands??{}).find(e=>e.kind===`forward`);if(t!==void 0)return t.source;let n=Be(e).flatMap(e=>Ae(e.source)).at(0);return n===void 0?null:n.source}function gl({composition:t,saving:r,save:a}){let{t:o,i18n:s}=K(),l=Ii(!0),u=n(()=>l.kind===`known`?new Map(l.value.map(e=>[B({addonId:e.addonId,stableId:e.stableId}),e.name])):new Map,[l]),d=n(()=>l.kind===`known`?{kind:`known`,value:Us(l.value)}:l,[l]),f=async(e,n,r)=>{let i=t.features[e];if(i===void 0||i.kind!==`fields`)return{kind:`refused`,reason:`the feature is gone`};let o=t.features.map((t,a)=>a===e?Es(i,n,r):t);return a({...t,features:o})};return i(c,{children:t.features.map((t,n)=>{if(t.kind!==`fields`)return null;let a=ws(t.cap);if(a===null)return null;let c=Ts(a,t);if(c.length===0)return null;let p=ks(a,t),m=l.kind===`known`?Ws(l.value,hl(t),!0):null,h=hr(t.cap,s.language);return i(Ni,{id:`commands-${t.cap}`,icon:gt,title:o(`commands.title`,{cap:h}),testId:`commands-card-${t.cap}`,children:e(`div`,{className:`flex flex-col gap-3 px-3 py-2 sm:px-4`,children:[i(`p`,{className:`text-xs text-foreground-muted`,children:o(`commands.hint`)}),p.length>0&&e(`p`,{role:`alert`,className:`text-xs text-danger`,"data-testid":`commands-has-commands`,children:[i(`span`,{className:`font-medium`,children:`has-commands`}),` — ${o(`commands.unserved`,{methods:p.join(`, `)})}`]}),i(`ul`,{className:`flex flex-col gap-3`,children:c.map(e=>i(fl,{def:a,feature:t,featureIndex:n,row:e,itemLabel:e.itemKey===null?null:t.items?.[e.itemKey]?.label??e.itemKey,fleet:l,names:u,candidates:d,room:m,saving:r,onApply:(e,t)=>f(n,e,t)},e.id))})]})},t.cap)})})}function Z(e,t){return e[t]}var Q=(e,t,n)=>({key:e,labelKey:`preset.petFountain.slot.${e}`,expectedCap:t,...n===void 0?{}:{optionalGroup:n}}),_l=[{id:`pet-fountain`,labelKey:`preset.petFountain.label`,descriptionKey:`preset.petFountain.description`,nameKey:`preset.petFountain.name`,slots:[Q(`waterLevel`,`enum-sensor`),Q(`waterVolume`,`enum-sensor`),Q(`pump`,`switch`),Q(`pumpInterval`,`switch`),Q(`pumpOnMinutes`,`control`),Q(`pumpOffMinutes`,`control`),Q(`lastDrink`,`enum-sensor`),Q(`currentHourDrink`,`enum-sensor`),Q(`last24hDrink`,`enum-sensor`),Q(`todayDrink`,`enum-sensor`),Q(`clearDaily`,`button`),Q(`filterDaysRemaining`,`enum-sensor`,`filter`),Q(`filterChanged`,`button`,`filter`)],build:e=>{let t=Z(e,`waterLevel`),n=Z(e,`waterVolume`),r=Z(e,`pump`),i=Z(e,`pumpInterval`),a=Z(e,`pumpOnMinutes`),o=Z(e,`pumpOffMinutes`),s=Z(e,`lastDrink`),c=Z(e,`currentHourDrink`),l=Z(e,`last24hDrink`),u=Z(e,`todayDrink`),d=Z(e,`clearDaily`),f=Z(e,`filterDaysRemaining`),p=Z(e,`filterChanged`);return t===void 0||n===void 0||r===void 0||i===void 0||a===void 0||o===void 0||s===void 0||c===void 0||l===void 0||u===void 0||d===void 0||f===void 0!=(p===void 0)?null:ie({waterLevel:t,waterVolume:n,pump:r,pumpInterval:i,pumpOnMinutes:a,pumpOffMinutes:o,lastDrink:s,currentHourDrink:c,last24hDrink:l,todayDrink:u,clearDaily:d,...f!==void 0&&p!==void 0?{filter:{daysRemaining:f,changed:p}}:{}})}}];function vl(e){return e===null?null:_l.find(t=>t.id===e)??null}function yl(e,t){let n=new Set(e.slots.filter(e=>e.optionalGroup!==void 0&&t[e.key]!==void 0).map(e=>e.optionalGroup));return e.slots.filter(e=>t[e.key]===void 0&&(e.optionalGroup===void 0||n.has(e.optionalGroup)))}function bl(e,t){for(let n of e.slots){let e=t[n.key];if(e!==void 0)return e}return null}var xl=`composition`;function Sl({onPick:e,onFreeComposition:t,onPreset:n}){let{t:r}=K();return i(`div`,{"data-testid":`helper-template-picker`,children:i(Pt,{emptyMessage:r(`helper.noTemplates`),onPick:r=>{if(r===xl){t?.();return}let i=_l.find(e=>e.id===r);if(i!==void 0){n?.(i.id);return}if(r===`statistic`||r===`integral`){e({kind:r});return}if(r===`appliance`){e({kind:`appliance`});return}if(oc(r)){e(sc(r));return}Al(r)&&e({kind:`group`,templateId:r})},groups:[...jl(r),...n===void 0||_l.length===0?[]:[{id:`presets`,label:r(`helper.section.presets`),tiles:_l.map(e=>Cl(e,r))}],{id:`calculation`,label:r(`helper.section.calculation`),tiles:[...ac().map(e=>Dl(e,r)),Tl(`statistic`,pt,r),Tl(`integral`,S,r)]},{id:`advanced`,label:r(`helper.section.advanced`),tiles:[...t===void 0?[]:[wl(r)],Dl(`expression`,r)]}]})})}function Cl(e,t){let n=t(e.labelKey);return{key:e.id,label:n,testId:`helper-template-preset-${e.id}`,icon:i(dt,{className:`h-5 w-5 text-foreground-muted`,"aria-hidden":!0}),detailLabel:t(`helper.detailsOf`,{name:n}),detail:i(`div`,{className:`max-w-xs text-xs`,children:i(`p`,{className:`text-foreground-muted`,children:t(e.descriptionKey)})})}}function wl(e){let t=e(`helper.template.composition`);return{key:xl,label:t,testId:`helper-template-composition`,icon:i(dt,{className:`h-5 w-5 text-foreground-muted`,"aria-hidden":!0}),detailLabel:e(`helper.detailsOf`,{name:t}),detail:i(`div`,{className:`max-w-xs text-xs`,children:i(`p`,{className:`text-foreground-muted`,children:e(`helper.detail.composition`)})})}}function Tl(e,t,n){let r=n(`helper.template.${e}`);return{key:e,label:r,testId:`helper-template-${e}`,icon:i(t,{className:`h-5 w-5 text-foreground-muted`,"aria-hidden":!0}),detailLabel:n(`helper.detailsOf`,{name:r}),detail:i(kl,{id:e})}}var El={threshold:p,sum:u,difference:b,ratio:ft,expression:mt,derivative:g};function Dl(e,t){let n=t(`helper.template.${e}`),r=El[e];return{key:e,label:n,testId:`helper-template-${e}`,icon:i(r,{className:`h-5 w-5 text-foreground-muted`,"aria-hidden":!0}),detailLabel:t(`helper.detailsOf`,{name:n}),detail:i(Ol,{id:e})}}function Ol({id:t}){let{t:n}=K();return e(`div`,{className:`max-w-xs space-y-1 text-xs`,children:[i(`p`,{className:`text-foreground-muted`,children:n(`helper.detail.${t}`)}),t===`derivative`&&i(`p`,{className:`text-foreground-subtle`,children:n(`helper.detail.history`)}),t===`expression`&&i(`p`,{className:`text-foreground-subtle`,children:n(`helper.detail.expressionStale`)})]})}function kl({id:t}){let{t:n}=K();return e(`div`,{className:`max-w-xs space-y-1 text-xs`,children:[i(`p`,{className:`text-foreground-muted`,children:n(`helper.detail.${t}`)}),i(`p`,{className:`text-foreground-subtle`,children:n(`helper.detail.history`)})]})}function Al(e){return tt.some(t=>t===e)}function jl(e){return mc().map(t=>({id:t.id,label:`${e(`helper.section.group`)} · ${e(`helper.group.${t.id}`)}`,tiles:Ml(t.templateIds,e)}))}function Ml(e,t){let n=[];for(let r of e){let e=Nl(r,t);e!==null&&n.push(e)}return n}function Nl(e,t){if(e===`appliance`)return Pl(t);if(!Al(e))return null;let n=L(e);if(n===null)return null;let r=t(`helper.template.${e}`),a=n.role===void 0?_t(n.deviceType).icon:Ht(n.role).icon;return{key:e,label:r,testId:`helper-template-${e}`,icon:i(a,{className:`h-5 w-5 text-foreground-muted`,"aria-hidden":!0}),detailLabel:t(`helper.detailsOf`,{name:r}),detail:i(Il,{templateId:e})}}function Pl(e){let t=e(`helper.template.appliance`),n=_t(Te.Washer).icon;return{key:nt,label:t,testId:`helper-template-appliance`,icon:i(n,{className:`h-5 w-5 text-foreground-muted`,"aria-hidden":!0}),detailLabel:e(`helper.detailsOf`,{name:t}),detail:i(Fl,{})}}function Fl(){let{t:e}=K();return i(`div`,{className:`max-w-xs text-xs`,children:i(`p`,{className:`text-foreground-muted`,children:e(`helper.template.applianceSummary`)})})}function Il({templateId:t}){let{t:n}=K(),r=L(t);if(r===null)return null;let a=r.family===`actuator`?$e.map(e=>n(`helper.active.${e}`)):r.aggregates.map(e=>n(`helper.aggregate.${e}`)),o=r.commandCaps.filter(e=>e!==`switch`);return e(`div`,{className:`max-w-xs space-y-1 text-xs`,children:[i(`p`,{className:`font-medium text-foreground`,children:n(`helper.supportedOperations`)}),i(`p`,{className:`text-foreground-muted`,children:a.join(`, `)}),o.length>0&&e(c,{children:[i(`p`,{className:`font-medium text-foreground`,children:n(`helper.sharedCaps`)}),i(`p`,{className:`text-foreground-muted`,children:o.map(e=>n(`helper.cap.${e}`)).join(`, `)})]}),r.id===`lock`&&i(`p`,{className:`text-foreground-subtle`,children:n(`helper.detail.lockConfirm`)}),i(`p`,{className:`text-foreground-subtle`,children:n(`helper.offlineCounted`)})]})}s();function Ll({initial:n,start:r,purpose:s,saving:l,onSave:u,onDraftChange:d,onFreeComposition:f,onPreset:p,fillHeight:m=!1}){let{t:h}=K(),[g,_]=o(n===null?`template`:r),[v,y]=o(n),[b,x]=o([]),[S,C]=o(null),w=t(!1),[T,E]=o(null),D=l||T!==null;a(()=>{d?.(v)},[v,d]);let O=e=>{y(t=>e.kind===`group`&&t?.kind===`group`&&t.templateId!==`appliance`?Cc(t,e.templateId):_c(e)),x([]),C(null),_(`parameters`)},k=e=>{if(v===null||w.current)return;w.current=!0,E(e);let t=v;(async()=>{let n;try{n=await u(t,e)}finally{w.current=!1,E(null)}if(n.kind===`refused`){x(n.lines);return}e===`again`&&(C({deviceId:n.deviceId,name:t.name.trim()}),y(null),_(`template`),x([]))})()},A=v===null?null:Tc(v),j=v!==null&&v.kind===`group`&&v.templateId!==`appliance`?L(v.templateId):null,M=v===null?[]:al(v);return e(`div`,{className:m?`flex min-h-0 flex-1 flex-col gap-3`:`flex flex-col gap-3`,"data-testid":`helper-wizard`,children:[S!==null&&i(`p`,{role:`status`,className:`text-xs text-foreground`,"data-testid":`helper-created`,children:i(dn,{i18nKey:`helper.created`,values:{name:S.name===``?h(`helper.newHelper`):S.name},components:{device:i(un,{to:ln(S.deviceId),className:`text-primary hover:underline`})}})}),i(`p`,{className:`text-[11px] text-foreground-muted`,children:h(nu(g,v))}),g===`template`&&i(Sl,{onPick:O,onFreeComposition:f,onPreset:p}),g===`parameters`&&v?.kind===`group`&&v.templateId===`appliance`&&i(zl,{draft:v,onDraft:e=>y(e)}),g===`parameters`&&v?.kind===`group`&&j!==null&&e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[j.family===`actuator`&&v.active!==null?e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[h(`helper.criterion`),i(V,{"aria-label":h(`helper.criterion`),"data-testid":`helper-criterion`,value:v.active,onChange:e=>{let t=$e.find(t=>t===e.target.value);t!==void 0&&y(xc(v,t))},options:$e.map(e=>({value:e,label:h(`helper.active.${e}`)}))})]}):e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[h(`helper.reducer`),i(V,{"aria-label":h(`helper.reducer`),"data-testid":`helper-reducer`,value:v.aggregate,onChange:e=>{let t=j.aggregates.find(t=>t===e.target.value);t!==void 0&&y(bc(v,t))},options:j.aggregates.map(e=>({value:e,label:h(`helper.aggregate.${e}`)}))})]}),e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[h(`helper.name`),i(H,{"aria-label":h(`helper.name`),"data-testid":`helper-name`,value:v.name,onChange:e=>y(Sc(v,e.target.value))})]})]}),g===`parameters`&&v?.kind===`statistic`&&i(Wl,{draft:v,onChange:y}),g===`parameters`&&v?.kind===`integral`&&i(Kl,{draft:v,onChange:y}),g===`parameters`&&v?.kind===`threshold`&&i(Jl,{draft:v,onChange:y}),g===`parameters`&&v?.kind===`derivative`&&i(Zl,{draft:v,onChange:y}),g===`parameters`&&v?.kind===`arithmetic`&&i(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,"data-testid":`helper-math-parameters`,children:i(eu,{name:v.name,onChange:e=>y({...v,name:e})})}),g===`parameters`&&v?.kind===`expression`&&i(Ql,{draft:v,onChange:y}),g===`members`&&v!==null&&A!==null&&i(Di,{kind:`members`,request:A,enabled:!0,fillHeight:m,members:M,onMembersChange:e=>y(ol(v,e)),onRefuse:e=>x(e===null?[]:[{path:`helper.members`,code:`member-constraint`,message:h(`helper.maxMembers`,{max:e.max})}])}),g===`members`&&v?.kind===`expression`&&i($l,{draft:v,onChange:y}),g===`members`&&(v?.kind===`arithmetic`||v?.kind===`threshold`)&&i(`p`,{className:`text-[11px] text-foreground-muted`,"data-testid":`helper-math-hint`,children:h(tu(v))}),i(ul,{lines:b}),e(`div`,{className:m?`mt-auto flex shrink-0 flex-wrap gap-2`:`flex flex-wrap gap-2`,children:[g===`members`&&i(W,{variant:`ghost`,onClick:()=>_(`parameters`),children:h(`helper.back`)}),g===`parameters`&&v!==null&&i(W,{"data-testid":`helper-to-members`,disabled:v.name.trim()===``,onClick:()=>{x([]),_(`members`)},children:h(`helper.next`)}),g===`members`&&v!==null&&s===`edit`&&i(W,{"data-testid":`helper-save`,disabled:!Ic(v)||D,onClick:()=>k(`open`),children:h(T===`open`?`helper.saving`:`helper.save`)}),g===`members`&&v!==null&&s===`create`&&e(c,{children:[i(W,{"data-testid":`helper-save-open`,disabled:!Ic(v)||D,onClick:()=>k(`open`),children:h(T===`open`?`helper.saving`:`helper.saveOpen`)}),i(W,{variant:`outline`,"data-testid":`helper-save-more`,disabled:!Ic(v)||D,onClick:()=>k(`again`),children:h(T===`again`?`helper.saving`:`helper.saveMore`)})]})]})]})}var Rl=6e4;function zl({draft:t,onDraft:n}){let{t:r}=K(),a=t.appliance??`washer`;return e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[r(`helper.applianceType`),i(V,{"aria-label":r(`helper.applianceType`),"data-testid":`helper-appliance`,value:a,onChange:e=>{let r=ke.find(t=>t===e.target.value);r!==void 0&&n(wc(t,r))},options:ke.map(e=>({value:e,label:r(`helper.appliance.${e}`)}))})]}),e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[r(`helper.name`),i(H,{"aria-label":r(`helper.name`),"data-testid":`helper-name`,value:t.name,onChange:e=>n({...t,name:e.target.value})})]}),i(Ul,{label:r(`helper.threshold`),testId:`helper-threshold`,value:String(t.thresholdWatts),onValue:e=>{let r=Hl(e);r!==null&&n({...t,thresholdWatts:r})}}),i(Ul,{label:r(`helper.startDwell`),testId:`helper-start-dwell`,value:Bl(t.startDwellMs),onValue:e=>{let r=Vl(e);r!==null&&n({...t,startDwellMs:r})}}),i(Ul,{label:r(`helper.stopDwell`),testId:`helper-stop-dwell`,value:Bl(t.stopDwellMs),onValue:e=>{let r=Vl(e);r!==null&&n({...t,stopDwellMs:r})}})]})}function Bl(e){return String(e/Rl)}function Vl(e){let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.round(t*Rl)}function Hl(e){let t=Number(e);return!Number.isFinite(t)||t<=0?null:t}function Ul({label:t,testId:n,value:r,onValue:a}){return e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[t,i(H,{type:`number`,min:0,step:`any`,"aria-label":t,"data-testid":n,value:r,onChange:e=>a(e.target.value)})]})}function Wl({draft:t,onChange:n}){let{t:r}=K(),a=t.window.kind===`rolling`;return e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,"data-testid":`helper-statistic-parameters`,children:[i($,{label:r(`helper.stat`),children:i(V,{"aria-label":r(`helper.stat`),"data-testid":`helper-stat`,value:t.stat,onChange:e=>{let r=ze.find(t=>t===e.target.value);r!==void 0&&n({...t,stat:r})},options:ze.map(e=>({value:e,label:r(`helper.statName.${e}`)}))})}),i($,{label:r(`helper.range`),children:i(V,{"aria-label":r(`helper.range`),"data-testid":`helper-range-kind`,value:t.window.kind,onChange:e=>{e.target.value===`calendar`&&n({...t,window:{kind:`calendar`,period:`today`}}),e.target.value===`rolling`&&n({...t,window:{kind:`rolling`,span:`24h`}})},options:[{value:`rolling`,label:r(`helper.rangeKind.rolling`)},{value:`calendar`,label:r(`helper.rangeKind.calendar`)}]})}),a?i($,{label:r(`helper.span`),children:i(V,{"aria-label":r(`helper.span`),"data-testid":`helper-span`,value:t.window.span,onChange:e=>{let r=Ge.find(t=>t===e.target.value);r!==void 0&&n({...t,window:Gl(r,t)})},options:Ge.map(e=>({value:e,label:r(`helper.spanName.${e}`)}))})}):i($,{label:r(`helper.period`),children:i(V,{"aria-label":r(`helper.period`),"data-testid":`helper-period`,value:t.window.period,onChange:e=>{let r=Fe.find(t=>t===e.target.value);r!==void 0&&n({...t,window:{kind:`calendar`,period:r}})},options:Fe.map(e=>({value:e,label:r(`helper.periodName.${e}`)}))})}),t.window.kind===`rolling`&&t.window.span===`custom`&&i($,{label:r(`helper.customMinutes`),children:i(H,{"aria-label":r(`helper.customMinutes`),"data-testid":`helper-custom-minutes`,inputMode:`numeric`,value:t.window.customMinutes===void 0?``:String(t.window.customMinutes),onChange:e=>{let r=Number.parseInt(e.target.value,10);n({...t,window:{kind:`rolling`,span:`custom`,...Number.isFinite(r)?{customMinutes:r}:{}}})}})}),i(eu,{name:t.name,onChange:e=>n({...t,name:e})})]})}function Gl(e,t){if(e!==`custom`)return{kind:`rolling`,span:e};let n=t.window.kind===`rolling`?t.window.customMinutes:void 0;return n===void 0?{kind:`rolling`,span:e}:{kind:`rolling`,span:e,customMinutes:n}}function Kl({draft:t,onChange:n}){let{t:r}=K();return e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,"data-testid":`helper-integral-parameters`,children:[i($,{label:r(`helper.reset`),children:i(V,{"aria-label":r(`helper.reset`),"data-testid":`helper-reset`,value:t.reset,onChange:e=>{let r=Xe.find(t=>t===e.target.value);r!==void 0&&n({...t,reset:r})},options:Xe.map(e=>({value:e,label:r(`helper.resetName.${e}`)}))})}),i(eu,{name:t.name,onChange:e=>n({...t,name:e})})]})}var ql=1e3;function Jl({draft:t,onChange:n}){let{t:r}=K(),a=t.low>t.high;return e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,"data-testid":`helper-threshold-parameters`,children:[i(Xl,{label:r(`helper.highEdge`),testId:`helper-high`,value:t.high,onValue:e=>n({...t,high:e})}),i(Xl,{label:r(`helper.lowEdge`),testId:`helper-low`,value:t.low,onValue:e=>n({...t,low:e})}),i(Ul,{label:r(`helper.onDelay`),testId:`helper-on-delay`,value:String(t.onForMs/ql),onValue:e=>{let r=Yl(e);r!==null&&n({...t,onForMs:r})}}),i(Ul,{label:r(`helper.offDelay`),testId:`helper-off-delay`,value:String(t.offForMs/ql),onValue:e=>{let r=Yl(e);r!==null&&n({...t,offForMs:r})}}),i(eu,{name:t.name,onChange:e=>n({...t,name:e})}),a&&i(`p`,{role:`alert`,className:`text-xs text-danger sm:col-span-2`,"data-testid":`helper-edges`,children:r(`helper.edgesReversed`)})]})}function Yl(e){let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.round(t*ql)}function Xl({label:t,testId:n,value:r,onValue:a}){return e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[t,i(H,{type:`number`,step:`any`,"aria-label":t,"data-testid":n,value:String(r),onChange:e=>{let t=Number(e.target.value);e.target.value!==``&&Number.isFinite(t)&&a(t)}})]})}function Zl({draft:t,onChange:n}){let{t:r}=K();return e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,"data-testid":`helper-derivative-parameters`,children:[i($,{label:r(`helper.span`),children:i(V,{"aria-label":r(`helper.span`),"data-testid":`helper-span`,value:t.window.span,onChange:e=>{let r=Ge.find(t=>t===e.target.value);r!==void 0&&n({...t,window:r===`custom`?{kind:`rolling`,span:r,customMinutes:t.window.customMinutes??60}:{kind:`rolling`,span:r}})},options:Ge.map(e=>({value:e,label:r(`helper.spanName.${e}`)}))})}),t.window.span===`custom`&&i($,{label:r(`helper.customMinutes`),children:i(H,{"aria-label":r(`helper.customMinutes`),"data-testid":`helper-custom-minutes`,inputMode:`numeric`,value:t.window.customMinutes===void 0?``:String(t.window.customMinutes),onChange:e=>{let r=Number.parseInt(e.target.value,10);n({...t,window:{kind:`rolling`,span:`custom`,...Number.isFinite(r)?{customMinutes:r}:{}}})}})}),i($,{label:r(`helper.per`),children:i(V,{"aria-label":r(`helper.per`),"data-testid":`helper-per`,value:t.per,onChange:e=>{let r=je.find(t=>t===e.target.value);r!==void 0&&n({...t,per:r})},options:je.map(e=>({value:e,label:r(`helper.perName.${e}`)}))})}),i(eu,{name:t.name,onChange:e=>n({...t,name:e})})]})}function Ql({draft:t,onChange:n}){let{t:r}=K();return e(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2`,"data-testid":`helper-expression-parameters`,children:[i($,{label:r(`helper.exprOutput`),children:i(V,{"aria-label":r(`helper.exprOutput`),"data-testid":`helper-expr-output`,value:t.output,onChange:e=>{let r=We.find(t=>t===e.target.value);r!==void 0&&n({...t,output:r})},options:We.map(e=>({value:e,label:r(`helper.exprOutputName.${e}`)}))})}),i(eu,{name:t.name,onChange:e=>n({...t,name:e})}),i(`p`,{className:`text-[11px] text-foreground-muted sm:col-span-2`,"data-testid":`helper-stale-note`,children:r(`helper.detail.expressionStale`)})]})}function $l({draft:t,onChange:n}){let{t:r}=K();return t.inputs.length===0?null:e(`div`,{className:`flex flex-col gap-2`,"data-testid":`helper-expression-editor`,children:[i(`ul`,{className:`flex flex-col gap-1`,children:t.inputs.map((a,o)=>e(`li`,{className:`flex items-center gap-2 text-[11px]`,children:[i(H,{className:`w-24 font-mono`,"aria-label":r(`helper.inputName`),"data-testid":`helper-input-name-${o}`,value:a.name,onChange:e=>n({...t,inputs:t.inputs.map((t,n)=>n===o?{...t,name:e.target.value}:t)})}),e(`span`,{className:`truncate text-foreground-muted`,children:[a.member.source.stableId,` · `,a.member.cap,`.`,a.member.fieldPath]})]},`${a.member.source.addonId}/${a.member.source.stableId}/${a.member.cap}.${a.member.fieldPath}`))}),i(ka,{label:r(`helper.expr`),value:t.expr,bindings:t.inputs.map(e=>e.name),onChange:e=>n({...t,expr:e})})]})}function eu({name:e,onChange:t}){let{t:n}=K();return i($,{label:n(`helper.name`),children:i(H,{"aria-label":n(`helper.name`),"data-testid":`helper-name`,value:e,onChange:e=>t(e.target.value)})})}function tu(e){return e.kind===`arithmetic`?`helper.hint.${e.op}`:`helper.hint.threshold`}function nu(e,t){if(t?.kind===`threshold`||t?.kind===`arithmetic`||t?.kind===`expression`||t?.kind===`derivative`){if(e===`parameters`)return`helper.step.math.${t.kind}.parameters`;if(e===`members`)return`helper.step.math.${t.kind}.members`}if(t?.kind===`statistic`||t?.kind===`integral`){if(e===`parameters`)return`helper.step.historyParameters`;if(e===`members`)return`helper.step.historySource`}if(t?.kind===`group`&&t.templateId===`appliance`){if(e===`parameters`)return`helper.step.appliance`;if(e===`members`)return`helper.step.applianceMembers`}return`helper.step.${e}`}function $({label:t,children:n}){return e(`label`,{className:`flex flex-col gap-1 text-[11px]`,children:[t,n]})}s();function ru({blockId:t,fillHeight:r=!1}){let{t:a}=K(),o=en({blockId:t}),s=nn(),c=vt(),l=n(()=>{let e=new Set;for(let{cap:t}of _s())e.add(t);for(let{cap:t}of qo())e.add(t);for(let{cap:t}of to())e.add(t);return e},[]);if(o.status===`pending`)return i(`p`,{role:`status`,children:a(`compositionEditor.loading`)});if(o.status===`error`)return i(U,{title:a(`compositionEditor.loadFailed`),message:o.error.message});if(o.data.state===`not-loaded`)return i(`p`,{role:`status`,children:a(`customize.status.notLoaded`,{reason:o.data.reason})});let u=o.data.view;if(u===null)return i(`p`,{children:a(`compositionEditor.notFound`,{blockId:t})});let d=Ve(u.block);if(d===null)return i(`p`,{children:a(`compositionEditor.notComposition`)});if(yc(d)){let e=vc(d.helper,u.block.name,``);if(e===null)return i(`p`,{role:`alert`,children:a(`helper.unreadable`)});let t=u.state.kind===`answered`?u.state.state?.deviceId??null:null;return i(Ll,{fillHeight:r,purpose:`edit`,initial:e,start:`parameters`,saving:s.isPending,onSave:async e=>{let n=await Fc(e,async(n,r)=>{await s.mutateAsync({blockId:u.block.id,expectedUpdatedAt:u.block.updatedAt,block:{composition:n,...r===``?{}:{name:r}}}),t!==null&&e.room.trim()!==``&&await c.mutateAsync({deviceId:t,location:e.room.trim()}),await o.refetch()});return n.length>0?{kind:`refused`,lines:n}:{kind:`saved`,deviceId:t??0}}})}let f=Ui(d),p={id:0,name:u.block.name,addonId:`composer`,stableId:`composed-${t}`,type:d.target.kind===`new`?d.target.type:Te.Sensor,location:``,disabled:!1,parentDeviceId:null,role:d.target.kind===`new`?d.target.role:null,online:!0,probed:!0,features:[],isCamera:!1,config:{},secretConfigPaths:[],metadata:{}},m={target:{addonId:`composer`,stableId:p.stableId},state:{kind:`present`,view:u,composition:d},saving:s.isPending,save:async e=>{if(e===null)return{kind:`refused`,reason:`cannot delete here`};try{return await s.mutateAsync({blockId:u.block.id,expectedUpdatedAt:u.block.updatedAt,block:{composition:e}}),await o.refetch(),{kind:`saved`}}catch(e){return{kind:`refused`,reason:e instanceof Error?e.message:String(e)}}}};return e(`div`,{className:`flex flex-col gap-2`,children:[i(Kt,{variant:f===`incomplete`?`warning`:`success`,children:a(`customize.blockStatus.${f===`incomplete`?`incomplete`:u.block.status}`)}),i(eo,{device:p,handle:m,skipCaps:l}),d.target.kind===`new`&&i(gl,{composition:d,saving:s.isPending,save:m.save})]})}export{Xr as $,Fo as A,Qi as B,Us as C,ns as D,_s as E,oo as F,Hi as G,Zi as H,io as I,Ri as J,Ui as K,to as L,po as M,uo as N,qo as O,ao as P,Di as Q,eo as R,Js as S,Ss as T,Gi as U,Y as V,Ji as W,Pi as X,Ii as Y,Ni as Z,Vc as _,vl as a,_n as at,Zs as b,vc as c,Bc as d,Lr as et,yc as f,Rc as g,zc as h,yl as i,q as it,Vo as j,Po as k,al as l,Kc as m,Ll as n,hr as nt,ul as o,Gc as p,zi as q,bl as r,J as rt,Uc as s,ru as t,Rr as tt,Wc as u,qc as v,Ws as w,Gs as x,Fc as y,oa as z};
@@ -1 +1 @@
1
- import{C as e,S as t}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{Ti as n}from"./client-D-g0nOrC.js";import{t as r}from"./boxes-BEverhi4.js";import{Wa as i,ei as a}from"./src-iRjUEwun.js";import{t as o}from"./useTranslation-BJr-n0es.js";import{_r as s,f as c,hr as l,m as u,mr as d,vr as f}from"./index-Dqmlzvdc.js";import{t as p}from"./CompositionBlockEditor-CpPHLcVD.js";import{t as m}from"./AdminPage-B9JLs4rT.js";var h=`rounded-lg border border-border bg-surface p-4`,g=`new`;function _(){let{blockId:_}=f(),{t:v}=o(),y=s(),b=_===void 0||_===g,x=i({blockId:_??``},{enabled:!b}),S=e=>t(m,{icon:r,title:v(`compositionEditor.pageTitle`),children:e});if(b)return t(l,{to:`${c}&new=helper`,replace:!0});if(x.status===`success`&&x.data.state===`loaded`&&x.data.view!==null){let e=x.data.view;if(n(e.block)?.target.kind===`existing`){let n=e.state.kind===`answered`?e.state.state?.deviceId??null:null;if(n!==null)return S(t(`section`,{className:h,children:t(d,{className:`text-primary text-sm`,to:u(n),children:v(`compositionEditor.openOnDevice`)})}))}}return S(e(`section`,{className:`${h} flex flex-col gap-2`,children:[t(a,{variant:`ghost`,size:`sm`,onClick:()=>y(c),children:v(`compositionEditor.cancel`)}),t(p,{blockId:_??``})]}))}export{_ as CompositionEditorPage};
1
+ import{C as e,S as t}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{ji as n}from"./client-DcvpIFoh.js";import{t as r}from"./boxes-CVkAEP7e.js";import{qa as i,ri as a}from"./src-XEHc18wE.js";import{t as o}from"./useTranslation-BJr-n0es.js";import{_r as s,f as c,hr as l,m as u,mr as d,vr as f}from"./index-o6kBNilE.js";import{t as p}from"./CompositionBlockEditor-CJhCzXua.js";import{t as m}from"./AdminPage-B1Q3Lunl.js";var h=`rounded-lg border border-border bg-surface p-4`,g=`new`;function _(){let{blockId:_}=f(),{t:v}=o(),y=s(),b=_===void 0||_===g,x=i({blockId:_??``},{enabled:!b}),S=e=>t(m,{icon:r,title:v(`compositionEditor.pageTitle`),children:e});if(b)return t(l,{to:`${c}&new=helper`,replace:!0});if(x.status===`success`&&x.data.state===`loaded`&&x.data.view!==null){let e=x.data.view;if(n(e.block)?.target.kind===`existing`){let n=e.state.kind===`answered`?e.state.state?.deviceId??null:null;if(n!==null)return S(t(`section`,{className:h,children:t(d,{className:`text-primary text-sm`,to:u(n),children:v(`compositionEditor.openOnDevice`)})}))}}return S(e(`section`,{className:`${h} flex flex-col gap-2`,children:[t(a,{variant:`ghost`,size:`sm`,onClick:()=>y(c),children:v(`compositionEditor.cancel`)}),t(p,{blockId:_??``})]}))}export{_ as CompositionEditorPage};