@nubisco/openbridge 0.31.1 → 0.32.1

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.
@@ -64,7 +64,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
64
64
  monaco.config({ paths: { vs: '...' } })
65
65
 
66
66
  For more please check the link https://github.com/suren-atoyan/monaco-loader#config
67
- `},M6=lN(dN)(Qm),fN={config:uN},_N=function(){for(var t=arguments.length,i=new Array(t),r=0;r<t;r++)i[r]=arguments[r];return function(s){return i.reduceRight(function(n,a){return a(n)},s)}};function eg(e,t){return Object.keys(t).forEach(function(i){t[i]instanceof Object&&e[i]&&Object.assign(t[i],eg(e[i],t[i]))}),C6(C6({},e),t)}var pN={type:"cancelation",msg:"operation is manually canceled"};function Xc(e){var t=!1,i=new Promise(function(r,s){e.then(function(n){return t?s(pN):r(n)}),e.catch(s)});return i.cancel=function(){return t=!0},i}var mN=["monaco"],gN=aN.create({config:oN,isInitialized:!1,resolve:null,reject:null,monaco:null}),tg=FT(gN,2),pl=tg[0],fc=tg[1];function vN(e){var t=fN.config(e),i=t.monaco,r=BT(t,mN);fc(function(s){return{config:eg(s.config,r),monaco:i}})}function bN(){var e=pl(function(t){var i=t.monaco,r=t.isInitialized,s=t.resolve;return{monaco:i,isInitialized:r,resolve:s}});if(!e.isInitialized){if(fc({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),Xc(Jc);if(window.monaco&&window.monaco.editor)return ig(window.monaco),e.resolve(window.monaco),Xc(Jc);_N(yN,SN)(CN)}return Xc(Jc)}function yN(e){return document.body.appendChild(e)}function wN(e){var t=document.createElement("script");return e&&(t.src=e),t}function SN(e){var t=pl(function(r){var s=r.config,n=r.reject;return{config:s,reject:n}}),i=wN("".concat(t.config.paths.vs,"/loader.js"));return i.onload=function(){return e()},i.onerror=t.reject,i}function CN(){var e=pl(function(i){var r=i.config,s=i.resolve,n=i.reject;return{config:r,resolve:s,reject:n}}),t=window.require;t.config(e.config),t(["vs/editor/editor.main"],function(i){var r=i.m||i;ig(r),e.resolve(r)},function(i){e.reject(i)})}function ig(e){pl().monaco||fc({monaco:e})}function AN(){return pl(function(e){var t=e.monaco;return t})}var Jc=new Promise(function(e,t){return fc({resolve:e,reject:t})}),rg={config:vN,init:bN,__getMonacoInstance:AN};const kN={key:0,class:"monaco-skeleton"},MN=Oe({__name:"MonacoJsonEditor",props:{modelValue:{},height:{}},emits:["update:modelValue"],setup(e,{emit:t}){const i=e,r=t,{resolved:s}=Yh(),n=ie(null),a=Vr(null),o=ie(!1);let l=!1;return _t(async()=>{const c=await rg.init();n.value&&(Fe(s,u=>c.editor.setTheme(u==="dark"?"vs-dark":"vs")),a.value=c.editor.create(n.value,{value:i.modelValue,language:"json",theme:s.value==="dark"?"vs-dark":"vs",fontSize:12,fontFamily:'"MesloLGS NF", monospace',minimap:{enabled:!1},scrollBeyondLastLine:!1,lineNumbers:"off",wordWrap:"on",automaticLayout:!0,tabSize:2,folding:!1,renderLineHighlight:"none",overviewRulerLanes:0,scrollbar:{verticalScrollbarSize:6}}),a.value.onDidChangeModelContent(()=>{l||r("update:modelValue",a.value.getValue())}),o.value=!0)}),Bi(()=>{var c;(c=a.value)==null||c.dispose()}),Fe(()=>i.modelValue,c=>{if(!a.value)return;a.value.getValue()!==c&&(l=!0,a.value.setValue(c),l=!1)}),(c,u)=>(y(),$("div",{style:mi({height:`${e.height??220}px`,width:"100%",position:"relative"})},[b("div",{ref_key:"containerEl",ref:n,style:{height:"100%",width:"100%"}},null,512),o.value?j("",!0):(y(),$("div",kN))],4))}}),L6=Zt(MN,[["__scopeId","data-v-0c34d464"]]),LN={class:"pcf-root"},EN={key:1,class:"pcf-no-schema"},xN=Oe({__name:"PluginConfigForm",props:{hbSchema:{},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:t}){const i=e,r=t;function s(h,d){const f=JSON.parse(JSON.stringify(i.modelValue));let _=f;for(let p=0;p<h.length-1;p++)(_[h[p]]===void 0||typeof _[h[p]]!="object")&&(_[h[p]]={}),_=_[h[p]];_[h[h.length-1]]=d,r("update:modelValue",f)}function n(h){let d=i.modelValue;for(const f of h){if(d==null||typeof d!="object")return;d=d[f]}return d}function a(h){return Array.isArray(h.type)?h.type[0]:h.type??"string"}function o(h,d){const f=n(h)??[],_=d.default??(a(d)==="string"?"":a(d)==="number"?0:"");s(h,[...f,_])}function l(h,d){const f=[...n(h)??[]];f.splice(d,1),s(h,f)}function c(h,d,f){const _=[...n(h)??[]];_[d]=f,s(h,_)}const u=Q(()=>i.hbSchema.schema??{type:"object",properties:{}});return(h,d)=>{const f=Io("PluginConfigField");return y(),$("div",LN,[u.value.properties?(y(!0),$(be,{key:0},Ve(u.value.properties,(_,p)=>{var A;return y(),fe(f,{key:p,"field-key":String(p),field:_,path:[String(p)],required:((A=u.value.required)==null?void 0:A.includes(String(p)))??!1,value:n([String(p)]),onChange:g=>s([String(p)],g),onAddArray:d[0]||(d[0]=(g,S)=>o(g,S)),onRemoveArray:d[1]||(d[1]=(g,S)=>l(g,S)),onUpdateArray:d[2]||(d[2]=(g,S,m)=>c(g,S,m))},null,8,["field-key","field","path","required","value","onChange"])}),128)):(y(),$("div",EN,"No configurable fields found in schema."))])}}}),$N=Zt(xN,[["__scopeId","data-v-d9cf6b0f"]]),TN={key:0,class:"inspector nb-inspector"},NN={class:"inspector-header"},HN={class:"inspector-title"},PN={class:"inspector-name"},ON={class:"inspector-version"},IN={class:"inspector-body"},RN={class:"field-value"},DN={class:"field-value"},VN={class:"hap-bridge-info"},BN={class:"hap-qr"},ZN=["src"],FN={class:"hap-details"},zN={class:"field-value mono"},UN={class:"field-value"},WN={class:"field-value"},jN={key:0,class:"setup-loading"},KN={key:0,class:"platform-tabs"},qN=["onClick"],GN={key:1,class:"visual-editor-wrap"},YN={key:0,class:"json-error"},XN={key:1,class:"json-error"},JN={key:3,class:"save-error"},QN={class:"setup-actions"},eH={key:0,class:"json-error"},tH={key:0,class:"save-error"},iH={class:"setup-actions"},rH={class:"import-export-row"},sH={class:"plugin-device-name"},nH={class:"plugin-device-type"},aH={class:"field-value"},oH={class:"field-value"},lH={class:"field-value"},cH={class:"field-value"},uH={class:"error-text"},hH={class:"plog-time"},dH={class:"plog-msg"},E6="openbridge.pluginInspector.sections",fH=Oe({__name:"PluginInspector",setup(e){const t=ys(),i=ie(!1),r=ie("");async function s(){if(!i.value){i.value=!0;try{await Pe.daemon.restart();let N=0;const L=setInterval(async()=>{N++;try{await Pe.health(),clearInterval(L),location.reload()}catch{}N>60&&(clearInterval(L),i.value=!1)},1e3)}catch{i.value=!1}}}const n=fl(),a=[{id:"visual",label:"Visual",icon:"sliders"},{id:"json",label:"JSON",icon:"brackets-curly"}],o={status:"default",hap:"default",update:"default",manage:"collapsed",config:"default",transfer:"collapsed",devices:"default",manifest:"collapsed",error:"default",logs:"default"},l=ie({...o});try{const N=JSON.parse(localStorage.getItem(E6)??"{}");l.value={...o,...N}}catch{}Fe(l,N=>localStorage.setItem(E6,JSON.stringify(N)),{deep:!0}),Fe(()=>{var N,L;return(L=(N=n.selectedPlugin)==null?void 0:N.hapBridge)==null?void 0:L.setupURI},async N=>{if(N)try{r.value=await oa.toDataURL(N,{width:160,margin:1})}catch{r.value=""}else r.value=""},{immediate:!0});const c=Q(()=>{const N=n.selectedPlugin;return N!=null&&N.devices?Object.values(N.devices):[]}),u={switch:"plugs",light:"lamp",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",sensor:"pulse"};function h(N){return u[N]??"cube"}const d={idle:"Idle",loading:"Loading",running:"Running",stopped:"Stopped",error:"Error"},f=ie(!1);async function _(){if(!(!n.selectedPlugin||f.value)){f.value=!0;try{await Pe.marketplace.update(n.selectedPlugin.manifest.name),await t.fetchPlugins(),await s()}catch(N){console.error("Failed to update plugin:",N)}finally{f.value=!1}}}const p=ie(!1),A=ie(!1);async function g(){if(!(!n.selectedPlugin||A.value)){A.value=!0;try{await Pe.marketplace.uninstall(n.selectedPlugin.manifest.name),await t.fetchPlugins(),n.close(),await Pe.daemon.restart()}catch(N){console.error("Failed to remove plugin:",N)}finally{A.value=!1,p.value=!1}}}const S=ie(!1);async function m(){if(!n.selectedPlugin||S.value)return;const N=!n.selectedPlugin.disabled;S.value=!0;try{const L=await Pe.setPluginDisabled(n.selectedPlugin.id,N);n.selectedPlugin.disabled=L.disabled}catch(L){console.error("Failed to toggle plugin disabled state:",L)}finally{S.value=!1}}const v=ie(null),k=ie(!1),x=ie(""),M=ie(""),z=ie(!1),P=ie(null),I=ie(!1),O=ie(null),T=ie({}),H=ie("visual"),W=Q(()=>{var N;return((N=O.value)==null?void 0:N.schema)!=null}),q=Q(()=>{var N;return((N=n.selectedPlugin)==null?void 0:N.source)==="homebridge"}),K=Q(()=>n.selectedPlugin!=null&&n.selectedPlugin.source!=="homebridge"),se=ie(""),ce=ie(!1),te=ie(null),ge=ie(!1),pe=Q(()=>{try{return JSON.parse(se.value),!0}catch{return!1}});Fe(()=>n.selectedPlugin,async N=>{if(se.value="",te.value=null,ge.value=!1,!(!N||N.source==="homebridge"))try{const L=await Pe.config.getPlugin(N.manifest.name);se.value=JSON.stringify(L.config??{},null,2)}catch{se.value="{}"}});const ve=ie(null);function Te(){var N;(N=ve.value)==null||N.click()}function Me(){if(!n.selectedPlugin)return;const N=n.selectedPlugin.manifest.name,L=q.value?M.value:se.value;if(!L)return;const E=new Blob([L],{type:"application/json"}),R=URL.createObjectURL(E),G=document.createElement("a");G.href=R,G.download=`${N.replace(/[^a-z0-9-]/gi,"-")}-config.json`,G.click(),URL.revokeObjectURL(R)}async function ne(N){var E;const L=(E=N.target.files)==null?void 0:E[0];if(!(!L||!n.selectedPlugin))try{const R=await L.text(),G=JSON.parse(R);let de;if(G.platform&&typeof G.platform=="string"){const{plugin:ye,...Ee}=G;de=Ee}else de=G;await Pe.config.savePlugin(n.selectedPlugin.manifest.name,de),q.value?M.value=JSON.stringify(de,null,2):se.value=JSON.stringify(de,null,2),ve.value&&(ve.value.value="")}catch(R){console.error("Import failed:",R)}}async function re(){if(ce.value||!n.selectedPlugin)return;let N;try{N=JSON.parse(se.value)}catch{te.value="Invalid JSON: fix the syntax first";return}ce.value=!0,te.value=null,ge.value=!1;try{await Pe.config.savePlugin(n.selectedPlugin.manifest.name,N),ge.value=!0,setTimeout(()=>{ge.value=!1},3e3)}catch(L){te.value=String(L)}finally{ce.value=!1}}const D=Q(()=>{const N=n.selectedPlugin;return!N||N.source!=="homebridge"?"":N.platformName??N.id??N.manifest.name});Fe(()=>n.selectedPlugin,async N=>{if(v.value=null,x.value="",M.value="",O.value=null,T.value={},P.value=null,I.value=!1,!(!N||N.source!=="homebridge")){k.value=!0;try{const L=await Pe.config.getHbPlugin(D.value,N.packageName);if(L.config){x.value=D.value,M.value=JSON.stringify(L.config,null,2),T.value=L.config,await Y(N.manifest.name);return}const E=await Pe.pluginInfo(N.packageName??N.manifest.name);v.value=E,E.platforms.length>0&&await J(E.platforms[0],E.mainFile),await Y(N.manifest.name)}catch{try{const L=await Pe.config.getHbPlugin(D.value,N.packageName);L.config&&(x.value=D.value,M.value=JSON.stringify(L.config,null,2),T.value=L.config)}catch{}}finally{k.value=!1}}});async function Y(N){try{const L=await fetch(`/api/marketplace/plugin-schema/${encodeURIComponent(N)}`);if(L.ok){const E=await L.json();O.value=E.schema}}catch{}}async function J(N,L){var E,R;x.value=N;try{const G=await Pe.config.getPlatform(N),de=G.config?G.config:{platform:N,plugin:L??((E=v.value)==null?void 0:E.mainFile)??""};M.value=JSON.stringify(de,null,2),T.value=de}catch{const G={platform:N,plugin:L??((R=v.value)==null?void 0:R.mainFile)??""};M.value=JSON.stringify(G,null,2),T.value=G}}function _e(N){T.value=N,M.value=JSON.stringify(N,null,2)}function Se(N){M.value=N;try{T.value=JSON.parse(N)}catch{}}function B(){try{return JSON.parse(M.value)}catch{return null}}const Z=Q(()=>B()!==null),F=Q(()=>{const N=B();return N!==null&&typeof N.platform!="string"}),ae=ie([]),he=ie(null);let ue=null;function w(){if(ue&&(ue.close(),ue=null),!n.selectedPlugin)return;const N=location.protocol==="https:"?"wss:":"ws:";ue=new WebSocket(`${N}//${location.host}/ws/logs`),ue.onmessage=L=>{var E,R;try{const G=JSON.parse(L.data);(G.plugin===((E=n.selectedPlugin)==null?void 0:E.id)||G.plugin===((R=n.selectedPlugin)==null?void 0:R.manifest.name))&&(ae.value=[...ae.value.slice(-199),G],setTimeout(()=>{he.value&&(he.value.scrollTop=he.value.scrollHeight)},10))}catch{}},ue.onclose=()=>{n.selectedPlugin&&setTimeout(w,3e3)}}Fe(()=>n.selectedPlugin,async N=>{if(ae.value=[],ue==null||ue.close(),ue=null,!!N){try{const L=await Pe.logs(N.manifest.name,100);ae.value=L.entries,setTimeout(()=>{he.value&&(he.value.scrollTop=he.value.scrollHeight)},20)}catch{}w()}}),_t(()=>{n.selectedPlugin&&w()}),Bi(()=>{ue==null||ue.close()});const C={debug:"var(--nb-c-text-muted)",info:"var(--nb-c-info)",warn:"var(--nb-c-warning)",error:"var(--nb-c-danger)"};async function V(){if(z.value||!n.selectedPlugin)return;const N=B();if(!N){P.value="Invalid JSON: fix the syntax first";return}z.value=!0,P.value=null,I.value=!1;try{const L=n.selectedPlugin;L.source==="homebridge"?await Pe.config.saveHbPlugin(D.value,N,L.packageName):await Pe.config.savePlugin(L.manifest.name,N),I.value=!0,setTimeout(()=>{I.value=!1},3e3)}catch(L){P.value=String(L)}finally{z.value=!1}}return(N,L)=>{const E=Ye,R=dm,G=rc,de=Gh,ye=gi,Ee=ec,ze=mE;return oe(n).selectedPlugin?(y(),$("div",TN,[b("div",NN,[b("div",{class:Le(["inspector-avatar",oe(n).selectedPlugin.status])},[X(E,{name:oe(Ws),size:24},null,8,["name"])],2),b("div",HN,[b("h2",PN,U(oe(n).selectedPlugin.manifest.name),1),b("span",ON,"v"+U(oe(n).selectedPlugin.manifest.version),1)])]),b("div",IN,[X(de,{size:l.value.status,"onUpdate:size":L[0]||(L[0]=ke=>l.value.status=ke),title:"Status",fluid:""},{default:ee(()=>[X(R,{label:"Status",control:"fit"},{default:ee(()=>[b("span",{class:Le(["status-badge",oe(n).selectedPlugin.status])},U(d[oe(n).selectedPlugin.status]),3)]),_:1}),oe(n).selectedPlugin.startedAt?(y(),fe(R,{key:0,label:"Started",control:"fit"},{default:ee(()=>[b("span",RN,U(new Date(oe(n).selectedPlugin.startedAt).toLocaleString()),1)]),_:1})):j("",!0),oe(n).selectedPlugin.stoppedAt?(y(),fe(R,{key:1,label:"Stopped",control:"fit"},{default:ee(()=>[b("span",DN,U(new Date(oe(n).selectedPlugin.stoppedAt).toLocaleString()),1)]),_:1})):j("",!0),X(R,{label:"Disabled",control:"fit"},{default:ee(()=>[X(G,{name:`plugin-disabled-${oe(n).selectedPlugin.id}`,"model-value":oe(n).selectedPlugin.disabled??!1,disabled:S.value,"onUpdate:modelValue":m},null,8,["name","model-value","disabled"])]),_:1})]),_:1},8,["size"]),oe(n).selectedPlugin.hapBridge?(y(),fe(de,{key:0,size:l.value.hap,"onUpdate:size":L[1]||(L[1]=ke=>l.value.hap=ke),title:"HomeKit pairing",fluid:""},{default:ee(()=>[b("div",VN,[b("div",BN,[r.value?(y(),$("img",{key:0,src:r.value,alt:"HomeKit QR Code",class:"hap-qr-img"},null,8,ZN)):j("",!0)]),b("div",FN,[X(R,{label:"PIN",control:"fit"},{default:ee(()=>[b("span",zN,U(oe(n).selectedPlugin.hapBridge.pincode),1)]),_:1}),X(R,{label:"Port",control:"fit"},{default:ee(()=>[b("span",UN,U(oe(n).selectedPlugin.hapBridge.port),1)]),_:1}),X(R,{label:"Bridge",control:"fit"},{default:ee(()=>[b("span",WN,U(oe(n).selectedPlugin.hapBridge.name),1)]),_:1})])]),L[15]||(L[15]=b("p",{class:"hap-hint"},"Scan with the Home app or enter the PIN manually to pair this plugin's devices.",-1))]),_:1},8,["size"])):j("",!0),oe(n).selectedPlugin.availableUpdate?(y(),fe(de,{key:1,size:l.value.update,"onUpdate:size":L[2]||(L[2]=ke=>l.value.update=ke),title:"Update",fluid:""},{default:ee(()=>[X(Ee,{status:"info",icon:Qh,title:`Version ${oe(n).selectedPlugin.availableUpdate} is available`},{action:ee(()=>[X(ye,{variant:"primary",size:"sm",loading:f.value,disabled:f.value,onClick:_},{default:ee(()=>[le(U(f.value?"Updating...":"Update"),1)]),_:1},8,["loading","disabled"])]),default:ee(()=>[le(" Currently on "+U(oe(n).selectedPlugin.manifest.version)+". ",1)]),_:1},8,["title"])]),_:1},8,["size"])):j("",!0),X(de,{size:l.value.manage,"onUpdate:size":L[5]||(L[5]=ke=>l.value.manage=ke),title:"Manage",fluid:""},{default:ee(()=>[p.value?(y(),fe(Ee,{key:1,status:"error",title:"This uninstalls the plugin and removes its configuration"},{action:ee(()=>[X(ye,{variant:"ghost",size:"sm",onClick:L[4]||(L[4]=ke=>p.value=!1)},{default:ee(()=>[...L[17]||(L[17]=[le("Cancel",-1)])]),_:1}),X(ye,{variant:"primary",size:"sm",loading:A.value,style:{background:"var(--nb-c-danger)","border-color":"var(--nb-c-danger)"},onClick:g},{default:ee(()=>[...L[18]||(L[18]=[le(" Remove ",-1)])]),_:1},8,["loading"])]),default:ee(()=>[L[19]||(L[19]=le(" OpenBridge needs a restart afterwards. ",-1))]),_:1})):(y(),fe(ye,{key:0,variant:"ghost",size:"sm",icon:ed,style:{color:"var(--nb-c-danger)"},onClick:L[3]||(L[3]=ke=>p.value=!0)},{default:ee(()=>[...L[16]||(L[16]=[le(" Remove plugin ",-1)])]),_:1}))]),_:1},8,["size"]),q.value?(y(),fe(de,{key:2,size:l.value.config,"onUpdate:size":L[7]||(L[7]=ke=>l.value.config=ke),title:"Platform config",fluid:""},{default:ee(()=>[k.value?(y(),$("div",jN,[X(E,{name:oe(Ln),size:14},null,8,["name"]),L[20]||(L[20]=le(" Loading config… ",-1))])):(y(),$(be,{key:1},[v.value&&v.value.platforms.length>1?(y(),$("div",KN,[(y(!0),$(be,null,Ve(v.value.platforms,ke=>(y(),$("button",{key:ke,class:Le(["platform-tab",{active:x.value===ke}]),onClick:St=>J(ke)},U(ke),11,qN))),128))])):v.value&&v.value.platforms.length===0?(y(),fe(Ee,{key:1,status:"warning",variant:"callout",title:"No platform detected"},{default:ee(()=>[...L[21]||(L[21]=[le(" Add a ",-1),b("code",null,"platforms[]",-1),le(" entry manually in Config. ",-1)])]),_:1})):j("",!0),!v.value||v.value.platforms.length>0?(y(),$(be,{key:2},[W.value?(y(),fe(ze,{key:0,"model-value":H.value,items:a,variant:"contained",size:"sm","onUpdate:modelValue":L[6]||(L[6]=ke=>H.value=ke)},null,8,["model-value"])):j("",!0),H.value==="visual"&&W.value?(y(),$("div",GN,[X($N,{"hb-schema":O.value,"model-value":T.value,"onUpdate:modelValue":_e},null,8,["hb-schema","model-value"])])):j("",!0),H.value==="json"||!W.value?(y(),$("div",{key:2,class:Le(["config-editor-wrap",{invalid:M.value&&!Z.value}])},[X(L6,{"model-value":M.value,height:220,"onUpdate:modelValue":Se},null,8,["model-value"]),M.value&&!Z.value?(y(),$("div",YN,"Invalid JSON")):F.value?(y(),$("div",XN,'Missing "platform" field')):j("",!0)],2)):j("",!0),P.value?(y(),$("div",JN,[X(E,{name:oe(wn),size:13},null,8,["name"]),le(" "+U(P.value),1)])):j("",!0),b("div",QN,[X(ye,{variant:"primary",size:"sm",loading:z.value,disabled:z.value||!Z.value||F.value,icon:I.value?_s:A0,onClick:V},{default:ee(()=>[le(U(I.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),I.value?(y(),fe(ye,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?Jo:Fs,onClick:s},{default:ee(()=>[le(U(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):j("",!0)])],64)):j("",!0)],64))]),_:1},8,["size"])):j("",!0),K.value?(y(),fe(de,{key:3,size:l.value.config,"onUpdate:size":L[9]||(L[9]=ke=>l.value.config=ke),title:"Plugin config",fluid:""},{default:ee(()=>[b("div",{class:Le(["config-editor-wrap",{invalid:se.value&&!pe.value}])},[X(L6,{"model-value":se.value,height:220,"onUpdate:modelValue":L[8]||(L[8]=ke=>se.value=ke)},null,8,["model-value"]),se.value&&!pe.value?(y(),$("div",eH,"Invalid JSON")):j("",!0)],2),te.value?(y(),$("div",tH,[X(E,{name:oe(wn),size:13},null,8,["name"]),le(" "+U(te.value),1)])):j("",!0),b("div",iH,[X(ye,{variant:"primary",size:"sm",loading:ce.value,disabled:ce.value||!pe.value,icon:ge.value?_s:A0,onClick:re},{default:ee(()=>[le(U(ge.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),ge.value?(y(),fe(ye,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?Jo:Fs,onClick:s},{default:ee(()=>[le(U(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):j("",!0)])]),_:1},8,["size"])):j("",!0),X(de,{size:l.value.transfer,"onUpdate:size":L[10]||(L[10]=ke=>l.value.transfer=ke),title:"Import & export",fluid:""},{default:ee(()=>[b("div",rH,[X(ye,{variant:"ghost",size:"sm",icon:Z$,onClick:Me},{default:ee(()=>[...L[22]||(L[22]=[le("Export config",-1)])]),_:1}),X(ye,{variant:"ghost",size:"sm",icon:q$,onClick:Te},{default:ee(()=>[...L[23]||(L[23]=[le("Import config",-1)])]),_:1}),b("input",{ref_key:"importInput",ref:ve,type:"file",accept:".json",style:{display:"none"},onChange:ne},null,544)])]),_:1},8,["size"]),c.value.length>0?(y(),fe(de,{key:4,size:l.value.devices,"onUpdate:size":L[11]||(L[11]=ke=>l.value.devices=ke),title:`Devices (${c.value.length})`,fluid:""},{default:ee(()=>[(y(!0),$(be,null,Ve(c.value,ke=>(y(),$("div",{key:ke.id,class:"plugin-device-row"},[X(E,{name:h(ke.widgetType),size:14},null,8,["name"]),b("span",sH,U(ke.name),1),b("span",nH,U(ke.widgetType),1)]))),128))]),_:1},8,["size","title"])):j("",!0),X(de,{size:l.value.manifest,"onUpdate:size":L[12]||(L[12]=ke=>l.value.manifest=ke),title:"Manifest",fluid:""},{default:ee(()=>[X(R,{label:"Name",control:"fit"},{default:ee(()=>[b("span",aH,U(oe(n).selectedPlugin.manifest.name),1)]),_:1}),X(R,{label:"Version",control:"fit"},{default:ee(()=>[b("span",oH,U(oe(n).selectedPlugin.manifest.version),1)]),_:1}),oe(n).selectedPlugin.manifest.description?(y(),fe(R,{key:0,label:"Description",control:"fit"},{default:ee(()=>[b("span",lH,U(oe(n).selectedPlugin.manifest.description),1)]),_:1})):j("",!0),oe(n).selectedPlugin.manifest.author?(y(),fe(R,{key:1,label:"Author",control:"fit"},{default:ee(()=>[b("span",cH,U(oe(n).selectedPlugin.manifest.author),1)]),_:1})):j("",!0)]),_:1},8,["size"]),oe(n).selectedPlugin.error?(y(),fe(de,{key:5,size:l.value.error,"onUpdate:size":L[13]||(L[13]=ke=>l.value.error=ke),title:"Error",fluid:""},{default:ee(()=>[X(Ee,{status:"error"},{default:ee(()=>[b("code",uH,U(oe(n).selectedPlugin.error),1)]),_:1})]),_:1},8,["size"])):j("",!0),ae.value.length>0?(y(),fe(de,{key:6,size:l.value.logs,"onUpdate:size":L[14]||(L[14]=ke=>l.value.logs=ke),title:"Recent logs",fluid:""},{default:ee(()=>[b("div",{ref_key:"logsEl",ref:he,class:"plugin-log-terminal"},[(y(!0),$(be,null,Ve(ae.value,(ke,St)=>(y(),$("div",{key:St,class:"plugin-log-line"},[b("span",hH,U(new Date(ke.timestamp).toLocaleTimeString()),1),b("span",{class:"plog-level",style:mi({color:C[ke.level]})},U(ke.level.toUpperCase()),5),b("span",dH,U(ke.message),1)]))),128))],512)]),_:1},8,["size"])):j("",!0)])])):j("",!0)}}}),_H=Zt(fH,[["__scopeId","data-v-a0fa6dda"]]),pH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},un=pH("diamond","0 0 256 256",'<path d="M235.33,116.72,139.28,20.66a16,16,0,0,0-22.56,0l-96,96.06a16,16,0,0,0,0,22.56l96.05,96.06h0a16,16,0,0,0,22.56,0l96.05-96.06a16,16,0,0,0,0-22.56ZM128,224h0L32,128,128,32,224,128Z"/>'),mH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},gH=mH("folder","0 0 256 256",'<path d="M216,72H131.31L104,44.69A15.86,15.86,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.4,15.4,0,0,0,39.38,216H216.89A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40ZM216,200H40V88H216Z"/>'),vH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},bH=vH("cloud-arrow-down","0 0 256 256",'<path d="M248,128a87.34,87.34,0,0,1-17.6,52.81,8,8,0,1,1-12.8-9.62A71.34,71.34,0,0,0,232,128a72,72,0,0,0-144,0,8,8,0,0,1-16,0,88,88,0,0,1,3.29-23.88C74.2,104,73.1,104,72,104a48,48,0,0,0,0,96H96a8,8,0,0,1,0,16H72A64,64,0,1,1,81.29,88.68,88,88,0,0,1,248,128Zm-69.66,42.34L160,188.69V128a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z"/>'),yH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},wH=yH("star","0 0 256 256",'<path d="M234.29,114.85l-45,38.83L203,211.75a16.4,16.4,0,0,1-24.5,17.82L128,198.49,77.47,229.57A16.4,16.4,0,0,1,53,211.75l13.76-58.07-45-38.83A16.46,16.46,0,0,1,31.08,86l59-4.76,22.76-55.08a16.36,16.36,0,0,1,30.27,0l22.75,55.08,59,4.76a16.46,16.46,0,0,1,9.37,28.86Z"/>'),SH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},sg=SH("heart","0 0 256 256",'<path d="M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0C119.79,228.66,16,172,16,102A62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z"/>'),CH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},ng=CH("book-open","0 0 256 256",'<path d="M232,48H160a40,40,0,0,0-32,16A40,40,0,0,0,96,48H24a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8H96a24,24,0,0,1,24,24,8,8,0,0,0,16,0,24,24,0,0,1,24-24h72a8,8,0,0,0,8-8V56A8,8,0,0,0,232,48ZM96,192H32V64H96a24,24,0,0,1,24,24V200A39.81,39.81,0,0,0,96,192Zm128,0H160a39.81,39.81,0,0,0-24,8V88a24,24,0,0,1,24-24h64Z"/>'),AH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},kH=AH("arrow-square-out","0 0 256 256",'<path d="M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"/>');let MH=0;function LH(){return`notif-${Date.now()}-${++MH}`}function ag(){const e=Am();function t(i,r,s){e.add({id:LH(),variant:i,message:r,title:s==null?void 0:s.title,duration:(s==null?void 0:s.duration)??(i==="error"?6e3:3200)})}return{success:(i,r)=>t("success",i,r),error:(i,r)=>t("error",i,r),warning:(i,r)=>t("warning",i,r),info:(i,r)=>t("info",i,r),dismiss:i=>e.remove(i),clear:()=>e.clear()}}const EH={class:"mp-panel"},xH={class:"mp-search-wrap"},$H={key:0,class:"mp-count"},TH={key:3,class:"mp-local-section"},NH={class:"mp-local-heading"},HH={class:"mp-avatar mp-avatar--ob"},PH={class:"mp-info"},OH={class:"mp-name-row"},IH={class:"mp-name"},RH={class:"badge badge--native"},DH={class:"badge badge--local"},VH={class:"mp-ver"},BH={key:0,class:"mp-desc"},ZH={class:"mp-meta"},FH={key:0},zH={class:"mp-action"},UH={class:"mp-list"},WH={key:0,class:"mp-loading"},jH=["src","alt"],KH={class:"mp-info"},qH={class:"mp-name-row"},GH={class:"mp-name"},YH={class:"mp-ver"},XH={key:0,class:"mp-desc"},JH={class:"mp-meta"},QH={key:0},eP={key:1,class:"mp-sep"},tP={class:"mp-enriched"},iP={key:0,class:"mp-stat"},rP={key:1,class:"mp-stat"},sP=["href"],nP=["href"],aP=["href"],oP={class:"mp-action"},lP={key:1,class:"mp-load-more-wrap"},cP=20,uP="https://marketplace.openbridge.nubisco.io/api",hP=Oe({__name:"MarketplacePanel",setup(e){const t=ys(),i=ag(),r=ie(null),s=ie(""),n=ie([]),a=ie(0),o=ie(!1),l=ie(null),c=ie(null),u=ie(new Map),h=ie(null),d=ie(0),f=ie([]);function _(O){return{name:O.name,version:O.version,description:O.description??"",author:O.author?{name:O.author}:void 0,date:O.last_published_at,weeklyDownloads:O.weekly_downloads,githubStars:O.github_stars??void 0,githubSponsorsUrl:O.github_sponsors_url??void 0,documentationUrl:O.homepage??void 0,links:{npm:O.npm_url,homepage:O.homepage??void 0,repository:O.repository_url??void 0}}}function p(O){return O?O>=1e6?`${(O/1e6).toFixed(1)}M`:O>=1e3?`${(O/1e3).toFixed(1)}K`:O.toString():"0"}async function A(O=!0){O&&(d.value=0,n.value=[]),o.value=!0,l.value=null;try{const T=d.value+1,H=new URLSearchParams({q:s.value,page:String(T),limit:String(cP)}),W=await fetch(`${uP}/plugins?${H}`);if(!W.ok)throw new Error(`Marketplace API error: ${W.status}`);const q=await W.json(),K=q.plugins.map(_);n.value=O?K:[...n.value,...K],a.value=q.total}catch(T){l.value=String(T)}finally{o.value=!1}}async function g(O){if(!c.value){c.value=O.name,l.value=null;try{const T=await Pe.marketplace.install(O.name);u.value.set(O.name,T.mainFile),h.value={name:O.name,mainFile:T.mainFile},await Pe.pluginsRefresh(),await t.fetchPlugins(),i.success(`Installed ${O.name}`)}catch(T){l.value=`Failed to install ${O.name}: ${T}`,i.error(`Failed to install ${O.name}`)}finally{c.value=null}}}async function S(O){if(!r.value){r.value=O,l.value=null;try{await Pe.marketplace.uninstall(O),u.value.delete(O),await t.fetchPlugins(),i.success(`Removed ${O}`)}catch(T){l.value=`Failed to uninstall ${O}: ${T}`,i.error(`Failed to remove ${O}`)}finally{r.value=null}}}async function m(O){if(!(c.value||!O.platform)){c.value=O.name,l.value=null;try{await Pe.config.savePlugin(O.name,{platform:O.platform}),u.value.set(O.name,`${O.path}/dist/index.js`),h.value={name:O.name,mainFile:`${O.path}/dist/index.js`},await t.fetchPlugins(),i.success(`Activated ${O.name}`)}catch(T){l.value=`Failed to activate ${O.name}: ${T}`,i.error(`Failed to activate ${O.name}`)}finally{c.value=null}}}function v(O){var W,q;const H=(((W=O.links)==null?void 0:W.repository)??((q=O.links)==null?void 0:q.homepage)??"").match(/github\.com\/([^/]+)/);return H?`https://github.com/${H[1]}.png?size=48`:null}function k(O){return O.name.includes("openbridge-")||Array.isArray(O.badges)&&O.badges.includes("openbridge-plugin")}function x(O){return O.author?typeof O.author=="string"?O.author:O.author.name??"":""}function M(O){const T=Math.floor((Date.now()-new Date(O).getTime())/864e5);return T===0?"today":T<30?`${T}d ago`:T<365?`${Math.floor(T/30)}mo ago`:`${Math.floor(T/365)}y ago`}function z(){d.value++,A(!1)}let P=null;function I(){P&&clearTimeout(P),P=setTimeout(()=>A(),350)}return _t(async()=>{try{const O=await Pe.marketplace.installed();for(const T of O.packages)u.value.set(T.name,T.mainFile)}catch{}try{const O=await Pe.marketplace.local();f.value=O.plugins}catch{}A()}),(O,T)=>{const H=ul,W=ec,q=rt,K=Ye,se=gi,ce=hl;return y(),$("div",EH,[T[15]||(T[15]=b("div",{class:"mp-header"},[b("span",{class:"mp-title"},"Browse Plugins")],-1)),b("div",xH,[X(H,{modelValue:s.value,"onUpdate:modelValue":[T[0]||(T[0]=te=>s.value=te),I],placeholder:"Search plugins",size:"sm"},null,8,["modelValue"])]),a.value>0?(y(),$("div",$H,U(a.value.toLocaleString())+" plugins found",1)):j("",!0),h.value?(y(),fe(W,{key:1,status:"success",dismissible:"",class:"mp-installed-banner",title:`${h.value.name} installed`,onDismiss:T[1]||(T[1]=te=>h.value=null)},{default:ee(()=>[...T[3]||(T[3]=[le(" Click it in your plugins list to configure it. ",-1)])]),_:1},8,["title"])):j("",!0),l.value?(y(),fe(q,{key:2,variant:"error"},{default:ee(()=>[le(U(l.value),1)]),_:1})):j("",!0),f.value.length>0?(y(),$("div",TH,[b("div",NH,[X(K,{name:oe(un),size:11},null,8,["name"]),T[4]||(T[4]=le(" Local plugins ",-1))]),(y(!0),$(be,null,Ve(f.value,te=>(y(),fe(ce,{key:te.name,class:"mp-row mp-row--ob mp-row--local"},{default:ee(()=>[b("div",HH,[X(K,{name:oe(un),size:16},null,8,["name"])]),b("div",PH,[b("div",OH,[b("span",IH,U(te.name),1),b("span",RH,[X(K,{name:oe(un),size:9},null,8,["name"]),T[5]||(T[5]=le(" Native ",-1))]),b("span",DH,[X(K,{name:oe(gH),size:9},null,8,["name"]),T[6]||(T[6]=le(" Local ",-1))]),b("span",VH,"v"+U(te.version),1)]),te.description?(y(),$("p",BH,U(te.description),1)):j("",!0),b("div",ZH,[te.author?(y(),$("span",FH,U(te.author),1)):j("",!0)])]),b("div",zH,[u.value.has(te.name)?(y(),fe(se,{key:0,variant:"ghost",size:"sm",disabled:"",icon:_s},{default:ee(()=>[...T[7]||(T[7]=[le("Active",-1)])]),_:1})):(y(),fe(se,{key:1,variant:"primary",size:"sm",loading:c.value===te.name,disabled:!!c.value||!te.platform,title:te.platform?"":"No platform declared in package.json openbridge.platform",onClick:ge=>m(te)},{default:ee(()=>[...T[8]||(T[8]=[le(" Activate ",-1)])]),_:1},8,["loading","disabled","title","onClick"]))])]),_:2},1024))),128))])):j("",!0),b("div",UH,[o.value&&n.value.length===0?(y(),$("div",WH,[X(K,{name:oe(Ln),size:22},null,8,["name"]),T[9]||(T[9]=b("span",null,"Searching npm…",-1))])):j("",!0),(y(!0),$(be,null,Ve(n.value,te=>(y(),fe(ce,{key:te.name,class:Le(["mp-row",{"mp-row--ob":k(te)}])},{default:ee(()=>[b("div",{class:Le(["mp-avatar",{"mp-avatar--ob":k(te)}])},[v(te)?(y(),$("img",{key:0,src:v(te),alt:te.name,class:"mp-avatar-img",onError:T[2]||(T[2]=ge=>ge.target.style.display="none")},null,40,jH)):j("",!0),k(te)?(y(),fe(K,{key:1,name:oe(un),size:16},null,8,["name"])):(y(),fe(K,{key:2,name:oe(Ws),size:16},null,8,["name"]))],2),b("div",KH,[b("div",qH,[b("span",GH,U(te.name),1),b("span",YH,"v"+U(te.version),1)]),te.description?(y(),$("p",XH,U(te.description),1)):j("",!0),b("div",JH,[x(te)?(y(),$("span",QH,U(x(te)),1)):j("",!0),x(te)?(y(),$("span",eP,"·")):j("",!0),b("span",null,U(M(te.date)),1)]),b("div",tP,[te.weeklyDownloads?(y(),$("span",iP,[X(K,{name:oe(bH),size:11},null,8,["name"]),le(" "+U(p(te.weeklyDownloads)),1)])):j("",!0),te.githubStars?(y(),$("span",rP,[X(K,{name:oe(wH),weight:"fill",size:11},null,8,["name"]),le(" "+U(p(te.githubStars)),1)])):j("",!0),te.githubSponsorsUrl?(y(),$("a",{key:2,href:te.githubSponsorsUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[X(K,{name:oe(sg),weight:"fill",size:11},null,8,["name"]),T[10]||(T[10]=le(" Sponsor ",-1))],8,sP)):j("",!0),te.documentationUrl?(y(),$("a",{key:3,href:te.documentationUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[X(K,{name:oe(ng),size:11},null,8,["name"]),T[11]||(T[11]=le(" Docs ",-1))],8,nP)):j("",!0),b("a",{href:`https://marketplace.openbridge.nubisco.io/plugins/${te.name}`,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link mp-stat--marketplace"},[X(K,{name:oe(kH),size:11},null,8,["name"]),T[12]||(T[12]=le(" Marketplace ",-1))],8,aP)])]),b("div",oP,[u.value.has(te.name)?(y(),fe(se,{key:0,variant:"danger",size:"sm",outlined:"",loading:r.value===te.name,disabled:!!r.value,onClick:ge=>S(te.name)},{default:ee(()=>[...T[13]||(T[13]=[le(" Remove ",-1)])]),_:1},8,["loading","disabled","onClick"])):(y(),fe(se,{key:1,variant:"primary",size:"sm",loading:c.value===te.name,disabled:!!c.value,onClick:ge=>g(te)},{default:ee(()=>[...T[14]||(T[14]=[le(" Install ",-1)])]),_:1},8,["loading","disabled","onClick"]))])]),_:2},1032,["class"]))),128)),n.value.length>0&&n.value.length<a.value?(y(),$("div",lP,[X(se,{variant:"ghost",size:"sm",loading:o.value,disabled:o.value,onClick:z},{default:ee(()=>[le(U(o.value?"Loading…":`Load more (${a.value-n.value.length} remaining)`),1)]),_:1},8,["loading","disabled"])])):j("",!0)])])}}}),dP=Zt(hP,[["__scopeId","data-v-37815e6e"]]),fP={key:0,class:"inspector-content nb-inspector"},_P={class:"detail-header"},pP={class:"detail-icon native-icon"},mP={style:{flex:"1","min-width":"0"}},gP={key:1,class:"rename-row"},vP={class:"detail-type"},bP={class:"info-grid"},yP={class:"info-val"},wP={class:"info-val"},SP={class:"info-val"},CP={class:"info-val"},AP={class:"info-val mono"},kP={key:0,class:"widget-energy"},MP={class:"energy-primary"},LP={class:"energy-value"},EP={class:"energy-secondary"},xP={key:0,class:"energy-item"},$P={class:"energy-item-val"},TP={key:1,class:"energy-item"},NP={class:"energy-item-val"},HP={key:1,class:"widget-thermo"},PP={class:"thermo-row"},OP={class:"thermo-value"},IP={class:"thermo-row"},RP={class:"thermo-value accent"},DP={class:"thermo-row"},VP={key:2,class:"widget-thermo"},BP={class:"thermo-row"},ZP={class:"thermo-value"},FP={class:"thermo-row"},zP={class:"thermo-value accent"},UP={class:"thermo-row"},WP={key:3,class:"widget-generic"},jP={key:0,class:"no-telemetry"},KP={class:"char-name"},qP={class:"char-value"},GP={class:"history-tabs"},YP=["onClick"],XP={key:0,class:"history-nav"},JP={class:"history-nav-center"},QP={class:"history-total"},eO={class:"history-date"},tO={key:2,class:"no-history"},iO={key:3,class:"no-history"},rO={key:4,class:"no-history"},sO={class:"calibration-actions"},nO={class:"char-list"},aO={class:"char-name"},oO={class:"char-value"},lO={key:0,class:"homekit-notice"},cO={class:"homekit-row"},uO={key:1,class:"homekit-notice"},hO={class:"detail-header"},dO={class:"detail-icon"},fO={style:{flex:"1","min-width":"0"}},_O={key:1,class:"rename-row"},pO={class:"detail-type"},mO={class:"info-grid"},gO={key:0,class:"info-key"},vO={key:1,class:"info-val"},bO={key:0,class:"homekit-row"},yO={key:1,class:"homekit-notice"},wO={class:"char-list"},SO={class:"char-name"},CO={class:"homekit-row"},AO={key:0,class:"homekit-notice"},kO={class:"detail-uuid"},MO=Oe({__name:"DeviceInspector",setup(e){const t=ie(new Set),i=ie(!1),r=ie("");function s(L){return!t.value.has(L)}async function n(){try{const{hidden:L}=await Pe.homekitHidden();t.value=new Set(L)}catch{}}async function a(L,E){i.value=!0,r.value="";try{const R=await Pe.setHomekitVisibility(L,E),G=new Set(t.value);E?G.delete(L):G.add(L),t.value=G,R.applied||(r.value="Saved. This takes effect after the next OpenBridge restart.")}catch(R){r.value=`Could not change visibility: ${R.message}`}finally{i.value=!1}}const o=ie({}),l=ie([]),c=ie(""),u=Q(()=>[{value:"",label:"Default (as published)"},...l.value.map(L=>({value:L.key,label:L.label}))]);function h(L){return l.value.some(E=>E.serviceUuid===L)}function d(L,E){var R;return((R=o.value[L])==null?void 0:R[E])??""}const f=ie(null);function _(L){return L.homekitType||L.widgetType}async function p(L){f.value=null;try{const{accessory:E}=await Pe.deviceAccessory(L);f.value=E}catch{}}async function A(){try{const{overrides:L,available:E}=await Pe.homekitServiceTypes();o.value=L,l.value=E}catch{}}async function g(L,E,R){i.value=!0,c.value="";try{await Pe.setHomekitServiceType(L,E,R||null);const G={...o.value},de={...G[L]??{}};R?de[E]=R:delete de[E],Object.keys(de).length>0?G[L]=de:delete G[L],o.value=G,c.value="Saved. This takes effect after the next OpenBridge restart."}catch(G){c.value=`Could not change type: ${G.message}`}finally{i.value=!1}}_t(()=>{n(),A()});const S=fl(),m=Q(()=>S.selectedDevice),v=Q(()=>m.value?m.value.kind==="native"?m.value.dev.id:m.value.acc.uuid:null),k={1:{label:"Other",icon:"cube"},2:{label:"Bridge",icon:"intersect"},3:{label:"Fan",icon:"fan"},4:{label:"Garage Door",icon:"garage"},5:{label:"Light",icon:"lightbulb"},6:{label:"Lock",icon:"lock"},7:{label:"Outlet",icon:"plugs"},8:{label:"Switch",icon:"toggle-right"},9:{label:"Thermostat",icon:"thermometer"},10:{label:"Sensor",icon:"pulse"},11:{label:"Security",icon:"shield"},12:{label:"Door",icon:"door"},13:{label:"Window",icon:"app-window"},14:{label:"Window Covering",icon:"rows"},15:{label:"Programm. Switch",icon:"sliders"},16:{label:"Range Extender",icon:"broadcast"},17:{label:"Camera",icon:"camera"},18:{label:"Video Doorbell",icon:"bell"},19:{label:"Air Purifier",icon:"wind"},20:{label:"Heater/Cooler",icon:"thermometer-hot"},21:{label:"Air Conditioner",icon:"snowflake"},22:{label:"Humidifier",icon:"drop"},23:{label:"Dehumidifier",icon:"drop"},26:{label:"Speaker",icon:"speaker-high"},28:{label:"Sprinkler",icon:"drop"},29:{label:"Faucet",icon:"drop"},30:{label:"Shower",icon:"drop"},32:{label:"TV",icon:"television"},34:{label:"Router",icon:"broadcast"},36:{label:"Target Control",icon:"game-controller"},38:{label:"Smart Speaker",icon:"speaker-hifi"}};function x(L){return k[L]??{label:`Category ${L}`,icon:"cube"}}const M=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]);function z(L){return L.services.filter(E=>!M.has(E.name)&&!M.has(E.uuid))}function P(L){return L.services.find(E=>M.has(E.name)||M.has(E.uuid))}function I(L){const E=P(L);if(!E)return null;const R=G=>{var de;return(de=E.characteristics.find(ye=>ye.name===G||ye.name.includes(G)))==null?void 0:de.value};return{manufacturer:R("Manufacturer")??R("Manuf"),model:R("Model"),serial:R("SerialNumber")??R("Serial"),firmware:R("FirmwareRevision")??R("Firmware")}}function O(L){return L.value===null||L.value===void 0?"—":L.format==="bool"?L.value?"On":"Off":typeof L.value=="number"?String(Math.round(L.value*100)/100):String(L.value)}function T(L){return L.perms.includes("pw")}const H=ie(!1),W=ie("");function q(L){W.value=L,H.value=!0}async function K(L){var E,R;if(W.value.trim())try{const G=W.value.trim();await Pe.renameDevice(L,G),H.value=!1,((E=m.value)==null?void 0:E.kind)==="native"?m.value.dev.name=G:((R=m.value)==null?void 0:R.kind)==="hap"&&(m.value.acc.displayName=G);const{useDaemonStore:de}=await qf(async()=>{const{useDaemonStore:Ee}=await Promise.resolve().then(()=>h6);return{useDaemonStore:Ee}},void 0);await de().fetchAccessories()}catch(G){console.error("Rename failed:",G)}}async function se(L,E,R,G){try{await Pe.setCharacteristic(L,E,R,G);const{useDaemonStore:de}=await qf(async()=>{const{useDaemonStore:Ee}=await Promise.resolve().then(()=>h6);return{useDaemonStore:Ee}},void 0);await de().fetchAccessories()}catch(de){console.error("Failed to set characteristic:",de)}}const ce={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",sensor:"pulse"},te={switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",sensor:"Sensor"};function ge(L){return ce[L]??"cube"}function pe(L){return te[L]??L}function ve(L,E=1){if(L==null)return"—";const R=Number(L);return isFinite(R)?R.toFixed(E):String(L)}function Te(L){return Object.entries(L.telemetry).filter(([E])=>!E.startsWith("_"))}const Me=ie("day"),ne=ie(new Date().toISOString().slice(0,10)),re=ie(null),D=ie(!1);async function Y(L){if(!D.value){D.value=!0;try{re.value=await Pe.deviceHistory(L,Me.value,ne.value)}catch{}finally{D.value=!1}}}function J(L){var R;const E=new Date(ne.value+(ne.value.length<=7?"-01":""));Me.value==="day"?(E.setDate(E.getDate()+L),ne.value=E.toISOString().slice(0,10)):Me.value==="month"?(E.setMonth(E.getMonth()+L),ne.value=E.toISOString().slice(0,7)):(E.setFullYear(E.getFullYear()+L),ne.value=String(E.getFullYear())),((R=m.value)==null?void 0:R.kind)==="native"&&Y(m.value.dev.id)}Fe(Me,()=>{var E;const L=new Date;Me.value==="day"?ne.value=L.toISOString().slice(0,10):Me.value==="month"?ne.value=L.toISOString().slice(0,7):ne.value=String(L.getFullYear()),((E=m.value)==null?void 0:E.kind)==="native"&&m.value.dev.widgetType==="energy_meter"&&Y(m.value.dev.id)}),Fe(v,(L,E)=>{if(L===E&&re.value)return;const R=m.value;(R==null?void 0:R.kind)==="native"?p(R.dev.id):f.value=null,(R==null?void 0:R.kind)==="native"&&R.dev.widgetType==="energy_meter"&&(ne.value=new Date().toISOString().slice(0,10),Me.value="day",Y(R.dev.id))},{immediate:!0});const _e=ie([]),Se=ie([]),B=ie(!1),Z=ie(!1),F=ie(!1),ae=Q(()=>JSON.stringify(_e.value)!==JSON.stringify(Se.value)),he=Q(()=>!m.value||m.value.kind!=="native"?null:m.value.dev);async function ue(L){const{plugins:E}=await Pe.plugins(),R=E.find(de=>de.id===L.pluginId);if(!R)return null;if(R.source!=="homebridge"){const{config:de}=await Pe.config.getPlugin(L.pluginId);return de?{pluginConfig:de,isNative:!0,pluginName:L.pluginId,platformName:void 0}:null}else{const de=R.platformName??L.pluginId,{config:ye}=await Pe.config.getPlatform(de);return ye?{pluginConfig:ye,isNative:!1,pluginName:L.pluginId,platformName:de}:null}}async function w(){const L=he.value;if(L!=null&&L.interpolation){B.value=!0,F.value=!1;try{const E=await ue(L);if(!E)return;const G=(E.pluginConfig.devices??[]).find(ze=>ze.id===L.id);if(!G)return;const de=L.interpolation,Ee=(G[de.configField]??[]).map(ze=>({input:ze[de.configShape.inputKey]??0,output:ze[de.configShape.outputKey]??0}));_e.value=Ee,Se.value=JSON.parse(JSON.stringify(Ee))}catch(E){console.error("Failed to load interpolation config:",E)}finally{B.value=!1}}}async function C(){const L=he.value;if(L!=null&&L.interpolation){Z.value=!0,F.value=!1;try{const E=await ue(L);if(!E)return;const R=L.interpolation,G=E.pluginConfig.devices??[],de=G.findIndex(Ee=>Ee.id===L.id);if(de<0)return;const ye=_e.value.map(Ee=>({[R.configShape.inputKey]:Ee.input,[R.configShape.outputKey]:Ee.output}));G[de]={...G[de],[R.configField]:ye},E.pluginConfig.devices=G,E.isNative?await Pe.config.savePlugin(E.pluginName,E.pluginConfig):await Pe.config.savePlatform(E.pluginConfig),Se.value=JSON.parse(JSON.stringify(_e.value)),F.value=!0}catch(E){console.error("Failed to save interpolation config:",E)}finally{Z.value=!1}}}function V(){_e.value=JSON.parse(JSON.stringify(Se.value)),F.value=!1}Fe(v,(L,E)=>{var R;L===E&&Se.value.length>0||(F.value=!1,((R=m.value)==null?void 0:R.kind)==="native"&&m.value.dev.interpolation?w():(_e.value=[],Se.value=[]))},{immediate:!0});const N=Q(()=>{var E;return(E=re.value)!=null&&E.buckets?[{name:"kWh",data:re.value.buckets.map(R=>{let G=R.label;return Me.value==="day"?G=parseInt(R.label)%6===0?R.label:"":Me.value==="month"&&(G=parseInt(R.label)%5===1?R.label:""),{x:G,y:Math.max(0,Math.round((R.kwh??0)*100)/100)}})}]:[]});return(L,E)=>{const R=Ye,G=ul,de=gi,ye=Gh,Ee=jS,ze=TM,ke=ec,St=sc,Gt=rc;return m.value?(y(),$("div",fP,[m.value.kind==="native"?(y(),$(be,{key:0},[b("div",_P,[b("div",pP,[X(R,{name:ge(_(m.value.dev)),size:26},null,8,["name"])]),b("div",mP,[H.value?(y(),$("div",gP,[X(G,{modelValue:W.value,"onUpdate:modelValue":E[1]||(E[1]=He=>W.value=He),size:"sm",onKeyup:[E[2]||(E[2]=is(He=>K(m.value.dev.id),["enter"])),E[3]||(E[3]=is(He=>H.value=!1,["escape"]))]},null,8,["modelValue"]),X(de,{variant:"primary",size:"sm",icon:_s,onClick:E[4]||(E[4]=He=>K(m.value.dev.id))}),X(de,{variant:"ghost",size:"sm",icon:q1,onClick:E[5]||(E[5]=He=>H.value=!1)})])):(y(),$("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:E[0]||(E[0]=He=>q(m.value.dev.name))},U(m.value.dev.name),1)),b("div",vP,U(pe(_(m.value.dev))),1)])]),X(ye,{title:"Device info",fluid:""},{default:ee(()=>[b("div",bP,[E[19]||(E[19]=b("span",{class:"info-key"},"Plugin",-1)),b("span",yP,U(m.value.dev.pluginId),1),m.value.dev.manufacturer?(y(),$(be,{key:0},[E[17]||(E[17]=b("span",{class:"info-key"},"Manufacturer",-1)),b("span",wP,U(m.value.dev.manufacturer),1)],64)):j("",!0),m.value.dev.model?(y(),$(be,{key:1},[E[18]||(E[18]=b("span",{class:"info-key"},"Model",-1)),b("span",SP,U(m.value.dev.model),1)],64)):j("",!0),E[20]||(E[20]=b("span",{class:"info-key"},"Status",-1)),b("span",CP,U(m.value.dev.pluginStatus),1),E[21]||(E[21]=b("span",{class:"info-key"},"ID",-1)),b("span",AP,U(m.value.dev.id),1)])]),_:1}),X(ye,{title:"State",fluid:""},{default:ee(()=>[m.value.dev.widgetType==="energy_meter"?(y(),$("div",kP,[b("div",MP,[b("span",LP,U(ve(m.value.dev.telemetry.power,1)),1),E[22]||(E[22]=b("span",{class:"energy-unit"},"W",-1))]),b("div",EP,[m.value.dev.telemetry.voltage!==void 0?(y(),$("span",xP,[E[23]||(E[23]=b("span",{class:"energy-label"},"Voltage",-1)),b("span",$P,U(ve(m.value.dev.telemetry.voltage,1))+" V",1)])):j("",!0),m.value.dev.telemetry.current!==void 0?(y(),$("span",TP,[E[24]||(E[24]=b("span",{class:"energy-label"},"Current",-1)),b("span",NP,U(ve(m.value.dev.telemetry.current,3))+" A",1)])):j("",!0)])])):m.value.dev.widgetType==="thermostat"?(y(),$("div",HP,[b("div",PP,[E[25]||(E[25]=b("span",{class:"thermo-label"},"Current",-1)),b("span",OP,U(ve(m.value.dev.telemetry.currentTemperature,1))+"°C",1)]),b("div",IP,[E[26]||(E[26]=b("span",{class:"thermo-label"},"Target",-1)),b("span",RP,U(ve(m.value.dev.telemetry.targetTemperature,1))+"°C ",1)]),b("div",DP,[E[27]||(E[27]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Le(["thermo-value",m.value.dev.telemetry.active?"on":"off"])},U(m.value.dev.telemetry.active?"On":"Off"),3)])])):m.value.dev.widgetType==="dehumidifier"?(y(),$("div",VP,[b("div",BP,[E[28]||(E[28]=b("span",{class:"thermo-label"},"Humidity",-1)),b("span",ZP,U(ve(m.value.dev.telemetry.currentHumidity,0))+"%",1)]),b("div",FP,[E[29]||(E[29]=b("span",{class:"thermo-label"},"Target",-1)),b("span",zP,U(ve(m.value.dev.telemetry.targetHumidity,0))+"%",1)]),b("div",UP,[E[30]||(E[30]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Le(["thermo-value",m.value.dev.telemetry.active?"on":"off"])},U(m.value.dev.telemetry.active?"On":"Off"),3)])])):(y(),$("div",WP,[Object.keys(m.value.dev.telemetry).filter(He=>!He.startsWith("_")).length===0?(y(),$("span",jP,"No telemetry yet")):j("",!0),(y(!0),$(be,null,Ve(Te(m.value.dev),([He,st])=>(y(),$("div",{key:He,class:"char-row"},[b("span",KP,U(He),1),b("span",qP,U(String(st)),1)]))),128))]))]),_:1}),m.value.dev.widgetType==="energy_meter"?(y(),fe(ye,{key:0,title:"Energy history",class:"energy-history",fluid:""},{default:ee(()=>[b("div",GP,[(y(),$(be,null,Ve(["day","month","year"],He=>b("button",{key:He,class:Le(["history-tab",{active:Me.value===He}]),onClick:st=>Me.value=He},U(He),11,YP)),64))]),re.value?(y(),$("div",XP,[X(de,{variant:"ghost",size:"xs",icon:a9,title:"Previous",onClick:E[6]||(E[6]=He=>J(-1))}),b("div",JP,[b("span",QP,[le(U(re.value.totalKwh.toFixed(2))+" ",1),E[31]||(E[31]=b("span",{class:"history-unit"},"kWh",-1))]),b("span",eO,U(re.value.date),1)]),X(de,{variant:"ghost",size:"xs",icon:Lw,title:"Next",onClick:E[7]||(E[7]=He=>J(1))})])):j("",!0),re.value&&re.value.totalKwh>0?(y(),fe(Ee,{key:1,series:N.value,height:120,"show-legend":!1,"show-tooltip":!0},null,8,["series"])):j("",!0),re.value&&re.value.totalKwh===0?(y(),$("div",tO," No consumption recorded for this period. Data accumulates every 5 minutes. ")):j("",!0),!re.value&&!D.value?(y(),$("div",iO,"No data available for this period.")):j("",!0),D.value?(y(),$("div",rO,"Loading history…")):j("",!0)]),_:1})):j("",!0),m.value.dev.interpolation&&_e.value.length>0?(y(),fe(ye,{key:1,title:"Calibration",fluid:""},{default:ee(()=>[X(ze,{modelValue:_e.value,"onUpdate:modelValue":E[8]||(E[8]=He=>_e.value=He),height:220,"input-label":m.value.dev.interpolation.inputLabel,"output-label":m.value.dev.interpolation.outputLabel,"input-min":m.value.dev.interpolation.inputMin,"input-max":m.value.dev.interpolation.inputMax,"output-min":m.value.dev.interpolation.outputMin,"output-max":m.value.dev.interpolation.outputMax,"input-step":.5,"output-step":1,"show-grid":!0,"show-tooltip":!0},null,8,["modelValue","input-label","output-label","input-min","input-max","output-min","output-max"]),E[34]||(E[34]=b("div",{class:"calibration-hint"},"Drag points to adjust. Double-click to add. Right-click to remove.",-1)),b("div",sO,[X(de,{variant:"primary",size:"sm",disabled:!ae.value||Z.value,onClick:C},{default:ee(()=>[le(U(Z.value?"Saving...":"Save"),1)]),_:1},8,["disabled"]),X(de,{variant:"ghost",size:"sm",disabled:!ae.value,onClick:V},{default:ee(()=>[...E[32]||(E[32]=[le(" Reset ",-1)])]),_:1},8,["disabled"])]),F.value?(y(),fe(ke,{key:0,status:"success",title:"Configuration saved"},{default:ee(()=>[...E[33]||(E[33]=[le(" Restart the plugin to apply the new mapping. ",-1)])]),_:1})):j("",!0)]),_:1})):m.value.dev.interpolation&&B.value?(y(),fe(ye,{key:2,title:"Calibration",fluid:""},{default:ee(()=>[...E[35]||(E[35]=[b("div",{class:"no-history"},"Loading calibration data...",-1)])]),_:1})):j("",!0),Te(m.value.dev).length>0?(y(),fe(ye,{key:3,title:"All telemetry",fluid:""},{default:ee(()=>[b("div",nO,[(y(!0),$(be,null,Ve(Te(m.value.dev),([He,st])=>(y(),$("div",{key:He,class:"char-row"},[b("span",aO,U(He),1),b("span",oO,U(String(st)),1)]))),128))])]),_:1})):j("",!0),f.value?(y(),fe(ye,{key:4,title:"HomeKit",fluid:""},{default:ee(()=>[(y(!0),$(be,null,Ve(z(f.value),He=>Bs((y(),$("div",{key:He.uuid,class:"homekit-row"},[E[36]||(E[36]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Show in HomeKit as"),b("span",{class:"homekit-hint"}," A plugin cannot know what a generic relay drives. Set it here and OpenBridge re-applies it on every restart, so the Home app stops reverting to a switch. ")],-1)),X(St,{"model-value":d(f.value.uuid,He.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":st=>g(f.value.uuid,He.uuid,String(st))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])),[[Np,h(He.uuid)]])),128)),c.value?(y(),$("div",lO,U(c.value),1)):j("",!0),b("div",cO,[E[37]||(E[37]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Expose to HomeKit"),b("span",{class:"homekit-hint"}," Hide devices the Home app cannot represent usefully. OpenBridge keeps its telemetry and history either way. ")],-1)),X(Gt,{name:`homekit-visible-${f.value.uuid}`,"model-value":s(f.value.uuid),disabled:i.value,"onUpdate:modelValue":E[9]||(E[9]=He=>a(f.value.uuid,!!He))},null,8,["name","model-value","disabled"])]),r.value?(y(),$("div",uO,U(r.value),1)):j("",!0)]),_:1})):j("",!0)],64)):m.value.kind==="hap"?(y(),$(be,{key:1},[b("div",hO,[b("div",dO,[X(R,{name:x(m.value.acc.category).icon,size:26},null,8,["name"])]),b("div",fO,[H.value?(y(),$("div",_O,[X(G,{modelValue:W.value,"onUpdate:modelValue":E[11]||(E[11]=He=>W.value=He),size:"sm",onKeyup:[E[12]||(E[12]=is(He=>K(m.value.acc.uuid),["enter"])),E[13]||(E[13]=is(He=>H.value=!1,["escape"]))]},null,8,["modelValue"]),X(de,{variant:"primary",size:"sm",icon:_s,onClick:E[14]||(E[14]=He=>K(m.value.acc.uuid))}),X(de,{variant:"ghost",size:"sm",icon:q1,onClick:E[15]||(E[15]=He=>H.value=!1)})])):(y(),$("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:E[10]||(E[10]=He=>q(m.value.acc.displayName))},U(m.value.acc.displayName),1)),b("div",pO,U(x(m.value.acc.category).label),1)])]),I(m.value.acc)?(y(),fe(ye,{key:0,title:"Device info",fluid:""},{default:ee(()=>[b("div",mO,[(y(!0),$(be,null,Ve(Object.entries(I(m.value.acc)),([He,st])=>(y(),$(be,{key:He},[st?(y(),$("span",gO,U(He),1)):j("",!0),st?(y(),$("span",vO,U(st),1)):j("",!0)],64))),128))])]),_:1})):j("",!0),(y(!0),$(be,null,Ve(z(m.value.acc),He=>(y(),fe(ye,{key:He.uuid,title:He.displayName||He.name,fluid:""},{default:ee(()=>[h(He.uuid)?(y(),$("div",bO,[E[38]||(E[38]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Show in HomeKit as"),b("span",{class:"homekit-hint"}," A plugin cannot know what a generic relay drives. Set it here and OpenBridge re-applies it on every restart, so the Home app stops reverting to a switch. ")],-1)),X(St,{"model-value":d(m.value.acc.uuid,He.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":st=>g(m.value.acc.uuid,He.uuid,String(st))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])):j("",!0),c.value?(y(),$("div",yO,U(c.value),1)):j("",!0),b("div",wO,[(y(!0),$(be,null,Ve(He.characteristics,st=>(y(),$("div",{key:st.uuid,class:"char-row"},[b("span",SO,U(st.name),1),T(st)&&st.format==="bool"?(y(),fe(Gt,{key:0,name:`hap-char-${He.uuid}-${st.uuid}`,"model-value":!!st.value,"onUpdate:modelValue":Yt=>se(m.value.acc.uuid,He.uuid,st.uuid,Yt?1:0)},null,8,["name","model-value","onUpdate:modelValue"])):(y(),$("span",{key:1,class:Le(["char-value",{on:st.format==="bool"&&st.value}])},U(O(st)),3))]))),128))])]),_:2},1032,["title"]))),128)),X(ye,{title:"HomeKit",fluid:""},{default:ee(()=>[b("div",CO,[E[39]||(E[39]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Expose to HomeKit"),b("span",{class:"homekit-hint"}," Hide devices the Home app cannot represent usefully. OpenBridge keeps its telemetry and history either way. ")],-1)),X(Gt,{name:`homekit-visible-${m.value.acc.uuid}`,"model-value":s(m.value.acc.uuid),disabled:i.value,"onUpdate:modelValue":E[16]||(E[16]=He=>a(m.value.acc.uuid,!!He))},null,8,["name","model-value","disabled"])]),r.value?(y(),$("div",AO,U(r.value),1)):j("",!0)]),_:1}),b("div",kO,"UUID: "+U(m.value.acc.uuid),1)],64)):j("",!0)])):j("",!0)}}}),LO=Zt(MO,[["__scopeId","data-v-daec39ae"]]),EO={class:"logs-filter"},xO={key:0,class:"log-empty"},$O={class:"log-time"},TO={class:"log-plugin"},NO={class:"log-msg"},x6="openbridge.logs.panelSize",HO=Oe({__name:"LiveLogsPanel",setup(e){const t=ys(),i=["collapsed","default","full"],r=ie("collapsed");_t(()=>{const c=localStorage.getItem(x6);c&&i.includes(c)&&(r.value=c)}),Fe(r,c=>localStorage.setItem(x6,c));const s=ie([]),n=ie(null),a=Q(()=>[{value:"system",label:"system"},...t.plugins.map(c=>({value:c.manifest.name,label:c.manifest.name}))]),o=Q(()=>s.value.length===0?t.logs:t.logs.filter(c=>s.value.includes(c.plugin)));function l(){t.logs.length=0}return Fe(()=>o.value.length,async()=>{const c=n.value;!c||!(c.scrollHeight-c.scrollTop-c.clientHeight<40)||(await Wi(),c.scrollTop=c.scrollHeight)}),(c,u)=>{const h=sc,d=gi,f=Gh;return y(),fe(f,{size:r.value,"onUpdate:size":u[1]||(u[1]=_=>r.value=_),title:"Live Logs"},{toolbar:ee(()=>[b("div",EO,[X(h,{modelValue:s.value,"onUpdate:modelValue":u[0]||(u[0]=_=>s.value=_),multiple:"",options:a.value,placeholder:"All plugins",size:"xs"},null,8,["modelValue","options"])]),X(d,{size:"xs",variant:"ghost",icon:ed,title:"Clear",onClick:l})]),default:ee(()=>[b("div",{ref_key:"logsEl",ref:n,class:"log-list"},[o.value.length===0?(y(),$("div",xO,"No log entries yet.")):j("",!0),(y(!0),$(be,null,Ve(o.value,(_,p)=>(y(),$("div",{key:p,class:"log-line"},[b("span",$O,U(new Date(_.timestamp).toLocaleTimeString()),1),b("span",{class:Le(["log-level",`log-level--${_.level}`])},U(_.level.toUpperCase()),3),b("span",TO,U(_.plugin),1),b("span",NO,U(_.message),1)]))),128))],512)]),_:1},8,["size"])}}}),PO=Zt(HO,[["__scopeId","data-v-2d8d29ff"]]),OO=["data-tooltip"],IO=["onClick"],RO=Oe({__name:"AppLayout",setup(e){const t=oc(),i=dl(),r=ys(),s=fl(),n=Gs(),a=lc();async function o(){await a.logout()}const l=ie([]),c=ie(!0),u=Q(()=>l.value.map(S=>{var m;return{id:S.sub,email:S.email,name:S.name,current:S.sub===((m=a.user.value)==null?void 0:m.id)}}));async function h(){const S=await a.listIdentities();l.value=S,c.value=S.length===0}function d(S){a.switchAccount(S.email)}async function f(S){await a.removeIdentity(S.id),await h()}const _=ie(null),p=ie(!1);async function A(){try{const S=await fetch("/api/updates/check");if(!S.ok)return;const m=await S.json();m.updateAvailable&&m.latest&&(_.value=m.latest)}catch{}}const g=[{name:"dashboard",icon:"house",label:"Dashboard",href:"/dashboard"},{name:"plugins",icon:"puzzle-piece",label:"Plugins",href:"/plugins"},{name:"devices",icon:"devices",label:"Devices",href:"/devices"},{name:"config",icon:"brackets-curly",label:"Config",href:"/config"},{name:"terminal",icon:"terminal",label:"Terminal",href:"/terminal"},{name:"settings",icon:"gear",label:"Settings",href:"/settings"}];return Fe(()=>t.name,()=>s.close()),_t(async()=>{await r.fetchHealth(),await r.fetchPlugins(),r.fetchLogs(),r.connectLiveLogs();const S=setInterval(()=>r.fetchHealth(),1e4);Br(()=>clearInterval(S)),A()}),Br(()=>r.disconnectLiveLogs()),(S,m)=>{const v=Io("RouterLink"),k=Ye,x=NL,M=GA,z=O4,P=Dn,I=gi,O=ec,T=Io("RouterView"),H=TL;return y(),fe(H,{"inspector-visible":oe(s).visible,"main-padding":!oe(n).fullBleed},w5({"sidebar-logo":ee(()=>[X(v,{to:"/dashboard","data-tooltip":"OpenBridge",class:"sidebar-logo"},{default:ee(()=>[...m[3]||(m[3]=[b("img",{src:Gx,width:"32",height:"32",alt:"OpenBridge logo"},null,-1)])]),_:1})]),"sidebar-nav":ee(()=>[(y(),$(be,null,Ve(g,W=>X(x,{key:W.name,to:W.href,tooltip:W.label,active:oe(t).name===W.name,onClick:lt(q=>oe(i).push(W.href),["prevent"])},{default:ee(()=>[X(k,{name:W.icon,size:18},null,8,["name"])]),_:2},1032,["to","tooltip","active","onClick"])),64))]),"sidebar-bottom":ee(()=>{var W;return[b("div",{class:Le(["daemon-status",oe(r).connected?"online":"offline"]),"data-tooltip":oe(r).connected?"Daemon connected":"Daemon offline"},[...m[4]||(m[4]=[b("span",{class:"daemon-dot"},null,-1)])],10,OO),(W=oe(a).config.value)!=null&&W.enabled&&oe(a).user.value?(y(),fe(M,{key:0,user:{email:oe(a).user.value.email},accounts:u.value,"accounts-unknown":c.value,"show-profile":!1,onOpen:h,onSwitch:d,onSwitchAccount:m[0]||(m[0]=q=>oe(a).chooseAccount()),onAddAccount:m[1]||(m[1]=q=>oe(a).addAccount()),onRemove:f,onSignOut:o},{default:ee(({close:q})=>[b("button",{type:"button",role:"menuitem",class:"nb-user-menu__action nb-user-menu__action--danger",onClick:K=>(q(),oe(a).logoutEverywhere())},[X(k,{name:oe(um),size:15},null,8,["name"]),m[5]||(m[5]=le(" Sign out of all apps ",-1))],8,IO)]),_:1},8,["user","accounts","accounts-unknown"])):j("",!0)]}),"topbar-left":ee(()=>[X(z,{subtitle:oe(n).title},null,8,["subtitle"]),oe(n).count!==null?(y(),fe(P,{key:0},{default:ee(()=>[le(U(oe(n).count),1)]),_:1})):j("",!0),m[6]||(m[6]=b("div",{id:"ob-topbar-left",class:"topbar-slot"},null,-1))]),"topbar-right":ee(()=>[m[7]||(m[7]=b("div",{id:"ob-topbar-right",class:"topbar-slot"},null,-1))]),inspector:ee(()=>[oe(s).mode==="plugin"?(y(),fe(_H,{key:0})):oe(s).mode==="marketplace"?(y(),fe(dP,{key:1})):oe(s).mode==="device"?(y(),fe(LO,{key:2})):j("",!0)]),bottom:ee(()=>[X(PO)]),default:ee(()=>[X(T)]),_:2},[_.value&&!p.value?{name:"notification",fn:ee(()=>[X(O,{status:"info",icon:Qh,flush:"",dismissible:"",title:`OpenBridge v${_.value} is available`,onDismiss:m[2]||(m[2]=W=>p.value=!0)},{action:ee(()=>[X(I,{variant:"ghost",size:"sm",href:"https://github.com/nubisco/openbridge/releases",target:"_blank",rel:"noopener"},{default:ee(()=>[...m[8]||(m[8]=[le(" See what's new ",-1)])]),_:1})]),_:1},8,["title"])]),key:"0"}:void 0]),1032,["inspector-visible","main-padding"])}}}),DO=Zt(RO,[["__scopeId","data-v-55c2d154"]]),VO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},BO=VO("qr-code","0 0 256 256",'<path d="M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm0,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48ZM200,40H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-64,72V144a8,8,0,0,1,16,0v32a8,8,0,0,1-16,0Zm80-16a8,8,0,0,1-8,8H184v40a8,8,0,0,1-8,8H144a8,8,0,0,1,0-16h24V144a8,8,0,0,1,16,0v8h24A8,8,0,0,1,216,160Zm0,32v16a8,8,0,0,1-16,0V192a8,8,0,0,1,16,0Z"/>'),ZO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},FO=ZO("cpu","0 0 256 256",'<path d="M152,96H104a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V104A8,8,0,0,0,152,96Zm-8,48H112V112h32Zm88,0H216V112h16a8,8,0,0,0,0-16H216V56a16,16,0,0,0-16-16H160V24a8,8,0,0,0-16,0V40H112V24a8,8,0,0,0-16,0V40H56A16,16,0,0,0,40,56V96H24a8,8,0,0,0,0,16H40v32H24a8,8,0,0,0,0,16H40v40a16,16,0,0,0,16,16H96v16a8,8,0,0,0,16,0V216h32v16a8,8,0,0,0,16,0V216h40a16,16,0,0,0,16-16V160h16a8,8,0,0,0,0-16Zm-32,56H56V56H200v95.87s0,.09,0,.13,0,.09,0,.13V200Z"/>'),zO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},UO=zO("database","0 0 256 256",'<path d="M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"/>'),WO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},jO=WO("clock","0 0 256 256",'<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z"/>'),la=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},KO=la("pulse","0 0 256 256",'<path d="M236,128a4,4,0,0,1-4,4H202.47l-38.89,77.79A4,4,0,0,1,160,212h-.2a4,4,0,0,1-3.54-2.58l-60.59-159-36,79.28A4,4,0,0,1,56,132H24a4,4,0,0,1,0-8H53.42L92.36,38.35a4,4,0,0,1,7.38.23L160.5,198.06l35.92-71.85A4,4,0,0,1,200,124h32A4,4,0,0,1,236,128Z"/>'),qO=la("pulse","0 0 256 256",'<path d="M238,128a6,6,0,0,1-6,6H203.71l-38.34,76.68A6,6,0,0,1,160,214h-.3a6,6,0,0,1-5.31-3.85L95.51,55.57,61.46,130.48A6,6,0,0,1,56,134H24a6,6,0,0,1,0-12H52.14l38.4-84.48a6,6,0,0,1,11.07.34L160.74,193.1l33.89-67.78A6,6,0,0,1,200,122h32A6,6,0,0,1,238,128Z"/>'),bu=la("pulse","0 0 256 256",'<path d="M240,128a8,8,0,0,1-8,8H204.94l-37.78,75.58A8,8,0,0,1,160,216h-.4a8,8,0,0,1-7.08-5.14L95.35,60.76,63.28,131.31A8,8,0,0,1,56,136H24a8,8,0,0,1,0-16H50.85L88.72,36.69a8,8,0,0,1,14.76.46l57.51,151,31.85-63.71A8,8,0,0,1,200,120h32A8,8,0,0,1,240,128Z"/>'),GO=la("pulse","0 0 256 256",'<path d="M244,128a12,12,0,0,1-12,12H207.42l-36.69,73.37A12,12,0,0,1,160,220h-.6a12,12,0,0,1-10.61-7.72L95,71.15,66.92,133A12,12,0,0,1,56,140H24a12,12,0,0,1,0-24H48.27L85.08,35a12,12,0,0,1,22.13.7l54.28,142.46,27.78-55.56A12,12,0,0,1,200,116h32A12,12,0,0,1,244,128Z"/>'),YO=la("pulse","0 0 256 256",'<path d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm-8,96H188.64L159,188a8,8,0,0,1-6.95,4h-.46a8,8,0,0,1-6.89-4.84L103,89.92,79,132a8,8,0,0,1-7,4H48a8,8,0,0,1,0-16H67.36L97.05,68a8,8,0,0,1,14.3.82L153,166.08l24-42.05a8,8,0,0,1,6.95-4h24a8,8,0,0,1,0,16Z"/>'),XO=la("pulse","0 0 256 256",'<path d="M96,40l33.52,88H56Zm104,88H129.52L160,208Z" opacity="0.2"/><path d="M240,128a8,8,0,0,1-8,8H204.94l-37.78,75.58A8,8,0,0,1,160,216h-.4a8,8,0,0,1-7.08-5.14L95.35,60.76,63.28,131.31A8,8,0,0,1,56,136H24a8,8,0,0,1,0-16H50.85L88.72,36.69a8,8,0,0,1,14.76.46l57.51,151,31.85-63.71A8,8,0,0,1,200,120h32A8,8,0,0,1,240,128Z"/>'),JO="pulse",QO=Object.freeze(Object.defineProperty({__proto__:null,bold:GO,default:bu,duotone:XO,fill:YO,glyphName:JO,light:qO,regular:bu,thin:KO},Symbol.toStringTag,{value:"Module"})),eI={class:"dashboard"},tI={class:"top-row"},iI={class:"hk-body"},rI={key:0,class:"qr-wrap"},sI=["src"],nI={key:1,class:"qr-placeholder"},aI={class:"hk-details"},oI={key:0,class:"pin-display"},lI={key:1,class:"pin-label"},cI={class:"hk-status"},uI={key:0,class:"sys-grid"},hI={class:"sys-val"},dI={class:"sys-val"},fI={class:"sys-val"},_I={class:"sys-val"},pI={class:"sys-val"},mI={class:"sys-val"},gI={class:"sys-val"},vI={class:"sys-val mono"},bI={class:"sys-val mono"},yI={class:"sys-val mono"},wI={key:1,class:"loading-inline"},SI={class:"card-title"},CI={class:"plugins-counts"},AI={key:0,class:"pill red"},kI={key:0,class:"empty-inline"},MI={key:1,class:"plugins-list"},LI={class:"plugin-name"},EI={class:"plugin-ver"},xI={class:"metrics-row"},$I={class:"metric-header"},TI={class:"metric-icon purple"},NI={class:"metric-values"},HI={class:"metric-big"},PI={key:0,class:"metric-sub"},OI={class:"metric-chart"},II={class:"metric-header"},RI={class:"metric-icon blue"},DI={class:"metric-values"},VI={class:"metric-big"},BI={class:"metric-sub"},ZI={class:"metric-chart"},FI={class:"metric-header"},zI={class:"metric-icon green"},UI={class:"uptime-rows"},WI={class:"uptime-row"},jI={class:"uptime-val"},KI={class:"uptime-row"},qI={class:"uptime-val"},GI={style:{"margin-top":"0.75rem"}},YI={class:"metric-header"},XI={class:"metric-icon amber"},JI={class:"net-values"},QI={class:"net-val"},eR={class:"net-val"},tR={class:"metric-chart net-charts"},iR=Oe({__name:"DashboardView",setup(e){const t=ys(),i=Gs();function r(P){return P==="running"?"green":P==="error"?"red":P==="loading"?"blue":"grey"}const s=ie(!1),n=ie(!1);async function a(){if(!s.value){s.value=!0,n.value=!1;try{await Pe.daemon.restart(),n.value=!0;let P=0;const I=setInterval(async()=>{P++;try{await Pe.health(),clearInterval(I),location.reload()}catch{}P>60&&(clearInterval(I),s.value=!1)},1e3)}catch{s.value=!1}}}const o=ie(null),l=ie(""),c=ie(""),u=ie([]),h=ie([]),d=ie([]),f=ie([]),_=Vr(null);let p=null;function A(){p&&(p.onclose=null,p.close(),p=null);const P=location.protocol==="https:"?"wss:":"ws:";p=new WebSocket(`${P}//${location.host}/ws/metrics`),p.onmessage=I=>{if(!document.hidden)try{const O=JSON.parse(I.data);if(O.type==="history"){const T=O.data;u.value=T.map(H=>H.cpu),h.value=T.map(H=>m(H)),d.value=T.map(H=>H.netRxSec),f.value=T.map(H=>H.netTxSec),T.length&&(_.value=T[T.length-1])}else if(O.type==="snapshot"){const T=O.data;_.value=T,S(u,T.cpu),S(h,m(T)),S(d,T.netRxSec),S(f,T.netTxSec)}}catch{}},p.onclose=()=>{p=null,setTimeout(A,3e3)}}function g(){document.hidden||A()}function S(P,I){P.value=[...P.value.slice(-59),I]}function m(P){return P.memTotal?Math.round((P.memTotal-P.memFree)/P.memTotal*100):0}function v(P){return P<1024?`${P} B`:P<1024**2?`${(P/1024).toFixed(1)} KB`:P<1024**3?`${(P/1024**2).toFixed(1)} MB`:`${(P/1024**3).toFixed(1)} GB`}function k(P){const I=Math.floor(P/86400),O=Math.floor(P%86400/3600),T=Math.floor(P%3600/60);return I>0?`${I}d ${O}h`:O>0?`${O}h ${T}m`:`${T}m`}const x=Q(()=>_.value?v(_.value.memTotal-_.value.memFree):"—"),M=Q(()=>_.value?v(_.value.memTotal):"—"),z=Q(()=>_.value?m(_.value):0);return _t(async()=>{i.setPage("Dashboard"),t.fetchPlugins();try{o.value=await Pe.system()}catch{}try{const P=await Pe.qr();P.setupURI&&(c.value=P.pincode??"",l.value=await oa.toDataURL(P.setupURI,{width:148,margin:1,color:{dark:"#000000",light:"#ffffff"}}))}catch{}A(),document.addEventListener("visibilitychange",g)}),Br(()=>{p==null||p.close(),p=null,document.removeEventListener("visibilitychange",g)}),(P,I)=>{const O=Ye,T=hl,H=Dn,W=hE,q=mm,K=gi;return y(),$("div",eI,[b("div",tI,[X(T,{class:"hk-card"},{default:ee(()=>[I[1]||(I[1]=b("div",{class:"card-title"},"HomeKit Pairing",-1)),b("div",iI,[l.value?(y(),$("div",rI,[b("img",{src:l.value,alt:"HomeKit QR Code",class:"qr-img"},null,8,sI)])):(y(),$("div",nI,[X(O,{name:oe(BO),size:48},null,8,["name"]),I[0]||(I[0]=b("span",null,"No HAP bridge configured",-1))])),b("div",aI,[c.value?(y(),$("div",oI,U(c.value),1)):j("",!0),c.value?(y(),$("div",lI,"Scan to add to HomeKit")):j("",!0),b("div",cI,[b("span",{class:Le(["dot",oe(t).connected?"green":"gray"])},null,2),le(" "+U(oe(t).connected?"Bridge running":"Bridge offline"),1)])])])]),_:1}),X(T,{class:"sys-card"},{default:ee(()=>{var se;return[I[13]||(I[13]=b("div",{class:"card-title"},"System Information",-1)),o.value?(y(),$("div",uI,[I[2]||(I[2]=b("span",{class:"sys-key"},"OS",-1)),b("span",hI,U(o.value.os),1),I[3]||(I[3]=b("span",{class:"sys-key"},"Arch",-1)),b("span",dI,U(o.value.arch),1),I[4]||(I[4]=b("span",{class:"sys-key"},"Hostname",-1)),b("span",fI,U(o.value.hostname),1),I[5]||(I[5]=b("span",{class:"sys-key"},"IP Address",-1)),b("span",_I,U(o.value.ip),1),I[6]||(I[6]=b("span",{class:"sys-key"},"User",-1)),b("span",pI,U(o.value.user),1),I[7]||(I[7]=b("span",{class:"sys-key"},"Node.js",-1)),b("span",mI,U(o.value.nodeVersion),1),I[8]||(I[8]=b("span",{class:"sys-key"},"OpenBridge",-1)),b("span",gI,"v"+U(((se=oe(t).health)==null?void 0:se.version)??"—"),1),I[9]||(I[9]=b("span",{class:"sys-key"},"Config",-1)),b("span",vI,U(o.value.configPath),1),I[10]||(I[10]=b("span",{class:"sys-key"},"OB plugins",-1)),b("span",bI,U(o.value.obPluginsDir),1),I[11]||(I[11]=b("span",{class:"sys-key"},"HB plugins",-1)),b("span",yI,U(o.value.hbPluginsDir),1)])):(y(),$("div",wI,[X(O,{name:oe(Ln),size:16},null,8,["name"]),I[12]||(I[12]=le(" Loading... ",-1))]))]}),_:1}),X(T,{class:"plugins-card"},{default:ee(()=>[b("div",SI,[I[14]||(I[14]=le(" Plugins ",-1)),b("span",CI,[X(H,{variant:"green"},{default:ee(()=>[le(U(oe(t).runningCount)+" running",1)]),_:1}),oe(t).errorCount?(y(),$("span",AI,U(oe(t).errorCount)+" error",1)):j("",!0)])]),oe(t).plugins.length===0?(y(),$("div",kI,"No plugins loaded yet.")):(y(),$("div",MI,[(y(!0),$(be,null,Ve(oe(t).plugins,se=>(y(),$("div",{key:se.id,class:"plugin-row"},[b("div",{class:Le(["plugin-dot",se.status])},null,2),b("span",LI,U(se.manifest.name),1),b("span",EI,"v"+U(se.manifest.version),1),se.source==="homebridge"?(y(),fe(H,{key:0,variant:"orange",size:"sm"},{default:ee(()=>[...I[15]||(I[15]=[le("HB",-1)])]),_:1})):j("",!0),X(H,{variant:r(se.status),size:"sm"},{default:ee(()=>[le(U(se.status),1)]),_:2},1032,["variant"])]))),128))]))]),_:1})]),b("div",xI,[X(T,{class:"metric-card"},{default:ee(()=>{var se,ce;return[b("div",$I,[b("div",TI,[X(O,{name:oe(FO),size:13},null,8,["name"])]),I[16]||(I[16]=b("span",{class:"metric-title"},"CPU",-1))]),b("div",NI,[b("div",HI,[le(U(((se=_.value)==null?void 0:se.cpu)??"—")+" ",1),I[17]||(I[17]=b("span",{class:"metric-unit"},"%",-1))]),(ce=_.value)!=null&&ce.cpuTemp&&_.value.cpuTemp>0?(y(),$("div",PI,U(_.value.cpuTemp)+"°C",1)):j("",!0)]),b("div",OI,[X(W,{data:u.value,color:"var(--nb-c-primary)",height:40},null,8,["data"])])]}),_:1}),X(T,{class:"metric-card"},{default:ee(()=>[b("div",II,[b("div",RI,[X(O,{name:oe(UO),size:13},null,8,["name"])]),I[18]||(I[18]=b("span",{class:"metric-title"},"Memory",-1))]),b("div",DI,[b("div",VI,[le(U(z.value)+" ",1),I[19]||(I[19]=b("span",{class:"metric-unit"},"%",-1))]),b("div",BI,U(x.value)+" / "+U(M.value),1)]),X(q,{value:z.value,max:100,size:"sm"},null,8,["value"]),b("div",ZI,[X(W,{data:h.value,color:"var(--nb-c-info)",height:32},null,8,["data"])])]),_:1}),X(T,{class:"metric-card"},{default:ee(()=>[b("div",FI,[b("div",zI,[X(O,{name:oe(jO),size:13},null,8,["name"])]),I[20]||(I[20]=b("span",{class:"metric-title"},"Uptime",-1))]),b("div",UI,[b("div",WI,[b("span",jI,U(o.value?k(o.value.uptimeSystem):"—"),1),I[21]||(I[21]=b("span",{class:"uptime-label"},"System",-1))]),I[23]||(I[23]=b("div",{class:"uptime-divider"},null,-1)),b("div",KI,[b("span",qI,U(o.value?k(o.value.uptimeProcess):"—"),1),I[22]||(I[22]=b("span",{class:"uptime-label"},"Process",-1))])]),b("div",GI,[X(K,{variant:"secondary",size:"sm",outlined:"",style:{width:"100%","justify-content":"center"},loading:s.value,icon:n.value?_s:s.value?Jo:Fs,onClick:a},{default:ee(()=>[le(U(n.value?"Restarted":s.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])])]),_:1}),X(T,{class:"metric-card net-card"},{default:ee(()=>[b("div",YI,[b("div",XI,[X(O,{name:oe(bu),size:13},null,8,["name"])]),I[24]||(I[24]=b("span",{class:"metric-title"},"Network",-1))]),b("div",JI,[b("div",null,[b("div",QI,U(_.value?v(_.value.netRxSec)+"/s":"—"),1),I[25]||(I[25]=b("div",{class:"net-label"},"↓ Received",-1))]),b("div",null,[b("div",eR,U(_.value?v(_.value.netTxSec)+"/s":"—"),1),I[26]||(I[26]=b("div",{class:"net-label"},"↑ Sent",-1))])]),b("div",tR,[X(W,{data:d.value,color:"var(--nb-c-success)",height:28},null,8,["data"]),X(W,{data:f.value,color:"var(--nb-c-warning)",height:28},null,8,["data"])])]),_:1})])])}}}),rR=Zt(iR,[["__scopeId","data-v-e710391e"]]),ca=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},sR=ca("arrow-clockwise","0 0 256 256",'<path d="M236,56v48a4,4,0,0,1-4,4H184a4,4,0,0,1,0-8h37.7L187.53,68.69l-.13-.12a84,84,0,1,0-1.75,120.51,4,4,0,0,1,5.5,5.82A91.43,91.43,0,0,1,128,220h-1.26A92,92,0,1,1,193,62.84l35,32.05V56a4,4,0,1,1,8,0Z"/>'),nR=ca("arrow-clockwise","0 0 256 256",'<path d="M238,56v48a6,6,0,0,1-6,6H184a6,6,0,0,1,0-12h32.55l-30.38-27.8c-.06-.06-.12-.13-.19-.19a82,82,0,1,0-1.7,117.65,6,6,0,0,1,8.24,8.73A93.46,93.46,0,0,1,128,222h-1.28A94,94,0,1,1,194.37,61.4L226,90.35V56a6,6,0,1,1,12,0Z"/>'),$6=ca("arrow-clockwise","0 0 256 256",'<path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z"/>'),aR=ca("arrow-clockwise","0 0 256 256",'<path d="M244,56v48a12,12,0,0,1-12,12H184a12,12,0,1,1,0-24H201.1l-19-17.38c-.13-.12-.26-.24-.38-.37A76,76,0,1,0,127,204h1a75.53,75.53,0,0,0,52.15-20.72,12,12,0,0,1,16.49,17.45A99.45,99.45,0,0,1,128,228h-1.37A100,100,0,1,1,198.51,57.06L220,76.72V56a12,12,0,0,1,24,0Z"/>'),oR=ca("arrow-clockwise","0 0 256 256",'<path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1-5.66-13.66l17-17-10.55-9.65-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,1,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60l10.93,10L226.34,50.3A8,8,0,0,1,240,56Z"/>'),lR=ca("arrow-clockwise","0 0 256 256",'<path d="M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z" opacity="0.2"/><path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z"/>'),cR="arrow-clockwise",uR=Object.freeze(Object.defineProperty({__proto__:null,bold:aR,default:$6,duotone:lR,fill:oR,glyphName:cR,light:nR,regular:$6,thin:sR},Symbol.toStringTag,{value:"Module"})),og=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),ua=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},hR=ua("list","0 0 256 256",'<path d="M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM40,68H216a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8ZM216,188H40a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Z"/>'),dR=ua("list","0 0 256 256",'<path d="M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM40,70H216a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12ZM216,186H40a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Z"/>'),T6=ua("list","0 0 256 256",'<path d="M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"/>'),fR=ua("list","0 0 256 256",'<path d="M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM40,76H216a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24ZM216,180H40a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Z"/>'),_R=ua("list","0 0 256 256",'<path d="M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM192,184H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z"/>'),pR=ua("list","0 0 256 256",'<path d="M216,64V192H40V64Z" opacity="0.2"/><path d="M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"/>'),mR="list",lg=Object.freeze(Object.defineProperty({__proto__:null,bold:fR,default:T6,duotone:pR,fill:_R,glyphName:mR,light:dR,regular:T6,thin:hR},Symbol.toStringTag,{value:"Module"})),ha=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},gR=ha("squares-four","0 0 256 256",'<path d="M104,44H56A12,12,0,0,0,44,56v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,104,44Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4ZM104,140H56a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,104,140Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,200,140Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Z"/>'),vR=ha("squares-four","0 0 256 256",'<path d="M104,42H56A14,14,0,0,0,42,56v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,104,42Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm-98,34H56a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,104,138Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,200,138Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Z"/>'),N6=ha("squares-four","0 0 256 256",'<path d="M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48Z"/>'),bR=ha("squares-four","0 0 256 256",'<path d="M100,36H56A20,20,0,0,0,36,56v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,100,36ZM96,96H60V60H96ZM200,36H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,60H160V60h36Zm-96,40H56a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,100,136Zm-4,60H60V160H96Zm104-60H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,200,136Zm-4,60H160V160h36Z"/>'),yR=ha("squares-four","0 0 256 256",'<path d="M120,56v48a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40h48A16,16,0,0,1,120,56Zm80-16H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm-96,96H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm96,0H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Z"/>'),wR=ha("squares-four","0 0 256 256",'<path d="M112,56v48a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h48A8,8,0,0,1,112,56Zm88-8H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V56A8,8,0,0,0,200,48Zm-96,96H56a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,104,144Zm96,0H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,200,144Z" opacity="0.2"/><path d="M200,136H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48ZM104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Z"/>'),SR="squares-four",cg=Object.freeze(Object.defineProperty({__proto__:null,bold:bR,default:N6,duotone:wR,fill:yR,glyphName:SR,light:vR,regular:N6,thin:gR},Symbol.toStringTag,{value:"Module"})),CR={key:0,class:"plugin-cards"},AR={class:"plugin-avatar"},kR=["src","alt"],MR={class:"plugin-meta"},LR={class:"plugin-name"},ER={key:0,class:"plugin-platform"},xR={class:"plugin-version"},$R={key:0,class:"plugin-desc"},TR={key:1,class:"plugin-author"},NR={key:2,class:"plugin-links"},HR=["href"],PR=["href"],OR={key:3,class:"plugin-error"},IR={class:"cell-name"},RR={class:"plugin-avatar plugin-avatar--sm"},DR=["src","alt"],VR={class:"plugin-name"},BR={key:0,class:"plugin-platform"},ZR=Oe({__name:"PluginList",props:{rows:{},view:{},selectedId:{}},emits:["select"],setup(e,{emit:t}){const i=e,r=t;function s(l){return l==="running"?"green":l==="error"?"red":l==="loading"?"blue":"grey"}const n=ie({key:"name",direction:"asc"}),a=[{key:"name",header:"Plugin",sortable:!0},{key:"version",header:"Version",sortable:!0,width:140},{key:"source",header:"Source",sortable:!0,width:120},{key:"status",header:"Status",sortable:!0,width:120},{key:"author",header:"Author",sortable:!0}],o=Q(()=>{const l=i.rows.map(h=>({id:h.plugin.id,name:h.plugin.manifest.name,version:`v${h.plugin.manifest.version}`,availableUpdate:h.plugin.availableUpdate,source:h.plugin.source==="homebridge"?"Homebridge":"Native",status:h.plugin.status,author:h.plugin.manifest.author??"—",platform:h.plugin.source==="homebridge"?h.plugin.platformName:void 0,avatarUrl:h.avatarUrl,isOpenBridge:h.isOpenBridge,plugin:h.plugin})),c=n.value;if(!c||c.direction==="none")return l;const u=c.direction==="asc"?1:-1;return[...l].sort((h,d)=>u*String(h[c.key]??"").localeCompare(String(d[c.key]??"")))});return(l,c)=>{const u=Ye,h=Dn,d=$r,f=hl,_=hm;return e.view==="cards"?(y(),$("div",CR,[(y(!0),$(be,null,Ve(e.rows,p=>(y(),fe(f,{key:p.plugin.id,class:Le(["plugin-card",{"plugin-card--selected":p.plugin.id===e.selectedId}]),onClick:A=>r("select",p.plugin)},{default:ee(()=>[b("span",{class:Le(["plugin-card__accent",`plugin-card__accent--${p.plugin.status}`])},null,2),X(d,{dir:"row",align:"start",gap:"sm",class:"plugin-card__header"},{default:ee(()=>[b("div",AR,[p.avatarUrl?(y(),$("img",{key:0,src:p.avatarUrl,alt:p.plugin.manifest.name,onError:c[0]||(c[0]=A=>A.target.style.display="none")},null,40,kR)):(y(),fe(u,{key:1,name:p.isOpenBridge?oe(un):oe(Ws),size:20},null,8,["name"]))]),b("div",MR,[b("div",LR,U(p.plugin.manifest.name),1),p.plugin.source==="homebridge"&&p.plugin.platformName?(y(),$("div",ER," Platform: "+U(p.plugin.platformName),1)):j("",!0),b("div",xR,[le(" v"+U(p.plugin.manifest.version)+" ",1),p.plugin.availableUpdate?(y(),fe(h,{key:0,variant:"blue",size:"sm"},{default:ee(()=>[le(" v"+U(p.plugin.availableUpdate)+" available ",1)]),_:2},1024)):j("",!0)])]),X(h,{variant:s(p.plugin.status)},{default:ee(()=>[le(U(p.plugin.status),1)]),_:2},1032,["variant"])]),_:2},1024),p.plugin.manifest.description?(y(),$("p",$R,U(p.plugin.manifest.description),1)):j("",!0),p.plugin.manifest.author?(y(),$("p",TR,"by "+U(p.plugin.manifest.author),1)):j("",!0),p.sponsorUrl||p.docsUrl?(y(),$("div",NR,[p.sponsorUrl?(y(),$("a",{key:0,href:p.sponsorUrl,target:"_blank",rel:"noopener",onClick:c[1]||(c[1]=lt(()=>{},["stop"]))},[X(u,{name:oe(sg),weight:"fill",size:11},null,8,["name"]),c[6]||(c[6]=le(" Sponsor ",-1))],8,HR)):j("",!0),p.docsUrl?(y(),$("a",{key:1,href:p.docsUrl,target:"_blank",rel:"noopener",onClick:c[2]||(c[2]=lt(()=>{},["stop"]))},[X(u,{name:oe(ng),size:11},null,8,["name"]),c[7]||(c[7]=le(" Docs ",-1))],8,PR)):j("",!0)])):j("",!0),p.plugin.error?(y(),$("div",OR,U(p.plugin.error),1)):j("",!0)]),_:2},1032,["class","onClick"]))),128))])):(y(),fe(_,{key:1,columns:a,rows:o.value,"row-key":"id",size:"sm",zebra:"","sort-state":n.value,onSort:c[4]||(c[4]=p=>n.value=p),onRowClick:c[5]||(c[5]=p=>r("select",p.plugin))},{"cell-name":ee(({row:p})=>[b("div",IR,[b("div",RR,[p.avatarUrl?(y(),$("img",{key:0,src:p.avatarUrl,alt:p.name,onError:c[3]||(c[3]=A=>A.target.style.display="none")},null,40,DR)):(y(),fe(u,{key:1,name:p.isOpenBridge?oe(un):oe(Ws),size:14},null,8,["name"]))]),b("div",null,[b("div",VR,U(p.name),1),p.platform?(y(),$("div",BR,"Platform: "+U(p.platform),1)):j("",!0)])])]),"cell-version":ee(({row:p})=>[le(U(p.version)+" ",1),p.availableUpdate?(y(),fe(h,{key:0,variant:"blue",size:"sm"},{default:ee(()=>[le("v"+U(p.availableUpdate),1)]),_:2},1024)):j("",!0)]),"cell-status":ee(({row:p})=>[X(h,{variant:s(p.status)},{default:ee(()=>[le(U(p.status),1)]),_:2},1032,["variant"])]),_:1},8,["rows","sort-state"]))}}}),FR=Zt(ZR,[["__scopeId","data-v-8fdf7ec9"]]),zR={class:"plugins-view"},UR={key:0,class:"empty-state"},WR={key:0},H6="openbridge.plugins.view",jR=Oe({__name:"PluginsView",setup(e){const t=ys(),i=fl(),r=Gs(),s=ag(),n=ie(""),a=ie(new Map),o=ie(new Set),l=ie(!1),c=ie(localStorage.getItem(H6)==="table"?"table":"cards");function u(){c.value=c.value==="cards"?"table":"cards",localStorage.setItem(H6,c.value)}const h=Q(()=>{var P;return i.visible&&i.mode==="plugin"?((P=i.selectedPlugin)==null?void 0:P.id)??null:null}),d=Q(()=>p().map(P=>{const I=S(P);return{plugin:P,avatarUrl:x(P),isOpenBridge:g(P),sponsorUrl:I==null?void 0:I.githubSponsorsUrl,docsUrl:I==null?void 0:I.documentationUrl}}));function f(P){if(P.source==="homebridge"){const O=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/);if(O!=null&&O[1])return O[1]}return P.manifest.name}function _(P){var H;const O=(H=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/))==null?void 0:H[1],T=[f(P),O,P.manifest.name,P.id];return Array.from(new Set(T.filter(W=>!!W&&W.trim().length>0)))}function p(){const P=n.value.toLowerCase();return t.plugins.filter(I=>I.manifest.name.toLowerCase().includes(P)||(I.manifest.description??"").toLowerCase().includes(P))}function A(P){var I;((I=i.selectedPlugin)==null?void 0:I.id)===P.id&&i.visible&&i.mode==="plugin"?i.close():i.openPlugin(P)}function g(P){return P.manifest.name.includes("openbridge-")||P.source==="native"}function S(P){const I=_(P);for(const O of I){const T=a.value.get(O);if(T)return T}if(P.enrichedMetadata)return P.enrichedMetadata}async function m(P,I=!1){var T;const O=_(P);for(const H of O)if(!(!I&&a.value.has(H))&&!(!I&&o.value.has(H))){o.value.add(H);try{const W=await Pe.marketplace.enriched(H),q=new Map(a.value);if(q.set(H,W),q.set(f(P),W),a.value=q,P.enrichedMetadata=W,W.documentationUrl||W.githubSponsorsUrl||(T=W.links)!=null&&T.repository)return}catch{}finally{const W=new Set(o.value);W.delete(H),o.value=W}}}const v=ie(new Map);function k(P){const O=P.trim().replace(/^github:/,"https://github.com/").replace(/^git\+/,"").replace(/^git@github\.com:/,"https://github.com/").match(/github\.com[/:]([^/]+)/);return O?`https://github.com/${O[1]}.png?size=48`:null}function x(P){var H,W;const I=S(P),O=((H=I==null?void 0:I.links)==null?void 0:H.repository)??((W=I==null?void 0:I.links)==null?void 0:W.homepage)??"";if(O){const q=k(O);if(q)return q}const T=_(P);for(const q of T){const K=v.value.get(q);if(K)return K}return null}async function M(P,I=!1){var O;if(!(!I&&v.value.has(P)))try{const T=await fetch(`https://registry.npmjs.org/${encodeURIComponent(P)}/latest`,{signal:AbortSignal.timeout(5e3)});if(!T.ok){v.value.set(P,"");return}const H=await T.json(),W=((O=H==null?void 0:H.repository)==null?void 0:O.url)??(H==null?void 0:H.homepage)??"";v.value.set(P,k(W)??"")}catch{v.value.set(P,"")}}async function z(P=!1){if(!l.value){l.value=!0;try{P&&(a.value=new Map,v.value=new Map);const I=t.plugins;for(const O of I){const T=_(O);for(const H of T)await M(H,P);await m(O,P)}P&&s.success("Plugin metadata refreshed")}catch{s.error("Failed to refresh plugin metadata")}finally{l.value=!1}}}return _t(async()=>{await t.fetchPlugins()}),Fe(()=>t.plugins.length,P=>{r.setPage("Plugins",P)},{immediate:!0}),(P,I)=>{const O=ul,T=gi,H=Ye;return y(),$("div",zR,[(y(),fe(Or,{defer:"",to:"#ob-topbar-right"},[X(O,{modelValue:n.value,"onUpdate:modelValue":I[0]||(I[0]=W=>n.value=W),placeholder:"Search plugins...",size:"sm",style:{width:"200px"}},null,8,["modelValue"]),X(T,{variant:"ghost",size:"sm",icon:uR,title:"Refresh metadata",loading:l.value,disabled:l.value,onClick:I[1]||(I[1]=W=>z(!0))},null,8,["loading","disabled"]),X(T,{variant:"ghost",size:"sm",icon:c.value===og?lg:cg,title:c.value==="cards"?"Show as table":"Show as cards",onClick:u},null,8,["icon","title"]),X(T,{variant:"primary",size:"sm",icon:of,onClick:I[2]||(I[2]=W=>oe(i).openMarketplace())},{default:ee(()=>[...I[5]||(I[5]=[le(" Browse plugins ",-1)])]),_:1})])),d.value.length===0?(y(),$("div",UR,[X(H,{name:oe(Ws),size:40},null,8,["name"]),n.value?(y(),$("p",WR,'No plugins matching "'+U(n.value)+'"',1)):(y(),$(be,{key:1},[I[7]||(I[7]=b("p",null,"No plugins loaded yet.",-1)),X(T,{variant:"primary",size:"sm",icon:of,onClick:I[3]||(I[3]=W=>oe(i).openMarketplace())},{default:ee(()=>[...I[6]||(I[6]=[le(" Browse & install plugins ",-1)])]),_:1})],64))])):(y(),$("div",{key:1,class:"plugins-body",onClick:I[4]||(I[4]=lt(W=>oe(i).close(),["self"]))},[X(FR,{rows:d.value,view:c.value,"selected-id":h.value,onSelect:A},null,8,["rows","view","selected-id"])]))])}}}),KR=Zt(jR,[["__scopeId","data-v-95e3ebc4"]]),da=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},qR=da("devices","0 0 256 256",'<path d="M224,76H204V64a20,20,0,0,0-20-20H40A20,20,0,0,0,20,64v96a20,20,0,0,0,20,20H156v12a20,20,0,0,0,20,20h48a20,20,0,0,0,20-20V96A20,20,0,0,0,224,76ZM40,172a12,12,0,0,1-12-12V64A12,12,0,0,1,40,52H184a12,12,0,0,1,12,12V76H176a20,20,0,0,0-20,20v76Zm196,20a12,12,0,0,1-12,12H176a12,12,0,0,1-12-12V96a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12ZM132,208a4,4,0,0,1-4,4H88a4,4,0,0,1,0-8h40A4,4,0,0,1,132,208Zm80-96a4,4,0,0,1-4,4H192a4,4,0,0,1,0-8h16A4,4,0,0,1,212,112Z"/>'),GR=da("devices","0 0 256 256",'<path d="M224,74H206V64a22,22,0,0,0-22-22H40A22,22,0,0,0,18,64v96a22,22,0,0,0,22,22H154v10a22,22,0,0,0,22,22h48a22,22,0,0,0,22-22V96A22,22,0,0,0,224,74ZM40,170a10,10,0,0,1-10-10V64A10,10,0,0,1,40,54H184a10,10,0,0,1,10,10V74H176a22,22,0,0,0-22,22v74Zm194,22a10,10,0,0,1-10,10H176a10,10,0,0,1-10-10V96a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10ZM134,208a6,6,0,0,1-6,6H88a6,6,0,0,1,0-12h40A6,6,0,0,1,134,208Zm80-96a6,6,0,0,1-6,6H192a6,6,0,0,1,0-12h16A6,6,0,0,1,214,112Z"/>'),yu=da("devices","0 0 256 256",'<path d="M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72ZM40,168a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8v8H176a24,24,0,0,0-24,24v72Zm192,24a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z"/>'),YR=da("devices","0 0 256 256",'<path d="M224,72H212V64a28,28,0,0,0-28-28H40A28,28,0,0,0,12,64v88a28,28,0,0,0,28,28h96v12a28,28,0,0,0,28,28h60a28,28,0,0,0,28-28V100A28,28,0,0,0,224,72ZM40,156a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H184a4,4,0,0,1,4,4v8H164a28,28,0,0,0-28,28v56Zm188,36a4,4,0,0,1-4,4H164a4,4,0,0,1-4-4V100a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM124,208a12,12,0,0,1-12,12H88a12,12,0,0,1,0-24h24A12,12,0,0,1,124,208Zm88-84a12,12,0,0,1-12,12H188a12,12,0,0,1,0-24h12A12,12,0,0,1,212,124Z"/>'),XR=da("devices","0 0 256 256",'<path d="M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72Zm8,120a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z"/>'),JR=da("devices","0 0 256 256",'<path d="M200,64V80H176a16,16,0,0,0-16,16v80H40a16,16,0,0,1-16-16V64A16,16,0,0,1,40,48H184A16,16,0,0,1,200,64Z" opacity="0.2"/><path d="M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72ZM40,168a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8v8H176a24,24,0,0,0-24,24v72Zm192,24a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z"/>'),QR="devices",eD=Object.freeze(Object.defineProperty({__proto__:null,bold:YR,default:yu,duotone:JR,fill:XR,glyphName:QR,light:GR,regular:yu,thin:qR},Symbol.toStringTag,{value:"Module"})),tD={class:"devices-view"},iD={class:"toolbar-count"},rD={key:1,class:"empty-state"},sD={class:"device-icon native-icon"},nD={class:"device-info"},aD={class:"device-name"},oD={class:"device-type"},lD={class:"device-summary"},cD={key:0,class:"summary-primary"},uD={class:"summary-primary"},hD={key:0,class:"summary-secondary"},dD={key:2,class:"summary-primary"},fD={class:"device-info"},_D={class:"device-name"},pD={class:"device-type"},mD={key:0,class:"device-summary"},gD={class:"summary-primary"},vD={class:"cell-name"},bD={key:1},yD={class:"confirm-dialog"},wD={class:"confirm-icon"},SD={class:"confirm-message"},CD={class:"confirm-actions"},P6="openbridge.devices.view",AD=Oe({__name:"DevicesView",setup(e){const t=ys(),i=fl(),r=dl();function s(ne){r.push({name:"device-detail",params:{id:ne.id}})}const n=Gs(),a=ie(!1),o=ie([]),l=ie(localStorage.getItem(P6)==="table"?"table":"cards");function c(){l.value=l.value==="cards"?"table":"cards",localStorage.setItem(P6,l.value)}const u=ie({key:"name",direction:"asc"}),h=[{key:"name",header:"Device",sortable:!0},{key:"type",header:"Type",sortable:!0,width:160},{key:"source",header:"Source",sortable:!0,width:120},{key:"state",header:"State",sortable:!0,width:120},{key:"detail",header:"Reading",sortable:!0,width:160}],d=Q(()=>{const ne=[...o.value.map(Y=>({key:"native:"+Y.id,name:Y.name,type:M(_(Y)),source:"Native",state:Y.telemetry.active===void 0?"":Y.telemetry.active?"On":"Off",stateOn:!!Y.telemetry.active,detail:f(Y),icon:x(_(Y)),select:()=>g(Y)})),...t.accessories.map(Y=>{const J=O(Y);return{key:"hap:"+Y.uuid,name:Y.displayName,type:m(Y.category).label,source:"HomeKit",state:J?J.value?"On":"Off":"",stateOn:!!(J!=null&&J.value),detail:T(Y)??"",icon:m(Y.category).icon,select:()=>A(Y)}})],re=u.value;if(!re||re.direction==="none")return ne;const D=re.direction==="asc"?1:-1;return[...ne].sort((Y,J)=>D*String(Y[re.key]??"").localeCompare(String(J[re.key]??"")))});function f(ne){const re=ne.telemetry;return ne.widgetType==="energy_meter"&&re.power!==void 0?`${W(re.power,1)} W`:ne.widgetType==="thermostat"&&re.currentTemperature!==void 0?`${W(re.currentTemperature,1)}°C`:ne.widgetType==="dehumidifier"&&re.currentHumidity!==void 0?`${W(re.currentHumidity,0)}%`:re.power!==void 0?`${W(re.power,1)} W`:""}function _(ne){return ne.homekitType||ne.widgetType}const p=Q(()=>i.mode!=="device"||!i.selectedDevice?null:i.selectedDevice.kind==="native"?i.selectedDevice.dev.id:i.selectedDevice.acc.uuid);function A(ne){p.value===ne.uuid?i.close():i.openDevice({kind:"hap",acc:ne})}function g(ne){p.value===ne.id?i.close():i.openDevice({kind:"native",dev:ne})}const S={1:{label:"Other",icon:"cube"},2:{label:"Bridge",icon:"intersect"},3:{label:"Fan",icon:"fan"},4:{label:"Garage Door",icon:"garage"},5:{label:"Light",icon:"lightbulb"},6:{label:"Lock",icon:"lock"},7:{label:"Outlet",icon:"plugs"},8:{label:"Switch",icon:"toggle-right"},9:{label:"Thermostat",icon:"thermometer"},10:{label:"Sensor",icon:"pulse"},11:{label:"Security",icon:"shield"},12:{label:"Door",icon:"door"},13:{label:"Window",icon:"app-window"},14:{label:"Window Covering",icon:"rows"},15:{label:"Programm. Switch",icon:"sliders"},16:{label:"Range Extender",icon:"broadcast"},17:{label:"Camera",icon:"camera"},18:{label:"Video Doorbell",icon:"bell"},19:{label:"Air Purifier",icon:"wind"},20:{label:"Heater/Cooler",icon:"thermometer-hot"},21:{label:"Air Conditioner",icon:"snowflake"},22:{label:"Humidifier",icon:"drop"},23:{label:"Dehumidifier",icon:"drop"},26:{label:"Speaker",icon:"speaker-high"},28:{label:"Sprinkler",icon:"drop"},29:{label:"Faucet",icon:"drop"},30:{label:"Shower",icon:"drop"},32:{label:"TV",icon:"television"},34:{label:"Router",icon:"broadcast"},36:{label:"Target Control",icon:"game-controller"},38:{label:"Smart Speaker",icon:"speaker-hifi"}};function m(ne){return S[ne]??{label:`Category ${ne}`,icon:"cube"}}const v={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",sensor:"pulse"},k={switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",sensor:"Sensor"};function x(ne){return v[ne]??"cube"}function M(ne){return k[ne]??ne}const z=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]),P=new Set(["On","Active","LockTargetState","TargetDoorState"]);function I(ne){return ne.services.find(re=>!z.has(re.name)&&!z.has(re.uuid))}function O(ne){const re=I(ne);return re?re.characteristics.find(D=>P.has(D.name)&&D.perms.includes("pw"))??null:null}function T(ne){const re=I(ne);if(!re)return null;for(const Y of re.characteristics){if(Y.name==="CurrentTemperature"&&Y.value!=null)return`${Number(Y.value).toFixed(1)}°C`;if(Y.name==="CurrentRelativeHumidity"&&Y.value!=null)return`${Math.round(Number(Y.value))}%`;if(Y.name==="CurrentPosition"&&Y.value!=null)return`${Math.round(Number(Y.value))}%`;if(Y.name==="Brightness"&&Y.value!=null)return`${Math.round(Number(Y.value))}%`}const D=re.characteristics.find(Y=>Y.name==="On");return D?D.value?"On":"Off":null}async function H(ne,re){const D=I(ne),Y=O(ne);if(!(!D||!Y))try{await Pe.setCharacteristic(ne.uuid,D.uuid,Y.uuid,re?1:0),await t.fetchAccessories()}catch(J){console.error("HAP control failed",J)}}function W(ne,re=1){if(ne==null)return"—";const D=Number(ne);return isFinite(D)?D.toFixed(re):String(ne)}const q=Q(()=>t.accessories.length+o.value.length);async function K(){var ne;try{const re=await Pe.devices();if(o.value=re.devices,i.mode==="device"&&((ne=i.selectedDevice)==null?void 0:ne.kind)==="native"){const D=i.selectedDevice.dev.id,Y=re.devices.find(J=>J.id===D);Y&&i.updateDevice({kind:"native",dev:Y})}}catch{}}async function se(){a.value=!0,await Promise.all([t.fetchAccessories(),K()]),a.value=!1}let ce=null;const te=ie({visible:!1,deviceId:"",control:"",value:null,message:""});function ge(ne,re,D){return ne.widgetType==="energy_meter"&&re==="active"?D?`Turn on ${ne.name}? This will energise the connected circuit.`:`Turn off ${ne.name}? This will cut power to the connected circuit.`:!1}async function pe(ne,re,D){try{await Pe.controlDevice(ne,re,D),await K()}catch(Y){console.error("Control failed",Y)}}function ve(ne,re,D){const Y=ge(ne,re,D);Y?te.value={visible:!0,deviceId:ne.id,control:re,value:D,message:Y}:pe(ne.id,re,D)}function Te(){const{deviceId:ne,control:re,value:D}=te.value;te.value.visible=!1,pe(ne,re,D)}function Me(){te.value.visible=!1}return _t(async()=>{n.setPage("Devices"),await Promise.all([t.fetchAccessories(),K()]),ce=setInterval(K,3e3)}),Br(()=>{ce&&clearInterval(ce)}),(ne,re)=>{const D=Dn,Y=gi,J=Ye,_e=rc,Se=vm,B=hl,Z=hm;return y(),$("div",tD,[q.value>0?(y(),fe(Or,{key:0,defer:"",to:"#ob-topbar-left"},[b("span",iD,U(q.value)+" device"+U(q.value!==1?"s":""),1),o.value.length>0?(y(),fe(D,{key:0},{default:ee(()=>[le(U(o.value.length)+" native",1)]),_:1})):j("",!0)])):j("",!0),(y(),fe(Or,{defer:"",to:"#ob-topbar-right"},[X(Y,{variant:"ghost",size:"sm",icon:l.value===og?lg:cg,title:l.value==="cards"?"Show as table":"Show as cards",onClick:c},null,8,["icon","title"]),X(Y,{variant:"ghost",size:"sm",icon:Fs,title:"Refresh",loading:a.value,onClick:se},null,8,["loading"])])),q.value===0?(y(),$("div",rD,[X(J,{name:oe(yu),size:40},null,8,["name"]),re[8]||(re[8]=b("p",null,"No devices registered yet.",-1)),re[9]||(re[9]=b("p",{class:"empty-hint"},[le(" Devices appear here once a platform plugin registers accessories. "),b("br"),le(" This page auto-refreshes every 3 seconds: discovery can take up to 60s. ")],-1))])):(y(),$("div",{key:2,class:"devices-layout",onClick:re[7]||(re[7]=lt(F=>oe(i).close(),["self"]))},[l.value==="cards"?(y(),$("div",{key:0,class:"device-grid",onClick:re[4]||(re[4]=lt(F=>oe(i).close(),["self"]))},[(y(!0),$(be,null,Ve(o.value,F=>(y(),fe(B,{key:"native:"+F.id,class:Le(["device-card native-card",{selected:p.value===F.id}]),onClick:ae=>g(F),onDblclick:ae=>s(F)},{default:ee(()=>[re[10]||(re[10]=b("span",{class:"device-card__accent"},null,-1)),b("div",sD,[X(J,{name:x(_(F)),size:22},null,8,["name"])]),b("div",nD,[b("div",aD,U(F.name),1),b("div",oD,U(M(_(F))),1),b("div",lD,[F.widgetType==="energy_meter"&&F.telemetry.power!==void 0?(y(),$("span",cD,U(W(F.telemetry.power,1))+" W",1)):F.widgetType==="thermostat"&&F.telemetry.currentTemperature!==void 0?(y(),$(be,{key:1},[b("span",uD,U(W(F.telemetry.currentTemperature,1))+"°C",1),F.telemetry.targetTemperature!==void 0?(y(),$("span",hD," target "+U(W(F.telemetry.targetTemperature,1))+"°C ",1)):j("",!0)],64)):F.widgetType==="dehumidifier"&&F.telemetry.currentHumidity!==void 0?(y(),$("span",dD,U(W(F.telemetry.currentHumidity,0))+"%",1)):F.telemetry.active!==void 0?(y(),$("span",{key:3,class:Le(["summary-status",F.telemetry.active?"on":"off"])},U(F.telemetry.active?"On":"Off"),3)):j("",!0)]),F.telemetry.active!==void 0?(y(),$("div",{key:0,class:"card-controls",onClick:re[0]||(re[0]=lt(()=>{},["stop"]))},[X(_e,{name:`device-active-${F.id}`,"model-value":!!F.telemetry.active,"onUpdate:modelValue":ae=>ve(F,"active",ae)},null,8,["name","model-value","onUpdate:modelValue"])])):j("",!0),F.widgetType==="thermostat"&&F.telemetry.targetTemperature!==void 0?(y(),$("div",{key:1,class:"card-controls",onClick:re[1]||(re[1]=lt(()=>{},["stop"]))},[X(Se,{"model-value":Number(F.telemetry.targetTemperature),size:"xs",min:5,max:35,step:1,"onUpdate:modelValue":ae=>ae!==null&&pe(F.id,"targetTemperature",ae)},null,8,["model-value","onUpdate:modelValue"])])):j("",!0),F.widgetType==="dehumidifier"&&F.telemetry.targetHumidity!==void 0?(y(),$("div",{key:2,class:"card-controls",onClick:re[2]||(re[2]=lt(()=>{},["stop"]))},[X(Se,{"model-value":Number(F.telemetry.targetHumidity),size:"xs",min:30,max:80,step:5,"onUpdate:modelValue":ae=>ae!==null&&pe(F.id,"targetHumidity",ae)},null,8,["model-value","onUpdate:modelValue"])])):j("",!0)]),b("div",{class:Le(["device-reachability",F.pluginStatus==="running"?"online":"offline"])},null,2)]),_:2},1032,["class","onClick","onDblclick"]))),128)),(y(!0),$(be,null,Ve(oe(t).accessories,F=>(y(),fe(B,{key:F.uuid,class:Le(["device-card hap-card",{selected:p.value===F.uuid,unreachable:!F.reachable}]),onClick:ae=>A(F)},{default:ee(()=>{var ae;return[b("div",{class:Le(["device-icon hap-icon",{unreachable:!F.reachable}])},[X(J,{name:m(F.category).icon,size:22},null,8,["name"])],2),b("div",fD,[b("div",_D,U(F.displayName),1),b("div",pD,U(m(F.category).label),1),T(F)?(y(),$("div",mD,[b("span",gD,U(T(F)),1)])):j("",!0),O(F)?(y(),$("div",{key:1,class:"card-controls",onClick:re[3]||(re[3]=lt(()=>{},["stop"]))},[X(_e,{name:`hap-on-${F.uuid}`,"model-value":!!((ae=O(F))!=null&&ae.value),"onUpdate:modelValue":he=>H(F,!!he)},null,8,["name","model-value","onUpdate:modelValue"])])):j("",!0)]),b("div",{class:Le(["device-reachability",F.reachable?"online":"offline"])},null,2)]}),_:2},1032,["class","onClick"]))),128))])):(y(),fe(Z,{key:1,columns:h,rows:d.value,"row-key":"key",size:"sm",zebra:"","sort-state":u.value,onSort:re[5]||(re[5]=F=>u.value=F),onRowClick:re[6]||(re[6]=F=>F.select())},{"cell-name":ee(({row:F})=>[b("div",vD,[X(J,{name:F.icon,size:16},null,8,["name"]),b("span",null,U(F.name),1)])]),"cell-state":ee(({row:F})=>[F.state?(y(),fe(D,{key:0,variant:F.stateOn?"green":"grey"},{default:ee(()=>[le(U(F.state),1)]),_:2},1032,["variant"])):(y(),$("span",bD,"—"))]),_:1},8,["rows","sort-state"]))])),(y(),fe(Or,{to:"body"},[te.value.visible?(y(),$("div",{key:0,class:"confirm-overlay",onClick:lt(Me,["self"])},[b("div",yD,[b("div",wD,[X(J,{name:oe(wn),size:24},null,8,["name"])]),b("p",SD,U(te.value.message),1),b("div",CD,[X(Y,{variant:"ghost",size:"sm",onClick:Me},{default:ee(()=>[...re[11]||(re[11]=[le("Cancel",-1)])]),_:1}),X(Y,{variant:"primary",size:"sm",onClick:Te},{default:ee(()=>[...re[12]||(re[12]=[le("Confirm",-1)])]),_:1})])])])):j("",!0)]))])}}}),kD=Zt(AD,[["__scopeId","data-v-db2ac2e9"]]),fa=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},MD=fa("arrow-left","0 0 256 256",'<path d="M220,128a4,4,0,0,1-4,4H49.66l65.17,65.17a4,4,0,0,1-5.66,5.66l-72-72a4,4,0,0,1,0-5.66l72-72a4,4,0,0,1,5.66,5.66L49.66,124H216A4,4,0,0,1,220,128Z"/>'),LD=fa("arrow-left","0 0 256 256",'<path d="M222,128a6,6,0,0,1-6,6H54.49l61.75,61.76a6,6,0,1,1-8.48,8.48l-72-72a6,6,0,0,1,0-8.48l72-72a6,6,0,0,1,8.48,8.48L54.49,122H216A6,6,0,0,1,222,128Z"/>'),O6=fa("arrow-left","0 0 256 256",'<path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z"/>'),ED=fa("arrow-left","0 0 256 256",'<path d="M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z"/>'),xD=fa("arrow-left","0 0 256 256",'<path d="M224,128a8,8,0,0,1-8,8H120v64a8,8,0,0,1-13.66,5.66l-72-72a8,8,0,0,1,0-11.32l72-72A8,8,0,0,1,120,56v64h96A8,8,0,0,1,224,128Z"/>'),$D=fa("arrow-left","0 0 256 256",'<path d="M112,56V200L40,128Z" opacity="0.2"/><path d="M216,120H120V56a8,8,0,0,0-13.66-5.66l-72,72a8,8,0,0,0,0,11.32l72,72A8,8,0,0,0,120,200V136h96a8,8,0,0,0,0-16ZM104,180.69,51.31,128,104,75.31Z"/>'),TD="arrow-left",ND=Object.freeze(Object.defineProperty({__proto__:null,bold:ED,default:O6,duotone:$D,fill:xD,glyphName:TD,light:LD,regular:O6,thin:MD},Symbol.toStringTag,{value:"Module"})),HD={class:"device-detail"},PD={key:0,class:"detail-message"},OD={class:"summary-row"},ID=["onClick"],RD={class:"tile-label"},DD={class:"tile-value"},VD={class:"tile-unit"},BD={key:0,class:"detail-message"},ZD={class:"chart-toolbar"},FD={class:"range-tabs"},zD=["onClick"],UD={key:0,class:"resolution-note"},WD={class:"chart-panel"},jD={key:1,class:"chart-empty"},KD={key:2,class:"chart-empty"},qD={key:2,class:"detail-message"},GD=Oe({__name:"DeviceDetailView",setup(e){const t=oc(),i=dl(),r=Q(()=>String(t.params.id??"")),s=ie(null),n=ie([]),a=ie(""),o=ie(!1),l=ie(""),c=ie(0),u=ie([]),h=[{key:"1h",label:"1 hour",seconds:3600},{key:"24h",label:"24 hours",seconds:86400},{key:"7d",label:"7 days",seconds:7*86400},{key:"30d",label:"30 days",seconds:30*86400},{key:"1y",label:"1 year",seconds:365*86400}],d=ie("24h"),f=Q(()=>{var I;return((I=s.value)==null?void 0:I.model)??"Device"}),_=Q(()=>n.value.find(I=>I.key===a.value)??null),p=Q(()=>{const I=_.value;if(!I||u.value.length===0)return[];const O={name:I.label,data:u.value.map(H=>({x:new Date(H.t*1e3),y:H.value??0}))};return u.value.some(H=>H.min!==void 0&&H.min!==null&&H.min!==H.value)?[O,{name:"Min",data:u.value.map(H=>({x:new Date(H.t*1e3),y:H.min??H.value??0}))},{name:"Max",data:u.value.map(H=>({x:new Date(H.t*1e3),y:H.max??H.value??0}))}]:[O]}),A=Q(()=>{if(!c.value)return"";const I=c.value;return I<60?`${I}s resolution`:I<3600?`${Math.round(I/60)} min resolution`:`${Math.round(I/3600)} h resolution`});function g(I){var H,W;const O=(W=(H=s.value)==null?void 0:H.telemetry)==null?void 0:W[I.key],T=Number(O);return Number.isFinite(T)?T:null}function S(I,O){return I===null?"—":I.toFixed(O.precision??2)}function m(){i.push({name:"devices"})}function v(I){a.value!==I&&(a.value=I,M())}function k(I){d.value!==I&&(d.value=I,M())}async function x(){try{const{devices:I}=await Pe.devices(),O=I.find(T=>T.id===r.value);if(!O){l.value=`Device "${r.value}" was not found. It may have been removed, or its plugin stopped.`;return}s.value=O,n.value=O.metrics??[],!a.value&&n.value.length>0&&(a.value=n.value[0].key)}catch(I){l.value=`Could not load device: ${I.message}`}}async function M(){var H,W;if(!a.value)return;const I=h.find(q=>q.key===d.value),O=Math.floor(Date.now()/1e3),T=O-I.seconds;o.value=!0;try{const q=await Pe.deviceMetrics(r.value,{metric:a.value,from:T,to:O});u.value=((H=q.series)==null?void 0:H.points)??[],c.value=((W=q.series)==null?void 0:W.resolution)??0}catch(q){l.value=`Could not load history: ${q.message}`}finally{o.value=!1}}let z=null,P=null;return _t(async()=>{await x(),await M(),z=setInterval(()=>void x(),5e3),P=setInterval(()=>void M(),3e4)}),Bi(()=>{z&&clearInterval(z),P&&clearInterval(P)}),Fe(r,async()=>{s.value=null,n.value=[],a.value="",u.value=[],l.value="",await x(),await M()}),(I,O)=>{var K;const T=gi,H=O4,W=rt,q=UM;return y(),$("div",HD,[X(H,{title:f.value,subtitle:((K=s.value)==null?void 0:K.name)??r.value},{default:ee(()=>[X(T,{variant:"ghost",size:"sm",icon:ND,onClick:m},{default:ee(()=>[...O[0]||(O[0]=[le("Devices",-1)])]),_:1})]),_:1},8,["title","subtitle"]),l.value?(y(),$("div",PD,[X(W,{variant:"error"},{default:ee(()=>[le(U(l.value),1)]),_:1})])):s.value?(y(),$(be,{key:1},[b("div",OD,[(y(!0),$(be,null,Ve(n.value,se=>(y(),$("div",{key:se.key,class:Le(["summary-tile",{active:se.key===a.value}]),onClick:ce=>v(se.key)},[b("span",RD,U(se.label),1),b("span",DD,[le(U(S(g(se),se))+" ",1),b("span",VD,U(se.unit),1)])],10,ID))),128))]),n.value.length===0?(y(),$("div",BD,[X(W,{variant:"helper"},{default:ee(()=>[...O[1]||(O[1]=[le(" This device does not declare any metrics, so there is nothing to chart. Plugins opt in by describing their series in the device descriptor. ",-1)])]),_:1})])):(y(),$(be,{key:1},[b("div",ZD,[b("div",FD,[(y(),$(be,null,Ve(h,se=>b("button",{key:se.key,class:Le(["range-tab",{active:se.key===d.value}]),onClick:ce=>k(se.key)},U(se.label),11,zD)),64))]),A.value?(y(),$("span",UD,U(A.value),1)):j("",!0)]),b("div",WD,[p.value.length>0&&p.value[0].data.length>0?(y(),fe(q,{key:0,series:p.value,height:320,"show-legend":p.value.length>1,"show-grid":!0,"show-tooltip":!0,points:!1,curve:"smooth"},null,8,["series","show-legend"])):o.value?(y(),$("div",jD,"Loading…")):(y(),$("div",KD," No data recorded yet for this range. History starts accumulating once the device reports. "))])],64))],64)):(y(),$("div",qD,"Loading…"))])}}}),YD=Zt(GD,[["__scopeId","data-v-df1516e5"]]),_a=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},XD=_a("magic-wand","0 0 256 256",'<path d="M244,152a4,4,0,0,1-4,4H220v20a4,4,0,0,1-8,0V156H192a4,4,0,0,1,0-8h20V128a4,4,0,0,1,8,0v20h20A4,4,0,0,1,244,152ZM56,68H76V88a4,4,0,0,0,8,0V68h20a4,4,0,0,0,0-8H84V40a4,4,0,0,0-8,0V60H56a4,4,0,0,0,0,8ZM184,196H172V184a4,4,0,0,0-8,0v12H152a4,4,0,0,0,0,8h12v12a4,4,0,0,0,8,0V204h12a4,4,0,0,0,0-8ZM216.48,77.17,77.17,216.49a12,12,0,0,1-17,0L39.51,195.8a12,12,0,0,1,0-17L178.83,39.51a12,12,0,0,1,17,0L216.48,60.2A12,12,0,0,1,216.48,77.17ZM170.34,112,144,85.66,45.17,184.49a4,4,0,0,0,0,5.65l20.68,20.69a4,4,0,0,0,5.66,0Zm40.49-46.14L190.14,45.17a4,4,0,0,0-5.66,0L149.65,80,176,106.34l34.83-34.83A4,4,0,0,0,210.83,65.86Z"/>'),JD=_a("magic-wand","0 0 256 256",'<path d="M246,152a6,6,0,0,1-6,6H222v18a6,6,0,0,1-12,0V158H192a6,6,0,0,1,0-12h18V128a6,6,0,0,1,12,0v18h18A6,6,0,0,1,246,152ZM56,70H74V88a6,6,0,0,0,12,0V70h18a6,6,0,0,0,0-12H86V40a6,6,0,0,0-12,0V58H56a6,6,0,0,0,0,12ZM184,194H174V184a6,6,0,0,0-12,0v10H152a6,6,0,0,0,0,12h10v10a6,6,0,0,0,12,0V206h10a6,6,0,0,0,0-12ZM217.9,78.59,78.58,217.9a14,14,0,0,1-19.8,0L38.09,197.21a14,14,0,0,1,0-19.8L177.41,38.1a14,14,0,0,1,19.8,0L217.9,58.79A14,14,0,0,1,217.9,78.59ZM167.51,112,144,88.49,46.58,185.9a2,2,0,0,0,0,2.83l20.69,20.68a2,2,0,0,0,2.82,0h0Zm41.9-44.73L188.73,46.59a2,2,0,0,0-2.83,0L152.48,80,176,103.52,209.41,70.1A2,2,0,0,0,209.41,67.27Z"/>'),I6=_a("magic-wand","0 0 256 256",'<path d="M48,64a8,8,0,0,1,8-8H72V40a8,8,0,0,1,16,0V56h16a8,8,0,0,1,0,16H88V88a8,8,0,0,1-16,0V72H56A8,8,0,0,1,48,64ZM184,192h-8v-8a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0v-8h8a8,8,0,0,0,0-16Zm56-48H224V128a8,8,0,0,0-16,0v16H192a8,8,0,0,0,0,16h16v16a8,8,0,0,0,16,0V160h16a8,8,0,0,0,0-16ZM219.31,80,80,219.31a16,16,0,0,1-22.62,0L36.68,198.63a16,16,0,0,1,0-22.63L176,36.69a16,16,0,0,1,22.63,0l20.68,20.68A16,16,0,0,1,219.31,80Zm-54.63,32L144,91.31l-96,96L68.68,208ZM208,68.69,187.31,48l-32,32L176,100.69Z"/>'),QD=_a("magic-wand","0 0 256 256",'<path d="M252,152a12,12,0,0,1-12,12H228v12a12,12,0,0,1-24,0V164H192a12,12,0,0,1,0-24h12V128a12,12,0,0,1,24,0v12h12A12,12,0,0,1,252,152ZM56,76H68V88a12,12,0,0,0,24,0V76h12a12,12,0,1,0,0-24H92V40a12,12,0,0,0-24,0V52H56a12,12,0,0,0,0,24ZM184,188h-4v-4a12,12,0,0,0-24,0v4h-4a12,12,0,0,0,0,24h4v4a12,12,0,0,0,24,0v-4h4a12,12,0,0,0,0-24ZM222.14,82.83,82.82,222.14a20,20,0,0,1-28.28,0L33.85,201.46a20,20,0,0,1,0-28.29L173.17,33.86a20,20,0,0,1,28.28,0l20.69,20.68A20,20,0,0,1,222.14,82.83ZM159,112,144,97,53.65,187.31l15,15Zm43.31-43.31-15-15L161,80l15,15Z"/>'),eV=_a("magic-wand","0 0 256 256",'<path d="M248,152a8,8,0,0,1-8,8H224v16a8,8,0,0,1-16,0V160H192a8,8,0,0,1,0-16h16V128a8,8,0,0,1,16,0v16h16A8,8,0,0,1,248,152ZM56,72H72V88a8,8,0,0,0,16,0V72h16a8,8,0,0,0,0-16H88V40a8,8,0,0,0-16,0V56H56a8,8,0,0,0,0,16ZM184,192h-8v-8a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0v-8h8a8,8,0,0,0,0-16ZM219.31,80,80,219.31a16,16,0,0,1-22.62,0L36.68,198.63a16,16,0,0,1,0-22.63L176,36.69a16,16,0,0,1,22.63,0l20.68,20.68A16,16,0,0,1,219.31,80ZM208,68.69,187.31,48l-32,32L176,100.69Z"/>'),tV=_a("magic-wand","0 0 256 256",'<path d="M176,112,74.34,213.66a8,8,0,0,1-11.31,0L42.34,193a8,8,0,0,1,0-11.31L144,80Z" opacity="0.2"/><path d="M248,152a8,8,0,0,1-8,8H224v16a8,8,0,0,1-16,0V160H192a8,8,0,0,1,0-16h16V128a8,8,0,0,1,16,0v16h16A8,8,0,0,1,248,152ZM56,72H72V88a8,8,0,0,0,16,0V72h16a8,8,0,0,0,0-16H88V40a8,8,0,0,0-16,0V56H56a8,8,0,0,0,0,16ZM184,192h-8v-8a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0v-8h8a8,8,0,0,0,0-16ZM219.31,80,80,219.31a16,16,0,0,1-22.62,0L36.68,198.63a16,16,0,0,1,0-22.63L176,36.69a16,16,0,0,1,22.63,0l20.68,20.68A16,16,0,0,1,219.31,80Zm-54.63,32L144,91.31l-96,96L68.68,208ZM208,68.69,187.31,48l-32,32L176,100.69Z"/>'),iV="magic-wand",rV=Object.freeze(Object.defineProperty({__proto__:null,bold:QD,default:I6,duotone:tV,fill:eV,glyphName:iV,light:JD,regular:I6,thin:XD},Symbol.toStringTag,{value:"Module"})),sV={class:"config-view"},nV={key:0,class:"error-banner"},aV={key:1,class:"loading-state"},oV=Oe({__name:"ConfigView",setup(e){const t=Gs(),{resolved:i}=Yh(),r=ie(null),s=Vr(null),n=ie(!1),a=ie(!1),o=ie(null),l=ie(!0);_t(async()=>{t.setPage("Config",void 0,{fullBleed:!0});let h="{}";try{h=(await Pe.config.get()).content}catch(f){o.value=`Failed to load config: ${f}`}finally{l.value=!1}const d=await rg.init();d.languages.json.jsonDefaults.setDiagnosticsOptions({validate:!0,schemas:[{uri:"openbridge://config-schema",fileMatch:["*"],schema:{type:"object",properties:{bridge:{type:"object",description:"Bridge configuration",properties:{name:{type:"string",description:"Bridge display name"},port:{type:"number",description:"HTTP API port (default 8582)"},hapPort:{type:"number",description:"HomeKit HAP port (default 51829)"},pincode:{type:"string",description:"HomeKit pairing PIN (format: XXX-XX-XXX)"},username:{type:"string",description:"HAP username (MAC address format)"},logLevel:{type:"string",enum:["debug","info","warn","error"]}}},platforms:{type:"array",description:"Homebridge-compatible platform plugins",items:{type:"object",required:["platform"],properties:{platform:{type:"string",description:"Platform identifier"},plugin:{type:"string",description:"Absolute path to the plugin JS file"},enabled:{type:"boolean",default:!0}},additionalProperties:!0}},plugins:{type:"array",description:"Native OpenBridge plugins",items:{type:"object",required:["name"],properties:{name:{type:"string"},path:{type:"string"},enabled:{type:"boolean",default:!0},config:{type:"object"}}}}}}}]}),r.value&&(Fe(i,f=>d.editor.setTheme(f==="dark"?"vs-dark":"vs")),s.value=d.editor.create(r.value,{value:h,language:"json",theme:i.value==="dark"?"vs-dark":"vs",fontSize:13,fontFamily:'"MesloLGS NF", monospace',minimap:{enabled:!0},scrollBeyondLastLine:!1,formatOnPaste:!0,formatOnType:!0,tabSize:2,automaticLayout:!0,wordWrap:"off",bracketPairColorization:{enabled:!0},guides:{bracketPairs:!0},lineNumbers:"on",renderLineHighlight:"all",smoothScrolling:!0}))}),Bi(()=>{var h;(h=s.value)==null||h.dispose()});async function c(){var h;if(!n.value){n.value=!0,o.value=null,a.value=!1;try{const d=((h=s.value)==null?void 0:h.getValue())??"";await Pe.config.save(d),a.value=!0,setTimeout(()=>{a.value=!1},2500)}catch(d){o.value=String(d)}finally{n.value=!1}}}function u(){var h,d;(d=(h=s.value)==null?void 0:h.getAction("editor.action.formatDocument"))==null||d.run()}return(h,d)=>{const f=gi,_=Ye;return y(),$("div",sV,[(y(),fe(Or,{defer:"",to:"#ob-topbar-left"},[d[0]||(d[0]=b("span",{class:"config-path"},"~/.openbridge/config.json",-1))])),(y(),fe(Or,{defer:"",to:"#ob-topbar-right"},[X(f,{variant:"ghost",size:"sm",icon:rV,title:"Format JSON",onClick:u},{default:ee(()=>[...d[1]||(d[1]=[le("Format",-1)])]),_:1}),X(f,{variant:"primary",size:"sm",icon:a.value?_s:A0,loading:n.value,disabled:n.value,title:"Changes take effect after restarting the daemon",onClick:c},{default:ee(()=>[le(U(a.value?"Saved!":n.value?"Saving…":"Save"),1)]),_:1},8,["icon","loading","disabled"])])),o.value?(y(),$("div",nV,[X(_,{name:oe(wn),size:14},null,8,["name"]),le(" "+U(o.value),1)])):j("",!0),l.value?(y(),$("div",aV,[X(_,{name:oe(Ln),size:28},null,8,["name"]),d[2]||(d[2]=b("span",null,"Loading config...",-1))])):(y(),$("div",{key:2,ref_key:"editorContainer",ref:r,class:"editor-container"},null,512))])}}}),lV=Zt(oV,[["__scopeId","data-v-483debe2"]]),cV=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},uV=cV("bridge","0 0 256 256",'<path d="M232,160H200V101.34a71.89,71.89,0,0,0,29,21.42,8,8,0,0,0,6-14.83A55.78,55.78,0,0,1,200,56a8,8,0,0,0-16,0A56,56,0,0,1,72,56a8,8,0,0,0-16,0,55.78,55.78,0,0,1-35,51.93,8,8,0,0,0,6,14.83,71.89,71.89,0,0,0,29-21.42V160H24a8,8,0,0,0,0,16H56v24a8,8,0,0,0,16,0V176H184v24a8,8,0,0,0,16,0V176h32a8,8,0,0,0,0-16Zm-88-33.8V160H112V126.2a72,72,0,0,0,32,0Zm-72-25a72.47,72.47,0,0,0,24,19.27V160H72ZM160,160V120.48a72.47,72.47,0,0,0,24-19.27V160Z"/>'),hV=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},dV=hV("palette","0 0 256 256",'<path d="M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z"/>'),fV={class:"settings-view"},_V={class:"card-header"},pV={class:"card-icon"},mV={class:"pin-row"},gV={class:"card-actions"},vV={key:0,class:"action-hint"},bV={class:"card-header"},yV={class:"card-icon"},wV={class:"update-row"},SV={class:"update-versions"},CV={class:"update-actions"},AV={key:3,class:"update-error-row"},kV={class:"card-header"},MV={class:"card-icon"},LV={class:"info-title"},EV=Oe({__name:"SettingsView",setup(e){const t=Gs(),{theme:i,resolved:r,followsSystem:s,setTheme:n}=Yh(),a=[{value:"light",label:"Light"},{value:"dark",label:"Dark"},{value:"system",label:"System"}],o=Q({get:()=>i.value,set:q=>n(q)}),l=Q(()=>s.value?`Following your system, currently ${r.value}`:"Pinned, ignoring your system setting"),c=[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warn"},{value:"error",label:"Error"}],u=ie(!1),h=ie(!1),d=ie(null),f=ie(!1),_=ie(null),p=ie(!1),A=ie(!1),g=ie(null),S=ie(""),m=ie(0),v=ie("");let k=null;async function x(){p.value=!0,g.value=null;try{_.value=await Pe.updates.check()}catch(q){g.value=String(q)}finally{p.value=!1}}function M(){const q=location.protocol==="https:"?"wss":"ws";k=new WebSocket(`${q}://${location.host}/ws/updates`),k.onmessage=K=>{try{const se=JSON.parse(K.data);S.value=se.stage??"",m.value=Math.round((se.progress??0)*100),v.value=se.message??"",se.stage==="restarting"&&z(),se.stage==="error"&&(g.value=se.message,A.value=!1)}catch{}},k.onclose=()=>{A.value&&z()}}function z(){let q=0;const K=setInterval(async()=>{q++;try{await Pe.health(),clearInterval(K),A.value=!1,S.value="",v.value="",_.value=null,await x()}catch{}q>60&&(clearInterval(K),A.value=!1,g.value="Timed out waiting for restart")},2e3)}async function P(){if(!A.value){A.value=!0,g.value=null,S.value="downloading",v.value="Starting update...",m.value=0,M();try{await Pe.updates.apply()}catch(q){g.value=String(q),A.value=!1}}}async function I(){if(!A.value){A.value=!0,g.value=null,v.value="Rolling back...";try{await Pe.updates.rollback(),z()}catch(q){g.value=String(q),A.value=!1}}}const O=ie({name:"OpenBridge",port:8582,hapPort:51829,pincode:"031-45-154",username:"",logLevel:"info"});_t(async()=>{t.setPage("Settings");try{const q=await Pe.bridge();q&&typeof q=="object"&&(O.value={name:q.name??"OpenBridge",port:q.port??8582,hapPort:q.hapPort??51829,pincode:q.pincode??"031-45-154",username:q.username??"",logLevel:q.logLevel??"info"})}catch{}x()}),Br(()=>{k&&(k.close(),k=null)});async function T(){if(!u.value){u.value=!0,d.value=null,h.value=!1;try{const q={name:O.value.name,port:Number(O.value.port),hapPort:Number(O.value.hapPort),pincode:O.value.pincode,logLevel:O.value.logLevel};O.value.username&&(q.username=O.value.username),await Pe.saveBridge(q),h.value=!0,setTimeout(()=>{h.value=!1},3e3)}catch(q){d.value=String(q)}finally{u.value=!1}}}async function H(){if(!f.value){f.value=!0;try{await Pe.daemon.restart();let q=0;const K=setInterval(async()=>{q++;try{await Pe.health(),clearInterval(K),location.reload()}catch{}q>60&&(clearInterval(K),f.value=!1)},1e3)}catch{f.value=!1}}}function W(){const q=()=>Math.floor(Math.random()*9)+1,K=()=>`${q()}${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`,se=()=>`${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`;O.value.pincode=`${K()}-${se()}-${K()}`}return(q,K)=>{const se=Ye,ce=ul,te=dm,ge=vm,pe=gi,ve=sc,Te=$r,Me=rt,ne=hl,re=Dn,D=mm,Y=BL;return y(),$("div",fV,[X(ne,{class:"settings-card"},{default:ee(()=>[b("div",_V,[b("div",pV,[X(se,{name:oe(uV),size:18},null,8,["name"])]),K[7]||(K[7]=b("div",null,[b("h2",{class:"card-title"},"Bridge"),b("p",{class:"card-subtitle"},"HomeKit bridge identity and network settings")],-1))]),X(Te,{dir:"col",gap:"sm",class:"field-grid"},{default:ee(()=>[X(te,{label:"Bridge name",hint:"Displayed in the Home app"},{default:ee(()=>[X(ce,{modelValue:O.value.name,"onUpdate:modelValue":K[0]||(K[0]=J=>O.value.name=J),size:"sm",placeholder:"OpenBridge"},null,8,["modelValue"])]),_:1}),X(te,{label:"HTTP port",hint:"OpenBridge web UI & API",control:"fit"},{default:ee(()=>[X(ge,{modelValue:O.value.port,"onUpdate:modelValue":K[1]||(K[1]=J=>O.value.port=J),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),X(te,{label:"HAP port",hint:"HomeKit accessory protocol port",control:"fit"},{default:ee(()=>[X(ge,{modelValue:O.value.hapPort,"onUpdate:modelValue":K[2]||(K[2]=J=>O.value.hapPort=J),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),X(te,{label:"PIN code",hint:"Format: XXX-XX-XXX, used to pair with HomeKit"},{default:ee(()=>[b("div",mV,[X(ce,{modelValue:O.value.pincode,"onUpdate:modelValue":K[3]||(K[3]=J=>O.value.pincode=J),size:"sm",placeholder:"031-45-154"},null,8,["modelValue"]),X(pe,{variant:"ghost",size:"sm",icon:Fs,title:"Generate random PIN",onClick:W})])]),_:1}),X(te,{label:"Bridge MAC",hint:"Leave empty to auto-generate. Change this only if pairing with HomeKit fails."},{default:ee(()=>[X(ce,{modelValue:O.value.username,"onUpdate:modelValue":K[4]||(K[4]=J=>O.value.username=J),size:"sm",class:"mono",placeholder:"AA:BB:CC:DD:EE:FF"},null,8,["modelValue"])]),_:1}),X(te,{label:"Log level",control:"fit"},{default:ee(()=>[X(ve,{modelValue:O.value.logLevel,"onUpdate:modelValue":K[5]||(K[5]=J=>O.value.logLevel=J),size:"sm",options:c},null,8,["modelValue"])]),_:1})]),_:1}),d.value?(y(),fe(Me,{key:0,variant:"error"},{default:ee(()=>[le(U(d.value),1)]),_:1})):j("",!0),b("div",gV,[X(pe,{variant:"primary",size:"sm",loading:u.value,icon:h.value?_s:A0,onClick:T},{default:ee(()=>[le(U(h.value?"Saved!":"Save"),1)]),_:1},8,["loading","icon"]),X(pe,{variant:"secondary",size:"sm",outlined:"",loading:f.value,icon:f.value?Jo:Fs,onClick:H},{default:ee(()=>[le(U(f.value?"Restarting…":"Save & Restart OpenBridge"),1)]),_:1},8,["loading","icon"]),h.value&&!f.value?(y(),$("span",vV,[X(se,{name:oe(g0),size:12},null,8,["name"]),K[8]||(K[8]=le(" Restart the daemon for changes to take effect ",-1))])):j("",!0)])]),_:1}),X(ne,{class:"settings-card"},{default:ee(()=>{var J,_e;return[b("div",bV,[b("div",yV,[X(se,{name:oe(_u),size:18},null,8,["name"])]),K[9]||(K[9]=b("div",null,[b("h2",{class:"card-title"},"Updates"),b("p",{class:"card-subtitle"},"OpenBridge daemon and UI")],-1))]),b("div",wV,[b("div",SV,[X(re,{variant:"grey"},{default:ee(()=>{var Se;return[le("Current: v"+U(((Se=_.value)==null?void 0:Se.current)??"…"),1)]}),_:1}),_.value&&!p.value?(y(),$(be,{key:0},[_.value.updateAvailable?(y(),fe(re,{key:0,variant:"blue"},{default:ee(()=>[le("Available: v"+U(_.value.latest),1)]),_:1})):_.value.latest===null?(y(),fe(re,{key:1,variant:"orange"},{default:ee(()=>[...K[10]||(K[10]=[le("Unable to check",-1)])]),_:1})):(y(),fe(re,{key:2,variant:"green"},{default:ee(()=>[...K[11]||(K[11]=[le("Up to date",-1)])]),_:1}))],64)):j("",!0),p.value?(y(),fe(re,{key:1,variant:"grey"},{default:ee(()=>[...K[12]||(K[12]=[le("Checking…",-1)])]),_:1})):j("",!0)]),b("div",CV,[X(pe,{variant:"secondary",size:"sm",outlined:"",loading:p.value,icon:Fs,onClick:x},{default:ee(()=>[...K[13]||(K[13]=[le(" Check ",-1)])]),_:1},8,["loading"]),(J=_.value)!=null&&J.updateAvailable?(y(),fe(pe,{key:0,variant:"primary",size:"sm",loading:A.value,icon:A.value?Jo:Qh,onClick:P},{default:ee(()=>[le(U(A.value?"Updating…":"Install update"),1)]),_:1},8,["loading","icon"])):j("",!0)])]),A.value&&S.value?(y(),fe(D,{key:0,label:v.value,value:S.value==="downloading"&&m.value>0?m.value:void 0,max:100,status:"active",size:"sm"},null,8,["label","value"])):j("",!0),A.value&&!S.value?(y(),fe(Me,{key:1,variant:"helper"},{default:ee(()=>[...K[14]||(K[14]=[le(" Starting update... This page will reconnect automatically. ",-1)])]),_:1})):j("",!0),((_e=_.value)==null?void 0:_e.updateMethod)==="manual"&&_.value.updateAvailable?(y(),fe(Me,{key:2,variant:"helper"},{default:ee(()=>[_.value.pinnedTo?(y(),$(be,{key:0},[le(" This deployment is pinned to "+U(_.value.pinnedTo)+". To move version: ",1)],64)):(y(),$(be,{key:1},[le("Self-update is not available for this install. To update:")],64)),b("code",null,U(_.value.updateCommand),1)]),_:1})):j("",!0),g.value?(y(),$("div",AV,[X(Me,{variant:"error"},{default:ee(()=>[le(U(g.value),1)]),_:1}),X(pe,{variant:"ghost",size:"sm",onClick:I},{default:ee(()=>[...K[15]||(K[15]=[le("Rollback",-1)])]),_:1})])):j("",!0)]}),_:1}),X(ne,{class:"settings-card"},{default:ee(()=>[b("div",kV,[b("div",MV,[X(se,{name:oe(dV),size:18},null,8,["name"])]),K[16]||(K[16]=b("div",null,[b("h2",{class:"card-title"},"Appearance"),b("p",{class:"card-subtitle"},"Stored in this browser, applied as you pick it")],-1))]),X(Te,{dir:"col",gap:"sm",class:"field-grid"},{default:ee(()=>[X(te,{label:"Theme",hint:l.value,control:"fit"},{default:ee(()=>[X(Y,{modelValue:o.value,"onUpdate:modelValue":K[6]||(K[6]=J=>o.value=J),name:"theme",options:a,direction:"horizontal"},null,8,["modelValue"])]),_:1},8,["hint"])]),_:1})]),_:1}),X(ne,{class:"settings-card info-card"},{default:ee(()=>[b("h3",LV,[X(se,{name:oe(g0),size:14},null,8,["name"]),K[17]||(K[17]=le(" How to pair with HomeKit ",-1))]),K[18]||(K[18]=b("ol",{class:"info-list"},[b("li",null,[le(" Open the "),b("strong",null,"Home"),le(" app on your iPhone or iPad ")]),b("li",null,[le(" Tap "),b("strong",null,"+"),le(" → "),b("strong",null,"Add Accessory")]),b("li",null,[le(" Scan the QR code from the Dashboard, or tap "),b("strong",null,"More options"),le(" and enter the PIN code manually ")]),b("li",null,"If you change the PIN or username, unpair first from the Home app, then re-pair")],-1))]),_:1})])}}}),xV=Zt(EV,[["__scopeId","data-v-af630535"]]);/**
67
+ `},M6=lN(dN)(Qm),fN={config:uN},_N=function(){for(var t=arguments.length,i=new Array(t),r=0;r<t;r++)i[r]=arguments[r];return function(s){return i.reduceRight(function(n,a){return a(n)},s)}};function eg(e,t){return Object.keys(t).forEach(function(i){t[i]instanceof Object&&e[i]&&Object.assign(t[i],eg(e[i],t[i]))}),C6(C6({},e),t)}var pN={type:"cancelation",msg:"operation is manually canceled"};function Xc(e){var t=!1,i=new Promise(function(r,s){e.then(function(n){return t?s(pN):r(n)}),e.catch(s)});return i.cancel=function(){return t=!0},i}var mN=["monaco"],gN=aN.create({config:oN,isInitialized:!1,resolve:null,reject:null,monaco:null}),tg=FT(gN,2),pl=tg[0],fc=tg[1];function vN(e){var t=fN.config(e),i=t.monaco,r=BT(t,mN);fc(function(s){return{config:eg(s.config,r),monaco:i}})}function bN(){var e=pl(function(t){var i=t.monaco,r=t.isInitialized,s=t.resolve;return{monaco:i,isInitialized:r,resolve:s}});if(!e.isInitialized){if(fc({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),Xc(Jc);if(window.monaco&&window.monaco.editor)return ig(window.monaco),e.resolve(window.monaco),Xc(Jc);_N(yN,SN)(CN)}return Xc(Jc)}function yN(e){return document.body.appendChild(e)}function wN(e){var t=document.createElement("script");return e&&(t.src=e),t}function SN(e){var t=pl(function(r){var s=r.config,n=r.reject;return{config:s,reject:n}}),i=wN("".concat(t.config.paths.vs,"/loader.js"));return i.onload=function(){return e()},i.onerror=t.reject,i}function CN(){var e=pl(function(i){var r=i.config,s=i.resolve,n=i.reject;return{config:r,resolve:s,reject:n}}),t=window.require;t.config(e.config),t(["vs/editor/editor.main"],function(i){var r=i.m||i;ig(r),e.resolve(r)},function(i){e.reject(i)})}function ig(e){pl().monaco||fc({monaco:e})}function AN(){return pl(function(e){var t=e.monaco;return t})}var Jc=new Promise(function(e,t){return fc({resolve:e,reject:t})}),rg={config:vN,init:bN,__getMonacoInstance:AN};const kN={key:0,class:"monaco-skeleton"},MN=Oe({__name:"MonacoJsonEditor",props:{modelValue:{},height:{}},emits:["update:modelValue"],setup(e,{emit:t}){const i=e,r=t,{resolved:s}=Yh(),n=ie(null),a=Vr(null),o=ie(!1);let l=!1;return _t(async()=>{const c=await rg.init();n.value&&(Fe(s,u=>c.editor.setTheme(u==="dark"?"vs-dark":"vs")),a.value=c.editor.create(n.value,{value:i.modelValue,language:"json",theme:s.value==="dark"?"vs-dark":"vs",fontSize:12,fontFamily:'"MesloLGS NF", monospace',minimap:{enabled:!1},scrollBeyondLastLine:!1,lineNumbers:"off",wordWrap:"on",automaticLayout:!0,tabSize:2,folding:!1,renderLineHighlight:"none",overviewRulerLanes:0,scrollbar:{verticalScrollbarSize:6}}),a.value.onDidChangeModelContent(()=>{l||r("update:modelValue",a.value.getValue())}),o.value=!0)}),Bi(()=>{var c;(c=a.value)==null||c.dispose()}),Fe(()=>i.modelValue,c=>{if(!a.value)return;a.value.getValue()!==c&&(l=!0,a.value.setValue(c),l=!1)}),(c,u)=>(y(),$("div",{style:mi({height:`${e.height??220}px`,width:"100%",position:"relative"})},[b("div",{ref_key:"containerEl",ref:n,style:{height:"100%",width:"100%"}},null,512),o.value?j("",!0):(y(),$("div",kN))],4))}}),L6=Zt(MN,[["__scopeId","data-v-0c34d464"]]),LN={class:"pcf-root"},EN={key:1,class:"pcf-no-schema"},xN=Oe({__name:"PluginConfigForm",props:{hbSchema:{},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:t}){const i=e,r=t;function s(h,d){const f=JSON.parse(JSON.stringify(i.modelValue));let _=f;for(let p=0;p<h.length-1;p++)(_[h[p]]===void 0||typeof _[h[p]]!="object")&&(_[h[p]]={}),_=_[h[p]];_[h[h.length-1]]=d,r("update:modelValue",f)}function n(h){let d=i.modelValue;for(const f of h){if(d==null||typeof d!="object")return;d=d[f]}return d}function a(h){return Array.isArray(h.type)?h.type[0]:h.type??"string"}function o(h,d){const f=n(h)??[],_=d.default??(a(d)==="string"?"":a(d)==="number"?0:"");s(h,[...f,_])}function l(h,d){const f=[...n(h)??[]];f.splice(d,1),s(h,f)}function c(h,d,f){const _=[...n(h)??[]];_[d]=f,s(h,_)}const u=Q(()=>i.hbSchema.schema??{type:"object",properties:{}});return(h,d)=>{const f=Io("PluginConfigField");return y(),$("div",LN,[u.value.properties?(y(!0),$(be,{key:0},Ve(u.value.properties,(_,p)=>{var A;return y(),fe(f,{key:p,"field-key":String(p),field:_,path:[String(p)],required:((A=u.value.required)==null?void 0:A.includes(String(p)))??!1,value:n([String(p)]),onChange:g=>s([String(p)],g),onAddArray:d[0]||(d[0]=(g,S)=>o(g,S)),onRemoveArray:d[1]||(d[1]=(g,S)=>l(g,S)),onUpdateArray:d[2]||(d[2]=(g,S,m)=>c(g,S,m))},null,8,["field-key","field","path","required","value","onChange"])}),128)):(y(),$("div",EN,"No configurable fields found in schema."))])}}}),$N=Zt(xN,[["__scopeId","data-v-d9cf6b0f"]]),TN={key:0,class:"inspector nb-inspector"},NN={class:"inspector-header"},HN={class:"inspector-title"},PN={class:"inspector-name"},ON={class:"inspector-version"},IN={class:"inspector-body"},RN={class:"field-value"},DN={class:"field-value"},VN={class:"hap-bridge-info"},BN={class:"hap-qr"},ZN=["src"],FN={class:"hap-details"},zN={class:"field-value mono"},UN={class:"field-value"},WN={class:"field-value"},jN={key:0,class:"setup-loading"},KN={key:0,class:"platform-tabs"},qN=["onClick"],GN={key:1,class:"visual-editor-wrap"},YN={key:0,class:"json-error"},XN={key:1,class:"json-error"},JN={key:3,class:"save-error"},QN={class:"setup-actions"},eH={key:0,class:"json-error"},tH={key:0,class:"save-error"},iH={class:"setup-actions"},rH={class:"import-export-row"},sH={class:"plugin-device-name"},nH={class:"plugin-device-type"},aH={class:"field-value"},oH={class:"field-value"},lH={class:"field-value"},cH={class:"field-value"},uH={class:"error-text"},hH={class:"plog-time"},dH={class:"plog-msg"},E6="openbridge.pluginInspector.sections",fH=Oe({__name:"PluginInspector",setup(e){const t=ys(),i=ie(!1),r=ie("");async function s(){if(!i.value){i.value=!0;try{await Pe.daemon.restart();let N=0;const L=setInterval(async()=>{N++;try{await Pe.health(),clearInterval(L),location.reload()}catch{}N>60&&(clearInterval(L),i.value=!1)},1e3)}catch{i.value=!1}}}const n=fl(),a=[{id:"visual",label:"Visual",icon:"sliders"},{id:"json",label:"JSON",icon:"brackets-curly"}],o={status:"default",hap:"default",update:"default",manage:"collapsed",config:"default",transfer:"collapsed",devices:"default",manifest:"collapsed",error:"default",logs:"default"},l=ie({...o});try{const N=JSON.parse(localStorage.getItem(E6)??"{}");l.value={...o,...N}}catch{}Fe(l,N=>localStorage.setItem(E6,JSON.stringify(N)),{deep:!0}),Fe(()=>{var N,L;return(L=(N=n.selectedPlugin)==null?void 0:N.hapBridge)==null?void 0:L.setupURI},async N=>{if(N)try{r.value=await oa.toDataURL(N,{width:160,margin:1})}catch{r.value=""}else r.value=""},{immediate:!0});const c=Q(()=>{const N=n.selectedPlugin;return N!=null&&N.devices?Object.values(N.devices):[]}),u={switch:"plugs",light:"lamp",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"};function h(N){return u[N]??"cube"}const d={idle:"Idle",loading:"Loading",running:"Running",stopped:"Stopped",error:"Error"},f=ie(!1);async function _(){if(!(!n.selectedPlugin||f.value)){f.value=!0;try{await Pe.marketplace.update(n.selectedPlugin.manifest.name),await t.fetchPlugins(),await s()}catch(N){console.error("Failed to update plugin:",N)}finally{f.value=!1}}}const p=ie(!1),A=ie(!1);async function g(){if(!(!n.selectedPlugin||A.value)){A.value=!0;try{await Pe.marketplace.uninstall(n.selectedPlugin.manifest.name),await t.fetchPlugins(),n.close(),await Pe.daemon.restart()}catch(N){console.error("Failed to remove plugin:",N)}finally{A.value=!1,p.value=!1}}}const S=ie(!1);async function m(){if(!n.selectedPlugin||S.value)return;const N=!n.selectedPlugin.disabled;S.value=!0;try{const L=await Pe.setPluginDisabled(n.selectedPlugin.id,N);n.selectedPlugin.disabled=L.disabled}catch(L){console.error("Failed to toggle plugin disabled state:",L)}finally{S.value=!1}}const v=ie(null),k=ie(!1),x=ie(""),M=ie(""),z=ie(!1),P=ie(null),I=ie(!1),O=ie(null),T=ie({}),H=ie("visual"),W=Q(()=>{var N;return((N=O.value)==null?void 0:N.schema)!=null}),q=Q(()=>{var N;return((N=n.selectedPlugin)==null?void 0:N.source)==="homebridge"}),K=Q(()=>n.selectedPlugin!=null&&n.selectedPlugin.source!=="homebridge"),se=ie(""),ce=ie(!1),te=ie(null),ge=ie(!1),pe=Q(()=>{try{return JSON.parse(se.value),!0}catch{return!1}});Fe(()=>n.selectedPlugin,async N=>{if(se.value="",te.value=null,ge.value=!1,!(!N||N.source==="homebridge"))try{const L=await Pe.config.getPlugin(N.manifest.name);se.value=JSON.stringify(L.config??{},null,2)}catch{se.value="{}"}});const ve=ie(null);function Te(){var N;(N=ve.value)==null||N.click()}function Me(){if(!n.selectedPlugin)return;const N=n.selectedPlugin.manifest.name,L=q.value?M.value:se.value;if(!L)return;const E=new Blob([L],{type:"application/json"}),R=URL.createObjectURL(E),G=document.createElement("a");G.href=R,G.download=`${N.replace(/[^a-z0-9-]/gi,"-")}-config.json`,G.click(),URL.revokeObjectURL(R)}async function ne(N){var E;const L=(E=N.target.files)==null?void 0:E[0];if(!(!L||!n.selectedPlugin))try{const R=await L.text(),G=JSON.parse(R);let de;if(G.platform&&typeof G.platform=="string"){const{plugin:ye,...Ee}=G;de=Ee}else de=G;await Pe.config.savePlugin(n.selectedPlugin.manifest.name,de),q.value?M.value=JSON.stringify(de,null,2):se.value=JSON.stringify(de,null,2),ve.value&&(ve.value.value="")}catch(R){console.error("Import failed:",R)}}async function re(){if(ce.value||!n.selectedPlugin)return;let N;try{N=JSON.parse(se.value)}catch{te.value="Invalid JSON: fix the syntax first";return}ce.value=!0,te.value=null,ge.value=!1;try{await Pe.config.savePlugin(n.selectedPlugin.manifest.name,N),ge.value=!0,setTimeout(()=>{ge.value=!1},3e3)}catch(L){te.value=String(L)}finally{ce.value=!1}}const D=Q(()=>{const N=n.selectedPlugin;return!N||N.source!=="homebridge"?"":N.platformName??N.id??N.manifest.name});Fe(()=>n.selectedPlugin,async N=>{if(v.value=null,x.value="",M.value="",O.value=null,T.value={},P.value=null,I.value=!1,!(!N||N.source!=="homebridge")){k.value=!0;try{const L=await Pe.config.getHbPlugin(D.value,N.packageName);if(L.config){x.value=D.value,M.value=JSON.stringify(L.config,null,2),T.value=L.config,await Y(N.manifest.name);return}const E=await Pe.pluginInfo(N.packageName??N.manifest.name);v.value=E,E.platforms.length>0&&await J(E.platforms[0],E.mainFile),await Y(N.manifest.name)}catch{try{const L=await Pe.config.getHbPlugin(D.value,N.packageName);L.config&&(x.value=D.value,M.value=JSON.stringify(L.config,null,2),T.value=L.config)}catch{}}finally{k.value=!1}}});async function Y(N){try{const L=await fetch(`/api/marketplace/plugin-schema/${encodeURIComponent(N)}`);if(L.ok){const E=await L.json();O.value=E.schema}}catch{}}async function J(N,L){var E,R;x.value=N;try{const G=await Pe.config.getPlatform(N),de=G.config?G.config:{platform:N,plugin:L??((E=v.value)==null?void 0:E.mainFile)??""};M.value=JSON.stringify(de,null,2),T.value=de}catch{const G={platform:N,plugin:L??((R=v.value)==null?void 0:R.mainFile)??""};M.value=JSON.stringify(G,null,2),T.value=G}}function _e(N){T.value=N,M.value=JSON.stringify(N,null,2)}function Se(N){M.value=N;try{T.value=JSON.parse(N)}catch{}}function B(){try{return JSON.parse(M.value)}catch{return null}}const Z=Q(()=>B()!==null),F=Q(()=>{const N=B();return N!==null&&typeof N.platform!="string"}),ae=ie([]),he=ie(null);let ue=null;function w(){if(ue&&(ue.close(),ue=null),!n.selectedPlugin)return;const N=location.protocol==="https:"?"wss:":"ws:";ue=new WebSocket(`${N}//${location.host}/ws/logs`),ue.onmessage=L=>{var E,R;try{const G=JSON.parse(L.data);(G.plugin===((E=n.selectedPlugin)==null?void 0:E.id)||G.plugin===((R=n.selectedPlugin)==null?void 0:R.manifest.name))&&(ae.value=[...ae.value.slice(-199),G],setTimeout(()=>{he.value&&(he.value.scrollTop=he.value.scrollHeight)},10))}catch{}},ue.onclose=()=>{n.selectedPlugin&&setTimeout(w,3e3)}}Fe(()=>n.selectedPlugin,async N=>{if(ae.value=[],ue==null||ue.close(),ue=null,!!N){try{const L=await Pe.logs(N.manifest.name,100);ae.value=L.entries,setTimeout(()=>{he.value&&(he.value.scrollTop=he.value.scrollHeight)},20)}catch{}w()}}),_t(()=>{n.selectedPlugin&&w()}),Bi(()=>{ue==null||ue.close()});const C={debug:"var(--nb-c-text-muted)",info:"var(--nb-c-info)",warn:"var(--nb-c-warning)",error:"var(--nb-c-danger)"};async function V(){if(z.value||!n.selectedPlugin)return;const N=B();if(!N){P.value="Invalid JSON: fix the syntax first";return}z.value=!0,P.value=null,I.value=!1;try{const L=n.selectedPlugin;L.source==="homebridge"?await Pe.config.saveHbPlugin(D.value,N,L.packageName):await Pe.config.savePlugin(L.manifest.name,N),I.value=!0,setTimeout(()=>{I.value=!1},3e3)}catch(L){P.value=String(L)}finally{z.value=!1}}return(N,L)=>{const E=Ye,R=dm,G=rc,de=Gh,ye=gi,Ee=ec,ze=mE;return oe(n).selectedPlugin?(y(),$("div",TN,[b("div",NN,[b("div",{class:Le(["inspector-avatar",oe(n).selectedPlugin.status])},[X(E,{name:oe(Ws),size:24},null,8,["name"])],2),b("div",HN,[b("h2",PN,U(oe(n).selectedPlugin.manifest.name),1),b("span",ON,"v"+U(oe(n).selectedPlugin.manifest.version),1)])]),b("div",IN,[X(de,{size:l.value.status,"onUpdate:size":L[0]||(L[0]=ke=>l.value.status=ke),title:"Status",fluid:""},{default:ee(()=>[X(R,{label:"Status",control:"fit"},{default:ee(()=>[b("span",{class:Le(["status-badge",oe(n).selectedPlugin.status])},U(d[oe(n).selectedPlugin.status]),3)]),_:1}),oe(n).selectedPlugin.startedAt?(y(),fe(R,{key:0,label:"Started",control:"fit"},{default:ee(()=>[b("span",RN,U(new Date(oe(n).selectedPlugin.startedAt).toLocaleString()),1)]),_:1})):j("",!0),oe(n).selectedPlugin.stoppedAt?(y(),fe(R,{key:1,label:"Stopped",control:"fit"},{default:ee(()=>[b("span",DN,U(new Date(oe(n).selectedPlugin.stoppedAt).toLocaleString()),1)]),_:1})):j("",!0),X(R,{label:"Disabled",control:"fit"},{default:ee(()=>[X(G,{name:`plugin-disabled-${oe(n).selectedPlugin.id}`,"model-value":oe(n).selectedPlugin.disabled??!1,disabled:S.value,"onUpdate:modelValue":m},null,8,["name","model-value","disabled"])]),_:1})]),_:1},8,["size"]),oe(n).selectedPlugin.hapBridge?(y(),fe(de,{key:0,size:l.value.hap,"onUpdate:size":L[1]||(L[1]=ke=>l.value.hap=ke),title:"HomeKit pairing",fluid:""},{default:ee(()=>[b("div",VN,[b("div",BN,[r.value?(y(),$("img",{key:0,src:r.value,alt:"HomeKit QR Code",class:"hap-qr-img"},null,8,ZN)):j("",!0)]),b("div",FN,[X(R,{label:"PIN",control:"fit"},{default:ee(()=>[b("span",zN,U(oe(n).selectedPlugin.hapBridge.pincode),1)]),_:1}),X(R,{label:"Port",control:"fit"},{default:ee(()=>[b("span",UN,U(oe(n).selectedPlugin.hapBridge.port),1)]),_:1}),X(R,{label:"Bridge",control:"fit"},{default:ee(()=>[b("span",WN,U(oe(n).selectedPlugin.hapBridge.name),1)]),_:1})])]),L[15]||(L[15]=b("p",{class:"hap-hint"},"Scan with the Home app or enter the PIN manually to pair this plugin's devices.",-1))]),_:1},8,["size"])):j("",!0),oe(n).selectedPlugin.availableUpdate?(y(),fe(de,{key:1,size:l.value.update,"onUpdate:size":L[2]||(L[2]=ke=>l.value.update=ke),title:"Update",fluid:""},{default:ee(()=>[X(Ee,{status:"info",icon:Qh,title:`Version ${oe(n).selectedPlugin.availableUpdate} is available`},{action:ee(()=>[X(ye,{variant:"primary",size:"sm",loading:f.value,disabled:f.value,onClick:_},{default:ee(()=>[le(U(f.value?"Updating...":"Update"),1)]),_:1},8,["loading","disabled"])]),default:ee(()=>[le(" Currently on "+U(oe(n).selectedPlugin.manifest.version)+". ",1)]),_:1},8,["title"])]),_:1},8,["size"])):j("",!0),X(de,{size:l.value.manage,"onUpdate:size":L[5]||(L[5]=ke=>l.value.manage=ke),title:"Manage",fluid:""},{default:ee(()=>[p.value?(y(),fe(Ee,{key:1,status:"error",title:"This uninstalls the plugin and removes its configuration"},{action:ee(()=>[X(ye,{variant:"ghost",size:"sm",onClick:L[4]||(L[4]=ke=>p.value=!1)},{default:ee(()=>[...L[17]||(L[17]=[le("Cancel",-1)])]),_:1}),X(ye,{variant:"primary",size:"sm",loading:A.value,style:{background:"var(--nb-c-danger)","border-color":"var(--nb-c-danger)"},onClick:g},{default:ee(()=>[...L[18]||(L[18]=[le(" Remove ",-1)])]),_:1},8,["loading"])]),default:ee(()=>[L[19]||(L[19]=le(" OpenBridge needs a restart afterwards. ",-1))]),_:1})):(y(),fe(ye,{key:0,variant:"ghost",size:"sm",icon:ed,style:{color:"var(--nb-c-danger)"},onClick:L[3]||(L[3]=ke=>p.value=!0)},{default:ee(()=>[...L[16]||(L[16]=[le(" Remove plugin ",-1)])]),_:1}))]),_:1},8,["size"]),q.value?(y(),fe(de,{key:2,size:l.value.config,"onUpdate:size":L[7]||(L[7]=ke=>l.value.config=ke),title:"Platform config",fluid:""},{default:ee(()=>[k.value?(y(),$("div",jN,[X(E,{name:oe(Ln),size:14},null,8,["name"]),L[20]||(L[20]=le(" Loading config… ",-1))])):(y(),$(be,{key:1},[v.value&&v.value.platforms.length>1?(y(),$("div",KN,[(y(!0),$(be,null,Ve(v.value.platforms,ke=>(y(),$("button",{key:ke,class:Le(["platform-tab",{active:x.value===ke}]),onClick:St=>J(ke)},U(ke),11,qN))),128))])):v.value&&v.value.platforms.length===0?(y(),fe(Ee,{key:1,status:"warning",variant:"callout",title:"No platform detected"},{default:ee(()=>[...L[21]||(L[21]=[le(" Add a ",-1),b("code",null,"platforms[]",-1),le(" entry manually in Config. ",-1)])]),_:1})):j("",!0),!v.value||v.value.platforms.length>0?(y(),$(be,{key:2},[W.value?(y(),fe(ze,{key:0,"model-value":H.value,items:a,variant:"contained",size:"sm","onUpdate:modelValue":L[6]||(L[6]=ke=>H.value=ke)},null,8,["model-value"])):j("",!0),H.value==="visual"&&W.value?(y(),$("div",GN,[X($N,{"hb-schema":O.value,"model-value":T.value,"onUpdate:modelValue":_e},null,8,["hb-schema","model-value"])])):j("",!0),H.value==="json"||!W.value?(y(),$("div",{key:2,class:Le(["config-editor-wrap",{invalid:M.value&&!Z.value}])},[X(L6,{"model-value":M.value,height:220,"onUpdate:modelValue":Se},null,8,["model-value"]),M.value&&!Z.value?(y(),$("div",YN,"Invalid JSON")):F.value?(y(),$("div",XN,'Missing "platform" field')):j("",!0)],2)):j("",!0),P.value?(y(),$("div",JN,[X(E,{name:oe(wn),size:13},null,8,["name"]),le(" "+U(P.value),1)])):j("",!0),b("div",QN,[X(ye,{variant:"primary",size:"sm",loading:z.value,disabled:z.value||!Z.value||F.value,icon:I.value?_s:A0,onClick:V},{default:ee(()=>[le(U(I.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),I.value?(y(),fe(ye,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?Jo:Fs,onClick:s},{default:ee(()=>[le(U(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):j("",!0)])],64)):j("",!0)],64))]),_:1},8,["size"])):j("",!0),K.value?(y(),fe(de,{key:3,size:l.value.config,"onUpdate:size":L[9]||(L[9]=ke=>l.value.config=ke),title:"Plugin config",fluid:""},{default:ee(()=>[b("div",{class:Le(["config-editor-wrap",{invalid:se.value&&!pe.value}])},[X(L6,{"model-value":se.value,height:220,"onUpdate:modelValue":L[8]||(L[8]=ke=>se.value=ke)},null,8,["model-value"]),se.value&&!pe.value?(y(),$("div",eH,"Invalid JSON")):j("",!0)],2),te.value?(y(),$("div",tH,[X(E,{name:oe(wn),size:13},null,8,["name"]),le(" "+U(te.value),1)])):j("",!0),b("div",iH,[X(ye,{variant:"primary",size:"sm",loading:ce.value,disabled:ce.value||!pe.value,icon:ge.value?_s:A0,onClick:re},{default:ee(()=>[le(U(ge.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),ge.value?(y(),fe(ye,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?Jo:Fs,onClick:s},{default:ee(()=>[le(U(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):j("",!0)])]),_:1},8,["size"])):j("",!0),X(de,{size:l.value.transfer,"onUpdate:size":L[10]||(L[10]=ke=>l.value.transfer=ke),title:"Import & export",fluid:""},{default:ee(()=>[b("div",rH,[X(ye,{variant:"ghost",size:"sm",icon:Z$,onClick:Me},{default:ee(()=>[...L[22]||(L[22]=[le("Export config",-1)])]),_:1}),X(ye,{variant:"ghost",size:"sm",icon:q$,onClick:Te},{default:ee(()=>[...L[23]||(L[23]=[le("Import config",-1)])]),_:1}),b("input",{ref_key:"importInput",ref:ve,type:"file",accept:".json",style:{display:"none"},onChange:ne},null,544)])]),_:1},8,["size"]),c.value.length>0?(y(),fe(de,{key:4,size:l.value.devices,"onUpdate:size":L[11]||(L[11]=ke=>l.value.devices=ke),title:`Devices (${c.value.length})`,fluid:""},{default:ee(()=>[(y(!0),$(be,null,Ve(c.value,ke=>(y(),$("div",{key:ke.id,class:"plugin-device-row"},[X(E,{name:h(ke.widgetType),size:14},null,8,["name"]),b("span",sH,U(ke.name),1),b("span",nH,U(ke.widgetType),1)]))),128))]),_:1},8,["size","title"])):j("",!0),X(de,{size:l.value.manifest,"onUpdate:size":L[12]||(L[12]=ke=>l.value.manifest=ke),title:"Manifest",fluid:""},{default:ee(()=>[X(R,{label:"Name",control:"fit"},{default:ee(()=>[b("span",aH,U(oe(n).selectedPlugin.manifest.name),1)]),_:1}),X(R,{label:"Version",control:"fit"},{default:ee(()=>[b("span",oH,U(oe(n).selectedPlugin.manifest.version),1)]),_:1}),oe(n).selectedPlugin.manifest.description?(y(),fe(R,{key:0,label:"Description",control:"fit"},{default:ee(()=>[b("span",lH,U(oe(n).selectedPlugin.manifest.description),1)]),_:1})):j("",!0),oe(n).selectedPlugin.manifest.author?(y(),fe(R,{key:1,label:"Author",control:"fit"},{default:ee(()=>[b("span",cH,U(oe(n).selectedPlugin.manifest.author),1)]),_:1})):j("",!0)]),_:1},8,["size"]),oe(n).selectedPlugin.error?(y(),fe(de,{key:5,size:l.value.error,"onUpdate:size":L[13]||(L[13]=ke=>l.value.error=ke),title:"Error",fluid:""},{default:ee(()=>[X(Ee,{status:"error"},{default:ee(()=>[b("code",uH,U(oe(n).selectedPlugin.error),1)]),_:1})]),_:1},8,["size"])):j("",!0),ae.value.length>0?(y(),fe(de,{key:6,size:l.value.logs,"onUpdate:size":L[14]||(L[14]=ke=>l.value.logs=ke),title:"Recent logs",fluid:""},{default:ee(()=>[b("div",{ref_key:"logsEl",ref:he,class:"plugin-log-terminal"},[(y(!0),$(be,null,Ve(ae.value,(ke,St)=>(y(),$("div",{key:St,class:"plugin-log-line"},[b("span",hH,U(new Date(ke.timestamp).toLocaleTimeString()),1),b("span",{class:"plog-level",style:mi({color:C[ke.level]})},U(ke.level.toUpperCase()),5),b("span",dH,U(ke.message),1)]))),128))],512)]),_:1},8,["size"])):j("",!0)])])):j("",!0)}}}),_H=Zt(fH,[["__scopeId","data-v-b8eb965d"]]),pH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},un=pH("diamond","0 0 256 256",'<path d="M235.33,116.72,139.28,20.66a16,16,0,0,0-22.56,0l-96,96.06a16,16,0,0,0,0,22.56l96.05,96.06h0a16,16,0,0,0,22.56,0l96.05-96.06a16,16,0,0,0,0-22.56ZM128,224h0L32,128,128,32,224,128Z"/>'),mH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},gH=mH("folder","0 0 256 256",'<path d="M216,72H131.31L104,44.69A15.86,15.86,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.4,15.4,0,0,0,39.38,216H216.89A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40ZM216,200H40V88H216Z"/>'),vH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},bH=vH("cloud-arrow-down","0 0 256 256",'<path d="M248,128a87.34,87.34,0,0,1-17.6,52.81,8,8,0,1,1-12.8-9.62A71.34,71.34,0,0,0,232,128a72,72,0,0,0-144,0,8,8,0,0,1-16,0,88,88,0,0,1,3.29-23.88C74.2,104,73.1,104,72,104a48,48,0,0,0,0,96H96a8,8,0,0,1,0,16H72A64,64,0,1,1,81.29,88.68,88,88,0,0,1,248,128Zm-69.66,42.34L160,188.69V128a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z"/>'),yH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},wH=yH("star","0 0 256 256",'<path d="M234.29,114.85l-45,38.83L203,211.75a16.4,16.4,0,0,1-24.5,17.82L128,198.49,77.47,229.57A16.4,16.4,0,0,1,53,211.75l13.76-58.07-45-38.83A16.46,16.46,0,0,1,31.08,86l59-4.76,22.76-55.08a16.36,16.36,0,0,1,30.27,0l22.75,55.08,59,4.76a16.46,16.46,0,0,1,9.37,28.86Z"/>'),SH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},sg=SH("heart","0 0 256 256",'<path d="M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0C119.79,228.66,16,172,16,102A62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z"/>'),CH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},ng=CH("book-open","0 0 256 256",'<path d="M232,48H160a40,40,0,0,0-32,16A40,40,0,0,0,96,48H24a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8H96a24,24,0,0,1,24,24,8,8,0,0,0,16,0,24,24,0,0,1,24-24h72a8,8,0,0,0,8-8V56A8,8,0,0,0,232,48ZM96,192H32V64H96a24,24,0,0,1,24,24V200A39.81,39.81,0,0,0,96,192Zm128,0H160a39.81,39.81,0,0,0-24,8V88a24,24,0,0,1,24-24h64Z"/>'),AH=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},kH=AH("arrow-square-out","0 0 256 256",'<path d="M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"/>');let MH=0;function LH(){return`notif-${Date.now()}-${++MH}`}function ag(){const e=Am();function t(i,r,s){e.add({id:LH(),variant:i,message:r,title:s==null?void 0:s.title,duration:(s==null?void 0:s.duration)??(i==="error"?6e3:3200)})}return{success:(i,r)=>t("success",i,r),error:(i,r)=>t("error",i,r),warning:(i,r)=>t("warning",i,r),info:(i,r)=>t("info",i,r),dismiss:i=>e.remove(i),clear:()=>e.clear()}}const EH={class:"mp-panel"},xH={class:"mp-search-wrap"},$H={key:0,class:"mp-count"},TH={key:3,class:"mp-local-section"},NH={class:"mp-local-heading"},HH={class:"mp-avatar mp-avatar--ob"},PH={class:"mp-info"},OH={class:"mp-name-row"},IH={class:"mp-name"},RH={class:"badge badge--native"},DH={class:"badge badge--local"},VH={class:"mp-ver"},BH={key:0,class:"mp-desc"},ZH={class:"mp-meta"},FH={key:0},zH={class:"mp-action"},UH={class:"mp-list"},WH={key:0,class:"mp-loading"},jH=["src","alt"],KH={class:"mp-info"},qH={class:"mp-name-row"},GH={class:"mp-name"},YH={class:"mp-ver"},XH={key:0,class:"mp-desc"},JH={class:"mp-meta"},QH={key:0},eP={key:1,class:"mp-sep"},tP={class:"mp-enriched"},iP={key:0,class:"mp-stat"},rP={key:1,class:"mp-stat"},sP=["href"],nP=["href"],aP=["href"],oP={class:"mp-action"},lP={key:1,class:"mp-load-more-wrap"},cP=20,uP="https://marketplace.openbridge.nubisco.io/api",hP=Oe({__name:"MarketplacePanel",setup(e){const t=ys(),i=ag(),r=ie(null),s=ie(""),n=ie([]),a=ie(0),o=ie(!1),l=ie(null),c=ie(null),u=ie(new Map),h=ie(null),d=ie(0),f=ie([]);function _(O){return{name:O.name,version:O.version,description:O.description??"",author:O.author?{name:O.author}:void 0,date:O.last_published_at,weeklyDownloads:O.weekly_downloads,githubStars:O.github_stars??void 0,githubSponsorsUrl:O.github_sponsors_url??void 0,documentationUrl:O.homepage??void 0,links:{npm:O.npm_url,homepage:O.homepage??void 0,repository:O.repository_url??void 0}}}function p(O){return O?O>=1e6?`${(O/1e6).toFixed(1)}M`:O>=1e3?`${(O/1e3).toFixed(1)}K`:O.toString():"0"}async function A(O=!0){O&&(d.value=0,n.value=[]),o.value=!0,l.value=null;try{const T=d.value+1,H=new URLSearchParams({q:s.value,page:String(T),limit:String(cP)}),W=await fetch(`${uP}/plugins?${H}`);if(!W.ok)throw new Error(`Marketplace API error: ${W.status}`);const q=await W.json(),K=q.plugins.map(_);n.value=O?K:[...n.value,...K],a.value=q.total}catch(T){l.value=String(T)}finally{o.value=!1}}async function g(O){if(!c.value){c.value=O.name,l.value=null;try{const T=await Pe.marketplace.install(O.name);u.value.set(O.name,T.mainFile),h.value={name:O.name,mainFile:T.mainFile},await Pe.pluginsRefresh(),await t.fetchPlugins(),i.success(`Installed ${O.name}`)}catch(T){l.value=`Failed to install ${O.name}: ${T}`,i.error(`Failed to install ${O.name}`)}finally{c.value=null}}}async function S(O){if(!r.value){r.value=O,l.value=null;try{await Pe.marketplace.uninstall(O),u.value.delete(O),await t.fetchPlugins(),i.success(`Removed ${O}`)}catch(T){l.value=`Failed to uninstall ${O}: ${T}`,i.error(`Failed to remove ${O}`)}finally{r.value=null}}}async function m(O){if(!(c.value||!O.platform)){c.value=O.name,l.value=null;try{await Pe.config.savePlugin(O.name,{platform:O.platform}),u.value.set(O.name,`${O.path}/dist/index.js`),h.value={name:O.name,mainFile:`${O.path}/dist/index.js`},await t.fetchPlugins(),i.success(`Activated ${O.name}`)}catch(T){l.value=`Failed to activate ${O.name}: ${T}`,i.error(`Failed to activate ${O.name}`)}finally{c.value=null}}}function v(O){var W,q;const H=(((W=O.links)==null?void 0:W.repository)??((q=O.links)==null?void 0:q.homepage)??"").match(/github\.com\/([^/]+)/);return H?`https://github.com/${H[1]}.png?size=48`:null}function k(O){return O.name.includes("openbridge-")||Array.isArray(O.badges)&&O.badges.includes("openbridge-plugin")}function x(O){return O.author?typeof O.author=="string"?O.author:O.author.name??"":""}function M(O){const T=Math.floor((Date.now()-new Date(O).getTime())/864e5);return T===0?"today":T<30?`${T}d ago`:T<365?`${Math.floor(T/30)}mo ago`:`${Math.floor(T/365)}y ago`}function z(){d.value++,A(!1)}let P=null;function I(){P&&clearTimeout(P),P=setTimeout(()=>A(),350)}return _t(async()=>{try{const O=await Pe.marketplace.installed();for(const T of O.packages)u.value.set(T.name,T.mainFile)}catch{}try{const O=await Pe.marketplace.local();f.value=O.plugins}catch{}A()}),(O,T)=>{const H=ul,W=ec,q=rt,K=Ye,se=gi,ce=hl;return y(),$("div",EH,[T[15]||(T[15]=b("div",{class:"mp-header"},[b("span",{class:"mp-title"},"Browse Plugins")],-1)),b("div",xH,[X(H,{modelValue:s.value,"onUpdate:modelValue":[T[0]||(T[0]=te=>s.value=te),I],placeholder:"Search plugins",size:"sm"},null,8,["modelValue"])]),a.value>0?(y(),$("div",$H,U(a.value.toLocaleString())+" plugins found",1)):j("",!0),h.value?(y(),fe(W,{key:1,status:"success",dismissible:"",class:"mp-installed-banner",title:`${h.value.name} installed`,onDismiss:T[1]||(T[1]=te=>h.value=null)},{default:ee(()=>[...T[3]||(T[3]=[le(" Click it in your plugins list to configure it. ",-1)])]),_:1},8,["title"])):j("",!0),l.value?(y(),fe(q,{key:2,variant:"error"},{default:ee(()=>[le(U(l.value),1)]),_:1})):j("",!0),f.value.length>0?(y(),$("div",TH,[b("div",NH,[X(K,{name:oe(un),size:11},null,8,["name"]),T[4]||(T[4]=le(" Local plugins ",-1))]),(y(!0),$(be,null,Ve(f.value,te=>(y(),fe(ce,{key:te.name,class:"mp-row mp-row--ob mp-row--local"},{default:ee(()=>[b("div",HH,[X(K,{name:oe(un),size:16},null,8,["name"])]),b("div",PH,[b("div",OH,[b("span",IH,U(te.name),1),b("span",RH,[X(K,{name:oe(un),size:9},null,8,["name"]),T[5]||(T[5]=le(" Native ",-1))]),b("span",DH,[X(K,{name:oe(gH),size:9},null,8,["name"]),T[6]||(T[6]=le(" Local ",-1))]),b("span",VH,"v"+U(te.version),1)]),te.description?(y(),$("p",BH,U(te.description),1)):j("",!0),b("div",ZH,[te.author?(y(),$("span",FH,U(te.author),1)):j("",!0)])]),b("div",zH,[u.value.has(te.name)?(y(),fe(se,{key:0,variant:"ghost",size:"sm",disabled:"",icon:_s},{default:ee(()=>[...T[7]||(T[7]=[le("Active",-1)])]),_:1})):(y(),fe(se,{key:1,variant:"primary",size:"sm",loading:c.value===te.name,disabled:!!c.value||!te.platform,title:te.platform?"":"No platform declared in package.json openbridge.platform",onClick:ge=>m(te)},{default:ee(()=>[...T[8]||(T[8]=[le(" Activate ",-1)])]),_:1},8,["loading","disabled","title","onClick"]))])]),_:2},1024))),128))])):j("",!0),b("div",UH,[o.value&&n.value.length===0?(y(),$("div",WH,[X(K,{name:oe(Ln),size:22},null,8,["name"]),T[9]||(T[9]=b("span",null,"Searching npm…",-1))])):j("",!0),(y(!0),$(be,null,Ve(n.value,te=>(y(),fe(ce,{key:te.name,class:Le(["mp-row",{"mp-row--ob":k(te)}])},{default:ee(()=>[b("div",{class:Le(["mp-avatar",{"mp-avatar--ob":k(te)}])},[v(te)?(y(),$("img",{key:0,src:v(te),alt:te.name,class:"mp-avatar-img",onError:T[2]||(T[2]=ge=>ge.target.style.display="none")},null,40,jH)):j("",!0),k(te)?(y(),fe(K,{key:1,name:oe(un),size:16},null,8,["name"])):(y(),fe(K,{key:2,name:oe(Ws),size:16},null,8,["name"]))],2),b("div",KH,[b("div",qH,[b("span",GH,U(te.name),1),b("span",YH,"v"+U(te.version),1)]),te.description?(y(),$("p",XH,U(te.description),1)):j("",!0),b("div",JH,[x(te)?(y(),$("span",QH,U(x(te)),1)):j("",!0),x(te)?(y(),$("span",eP,"·")):j("",!0),b("span",null,U(M(te.date)),1)]),b("div",tP,[te.weeklyDownloads?(y(),$("span",iP,[X(K,{name:oe(bH),size:11},null,8,["name"]),le(" "+U(p(te.weeklyDownloads)),1)])):j("",!0),te.githubStars?(y(),$("span",rP,[X(K,{name:oe(wH),weight:"fill",size:11},null,8,["name"]),le(" "+U(p(te.githubStars)),1)])):j("",!0),te.githubSponsorsUrl?(y(),$("a",{key:2,href:te.githubSponsorsUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[X(K,{name:oe(sg),weight:"fill",size:11},null,8,["name"]),T[10]||(T[10]=le(" Sponsor ",-1))],8,sP)):j("",!0),te.documentationUrl?(y(),$("a",{key:3,href:te.documentationUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[X(K,{name:oe(ng),size:11},null,8,["name"]),T[11]||(T[11]=le(" Docs ",-1))],8,nP)):j("",!0),b("a",{href:`https://marketplace.openbridge.nubisco.io/plugins/${te.name}`,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link mp-stat--marketplace"},[X(K,{name:oe(kH),size:11},null,8,["name"]),T[12]||(T[12]=le(" Marketplace ",-1))],8,aP)])]),b("div",oP,[u.value.has(te.name)?(y(),fe(se,{key:0,variant:"danger",size:"sm",outlined:"",loading:r.value===te.name,disabled:!!r.value,onClick:ge=>S(te.name)},{default:ee(()=>[...T[13]||(T[13]=[le(" Remove ",-1)])]),_:1},8,["loading","disabled","onClick"])):(y(),fe(se,{key:1,variant:"primary",size:"sm",loading:c.value===te.name,disabled:!!c.value,onClick:ge=>g(te)},{default:ee(()=>[...T[14]||(T[14]=[le(" Install ",-1)])]),_:1},8,["loading","disabled","onClick"]))])]),_:2},1032,["class"]))),128)),n.value.length>0&&n.value.length<a.value?(y(),$("div",lP,[X(se,{variant:"ghost",size:"sm",loading:o.value,disabled:o.value,onClick:z},{default:ee(()=>[le(U(o.value?"Loading…":`Load more (${a.value-n.value.length} remaining)`),1)]),_:1},8,["loading","disabled"])])):j("",!0)])])}}}),dP=Zt(hP,[["__scopeId","data-v-37815e6e"]]),fP={key:0,class:"inspector-content nb-inspector"},_P={class:"detail-header"},pP={class:"detail-icon native-icon"},mP={style:{flex:"1","min-width":"0"}},gP={key:1,class:"rename-row"},vP={class:"detail-type"},bP={class:"info-grid"},yP={class:"info-val"},wP={class:"info-val"},SP={class:"info-val"},CP={class:"info-val"},AP={class:"info-val mono"},kP={key:0,class:"widget-energy"},MP={class:"energy-primary"},LP={class:"energy-value"},EP={class:"energy-secondary"},xP={key:0,class:"energy-item"},$P={class:"energy-item-val"},TP={key:1,class:"energy-item"},NP={class:"energy-item-val"},HP={key:1,class:"widget-thermo"},PP={class:"thermo-row"},OP={class:"thermo-value"},IP={class:"thermo-row"},RP={class:"thermo-value accent"},DP={class:"thermo-row"},VP={key:2,class:"widget-thermo"},BP={class:"thermo-row"},ZP={class:"thermo-value"},FP={class:"thermo-row"},zP={class:"thermo-value accent"},UP={class:"thermo-row"},WP={key:3,class:"widget-generic"},jP={key:0,class:"no-telemetry"},KP={class:"char-name"},qP={class:"char-value"},GP={class:"history-tabs"},YP=["onClick"],XP={key:0,class:"history-nav"},JP={class:"history-nav-center"},QP={class:"history-total"},eO={class:"history-date"},tO={key:2,class:"no-history"},iO={key:3,class:"no-history"},rO={key:4,class:"no-history"},sO={class:"calibration-actions"},nO={class:"char-list"},aO={class:"char-name"},oO={class:"char-value"},lO={key:0,class:"homekit-notice"},cO={class:"homekit-row"},uO={key:1,class:"homekit-notice"},hO={class:"detail-header"},dO={class:"detail-icon"},fO={style:{flex:"1","min-width":"0"}},_O={key:1,class:"rename-row"},pO={class:"detail-type"},mO={class:"info-grid"},gO={key:0,class:"info-key"},vO={key:1,class:"info-val"},bO={key:0,class:"homekit-row"},yO={key:1,class:"homekit-notice"},wO={class:"char-list"},SO={class:"char-name"},CO={class:"homekit-row"},AO={key:0,class:"homekit-notice"},kO={class:"detail-uuid"},MO=Oe({__name:"DeviceInspector",setup(e){const t=ie(new Set),i=ie(!1),r=ie("");function s(L){return!t.value.has(L)}async function n(){try{const{hidden:L}=await Pe.homekitHidden();t.value=new Set(L)}catch{}}async function a(L,E){i.value=!0,r.value="";try{const R=await Pe.setHomekitVisibility(L,E),G=new Set(t.value);E?G.delete(L):G.add(L),t.value=G,R.applied||(r.value="Saved. This takes effect after the next OpenBridge restart.")}catch(R){r.value=`Could not change visibility: ${R.message}`}finally{i.value=!1}}const o=ie({}),l=ie([]),c=ie(""),u=Q(()=>[{value:"",label:"Default (as published)"},...l.value.map(L=>({value:L.key,label:L.label}))]);function h(L){return l.value.some(E=>E.serviceUuid===L)}function d(L,E){var R;return((R=o.value[L])==null?void 0:R[E])??""}const f=ie(null);function _(L){return L.homekitType||L.widgetType}async function p(L){f.value=null;try{const{accessory:E}=await Pe.deviceAccessory(L);f.value=E}catch{}}async function A(){try{const{overrides:L,available:E}=await Pe.homekitServiceTypes();o.value=L,l.value=E}catch{}}async function g(L,E,R){i.value=!0,c.value="";try{await Pe.setHomekitServiceType(L,E,R||null);const G={...o.value},de={...G[L]??{}};R?de[E]=R:delete de[E],Object.keys(de).length>0?G[L]=de:delete G[L],o.value=G,c.value="Saved. This takes effect after the next OpenBridge restart."}catch(G){c.value=`Could not change type: ${G.message}`}finally{i.value=!1}}_t(()=>{n(),A()});const S=fl(),m=Q(()=>S.selectedDevice),v=Q(()=>m.value?m.value.kind==="native"?m.value.dev.id:m.value.acc.uuid:null),k={1:{label:"Other",icon:"cube"},2:{label:"Bridge",icon:"intersect"},3:{label:"Fan",icon:"fan"},4:{label:"Garage Door",icon:"garage"},5:{label:"Light",icon:"lightbulb"},6:{label:"Lock",icon:"lock"},7:{label:"Outlet",icon:"plugs"},8:{label:"Switch",icon:"toggle-right"},9:{label:"Thermostat",icon:"thermometer"},10:{label:"Sensor",icon:"pulse"},11:{label:"Security",icon:"shield"},12:{label:"Door",icon:"door"},13:{label:"Window",icon:"app-window"},14:{label:"Window Covering",icon:"rows"},15:{label:"Programm. Switch",icon:"sliders"},16:{label:"Range Extender",icon:"broadcast"},17:{label:"Camera",icon:"camera"},18:{label:"Video Doorbell",icon:"bell"},19:{label:"Air Purifier",icon:"wind"},20:{label:"Heater/Cooler",icon:"thermometer-hot"},21:{label:"Air Conditioner",icon:"snowflake"},22:{label:"Humidifier",icon:"drop"},23:{label:"Dehumidifier",icon:"drop"},26:{label:"Speaker",icon:"speaker-high"},28:{label:"Sprinkler",icon:"drop"},29:{label:"Faucet",icon:"drop"},30:{label:"Shower",icon:"drop"},32:{label:"TV",icon:"television"},34:{label:"Router",icon:"broadcast"},36:{label:"Target Control",icon:"game-controller"},38:{label:"Smart Speaker",icon:"speaker-hifi"}};function x(L){return k[L]??{label:`Category ${L}`,icon:"cube"}}const M=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]);function z(L){return L.services.filter(E=>!M.has(E.name)&&!M.has(E.uuid))}function P(L){return L.services.find(E=>M.has(E.name)||M.has(E.uuid))}function I(L){const E=P(L);if(!E)return null;const R=G=>{var de;return(de=E.characteristics.find(ye=>ye.name===G||ye.name.includes(G)))==null?void 0:de.value};return{manufacturer:R("Manufacturer")??R("Manuf"),model:R("Model"),serial:R("SerialNumber")??R("Serial"),firmware:R("FirmwareRevision")??R("Firmware")}}function O(L){return L.value===null||L.value===void 0?"—":L.format==="bool"?L.value?"On":"Off":typeof L.value=="number"?String(Math.round(L.value*100)/100):String(L.value)}function T(L){return L.perms.includes("pw")}const H=ie(!1),W=ie("");function q(L){W.value=L,H.value=!0}async function K(L){var E,R;if(W.value.trim())try{const G=W.value.trim();await Pe.renameDevice(L,G),H.value=!1,((E=m.value)==null?void 0:E.kind)==="native"?m.value.dev.name=G:((R=m.value)==null?void 0:R.kind)==="hap"&&(m.value.acc.displayName=G);const{useDaemonStore:de}=await qf(async()=>{const{useDaemonStore:Ee}=await Promise.resolve().then(()=>h6);return{useDaemonStore:Ee}},void 0);await de().fetchAccessories()}catch(G){console.error("Rename failed:",G)}}async function se(L,E,R,G){try{await Pe.setCharacteristic(L,E,R,G);const{useDaemonStore:de}=await qf(async()=>{const{useDaemonStore:Ee}=await Promise.resolve().then(()=>h6);return{useDaemonStore:Ee}},void 0);await de().fetchAccessories()}catch(de){console.error("Failed to set characteristic:",de)}}const ce={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"},te={switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",gate:"Gate",sensor:"Sensor"};function ge(L){return ce[L]??"cube"}function pe(L){return te[L]??L}function ve(L,E=1){if(L==null)return"—";const R=Number(L);return isFinite(R)?R.toFixed(E):String(L)}function Te(L){return Object.entries(L.telemetry).filter(([E])=>!E.startsWith("_"))}const Me=ie("day"),ne=ie(new Date().toISOString().slice(0,10)),re=ie(null),D=ie(!1);async function Y(L){if(!D.value){D.value=!0;try{re.value=await Pe.deviceHistory(L,Me.value,ne.value)}catch{}finally{D.value=!1}}}function J(L){var R;const E=new Date(ne.value+(ne.value.length<=7?"-01":""));Me.value==="day"?(E.setDate(E.getDate()+L),ne.value=E.toISOString().slice(0,10)):Me.value==="month"?(E.setMonth(E.getMonth()+L),ne.value=E.toISOString().slice(0,7)):(E.setFullYear(E.getFullYear()+L),ne.value=String(E.getFullYear())),((R=m.value)==null?void 0:R.kind)==="native"&&Y(m.value.dev.id)}Fe(Me,()=>{var E;const L=new Date;Me.value==="day"?ne.value=L.toISOString().slice(0,10):Me.value==="month"?ne.value=L.toISOString().slice(0,7):ne.value=String(L.getFullYear()),((E=m.value)==null?void 0:E.kind)==="native"&&m.value.dev.widgetType==="energy_meter"&&Y(m.value.dev.id)}),Fe(v,(L,E)=>{if(L===E&&re.value)return;const R=m.value;(R==null?void 0:R.kind)==="native"?p(R.dev.id):f.value=null,(R==null?void 0:R.kind)==="native"&&R.dev.widgetType==="energy_meter"&&(ne.value=new Date().toISOString().slice(0,10),Me.value="day",Y(R.dev.id))},{immediate:!0});const _e=ie([]),Se=ie([]),B=ie(!1),Z=ie(!1),F=ie(!1),ae=Q(()=>JSON.stringify(_e.value)!==JSON.stringify(Se.value)),he=Q(()=>!m.value||m.value.kind!=="native"?null:m.value.dev);async function ue(L){const{plugins:E}=await Pe.plugins(),R=E.find(de=>de.id===L.pluginId);if(!R)return null;if(R.source!=="homebridge"){const{config:de}=await Pe.config.getPlugin(L.pluginId);return de?{pluginConfig:de,isNative:!0,pluginName:L.pluginId,platformName:void 0}:null}else{const de=R.platformName??L.pluginId,{config:ye}=await Pe.config.getPlatform(de);return ye?{pluginConfig:ye,isNative:!1,pluginName:L.pluginId,platformName:de}:null}}async function w(){const L=he.value;if(L!=null&&L.interpolation){B.value=!0,F.value=!1;try{const E=await ue(L);if(!E)return;const G=(E.pluginConfig.devices??[]).find(ze=>ze.id===L.id);if(!G)return;const de=L.interpolation,Ee=(G[de.configField]??[]).map(ze=>({input:ze[de.configShape.inputKey]??0,output:ze[de.configShape.outputKey]??0}));_e.value=Ee,Se.value=JSON.parse(JSON.stringify(Ee))}catch(E){console.error("Failed to load interpolation config:",E)}finally{B.value=!1}}}async function C(){const L=he.value;if(L!=null&&L.interpolation){Z.value=!0,F.value=!1;try{const E=await ue(L);if(!E)return;const R=L.interpolation,G=E.pluginConfig.devices??[],de=G.findIndex(Ee=>Ee.id===L.id);if(de<0)return;const ye=_e.value.map(Ee=>({[R.configShape.inputKey]:Ee.input,[R.configShape.outputKey]:Ee.output}));G[de]={...G[de],[R.configField]:ye},E.pluginConfig.devices=G,E.isNative?await Pe.config.savePlugin(E.pluginName,E.pluginConfig):await Pe.config.savePlatform(E.pluginConfig),Se.value=JSON.parse(JSON.stringify(_e.value)),F.value=!0}catch(E){console.error("Failed to save interpolation config:",E)}finally{Z.value=!1}}}function V(){_e.value=JSON.parse(JSON.stringify(Se.value)),F.value=!1}Fe(v,(L,E)=>{var R;L===E&&Se.value.length>0||(F.value=!1,((R=m.value)==null?void 0:R.kind)==="native"&&m.value.dev.interpolation?w():(_e.value=[],Se.value=[]))},{immediate:!0});const N=Q(()=>{var E;return(E=re.value)!=null&&E.buckets?[{name:"kWh",data:re.value.buckets.map(R=>{let G=R.label;return Me.value==="day"?G=parseInt(R.label)%6===0?R.label:"":Me.value==="month"&&(G=parseInt(R.label)%5===1?R.label:""),{x:G,y:Math.max(0,Math.round((R.kwh??0)*100)/100)}})}]:[]});return(L,E)=>{const R=Ye,G=ul,de=gi,ye=Gh,Ee=jS,ze=TM,ke=ec,St=sc,Gt=rc;return m.value?(y(),$("div",fP,[m.value.kind==="native"?(y(),$(be,{key:0},[b("div",_P,[b("div",pP,[X(R,{name:ge(_(m.value.dev)),size:26},null,8,["name"])]),b("div",mP,[H.value?(y(),$("div",gP,[X(G,{modelValue:W.value,"onUpdate:modelValue":E[1]||(E[1]=He=>W.value=He),size:"sm",onKeyup:[E[2]||(E[2]=is(He=>K(m.value.dev.id),["enter"])),E[3]||(E[3]=is(He=>H.value=!1,["escape"]))]},null,8,["modelValue"]),X(de,{variant:"primary",size:"sm",icon:_s,onClick:E[4]||(E[4]=He=>K(m.value.dev.id))}),X(de,{variant:"ghost",size:"sm",icon:q1,onClick:E[5]||(E[5]=He=>H.value=!1)})])):(y(),$("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:E[0]||(E[0]=He=>q(m.value.dev.name))},U(m.value.dev.name),1)),b("div",vP,U(pe(_(m.value.dev))),1)])]),X(ye,{title:"Device info",fluid:""},{default:ee(()=>[b("div",bP,[E[19]||(E[19]=b("span",{class:"info-key"},"Plugin",-1)),b("span",yP,U(m.value.dev.pluginId),1),m.value.dev.manufacturer?(y(),$(be,{key:0},[E[17]||(E[17]=b("span",{class:"info-key"},"Manufacturer",-1)),b("span",wP,U(m.value.dev.manufacturer),1)],64)):j("",!0),m.value.dev.model?(y(),$(be,{key:1},[E[18]||(E[18]=b("span",{class:"info-key"},"Model",-1)),b("span",SP,U(m.value.dev.model),1)],64)):j("",!0),E[20]||(E[20]=b("span",{class:"info-key"},"Status",-1)),b("span",CP,U(m.value.dev.pluginStatus),1),E[21]||(E[21]=b("span",{class:"info-key"},"ID",-1)),b("span",AP,U(m.value.dev.id),1)])]),_:1}),X(ye,{title:"State",fluid:""},{default:ee(()=>[m.value.dev.widgetType==="energy_meter"?(y(),$("div",kP,[b("div",MP,[b("span",LP,U(ve(m.value.dev.telemetry.power,1)),1),E[22]||(E[22]=b("span",{class:"energy-unit"},"W",-1))]),b("div",EP,[m.value.dev.telemetry.voltage!==void 0?(y(),$("span",xP,[E[23]||(E[23]=b("span",{class:"energy-label"},"Voltage",-1)),b("span",$P,U(ve(m.value.dev.telemetry.voltage,1))+" V",1)])):j("",!0),m.value.dev.telemetry.current!==void 0?(y(),$("span",TP,[E[24]||(E[24]=b("span",{class:"energy-label"},"Current",-1)),b("span",NP,U(ve(m.value.dev.telemetry.current,3))+" A",1)])):j("",!0)])])):m.value.dev.widgetType==="thermostat"?(y(),$("div",HP,[b("div",PP,[E[25]||(E[25]=b("span",{class:"thermo-label"},"Current",-1)),b("span",OP,U(ve(m.value.dev.telemetry.currentTemperature,1))+"°C",1)]),b("div",IP,[E[26]||(E[26]=b("span",{class:"thermo-label"},"Target",-1)),b("span",RP,U(ve(m.value.dev.telemetry.targetTemperature,1))+"°C ",1)]),b("div",DP,[E[27]||(E[27]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Le(["thermo-value",m.value.dev.telemetry.active?"on":"off"])},U(m.value.dev.telemetry.active?"On":"Off"),3)])])):m.value.dev.widgetType==="dehumidifier"?(y(),$("div",VP,[b("div",BP,[E[28]||(E[28]=b("span",{class:"thermo-label"},"Humidity",-1)),b("span",ZP,U(ve(m.value.dev.telemetry.currentHumidity,0))+"%",1)]),b("div",FP,[E[29]||(E[29]=b("span",{class:"thermo-label"},"Target",-1)),b("span",zP,U(ve(m.value.dev.telemetry.targetHumidity,0))+"%",1)]),b("div",UP,[E[30]||(E[30]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Le(["thermo-value",m.value.dev.telemetry.active?"on":"off"])},U(m.value.dev.telemetry.active?"On":"Off"),3)])])):(y(),$("div",WP,[Object.keys(m.value.dev.telemetry).filter(He=>!He.startsWith("_")).length===0?(y(),$("span",jP,"No telemetry yet")):j("",!0),(y(!0),$(be,null,Ve(Te(m.value.dev),([He,st])=>(y(),$("div",{key:He,class:"char-row"},[b("span",KP,U(He),1),b("span",qP,U(String(st)),1)]))),128))]))]),_:1}),m.value.dev.widgetType==="energy_meter"?(y(),fe(ye,{key:0,title:"Energy history",class:"energy-history",fluid:""},{default:ee(()=>[b("div",GP,[(y(),$(be,null,Ve(["day","month","year"],He=>b("button",{key:He,class:Le(["history-tab",{active:Me.value===He}]),onClick:st=>Me.value=He},U(He),11,YP)),64))]),re.value?(y(),$("div",XP,[X(de,{variant:"ghost",size:"xs",icon:a9,title:"Previous",onClick:E[6]||(E[6]=He=>J(-1))}),b("div",JP,[b("span",QP,[le(U(re.value.totalKwh.toFixed(2))+" ",1),E[31]||(E[31]=b("span",{class:"history-unit"},"kWh",-1))]),b("span",eO,U(re.value.date),1)]),X(de,{variant:"ghost",size:"xs",icon:Lw,title:"Next",onClick:E[7]||(E[7]=He=>J(1))})])):j("",!0),re.value&&re.value.totalKwh>0?(y(),fe(Ee,{key:1,series:N.value,height:120,"show-legend":!1,"show-tooltip":!0},null,8,["series"])):j("",!0),re.value&&re.value.totalKwh===0?(y(),$("div",tO," No consumption recorded for this period. Data accumulates every 5 minutes. ")):j("",!0),!re.value&&!D.value?(y(),$("div",iO,"No data available for this period.")):j("",!0),D.value?(y(),$("div",rO,"Loading history…")):j("",!0)]),_:1})):j("",!0),m.value.dev.interpolation&&_e.value.length>0?(y(),fe(ye,{key:1,title:"Calibration",fluid:""},{default:ee(()=>[X(ze,{modelValue:_e.value,"onUpdate:modelValue":E[8]||(E[8]=He=>_e.value=He),height:220,"input-label":m.value.dev.interpolation.inputLabel,"output-label":m.value.dev.interpolation.outputLabel,"input-min":m.value.dev.interpolation.inputMin,"input-max":m.value.dev.interpolation.inputMax,"output-min":m.value.dev.interpolation.outputMin,"output-max":m.value.dev.interpolation.outputMax,"input-step":.5,"output-step":1,"show-grid":!0,"show-tooltip":!0},null,8,["modelValue","input-label","output-label","input-min","input-max","output-min","output-max"]),E[34]||(E[34]=b("div",{class:"calibration-hint"},"Drag points to adjust. Double-click to add. Right-click to remove.",-1)),b("div",sO,[X(de,{variant:"primary",size:"sm",disabled:!ae.value||Z.value,onClick:C},{default:ee(()=>[le(U(Z.value?"Saving...":"Save"),1)]),_:1},8,["disabled"]),X(de,{variant:"ghost",size:"sm",disabled:!ae.value,onClick:V},{default:ee(()=>[...E[32]||(E[32]=[le(" Reset ",-1)])]),_:1},8,["disabled"])]),F.value?(y(),fe(ke,{key:0,status:"success",title:"Configuration saved"},{default:ee(()=>[...E[33]||(E[33]=[le(" Restart the plugin to apply the new mapping. ",-1)])]),_:1})):j("",!0)]),_:1})):m.value.dev.interpolation&&B.value?(y(),fe(ye,{key:2,title:"Calibration",fluid:""},{default:ee(()=>[...E[35]||(E[35]=[b("div",{class:"no-history"},"Loading calibration data...",-1)])]),_:1})):j("",!0),Te(m.value.dev).length>0?(y(),fe(ye,{key:3,title:"All telemetry",fluid:""},{default:ee(()=>[b("div",nO,[(y(!0),$(be,null,Ve(Te(m.value.dev),([He,st])=>(y(),$("div",{key:He,class:"char-row"},[b("span",aO,U(He),1),b("span",oO,U(String(st)),1)]))),128))])]),_:1})):j("",!0),f.value?(y(),fe(ye,{key:4,title:"HomeKit",fluid:""},{default:ee(()=>[(y(!0),$(be,null,Ve(z(f.value),He=>Bs((y(),$("div",{key:He.uuid,class:"homekit-row"},[E[36]||(E[36]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Show in HomeKit as"),b("span",{class:"homekit-hint"}," A plugin cannot know what a generic relay drives. Set it here and OpenBridge re-applies it on every restart, so the Home app stops reverting to a switch. ")],-1)),X(St,{"model-value":d(f.value.uuid,He.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":st=>g(f.value.uuid,He.uuid,String(st))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])),[[Np,h(He.uuid)]])),128)),c.value?(y(),$("div",lO,U(c.value),1)):j("",!0),b("div",cO,[E[37]||(E[37]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Expose to HomeKit"),b("span",{class:"homekit-hint"}," Hide devices the Home app cannot represent usefully. OpenBridge keeps its telemetry and history either way. ")],-1)),X(Gt,{name:`homekit-visible-${f.value.uuid}`,"model-value":s(f.value.uuid),disabled:i.value,"onUpdate:modelValue":E[9]||(E[9]=He=>a(f.value.uuid,!!He))},null,8,["name","model-value","disabled"])]),r.value?(y(),$("div",uO,U(r.value),1)):j("",!0)]),_:1})):j("",!0)],64)):m.value.kind==="hap"?(y(),$(be,{key:1},[b("div",hO,[b("div",dO,[X(R,{name:x(m.value.acc.category).icon,size:26},null,8,["name"])]),b("div",fO,[H.value?(y(),$("div",_O,[X(G,{modelValue:W.value,"onUpdate:modelValue":E[11]||(E[11]=He=>W.value=He),size:"sm",onKeyup:[E[12]||(E[12]=is(He=>K(m.value.acc.uuid),["enter"])),E[13]||(E[13]=is(He=>H.value=!1,["escape"]))]},null,8,["modelValue"]),X(de,{variant:"primary",size:"sm",icon:_s,onClick:E[14]||(E[14]=He=>K(m.value.acc.uuid))}),X(de,{variant:"ghost",size:"sm",icon:q1,onClick:E[15]||(E[15]=He=>H.value=!1)})])):(y(),$("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:E[10]||(E[10]=He=>q(m.value.acc.displayName))},U(m.value.acc.displayName),1)),b("div",pO,U(x(m.value.acc.category).label),1)])]),I(m.value.acc)?(y(),fe(ye,{key:0,title:"Device info",fluid:""},{default:ee(()=>[b("div",mO,[(y(!0),$(be,null,Ve(Object.entries(I(m.value.acc)),([He,st])=>(y(),$(be,{key:He},[st?(y(),$("span",gO,U(He),1)):j("",!0),st?(y(),$("span",vO,U(st),1)):j("",!0)],64))),128))])]),_:1})):j("",!0),(y(!0),$(be,null,Ve(z(m.value.acc),He=>(y(),fe(ye,{key:He.uuid,title:He.displayName||He.name,fluid:""},{default:ee(()=>[h(He.uuid)?(y(),$("div",bO,[E[38]||(E[38]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Show in HomeKit as"),b("span",{class:"homekit-hint"}," A plugin cannot know what a generic relay drives. Set it here and OpenBridge re-applies it on every restart, so the Home app stops reverting to a switch. ")],-1)),X(St,{"model-value":d(m.value.acc.uuid,He.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":st=>g(m.value.acc.uuid,He.uuid,String(st))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])):j("",!0),c.value?(y(),$("div",yO,U(c.value),1)):j("",!0),b("div",wO,[(y(!0),$(be,null,Ve(He.characteristics,st=>(y(),$("div",{key:st.uuid,class:"char-row"},[b("span",SO,U(st.name),1),T(st)&&st.format==="bool"?(y(),fe(Gt,{key:0,name:`hap-char-${He.uuid}-${st.uuid}`,"model-value":!!st.value,"onUpdate:modelValue":Yt=>se(m.value.acc.uuid,He.uuid,st.uuid,Yt?1:0)},null,8,["name","model-value","onUpdate:modelValue"])):(y(),$("span",{key:1,class:Le(["char-value",{on:st.format==="bool"&&st.value}])},U(O(st)),3))]))),128))])]),_:2},1032,["title"]))),128)),X(ye,{title:"HomeKit",fluid:""},{default:ee(()=>[b("div",CO,[E[39]||(E[39]=b("div",{class:"homekit-copy"},[b("span",{class:"homekit-title"},"Expose to HomeKit"),b("span",{class:"homekit-hint"}," Hide devices the Home app cannot represent usefully. OpenBridge keeps its telemetry and history either way. ")],-1)),X(Gt,{name:`homekit-visible-${m.value.acc.uuid}`,"model-value":s(m.value.acc.uuid),disabled:i.value,"onUpdate:modelValue":E[16]||(E[16]=He=>a(m.value.acc.uuid,!!He))},null,8,["name","model-value","disabled"])]),r.value?(y(),$("div",AO,U(r.value),1)):j("",!0)]),_:1}),b("div",kO,"UUID: "+U(m.value.acc.uuid),1)],64)):j("",!0)])):j("",!0)}}}),LO=Zt(MO,[["__scopeId","data-v-70bf99ad"]]),EO={class:"logs-filter"},xO={key:0,class:"log-empty"},$O={class:"log-time"},TO={class:"log-plugin"},NO={class:"log-msg"},x6="openbridge.logs.panelSize",HO=Oe({__name:"LiveLogsPanel",setup(e){const t=ys(),i=["collapsed","default","full"],r=ie("collapsed");_t(()=>{const c=localStorage.getItem(x6);c&&i.includes(c)&&(r.value=c)}),Fe(r,c=>localStorage.setItem(x6,c));const s=ie([]),n=ie(null),a=Q(()=>[{value:"system",label:"system"},...t.plugins.map(c=>({value:c.manifest.name,label:c.manifest.name}))]),o=Q(()=>s.value.length===0?t.logs:t.logs.filter(c=>s.value.includes(c.plugin)));function l(){t.logs.length=0}return Fe(()=>o.value.length,async()=>{const c=n.value;!c||!(c.scrollHeight-c.scrollTop-c.clientHeight<40)||(await Wi(),c.scrollTop=c.scrollHeight)}),(c,u)=>{const h=sc,d=gi,f=Gh;return y(),fe(f,{size:r.value,"onUpdate:size":u[1]||(u[1]=_=>r.value=_),title:"Live Logs"},{toolbar:ee(()=>[b("div",EO,[X(h,{modelValue:s.value,"onUpdate:modelValue":u[0]||(u[0]=_=>s.value=_),multiple:"",options:a.value,placeholder:"All plugins",size:"xs"},null,8,["modelValue","options"])]),X(d,{size:"xs",variant:"ghost",icon:ed,title:"Clear",onClick:l})]),default:ee(()=>[b("div",{ref_key:"logsEl",ref:n,class:"log-list"},[o.value.length===0?(y(),$("div",xO,"No log entries yet.")):j("",!0),(y(!0),$(be,null,Ve(o.value,(_,p)=>(y(),$("div",{key:p,class:"log-line"},[b("span",$O,U(new Date(_.timestamp).toLocaleTimeString()),1),b("span",{class:Le(["log-level",`log-level--${_.level}`])},U(_.level.toUpperCase()),3),b("span",TO,U(_.plugin),1),b("span",NO,U(_.message),1)]))),128))],512)]),_:1},8,["size"])}}}),PO=Zt(HO,[["__scopeId","data-v-2d8d29ff"]]),OO=["data-tooltip"],IO=["onClick"],RO=Oe({__name:"AppLayout",setup(e){const t=oc(),i=dl(),r=ys(),s=fl(),n=Gs(),a=lc();async function o(){await a.logout()}const l=ie([]),c=ie(!0),u=Q(()=>l.value.map(S=>{var m;return{id:S.sub,email:S.email,name:S.name,current:S.sub===((m=a.user.value)==null?void 0:m.id)}}));async function h(){const S=await a.listIdentities();l.value=S,c.value=S.length===0}function d(S){a.switchAccount(S.email)}async function f(S){await a.removeIdentity(S.id),await h()}const _=ie(null),p=ie(!1);async function A(){try{const S=await fetch("/api/updates/check");if(!S.ok)return;const m=await S.json();m.updateAvailable&&m.latest&&(_.value=m.latest)}catch{}}const g=[{name:"dashboard",icon:"house",label:"Dashboard",href:"/dashboard"},{name:"plugins",icon:"puzzle-piece",label:"Plugins",href:"/plugins"},{name:"devices",icon:"devices",label:"Devices",href:"/devices"},{name:"config",icon:"brackets-curly",label:"Config",href:"/config"},{name:"terminal",icon:"terminal",label:"Terminal",href:"/terminal"},{name:"settings",icon:"gear",label:"Settings",href:"/settings"}];return Fe(()=>t.name,()=>s.close()),_t(async()=>{await r.fetchHealth(),await r.fetchPlugins(),r.fetchLogs(),r.connectLiveLogs();const S=setInterval(()=>r.fetchHealth(),1e4);Br(()=>clearInterval(S)),A()}),Br(()=>r.disconnectLiveLogs()),(S,m)=>{const v=Io("RouterLink"),k=Ye,x=NL,M=GA,z=O4,P=Dn,I=gi,O=ec,T=Io("RouterView"),H=TL;return y(),fe(H,{"inspector-visible":oe(s).visible,"main-padding":!oe(n).fullBleed},w5({"sidebar-logo":ee(()=>[X(v,{to:"/dashboard","data-tooltip":"OpenBridge",class:"sidebar-logo"},{default:ee(()=>[...m[3]||(m[3]=[b("img",{src:Gx,width:"32",height:"32",alt:"OpenBridge logo"},null,-1)])]),_:1})]),"sidebar-nav":ee(()=>[(y(),$(be,null,Ve(g,W=>X(x,{key:W.name,to:W.href,tooltip:W.label,active:oe(t).name===W.name,onClick:lt(q=>oe(i).push(W.href),["prevent"])},{default:ee(()=>[X(k,{name:W.icon,size:18},null,8,["name"])]),_:2},1032,["to","tooltip","active","onClick"])),64))]),"sidebar-bottom":ee(()=>{var W;return[b("div",{class:Le(["daemon-status",oe(r).connected?"online":"offline"]),"data-tooltip":oe(r).connected?"Daemon connected":"Daemon offline"},[...m[4]||(m[4]=[b("span",{class:"daemon-dot"},null,-1)])],10,OO),(W=oe(a).config.value)!=null&&W.enabled&&oe(a).user.value?(y(),fe(M,{key:0,user:{email:oe(a).user.value.email},accounts:u.value,"accounts-unknown":c.value,"show-profile":!1,onOpen:h,onSwitch:d,onSwitchAccount:m[0]||(m[0]=q=>oe(a).chooseAccount()),onAddAccount:m[1]||(m[1]=q=>oe(a).addAccount()),onRemove:f,onSignOut:o},{default:ee(({close:q})=>[b("button",{type:"button",role:"menuitem",class:"nb-user-menu__action nb-user-menu__action--danger",onClick:K=>(q(),oe(a).logoutEverywhere())},[X(k,{name:oe(um),size:15},null,8,["name"]),m[5]||(m[5]=le(" Sign out of all apps ",-1))],8,IO)]),_:1},8,["user","accounts","accounts-unknown"])):j("",!0)]}),"topbar-left":ee(()=>[X(z,{subtitle:oe(n).title},null,8,["subtitle"]),oe(n).count!==null?(y(),fe(P,{key:0},{default:ee(()=>[le(U(oe(n).count),1)]),_:1})):j("",!0),m[6]||(m[6]=b("div",{id:"ob-topbar-left",class:"topbar-slot"},null,-1))]),"topbar-right":ee(()=>[m[7]||(m[7]=b("div",{id:"ob-topbar-right",class:"topbar-slot"},null,-1))]),inspector:ee(()=>[oe(s).mode==="plugin"?(y(),fe(_H,{key:0})):oe(s).mode==="marketplace"?(y(),fe(dP,{key:1})):oe(s).mode==="device"?(y(),fe(LO,{key:2})):j("",!0)]),bottom:ee(()=>[X(PO)]),default:ee(()=>[X(T)]),_:2},[_.value&&!p.value?{name:"notification",fn:ee(()=>[X(O,{status:"info",icon:Qh,flush:"",dismissible:"",title:`OpenBridge v${_.value} is available`,onDismiss:m[2]||(m[2]=W=>p.value=!0)},{action:ee(()=>[X(I,{variant:"ghost",size:"sm",href:"https://github.com/nubisco/openbridge/releases",target:"_blank",rel:"noopener"},{default:ee(()=>[...m[8]||(m[8]=[le(" See what's new ",-1)])]),_:1})]),_:1},8,["title"])]),key:"0"}:void 0]),1032,["inspector-visible","main-padding"])}}}),DO=Zt(RO,[["__scopeId","data-v-55c2d154"]]),VO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},BO=VO("qr-code","0 0 256 256",'<path d="M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm0,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48ZM200,40H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-64,72V144a8,8,0,0,1,16,0v32a8,8,0,0,1-16,0Zm80-16a8,8,0,0,1-8,8H184v40a8,8,0,0,1-8,8H144a8,8,0,0,1,0-16h24V144a8,8,0,0,1,16,0v8h24A8,8,0,0,1,216,160Zm0,32v16a8,8,0,0,1-16,0V192a8,8,0,0,1,16,0Z"/>'),ZO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},FO=ZO("cpu","0 0 256 256",'<path d="M152,96H104a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V104A8,8,0,0,0,152,96Zm-8,48H112V112h32Zm88,0H216V112h16a8,8,0,0,0,0-16H216V56a16,16,0,0,0-16-16H160V24a8,8,0,0,0-16,0V40H112V24a8,8,0,0,0-16,0V40H56A16,16,0,0,0,40,56V96H24a8,8,0,0,0,0,16H40v32H24a8,8,0,0,0,0,16H40v40a16,16,0,0,0,16,16H96v16a8,8,0,0,0,16,0V216h32v16a8,8,0,0,0,16,0V216h40a16,16,0,0,0,16-16V160h16a8,8,0,0,0,0-16Zm-32,56H56V56H200v95.87s0,.09,0,.13,0,.09,0,.13V200Z"/>'),zO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},UO=zO("database","0 0 256 256",'<path d="M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"/>'),WO=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},jO=WO("clock","0 0 256 256",'<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z"/>'),la=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},KO=la("pulse","0 0 256 256",'<path d="M236,128a4,4,0,0,1-4,4H202.47l-38.89,77.79A4,4,0,0,1,160,212h-.2a4,4,0,0,1-3.54-2.58l-60.59-159-36,79.28A4,4,0,0,1,56,132H24a4,4,0,0,1,0-8H53.42L92.36,38.35a4,4,0,0,1,7.38.23L160.5,198.06l35.92-71.85A4,4,0,0,1,200,124h32A4,4,0,0,1,236,128Z"/>'),qO=la("pulse","0 0 256 256",'<path d="M238,128a6,6,0,0,1-6,6H203.71l-38.34,76.68A6,6,0,0,1,160,214h-.3a6,6,0,0,1-5.31-3.85L95.51,55.57,61.46,130.48A6,6,0,0,1,56,134H24a6,6,0,0,1,0-12H52.14l38.4-84.48a6,6,0,0,1,11.07.34L160.74,193.1l33.89-67.78A6,6,0,0,1,200,122h32A6,6,0,0,1,238,128Z"/>'),bu=la("pulse","0 0 256 256",'<path d="M240,128a8,8,0,0,1-8,8H204.94l-37.78,75.58A8,8,0,0,1,160,216h-.4a8,8,0,0,1-7.08-5.14L95.35,60.76,63.28,131.31A8,8,0,0,1,56,136H24a8,8,0,0,1,0-16H50.85L88.72,36.69a8,8,0,0,1,14.76.46l57.51,151,31.85-63.71A8,8,0,0,1,200,120h32A8,8,0,0,1,240,128Z"/>'),GO=la("pulse","0 0 256 256",'<path d="M244,128a12,12,0,0,1-12,12H207.42l-36.69,73.37A12,12,0,0,1,160,220h-.6a12,12,0,0,1-10.61-7.72L95,71.15,66.92,133A12,12,0,0,1,56,140H24a12,12,0,0,1,0-24H48.27L85.08,35a12,12,0,0,1,22.13.7l54.28,142.46,27.78-55.56A12,12,0,0,1,200,116h32A12,12,0,0,1,244,128Z"/>'),YO=la("pulse","0 0 256 256",'<path d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm-8,96H188.64L159,188a8,8,0,0,1-6.95,4h-.46a8,8,0,0,1-6.89-4.84L103,89.92,79,132a8,8,0,0,1-7,4H48a8,8,0,0,1,0-16H67.36L97.05,68a8,8,0,0,1,14.3.82L153,166.08l24-42.05a8,8,0,0,1,6.95-4h24a8,8,0,0,1,0,16Z"/>'),XO=la("pulse","0 0 256 256",'<path d="M96,40l33.52,88H56Zm104,88H129.52L160,208Z" opacity="0.2"/><path d="M240,128a8,8,0,0,1-8,8H204.94l-37.78,75.58A8,8,0,0,1,160,216h-.4a8,8,0,0,1-7.08-5.14L95.35,60.76,63.28,131.31A8,8,0,0,1,56,136H24a8,8,0,0,1,0-16H50.85L88.72,36.69a8,8,0,0,1,14.76.46l57.51,151,31.85-63.71A8,8,0,0,1,200,120h32A8,8,0,0,1,240,128Z"/>'),JO="pulse",QO=Object.freeze(Object.defineProperty({__proto__:null,bold:GO,default:bu,duotone:XO,fill:YO,glyphName:JO,light:qO,regular:bu,thin:KO},Symbol.toStringTag,{value:"Module"})),eI={class:"dashboard"},tI={class:"top-row"},iI={class:"hk-body"},rI={key:0,class:"qr-wrap"},sI=["src"],nI={key:1,class:"qr-placeholder"},aI={class:"hk-details"},oI={key:0,class:"pin-display"},lI={key:1,class:"pin-label"},cI={class:"hk-status"},uI={key:0,class:"sys-grid"},hI={class:"sys-val"},dI={class:"sys-val"},fI={class:"sys-val"},_I={class:"sys-val"},pI={class:"sys-val"},mI={class:"sys-val"},gI={class:"sys-val"},vI={class:"sys-val mono"},bI={class:"sys-val mono"},yI={class:"sys-val mono"},wI={key:1,class:"loading-inline"},SI={class:"card-title"},CI={class:"plugins-counts"},AI={key:0,class:"pill red"},kI={key:0,class:"empty-inline"},MI={key:1,class:"plugins-list"},LI={class:"plugin-name"},EI={class:"plugin-ver"},xI={class:"metrics-row"},$I={class:"metric-header"},TI={class:"metric-icon purple"},NI={class:"metric-values"},HI={class:"metric-big"},PI={key:0,class:"metric-sub"},OI={class:"metric-chart"},II={class:"metric-header"},RI={class:"metric-icon blue"},DI={class:"metric-values"},VI={class:"metric-big"},BI={class:"metric-sub"},ZI={class:"metric-chart"},FI={class:"metric-header"},zI={class:"metric-icon green"},UI={class:"uptime-rows"},WI={class:"uptime-row"},jI={class:"uptime-val"},KI={class:"uptime-row"},qI={class:"uptime-val"},GI={style:{"margin-top":"0.75rem"}},YI={class:"metric-header"},XI={class:"metric-icon amber"},JI={class:"net-values"},QI={class:"net-val"},eR={class:"net-val"},tR={class:"metric-chart net-charts"},iR=Oe({__name:"DashboardView",setup(e){const t=ys(),i=Gs();function r(P){return P==="running"?"green":P==="error"?"red":P==="loading"?"blue":"grey"}const s=ie(!1),n=ie(!1);async function a(){if(!s.value){s.value=!0,n.value=!1;try{await Pe.daemon.restart(),n.value=!0;let P=0;const I=setInterval(async()=>{P++;try{await Pe.health(),clearInterval(I),location.reload()}catch{}P>60&&(clearInterval(I),s.value=!1)},1e3)}catch{s.value=!1}}}const o=ie(null),l=ie(""),c=ie(""),u=ie([]),h=ie([]),d=ie([]),f=ie([]),_=Vr(null);let p=null;function A(){p&&(p.onclose=null,p.close(),p=null);const P=location.protocol==="https:"?"wss:":"ws:";p=new WebSocket(`${P}//${location.host}/ws/metrics`),p.onmessage=I=>{if(!document.hidden)try{const O=JSON.parse(I.data);if(O.type==="history"){const T=O.data;u.value=T.map(H=>H.cpu),h.value=T.map(H=>m(H)),d.value=T.map(H=>H.netRxSec),f.value=T.map(H=>H.netTxSec),T.length&&(_.value=T[T.length-1])}else if(O.type==="snapshot"){const T=O.data;_.value=T,S(u,T.cpu),S(h,m(T)),S(d,T.netRxSec),S(f,T.netTxSec)}}catch{}},p.onclose=()=>{p=null,setTimeout(A,3e3)}}function g(){document.hidden||A()}function S(P,I){P.value=[...P.value.slice(-59),I]}function m(P){return P.memTotal?Math.round((P.memTotal-P.memFree)/P.memTotal*100):0}function v(P){return P<1024?`${P} B`:P<1024**2?`${(P/1024).toFixed(1)} KB`:P<1024**3?`${(P/1024**2).toFixed(1)} MB`:`${(P/1024**3).toFixed(1)} GB`}function k(P){const I=Math.floor(P/86400),O=Math.floor(P%86400/3600),T=Math.floor(P%3600/60);return I>0?`${I}d ${O}h`:O>0?`${O}h ${T}m`:`${T}m`}const x=Q(()=>_.value?v(_.value.memTotal-_.value.memFree):"—"),M=Q(()=>_.value?v(_.value.memTotal):"—"),z=Q(()=>_.value?m(_.value):0);return _t(async()=>{i.setPage("Dashboard"),t.fetchPlugins();try{o.value=await Pe.system()}catch{}try{const P=await Pe.qr();P.setupURI&&(c.value=P.pincode??"",l.value=await oa.toDataURL(P.setupURI,{width:148,margin:1,color:{dark:"#000000",light:"#ffffff"}}))}catch{}A(),document.addEventListener("visibilitychange",g)}),Br(()=>{p==null||p.close(),p=null,document.removeEventListener("visibilitychange",g)}),(P,I)=>{const O=Ye,T=hl,H=Dn,W=hE,q=mm,K=gi;return y(),$("div",eI,[b("div",tI,[X(T,{class:"hk-card"},{default:ee(()=>[I[1]||(I[1]=b("div",{class:"card-title"},"HomeKit Pairing",-1)),b("div",iI,[l.value?(y(),$("div",rI,[b("img",{src:l.value,alt:"HomeKit QR Code",class:"qr-img"},null,8,sI)])):(y(),$("div",nI,[X(O,{name:oe(BO),size:48},null,8,["name"]),I[0]||(I[0]=b("span",null,"No HAP bridge configured",-1))])),b("div",aI,[c.value?(y(),$("div",oI,U(c.value),1)):j("",!0),c.value?(y(),$("div",lI,"Scan to add to HomeKit")):j("",!0),b("div",cI,[b("span",{class:Le(["dot",oe(t).connected?"green":"gray"])},null,2),le(" "+U(oe(t).connected?"Bridge running":"Bridge offline"),1)])])])]),_:1}),X(T,{class:"sys-card"},{default:ee(()=>{var se;return[I[13]||(I[13]=b("div",{class:"card-title"},"System Information",-1)),o.value?(y(),$("div",uI,[I[2]||(I[2]=b("span",{class:"sys-key"},"OS",-1)),b("span",hI,U(o.value.os),1),I[3]||(I[3]=b("span",{class:"sys-key"},"Arch",-1)),b("span",dI,U(o.value.arch),1),I[4]||(I[4]=b("span",{class:"sys-key"},"Hostname",-1)),b("span",fI,U(o.value.hostname),1),I[5]||(I[5]=b("span",{class:"sys-key"},"IP Address",-1)),b("span",_I,U(o.value.ip),1),I[6]||(I[6]=b("span",{class:"sys-key"},"User",-1)),b("span",pI,U(o.value.user),1),I[7]||(I[7]=b("span",{class:"sys-key"},"Node.js",-1)),b("span",mI,U(o.value.nodeVersion),1),I[8]||(I[8]=b("span",{class:"sys-key"},"OpenBridge",-1)),b("span",gI,"v"+U(((se=oe(t).health)==null?void 0:se.version)??"—"),1),I[9]||(I[9]=b("span",{class:"sys-key"},"Config",-1)),b("span",vI,U(o.value.configPath),1),I[10]||(I[10]=b("span",{class:"sys-key"},"OB plugins",-1)),b("span",bI,U(o.value.obPluginsDir),1),I[11]||(I[11]=b("span",{class:"sys-key"},"HB plugins",-1)),b("span",yI,U(o.value.hbPluginsDir),1)])):(y(),$("div",wI,[X(O,{name:oe(Ln),size:16},null,8,["name"]),I[12]||(I[12]=le(" Loading... ",-1))]))]}),_:1}),X(T,{class:"plugins-card"},{default:ee(()=>[b("div",SI,[I[14]||(I[14]=le(" Plugins ",-1)),b("span",CI,[X(H,{variant:"green"},{default:ee(()=>[le(U(oe(t).runningCount)+" running",1)]),_:1}),oe(t).errorCount?(y(),$("span",AI,U(oe(t).errorCount)+" error",1)):j("",!0)])]),oe(t).plugins.length===0?(y(),$("div",kI,"No plugins loaded yet.")):(y(),$("div",MI,[(y(!0),$(be,null,Ve(oe(t).plugins,se=>(y(),$("div",{key:se.id,class:"plugin-row"},[b("div",{class:Le(["plugin-dot",se.status])},null,2),b("span",LI,U(se.manifest.name),1),b("span",EI,"v"+U(se.manifest.version),1),se.source==="homebridge"?(y(),fe(H,{key:0,variant:"orange",size:"sm"},{default:ee(()=>[...I[15]||(I[15]=[le("HB",-1)])]),_:1})):j("",!0),X(H,{variant:r(se.status),size:"sm"},{default:ee(()=>[le(U(se.status),1)]),_:2},1032,["variant"])]))),128))]))]),_:1})]),b("div",xI,[X(T,{class:"metric-card"},{default:ee(()=>{var se,ce;return[b("div",$I,[b("div",TI,[X(O,{name:oe(FO),size:13},null,8,["name"])]),I[16]||(I[16]=b("span",{class:"metric-title"},"CPU",-1))]),b("div",NI,[b("div",HI,[le(U(((se=_.value)==null?void 0:se.cpu)??"—")+" ",1),I[17]||(I[17]=b("span",{class:"metric-unit"},"%",-1))]),(ce=_.value)!=null&&ce.cpuTemp&&_.value.cpuTemp>0?(y(),$("div",PI,U(_.value.cpuTemp)+"°C",1)):j("",!0)]),b("div",OI,[X(W,{data:u.value,color:"var(--nb-c-primary)",height:40},null,8,["data"])])]}),_:1}),X(T,{class:"metric-card"},{default:ee(()=>[b("div",II,[b("div",RI,[X(O,{name:oe(UO),size:13},null,8,["name"])]),I[18]||(I[18]=b("span",{class:"metric-title"},"Memory",-1))]),b("div",DI,[b("div",VI,[le(U(z.value)+" ",1),I[19]||(I[19]=b("span",{class:"metric-unit"},"%",-1))]),b("div",BI,U(x.value)+" / "+U(M.value),1)]),X(q,{value:z.value,max:100,size:"sm"},null,8,["value"]),b("div",ZI,[X(W,{data:h.value,color:"var(--nb-c-info)",height:32},null,8,["data"])])]),_:1}),X(T,{class:"metric-card"},{default:ee(()=>[b("div",FI,[b("div",zI,[X(O,{name:oe(jO),size:13},null,8,["name"])]),I[20]||(I[20]=b("span",{class:"metric-title"},"Uptime",-1))]),b("div",UI,[b("div",WI,[b("span",jI,U(o.value?k(o.value.uptimeSystem):"—"),1),I[21]||(I[21]=b("span",{class:"uptime-label"},"System",-1))]),I[23]||(I[23]=b("div",{class:"uptime-divider"},null,-1)),b("div",KI,[b("span",qI,U(o.value?k(o.value.uptimeProcess):"—"),1),I[22]||(I[22]=b("span",{class:"uptime-label"},"Process",-1))])]),b("div",GI,[X(K,{variant:"secondary",size:"sm",outlined:"",style:{width:"100%","justify-content":"center"},loading:s.value,icon:n.value?_s:s.value?Jo:Fs,onClick:a},{default:ee(()=>[le(U(n.value?"Restarted":s.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])])]),_:1}),X(T,{class:"metric-card net-card"},{default:ee(()=>[b("div",YI,[b("div",XI,[X(O,{name:oe(bu),size:13},null,8,["name"])]),I[24]||(I[24]=b("span",{class:"metric-title"},"Network",-1))]),b("div",JI,[b("div",null,[b("div",QI,U(_.value?v(_.value.netRxSec)+"/s":"—"),1),I[25]||(I[25]=b("div",{class:"net-label"},"↓ Received",-1))]),b("div",null,[b("div",eR,U(_.value?v(_.value.netTxSec)+"/s":"—"),1),I[26]||(I[26]=b("div",{class:"net-label"},"↑ Sent",-1))])]),b("div",tR,[X(W,{data:d.value,color:"var(--nb-c-success)",height:28},null,8,["data"]),X(W,{data:f.value,color:"var(--nb-c-warning)",height:28},null,8,["data"])])]),_:1})])])}}}),rR=Zt(iR,[["__scopeId","data-v-e710391e"]]),ca=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},sR=ca("arrow-clockwise","0 0 256 256",'<path d="M236,56v48a4,4,0,0,1-4,4H184a4,4,0,0,1,0-8h37.7L187.53,68.69l-.13-.12a84,84,0,1,0-1.75,120.51,4,4,0,0,1,5.5,5.82A91.43,91.43,0,0,1,128,220h-1.26A92,92,0,1,1,193,62.84l35,32.05V56a4,4,0,1,1,8,0Z"/>'),nR=ca("arrow-clockwise","0 0 256 256",'<path d="M238,56v48a6,6,0,0,1-6,6H184a6,6,0,0,1,0-12h32.55l-30.38-27.8c-.06-.06-.12-.13-.19-.19a82,82,0,1,0-1.7,117.65,6,6,0,0,1,8.24,8.73A93.46,93.46,0,0,1,128,222h-1.28A94,94,0,1,1,194.37,61.4L226,90.35V56a6,6,0,1,1,12,0Z"/>'),$6=ca("arrow-clockwise","0 0 256 256",'<path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z"/>'),aR=ca("arrow-clockwise","0 0 256 256",'<path d="M244,56v48a12,12,0,0,1-12,12H184a12,12,0,1,1,0-24H201.1l-19-17.38c-.13-.12-.26-.24-.38-.37A76,76,0,1,0,127,204h1a75.53,75.53,0,0,0,52.15-20.72,12,12,0,0,1,16.49,17.45A99.45,99.45,0,0,1,128,228h-1.37A100,100,0,1,1,198.51,57.06L220,76.72V56a12,12,0,0,1,24,0Z"/>'),oR=ca("arrow-clockwise","0 0 256 256",'<path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1-5.66-13.66l17-17-10.55-9.65-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,1,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60l10.93,10L226.34,50.3A8,8,0,0,1,240,56Z"/>'),lR=ca("arrow-clockwise","0 0 256 256",'<path d="M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z" opacity="0.2"/><path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z"/>'),cR="arrow-clockwise",uR=Object.freeze(Object.defineProperty({__proto__:null,bold:aR,default:$6,duotone:lR,fill:oR,glyphName:cR,light:nR,regular:$6,thin:sR},Symbol.toStringTag,{value:"Module"})),og=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),ua=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},hR=ua("list","0 0 256 256",'<path d="M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM40,68H216a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8ZM216,188H40a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Z"/>'),dR=ua("list","0 0 256 256",'<path d="M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM40,70H216a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12ZM216,186H40a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Z"/>'),T6=ua("list","0 0 256 256",'<path d="M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"/>'),fR=ua("list","0 0 256 256",'<path d="M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM40,76H216a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24ZM216,180H40a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Z"/>'),_R=ua("list","0 0 256 256",'<path d="M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM192,184H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z"/>'),pR=ua("list","0 0 256 256",'<path d="M216,64V192H40V64Z" opacity="0.2"/><path d="M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"/>'),mR="list",lg=Object.freeze(Object.defineProperty({__proto__:null,bold:fR,default:T6,duotone:pR,fill:_R,glyphName:mR,light:dR,regular:T6,thin:hR},Symbol.toStringTag,{value:"Module"})),ha=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},gR=ha("squares-four","0 0 256 256",'<path d="M104,44H56A12,12,0,0,0,44,56v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,104,44Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4ZM104,140H56a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,104,140Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,200,140Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Z"/>'),vR=ha("squares-four","0 0 256 256",'<path d="M104,42H56A14,14,0,0,0,42,56v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,104,42Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm-98,34H56a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,104,138Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,200,138Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Z"/>'),N6=ha("squares-four","0 0 256 256",'<path d="M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48Z"/>'),bR=ha("squares-four","0 0 256 256",'<path d="M100,36H56A20,20,0,0,0,36,56v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,100,36ZM96,96H60V60H96ZM200,36H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,60H160V60h36Zm-96,40H56a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,100,136Zm-4,60H60V160H96Zm104-60H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,200,136Zm-4,60H160V160h36Z"/>'),yR=ha("squares-four","0 0 256 256",'<path d="M120,56v48a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40h48A16,16,0,0,1,120,56Zm80-16H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm-96,96H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm96,0H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Z"/>'),wR=ha("squares-four","0 0 256 256",'<path d="M112,56v48a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h48A8,8,0,0,1,112,56Zm88-8H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V56A8,8,0,0,0,200,48Zm-96,96H56a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,104,144Zm96,0H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,200,144Z" opacity="0.2"/><path d="M200,136H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48ZM104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Z"/>'),SR="squares-four",cg=Object.freeze(Object.defineProperty({__proto__:null,bold:bR,default:N6,duotone:wR,fill:yR,glyphName:SR,light:vR,regular:N6,thin:gR},Symbol.toStringTag,{value:"Module"})),CR={key:0,class:"plugin-cards"},AR={class:"plugin-avatar"},kR=["src","alt"],MR={class:"plugin-meta"},LR={class:"plugin-name"},ER={key:0,class:"plugin-platform"},xR={class:"plugin-version"},$R={key:0,class:"plugin-desc"},TR={key:1,class:"plugin-author"},NR={key:2,class:"plugin-links"},HR=["href"],PR=["href"],OR={key:3,class:"plugin-error"},IR={class:"cell-name"},RR={class:"plugin-avatar plugin-avatar--sm"},DR=["src","alt"],VR={class:"plugin-name"},BR={key:0,class:"plugin-platform"},ZR=Oe({__name:"PluginList",props:{rows:{},view:{},selectedId:{}},emits:["select"],setup(e,{emit:t}){const i=e,r=t;function s(l){return l==="running"?"green":l==="error"?"red":l==="loading"?"blue":"grey"}const n=ie({key:"name",direction:"asc"}),a=[{key:"name",header:"Plugin",sortable:!0},{key:"version",header:"Version",sortable:!0,width:140},{key:"source",header:"Source",sortable:!0,width:120},{key:"status",header:"Status",sortable:!0,width:120},{key:"author",header:"Author",sortable:!0}],o=Q(()=>{const l=i.rows.map(h=>({id:h.plugin.id,name:h.plugin.manifest.name,version:`v${h.plugin.manifest.version}`,availableUpdate:h.plugin.availableUpdate,source:h.plugin.source==="homebridge"?"Homebridge":"Native",status:h.plugin.status,author:h.plugin.manifest.author??"—",platform:h.plugin.source==="homebridge"?h.plugin.platformName:void 0,avatarUrl:h.avatarUrl,isOpenBridge:h.isOpenBridge,plugin:h.plugin})),c=n.value;if(!c||c.direction==="none")return l;const u=c.direction==="asc"?1:-1;return[...l].sort((h,d)=>u*String(h[c.key]??"").localeCompare(String(d[c.key]??"")))});return(l,c)=>{const u=Ye,h=Dn,d=$r,f=hl,_=hm;return e.view==="cards"?(y(),$("div",CR,[(y(!0),$(be,null,Ve(e.rows,p=>(y(),fe(f,{key:p.plugin.id,class:Le(["plugin-card",{"plugin-card--selected":p.plugin.id===e.selectedId}]),onClick:A=>r("select",p.plugin)},{default:ee(()=>[b("span",{class:Le(["plugin-card__accent",`plugin-card__accent--${p.plugin.status}`])},null,2),X(d,{dir:"row",align:"start",gap:"sm",class:"plugin-card__header"},{default:ee(()=>[b("div",AR,[p.avatarUrl?(y(),$("img",{key:0,src:p.avatarUrl,alt:p.plugin.manifest.name,onError:c[0]||(c[0]=A=>A.target.style.display="none")},null,40,kR)):(y(),fe(u,{key:1,name:p.isOpenBridge?oe(un):oe(Ws),size:20},null,8,["name"]))]),b("div",MR,[b("div",LR,U(p.plugin.manifest.name),1),p.plugin.source==="homebridge"&&p.plugin.platformName?(y(),$("div",ER," Platform: "+U(p.plugin.platformName),1)):j("",!0),b("div",xR,[le(" v"+U(p.plugin.manifest.version)+" ",1),p.plugin.availableUpdate?(y(),fe(h,{key:0,variant:"blue",size:"sm"},{default:ee(()=>[le(" v"+U(p.plugin.availableUpdate)+" available ",1)]),_:2},1024)):j("",!0)])]),X(h,{variant:s(p.plugin.status)},{default:ee(()=>[le(U(p.plugin.status),1)]),_:2},1032,["variant"])]),_:2},1024),p.plugin.manifest.description?(y(),$("p",$R,U(p.plugin.manifest.description),1)):j("",!0),p.plugin.manifest.author?(y(),$("p",TR,"by "+U(p.plugin.manifest.author),1)):j("",!0),p.sponsorUrl||p.docsUrl?(y(),$("div",NR,[p.sponsorUrl?(y(),$("a",{key:0,href:p.sponsorUrl,target:"_blank",rel:"noopener",onClick:c[1]||(c[1]=lt(()=>{},["stop"]))},[X(u,{name:oe(sg),weight:"fill",size:11},null,8,["name"]),c[6]||(c[6]=le(" Sponsor ",-1))],8,HR)):j("",!0),p.docsUrl?(y(),$("a",{key:1,href:p.docsUrl,target:"_blank",rel:"noopener",onClick:c[2]||(c[2]=lt(()=>{},["stop"]))},[X(u,{name:oe(ng),size:11},null,8,["name"]),c[7]||(c[7]=le(" Docs ",-1))],8,PR)):j("",!0)])):j("",!0),p.plugin.error?(y(),$("div",OR,U(p.plugin.error),1)):j("",!0)]),_:2},1032,["class","onClick"]))),128))])):(y(),fe(_,{key:1,columns:a,rows:o.value,"row-key":"id",size:"sm",zebra:"","sort-state":n.value,onSort:c[4]||(c[4]=p=>n.value=p),onRowClick:c[5]||(c[5]=p=>r("select",p.plugin))},{"cell-name":ee(({row:p})=>[b("div",IR,[b("div",RR,[p.avatarUrl?(y(),$("img",{key:0,src:p.avatarUrl,alt:p.name,onError:c[3]||(c[3]=A=>A.target.style.display="none")},null,40,DR)):(y(),fe(u,{key:1,name:p.isOpenBridge?oe(un):oe(Ws),size:14},null,8,["name"]))]),b("div",null,[b("div",VR,U(p.name),1),p.platform?(y(),$("div",BR,"Platform: "+U(p.platform),1)):j("",!0)])])]),"cell-version":ee(({row:p})=>[le(U(p.version)+" ",1),p.availableUpdate?(y(),fe(h,{key:0,variant:"blue",size:"sm"},{default:ee(()=>[le("v"+U(p.availableUpdate),1)]),_:2},1024)):j("",!0)]),"cell-status":ee(({row:p})=>[X(h,{variant:s(p.status)},{default:ee(()=>[le(U(p.status),1)]),_:2},1032,["variant"])]),_:1},8,["rows","sort-state"]))}}}),FR=Zt(ZR,[["__scopeId","data-v-8fdf7ec9"]]),zR={class:"plugins-view"},UR={key:0,class:"empty-state"},WR={key:0},H6="openbridge.plugins.view",jR=Oe({__name:"PluginsView",setup(e){const t=ys(),i=fl(),r=Gs(),s=ag(),n=ie(""),a=ie(new Map),o=ie(new Set),l=ie(!1),c=ie(localStorage.getItem(H6)==="table"?"table":"cards");function u(){c.value=c.value==="cards"?"table":"cards",localStorage.setItem(H6,c.value)}const h=Q(()=>{var P;return i.visible&&i.mode==="plugin"?((P=i.selectedPlugin)==null?void 0:P.id)??null:null}),d=Q(()=>p().map(P=>{const I=S(P);return{plugin:P,avatarUrl:x(P),isOpenBridge:g(P),sponsorUrl:I==null?void 0:I.githubSponsorsUrl,docsUrl:I==null?void 0:I.documentationUrl}}));function f(P){if(P.source==="homebridge"){const O=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/);if(O!=null&&O[1])return O[1]}return P.manifest.name}function _(P){var H;const O=(H=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/))==null?void 0:H[1],T=[f(P),O,P.manifest.name,P.id];return Array.from(new Set(T.filter(W=>!!W&&W.trim().length>0)))}function p(){const P=n.value.toLowerCase();return t.plugins.filter(I=>I.manifest.name.toLowerCase().includes(P)||(I.manifest.description??"").toLowerCase().includes(P))}function A(P){var I;((I=i.selectedPlugin)==null?void 0:I.id)===P.id&&i.visible&&i.mode==="plugin"?i.close():i.openPlugin(P)}function g(P){return P.manifest.name.includes("openbridge-")||P.source==="native"}function S(P){const I=_(P);for(const O of I){const T=a.value.get(O);if(T)return T}if(P.enrichedMetadata)return P.enrichedMetadata}async function m(P,I=!1){var T;const O=_(P);for(const H of O)if(!(!I&&a.value.has(H))&&!(!I&&o.value.has(H))){o.value.add(H);try{const W=await Pe.marketplace.enriched(H),q=new Map(a.value);if(q.set(H,W),q.set(f(P),W),a.value=q,P.enrichedMetadata=W,W.documentationUrl||W.githubSponsorsUrl||(T=W.links)!=null&&T.repository)return}catch{}finally{const W=new Set(o.value);W.delete(H),o.value=W}}}const v=ie(new Map);function k(P){const O=P.trim().replace(/^github:/,"https://github.com/").replace(/^git\+/,"").replace(/^git@github\.com:/,"https://github.com/").match(/github\.com[/:]([^/]+)/);return O?`https://github.com/${O[1]}.png?size=48`:null}function x(P){var H,W;const I=S(P),O=((H=I==null?void 0:I.links)==null?void 0:H.repository)??((W=I==null?void 0:I.links)==null?void 0:W.homepage)??"";if(O){const q=k(O);if(q)return q}const T=_(P);for(const q of T){const K=v.value.get(q);if(K)return K}return null}async function M(P,I=!1){var O;if(!(!I&&v.value.has(P)))try{const T=await fetch(`https://registry.npmjs.org/${encodeURIComponent(P)}/latest`,{signal:AbortSignal.timeout(5e3)});if(!T.ok){v.value.set(P,"");return}const H=await T.json(),W=((O=H==null?void 0:H.repository)==null?void 0:O.url)??(H==null?void 0:H.homepage)??"";v.value.set(P,k(W)??"")}catch{v.value.set(P,"")}}async function z(P=!1){if(!l.value){l.value=!0;try{P&&(a.value=new Map,v.value=new Map);const I=t.plugins;for(const O of I){const T=_(O);for(const H of T)await M(H,P);await m(O,P)}P&&s.success("Plugin metadata refreshed")}catch{s.error("Failed to refresh plugin metadata")}finally{l.value=!1}}}return _t(async()=>{await t.fetchPlugins()}),Fe(()=>t.plugins.length,P=>{r.setPage("Plugins",P)},{immediate:!0}),(P,I)=>{const O=ul,T=gi,H=Ye;return y(),$("div",zR,[(y(),fe(Or,{defer:"",to:"#ob-topbar-right"},[X(O,{modelValue:n.value,"onUpdate:modelValue":I[0]||(I[0]=W=>n.value=W),placeholder:"Search plugins...",size:"sm",style:{width:"200px"}},null,8,["modelValue"]),X(T,{variant:"ghost",size:"sm",icon:uR,title:"Refresh metadata",loading:l.value,disabled:l.value,onClick:I[1]||(I[1]=W=>z(!0))},null,8,["loading","disabled"]),X(T,{variant:"ghost",size:"sm",icon:c.value===og?lg:cg,title:c.value==="cards"?"Show as table":"Show as cards",onClick:u},null,8,["icon","title"]),X(T,{variant:"primary",size:"sm",icon:of,onClick:I[2]||(I[2]=W=>oe(i).openMarketplace())},{default:ee(()=>[...I[5]||(I[5]=[le(" Browse plugins ",-1)])]),_:1})])),d.value.length===0?(y(),$("div",UR,[X(H,{name:oe(Ws),size:40},null,8,["name"]),n.value?(y(),$("p",WR,'No plugins matching "'+U(n.value)+'"',1)):(y(),$(be,{key:1},[I[7]||(I[7]=b("p",null,"No plugins loaded yet.",-1)),X(T,{variant:"primary",size:"sm",icon:of,onClick:I[3]||(I[3]=W=>oe(i).openMarketplace())},{default:ee(()=>[...I[6]||(I[6]=[le(" Browse & install plugins ",-1)])]),_:1})],64))])):(y(),$("div",{key:1,class:"plugins-body",onClick:I[4]||(I[4]=lt(W=>oe(i).close(),["self"]))},[X(FR,{rows:d.value,view:c.value,"selected-id":h.value,onSelect:A},null,8,["rows","view","selected-id"])]))])}}}),KR=Zt(jR,[["__scopeId","data-v-95e3ebc4"]]),da=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},qR=da("devices","0 0 256 256",'<path d="M224,76H204V64a20,20,0,0,0-20-20H40A20,20,0,0,0,20,64v96a20,20,0,0,0,20,20H156v12a20,20,0,0,0,20,20h48a20,20,0,0,0,20-20V96A20,20,0,0,0,224,76ZM40,172a12,12,0,0,1-12-12V64A12,12,0,0,1,40,52H184a12,12,0,0,1,12,12V76H176a20,20,0,0,0-20,20v76Zm196,20a12,12,0,0,1-12,12H176a12,12,0,0,1-12-12V96a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12ZM132,208a4,4,0,0,1-4,4H88a4,4,0,0,1,0-8h40A4,4,0,0,1,132,208Zm80-96a4,4,0,0,1-4,4H192a4,4,0,0,1,0-8h16A4,4,0,0,1,212,112Z"/>'),GR=da("devices","0 0 256 256",'<path d="M224,74H206V64a22,22,0,0,0-22-22H40A22,22,0,0,0,18,64v96a22,22,0,0,0,22,22H154v10a22,22,0,0,0,22,22h48a22,22,0,0,0,22-22V96A22,22,0,0,0,224,74ZM40,170a10,10,0,0,1-10-10V64A10,10,0,0,1,40,54H184a10,10,0,0,1,10,10V74H176a22,22,0,0,0-22,22v74Zm194,22a10,10,0,0,1-10,10H176a10,10,0,0,1-10-10V96a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10ZM134,208a6,6,0,0,1-6,6H88a6,6,0,0,1,0-12h40A6,6,0,0,1,134,208Zm80-96a6,6,0,0,1-6,6H192a6,6,0,0,1,0-12h16A6,6,0,0,1,214,112Z"/>'),yu=da("devices","0 0 256 256",'<path d="M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72ZM40,168a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8v8H176a24,24,0,0,0-24,24v72Zm192,24a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z"/>'),YR=da("devices","0 0 256 256",'<path d="M224,72H212V64a28,28,0,0,0-28-28H40A28,28,0,0,0,12,64v88a28,28,0,0,0,28,28h96v12a28,28,0,0,0,28,28h60a28,28,0,0,0,28-28V100A28,28,0,0,0,224,72ZM40,156a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H184a4,4,0,0,1,4,4v8H164a28,28,0,0,0-28,28v56Zm188,36a4,4,0,0,1-4,4H164a4,4,0,0,1-4-4V100a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM124,208a12,12,0,0,1-12,12H88a12,12,0,0,1,0-24h24A12,12,0,0,1,124,208Zm88-84a12,12,0,0,1-12,12H188a12,12,0,0,1,0-24h12A12,12,0,0,1,212,124Z"/>'),XR=da("devices","0 0 256 256",'<path d="M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72Zm8,120a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z"/>'),JR=da("devices","0 0 256 256",'<path d="M200,64V80H176a16,16,0,0,0-16,16v80H40a16,16,0,0,1-16-16V64A16,16,0,0,1,40,48H184A16,16,0,0,1,200,64Z" opacity="0.2"/><path d="M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72ZM40,168a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8v8H176a24,24,0,0,0-24,24v72Zm192,24a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z"/>'),QR="devices",eD=Object.freeze(Object.defineProperty({__proto__:null,bold:YR,default:yu,duotone:JR,fill:XR,glyphName:QR,light:GR,regular:yu,thin:qR},Symbol.toStringTag,{value:"Module"})),tD={class:"devices-view"},iD={class:"toolbar-count"},rD={key:1,class:"empty-state"},sD={class:"device-icon native-icon"},nD={class:"device-info"},aD={class:"device-name"},oD={class:"device-type"},lD={class:"device-summary"},cD={key:0,class:"summary-primary"},uD={class:"summary-primary"},hD={key:0,class:"summary-secondary"},dD={key:2,class:"summary-primary"},fD={class:"device-info"},_D={class:"device-name"},pD={class:"device-type"},mD={key:0,class:"device-summary"},gD={class:"summary-primary"},vD={class:"cell-name"},bD={key:1},yD={class:"confirm-dialog"},wD={class:"confirm-icon"},SD={class:"confirm-message"},CD={class:"confirm-actions"},P6="openbridge.devices.view",AD=Oe({__name:"DevicesView",setup(e){const t=ys(),i=fl(),r=dl();function s(ne){r.push({name:"device-detail",params:{id:ne.id}})}const n=Gs(),a=ie(!1),o=ie([]),l=ie(localStorage.getItem(P6)==="table"?"table":"cards");function c(){l.value=l.value==="cards"?"table":"cards",localStorage.setItem(P6,l.value)}const u=ie({key:"name",direction:"asc"}),h=[{key:"name",header:"Device",sortable:!0},{key:"type",header:"Type",sortable:!0,width:160},{key:"source",header:"Source",sortable:!0,width:120},{key:"state",header:"State",sortable:!0,width:120},{key:"detail",header:"Reading",sortable:!0,width:160}],d=Q(()=>{const ne=[...o.value.map(Y=>({key:"native:"+Y.id,name:Y.name,type:M(_(Y)),source:"Native",state:Y.telemetry.active===void 0?"":Y.telemetry.active?"On":"Off",stateOn:!!Y.telemetry.active,detail:f(Y),icon:x(_(Y)),select:()=>g(Y)})),...t.accessories.map(Y=>{const J=O(Y);return{key:"hap:"+Y.uuid,name:Y.displayName,type:m(Y.category).label,source:"HomeKit",state:J?J.value?"On":"Off":"",stateOn:!!(J!=null&&J.value),detail:T(Y)??"",icon:m(Y.category).icon,select:()=>A(Y)}})],re=u.value;if(!re||re.direction==="none")return ne;const D=re.direction==="asc"?1:-1;return[...ne].sort((Y,J)=>D*String(Y[re.key]??"").localeCompare(String(J[re.key]??"")))});function f(ne){const re=ne.telemetry;return ne.widgetType==="energy_meter"&&re.power!==void 0?`${W(re.power,1)} W`:ne.widgetType==="thermostat"&&re.currentTemperature!==void 0?`${W(re.currentTemperature,1)}°C`:ne.widgetType==="dehumidifier"&&re.currentHumidity!==void 0?`${W(re.currentHumidity,0)}%`:re.power!==void 0?`${W(re.power,1)} W`:""}function _(ne){return ne.homekitType||ne.widgetType}const p=Q(()=>i.mode!=="device"||!i.selectedDevice?null:i.selectedDevice.kind==="native"?i.selectedDevice.dev.id:i.selectedDevice.acc.uuid);function A(ne){p.value===ne.uuid?i.close():i.openDevice({kind:"hap",acc:ne})}function g(ne){p.value===ne.id?i.close():i.openDevice({kind:"native",dev:ne})}const S={1:{label:"Other",icon:"cube"},2:{label:"Bridge",icon:"intersect"},3:{label:"Fan",icon:"fan"},4:{label:"Garage Door",icon:"garage"},5:{label:"Light",icon:"lightbulb"},6:{label:"Lock",icon:"lock"},7:{label:"Outlet",icon:"plugs"},8:{label:"Switch",icon:"toggle-right"},9:{label:"Thermostat",icon:"thermometer"},10:{label:"Sensor",icon:"pulse"},11:{label:"Security",icon:"shield"},12:{label:"Door",icon:"door"},13:{label:"Window",icon:"app-window"},14:{label:"Window Covering",icon:"rows"},15:{label:"Programm. Switch",icon:"sliders"},16:{label:"Range Extender",icon:"broadcast"},17:{label:"Camera",icon:"camera"},18:{label:"Video Doorbell",icon:"bell"},19:{label:"Air Purifier",icon:"wind"},20:{label:"Heater/Cooler",icon:"thermometer-hot"},21:{label:"Air Conditioner",icon:"snowflake"},22:{label:"Humidifier",icon:"drop"},23:{label:"Dehumidifier",icon:"drop"},26:{label:"Speaker",icon:"speaker-high"},28:{label:"Sprinkler",icon:"drop"},29:{label:"Faucet",icon:"drop"},30:{label:"Shower",icon:"drop"},32:{label:"TV",icon:"television"},34:{label:"Router",icon:"broadcast"},36:{label:"Target Control",icon:"game-controller"},38:{label:"Smart Speaker",icon:"speaker-hifi"}};function m(ne){return S[ne]??{label:`Category ${ne}`,icon:"cube"}}const v={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"},k={switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",gate:"Gate",sensor:"Sensor"};function x(ne){return v[ne]??"cube"}function M(ne){return k[ne]??ne}const z=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]),P=new Set(["On","Active","LockTargetState","TargetDoorState"]);function I(ne){return ne.services.find(re=>!z.has(re.name)&&!z.has(re.uuid))}function O(ne){const re=I(ne);return re?re.characteristics.find(D=>P.has(D.name)&&D.perms.includes("pw"))??null:null}function T(ne){const re=I(ne);if(!re)return null;for(const Y of re.characteristics){if(Y.name==="CurrentTemperature"&&Y.value!=null)return`${Number(Y.value).toFixed(1)}°C`;if(Y.name==="CurrentRelativeHumidity"&&Y.value!=null)return`${Math.round(Number(Y.value))}%`;if(Y.name==="CurrentPosition"&&Y.value!=null)return`${Math.round(Number(Y.value))}%`;if(Y.name==="Brightness"&&Y.value!=null)return`${Math.round(Number(Y.value))}%`}const D=re.characteristics.find(Y=>Y.name==="On");return D?D.value?"On":"Off":null}async function H(ne,re){const D=I(ne),Y=O(ne);if(!(!D||!Y))try{await Pe.setCharacteristic(ne.uuid,D.uuid,Y.uuid,re?1:0),await t.fetchAccessories()}catch(J){console.error("HAP control failed",J)}}function W(ne,re=1){if(ne==null)return"—";const D=Number(ne);return isFinite(D)?D.toFixed(re):String(ne)}const q=Q(()=>t.accessories.length+o.value.length);async function K(){var ne;try{const re=await Pe.devices();if(o.value=re.devices,i.mode==="device"&&((ne=i.selectedDevice)==null?void 0:ne.kind)==="native"){const D=i.selectedDevice.dev.id,Y=re.devices.find(J=>J.id===D);Y&&i.updateDevice({kind:"native",dev:Y})}}catch{}}async function se(){a.value=!0,await Promise.all([t.fetchAccessories(),K()]),a.value=!1}let ce=null;const te=ie({visible:!1,deviceId:"",control:"",value:null,message:""});function ge(ne,re,D){return ne.widgetType==="energy_meter"&&re==="active"?D?`Turn on ${ne.name}? This will energise the connected circuit.`:`Turn off ${ne.name}? This will cut power to the connected circuit.`:!1}async function pe(ne,re,D){try{await Pe.controlDevice(ne,re,D),await K()}catch(Y){console.error("Control failed",Y)}}function ve(ne,re,D){const Y=ge(ne,re,D);Y?te.value={visible:!0,deviceId:ne.id,control:re,value:D,message:Y}:pe(ne.id,re,D)}function Te(){const{deviceId:ne,control:re,value:D}=te.value;te.value.visible=!1,pe(ne,re,D)}function Me(){te.value.visible=!1}return _t(async()=>{n.setPage("Devices"),await Promise.all([t.fetchAccessories(),K()]),ce=setInterval(K,3e3)}),Br(()=>{ce&&clearInterval(ce)}),(ne,re)=>{const D=Dn,Y=gi,J=Ye,_e=rc,Se=vm,B=hl,Z=hm;return y(),$("div",tD,[q.value>0?(y(),fe(Or,{key:0,defer:"",to:"#ob-topbar-left"},[b("span",iD,U(q.value)+" device"+U(q.value!==1?"s":""),1),o.value.length>0?(y(),fe(D,{key:0},{default:ee(()=>[le(U(o.value.length)+" native",1)]),_:1})):j("",!0)])):j("",!0),(y(),fe(Or,{defer:"",to:"#ob-topbar-right"},[X(Y,{variant:"ghost",size:"sm",icon:l.value===og?lg:cg,title:l.value==="cards"?"Show as table":"Show as cards",onClick:c},null,8,["icon","title"]),X(Y,{variant:"ghost",size:"sm",icon:Fs,title:"Refresh",loading:a.value,onClick:se},null,8,["loading"])])),q.value===0?(y(),$("div",rD,[X(J,{name:oe(yu),size:40},null,8,["name"]),re[8]||(re[8]=b("p",null,"No devices registered yet.",-1)),re[9]||(re[9]=b("p",{class:"empty-hint"},[le(" Devices appear here once a platform plugin registers accessories. "),b("br"),le(" This page auto-refreshes every 3 seconds: discovery can take up to 60s. ")],-1))])):(y(),$("div",{key:2,class:"devices-layout",onClick:re[7]||(re[7]=lt(F=>oe(i).close(),["self"]))},[l.value==="cards"?(y(),$("div",{key:0,class:"device-grid",onClick:re[4]||(re[4]=lt(F=>oe(i).close(),["self"]))},[(y(!0),$(be,null,Ve(o.value,F=>(y(),fe(B,{key:"native:"+F.id,class:Le(["device-card native-card",{selected:p.value===F.id}]),onClick:ae=>g(F),onDblclick:ae=>s(F)},{default:ee(()=>[re[10]||(re[10]=b("span",{class:"device-card__accent"},null,-1)),b("div",sD,[X(J,{name:x(_(F)),size:22},null,8,["name"])]),b("div",nD,[b("div",aD,U(F.name),1),b("div",oD,U(M(_(F))),1),b("div",lD,[F.widgetType==="energy_meter"&&F.telemetry.power!==void 0?(y(),$("span",cD,U(W(F.telemetry.power,1))+" W",1)):F.widgetType==="thermostat"&&F.telemetry.currentTemperature!==void 0?(y(),$(be,{key:1},[b("span",uD,U(W(F.telemetry.currentTemperature,1))+"°C",1),F.telemetry.targetTemperature!==void 0?(y(),$("span",hD," target "+U(W(F.telemetry.targetTemperature,1))+"°C ",1)):j("",!0)],64)):F.widgetType==="dehumidifier"&&F.telemetry.currentHumidity!==void 0?(y(),$("span",dD,U(W(F.telemetry.currentHumidity,0))+"%",1)):F.telemetry.active!==void 0?(y(),$("span",{key:3,class:Le(["summary-status",F.telemetry.active?"on":"off"])},U(F.telemetry.active?"On":"Off"),3)):j("",!0)]),F.telemetry.active!==void 0?(y(),$("div",{key:0,class:"card-controls",onClick:re[0]||(re[0]=lt(()=>{},["stop"]))},[X(_e,{name:`device-active-${F.id}`,"model-value":!!F.telemetry.active,"onUpdate:modelValue":ae=>ve(F,"active",ae)},null,8,["name","model-value","onUpdate:modelValue"])])):j("",!0),F.widgetType==="thermostat"&&F.telemetry.targetTemperature!==void 0?(y(),$("div",{key:1,class:"card-controls",onClick:re[1]||(re[1]=lt(()=>{},["stop"]))},[X(Se,{"model-value":Number(F.telemetry.targetTemperature),size:"xs",min:5,max:35,step:1,"onUpdate:modelValue":ae=>ae!==null&&pe(F.id,"targetTemperature",ae)},null,8,["model-value","onUpdate:modelValue"])])):j("",!0),F.widgetType==="dehumidifier"&&F.telemetry.targetHumidity!==void 0?(y(),$("div",{key:2,class:"card-controls",onClick:re[2]||(re[2]=lt(()=>{},["stop"]))},[X(Se,{"model-value":Number(F.telemetry.targetHumidity),size:"xs",min:30,max:80,step:5,"onUpdate:modelValue":ae=>ae!==null&&pe(F.id,"targetHumidity",ae)},null,8,["model-value","onUpdate:modelValue"])])):j("",!0)]),b("div",{class:Le(["device-reachability",F.pluginStatus==="running"?"online":"offline"])},null,2)]),_:2},1032,["class","onClick","onDblclick"]))),128)),(y(!0),$(be,null,Ve(oe(t).accessories,F=>(y(),fe(B,{key:F.uuid,class:Le(["device-card hap-card",{selected:p.value===F.uuid,unreachable:!F.reachable}]),onClick:ae=>A(F)},{default:ee(()=>{var ae;return[b("div",{class:Le(["device-icon hap-icon",{unreachable:!F.reachable}])},[X(J,{name:m(F.category).icon,size:22},null,8,["name"])],2),b("div",fD,[b("div",_D,U(F.displayName),1),b("div",pD,U(m(F.category).label),1),T(F)?(y(),$("div",mD,[b("span",gD,U(T(F)),1)])):j("",!0),O(F)?(y(),$("div",{key:1,class:"card-controls",onClick:re[3]||(re[3]=lt(()=>{},["stop"]))},[X(_e,{name:`hap-on-${F.uuid}`,"model-value":!!((ae=O(F))!=null&&ae.value),"onUpdate:modelValue":he=>H(F,!!he)},null,8,["name","model-value","onUpdate:modelValue"])])):j("",!0)]),b("div",{class:Le(["device-reachability",F.reachable?"online":"offline"])},null,2)]}),_:2},1032,["class","onClick"]))),128))])):(y(),fe(Z,{key:1,columns:h,rows:d.value,"row-key":"key",size:"sm",zebra:"","sort-state":u.value,onSort:re[5]||(re[5]=F=>u.value=F),onRowClick:re[6]||(re[6]=F=>F.select())},{"cell-name":ee(({row:F})=>[b("div",vD,[X(J,{name:F.icon,size:16},null,8,["name"]),b("span",null,U(F.name),1)])]),"cell-state":ee(({row:F})=>[F.state?(y(),fe(D,{key:0,variant:F.stateOn?"green":"grey"},{default:ee(()=>[le(U(F.state),1)]),_:2},1032,["variant"])):(y(),$("span",bD,"—"))]),_:1},8,["rows","sort-state"]))])),(y(),fe(Or,{to:"body"},[te.value.visible?(y(),$("div",{key:0,class:"confirm-overlay",onClick:lt(Me,["self"])},[b("div",yD,[b("div",wD,[X(J,{name:oe(wn),size:24},null,8,["name"])]),b("p",SD,U(te.value.message),1),b("div",CD,[X(Y,{variant:"ghost",size:"sm",onClick:Me},{default:ee(()=>[...re[11]||(re[11]=[le("Cancel",-1)])]),_:1}),X(Y,{variant:"primary",size:"sm",onClick:Te},{default:ee(()=>[...re[12]||(re[12]=[le("Confirm",-1)])]),_:1})])])])):j("",!0)]))])}}}),kD=Zt(AD,[["__scopeId","data-v-7ce12dbc"]]),fa=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},MD=fa("arrow-left","0 0 256 256",'<path d="M220,128a4,4,0,0,1-4,4H49.66l65.17,65.17a4,4,0,0,1-5.66,5.66l-72-72a4,4,0,0,1,0-5.66l72-72a4,4,0,0,1,5.66,5.66L49.66,124H216A4,4,0,0,1,220,128Z"/>'),LD=fa("arrow-left","0 0 256 256",'<path d="M222,128a6,6,0,0,1-6,6H54.49l61.75,61.76a6,6,0,1,1-8.48,8.48l-72-72a6,6,0,0,1,0-8.48l72-72a6,6,0,0,1,8.48,8.48L54.49,122H216A6,6,0,0,1,222,128Z"/>'),O6=fa("arrow-left","0 0 256 256",'<path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z"/>'),ED=fa("arrow-left","0 0 256 256",'<path d="M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z"/>'),xD=fa("arrow-left","0 0 256 256",'<path d="M224,128a8,8,0,0,1-8,8H120v64a8,8,0,0,1-13.66,5.66l-72-72a8,8,0,0,1,0-11.32l72-72A8,8,0,0,1,120,56v64h96A8,8,0,0,1,224,128Z"/>'),$D=fa("arrow-left","0 0 256 256",'<path d="M112,56V200L40,128Z" opacity="0.2"/><path d="M216,120H120V56a8,8,0,0,0-13.66-5.66l-72,72a8,8,0,0,0,0,11.32l72,72A8,8,0,0,0,120,200V136h96a8,8,0,0,0,0-16ZM104,180.69,51.31,128,104,75.31Z"/>'),TD="arrow-left",ND=Object.freeze(Object.defineProperty({__proto__:null,bold:ED,default:O6,duotone:$D,fill:xD,glyphName:TD,light:LD,regular:O6,thin:MD},Symbol.toStringTag,{value:"Module"})),HD={class:"device-detail"},PD={key:0,class:"detail-message"},OD={class:"summary-row"},ID=["onClick"],RD={class:"tile-label"},DD={class:"tile-value"},VD={class:"tile-unit"},BD={key:0,class:"detail-message"},ZD={class:"chart-toolbar"},FD={class:"range-tabs"},zD=["onClick"],UD={key:0,class:"resolution-note"},WD={class:"chart-panel"},jD={key:1,class:"chart-empty"},KD={key:2,class:"chart-empty"},qD={key:2,class:"detail-message"},GD=Oe({__name:"DeviceDetailView",setup(e){const t=oc(),i=dl(),r=Q(()=>String(t.params.id??"")),s=ie(null),n=ie([]),a=ie(""),o=ie(!1),l=ie(""),c=ie(0),u=ie([]),h=[{key:"1h",label:"1 hour",seconds:3600},{key:"24h",label:"24 hours",seconds:86400},{key:"7d",label:"7 days",seconds:7*86400},{key:"30d",label:"30 days",seconds:30*86400},{key:"1y",label:"1 year",seconds:365*86400}],d=ie("24h"),f=Q(()=>{var I;return((I=s.value)==null?void 0:I.model)??"Device"}),_=Q(()=>n.value.find(I=>I.key===a.value)??null),p=Q(()=>{const I=_.value;if(!I||u.value.length===0)return[];const O={name:I.label,data:u.value.map(H=>({x:new Date(H.t*1e3),y:H.value??0}))};return u.value.some(H=>H.min!==void 0&&H.min!==null&&H.min!==H.value)?[O,{name:"Min",data:u.value.map(H=>({x:new Date(H.t*1e3),y:H.min??H.value??0}))},{name:"Max",data:u.value.map(H=>({x:new Date(H.t*1e3),y:H.max??H.value??0}))}]:[O]}),A=Q(()=>{if(!c.value)return"";const I=c.value;return I<60?`${I}s resolution`:I<3600?`${Math.round(I/60)} min resolution`:`${Math.round(I/3600)} h resolution`});function g(I){var H,W;const O=(W=(H=s.value)==null?void 0:H.telemetry)==null?void 0:W[I.key],T=Number(O);return Number.isFinite(T)?T:null}function S(I,O){return I===null?"—":I.toFixed(O.precision??2)}function m(){i.push({name:"devices"})}function v(I){a.value!==I&&(a.value=I,M())}function k(I){d.value!==I&&(d.value=I,M())}async function x(){try{const{devices:I}=await Pe.devices(),O=I.find(T=>T.id===r.value);if(!O){l.value=`Device "${r.value}" was not found. It may have been removed, or its plugin stopped.`;return}s.value=O,n.value=O.metrics??[],!a.value&&n.value.length>0&&(a.value=n.value[0].key)}catch(I){l.value=`Could not load device: ${I.message}`}}async function M(){var H,W;if(!a.value)return;const I=h.find(q=>q.key===d.value),O=Math.floor(Date.now()/1e3),T=O-I.seconds;o.value=!0;try{const q=await Pe.deviceMetrics(r.value,{metric:a.value,from:T,to:O});u.value=((H=q.series)==null?void 0:H.points)??[],c.value=((W=q.series)==null?void 0:W.resolution)??0}catch(q){l.value=`Could not load history: ${q.message}`}finally{o.value=!1}}let z=null,P=null;return _t(async()=>{await x(),await M(),z=setInterval(()=>void x(),5e3),P=setInterval(()=>void M(),3e4)}),Bi(()=>{z&&clearInterval(z),P&&clearInterval(P)}),Fe(r,async()=>{s.value=null,n.value=[],a.value="",u.value=[],l.value="",await x(),await M()}),(I,O)=>{var K;const T=gi,H=O4,W=rt,q=UM;return y(),$("div",HD,[X(H,{title:f.value,subtitle:((K=s.value)==null?void 0:K.name)??r.value},{default:ee(()=>[X(T,{variant:"ghost",size:"sm",icon:ND,onClick:m},{default:ee(()=>[...O[0]||(O[0]=[le("Devices",-1)])]),_:1})]),_:1},8,["title","subtitle"]),l.value?(y(),$("div",PD,[X(W,{variant:"error"},{default:ee(()=>[le(U(l.value),1)]),_:1})])):s.value?(y(),$(be,{key:1},[b("div",OD,[(y(!0),$(be,null,Ve(n.value,se=>(y(),$("div",{key:se.key,class:Le(["summary-tile",{active:se.key===a.value}]),onClick:ce=>v(se.key)},[b("span",RD,U(se.label),1),b("span",DD,[le(U(S(g(se),se))+" ",1),b("span",VD,U(se.unit),1)])],10,ID))),128))]),n.value.length===0?(y(),$("div",BD,[X(W,{variant:"helper"},{default:ee(()=>[...O[1]||(O[1]=[le(" This device does not declare any metrics, so there is nothing to chart. Plugins opt in by describing their series in the device descriptor. ",-1)])]),_:1})])):(y(),$(be,{key:1},[b("div",ZD,[b("div",FD,[(y(),$(be,null,Ve(h,se=>b("button",{key:se.key,class:Le(["range-tab",{active:se.key===d.value}]),onClick:ce=>k(se.key)},U(se.label),11,zD)),64))]),A.value?(y(),$("span",UD,U(A.value),1)):j("",!0)]),b("div",WD,[p.value.length>0&&p.value[0].data.length>0?(y(),fe(q,{key:0,series:p.value,height:320,"show-legend":p.value.length>1,"show-grid":!0,"show-tooltip":!0,points:!1,curve:"smooth"},null,8,["series","show-legend"])):o.value?(y(),$("div",jD,"Loading…")):(y(),$("div",KD," No data recorded yet for this range. History starts accumulating once the device reports. "))])],64))],64)):(y(),$("div",qD,"Loading…"))])}}}),YD=Zt(GD,[["__scopeId","data-v-df1516e5"]]),_a=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},XD=_a("magic-wand","0 0 256 256",'<path d="M244,152a4,4,0,0,1-4,4H220v20a4,4,0,0,1-8,0V156H192a4,4,0,0,1,0-8h20V128a4,4,0,0,1,8,0v20h20A4,4,0,0,1,244,152ZM56,68H76V88a4,4,0,0,0,8,0V68h20a4,4,0,0,0,0-8H84V40a4,4,0,0,0-8,0V60H56a4,4,0,0,0,0,8ZM184,196H172V184a4,4,0,0,0-8,0v12H152a4,4,0,0,0,0,8h12v12a4,4,0,0,0,8,0V204h12a4,4,0,0,0,0-8ZM216.48,77.17,77.17,216.49a12,12,0,0,1-17,0L39.51,195.8a12,12,0,0,1,0-17L178.83,39.51a12,12,0,0,1,17,0L216.48,60.2A12,12,0,0,1,216.48,77.17ZM170.34,112,144,85.66,45.17,184.49a4,4,0,0,0,0,5.65l20.68,20.69a4,4,0,0,0,5.66,0Zm40.49-46.14L190.14,45.17a4,4,0,0,0-5.66,0L149.65,80,176,106.34l34.83-34.83A4,4,0,0,0,210.83,65.86Z"/>'),JD=_a("magic-wand","0 0 256 256",'<path d="M246,152a6,6,0,0,1-6,6H222v18a6,6,0,0,1-12,0V158H192a6,6,0,0,1,0-12h18V128a6,6,0,0,1,12,0v18h18A6,6,0,0,1,246,152ZM56,70H74V88a6,6,0,0,0,12,0V70h18a6,6,0,0,0,0-12H86V40a6,6,0,0,0-12,0V58H56a6,6,0,0,0,0,12ZM184,194H174V184a6,6,0,0,0-12,0v10H152a6,6,0,0,0,0,12h10v10a6,6,0,0,0,12,0V206h10a6,6,0,0,0,0-12ZM217.9,78.59,78.58,217.9a14,14,0,0,1-19.8,0L38.09,197.21a14,14,0,0,1,0-19.8L177.41,38.1a14,14,0,0,1,19.8,0L217.9,58.79A14,14,0,0,1,217.9,78.59ZM167.51,112,144,88.49,46.58,185.9a2,2,0,0,0,0,2.83l20.69,20.68a2,2,0,0,0,2.82,0h0Zm41.9-44.73L188.73,46.59a2,2,0,0,0-2.83,0L152.48,80,176,103.52,209.41,70.1A2,2,0,0,0,209.41,67.27Z"/>'),I6=_a("magic-wand","0 0 256 256",'<path d="M48,64a8,8,0,0,1,8-8H72V40a8,8,0,0,1,16,0V56h16a8,8,0,0,1,0,16H88V88a8,8,0,0,1-16,0V72H56A8,8,0,0,1,48,64ZM184,192h-8v-8a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0v-8h8a8,8,0,0,0,0-16Zm56-48H224V128a8,8,0,0,0-16,0v16H192a8,8,0,0,0,0,16h16v16a8,8,0,0,0,16,0V160h16a8,8,0,0,0,0-16ZM219.31,80,80,219.31a16,16,0,0,1-22.62,0L36.68,198.63a16,16,0,0,1,0-22.63L176,36.69a16,16,0,0,1,22.63,0l20.68,20.68A16,16,0,0,1,219.31,80Zm-54.63,32L144,91.31l-96,96L68.68,208ZM208,68.69,187.31,48l-32,32L176,100.69Z"/>'),QD=_a("magic-wand","0 0 256 256",'<path d="M252,152a12,12,0,0,1-12,12H228v12a12,12,0,0,1-24,0V164H192a12,12,0,0,1,0-24h12V128a12,12,0,0,1,24,0v12h12A12,12,0,0,1,252,152ZM56,76H68V88a12,12,0,0,0,24,0V76h12a12,12,0,1,0,0-24H92V40a12,12,0,0,0-24,0V52H56a12,12,0,0,0,0,24ZM184,188h-4v-4a12,12,0,0,0-24,0v4h-4a12,12,0,0,0,0,24h4v4a12,12,0,0,0,24,0v-4h4a12,12,0,0,0,0-24ZM222.14,82.83,82.82,222.14a20,20,0,0,1-28.28,0L33.85,201.46a20,20,0,0,1,0-28.29L173.17,33.86a20,20,0,0,1,28.28,0l20.69,20.68A20,20,0,0,1,222.14,82.83ZM159,112,144,97,53.65,187.31l15,15Zm43.31-43.31-15-15L161,80l15,15Z"/>'),eV=_a("magic-wand","0 0 256 256",'<path d="M248,152a8,8,0,0,1-8,8H224v16a8,8,0,0,1-16,0V160H192a8,8,0,0,1,0-16h16V128a8,8,0,0,1,16,0v16h16A8,8,0,0,1,248,152ZM56,72H72V88a8,8,0,0,0,16,0V72h16a8,8,0,0,0,0-16H88V40a8,8,0,0,0-16,0V56H56a8,8,0,0,0,0,16ZM184,192h-8v-8a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0v-8h8a8,8,0,0,0,0-16ZM219.31,80,80,219.31a16,16,0,0,1-22.62,0L36.68,198.63a16,16,0,0,1,0-22.63L176,36.69a16,16,0,0,1,22.63,0l20.68,20.68A16,16,0,0,1,219.31,80ZM208,68.69,187.31,48l-32,32L176,100.69Z"/>'),tV=_a("magic-wand","0 0 256 256",'<path d="M176,112,74.34,213.66a8,8,0,0,1-11.31,0L42.34,193a8,8,0,0,1,0-11.31L144,80Z" opacity="0.2"/><path d="M248,152a8,8,0,0,1-8,8H224v16a8,8,0,0,1-16,0V160H192a8,8,0,0,1,0-16h16V128a8,8,0,0,1,16,0v16h16A8,8,0,0,1,248,152ZM56,72H72V88a8,8,0,0,0,16,0V72h16a8,8,0,0,0,0-16H88V40a8,8,0,0,0-16,0V56H56a8,8,0,0,0,0,16ZM184,192h-8v-8a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0v-8h8a8,8,0,0,0,0-16ZM219.31,80,80,219.31a16,16,0,0,1-22.62,0L36.68,198.63a16,16,0,0,1,0-22.63L176,36.69a16,16,0,0,1,22.63,0l20.68,20.68A16,16,0,0,1,219.31,80Zm-54.63,32L144,91.31l-96,96L68.68,208ZM208,68.69,187.31,48l-32,32L176,100.69Z"/>'),iV="magic-wand",rV=Object.freeze(Object.defineProperty({__proto__:null,bold:QD,default:I6,duotone:tV,fill:eV,glyphName:iV,light:JD,regular:I6,thin:XD},Symbol.toStringTag,{value:"Module"})),sV={class:"config-view"},nV={key:0,class:"error-banner"},aV={key:1,class:"loading-state"},oV=Oe({__name:"ConfigView",setup(e){const t=Gs(),{resolved:i}=Yh(),r=ie(null),s=Vr(null),n=ie(!1),a=ie(!1),o=ie(null),l=ie(!0);_t(async()=>{t.setPage("Config",void 0,{fullBleed:!0});let h="{}";try{h=(await Pe.config.get()).content}catch(f){o.value=`Failed to load config: ${f}`}finally{l.value=!1}const d=await rg.init();d.languages.json.jsonDefaults.setDiagnosticsOptions({validate:!0,schemas:[{uri:"openbridge://config-schema",fileMatch:["*"],schema:{type:"object",properties:{bridge:{type:"object",description:"Bridge configuration",properties:{name:{type:"string",description:"Bridge display name"},port:{type:"number",description:"HTTP API port (default 8582)"},hapPort:{type:"number",description:"HomeKit HAP port (default 51829)"},pincode:{type:"string",description:"HomeKit pairing PIN (format: XXX-XX-XXX)"},username:{type:"string",description:"HAP username (MAC address format)"},logLevel:{type:"string",enum:["debug","info","warn","error"]}}},platforms:{type:"array",description:"Homebridge-compatible platform plugins",items:{type:"object",required:["platform"],properties:{platform:{type:"string",description:"Platform identifier"},plugin:{type:"string",description:"Absolute path to the plugin JS file"},enabled:{type:"boolean",default:!0}},additionalProperties:!0}},plugins:{type:"array",description:"Native OpenBridge plugins",items:{type:"object",required:["name"],properties:{name:{type:"string"},path:{type:"string"},enabled:{type:"boolean",default:!0},config:{type:"object"}}}}}}}]}),r.value&&(Fe(i,f=>d.editor.setTheme(f==="dark"?"vs-dark":"vs")),s.value=d.editor.create(r.value,{value:h,language:"json",theme:i.value==="dark"?"vs-dark":"vs",fontSize:13,fontFamily:'"MesloLGS NF", monospace',minimap:{enabled:!0},scrollBeyondLastLine:!1,formatOnPaste:!0,formatOnType:!0,tabSize:2,automaticLayout:!0,wordWrap:"off",bracketPairColorization:{enabled:!0},guides:{bracketPairs:!0},lineNumbers:"on",renderLineHighlight:"all",smoothScrolling:!0}))}),Bi(()=>{var h;(h=s.value)==null||h.dispose()});async function c(){var h;if(!n.value){n.value=!0,o.value=null,a.value=!1;try{const d=((h=s.value)==null?void 0:h.getValue())??"";await Pe.config.save(d),a.value=!0,setTimeout(()=>{a.value=!1},2500)}catch(d){o.value=String(d)}finally{n.value=!1}}}function u(){var h,d;(d=(h=s.value)==null?void 0:h.getAction("editor.action.formatDocument"))==null||d.run()}return(h,d)=>{const f=gi,_=Ye;return y(),$("div",sV,[(y(),fe(Or,{defer:"",to:"#ob-topbar-left"},[d[0]||(d[0]=b("span",{class:"config-path"},"~/.openbridge/config.json",-1))])),(y(),fe(Or,{defer:"",to:"#ob-topbar-right"},[X(f,{variant:"ghost",size:"sm",icon:rV,title:"Format JSON",onClick:u},{default:ee(()=>[...d[1]||(d[1]=[le("Format",-1)])]),_:1}),X(f,{variant:"primary",size:"sm",icon:a.value?_s:A0,loading:n.value,disabled:n.value,title:"Changes take effect after restarting the daemon",onClick:c},{default:ee(()=>[le(U(a.value?"Saved!":n.value?"Saving…":"Save"),1)]),_:1},8,["icon","loading","disabled"])])),o.value?(y(),$("div",nV,[X(_,{name:oe(wn),size:14},null,8,["name"]),le(" "+U(o.value),1)])):j("",!0),l.value?(y(),$("div",aV,[X(_,{name:oe(Ln),size:28},null,8,["name"]),d[2]||(d[2]=b("span",null,"Loading config...",-1))])):(y(),$("div",{key:2,ref_key:"editorContainer",ref:r,class:"editor-container"},null,512))])}}}),lV=Zt(oV,[["__scopeId","data-v-483debe2"]]),cV=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},uV=cV("bridge","0 0 256 256",'<path d="M232,160H200V101.34a71.89,71.89,0,0,0,29,21.42,8,8,0,0,0,6-14.83A55.78,55.78,0,0,1,200,56a8,8,0,0,0-16,0A56,56,0,0,1,72,56a8,8,0,0,0-16,0,55.78,55.78,0,0,1-35,51.93,8,8,0,0,0,6,14.83,71.89,71.89,0,0,0,29-21.42V160H24a8,8,0,0,0,0,16H56v24a8,8,0,0,0,16,0V176H184v24a8,8,0,0,0,16,0V176h32a8,8,0,0,0,0-16Zm-88-33.8V160H112V126.2a72,72,0,0,0,32,0Zm-72-25a72.47,72.47,0,0,0,24,19.27V160H72ZM160,160V120.48a72.47,72.47,0,0,0,24-19.27V160Z"/>'),hV=(e,t,i)=>{const r=s=>Ae("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},dV=hV("palette","0 0 256 256",'<path d="M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z"/>'),fV={class:"settings-view"},_V={class:"card-header"},pV={class:"card-icon"},mV={class:"pin-row"},gV={class:"card-actions"},vV={key:0,class:"action-hint"},bV={class:"card-header"},yV={class:"card-icon"},wV={class:"update-row"},SV={class:"update-versions"},CV={class:"update-actions"},AV={key:3,class:"update-error-row"},kV={class:"card-header"},MV={class:"card-icon"},LV={class:"info-title"},EV=Oe({__name:"SettingsView",setup(e){const t=Gs(),{theme:i,resolved:r,followsSystem:s,setTheme:n}=Yh(),a=[{value:"light",label:"Light"},{value:"dark",label:"Dark"},{value:"system",label:"System"}],o=Q({get:()=>i.value,set:q=>n(q)}),l=Q(()=>s.value?`Following your system, currently ${r.value}`:"Pinned, ignoring your system setting"),c=[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warn"},{value:"error",label:"Error"}],u=ie(!1),h=ie(!1),d=ie(null),f=ie(!1),_=ie(null),p=ie(!1),A=ie(!1),g=ie(null),S=ie(""),m=ie(0),v=ie("");let k=null;async function x(){p.value=!0,g.value=null;try{_.value=await Pe.updates.check()}catch(q){g.value=String(q)}finally{p.value=!1}}function M(){const q=location.protocol==="https:"?"wss":"ws";k=new WebSocket(`${q}://${location.host}/ws/updates`),k.onmessage=K=>{try{const se=JSON.parse(K.data);S.value=se.stage??"",m.value=Math.round((se.progress??0)*100),v.value=se.message??"",se.stage==="restarting"&&z(),se.stage==="error"&&(g.value=se.message,A.value=!1)}catch{}},k.onclose=()=>{A.value&&z()}}function z(){let q=0;const K=setInterval(async()=>{q++;try{await Pe.health(),clearInterval(K),A.value=!1,S.value="",v.value="",_.value=null,await x()}catch{}q>60&&(clearInterval(K),A.value=!1,g.value="Timed out waiting for restart")},2e3)}async function P(){if(!A.value){A.value=!0,g.value=null,S.value="downloading",v.value="Starting update...",m.value=0,M();try{await Pe.updates.apply()}catch(q){g.value=String(q),A.value=!1}}}async function I(){if(!A.value){A.value=!0,g.value=null,v.value="Rolling back...";try{await Pe.updates.rollback(),z()}catch(q){g.value=String(q),A.value=!1}}}const O=ie({name:"OpenBridge",port:8582,hapPort:51829,pincode:"031-45-154",username:"",logLevel:"info"});_t(async()=>{t.setPage("Settings");try{const q=await Pe.bridge();q&&typeof q=="object"&&(O.value={name:q.name??"OpenBridge",port:q.port??8582,hapPort:q.hapPort??51829,pincode:q.pincode??"031-45-154",username:q.username??"",logLevel:q.logLevel??"info"})}catch{}x()}),Br(()=>{k&&(k.close(),k=null)});async function T(){if(!u.value){u.value=!0,d.value=null,h.value=!1;try{const q={name:O.value.name,port:Number(O.value.port),hapPort:Number(O.value.hapPort),pincode:O.value.pincode,logLevel:O.value.logLevel};O.value.username&&(q.username=O.value.username),await Pe.saveBridge(q),h.value=!0,setTimeout(()=>{h.value=!1},3e3)}catch(q){d.value=String(q)}finally{u.value=!1}}}async function H(){if(!f.value){f.value=!0;try{await Pe.daemon.restart();let q=0;const K=setInterval(async()=>{q++;try{await Pe.health(),clearInterval(K),location.reload()}catch{}q>60&&(clearInterval(K),f.value=!1)},1e3)}catch{f.value=!1}}}function W(){const q=()=>Math.floor(Math.random()*9)+1,K=()=>`${q()}${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`,se=()=>`${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`;O.value.pincode=`${K()}-${se()}-${K()}`}return(q,K)=>{const se=Ye,ce=ul,te=dm,ge=vm,pe=gi,ve=sc,Te=$r,Me=rt,ne=hl,re=Dn,D=mm,Y=BL;return y(),$("div",fV,[X(ne,{class:"settings-card"},{default:ee(()=>[b("div",_V,[b("div",pV,[X(se,{name:oe(uV),size:18},null,8,["name"])]),K[7]||(K[7]=b("div",null,[b("h2",{class:"card-title"},"Bridge"),b("p",{class:"card-subtitle"},"HomeKit bridge identity and network settings")],-1))]),X(Te,{dir:"col",gap:"sm",class:"field-grid"},{default:ee(()=>[X(te,{label:"Bridge name",hint:"Displayed in the Home app"},{default:ee(()=>[X(ce,{modelValue:O.value.name,"onUpdate:modelValue":K[0]||(K[0]=J=>O.value.name=J),size:"sm",placeholder:"OpenBridge"},null,8,["modelValue"])]),_:1}),X(te,{label:"HTTP port",hint:"OpenBridge web UI & API",control:"fit"},{default:ee(()=>[X(ge,{modelValue:O.value.port,"onUpdate:modelValue":K[1]||(K[1]=J=>O.value.port=J),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),X(te,{label:"HAP port",hint:"HomeKit accessory protocol port",control:"fit"},{default:ee(()=>[X(ge,{modelValue:O.value.hapPort,"onUpdate:modelValue":K[2]||(K[2]=J=>O.value.hapPort=J),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),X(te,{label:"PIN code",hint:"Format: XXX-XX-XXX, used to pair with HomeKit"},{default:ee(()=>[b("div",mV,[X(ce,{modelValue:O.value.pincode,"onUpdate:modelValue":K[3]||(K[3]=J=>O.value.pincode=J),size:"sm",placeholder:"031-45-154"},null,8,["modelValue"]),X(pe,{variant:"ghost",size:"sm",icon:Fs,title:"Generate random PIN",onClick:W})])]),_:1}),X(te,{label:"Bridge MAC",hint:"Leave empty to auto-generate. Change this only if pairing with HomeKit fails."},{default:ee(()=>[X(ce,{modelValue:O.value.username,"onUpdate:modelValue":K[4]||(K[4]=J=>O.value.username=J),size:"sm",class:"mono",placeholder:"AA:BB:CC:DD:EE:FF"},null,8,["modelValue"])]),_:1}),X(te,{label:"Log level",control:"fit"},{default:ee(()=>[X(ve,{modelValue:O.value.logLevel,"onUpdate:modelValue":K[5]||(K[5]=J=>O.value.logLevel=J),size:"sm",options:c},null,8,["modelValue"])]),_:1})]),_:1}),d.value?(y(),fe(Me,{key:0,variant:"error"},{default:ee(()=>[le(U(d.value),1)]),_:1})):j("",!0),b("div",gV,[X(pe,{variant:"primary",size:"sm",loading:u.value,icon:h.value?_s:A0,onClick:T},{default:ee(()=>[le(U(h.value?"Saved!":"Save"),1)]),_:1},8,["loading","icon"]),X(pe,{variant:"secondary",size:"sm",outlined:"",loading:f.value,icon:f.value?Jo:Fs,onClick:H},{default:ee(()=>[le(U(f.value?"Restarting…":"Save & Restart OpenBridge"),1)]),_:1},8,["loading","icon"]),h.value&&!f.value?(y(),$("span",vV,[X(se,{name:oe(g0),size:12},null,8,["name"]),K[8]||(K[8]=le(" Restart the daemon for changes to take effect ",-1))])):j("",!0)])]),_:1}),X(ne,{class:"settings-card"},{default:ee(()=>{var J,_e;return[b("div",bV,[b("div",yV,[X(se,{name:oe(_u),size:18},null,8,["name"])]),K[9]||(K[9]=b("div",null,[b("h2",{class:"card-title"},"Updates"),b("p",{class:"card-subtitle"},"OpenBridge daemon and UI")],-1))]),b("div",wV,[b("div",SV,[X(re,{variant:"grey"},{default:ee(()=>{var Se;return[le("Current: v"+U(((Se=_.value)==null?void 0:Se.current)??"…"),1)]}),_:1}),_.value&&!p.value?(y(),$(be,{key:0},[_.value.updateAvailable?(y(),fe(re,{key:0,variant:"blue"},{default:ee(()=>[le("Available: v"+U(_.value.latest),1)]),_:1})):_.value.latest===null?(y(),fe(re,{key:1,variant:"orange"},{default:ee(()=>[...K[10]||(K[10]=[le("Unable to check",-1)])]),_:1})):(y(),fe(re,{key:2,variant:"green"},{default:ee(()=>[...K[11]||(K[11]=[le("Up to date",-1)])]),_:1}))],64)):j("",!0),p.value?(y(),fe(re,{key:1,variant:"grey"},{default:ee(()=>[...K[12]||(K[12]=[le("Checking…",-1)])]),_:1})):j("",!0)]),b("div",CV,[X(pe,{variant:"secondary",size:"sm",outlined:"",loading:p.value,icon:Fs,onClick:x},{default:ee(()=>[...K[13]||(K[13]=[le(" Check ",-1)])]),_:1},8,["loading"]),(J=_.value)!=null&&J.updateAvailable?(y(),fe(pe,{key:0,variant:"primary",size:"sm",loading:A.value,icon:A.value?Jo:Qh,onClick:P},{default:ee(()=>[le(U(A.value?"Updating…":"Install update"),1)]),_:1},8,["loading","icon"])):j("",!0)])]),A.value&&S.value?(y(),fe(D,{key:0,label:v.value,value:S.value==="downloading"&&m.value>0?m.value:void 0,max:100,status:"active",size:"sm"},null,8,["label","value"])):j("",!0),A.value&&!S.value?(y(),fe(Me,{key:1,variant:"helper"},{default:ee(()=>[...K[14]||(K[14]=[le(" Starting update... This page will reconnect automatically. ",-1)])]),_:1})):j("",!0),((_e=_.value)==null?void 0:_e.updateMethod)==="manual"&&_.value.updateAvailable?(y(),fe(Me,{key:2,variant:"helper"},{default:ee(()=>[_.value.pinnedTo?(y(),$(be,{key:0},[le(" This deployment is pinned to "+U(_.value.pinnedTo)+". To move version: ",1)],64)):(y(),$(be,{key:1},[le("Self-update is not available for this install. To update:")],64)),b("code",null,U(_.value.updateCommand),1)]),_:1})):j("",!0),g.value?(y(),$("div",AV,[X(Me,{variant:"error"},{default:ee(()=>[le(U(g.value),1)]),_:1}),X(pe,{variant:"ghost",size:"sm",onClick:I},{default:ee(()=>[...K[15]||(K[15]=[le("Rollback",-1)])]),_:1})])):j("",!0)]}),_:1}),X(ne,{class:"settings-card"},{default:ee(()=>[b("div",kV,[b("div",MV,[X(se,{name:oe(dV),size:18},null,8,["name"])]),K[16]||(K[16]=b("div",null,[b("h2",{class:"card-title"},"Appearance"),b("p",{class:"card-subtitle"},"Stored in this browser, applied as you pick it")],-1))]),X(Te,{dir:"col",gap:"sm",class:"field-grid"},{default:ee(()=>[X(te,{label:"Theme",hint:l.value,control:"fit"},{default:ee(()=>[X(Y,{modelValue:o.value,"onUpdate:modelValue":K[6]||(K[6]=J=>o.value=J),name:"theme",options:a,direction:"horizontal"},null,8,["modelValue"])]),_:1},8,["hint"])]),_:1})]),_:1}),X(ne,{class:"settings-card info-card"},{default:ee(()=>[b("h3",LV,[X(se,{name:oe(g0),size:14},null,8,["name"]),K[17]||(K[17]=le(" How to pair with HomeKit ",-1))]),K[18]||(K[18]=b("ol",{class:"info-list"},[b("li",null,[le(" Open the "),b("strong",null,"Home"),le(" app on your iPhone or iPad ")]),b("li",null,[le(" Tap "),b("strong",null,"+"),le(" → "),b("strong",null,"Add Accessory")]),b("li",null,[le(" Scan the QR code from the Dashboard, or tap "),b("strong",null,"More options"),le(" and enter the PIN code manually ")]),b("li",null,"If you change the PIN or username, unpair first from the Home app, then re-pair")],-1))]),_:1})])}}}),xV=Zt(EV,[["__scopeId","data-v-af630535"]]);/**
68
68
  * Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
69
69
  * @license MIT
70
70
  *