@nubisco/openbridge 0.38.4 → 0.38.6

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,9 +64,9 @@ 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
- `},J6=xH(PH)(Pg),OH={config:NH},IH=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 Og(e,t){return Object.keys(t).forEach(function(i){t[i]instanceof Object&&e[i]&&Object.assign(t[i],Og(e[i],t[i]))}),G6(G6({},e),t)}var RH={type:"cancelation",msg:"operation is manually canceled"};function _1(e){var t=!1,i=new Promise(function(r,s){e.then(function(n){return t?s(RH):r(n)}),e.catch(s)});return i.cancel=function(){return t=!0},i}var DH=["monaco"],VH=EH.create({config:$H,isInitialized:!1,resolve:null,reject:null,monaco:null}),Ig=uH(VH,2),kl=Ig[0],xc=Ig[1];function BH(e){var t=OH.config(e),i=t.monaco,r=lH(t,DH);xc(function(s){return{config:Og(s.config,r),monaco:i}})}function ZH(){var e=kl(function(t){var i=t.monaco,r=t.isInitialized,s=t.resolve;return{monaco:i,isInitialized:r,resolve:s}});if(!e.isInitialized){if(xc({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),_1(m1);if(window.monaco&&window.monaco.editor)return Rg(window.monaco),e.resolve(window.monaco),_1(m1);IH(FH,UH)(WH)}return _1(m1)}function FH(e){return document.body.appendChild(e)}function zH(e){var t=document.createElement("script");return e&&(t.src=e),t}function UH(e){var t=kl(function(r){var s=r.config,n=r.reject;return{config:s,reject:n}}),i=zH("".concat(t.config.paths.vs,"/loader.js"));return i.onload=function(){return e()},i.onerror=t.reject,i}function WH(){var e=kl(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;Rg(r),e.resolve(r)},function(i){e.reject(i)})}function Rg(e){kl().monaco||xc({monaco:e})}function jH(){return kl(function(e){var t=e.monaco;return t})}var m1=new Promise(function(e,t){return xc({resolve:e,reject:t})}),Dg={config:BH,init:ZH,__getMonacoInstance:jH};const KH={key:0,class:"monaco-skeleton"},qH=Re({__name:"MonacoJsonEditor",props:{modelValue:{},height:{}},emits:["update:modelValue"],setup(e,{emit:t}){const i=e,r=t,{resolved:s}=vd(),n=X(null),a=Cr(null),o=X(!1);let l=!1;return ut(async()=>{const c=await Dg.init();n.value&&(Ue(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)}),Ki(()=>{var c;(c=a.value)==null||c.dispose()}),Ue(()=>i.modelValue,c=>{if(!a.value)return;a.value.getValue()!==c&&(l=!0,a.value.setValue(c),l=!1)}),(c,u)=>(g(),E("div",{style:Si({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?F("",!0):(g(),E("div",KH))],4))}}),Q6=jt(qH,[["__scopeId","data-v-0c34d464"]]),GH={class:"pcf-root"},YH={key:1,class:"pcf-no-schema"},XH=Re({__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 m=f;for(let _=0;_<h.length-1;_++)(m[h[_]]===void 0||typeof m[h[_]]!="object")&&(m[h[_]]={}),m=m[h[_]];m[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)??[],m=d.default??(a(d)==="string"?"":a(d)==="number"?0:"");s(h,[...f,m])}function l(h,d){const f=[...n(h)??[]];f.splice(d,1),s(h,f)}function c(h,d,f){const m=[...n(h)??[]];m[d]=f,s(h,m)}const u=Y(()=>i.hbSchema.schema??{type:"object",properties:{}});return(h,d)=>{const f=jo("PluginConfigField");return g(),E("div",GH,[u.value.properties?(g(!0),E(we,{key:0},Ze(u.value.properties,(m,_)=>{var y;return g(),he(f,{key:_,"field-key":String(_),field:m,path:[String(_)],required:((y=u.value.required)==null?void 0:y.includes(String(_)))??!1,value:n([String(_)]),onChange:p=>s([String(_)],p),onAddArray:d[0]||(d[0]=(p,C)=>o(p,C)),onRemoveArray:d[1]||(d[1]=(p,C)=>l(p,C)),onUpdateArray:d[2]||(d[2]=(p,C,S)=>c(p,C,S))},null,8,["field-key","field","path","required","value","onChange"])}),128)):(g(),E("div",YH,"No configurable fields found in schema."))])}}}),JH=jt(XH,[["__scopeId","data-v-d9cf6b0f"]]),QH={key:0,class:"inspector nb-inspector"},eP={class:"inspector-header"},tP={class:"inspector-title"},iP={class:"inspector-name"},rP={class:"inspector-version"},sP={class:"inspector-body"},nP={class:"field-value"},aP={class:"field-value"},oP={class:"hap-bridge-info"},lP={class:"hap-qr"},cP=["src"],uP={class:"hap-details"},hP={class:"field-value mono"},dP={class:"field-value"},fP={class:"field-value"},pP={key:0,class:"setup-loading"},_P={key:0,class:"platform-tabs"},mP=["onClick"],gP={key:1,class:"visual-editor-wrap"},vP={key:0,class:"json-error"},bP={key:1,class:"json-error"},yP={key:3,class:"save-error"},wP={class:"setup-actions"},SP={key:0,class:"json-error"},CP={key:0,class:"save-error"},kP={class:"setup-actions"},AP={class:"import-export-row"},MP={class:"plugin-device-name"},LP={class:"plugin-device-type"},EP={class:"field-value"},$P={class:"field-value"},xP={class:"field-value"},TP={class:"field-value"},NP={class:"error-text"},HP={class:"plog-time"},PP={class:"plog-msg"},e8="openbridge.pluginInspector.sections",OP=Re({__name:"PluginInspector",setup(e){const t=Ls(),i=X(!1),r=X("");async function s(){if(!i.value){i.value=!0;try{await Ie.daemon.restart();let M=0;const R=setInterval(async()=>{M++;try{await Ie.health(),clearInterval(R),location.reload()}catch{}M>60&&(clearInterval(R),i.value=!1)},1e3)}catch{i.value=!1}}}const n=Sl(),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=X({...o});try{const M=JSON.parse(localStorage.getItem(e8)??"{}");l.value={...o,...M}}catch{}Ue(l,M=>localStorage.setItem(e8,JSON.stringify(M)),{deep:!0}),Ue(()=>{var M,R;return(R=(M=n.selectedPlugin)==null?void 0:M.hapBridge)==null?void 0:R.setupURI},async M=>{if(M)try{r.value=await va.toDataURL(M,{width:160,margin:1})}catch{r.value=""}else r.value=""},{immediate:!0});const c=Y(()=>{const M=n.selectedPlugin;return M!=null&&M.devices?Object.values(M.devices):[]}),u={switch:"plugs",light:"lamp",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"};function h(M){return u[M]??"cube"}const d={idle:"Idle",loading:"Loading",running:"Running",stopped:"Stopped",error:"Error"},f=X(!1);async function m(){if(!(!n.selectedPlugin||f.value)){f.value=!0;try{await Ie.marketplace.update(n.selectedPlugin.manifest.name),await t.fetchPlugins(),await s()}catch(M){console.error("Failed to update plugin:",M)}finally{f.value=!1}}}const _=X(!1),y=X(!1);async function p(){if(!(!n.selectedPlugin||y.value)){y.value=!0;try{await Ie.marketplace.uninstall(n.selectedPlugin.manifest.name),await t.fetchPlugins(),n.close(),await Ie.daemon.restart()}catch(M){console.error("Failed to remove plugin:",M)}finally{y.value=!1,_.value=!1}}}const C=X(!1);async function S(){if(!n.selectedPlugin||C.value)return;const M=!n.selectedPlugin.disabled;C.value=!0;try{const R=await Ie.setPluginDisabled(n.selectedPlugin.id,M);n.selectedPlugin.disabled=R.disabled}catch(R){console.error("Failed to toggle plugin disabled state:",R)}finally{C.value=!1}}const v=X(null),k=X(!1),$=X(""),L=X(""),V=X(!1),P=X(null),D=X(!1),x=X(null),H=X({}),O=X("visual"),U=Y(()=>{var M;return((M=x.value)==null?void 0:M.schema)!=null}),j=Y(()=>{var M;return((M=n.selectedPlugin)==null?void 0:M.source)==="homebridge"}),re=Y(()=>n.selectedPlugin!=null&&n.selectedPlugin.source!=="homebridge"),Q=X(""),ie=X(!1),G=X(null),de=X(!1),pe=Y(()=>{try{return JSON.parse(Q.value),!0}catch{return!1}});Ue(()=>n.selectedPlugin,async M=>{if(Q.value="",G.value=null,de.value=!1,!(!M||M.source==="homebridge"))try{const R=await Ie.config.getPlugin(M.manifest.name);Q.value=JSON.stringify(R.config??{},null,2)}catch{Q.value="{}"}});const _e=X(null);function Ne(){var M;(M=_e.value)==null||M.click()}function Le(){if(!n.selectedPlugin)return;const M=n.selectedPlugin.manifest.name,R=j.value?L.value:Q.value;if(!R)return;const z=new Blob([R],{type:"application/json"}),W=URL.createObjectURL(z),se=document.createElement("a");se.href=W,se.download=`${M.replace(/[^a-z0-9-]/gi,"-")}-config.json`,se.click(),URL.revokeObjectURL(W)}async function ye(M){var z;const R=(z=M.target.files)==null?void 0:z[0];if(!(!R||!n.selectedPlugin))try{const W=await R.text(),se=JSON.parse(W);let Se;if(se.platform&&typeof se.platform=="string"){const{plugin:xe,...De}=se;Se=De}else Se=se;await Ie.config.savePlugin(n.selectedPlugin.manifest.name,Se),j.value?L.value=JSON.stringify(Se,null,2):Q.value=JSON.stringify(Se,null,2),_e.value&&(_e.value.value="")}catch(W){console.error("Import failed:",W)}}async function ge(){if(ie.value||!n.selectedPlugin)return;let M;try{M=JSON.parse(Q.value)}catch{G.value="Invalid JSON: fix the syntax first";return}ie.value=!0,G.value=null,de.value=!1;try{await Ie.config.savePlugin(n.selectedPlugin.manifest.name,M),de.value=!0,setTimeout(()=>{de.value=!1},3e3)}catch(R){G.value=String(R)}finally{ie.value=!1}}const I=Y(()=>{const M=n.selectedPlugin;return!M||M.source!=="homebridge"?"":M.platformName??M.id??M.manifest.name});Ue(()=>n.selectedPlugin,async M=>{if(v.value=null,$.value="",L.value="",x.value=null,H.value={},P.value=null,D.value=!1,!(!M||M.source!=="homebridge")){k.value=!0;try{const R=await Ie.config.getHbPlugin(I.value,M.packageName);if(R.config){$.value=I.value,L.value=JSON.stringify(R.config,null,2),H.value=R.config,await ee(M.manifest.name);return}const z=await Ie.pluginInfo(M.packageName??M.manifest.name);v.value=z,z.platforms.length>0&&await ne(z.platforms[0],z.mainFile),await ee(M.manifest.name)}catch{try{const R=await Ie.config.getHbPlugin(I.value,M.packageName);R.config&&($.value=I.value,L.value=JSON.stringify(R.config,null,2),H.value=R.config)}catch{}}finally{k.value=!1}}});async function ee(M){try{const R=await fetch(`/api/marketplace/plugin-schema/${encodeURIComponent(M)}`);if(R.ok){const z=await R.json();x.value=z.schema}}catch{}}async function ne(M,R){var z,W;$.value=M;try{const se=await Ie.config.getPlatform(M),Se=se.config?se.config:{platform:M,plugin:R??((z=v.value)==null?void 0:z.mainFile)??""};L.value=JSON.stringify(Se,null,2),H.value=Se}catch{const se={platform:M,plugin:R??((W=v.value)==null?void 0:W.mainFile)??""};L.value=JSON.stringify(se,null,2),H.value=se}}function ve(M){H.value=M,L.value=JSON.stringify(M,null,2)}function ke(M){L.value=M;try{H.value=JSON.parse(M)}catch{}}function N(){try{return JSON.parse(L.value)}catch{return null}}const T=Y(()=>N()!==null),K=Y(()=>{const M=N();return M!==null&&typeof M.platform!="string"}),J=X([]),le=X(null);let ue=null;function w(){if(ue&&(ue.close(),ue=null),!n.selectedPlugin)return;const M=location.protocol==="https:"?"wss:":"ws:";ue=new WebSocket(`${M}//${location.host}/ws/logs`),ue.onmessage=R=>{var z,W;try{const se=JSON.parse(R.data);(se.plugin===((z=n.selectedPlugin)==null?void 0:z.id)||se.plugin===((W=n.selectedPlugin)==null?void 0:W.manifest.name))&&(J.value=[...J.value.slice(-199),se],setTimeout(()=>{le.value&&(le.value.scrollTop=le.value.scrollHeight)},10))}catch{}},ue.onclose=()=>{n.selectedPlugin&&setTimeout(w,3e3)}}Ue(()=>n.selectedPlugin,async M=>{if(J.value=[],ue==null||ue.close(),ue=null,!!M){try{const R=await Ie.logs(M.manifest.name,100);J.value=R.entries,setTimeout(()=>{le.value&&(le.value.scrollTop=le.value.scrollHeight)},20)}catch{}w()}}),ut(()=>{n.selectedPlugin&&w()}),Ki(()=>{ue==null||ue.close()});const A={debug:"var(--nb-c-text-muted)",info:"var(--nb-c-info)",warn:"var(--nb-c-warning)",error:"var(--nb-c-danger)"};async function B(){if(V.value||!n.selectedPlugin)return;const M=N();if(!M){P.value="Invalid JSON: fix the syntax first";return}V.value=!0,P.value=null,D.value=!1;try{const R=n.selectedPlugin;R.source==="homebridge"?await Ie.config.saveHbPlugin(I.value,M,R.packageName):await Ie.config.savePlugin(R.manifest.name,M),D.value=!0,setTimeout(()=>{D.value=!1},3e3)}catch(R){P.value=String(R)}finally{V.value=!1}}return(M,R)=>{const z=Ye,W=md,se=bc,Se=gd,xe=ai,De=mc,Xe=w$;return oe(n).selectedPlugin?(g(),E("div",QH,[b("div",eP,[b("div",{class:Te(["inspector-avatar",oe(n).selectedPlugin.status])},[q(z,{name:oe(en),size:24},null,8,["name"])],2),b("div",tP,[b("h2",iP,Z(oe(n).selectedPlugin.manifest.name),1),b("span",rP,"v"+Z(oe(n).selectedPlugin.manifest.version),1)])]),b("div",sP,[q(Se,{size:l.value.status,"onUpdate:size":R[0]||(R[0]=$e=>l.value.status=$e),title:"Status",fluid:""},{default:te(()=>[q(W,{label:"Status",control:"fit"},{default:te(()=>[b("span",{class:Te(["status-badge",oe(n).selectedPlugin.status])},Z(d[oe(n).selectedPlugin.status]),3)]),_:1}),oe(n).selectedPlugin.startedAt?(g(),he(W,{key:0,label:"Started",control:"fit"},{default:te(()=>[b("span",nP,Z(new Date(oe(n).selectedPlugin.startedAt).toLocaleString()),1)]),_:1})):F("",!0),oe(n).selectedPlugin.stoppedAt?(g(),he(W,{key:1,label:"Stopped",control:"fit"},{default:te(()=>[b("span",aP,Z(new Date(oe(n).selectedPlugin.stoppedAt).toLocaleString()),1)]),_:1})):F("",!0),q(W,{label:"Disabled",control:"fit"},{default:te(()=>[q(se,{name:`plugin-disabled-${oe(n).selectedPlugin.id}`,"model-value":oe(n).selectedPlugin.disabled??!1,disabled:C.value,"onUpdate:modelValue":S},null,8,["name","model-value","disabled"])]),_:1})]),_:1},8,["size"]),oe(n).selectedPlugin.hapBridge?(g(),he(Se,{key:0,size:l.value.hap,"onUpdate:size":R[1]||(R[1]=$e=>l.value.hap=$e),title:"HomeKit pairing",fluid:""},{default:te(()=>[b("div",oP,[b("div",lP,[r.value?(g(),E("img",{key:0,src:r.value,alt:"HomeKit QR Code",class:"hap-qr-img"},null,8,cP)):F("",!0)]),b("div",uP,[q(W,{label:"PIN",control:"fit"},{default:te(()=>[b("span",hP,Z(oe(n).selectedPlugin.hapBridge.pincode),1)]),_:1}),q(W,{label:"Port",control:"fit"},{default:te(()=>[b("span",dP,Z(oe(n).selectedPlugin.hapBridge.port),1)]),_:1}),q(W,{label:"Bridge",control:"fit"},{default:te(()=>[b("span",fP,Z(oe(n).selectedPlugin.hapBridge.name),1)]),_:1})])]),R[15]||(R[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"])):F("",!0),oe(n).selectedPlugin.availableUpdate?(g(),he(Se,{key:1,size:l.value.update,"onUpdate:size":R[2]||(R[2]=$e=>l.value.update=$e),title:"Update",fluid:""},{default:te(()=>[q(De,{status:"info",icon:wd,title:`Version ${oe(n).selectedPlugin.availableUpdate} is available`},{action:te(()=>[q(xe,{variant:"primary",size:"sm",loading:f.value,disabled:f.value,onClick:m},{default:te(()=>[ce(Z(f.value?"Updating...":"Update"),1)]),_:1},8,["loading","disabled"])]),default:te(()=>[ce(" Currently on "+Z(oe(n).selectedPlugin.manifest.version)+". ",1)]),_:1},8,["title"])]),_:1},8,["size"])):F("",!0),q(Se,{size:l.value.manage,"onUpdate:size":R[5]||(R[5]=$e=>l.value.manage=$e),title:"Manage",fluid:""},{default:te(()=>[_.value?(g(),he(De,{key:1,status:"error",title:"This uninstalls the plugin and removes its configuration"},{action:te(()=>[q(xe,{variant:"ghost",size:"sm",onClick:R[4]||(R[4]=$e=>_.value=!1)},{default:te(()=>[...R[17]||(R[17]=[ce("Cancel",-1)])]),_:1}),q(xe,{variant:"primary",size:"sm",loading:y.value,style:{background:"var(--nb-c-danger)","border-color":"var(--nb-c-danger)"},onClick:p},{default:te(()=>[...R[18]||(R[18]=[ce(" Remove ",-1)])]),_:1},8,["loading"])]),default:te(()=>[R[19]||(R[19]=ce(" OpenBridge needs a restart afterwards. ",-1))]),_:1})):(g(),he(xe,{key:0,variant:"ghost",size:"sm",icon:Sd,style:{color:"var(--nb-c-danger)"},onClick:R[3]||(R[3]=$e=>_.value=!0)},{default:te(()=>[...R[16]||(R[16]=[ce(" Remove plugin ",-1)])]),_:1}))]),_:1},8,["size"]),j.value?(g(),he(Se,{key:2,size:l.value.config,"onUpdate:size":R[7]||(R[7]=$e=>l.value.config=$e),title:"Platform config",fluid:""},{default:te(()=>[k.value?(g(),E("div",pP,[q(z,{name:oe(Dn),size:14},null,8,["name"]),R[20]||(R[20]=ce(" Loading config… ",-1))])):(g(),E(we,{key:1},[v.value&&v.value.platforms.length>1?(g(),E("div",_P,[(g(!0),E(we,null,Ze(v.value.platforms,$e=>(g(),E("button",{key:$e,class:Te(["platform-tab",{active:$.value===$e}]),onClick:Nt=>ne($e)},Z($e),11,mP))),128))])):v.value&&v.value.platforms.length===0?(g(),he(De,{key:1,status:"warning",variant:"callout",title:"No platform detected"},{default:te(()=>[...R[21]||(R[21]=[ce(" Add a ",-1),b("code",null,"platforms[]",-1),ce(" entry manually in Config. ",-1)])]),_:1})):F("",!0),!v.value||v.value.platforms.length>0?(g(),E(we,{key:2},[U.value?(g(),he(Xe,{key:0,"model-value":O.value,items:a,variant:"contained",size:"sm","onUpdate:modelValue":R[6]||(R[6]=$e=>O.value=$e)},null,8,["model-value"])):F("",!0),O.value==="visual"&&U.value?(g(),E("div",gP,[q(JH,{"hb-schema":x.value,"model-value":H.value,"onUpdate:modelValue":ve},null,8,["hb-schema","model-value"])])):F("",!0),O.value==="json"||!U.value?(g(),E("div",{key:2,class:Te(["config-editor-wrap",{invalid:L.value&&!T.value}])},[q(Q6,{"model-value":L.value,height:220,"onUpdate:modelValue":ke},null,8,["model-value"]),L.value&&!T.value?(g(),E("div",vP,"Invalid JSON")):K.value?(g(),E("div",bP,'Missing "platform" field')):F("",!0)],2)):F("",!0),P.value?(g(),E("div",yP,[q(z,{name:oe(pr),size:13},null,8,["name"]),ce(" "+Z(P.value),1)])):F("",!0),b("div",wP,[q(xe,{variant:"primary",size:"sm",loading:V.value,disabled:V.value||!T.value||K.value,icon:D.value?bs:B0,onClick:B},{default:te(()=>[ce(Z(D.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),D.value?(g(),he(xe,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?ll:Xs,onClick:s},{default:te(()=>[ce(Z(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):F("",!0)])],64)):F("",!0)],64))]),_:1},8,["size"])):F("",!0),re.value?(g(),he(Se,{key:3,size:l.value.config,"onUpdate:size":R[9]||(R[9]=$e=>l.value.config=$e),title:"Plugin config",fluid:""},{default:te(()=>[b("div",{class:Te(["config-editor-wrap",{invalid:Q.value&&!pe.value}])},[q(Q6,{"model-value":Q.value,height:220,"onUpdate:modelValue":R[8]||(R[8]=$e=>Q.value=$e)},null,8,["model-value"]),Q.value&&!pe.value?(g(),E("div",SP,"Invalid JSON")):F("",!0)],2),G.value?(g(),E("div",CP,[q(z,{name:oe(pr),size:13},null,8,["name"]),ce(" "+Z(G.value),1)])):F("",!0),b("div",kP,[q(xe,{variant:"primary",size:"sm",loading:ie.value,disabled:ie.value||!pe.value,icon:de.value?bs:B0,onClick:ge},{default:te(()=>[ce(Z(de.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),de.value?(g(),he(xe,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?ll:Xs,onClick:s},{default:te(()=>[ce(Z(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):F("",!0)])]),_:1},8,["size"])):F("",!0),q(Se,{size:l.value.transfer,"onUpdate:size":R[10]||(R[10]=$e=>l.value.transfer=$e),title:"Import & export",fluid:""},{default:te(()=>[b("div",AP,[q(xe,{variant:"ghost",size:"sm",icon:cN,onClick:Le},{default:te(()=>[...R[22]||(R[22]=[ce("Export config",-1)])]),_:1}),q(xe,{variant:"ghost",size:"sm",icon:mN,onClick:Ne},{default:te(()=>[...R[23]||(R[23]=[ce("Import config",-1)])]),_:1}),b("input",{ref_key:"importInput",ref:_e,type:"file",accept:".json",style:{display:"none"},onChange:ye},null,544)])]),_:1},8,["size"]),c.value.length>0?(g(),he(Se,{key:4,size:l.value.devices,"onUpdate:size":R[11]||(R[11]=$e=>l.value.devices=$e),title:`Devices (${c.value.length})`,fluid:""},{default:te(()=>[(g(!0),E(we,null,Ze(c.value,$e=>(g(),E("div",{key:$e.id,class:"plugin-device-row"},[q(z,{name:h($e.widgetType),size:14},null,8,["name"]),b("span",MP,Z($e.name),1),b("span",LP,Z($e.widgetType),1)]))),128))]),_:1},8,["size","title"])):F("",!0),q(Se,{size:l.value.manifest,"onUpdate:size":R[12]||(R[12]=$e=>l.value.manifest=$e),title:"Manifest",fluid:""},{default:te(()=>[q(W,{label:"Name",control:"fit"},{default:te(()=>[b("span",EP,Z(oe(n).selectedPlugin.manifest.name),1)]),_:1}),q(W,{label:"Version",control:"fit"},{default:te(()=>[b("span",$P,Z(oe(n).selectedPlugin.manifest.version),1)]),_:1}),oe(n).selectedPlugin.manifest.description?(g(),he(W,{key:0,label:"Description",control:"fit"},{default:te(()=>[b("span",xP,Z(oe(n).selectedPlugin.manifest.description),1)]),_:1})):F("",!0),oe(n).selectedPlugin.manifest.author?(g(),he(W,{key:1,label:"Author",control:"fit"},{default:te(()=>[b("span",TP,Z(oe(n).selectedPlugin.manifest.author),1)]),_:1})):F("",!0)]),_:1},8,["size"]),oe(n).selectedPlugin.error?(g(),he(Se,{key:5,size:l.value.error,"onUpdate:size":R[13]||(R[13]=$e=>l.value.error=$e),title:"Error",fluid:""},{default:te(()=>[q(De,{status:"error"},{default:te(()=>[b("code",NP,Z(oe(n).selectedPlugin.error),1)]),_:1})]),_:1},8,["size"])):F("",!0),J.value.length>0?(g(),he(Se,{key:6,size:l.value.logs,"onUpdate:size":R[14]||(R[14]=$e=>l.value.logs=$e),title:"Recent logs",fluid:""},{default:te(()=>[b("div",{ref_key:"logsEl",ref:le,class:"plugin-log-terminal"},[(g(!0),E(we,null,Ze(J.value,($e,Nt)=>(g(),E("div",{key:Nt,class:"plugin-log-line"},[b("span",HP,Z(new Date($e.timestamp).toLocaleTimeString()),1),b("span",{class:"plog-level",style:Si({color:A[$e.level]})},Z($e.level.toUpperCase()),5),b("span",PP,Z($e.message),1)]))),128))],512)]),_:1},8,["size"])):F("",!0)])])):F("",!0)}}}),IP=jt(OP,[["__scopeId","data-v-b8eb965d"]]),RP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},t8=RP("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"/>'),DP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},yn=DP("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"/>'),VP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},BP=VP("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"/>'),ZP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},FP=ZP("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"/>'),zP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},UP=zP("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"/>'),WP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},Vg=WP("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"/>'),jP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},Bg=jP("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"/>');let KP=0;function qP(){return`notif-${Date.now()}-${++KP}`}function Zg(){const e=ng();function t(i,r,s){e.add({id:qP(),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 GP={class:"mp-panel"},YP={class:"mp-header"},XP={class:"mp-search-wrap"},JP={key:0,class:"mp-count"},QP={key:3,class:"mp-local-section"},eO={class:"mp-local-heading"},tO={class:"mp-avatar mp-avatar--ob"},iO={class:"mp-info"},rO={class:"mp-name-row"},sO={class:"mp-name"},nO={class:"badge badge--native"},aO={class:"badge badge--local"},oO={class:"mp-ver"},lO={key:0,class:"mp-desc"},cO={class:"mp-meta"},uO={key:0},hO={class:"mp-action"},dO={class:"mp-list"},fO={key:0,class:"mp-loading"},pO=["src","alt"],_O={class:"mp-info"},mO={class:"mp-name-row"},gO={class:"mp-name"},vO={class:"mp-ver"},bO={key:0,class:"mp-desc"},yO={class:"mp-meta"},wO={key:0},SO={key:1,class:"mp-sep"},CO={class:"mp-enriched"},kO={key:0,class:"mp-stat"},AO={key:1,class:"mp-stat"},MO=["href"],LO=["href"],EO=["href"],$O={class:"mp-action"},xO={key:1,class:"mp-load-more-wrap"},TO="https://marketplace.openbridge.nubisco.io",NO=20,HO="https://marketplace.openbridge.nubisco.io/api",PO=Re({__name:"MarketplacePanel",setup(e){const t=Ls(),i=Zg(),r=X(null),s=X(""),n=X([]),a=X(0),o=X(!1),l=X(null),c=X(null),u=X(new Map),h=X(null),d=X(0),f=X([]);function m(x){return{name:x.name,version:x.version,description:x.description??"",author:x.author?{name:x.author}:void 0,date:x.last_published_at,weeklyDownloads:x.weekly_downloads,githubStars:x.github_stars??void 0,githubSponsorsUrl:x.github_sponsors_url??void 0,documentationUrl:x.homepage??void 0,links:{npm:x.npm_url,homepage:x.homepage??void 0,repository:x.repository_url??void 0}}}function _(x){return x?x>=1e6?`${(x/1e6).toFixed(1)}M`:x>=1e3?`${(x/1e3).toFixed(1)}K`:x.toString():"0"}async function y(x=!0){x&&(d.value=0,n.value=[]),o.value=!0,l.value=null;try{const H=d.value+1,O=new URLSearchParams({q:s.value,page:String(H),limit:String(NO)}),U=await fetch(`${HO}/plugins?${O}`);if(!U.ok)throw new Error(`Marketplace API error: ${U.status}`);const j=await U.json(),re=j.plugins.map(m);n.value=x?re:[...n.value,...re],a.value=j.total}catch(H){l.value=String(H)}finally{o.value=!1}}async function p(x){if(!c.value){c.value=x.name,l.value=null;try{const H=await Ie.marketplace.install(x.name);u.value.set(x.name,H.mainFile),h.value={name:x.name,mainFile:H.mainFile},await Ie.pluginsRefresh(),await t.fetchPlugins(),i.success(`Installed ${x.name}`)}catch(H){l.value=`Failed to install ${x.name}: ${H}`,i.error(`Failed to install ${x.name}`)}finally{c.value=null}}}async function C(x){if(!r.value){r.value=x,l.value=null;try{await Ie.marketplace.uninstall(x),u.value.delete(x),await t.fetchPlugins(),i.success(`Removed ${x}`)}catch(H){l.value=`Failed to uninstall ${x}: ${H}`,i.error(`Failed to remove ${x}`)}finally{r.value=null}}}async function S(x){if(!(c.value||!x.platform)){c.value=x.name,l.value=null;try{await Ie.config.savePlugin(x.name,{platform:x.platform}),u.value.set(x.name,`${x.path}/dist/index.js`),h.value={name:x.name,mainFile:`${x.path}/dist/index.js`},await t.fetchPlugins(),i.success(`Activated ${x.name}`)}catch(H){l.value=`Failed to activate ${x.name}: ${H}`,i.error(`Failed to activate ${x.name}`)}finally{c.value=null}}}function v(x){var U,j;const O=(((U=x.links)==null?void 0:U.repository)??((j=x.links)==null?void 0:j.homepage)??"").match(/github\.com\/([^/]+)/);return O?`https://github.com/${O[1]}.png?size=48`:null}function k(x){return x.name.includes("openbridge-")||Array.isArray(x.badges)&&x.badges.includes("openbridge-plugin")}function $(x){return x.author?typeof x.author=="string"?x.author:x.author.name??"":""}function L(x){const H=Math.floor((Date.now()-new Date(x).getTime())/864e5);return H===0?"today":H<30?`${H}d ago`:H<365?`${Math.floor(H/30)}mo ago`:`${Math.floor(H/365)}y ago`}function V(){d.value++,y(!1)}let P=null;function D(){P&&clearTimeout(P),P=setTimeout(()=>y(),350)}return ut(async()=>{try{const x=await Ie.marketplace.installed();for(const H of x.packages)u.value.set(H.name,H.mainFile)}catch{}try{const x=await Ie.marketplace.local();f.value=x.plugins}catch{}y()}),(x,H)=>{const O=Ye,U=la,j=mc,re=ot,Q=ai,ie=yl;return g(),E("div",GP,[b("div",YP,[H[4]||(H[4]=b("span",{class:"mp-title"},"Browse Plugins",-1)),b("a",{class:"mp-external",href:TO,target:"_blank",rel:"noopener noreferrer",title:"Open the full marketplace in a new tab"},[q(O,{name:oe(t8),size:12},null,8,["name"]),H[3]||(H[3]=ce(" Marketplace ",-1))])]),b("div",XP,[q(U,{modelValue:s.value,"onUpdate:modelValue":[H[0]||(H[0]=G=>s.value=G),D],placeholder:"Search plugins",size:"sm"},null,8,["modelValue"])]),a.value>0?(g(),E("div",JP,Z(a.value.toLocaleString())+" plugins found",1)):F("",!0),h.value?(g(),he(j,{key:1,status:"success",dismissible:"",class:"mp-installed-banner",title:`${h.value.name} installed`,onDismiss:H[1]||(H[1]=G=>h.value=null)},{default:te(()=>[...H[5]||(H[5]=[ce(" Click it in your plugins list to configure it. ",-1)])]),_:1},8,["title"])):F("",!0),l.value?(g(),he(re,{key:2,variant:"error"},{default:te(()=>[ce(Z(l.value),1)]),_:1})):F("",!0),f.value.length>0?(g(),E("div",QP,[b("div",eO,[q(O,{name:oe(yn),size:11},null,8,["name"]),H[6]||(H[6]=ce(" Local plugins ",-1))]),(g(!0),E(we,null,Ze(f.value,G=>(g(),he(ie,{key:G.name,class:"mp-row mp-row--ob mp-row--local"},{default:te(()=>[b("div",tO,[q(O,{name:oe(yn),size:16},null,8,["name"])]),b("div",iO,[b("div",rO,[b("span",sO,Z(G.name),1),b("span",nO,[q(O,{name:oe(yn),size:9},null,8,["name"]),H[7]||(H[7]=ce(" Native ",-1))]),b("span",aO,[q(O,{name:oe(BP),size:9},null,8,["name"]),H[8]||(H[8]=ce(" Local ",-1))]),b("span",oO,"v"+Z(G.version),1)]),G.description?(g(),E("p",lO,Z(G.description),1)):F("",!0),b("div",cO,[G.author?(g(),E("span",uO,Z(G.author),1)):F("",!0)])]),b("div",hO,[u.value.has(G.name)?(g(),he(Q,{key:0,variant:"ghost",size:"sm",disabled:"",icon:bs},{default:te(()=>[...H[9]||(H[9]=[ce("Active",-1)])]),_:1})):(g(),he(Q,{key:1,variant:"primary",size:"sm",loading:c.value===G.name,disabled:!!c.value||!G.platform,title:G.platform?"":"No platform declared in package.json openbridge.platform",onClick:de=>S(G)},{default:te(()=>[...H[10]||(H[10]=[ce(" Activate ",-1)])]),_:1},8,["loading","disabled","title","onClick"]))])]),_:2},1024))),128))])):F("",!0),b("div",dO,[o.value&&n.value.length===0?(g(),E("div",fO,[q(O,{name:oe(Dn),size:22},null,8,["name"]),H[11]||(H[11]=b("span",null,"Searching npm…",-1))])):F("",!0),(g(!0),E(we,null,Ze(n.value,G=>(g(),he(ie,{key:G.name,class:Te(["mp-row",{"mp-row--ob":k(G)}])},{default:te(()=>[b("div",{class:Te(["mp-avatar",{"mp-avatar--ob":k(G)}])},[v(G)?(g(),E("img",{key:0,src:v(G),alt:G.name,class:"mp-avatar-img",onError:H[2]||(H[2]=de=>de.target.style.display="none")},null,40,pO)):F("",!0),k(G)?(g(),he(O,{key:1,name:oe(yn),size:16},null,8,["name"])):(g(),he(O,{key:2,name:oe(en),size:16},null,8,["name"]))],2),b("div",_O,[b("div",mO,[b("span",gO,Z(G.name),1),b("span",vO,"v"+Z(G.version),1)]),G.description?(g(),E("p",bO,Z(G.description),1)):F("",!0),b("div",yO,[$(G)?(g(),E("span",wO,Z($(G)),1)):F("",!0),$(G)?(g(),E("span",SO,"·")):F("",!0),b("span",null,Z(L(G.date)),1)]),b("div",CO,[G.weeklyDownloads?(g(),E("span",kO,[q(O,{name:oe(FP),size:11},null,8,["name"]),ce(" "+Z(_(G.weeklyDownloads)),1)])):F("",!0),G.githubStars?(g(),E("span",AO,[q(O,{name:oe(UP),weight:"fill",size:11},null,8,["name"]),ce(" "+Z(_(G.githubStars)),1)])):F("",!0),G.githubSponsorsUrl?(g(),E("a",{key:2,href:G.githubSponsorsUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[q(O,{name:oe(Vg),weight:"fill",size:11},null,8,["name"]),H[12]||(H[12]=ce(" Sponsor ",-1))],8,MO)):F("",!0),G.documentationUrl?(g(),E("a",{key:3,href:G.documentationUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[q(O,{name:oe(Bg),size:11},null,8,["name"]),H[13]||(H[13]=ce(" Docs ",-1))],8,LO)):F("",!0),b("a",{href:`https://marketplace.openbridge.nubisco.io/plugins/${G.name}`,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link mp-stat--marketplace"},[q(O,{name:oe(t8),size:11},null,8,["name"]),H[14]||(H[14]=ce(" Marketplace ",-1))],8,EO)])]),b("div",$O,[u.value.has(G.name)?(g(),he(Q,{key:0,variant:"danger",size:"sm",outlined:"",loading:r.value===G.name,disabled:!!r.value,onClick:de=>C(G.name)},{default:te(()=>[...H[15]||(H[15]=[ce(" Remove ",-1)])]),_:1},8,["loading","disabled","onClick"])):(g(),he(Q,{key:1,variant:"primary",size:"sm",loading:c.value===G.name,disabled:!!c.value,onClick:de=>p(G)},{default:te(()=>[...H[16]||(H[16]=[ce(" Install ",-1)])]),_:1},8,["loading","disabled","onClick"]))])]),_:2},1032,["class"]))),128)),n.value.length>0&&n.value.length<a.value?(g(),E("div",xO,[q(Q,{variant:"ghost",size:"sm",loading:o.value,disabled:o.value,onClick:V},{default:te(()=>[ce(Z(o.value?"Loading…":`Load more (${a.value-n.value.length} remaining)`),1)]),_:1},8,["loading","disabled"])])):F("",!0)])])}}}),OO=jt(PO,[["__scopeId","data-v-789c3f61"]]),IO={key:0,class:"inspector-content nb-inspector"},RO={class:"detail-header"},DO={class:"detail-icon native-icon"},VO={style:{flex:"1","min-width":"0"}},BO={key:1,class:"rename-row"},ZO={class:"detail-type"},FO={class:"info-grid"},zO={class:"info-val"},UO={class:"info-val"},WO={class:"info-val"},jO={class:"info-val"},KO={class:"info-val mono"},qO={key:0,class:"widget-energy"},GO={class:"energy-primary"},YO={class:"energy-value"},XO={class:"energy-secondary"},JO={key:0,class:"energy-item"},QO={class:"energy-item-val"},eI={key:1,class:"energy-item"},tI={class:"energy-item-val"},iI={key:1,class:"widget-thermo"},rI={class:"thermo-row"},sI={class:"thermo-value"},nI={class:"thermo-row"},aI={class:"thermo-value accent"},oI={class:"thermo-row"},lI={key:2,class:"widget-thermo"},cI={class:"thermo-row"},uI={class:"thermo-value"},hI={class:"thermo-row"},dI={class:"thermo-value accent"},fI={class:"thermo-row"},pI={key:3,class:"widget-generic"},_I={key:0,class:"no-telemetry"},mI={class:"char-name"},gI={class:"char-value"},vI={class:"event-list"},bI=["title"],yI={class:"event-body"},wI={class:"event-message"},SI={key:0,class:"event-source"},CI={class:"history-tabs"},kI=["onClick"],AI={key:0,class:"history-nav"},MI={class:"history-nav-center"},LI={class:"history-total"},EI={class:"history-date"},$I={key:2,class:"no-history"},xI={key:3,class:"no-history"},TI={key:4,class:"no-history"},NI={class:"calibration-actions"},HI={class:"char-list"},PI={class:"char-name"},OI={class:"char-value"},II={key:0,class:"homekit-notice"},RI={class:"homekit-row"},DI={key:1,class:"homekit-notice"},VI={class:"detail-header"},BI={class:"detail-icon"},ZI={style:{flex:"1","min-width":"0"}},FI={key:1,class:"rename-row"},zI={class:"detail-type"},UI={class:"info-grid"},WI={key:0,class:"info-key"},jI={key:1,class:"info-val"},KI={key:0,class:"homekit-row"},qI={key:1,class:"homekit-notice"},GI={class:"char-list"},YI={class:"char-name"},XI={class:"homekit-row"},JI={key:0,class:"homekit-notice"},QI={class:"detail-uuid"},eR=Re({__name:"DeviceInspector",setup(e){const t=X(new Set),i=X(!1),r=X("");function s(fe){return!t.value.has(fe)}async function n(){try{const{hidden:fe}=await Ie.homekitHidden();t.value=new Set(fe)}catch{}}async function a(fe,ae){i.value=!0,r.value="";try{const Ee=await Ie.setHomekitVisibility(fe,ae),ze=new Set(t.value);ae?ze.delete(fe):ze.add(fe),t.value=ze,Ee.applied||(r.value="Saved. This takes effect after the next OpenBridge restart.")}catch(Ee){r.value=`Could not change visibility: ${Ee.message}`}finally{i.value=!1}}const o=X({}),l=X([]),c=X(""),u=Y(()=>[{value:"",label:"Default (as published)"},...l.value.map(fe=>({value:fe.key,label:fe.label}))]);function h(fe){return l.value.some(ae=>ae.serviceUuid===fe)}function d(fe,ae){var Ee;return((Ee=o.value[fe])==null?void 0:Ee[ae])??""}const f=X(null);function m(fe){return fe.homekitType||fe.widgetType}async function _(fe){f.value=null;try{const{accessory:ae}=await Ie.deviceAccessory(fe);f.value=ae}catch{}}async function y(){try{const{overrides:fe,available:ae}=await Ie.homekitServiceTypes();o.value=fe,l.value=ae}catch{}}async function p(fe,ae,Ee){i.value=!0,c.value="";try{await Ie.setHomekitServiceType(fe,ae,Ee||null);const ze={...o.value},We={...ze[fe]??{}};Ee?We[ae]=Ee:delete We[ae],Object.keys(We).length>0?ze[fe]=We:delete ze[fe],o.value=ze,c.value="Saved. This takes effect after the next OpenBridge restart."}catch(ze){c.value=`Could not change type: ${ze.message}`}finally{i.value=!1}}ut(()=>{n(),y()});const C=Sl(),S=j$(),v=X(""),k=X(""),$=X("success"),L=Y(()=>{const fe=C.selectedDevice;return!fe||fe.kind!=="native"?null:fe.dev.health??null}),V=Y(()=>{var ae;const fe=(ae=L.value)==null?void 0:ae.lastSeen;return fe?`Not responding since ${new Date(fe).toLocaleString()}`:"Not responding"}),P=Y(()=>{const fe=C.selectedDevice;return!fe||fe.kind!=="native"?[]:fe.dev.actions??[]});async function D(fe){const ae=C.selectedDevice;if(!(!ae||ae.kind!=="native")&&!(fe.confirm&&!await S({title:fe.label,subjectLabel:"Device",subject:ae.dev.name,message:fe.confirm,confirmLabel:fe.label}))){v.value=fe.id,k.value="";try{await Ie.controlDevice(ae.dev.id,fe.id,!0),$.value="success",k.value=`${fe.label} sent.`}catch(Ee){$.value="error",k.value=`${fe.label} failed: ${Ee.message}`}finally{v.value=""}}}const x=Y(()=>C.selectedDevice),H=Y(()=>x.value?x.value.kind==="native"?x.value.dev.id:x.value.acc.uuid:null),O={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 U(fe){return O[fe]??{label:`Category ${fe}`,icon:"cube"}}const j=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]);function re(fe){return fe.services.filter(ae=>!j.has(ae.name)&&!j.has(ae.uuid))}function Q(fe){return fe.services.find(ae=>j.has(ae.name)||j.has(ae.uuid))}function ie(fe){const ae=Q(fe);if(!ae)return null;const Ee=ze=>{var We;return(We=ae.characteristics.find(Ct=>Ct.name===ze||Ct.name.includes(ze)))==null?void 0:We.value};return{manufacturer:Ee("Manufacturer")??Ee("Manuf"),model:Ee("Model"),serial:Ee("SerialNumber")??Ee("Serial"),firmware:Ee("FirmwareRevision")??Ee("Firmware")}}function G(fe){return fe.value===null||fe.value===void 0?"—":fe.format==="bool"?fe.value?"On":"Off":typeof fe.value=="number"?String(Math.round(fe.value*100)/100):String(fe.value)}function de(fe){return fe.perms.includes("pw")}const pe=X(!1),_e=X("");function Ne(fe){_e.value=fe,pe.value=!0}async function Le(fe){var ae,Ee;if(_e.value.trim())try{const ze=_e.value.trim();await Ie.renameDevice(fe,ze),pe.value=!1,((ae=x.value)==null?void 0:ae.kind)==="native"?x.value.dev.name=ze:((Ee=x.value)==null?void 0:Ee.kind)==="hap"&&(x.value.acc.displayName=ze);const{useDaemonStore:We}=await g6(async()=>{const{useDaemonStore:gt}=await Promise.resolve().then(()=>R6);return{useDaemonStore:gt}},void 0);await We().fetchAccessories()}catch(ze){console.error("Rename failed:",ze)}}async function ye(fe,ae,Ee,ze){try{await Ie.setCharacteristic(fe,ae,Ee,ze);const{useDaemonStore:We}=await g6(async()=>{const{useDaemonStore:gt}=await Promise.resolve().then(()=>R6);return{useDaemonStore:gt}},void 0);await We().fetchAccessories()}catch(We){console.error("Failed to set characteristic:",We)}}const ge=X([]);function I(fe){const ae=new Date(fe);return Number.isNaN(ae.getTime())?fe:new Date().toDateString()===ae.toDateString()?ae.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):ae.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}async function ee(){const fe=x.value;if((fe==null?void 0:fe.kind)!=="native"){ge.value=[];return}try{const ae=await Ie.deviceEvents(fe.dev.id,100);ge.value=ae.events}catch{ge.value=[]}}const ne={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"},ve={switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",gate:"Gate",sensor:"Sensor"};function ke(fe){return ne[fe]??"cube"}function N(fe){return ve[fe]??fe}function T(fe,ae=1){if(fe==null)return"—";const Ee=Number(fe);return isFinite(Ee)?Ee.toFixed(ae):String(fe)}function K(fe){return Object.entries(fe.telemetry).filter(([ae])=>!ae.startsWith("_"))}const J=X("day"),le=X(new Date().toISOString().slice(0,10)),ue=X(null),w=X(!1);async function A(fe){if(!w.value){w.value=!0;try{ue.value=await Ie.deviceHistory(fe,J.value,le.value)}catch{}finally{w.value=!1}}}function B(fe){var Ee;const ae=new Date(le.value+(le.value.length<=7?"-01":""));J.value==="day"?(ae.setDate(ae.getDate()+fe),le.value=ae.toISOString().slice(0,10)):J.value==="month"?(ae.setMonth(ae.getMonth()+fe),le.value=ae.toISOString().slice(0,7)):(ae.setFullYear(ae.getFullYear()+fe),le.value=String(ae.getFullYear())),((Ee=x.value)==null?void 0:Ee.kind)==="native"&&A(x.value.dev.id)}Ue(J,()=>{var ae;const fe=new Date;J.value==="day"?le.value=fe.toISOString().slice(0,10):J.value==="month"?le.value=fe.toISOString().slice(0,7):le.value=String(fe.getFullYear()),((ae=x.value)==null?void 0:ae.kind)==="native"&&x.value.dev.widgetType==="energy_meter"&&A(x.value.dev.id)}),Ue(H,(fe,ae)=>{if(fe===ae&&ue.value)return;const Ee=x.value;(Ee==null?void 0:Ee.kind)==="native"?_(Ee.dev.id):f.value=null,ee(),(Ee==null?void 0:Ee.kind)==="native"&&Ee.dev.widgetType==="energy_meter"&&(le.value=new Date().toISOString().slice(0,10),J.value="day",A(Ee.dev.id))},{immediate:!0});const M=X([]),R=X([]),z=X(!1),W=X(!1),se=X(!1),Se=Y(()=>JSON.stringify(M.value)!==JSON.stringify(R.value)),xe=Y(()=>!x.value||x.value.kind!=="native"?null:x.value.dev);async function De(fe){const{plugins:ae}=await Ie.plugins(),Ee=ae.find(We=>We.id===fe.pluginId);if(!Ee)return null;if(Ee.source!=="homebridge"){const{config:We}=await Ie.config.getPlugin(fe.pluginId);return We?{pluginConfig:We,isNative:!0,pluginName:fe.pluginId,platformName:void 0}:null}else{const We=Ee.platformName??fe.pluginId,{config:Ct}=await Ie.config.getPlatform(We);return Ct?{pluginConfig:Ct,isNative:!1,pluginName:fe.pluginId,platformName:We}:null}}async function Xe(){const fe=xe.value;if(fe!=null&&fe.interpolation){z.value=!0,se.value=!1;try{const ae=await De(fe);if(!ae)return;const ze=(ae.pluginConfig.devices??[]).find(Xr=>Xr.id===fe.id);if(!ze)return;const We=fe.interpolation,gt=(ze[We.configField]??[]).map(Xr=>({input:Xr[We.configShape.inputKey]??0,output:Xr[We.configShape.outputKey]??0}));M.value=gt,R.value=JSON.parse(JSON.stringify(gt))}catch(ae){console.error("Failed to load interpolation config:",ae)}finally{z.value=!1}}}async function $e(){const fe=xe.value;if(fe!=null&&fe.interpolation){W.value=!0,se.value=!1;try{const ae=await De(fe);if(!ae)return;const Ee=fe.interpolation,ze=ae.pluginConfig.devices??[],We=ze.findIndex(gt=>gt.id===fe.id);if(We<0)return;const Ct=M.value.map(gt=>({[Ee.configShape.inputKey]:gt.input,[Ee.configShape.outputKey]:gt.output}));ze[We]={...ze[We],[Ee.configField]:Ct},ae.pluginConfig.devices=ze,ae.isNative?await Ie.config.savePlugin(ae.pluginName,ae.pluginConfig):await Ie.config.savePlatform(ae.pluginConfig),R.value=JSON.parse(JSON.stringify(M.value)),se.value=!0}catch(ae){console.error("Failed to save interpolation config:",ae)}finally{W.value=!1}}}function Nt(){M.value=JSON.parse(JSON.stringify(R.value)),se.value=!1}Ue(H,(fe,ae)=>{var Ee;fe===ae&&R.value.length>0||(se.value=!1,((Ee=x.value)==null?void 0:Ee.kind)==="native"&&x.value.dev.interpolation?Xe():(M.value=[],R.value=[]))},{immediate:!0});const pi=Y(()=>{var ae;return(ae=ue.value)!=null&&ae.buckets?[{name:"kWh",data:ue.value.buckets.map(Ee=>{let ze=Ee.label;return J.value==="day"?ze=parseInt(Ee.label)%6===0?Ee.label:"":J.value==="month"&&(ze=parseInt(Ee.label)%5===1?Ee.label:""),{x:ze,y:Math.max(0,Math.round((Ee.kwh??0)*100)/100)}})}]:[]});return(fe,ae)=>{const Ee=Ye,ze=la,We=ai,Ct=mc,gt=gd,Xr=w9,Oc=pL,no=yc,Ce=bc;return x.value?(g(),E("div",IO,[x.value.kind==="native"?(g(),E(we,{key:0},[b("div",RO,[b("div",DO,[q(Ee,{name:ke(m(x.value.dev)),size:26},null,8,["name"])]),b("div",VO,[pe.value?(g(),E("div",BO,[q(ze,{modelValue:_e.value,"onUpdate:modelValue":ae[1]||(ae[1]=me=>_e.value=me),size:"sm",onKeyup:[ae[2]||(ae[2]=Rr(me=>Le(x.value.dev.id),["enter"])),ae[3]||(ae[3]=Rr(me=>pe.value=!1,["escape"]))]},null,8,["modelValue"]),q(We,{variant:"primary",size:"sm",icon:bs,"aria-label":"Save name",onClick:ae[4]||(ae[4]=me=>Le(x.value.dev.id))}),q(We,{variant:"ghost",size:"sm",icon:fu,"aria-label":"Cancel rename",onClick:ae[5]||(ae[5]=me=>pe.value=!1)})])):(g(),E("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:ae[0]||(ae[0]=me=>Ne(x.value.dev.name))},Z(x.value.dev.name),1)),b("div",ZO,Z(N(m(x.value.dev))),1)])]),q(gt,{title:"Device info",fluid:""},x_({default:te(()=>[L.value&&L.value.status==="stale"?(g(),he(Ct,{key:0,status:"warning",title:V.value,style:{"margin-bottom":"0.5rem"}},{default:te(()=>[ce(Z(L.value.reason),1)]),_:1},8,["title"])):F("",!0),k.value?(g(),he(Ct,{key:1,status:$.value,title:k.value,style:{"margin-bottom":"0.5rem"}},null,8,["status","title"])):F("",!0),b("div",FO,[ae[19]||(ae[19]=b("span",{class:"info-key"},"Plugin",-1)),b("span",zO,Z(x.value.dev.pluginId),1),x.value.dev.manufacturer?(g(),E(we,{key:0},[ae[17]||(ae[17]=b("span",{class:"info-key"},"Manufacturer",-1)),b("span",UO,Z(x.value.dev.manufacturer),1)],64)):F("",!0),x.value.dev.model?(g(),E(we,{key:1},[ae[18]||(ae[18]=b("span",{class:"info-key"},"Model",-1)),b("span",WO,Z(x.value.dev.model),1)],64)):F("",!0),ae[20]||(ae[20]=b("span",{class:"info-key"},"Status",-1)),b("span",jO,Z(x.value.dev.pluginStatus),1),ae[21]||(ae[21]=b("span",{class:"info-key"},"ID",-1)),b("span",KO,Z(x.value.dev.id),1)])]),_:2},[P.value.length>0?{name:"toolbar",fn:te(()=>[(g(!0),E(we,null,Ze(P.value,me=>(g(),he(We,{key:me.id,size:"xs",variant:me.danger?"danger":"ghost",disabled:v.value!=="",loading:v.value===me.id,onClick:Fe=>D(me)},{default:te(()=>[ce(Z(me.label),1)]),_:2},1032,["variant","disabled","loading","onClick"]))),128))]),key:"0"}:void 0]),1024),q(gt,{title:"State",fluid:""},{default:te(()=>[x.value.dev.widgetType==="energy_meter"?(g(),E("div",qO,[b("div",GO,[b("span",YO,Z(T(x.value.dev.telemetry.power,1)),1),ae[22]||(ae[22]=b("span",{class:"energy-unit"},"W",-1))]),b("div",XO,[x.value.dev.telemetry.voltage!==void 0?(g(),E("span",JO,[ae[23]||(ae[23]=b("span",{class:"energy-label"},"Voltage",-1)),b("span",QO,Z(T(x.value.dev.telemetry.voltage,1))+" V",1)])):F("",!0),x.value.dev.telemetry.current!==void 0?(g(),E("span",eI,[ae[24]||(ae[24]=b("span",{class:"energy-label"},"Current",-1)),b("span",tI,Z(T(x.value.dev.telemetry.current,3))+" A",1)])):F("",!0)])])):x.value.dev.widgetType==="thermostat"?(g(),E("div",iI,[b("div",rI,[ae[25]||(ae[25]=b("span",{class:"thermo-label"},"Current",-1)),b("span",sI,Z(T(x.value.dev.telemetry.currentTemperature,1))+"°C",1)]),b("div",nI,[ae[26]||(ae[26]=b("span",{class:"thermo-label"},"Target",-1)),b("span",aI,Z(T(x.value.dev.telemetry.targetTemperature,1))+"°C ",1)]),b("div",oI,[ae[27]||(ae[27]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Te(["thermo-value",x.value.dev.telemetry.active?"on":"off"])},Z(x.value.dev.telemetry.active?"On":"Off"),3)])])):x.value.dev.widgetType==="dehumidifier"?(g(),E("div",lI,[b("div",cI,[ae[28]||(ae[28]=b("span",{class:"thermo-label"},"Humidity",-1)),b("span",uI,Z(T(x.value.dev.telemetry.currentHumidity,0))+"%",1)]),b("div",hI,[ae[29]||(ae[29]=b("span",{class:"thermo-label"},"Target",-1)),b("span",dI,Z(T(x.value.dev.telemetry.targetHumidity,0))+"%",1)]),b("div",fI,[ae[30]||(ae[30]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Te(["thermo-value",x.value.dev.telemetry.active?"on":"off"])},Z(x.value.dev.telemetry.active?"On":"Off"),3)])])):(g(),E("div",pI,[Object.keys(x.value.dev.telemetry).filter(me=>!me.startsWith("_")).length===0?(g(),E("span",_I,"No telemetry yet")):F("",!0),(g(!0),E(we,null,Ze(K(x.value.dev),([me,Fe])=>(g(),E("div",{key:me,class:"char-row"},[b("span",mI,Z(me),1),b("span",gI,Z(String(Fe)),1)]))),128))]))]),_:1}),ge.value.length>0?(g(),he(gt,{key:0,title:"Recent activity",fluid:""},{default:te(()=>[b("ul",vI,[(g(!0),E(we,null,Ze(ge.value,(me,Fe)=>(g(),E("li",{key:`${me.at}-${Fe}`,class:"event"},[b("span",{class:"event-time",title:me.at},Z(I(me.at)),9,bI),b("span",yI,[b("span",wI,Z(me.message),1),me.source?(g(),E("span",SI,Z(me.source),1)):F("",!0)])]))),128))])]),_:1})):F("",!0),x.value.dev.widgetType==="energy_meter"?(g(),he(gt,{key:1,title:"Energy history",class:"energy-history",fluid:""},{default:te(()=>[b("div",CI,[(g(),E(we,null,Ze(["day","month","year"],me=>b("button",{key:me,class:Te(["history-tab",{active:J.value===me}]),onClick:Fe=>J.value=me},Z(me),11,kI)),64))]),ue.value?(g(),E("div",AI,[q(We,{variant:"ghost",size:"xs",icon:I9,title:"Previous",onClick:ae[6]||(ae[6]=me=>B(-1))}),b("div",MI,[b("span",LI,[ce(Z(ue.value.totalKwh.toFixed(2))+" ",1),ae[31]||(ae[31]=b("span",{class:"history-unit"},"kWh",-1))]),b("span",EI,Z(ue.value.date),1)]),q(We,{variant:"ghost",size:"xs",icon:tS,title:"Next",onClick:ae[7]||(ae[7]=me=>B(1))})])):F("",!0),ue.value&&ue.value.totalKwh>0?(g(),he(Xr,{key:1,series:pi.value,height:120,"show-legend":!1,"show-tooltip":!0},null,8,["series"])):F("",!0),ue.value&&ue.value.totalKwh===0?(g(),E("div",$I," No consumption recorded for this period. Data accumulates every 5 minutes. ")):F("",!0),!ue.value&&!w.value?(g(),E("div",xI,"No data available for this period.")):F("",!0),w.value?(g(),E("div",TI,"Loading history…")):F("",!0)]),_:1})):F("",!0),x.value.dev.interpolation&&M.value.length>0?(g(),he(gt,{key:2,title:"Calibration",fluid:""},{default:te(()=>[q(Oc,{modelValue:M.value,"onUpdate:modelValue":ae[8]||(ae[8]=me=>M.value=me),height:220,"input-label":x.value.dev.interpolation.inputLabel,"output-label":x.value.dev.interpolation.outputLabel,"input-min":x.value.dev.interpolation.inputMin,"input-max":x.value.dev.interpolation.inputMax,"output-min":x.value.dev.interpolation.outputMin,"output-max":x.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"]),ae[34]||(ae[34]=b("div",{class:"calibration-hint"},"Drag points to adjust. Double-click to add. Right-click to remove.",-1)),b("div",NI,[q(We,{variant:"primary",size:"sm",disabled:!Se.value||W.value,onClick:$e},{default:te(()=>[ce(Z(W.value?"Saving...":"Save"),1)]),_:1},8,["disabled"]),q(We,{variant:"ghost",size:"sm",disabled:!Se.value,onClick:Nt},{default:te(()=>[...ae[32]||(ae[32]=[ce(" Reset ",-1)])]),_:1},8,["disabled"])]),se.value?(g(),he(Ct,{key:0,status:"success",title:"Configuration saved"},{default:te(()=>[...ae[33]||(ae[33]=[ce(" Restart the plugin to apply the new mapping. ",-1)])]),_:1})):F("",!0)]),_:1})):x.value.dev.interpolation&&z.value?(g(),he(gt,{key:3,title:"Calibration",fluid:""},{default:te(()=>[...ae[35]||(ae[35]=[b("div",{class:"no-history"},"Loading calibration data...",-1)])]),_:1})):F("",!0),K(x.value.dev).length>0?(g(),he(gt,{key:4,title:"All telemetry",fluid:""},{default:te(()=>[b("div",HI,[(g(!0),E(we,null,Ze(K(x.value.dev),([me,Fe])=>(g(),E("div",{key:me,class:"char-row"},[b("span",PI,Z(me),1),b("span",OI,Z(String(Fe)),1)]))),128))])]),_:1})):F("",!0),f.value?(g(),he(gt,{key:5,title:"HomeKit",fluid:""},{default:te(()=>[(g(!0),E(we,null,Ze(re(f.value),me=>Gs((g(),E("div",{key:me.uuid,class:"homekit-row"},[ae[36]||(ae[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)),q(no,{"model-value":d(f.value.uuid,me.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":Fe=>p(f.value.uuid,me.uuid,String(Fe))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])),[[nm,h(me.uuid)]])),128)),c.value?(g(),E("div",II,Z(c.value),1)):F("",!0),b("div",RI,[ae[37]||(ae[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)),q(Ce,{name:`homekit-visible-${f.value.uuid}`,"model-value":s(f.value.uuid),disabled:i.value,"onUpdate:modelValue":ae[9]||(ae[9]=me=>a(f.value.uuid,!!me))},null,8,["name","model-value","disabled"])]),r.value?(g(),E("div",DI,Z(r.value),1)):F("",!0)]),_:1})):F("",!0)],64)):x.value.kind==="hap"?(g(),E(we,{key:1},[b("div",VI,[b("div",BI,[q(Ee,{name:U(x.value.acc.category).icon,size:26},null,8,["name"])]),b("div",ZI,[pe.value?(g(),E("div",FI,[q(ze,{modelValue:_e.value,"onUpdate:modelValue":ae[11]||(ae[11]=me=>_e.value=me),size:"sm",onKeyup:[ae[12]||(ae[12]=Rr(me=>Le(x.value.acc.uuid),["enter"])),ae[13]||(ae[13]=Rr(me=>pe.value=!1,["escape"]))]},null,8,["modelValue"]),q(We,{variant:"primary",size:"sm",icon:bs,"aria-label":"Save name",onClick:ae[14]||(ae[14]=me=>Le(x.value.acc.uuid))}),q(We,{variant:"ghost",size:"sm",icon:fu,"aria-label":"Cancel rename",onClick:ae[15]||(ae[15]=me=>pe.value=!1)})])):(g(),E("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:ae[10]||(ae[10]=me=>Ne(x.value.acc.displayName))},Z(x.value.acc.displayName),1)),b("div",zI,Z(U(x.value.acc.category).label),1)])]),ie(x.value.acc)?(g(),he(gt,{key:0,title:"Device info",fluid:""},{default:te(()=>[b("div",UI,[(g(!0),E(we,null,Ze(Object.entries(ie(x.value.acc)),([me,Fe])=>(g(),E(we,{key:me},[Fe?(g(),E("span",WI,Z(me),1)):F("",!0),Fe?(g(),E("span",jI,Z(Fe),1)):F("",!0)],64))),128))])]),_:1})):F("",!0),(g(!0),E(we,null,Ze(re(x.value.acc),me=>(g(),he(gt,{key:me.uuid,title:me.displayName||me.name,fluid:""},{default:te(()=>[h(me.uuid)?(g(),E("div",KI,[ae[38]||(ae[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)),q(no,{"model-value":d(x.value.acc.uuid,me.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":Fe=>p(x.value.acc.uuid,me.uuid,String(Fe))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])):F("",!0),c.value?(g(),E("div",qI,Z(c.value),1)):F("",!0),b("div",GI,[(g(!0),E(we,null,Ze(me.characteristics,Fe=>(g(),E("div",{key:Fe.uuid,class:"char-row"},[b("span",YI,Z(Fe.name),1),de(Fe)&&Fe.format==="bool"?(g(),he(Ce,{key:0,name:`hap-char-${me.uuid}-${Fe.uuid}`,"model-value":!!Fe.value,"onUpdate:modelValue":$s=>ye(x.value.acc.uuid,me.uuid,Fe.uuid,$s?1:0)},null,8,["name","model-value","onUpdate:modelValue"])):(g(),E("span",{key:1,class:Te(["char-value",{on:Fe.format==="bool"&&Fe.value}])},Z(G(Fe)),3))]))),128))])]),_:2},1032,["title"]))),128)),q(gt,{title:"HomeKit",fluid:""},{default:te(()=>[b("div",XI,[ae[39]||(ae[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)),q(Ce,{name:`homekit-visible-${x.value.acc.uuid}`,"model-value":s(x.value.acc.uuid),disabled:i.value,"onUpdate:modelValue":ae[16]||(ae[16]=me=>a(x.value.acc.uuid,!!me))},null,8,["name","model-value","disabled"])]),r.value?(g(),E("div",JI,Z(r.value),1)):F("",!0)]),_:1}),b("div",QI,"UUID: "+Z(x.value.acc.uuid),1)],64)):F("",!0)])):F("",!0)}}}),tR=jt(eR,[["__scopeId","data-v-d502d485"]]),iR={class:"logs-filter"},rR={key:0,class:"log-empty"},sR={class:"log-time"},nR={class:"log-plugin"},aR={class:"log-msg"},i8="openbridge.logs.panelSize",oR=Re({__name:"LiveLogsPanel",setup(e){const t=Ls(),i=["collapsed","default","full"],r=X("collapsed");ut(()=>{const c=localStorage.getItem(i8);c&&i.includes(c)&&(r.value=c)}),Ue(r,c=>localStorage.setItem(i8,c));const s=X([]),n=X(null),a=Y(()=>[{value:"system",label:"system"},...t.plugins.map(c=>({value:c.manifest.name,label:c.manifest.name}))]),o=Y(()=>s.value.length===0?t.logs:t.logs.filter(c=>s.value.includes(c.plugin)));function l(){t.logs.length=0}return Ue(()=>o.value.length,async()=>{const c=n.value;!c||!(c.scrollHeight-c.scrollTop-c.clientHeight<40)||(await fi(),c.scrollTop=c.scrollHeight)}),(c,u)=>{const h=yc,d=ai,f=gd;return g(),he(f,{size:r.value,"onUpdate:size":u[1]||(u[1]=m=>r.value=m),title:"Live Logs"},{toolbar:te(()=>[b("div",iR,[q(h,{modelValue:s.value,"onUpdate:modelValue":u[0]||(u[0]=m=>s.value=m),multiple:"",options:a.value,placeholder:"All plugins",size:"xs"},null,8,["modelValue","options"])]),q(d,{size:"xs",variant:"ghost",icon:Sd,title:"Clear",onClick:l})]),default:te(()=>[b("div",{ref_key:"logsEl",ref:n,class:"log-list"},[o.value.length===0?(g(),E("div",rR,"No log entries yet.")):F("",!0),(g(!0),E(we,null,Ze(o.value,(m,_)=>(g(),E("div",{key:_,class:"log-line"},[b("span",sR,Z(new Date(m.timestamp).toLocaleTimeString()),1),b("span",{class:Te(["log-level",`log-level--${m.level}`])},Z(m.level.toUpperCase()),3),b("span",nR,Z(m.plugin),1),b("span",aR,Z(m.message),1)]))),128))],512)]),_:1},8,["size"])}}}),lR=jt(oR,[["__scopeId","data-v-2d8d29ff"]]),cR=["data-tooltip"],uR=["onClick"],hR=Re({__name:"AppLayout",setup(e){const t=kc(),i=wl(),r=Ls(),s=Sl(),n=nn(),a=Ac();async function o(){await a.logout()}const{theme:l,resolved:c,followsSystem:u,setTheme:h}=vd(),d=[{value:"light",label:"Light"},{value:"dark",label:"Dark"},{value:"system",label:"System"}],f=Y({get:()=>l.value,set:D=>h(D)}),m=Y(()=>u.value?`Following your system, currently ${c.value}`:"Pinned, ignoring your system setting");function _(){var x;const D=(x=a.config.value)==null?void 0:x.issuer;D&&window.open(`${D}/profile`,"_blank","noopener")}const y=X([]),p=X(!0),C=Y(()=>y.value.map(D=>{var x;return{id:D.sub,email:D.email,name:D.name,current:D.sub===((x=a.user.value)==null?void 0:x.id)}}));async function S(){const D=await a.listIdentities();y.value=D,p.value=D.length===0}function v(D){a.switchAccount(D.email)}async function k(D){await a.removeIdentity(D.id),await S()}const $=X(null),L=X(!1);async function V(){try{const D=await fetch("/api/updates/check");if(!D.ok)return;const x=await D.json();x.updateAvailable&&x.latest&&($.value=x.latest)}catch{}}const P=[{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 Ue(()=>t.name,()=>s.close()),ut(async()=>{await r.fetchHealth(),await r.fetchPlugins(),r.fetchLogs(),r.connectLiveLogs();const D=setInterval(()=>r.fetchHealth(),1e4);Pi(()=>clearInterval(D)),V()}),Pi(()=>r.disconnectLiveLogs()),(D,x)=>{const H=jo("RouterLink"),O=Ye,U=RE,j=WE,re=md,Q=NA,ie=u4,G=qn,de=ai,pe=mc,_e=jo("RouterView"),Ne=IE;return g(),he(Ne,{"inspector-visible":oe(s).visible,"main-padding":!oe(n).fullBleed},x_({"sidebar-logo":te(()=>[q(H,{to:"/dashboard","data-tooltip":"OpenBridge",class:"sidebar-logo"},{default:te(()=>[...x[4]||(x[4]=[b("img",{src:gT,width:"32",height:"32",alt:"OpenBridge logo"},null,-1)])]),_:1})]),"sidebar-nav":te(()=>[(g(),E(we,null,Ze(P,Le=>q(U,{key:Le.name,to:Le.href,tooltip:Le.label,active:oe(t).name===Le.name,onClick:lt(ye=>oe(i).push(Le.href),["prevent"])},{default:te(()=>[q(O,{name:Le.icon,size:18},null,8,["name"])]),_:2},1032,["to","tooltip","active","onClick"])),64))]),"sidebar-bottom":te(()=>{var Le;return[b("div",{class:Te(["daemon-status",oe(r).connected?"online":"offline"]),"data-tooltip":oe(r).connected?"Daemon connected":"Daemon offline"},[...x[5]||(x[5]=[b("span",{class:"daemon-dot"},null,-1)])],10,cR),(Le=oe(a).config.value)!=null&&Le.enabled&&oe(a).user.value?(g(),he(Q,{key:0,user:{email:oe(a).user.value.email,picture:oe(a).user.value.picture},accounts:C.value,"accounts-unknown":p.value,"show-account-actions":oe(a).isNubiscoPlatform.value,"show-profile":oe(a).isNubiscoPlatform.value,brand:oe(a).isNubiscoPlatform.value?"footer":void 0,onOpen:S,onSwitch:v,onSwitchAccount:x[1]||(x[1]=ye=>oe(a).chooseAccount()),onAddAccount:x[2]||(x[2]=ye=>oe(a).addAccount()),onRemove:k,onProfile:_,onSignOut:o},{default:te(({close:ye})=>[q(re,{label:"Theme",hint:m.value,control:"fit",class:"menu-theme"},{default:te(()=>[q(j,{modelValue:f.value,"onUpdate:modelValue":x[0]||(x[0]=ge=>f.value=ge),name:"theme",options:d,direction:"horizontal"},null,8,["modelValue"])]),_:1},8,["hint"]),b("button",{type:"button",role:"menuitem",class:"nb-user-menu__action nb-user-menu__action--danger",onClick:ge=>(ye(),oe(a).logoutEverywhere())},[q(O,{name:oe(V4),size:15},null,8,["name"]),x[6]||(x[6]=ce(" Sign out of all apps ",-1))],8,uR)]),_:1},8,["user","accounts","accounts-unknown","show-account-actions","show-profile","brand"])):F("",!0)]}),"topbar-left":te(()=>[q(ie,{subtitle:oe(n).title},null,8,["subtitle"]),oe(n).count!==null?(g(),he(G,{key:0},{default:te(()=>[ce(Z(oe(n).count),1)]),_:1})):F("",!0),x[7]||(x[7]=b("div",{id:"ob-topbar-left",class:"topbar-slot"},null,-1))]),"topbar-right":te(()=>[x[8]||(x[8]=b("div",{id:"ob-topbar-right",class:"topbar-slot"},null,-1))]),inspector:te(()=>[oe(s).mode==="plugin"?(g(),he(IP,{key:0})):oe(s).mode==="marketplace"?(g(),he(OO,{key:1})):oe(s).mode==="device"?(g(),he(tR,{key:2})):F("",!0)]),bottom:te(()=>[q(lR)]),default:te(()=>[q(_e)]),_:2},[$.value&&!L.value?{name:"notification",fn:te(()=>[q(pe,{status:"info",icon:wd,flush:"",dismissible:"",title:`OpenBridge v${$.value} is available`,onDismiss:x[3]||(x[3]=Le=>L.value=!0)},{action:te(()=>[q(de,{variant:"ghost",size:"sm",href:"https://github.com/nubisco/openbridge/releases",target:"_blank",rel:"noopener"},{default:te(()=>[...x[9]||(x[9]=[ce(" See what's new ",-1)])]),_:1})]),_:1},8,["title"])]),key:"0"}:void 0]),1032,["inspector-visible","main-padding"])}}}),dR=jt(hR,[["__scopeId","data-v-01a1c16f"]]),fR=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},pR=fR("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"/>'),_R=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},mR=_R("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"/>'),gR=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},vR=gR("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"/>'),bR=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},yR=bR("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"/>'),ba=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},wR=ba("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"/>'),SR=ba("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"/>'),Du=ba("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"/>'),CR=ba("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"/>'),kR=ba("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"/>'),AR=ba("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"/>'),MR="pulse",LR=Object.freeze(Object.defineProperty({__proto__:null,bold:CR,default:Du,duotone:AR,fill:kR,glyphName:MR,light:SR,regular:Du,thin:wR},Symbol.toStringTag,{value:"Module"})),ER={class:"dashboard"},$R={class:"top-row"},xR={class:"hk-body"},TR={key:0,class:"qr-wrap"},NR=["src"],HR={key:1,class:"qr-placeholder"},PR={class:"hk-details"},OR={key:0,class:"pin-display"},IR={key:1,class:"pin-label"},RR={class:"hk-status"},DR={key:2,class:"hk-error"},VR={key:0,class:"sys-grid"},BR={class:"sys-val"},ZR={class:"sys-val"},FR={class:"sys-val"},zR={class:"sys-val"},UR={class:"sys-val"},WR={class:"sys-val"},jR={class:"sys-val"},KR={class:"sys-val mono"},qR={class:"sys-val mono"},GR={class:"sys-val mono"},YR={key:1,class:"loading-inline"},XR={class:"card-title"},JR={class:"plugins-counts"},QR={key:0,class:"pill red"},eD={key:0,class:"empty-inline"},tD={key:1,class:"plugins-list"},iD={class:"plugin-name"},rD={class:"plugin-ver"},sD={class:"metrics-row"},nD={class:"metric-header"},aD={class:"metric-icon purple"},oD={class:"metric-values"},lD={class:"metric-big"},cD={key:0,class:"metric-sub"},uD={class:"metric-chart"},hD={class:"metric-header"},dD={class:"metric-icon blue"},fD={class:"metric-values"},pD={class:"metric-big"},_D={class:"metric-sub"},mD={class:"metric-chart"},gD={class:"metric-header"},vD={class:"metric-icon green"},bD={class:"uptime-rows"},yD={class:"uptime-row"},wD={class:"uptime-val"},SD={class:"uptime-row"},CD={class:"uptime-val"},kD={style:{"margin-top":"0.75rem"}},AD={class:"metric-header"},MD={class:"metric-icon amber"},LD={class:"net-values"},ED={class:"net-val"},$D={class:"net-val"},xD={class:"metric-chart net-charts"},TD=Re({__name:"DashboardView",setup(e){const t=Ls(),i=nn();function r(H){return H==="running"?"green":H==="error"?"red":H==="loading"?"blue":"grey"}const s=X(!1),n=X(!1);async function a(){if(!s.value){s.value=!0,n.value=!1;try{await Ie.daemon.restart(),n.value=!0;let H=0;const O=setInterval(async()=>{H++;try{await Ie.health(),clearInterval(O),location.reload()}catch{}H>60&&(clearInterval(O),s.value=!1)},1e3)}catch{s.value=!1}}}const o=X(null),l=X(""),c=X(""),u=X(""),h=Y(()=>t.connected?u.value?"red":"green":"gray"),d=Y(()=>t.connected?u.value?"HomeKit offline":"Bridge running":"Daemon offline"),f=X([]),m=X([]),_=X([]),y=X([]),p=Cr(null);let C=null;function S(){C&&(C.onclose=null,C.close(),C=null);const H=location.protocol==="https:"?"wss:":"ws:";C=new WebSocket(`${H}//${location.host}/ws/metrics`),C.onmessage=O=>{if(!document.hidden)try{const U=JSON.parse(O.data);if(U.type==="history"){const j=U.data;f.value=j.map(re=>re.cpu),m.value=j.map(re=>$(re)),_.value=j.map(re=>re.netRxSec),y.value=j.map(re=>re.netTxSec),j.length&&(p.value=j[j.length-1])}else if(U.type==="snapshot"){const j=U.data;p.value=j,k(f,j.cpu),k(m,$(j)),k(_,j.netRxSec),k(y,j.netTxSec)}}catch{}},C.onclose=()=>{C=null,setTimeout(S,3e3)}}function v(){document.hidden||S()}function k(H,O){H.value=[...H.value.slice(-59),O]}function $(H){return H.memTotal?Math.round((H.memTotal-H.memFree)/H.memTotal*100):0}function L(H){return H<1024?`${H} B`:H<1024**2?`${(H/1024).toFixed(1)} KB`:H<1024**3?`${(H/1024**2).toFixed(1)} MB`:`${(H/1024**3).toFixed(1)} GB`}function V(H){const O=Math.floor(H/86400),U=Math.floor(H%86400/3600),j=Math.floor(H%3600/60);return O>0?`${O}d ${U}h`:U>0?`${U}h ${j}m`:`${j}m`}const P=Y(()=>p.value?L(p.value.memTotal-p.value.memFree):"—"),D=Y(()=>p.value?L(p.value.memTotal):"—"),x=Y(()=>p.value?$(p.value):0);return ut(async()=>{i.setPage("Dashboard"),t.fetchPlugins();try{o.value=await Ie.system()}catch{}try{const H=await Ie.qr();u.value=H.error??"",H.setupURI&&(c.value=H.pincode??"",l.value=await va.toDataURL(H.setupURI,{width:148,margin:1,color:{dark:"#000000",light:"#ffffff"}}))}catch{}S(),document.addEventListener("visibilitychange",v)}),Pi(()=>{C==null||C.close(),C=null,document.removeEventListener("visibilitychange",v)}),(H,O)=>{const U=Ye,j=yl,re=qn,Q=m$,ie=j4,G=ai;return g(),E("div",ER,[b("div",$R,[q(j,{class:"hk-card"},{default:te(()=>[O[0]||(O[0]=b("div",{class:"card-title"},"HomeKit Pairing",-1)),b("div",xR,[l.value?(g(),E("div",TR,[b("img",{src:l.value,alt:"HomeKit QR Code",class:"qr-img"},null,8,NR)])):(g(),E("div",HR,[q(U,{name:oe(pR),size:48},null,8,["name"]),b("span",null,Z(u.value?"HomeKit bridge unavailable":"No HAP bridge configured"),1)])),b("div",PR,[c.value?(g(),E("div",OR,Z(c.value),1)):F("",!0),c.value?(g(),E("div",IR,"Scan to add to HomeKit")):F("",!0),b("div",RR,[b("span",{class:Te(["dot",h.value])},null,2),ce(" "+Z(d.value),1)]),u.value?(g(),E("div",DR,Z(u.value),1)):F("",!0)])])]),_:1}),q(j,{class:"sys-card"},{default:te(()=>{var de;return[O[12]||(O[12]=b("div",{class:"card-title"},"System Information",-1)),o.value?(g(),E("div",VR,[O[1]||(O[1]=b("span",{class:"sys-key"},"OS",-1)),b("span",BR,Z(o.value.os),1),O[2]||(O[2]=b("span",{class:"sys-key"},"Arch",-1)),b("span",ZR,Z(o.value.arch),1),O[3]||(O[3]=b("span",{class:"sys-key"},"Hostname",-1)),b("span",FR,Z(o.value.hostname),1),O[4]||(O[4]=b("span",{class:"sys-key"},"IP Address",-1)),b("span",zR,Z(o.value.ip),1),O[5]||(O[5]=b("span",{class:"sys-key"},"User",-1)),b("span",UR,Z(o.value.user),1),O[6]||(O[6]=b("span",{class:"sys-key"},"Node.js",-1)),b("span",WR,Z(o.value.nodeVersion),1),O[7]||(O[7]=b("span",{class:"sys-key"},"OpenBridge",-1)),b("span",jR,"v"+Z(((de=oe(t).health)==null?void 0:de.version)??"—"),1),O[8]||(O[8]=b("span",{class:"sys-key"},"Config",-1)),b("span",KR,Z(o.value.configPath),1),O[9]||(O[9]=b("span",{class:"sys-key"},"OB plugins",-1)),b("span",qR,Z(o.value.obPluginsDir),1),O[10]||(O[10]=b("span",{class:"sys-key"},"HB plugins",-1)),b("span",GR,Z(o.value.hbPluginsDir),1)])):(g(),E("div",YR,[q(U,{name:oe(Dn),size:16},null,8,["name"]),O[11]||(O[11]=ce(" Loading... ",-1))]))]}),_:1}),q(j,{class:"plugins-card"},{default:te(()=>[b("div",XR,[O[13]||(O[13]=ce(" Plugins ",-1)),b("span",JR,[q(re,{variant:"green"},{default:te(()=>[ce(Z(oe(t).runningCount)+" running",1)]),_:1}),oe(t).errorCount?(g(),E("span",QR,Z(oe(t).errorCount)+" error",1)):F("",!0)])]),oe(t).plugins.length===0?(g(),E("div",eD,"No plugins loaded yet.")):(g(),E("div",tD,[(g(!0),E(we,null,Ze(oe(t).plugins,de=>(g(),E("div",{key:de.id,class:"plugin-row"},[b("div",{class:Te(["plugin-dot",de.status])},null,2),b("span",iD,Z(de.manifest.name),1),b("span",rD,"v"+Z(de.manifest.version),1),de.source==="homebridge"?(g(),he(re,{key:0,variant:"orange",size:"sm"},{default:te(()=>[...O[14]||(O[14]=[ce("HB",-1)])]),_:1})):F("",!0),q(re,{variant:r(de.status),size:"sm"},{default:te(()=>[ce(Z(de.status),1)]),_:2},1032,["variant"])]))),128))]))]),_:1})]),b("div",sD,[q(j,{class:"metric-card"},{default:te(()=>{var de,pe;return[b("div",nD,[b("div",aD,[q(U,{name:oe(mR),size:13},null,8,["name"])]),O[15]||(O[15]=b("span",{class:"metric-title"},"CPU",-1))]),b("div",oD,[b("div",lD,[ce(Z(((de=p.value)==null?void 0:de.cpu)??"—")+" ",1),O[16]||(O[16]=b("span",{class:"metric-unit"},"%",-1))]),(pe=p.value)!=null&&pe.cpuTemp&&p.value.cpuTemp>0?(g(),E("div",cD,Z(p.value.cpuTemp)+"°C",1)):F("",!0)]),b("div",uD,[q(Q,{data:f.value,color:"var(--nb-c-primary)",height:40},null,8,["data"])])]}),_:1}),q(j,{class:"metric-card"},{default:te(()=>[b("div",hD,[b("div",dD,[q(U,{name:oe(vR),size:13},null,8,["name"])]),O[17]||(O[17]=b("span",{class:"metric-title"},"Memory",-1))]),b("div",fD,[b("div",pD,[ce(Z(x.value)+" ",1),O[18]||(O[18]=b("span",{class:"metric-unit"},"%",-1))]),b("div",_D,Z(P.value)+" / "+Z(D.value),1)]),q(ie,{value:x.value,max:100,size:"sm"},null,8,["value"]),b("div",mD,[q(Q,{data:m.value,color:"var(--nb-c-info)",height:32},null,8,["data"])])]),_:1}),q(j,{class:"metric-card"},{default:te(()=>[b("div",gD,[b("div",vD,[q(U,{name:oe(yR),size:13},null,8,["name"])]),O[19]||(O[19]=b("span",{class:"metric-title"},"Uptime",-1))]),b("div",bD,[b("div",yD,[b("span",wD,Z(o.value?V(o.value.uptimeSystem):"—"),1),O[20]||(O[20]=b("span",{class:"uptime-label"},"System",-1))]),O[22]||(O[22]=b("div",{class:"uptime-divider"},null,-1)),b("div",SD,[b("span",CD,Z(o.value?V(o.value.uptimeProcess):"—"),1),O[21]||(O[21]=b("span",{class:"uptime-label"},"Process",-1))])]),b("div",kD,[q(G,{variant:"secondary",size:"sm",outlined:"",style:{width:"100%","justify-content":"center"},loading:s.value,icon:n.value?bs:s.value?ll:Xs,onClick:a},{default:te(()=>[ce(Z(n.value?"Restarted":s.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])])]),_:1}),q(j,{class:"metric-card net-card"},{default:te(()=>[b("div",AD,[b("div",MD,[q(U,{name:oe(Du),size:13},null,8,["name"])]),O[23]||(O[23]=b("span",{class:"metric-title"},"Network",-1))]),b("div",LD,[b("div",null,[b("div",ED,Z(p.value?L(p.value.netRxSec)+"/s":"—"),1),O[24]||(O[24]=b("div",{class:"net-label"},"↓ Received",-1))]),b("div",null,[b("div",$D,Z(p.value?L(p.value.netTxSec)+"/s":"—"),1),O[25]||(O[25]=b("div",{class:"net-label"},"↑ Sent",-1))])]),b("div",xD,[q(Q,{data:_.value,color:"var(--nb-c-success)",height:28},null,8,["data"]),q(Q,{data:y.value,color:"var(--nb-c-warning)",height:28},null,8,["data"])])]),_:1})])])}}}),ND=jt(TD,[["__scopeId","data-v-d9b075b5"]]),ya=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},HD=ya("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"/>'),PD=ya("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"/>'),r8=ya("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"/>'),OD=ya("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"/>'),ID=ya("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"/>'),RD=ya("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"/>'),DD="arrow-clockwise",VD=Object.freeze(Object.defineProperty({__proto__:null,bold:OD,default:r8,duotone:RD,fill:ID,glyphName:DD,light:PD,regular:r8,thin:HD},Symbol.toStringTag,{value:"Module"})),Fg=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),wa=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},BD=wa("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"/>'),ZD=wa("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"/>'),s8=wa("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"/>'),FD=wa("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"/>'),zD=wa("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"/>'),UD=wa("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"/>'),WD="list",zg=Object.freeze(Object.defineProperty({__proto__:null,bold:FD,default:s8,duotone:UD,fill:zD,glyphName:WD,light:ZD,regular:s8,thin:BD},Symbol.toStringTag,{value:"Module"})),Sa=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},jD=Sa("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"/>'),KD=Sa("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"/>'),n8=Sa("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"/>'),qD=Sa("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"/>'),GD=Sa("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"/>'),YD=Sa("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"/>'),XD="squares-four",Ug=Object.freeze(Object.defineProperty({__proto__:null,bold:qD,default:n8,duotone:YD,fill:GD,glyphName:XD,light:KD,regular:n8,thin:jD},Symbol.toStringTag,{value:"Module"})),JD={key:0,class:"plugin-cards"},QD={class:"plugin-avatar"},eV=["src","alt"],tV={class:"plugin-meta"},iV={class:"plugin-name"},rV={key:0,class:"plugin-platform"},sV={class:"plugin-version"},nV={key:0,class:"plugin-desc"},aV={key:1,class:"plugin-author"},oV={key:2,class:"plugin-links"},lV=["href"],cV=["href"],uV={key:3,class:"plugin-error"},hV={class:"cell-name"},dV={class:"plugin-avatar plugin-avatar--sm"},fV=["src","alt"],pV={class:"plugin-name"},_V={key:0,class:"plugin-platform"},mV=Re({__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=X({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=Y(()=>{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=qn,d=Xi,f=yl,m=B4;return e.view==="cards"?(g(),E("div",JD,[(g(!0),E(we,null,Ze(e.rows,_=>(g(),he(f,{key:_.plugin.id,class:Te(["plugin-card",{"plugin-card--selected":_.plugin.id===e.selectedId}]),onClick:y=>r("select",_.plugin)},{default:te(()=>[b("span",{class:Te(["plugin-card__accent",`plugin-card__accent--${_.plugin.status}`])},null,2),q(d,{dir:"row",align:"start",gap:"sm",class:"plugin-card__header"},{default:te(()=>[b("div",QD,[_.avatarUrl?(g(),E("img",{key:0,src:_.avatarUrl,alt:_.plugin.manifest.name,onError:c[0]||(c[0]=y=>y.target.style.display="none")},null,40,eV)):(g(),he(u,{key:1,name:_.isOpenBridge?oe(yn):oe(en),size:20},null,8,["name"]))]),b("div",tV,[b("div",iV,Z(_.plugin.manifest.name),1),_.plugin.source==="homebridge"&&_.plugin.platformName?(g(),E("div",rV," Platform: "+Z(_.plugin.platformName),1)):F("",!0),b("div",sV,[ce(" v"+Z(_.plugin.manifest.version)+" ",1),_.plugin.availableUpdate?(g(),he(h,{key:0,variant:"blue",size:"sm"},{default:te(()=>[ce(" v"+Z(_.plugin.availableUpdate)+" available ",1)]),_:2},1024)):F("",!0)])]),q(h,{variant:s(_.plugin.status)},{default:te(()=>[ce(Z(_.plugin.status),1)]),_:2},1032,["variant"])]),_:2},1024),_.plugin.manifest.description?(g(),E("p",nV,Z(_.plugin.manifest.description),1)):F("",!0),_.plugin.manifest.author?(g(),E("p",aV,"by "+Z(_.plugin.manifest.author),1)):F("",!0),_.sponsorUrl||_.docsUrl?(g(),E("div",oV,[_.sponsorUrl?(g(),E("a",{key:0,href:_.sponsorUrl,target:"_blank",rel:"noopener",onClick:c[1]||(c[1]=lt(()=>{},["stop"]))},[q(u,{name:oe(Vg),weight:"fill",size:11},null,8,["name"]),c[6]||(c[6]=ce(" Sponsor ",-1))],8,lV)):F("",!0),_.docsUrl?(g(),E("a",{key:1,href:_.docsUrl,target:"_blank",rel:"noopener",onClick:c[2]||(c[2]=lt(()=>{},["stop"]))},[q(u,{name:oe(Bg),size:11},null,8,["name"]),c[7]||(c[7]=ce(" Docs ",-1))],8,cV)):F("",!0)])):F("",!0),_.plugin.error?(g(),E("div",uV,Z(_.plugin.error),1)):F("",!0)]),_:2},1032,["class","onClick"]))),128))])):(g(),he(m,{key:1,columns:a,rows:o.value,"row-key":"id",size:"sm",zebra:"","sort-state":n.value,onSort:c[4]||(c[4]=_=>n.value=_),onRowClick:c[5]||(c[5]=_=>r("select",_.plugin))},{"cell-name":te(({row:_})=>[b("div",hV,[b("div",dV,[_.avatarUrl?(g(),E("img",{key:0,src:_.avatarUrl,alt:_.name,onError:c[3]||(c[3]=y=>y.target.style.display="none")},null,40,fV)):(g(),he(u,{key:1,name:_.isOpenBridge?oe(yn):oe(en),size:14},null,8,["name"]))]),b("div",null,[b("div",pV,Z(_.name),1),_.platform?(g(),E("div",_V,"Platform: "+Z(_.platform),1)):F("",!0)])])]),"cell-version":te(({row:_})=>[ce(Z(_.version)+" ",1),_.availableUpdate?(g(),he(h,{key:0,variant:"blue",size:"sm"},{default:te(()=>[ce("v"+Z(_.availableUpdate),1)]),_:2},1024)):F("",!0)]),"cell-status":te(({row:_})=>[q(h,{variant:s(_.status)},{default:te(()=>[ce(Z(_.status),1)]),_:2},1032,["variant"])]),_:1},8,["rows","sort-state"]))}}}),gV=jt(mV,[["__scopeId","data-v-8fdf7ec9"]]),vV={class:"plugins-view"},bV={key:0,class:"empty-state"},yV={key:0},a8="openbridge.plugins.view",wV=Re({__name:"PluginsView",setup(e){const t=Ls(),i=Sl(),r=nn(),s=Zg(),n=X(""),a=X(new Map),o=X(new Set),l=X(!1),c=X(localStorage.getItem(a8)==="table"?"table":"cards");function u(){c.value=c.value==="cards"?"table":"cards",localStorage.setItem(a8,c.value)}const h=Y(()=>{var P;return i.visible&&i.mode==="plugin"?((P=i.selectedPlugin)==null?void 0:P.id)??null:null}),d=Y(()=>_().map(P=>{const D=C(P);return{plugin:P,avatarUrl:$(P),isOpenBridge:p(P),sponsorUrl:D==null?void 0:D.githubSponsorsUrl,docsUrl:D==null?void 0:D.documentationUrl}}));function f(P){if(P.source==="homebridge"){const x=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/);if(x!=null&&x[1])return x[1]}return P.manifest.name}function m(P){var O;const x=(O=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/))==null?void 0:O[1],H=[f(P),x,P.manifest.name,P.id];return Array.from(new Set(H.filter(U=>!!U&&U.trim().length>0)))}function _(){const P=n.value.toLowerCase();return t.plugins.filter(D=>D.manifest.name.toLowerCase().includes(P)||(D.manifest.description??"").toLowerCase().includes(P))}function y(P){var D;((D=i.selectedPlugin)==null?void 0:D.id)===P.id&&i.visible&&i.mode==="plugin"?i.close():i.openPlugin(P)}function p(P){return P.manifest.name.includes("openbridge-")||P.source==="native"}function C(P){const D=m(P);for(const x of D){const H=a.value.get(x);if(H)return H}if(P.enrichedMetadata)return P.enrichedMetadata}async function S(P,D=!1){var H;const x=m(P);for(const O of x)if(!(!D&&a.value.has(O))&&!(!D&&o.value.has(O))){o.value.add(O);try{const U=await Ie.marketplace.enriched(O),j=new Map(a.value);if(j.set(O,U),j.set(f(P),U),a.value=j,P.enrichedMetadata=U,U.documentationUrl||U.githubSponsorsUrl||(H=U.links)!=null&&H.repository)return}catch{}finally{const U=new Set(o.value);U.delete(O),o.value=U}}}const v=X(new Map);function k(P){const x=P.trim().replace(/^github:/,"https://github.com/").replace(/^git\+/,"").replace(/^git@github\.com:/,"https://github.com/").match(/github\.com[/:]([^/]+)/);return x?`https://github.com/${x[1]}.png?size=48`:null}function $(P){var O,U;const D=C(P),x=((O=D==null?void 0:D.links)==null?void 0:O.repository)??((U=D==null?void 0:D.links)==null?void 0:U.homepage)??"";if(x){const j=k(x);if(j)return j}const H=m(P);for(const j of H){const re=v.value.get(j);if(re)return re}return null}async function L(P,D=!1){var x;if(!(!D&&v.value.has(P)))try{const H=await fetch(`https://registry.npmjs.org/${encodeURIComponent(P)}/latest`,{signal:AbortSignal.timeout(5e3)});if(!H.ok){v.value.set(P,"");return}const O=await H.json(),U=((x=O==null?void 0:O.repository)==null?void 0:x.url)??(O==null?void 0:O.homepage)??"";v.value.set(P,k(U)??"")}catch{v.value.set(P,"")}}async function V(P=!1){if(!l.value){l.value=!0;try{P&&(a.value=new Map,v.value=new Map);const D=t.plugins;for(const x of D){const H=m(x);for(const O of H)await L(O,P);await S(x,P)}P&&s.success("Plugin metadata refreshed")}catch{s.error("Failed to refresh plugin metadata")}finally{l.value=!1}}}return ut(async()=>{await t.fetchPlugins()}),Ue(()=>t.plugins.length,P=>{r.setPage("Plugins",P)},{immediate:!0}),(P,D)=>{const x=la,H=ai,O=Ye;return g(),E("div",vV,[(g(),he(gr,{defer:"",to:"#ob-topbar-right"},[q(x,{modelValue:n.value,"onUpdate:modelValue":D[0]||(D[0]=U=>n.value=U),placeholder:"Search plugins...",size:"sm",style:{width:"200px"}},null,8,["modelValue"]),q(H,{variant:"ghost",size:"sm",icon:VD,title:"Refresh metadata",loading:l.value,disabled:l.value,onClick:D[1]||(D[1]=U=>V(!0))},null,8,["loading","disabled"]),q(H,{variant:"ghost",size:"sm",icon:c.value===Fg?zg:Ug,title:c.value==="cards"?"Show as table":"Show as cards",onClick:u},null,8,["icon","title"]),q(H,{variant:"primary",size:"sm",icon:Ef,onClick:D[2]||(D[2]=U=>oe(i).openMarketplace())},{default:te(()=>[...D[5]||(D[5]=[ce(" Browse plugins ",-1)])]),_:1})])),d.value.length===0?(g(),E("div",bV,[q(O,{name:oe(en),size:40},null,8,["name"]),n.value?(g(),E("p",yV,'No plugins matching "'+Z(n.value)+'"',1)):(g(),E(we,{key:1},[D[7]||(D[7]=b("p",null,"No plugins loaded yet.",-1)),q(H,{variant:"primary",size:"sm",icon:Ef,onClick:D[3]||(D[3]=U=>oe(i).openMarketplace())},{default:te(()=>[...D[6]||(D[6]=[ce(" Browse & install plugins ",-1)])]),_:1})],64))])):(g(),E("div",{key:1,class:"plugins-body",onClick:D[4]||(D[4]=lt(U=>oe(i).close(),["self"]))},[q(gV,{rows:d.value,view:c.value,"selected-id":h.value,onSelect:y},null,8,["rows","view","selected-id"])]))])}}}),SV=jt(wV,[["__scopeId","data-v-95e3ebc4"]]),Ca=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},CV=Ca("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"/>'),kV=Ca("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"/>'),Vu=Ca("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"/>'),AV=Ca("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"/>'),MV=Ca("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"/>'),LV=Ca("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"/>'),EV="devices",$V=Object.freeze(Object.defineProperty({__proto__:null,bold:AV,default:Vu,duotone:LV,fill:MV,glyphName:EV,light:kV,regular:Vu,thin:CV},Symbol.toStringTag,{value:"Module"})),xV={class:"devices-view"},TV={class:"toolbar-count"},NV={key:1,class:"empty-state"},HV={class:"device-icon native-icon"},PV={class:"device-info"},OV={class:"device-name"},IV={class:"device-type"},RV={class:"device-summary"},DV={key:0,class:"summary-primary"},VV={class:"summary-primary"},BV={key:0,class:"summary-secondary"},ZV={key:2,class:"summary-primary"},FV=["title"],zV={class:"device-info"},UV={class:"device-name"},WV={class:"device-type"},jV={key:0,class:"device-summary"},KV={class:"summary-primary"},qV=["title"],GV=["title"],YV={key:1},XV={class:"confirm-dialog"},JV={class:"confirm-icon"},QV={class:"confirm-message"},eB={class:"confirm-actions"},o8="openbridge.devices.view",tB=Re({__name:"DevicesView",setup(e){const t=Ls(),i=Sl(),r=wl();function s(N){var T;return((T=N.health)==null?void 0:T.status)==="stale"}function n(N){return N<90?`${Math.round(N)} seconds`:N<5400?`${Math.round(N/60)} minutes`:N<172800?`${Math.round(N/3600)} hours`:`${Math.round(N/86400)} days`}function a(N){const T=N.health;if(!T||T.status!=="stale")return"";const K=["Not responding"];return T.silentForSeconds!==null?K.push(`Silent for ${n(T.silentForSeconds)}.`):T.lastSeen&&K.push(`Last seen ${new Date(T.lastSeen).toLocaleString()}.`),T.reason&&K.push(T.reason),K.push("OpenBridge is running: the device itself is not answering. Check it is powered and reachable at its configured address.","Click to open it for its address, readings and recent events."),K.join(`
67
+ `},J6=xH(PH)(Pg),OH={config:NH},IH=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 Og(e,t){return Object.keys(t).forEach(function(i){t[i]instanceof Object&&e[i]&&Object.assign(t[i],Og(e[i],t[i]))}),G6(G6({},e),t)}var RH={type:"cancelation",msg:"operation is manually canceled"};function _1(e){var t=!1,i=new Promise(function(r,s){e.then(function(n){return t?s(RH):r(n)}),e.catch(s)});return i.cancel=function(){return t=!0},i}var DH=["monaco"],VH=EH.create({config:$H,isInitialized:!1,resolve:null,reject:null,monaco:null}),Ig=uH(VH,2),kl=Ig[0],xc=Ig[1];function BH(e){var t=OH.config(e),i=t.monaco,r=lH(t,DH);xc(function(s){return{config:Og(s.config,r),monaco:i}})}function ZH(){var e=kl(function(t){var i=t.monaco,r=t.isInitialized,s=t.resolve;return{monaco:i,isInitialized:r,resolve:s}});if(!e.isInitialized){if(xc({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),_1(m1);if(window.monaco&&window.monaco.editor)return Rg(window.monaco),e.resolve(window.monaco),_1(m1);IH(FH,UH)(WH)}return _1(m1)}function FH(e){return document.body.appendChild(e)}function zH(e){var t=document.createElement("script");return e&&(t.src=e),t}function UH(e){var t=kl(function(r){var s=r.config,n=r.reject;return{config:s,reject:n}}),i=zH("".concat(t.config.paths.vs,"/loader.js"));return i.onload=function(){return e()},i.onerror=t.reject,i}function WH(){var e=kl(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;Rg(r),e.resolve(r)},function(i){e.reject(i)})}function Rg(e){kl().monaco||xc({monaco:e})}function jH(){return kl(function(e){var t=e.monaco;return t})}var m1=new Promise(function(e,t){return xc({resolve:e,reject:t})}),Dg={config:BH,init:ZH,__getMonacoInstance:jH};const KH={key:0,class:"monaco-skeleton"},qH=Re({__name:"MonacoJsonEditor",props:{modelValue:{},height:{}},emits:["update:modelValue"],setup(e,{emit:t}){const i=e,r=t,{resolved:s}=vd(),n=X(null),a=Cr(null),o=X(!1);let l=!1;return ut(async()=>{const c=await Dg.init();n.value&&(Ue(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)}),Ki(()=>{var c;(c=a.value)==null||c.dispose()}),Ue(()=>i.modelValue,c=>{if(!a.value)return;a.value.getValue()!==c&&(l=!0,a.value.setValue(c),l=!1)}),(c,u)=>(g(),E("div",{style:Si({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?F("",!0):(g(),E("div",KH))],4))}}),Q6=jt(qH,[["__scopeId","data-v-0c34d464"]]),GH={class:"pcf-root"},YH={key:1,class:"pcf-no-schema"},XH=Re({__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 m=f;for(let _=0;_<h.length-1;_++)(m[h[_]]===void 0||typeof m[h[_]]!="object")&&(m[h[_]]={}),m=m[h[_]];m[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)??[],m=d.default??(a(d)==="string"?"":a(d)==="number"?0:"");s(h,[...f,m])}function l(h,d){const f=[...n(h)??[]];f.splice(d,1),s(h,f)}function c(h,d,f){const m=[...n(h)??[]];m[d]=f,s(h,m)}const u=Y(()=>i.hbSchema.schema??{type:"object",properties:{}});return(h,d)=>{const f=jo("PluginConfigField");return g(),E("div",GH,[u.value.properties?(g(!0),E(we,{key:0},Ze(u.value.properties,(m,_)=>{var y;return g(),he(f,{key:_,"field-key":String(_),field:m,path:[String(_)],required:((y=u.value.required)==null?void 0:y.includes(String(_)))??!1,value:n([String(_)]),onChange:p=>s([String(_)],p),onAddArray:d[0]||(d[0]=(p,C)=>o(p,C)),onRemoveArray:d[1]||(d[1]=(p,C)=>l(p,C)),onUpdateArray:d[2]||(d[2]=(p,C,S)=>c(p,C,S))},null,8,["field-key","field","path","required","value","onChange"])}),128)):(g(),E("div",YH,"No configurable fields found in schema."))])}}}),JH=jt(XH,[["__scopeId","data-v-d9cf6b0f"]]),QH={key:0,class:"inspector nb-inspector"},eP={class:"inspector-header"},tP={class:"inspector-title"},iP={class:"inspector-name"},rP={class:"inspector-version"},sP={class:"inspector-body"},nP={class:"field-value"},aP={class:"field-value"},oP={class:"hap-bridge-info"},lP={class:"hap-qr"},cP=["src"],uP={class:"hap-details"},hP={class:"field-value mono"},dP={class:"field-value"},fP={class:"field-value"},pP={key:0,class:"setup-loading"},_P={key:0,class:"platform-tabs"},mP=["onClick"],gP={key:1,class:"visual-editor-wrap"},vP={key:0,class:"json-error"},bP={key:1,class:"json-error"},yP={key:3,class:"save-error"},wP={class:"setup-actions"},SP={key:0,class:"json-error"},CP={key:0,class:"save-error"},kP={class:"setup-actions"},AP={class:"import-export-row"},MP={class:"plugin-device-name"},LP={class:"plugin-device-type"},EP={class:"field-value"},$P={class:"field-value"},xP={class:"field-value"},TP={class:"field-value"},NP={class:"error-text"},HP={class:"plog-time"},PP={class:"plog-msg"},e8="openbridge.pluginInspector.sections",OP=Re({__name:"PluginInspector",setup(e){const t=Ls(),i=X(!1),r=X("");async function s(){if(!i.value){i.value=!0;try{await Ie.daemon.restart();let M=0;const R=setInterval(async()=>{M++;try{await Ie.health(),clearInterval(R),location.reload()}catch{}M>60&&(clearInterval(R),i.value=!1)},1e3)}catch{i.value=!1}}}const n=Sl(),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=X({...o});try{const M=JSON.parse(localStorage.getItem(e8)??"{}");l.value={...o,...M}}catch{}Ue(l,M=>localStorage.setItem(e8,JSON.stringify(M)),{deep:!0}),Ue(()=>{var M,R;return(R=(M=n.selectedPlugin)==null?void 0:M.hapBridge)==null?void 0:R.setupURI},async M=>{if(M)try{r.value=await va.toDataURL(M,{width:160,margin:1})}catch{r.value=""}else r.value=""},{immediate:!0});const c=Y(()=>{const M=n.selectedPlugin;return M!=null&&M.devices?Object.values(M.devices):[]}),u={switch:"plugs",light:"lamp",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"};function h(M){return u[M]??"cube"}const d={idle:"Idle",loading:"Loading",running:"Running",stopped:"Stopped",error:"Error"},f=X(!1);async function m(){if(!(!n.selectedPlugin||f.value)){f.value=!0;try{await Ie.marketplace.update(n.selectedPlugin.manifest.name),await t.fetchPlugins(),await s()}catch(M){console.error("Failed to update plugin:",M)}finally{f.value=!1}}}const _=X(!1),y=X(!1);async function p(){if(!(!n.selectedPlugin||y.value)){y.value=!0;try{await Ie.marketplace.uninstall(n.selectedPlugin.manifest.name),await t.fetchPlugins(),n.close(),await Ie.daemon.restart()}catch(M){console.error("Failed to remove plugin:",M)}finally{y.value=!1,_.value=!1}}}const C=X(!1);async function S(){if(!n.selectedPlugin||C.value)return;const M=!n.selectedPlugin.disabled;C.value=!0;try{const R=await Ie.setPluginDisabled(n.selectedPlugin.id,M);n.selectedPlugin.disabled=R.disabled}catch(R){console.error("Failed to toggle plugin disabled state:",R)}finally{C.value=!1}}const v=X(null),k=X(!1),$=X(""),L=X(""),V=X(!1),P=X(null),D=X(!1),x=X(null),H=X({}),O=X("visual"),U=Y(()=>{var M;return((M=x.value)==null?void 0:M.schema)!=null}),j=Y(()=>{var M;return((M=n.selectedPlugin)==null?void 0:M.source)==="homebridge"}),re=Y(()=>n.selectedPlugin!=null&&n.selectedPlugin.source!=="homebridge"),Q=X(""),ie=X(!1),G=X(null),de=X(!1),pe=Y(()=>{try{return JSON.parse(Q.value),!0}catch{return!1}});Ue(()=>n.selectedPlugin,async M=>{if(Q.value="",G.value=null,de.value=!1,!(!M||M.source==="homebridge"))try{const R=await Ie.config.getPlugin(M.manifest.name);Q.value=JSON.stringify(R.config??{},null,2)}catch{Q.value="{}"}});const _e=X(null);function Ne(){var M;(M=_e.value)==null||M.click()}function Le(){if(!n.selectedPlugin)return;const M=n.selectedPlugin.manifest.name,R=j.value?L.value:Q.value;if(!R)return;const z=new Blob([R],{type:"application/json"}),W=URL.createObjectURL(z),se=document.createElement("a");se.href=W,se.download=`${M.replace(/[^a-z0-9-]/gi,"-")}-config.json`,se.click(),URL.revokeObjectURL(W)}async function ye(M){var z;const R=(z=M.target.files)==null?void 0:z[0];if(!(!R||!n.selectedPlugin))try{const W=await R.text(),se=JSON.parse(W);let Se;if(se.platform&&typeof se.platform=="string"){const{plugin:xe,...De}=se;Se=De}else Se=se;await Ie.config.savePlugin(n.selectedPlugin.manifest.name,Se),j.value?L.value=JSON.stringify(Se,null,2):Q.value=JSON.stringify(Se,null,2),_e.value&&(_e.value.value="")}catch(W){console.error("Import failed:",W)}}async function ge(){if(ie.value||!n.selectedPlugin)return;let M;try{M=JSON.parse(Q.value)}catch{G.value="Invalid JSON: fix the syntax first";return}ie.value=!0,G.value=null,de.value=!1;try{await Ie.config.savePlugin(n.selectedPlugin.manifest.name,M),de.value=!0,setTimeout(()=>{de.value=!1},3e3)}catch(R){G.value=String(R)}finally{ie.value=!1}}const I=Y(()=>{const M=n.selectedPlugin;return!M||M.source!=="homebridge"?"":M.platformName??M.id??M.manifest.name});Ue(()=>n.selectedPlugin,async M=>{if(v.value=null,$.value="",L.value="",x.value=null,H.value={},P.value=null,D.value=!1,!(!M||M.source!=="homebridge")){k.value=!0;try{const R=await Ie.config.getHbPlugin(I.value,M.packageName);if(R.config){$.value=I.value,L.value=JSON.stringify(R.config,null,2),H.value=R.config,await ee(M.manifest.name);return}const z=await Ie.pluginInfo(M.packageName??M.manifest.name);v.value=z,z.platforms.length>0&&await ne(z.platforms[0],z.mainFile),await ee(M.manifest.name)}catch{try{const R=await Ie.config.getHbPlugin(I.value,M.packageName);R.config&&($.value=I.value,L.value=JSON.stringify(R.config,null,2),H.value=R.config)}catch{}}finally{k.value=!1}}});async function ee(M){try{const R=await fetch(`/api/marketplace/plugin-schema/${encodeURIComponent(M)}`);if(R.ok){const z=await R.json();x.value=z.schema}}catch{}}async function ne(M,R){var z,W;$.value=M;try{const se=await Ie.config.getPlatform(M),Se=se.config?se.config:{platform:M,plugin:R??((z=v.value)==null?void 0:z.mainFile)??""};L.value=JSON.stringify(Se,null,2),H.value=Se}catch{const se={platform:M,plugin:R??((W=v.value)==null?void 0:W.mainFile)??""};L.value=JSON.stringify(se,null,2),H.value=se}}function ve(M){H.value=M,L.value=JSON.stringify(M,null,2)}function ke(M){L.value=M;try{H.value=JSON.parse(M)}catch{}}function N(){try{return JSON.parse(L.value)}catch{return null}}const T=Y(()=>N()!==null),K=Y(()=>{const M=N();return M!==null&&typeof M.platform!="string"}),J=X([]),le=X(null);let ue=null;function w(){if(ue&&(ue.close(),ue=null),!n.selectedPlugin)return;const M=location.protocol==="https:"?"wss:":"ws:";ue=new WebSocket(`${M}//${location.host}/ws/logs`),ue.onmessage=R=>{var z,W;try{const se=JSON.parse(R.data);(se.plugin===((z=n.selectedPlugin)==null?void 0:z.id)||se.plugin===((W=n.selectedPlugin)==null?void 0:W.manifest.name))&&(J.value=[...J.value.slice(-199),se],setTimeout(()=>{le.value&&(le.value.scrollTop=le.value.scrollHeight)},10))}catch{}},ue.onclose=()=>{n.selectedPlugin&&setTimeout(w,3e3)}}Ue(()=>n.selectedPlugin,async M=>{if(J.value=[],ue==null||ue.close(),ue=null,!!M){try{const R=await Ie.logs(M.manifest.name,100);J.value=R.entries,setTimeout(()=>{le.value&&(le.value.scrollTop=le.value.scrollHeight)},20)}catch{}w()}}),ut(()=>{n.selectedPlugin&&w()}),Ki(()=>{ue==null||ue.close()});const A={debug:"var(--nb-c-text-muted)",info:"var(--nb-c-info)",warn:"var(--nb-c-warning)",error:"var(--nb-c-danger)"};async function B(){if(V.value||!n.selectedPlugin)return;const M=N();if(!M){P.value="Invalid JSON: fix the syntax first";return}V.value=!0,P.value=null,D.value=!1;try{const R=n.selectedPlugin;R.source==="homebridge"?await Ie.config.saveHbPlugin(I.value,M,R.packageName):await Ie.config.savePlugin(R.manifest.name,M),D.value=!0,setTimeout(()=>{D.value=!1},3e3)}catch(R){P.value=String(R)}finally{V.value=!1}}return(M,R)=>{const z=Ye,W=md,se=bc,Se=gd,xe=ai,De=mc,Xe=w$;return oe(n).selectedPlugin?(g(),E("div",QH,[b("div",eP,[b("div",{class:Te(["inspector-avatar",oe(n).selectedPlugin.status])},[q(z,{name:oe(en),size:24},null,8,["name"])],2),b("div",tP,[b("h2",iP,Z(oe(n).selectedPlugin.manifest.name),1),b("span",rP,"v"+Z(oe(n).selectedPlugin.manifest.version),1)])]),b("div",sP,[q(Se,{size:l.value.status,"onUpdate:size":R[0]||(R[0]=$e=>l.value.status=$e),title:"Status",fluid:""},{default:te(()=>[q(W,{label:"Status",control:"fit"},{default:te(()=>[b("span",{class:Te(["status-badge",oe(n).selectedPlugin.status])},Z(d[oe(n).selectedPlugin.status]),3)]),_:1}),oe(n).selectedPlugin.startedAt?(g(),he(W,{key:0,label:"Started",control:"fit"},{default:te(()=>[b("span",nP,Z(new Date(oe(n).selectedPlugin.startedAt).toLocaleString()),1)]),_:1})):F("",!0),oe(n).selectedPlugin.stoppedAt?(g(),he(W,{key:1,label:"Stopped",control:"fit"},{default:te(()=>[b("span",aP,Z(new Date(oe(n).selectedPlugin.stoppedAt).toLocaleString()),1)]),_:1})):F("",!0),q(W,{label:"Disabled",control:"fit"},{default:te(()=>[q(se,{name:`plugin-disabled-${oe(n).selectedPlugin.id}`,"model-value":oe(n).selectedPlugin.disabled??!1,disabled:C.value,"onUpdate:modelValue":S},null,8,["name","model-value","disabled"])]),_:1})]),_:1},8,["size"]),oe(n).selectedPlugin.hapBridge?(g(),he(Se,{key:0,size:l.value.hap,"onUpdate:size":R[1]||(R[1]=$e=>l.value.hap=$e),title:"HomeKit pairing",fluid:""},{default:te(()=>[b("div",oP,[b("div",lP,[r.value?(g(),E("img",{key:0,src:r.value,alt:"HomeKit QR Code",class:"hap-qr-img"},null,8,cP)):F("",!0)]),b("div",uP,[q(W,{label:"PIN",control:"fit"},{default:te(()=>[b("span",hP,Z(oe(n).selectedPlugin.hapBridge.pincode),1)]),_:1}),q(W,{label:"Port",control:"fit"},{default:te(()=>[b("span",dP,Z(oe(n).selectedPlugin.hapBridge.port),1)]),_:1}),q(W,{label:"Bridge",control:"fit"},{default:te(()=>[b("span",fP,Z(oe(n).selectedPlugin.hapBridge.name),1)]),_:1})])]),R[15]||(R[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"])):F("",!0),oe(n).selectedPlugin.availableUpdate?(g(),he(Se,{key:1,size:l.value.update,"onUpdate:size":R[2]||(R[2]=$e=>l.value.update=$e),title:"Update",fluid:""},{default:te(()=>[q(De,{status:"info",icon:wd,title:`Version ${oe(n).selectedPlugin.availableUpdate} is available`},{action:te(()=>[q(xe,{variant:"primary",size:"sm",loading:f.value,disabled:f.value,onClick:m},{default:te(()=>[ce(Z(f.value?"Updating...":"Update"),1)]),_:1},8,["loading","disabled"])]),default:te(()=>[ce(" Currently on "+Z(oe(n).selectedPlugin.manifest.version)+". ",1)]),_:1},8,["title"])]),_:1},8,["size"])):F("",!0),q(Se,{size:l.value.manage,"onUpdate:size":R[5]||(R[5]=$e=>l.value.manage=$e),title:"Manage",fluid:""},{default:te(()=>[_.value?(g(),he(De,{key:1,status:"error",title:"This uninstalls the plugin and removes its configuration"},{action:te(()=>[q(xe,{variant:"ghost",size:"sm",onClick:R[4]||(R[4]=$e=>_.value=!1)},{default:te(()=>[...R[17]||(R[17]=[ce("Cancel",-1)])]),_:1}),q(xe,{variant:"primary",size:"sm",loading:y.value,style:{background:"var(--nb-c-danger)","border-color":"var(--nb-c-danger)"},onClick:p},{default:te(()=>[...R[18]||(R[18]=[ce(" Remove ",-1)])]),_:1},8,["loading"])]),default:te(()=>[R[19]||(R[19]=ce(" OpenBridge needs a restart afterwards. ",-1))]),_:1})):(g(),he(xe,{key:0,variant:"ghost",size:"sm",icon:Sd,style:{color:"var(--nb-c-danger)"},onClick:R[3]||(R[3]=$e=>_.value=!0)},{default:te(()=>[...R[16]||(R[16]=[ce(" Remove plugin ",-1)])]),_:1}))]),_:1},8,["size"]),j.value?(g(),he(Se,{key:2,size:l.value.config,"onUpdate:size":R[7]||(R[7]=$e=>l.value.config=$e),title:"Platform config",fluid:""},{default:te(()=>[k.value?(g(),E("div",pP,[q(z,{name:oe(Dn),size:14},null,8,["name"]),R[20]||(R[20]=ce(" Loading config… ",-1))])):(g(),E(we,{key:1},[v.value&&v.value.platforms.length>1?(g(),E("div",_P,[(g(!0),E(we,null,Ze(v.value.platforms,$e=>(g(),E("button",{key:$e,class:Te(["platform-tab",{active:$.value===$e}]),onClick:Nt=>ne($e)},Z($e),11,mP))),128))])):v.value&&v.value.platforms.length===0?(g(),he(De,{key:1,status:"warning",variant:"callout",title:"No platform detected"},{default:te(()=>[...R[21]||(R[21]=[ce(" Add a ",-1),b("code",null,"platforms[]",-1),ce(" entry manually in Config. ",-1)])]),_:1})):F("",!0),!v.value||v.value.platforms.length>0?(g(),E(we,{key:2},[U.value?(g(),he(Xe,{key:0,"model-value":O.value,items:a,variant:"contained",size:"sm","onUpdate:modelValue":R[6]||(R[6]=$e=>O.value=$e)},null,8,["model-value"])):F("",!0),O.value==="visual"&&U.value?(g(),E("div",gP,[q(JH,{"hb-schema":x.value,"model-value":H.value,"onUpdate:modelValue":ve},null,8,["hb-schema","model-value"])])):F("",!0),O.value==="json"||!U.value?(g(),E("div",{key:2,class:Te(["config-editor-wrap",{invalid:L.value&&!T.value}])},[q(Q6,{"model-value":L.value,height:220,"onUpdate:modelValue":ke},null,8,["model-value"]),L.value&&!T.value?(g(),E("div",vP,"Invalid JSON")):K.value?(g(),E("div",bP,'Missing "platform" field')):F("",!0)],2)):F("",!0),P.value?(g(),E("div",yP,[q(z,{name:oe(pr),size:13},null,8,["name"]),ce(" "+Z(P.value),1)])):F("",!0),b("div",wP,[q(xe,{variant:"primary",size:"sm",loading:V.value,disabled:V.value||!T.value||K.value,icon:D.value?bs:B0,onClick:B},{default:te(()=>[ce(Z(D.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),D.value?(g(),he(xe,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?ll:Xs,onClick:s},{default:te(()=>[ce(Z(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):F("",!0)])],64)):F("",!0)],64))]),_:1},8,["size"])):F("",!0),re.value?(g(),he(Se,{key:3,size:l.value.config,"onUpdate:size":R[9]||(R[9]=$e=>l.value.config=$e),title:"Plugin config",fluid:""},{default:te(()=>[b("div",{class:Te(["config-editor-wrap",{invalid:Q.value&&!pe.value}])},[q(Q6,{"model-value":Q.value,height:220,"onUpdate:modelValue":R[8]||(R[8]=$e=>Q.value=$e)},null,8,["model-value"]),Q.value&&!pe.value?(g(),E("div",SP,"Invalid JSON")):F("",!0)],2),G.value?(g(),E("div",CP,[q(z,{name:oe(pr),size:13},null,8,["name"]),ce(" "+Z(G.value),1)])):F("",!0),b("div",kP,[q(xe,{variant:"primary",size:"sm",loading:ie.value,disabled:ie.value||!pe.value,icon:de.value?bs:B0,onClick:ge},{default:te(()=>[ce(Z(de.value?"Saved!":"Save config"),1)]),_:1},8,["loading","disabled","icon"]),de.value?(g(),he(xe,{key:0,variant:"secondary",size:"sm",outlined:"",loading:i.value,icon:i.value?ll:Xs,onClick:s},{default:te(()=>[ce(Z(i.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])):F("",!0)])]),_:1},8,["size"])):F("",!0),q(Se,{size:l.value.transfer,"onUpdate:size":R[10]||(R[10]=$e=>l.value.transfer=$e),title:"Import & export",fluid:""},{default:te(()=>[b("div",AP,[q(xe,{variant:"ghost",size:"sm",icon:cN,onClick:Le},{default:te(()=>[...R[22]||(R[22]=[ce("Export config",-1)])]),_:1}),q(xe,{variant:"ghost",size:"sm",icon:mN,onClick:Ne},{default:te(()=>[...R[23]||(R[23]=[ce("Import config",-1)])]),_:1}),b("input",{ref_key:"importInput",ref:_e,type:"file",accept:".json",style:{display:"none"},onChange:ye},null,544)])]),_:1},8,["size"]),c.value.length>0?(g(),he(Se,{key:4,size:l.value.devices,"onUpdate:size":R[11]||(R[11]=$e=>l.value.devices=$e),title:`Devices (${c.value.length})`,fluid:""},{default:te(()=>[(g(!0),E(we,null,Ze(c.value,$e=>(g(),E("div",{key:$e.id,class:"plugin-device-row"},[q(z,{name:h($e.widgetType),size:14},null,8,["name"]),b("span",MP,Z($e.name),1),b("span",LP,Z($e.widgetType),1)]))),128))]),_:1},8,["size","title"])):F("",!0),q(Se,{size:l.value.manifest,"onUpdate:size":R[12]||(R[12]=$e=>l.value.manifest=$e),title:"Manifest",fluid:""},{default:te(()=>[q(W,{label:"Name",control:"fit"},{default:te(()=>[b("span",EP,Z(oe(n).selectedPlugin.manifest.name),1)]),_:1}),q(W,{label:"Version",control:"fit"},{default:te(()=>[b("span",$P,Z(oe(n).selectedPlugin.manifest.version),1)]),_:1}),oe(n).selectedPlugin.manifest.description?(g(),he(W,{key:0,label:"Description",control:"fit"},{default:te(()=>[b("span",xP,Z(oe(n).selectedPlugin.manifest.description),1)]),_:1})):F("",!0),oe(n).selectedPlugin.manifest.author?(g(),he(W,{key:1,label:"Author",control:"fit"},{default:te(()=>[b("span",TP,Z(oe(n).selectedPlugin.manifest.author),1)]),_:1})):F("",!0)]),_:1},8,["size"]),oe(n).selectedPlugin.error?(g(),he(Se,{key:5,size:l.value.error,"onUpdate:size":R[13]||(R[13]=$e=>l.value.error=$e),title:"Error",fluid:""},{default:te(()=>[q(De,{status:"error"},{default:te(()=>[b("code",NP,Z(oe(n).selectedPlugin.error),1)]),_:1})]),_:1},8,["size"])):F("",!0),J.value.length>0?(g(),he(Se,{key:6,size:l.value.logs,"onUpdate:size":R[14]||(R[14]=$e=>l.value.logs=$e),title:"Recent logs",fluid:""},{default:te(()=>[b("div",{ref_key:"logsEl",ref:le,class:"plugin-log-terminal"},[(g(!0),E(we,null,Ze(J.value,($e,Nt)=>(g(),E("div",{key:Nt,class:"plugin-log-line"},[b("span",HP,Z(new Date($e.timestamp).toLocaleTimeString()),1),b("span",{class:"plog-level",style:Si({color:A[$e.level]})},Z($e.level.toUpperCase()),5),b("span",PP,Z($e.message),1)]))),128))],512)]),_:1},8,["size"])):F("",!0)])])):F("",!0)}}}),IP=jt(OP,[["__scopeId","data-v-b8eb965d"]]),RP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},t8=RP("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"/>'),DP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},yn=DP("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"/>'),VP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},BP=VP("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"/>'),ZP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},FP=ZP("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"/>'),zP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},UP=zP("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"/>'),WP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},Vg=WP("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"/>'),jP=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},Bg=jP("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"/>');let KP=0;function qP(){return`notif-${Date.now()}-${++KP}`}function Zg(){const e=ng();function t(i,r,s){e.add({id:qP(),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 GP={class:"mp-panel"},YP={class:"mp-header"},XP={class:"mp-search-wrap"},JP={key:0,class:"mp-count"},QP={key:3,class:"mp-local-section"},eO={class:"mp-local-heading"},tO={class:"mp-avatar mp-avatar--ob"},iO={class:"mp-info"},rO={class:"mp-name-row"},sO={class:"mp-name"},nO={class:"badge badge--native"},aO={class:"badge badge--local"},oO={class:"mp-ver"},lO={key:0,class:"mp-desc"},cO={class:"mp-meta"},uO={key:0},hO={class:"mp-action"},dO={class:"mp-list"},fO={key:0,class:"mp-loading"},pO=["src","alt"],_O={class:"mp-info"},mO={class:"mp-name-row"},gO={class:"mp-name"},vO={class:"mp-ver"},bO={key:0,class:"mp-desc"},yO={class:"mp-meta"},wO={key:0},SO={key:1,class:"mp-sep"},CO={class:"mp-enriched"},kO={key:0,class:"mp-stat"},AO={key:1,class:"mp-stat"},MO=["href"],LO=["href"],EO=["href"],$O={class:"mp-action"},xO={key:1,class:"mp-load-more-wrap"},TO="https://marketplace.openbridge.nubisco.io",NO=20,HO="https://marketplace.openbridge.nubisco.io/api",PO=Re({__name:"MarketplacePanel",setup(e){const t=Ls(),i=Zg(),r=X(null),s=X(""),n=X([]),a=X(0),o=X(!1),l=X(null),c=X(null),u=X(new Map),h=X(null),d=X(0),f=X([]);function m(x){return{name:x.name,version:x.version,description:x.description??"",author:x.author?{name:x.author}:void 0,date:x.last_published_at,weeklyDownloads:x.weekly_downloads,githubStars:x.github_stars??void 0,githubSponsorsUrl:x.github_sponsors_url??void 0,documentationUrl:x.homepage??void 0,links:{npm:x.npm_url,homepage:x.homepage??void 0,repository:x.repository_url??void 0}}}function _(x){return x?x>=1e6?`${(x/1e6).toFixed(1)}M`:x>=1e3?`${(x/1e3).toFixed(1)}K`:x.toString():"0"}async function y(x=!0){x&&(d.value=0,n.value=[]),o.value=!0,l.value=null;try{const H=d.value+1,O=new URLSearchParams({q:s.value,page:String(H),limit:String(NO)}),U=await fetch(`${HO}/plugins?${O}`);if(!U.ok)throw new Error(`Marketplace API error: ${U.status}`);const j=await U.json(),re=j.plugins.map(m);n.value=x?re:[...n.value,...re],a.value=j.total}catch(H){l.value=String(H)}finally{o.value=!1}}async function p(x){if(!c.value){c.value=x.name,l.value=null;try{const H=await Ie.marketplace.install(x.name);u.value.set(x.name,H.mainFile),h.value={name:x.name,mainFile:H.mainFile},await Ie.pluginsRefresh(),await t.fetchPlugins(),i.success(`Installed ${x.name}`)}catch(H){l.value=`Failed to install ${x.name}: ${H}`,i.error(`Failed to install ${x.name}`)}finally{c.value=null}}}async function C(x){if(!r.value){r.value=x,l.value=null;try{await Ie.marketplace.uninstall(x),u.value.delete(x),await t.fetchPlugins(),i.success(`Removed ${x}`)}catch(H){l.value=`Failed to uninstall ${x}: ${H}`,i.error(`Failed to remove ${x}`)}finally{r.value=null}}}async function S(x){if(!(c.value||!x.platform)){c.value=x.name,l.value=null;try{await Ie.config.savePlugin(x.name,{platform:x.platform}),u.value.set(x.name,`${x.path}/dist/index.js`),h.value={name:x.name,mainFile:`${x.path}/dist/index.js`},await t.fetchPlugins(),i.success(`Activated ${x.name}`)}catch(H){l.value=`Failed to activate ${x.name}: ${H}`,i.error(`Failed to activate ${x.name}`)}finally{c.value=null}}}function v(x){var U,j;const O=(((U=x.links)==null?void 0:U.repository)??((j=x.links)==null?void 0:j.homepage)??"").match(/github\.com\/([^/]+)/);return O?`https://github.com/${O[1]}.png?size=48`:null}function k(x){return x.name.includes("openbridge-")||Array.isArray(x.badges)&&x.badges.includes("openbridge-plugin")}function $(x){return x.author?typeof x.author=="string"?x.author:x.author.name??"":""}function L(x){const H=Math.floor((Date.now()-new Date(x).getTime())/864e5);return H===0?"today":H<30?`${H}d ago`:H<365?`${Math.floor(H/30)}mo ago`:`${Math.floor(H/365)}y ago`}function V(){d.value++,y(!1)}let P=null;function D(){P&&clearTimeout(P),P=setTimeout(()=>y(),350)}return ut(async()=>{try{const x=await Ie.marketplace.installed();for(const H of x.packages)u.value.set(H.name,H.mainFile)}catch{}try{const x=await Ie.marketplace.local();f.value=x.plugins}catch{}y()}),(x,H)=>{const O=Ye,U=la,j=mc,re=ot,Q=ai,ie=yl;return g(),E("div",GP,[b("div",YP,[H[4]||(H[4]=b("span",{class:"mp-title"},"Browse Plugins",-1)),b("a",{class:"mp-external",href:TO,target:"_blank",rel:"noopener noreferrer",title:"Open the full marketplace in a new tab"},[q(O,{name:oe(t8),size:12},null,8,["name"]),H[3]||(H[3]=ce(" Marketplace ",-1))])]),b("div",XP,[q(U,{modelValue:s.value,"onUpdate:modelValue":[H[0]||(H[0]=G=>s.value=G),D],placeholder:"Search plugins",size:"sm"},null,8,["modelValue"])]),a.value>0?(g(),E("div",JP,Z(a.value.toLocaleString())+" plugins found",1)):F("",!0),h.value?(g(),he(j,{key:1,status:"success",dismissible:"",class:"mp-installed-banner",title:`${h.value.name} installed`,onDismiss:H[1]||(H[1]=G=>h.value=null)},{default:te(()=>[...H[5]||(H[5]=[ce(" Click it in your plugins list to configure it. ",-1)])]),_:1},8,["title"])):F("",!0),l.value?(g(),he(re,{key:2,variant:"error"},{default:te(()=>[ce(Z(l.value),1)]),_:1})):F("",!0),f.value.length>0?(g(),E("div",QP,[b("div",eO,[q(O,{name:oe(yn),size:11},null,8,["name"]),H[6]||(H[6]=ce(" Local plugins ",-1))]),(g(!0),E(we,null,Ze(f.value,G=>(g(),he(ie,{key:G.name,class:"mp-row mp-row--ob mp-row--local"},{default:te(()=>[b("div",tO,[q(O,{name:oe(yn),size:16},null,8,["name"])]),b("div",iO,[b("div",rO,[b("span",sO,Z(G.name),1),b("span",nO,[q(O,{name:oe(yn),size:9},null,8,["name"]),H[7]||(H[7]=ce(" Native ",-1))]),b("span",aO,[q(O,{name:oe(BP),size:9},null,8,["name"]),H[8]||(H[8]=ce(" Local ",-1))]),b("span",oO,"v"+Z(G.version),1)]),G.description?(g(),E("p",lO,Z(G.description),1)):F("",!0),b("div",cO,[G.author?(g(),E("span",uO,Z(G.author),1)):F("",!0)])]),b("div",hO,[u.value.has(G.name)?(g(),he(Q,{key:0,variant:"ghost",size:"sm",disabled:"",icon:bs},{default:te(()=>[...H[9]||(H[9]=[ce("Active",-1)])]),_:1})):(g(),he(Q,{key:1,variant:"primary",size:"sm",loading:c.value===G.name,disabled:!!c.value||!G.platform,title:G.platform?"":"No platform declared in package.json openbridge.platform",onClick:de=>S(G)},{default:te(()=>[...H[10]||(H[10]=[ce(" Activate ",-1)])]),_:1},8,["loading","disabled","title","onClick"]))])]),_:2},1024))),128))])):F("",!0),b("div",dO,[o.value&&n.value.length===0?(g(),E("div",fO,[q(O,{name:oe(Dn),size:22},null,8,["name"]),H[11]||(H[11]=b("span",null,"Searching npm…",-1))])):F("",!0),(g(!0),E(we,null,Ze(n.value,G=>(g(),he(ie,{key:G.name,class:Te(["mp-row",{"mp-row--ob":k(G)}])},{default:te(()=>[b("div",{class:Te(["mp-avatar",{"mp-avatar--ob":k(G)}])},[v(G)?(g(),E("img",{key:0,src:v(G),alt:G.name,class:"mp-avatar-img",onError:H[2]||(H[2]=de=>de.target.style.display="none")},null,40,pO)):F("",!0),k(G)?(g(),he(O,{key:1,name:oe(yn),size:16},null,8,["name"])):(g(),he(O,{key:2,name:oe(en),size:16},null,8,["name"]))],2),b("div",_O,[b("div",mO,[b("span",gO,Z(G.name),1),b("span",vO,"v"+Z(G.version),1)]),G.description?(g(),E("p",bO,Z(G.description),1)):F("",!0),b("div",yO,[$(G)?(g(),E("span",wO,Z($(G)),1)):F("",!0),$(G)?(g(),E("span",SO,"·")):F("",!0),b("span",null,Z(L(G.date)),1)]),b("div",CO,[G.weeklyDownloads?(g(),E("span",kO,[q(O,{name:oe(FP),size:11},null,8,["name"]),ce(" "+Z(_(G.weeklyDownloads)),1)])):F("",!0),G.githubStars?(g(),E("span",AO,[q(O,{name:oe(UP),weight:"fill",size:11},null,8,["name"]),ce(" "+Z(_(G.githubStars)),1)])):F("",!0),G.githubSponsorsUrl?(g(),E("a",{key:2,href:G.githubSponsorsUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[q(O,{name:oe(Vg),weight:"fill",size:11},null,8,["name"]),H[12]||(H[12]=ce(" Sponsor ",-1))],8,MO)):F("",!0),G.documentationUrl?(g(),E("a",{key:3,href:G.documentationUrl,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link"},[q(O,{name:oe(Bg),size:11},null,8,["name"]),H[13]||(H[13]=ce(" Docs ",-1))],8,LO)):F("",!0),b("a",{href:`https://marketplace.openbridge.nubisco.io/plugins/${G.name}`,target:"_blank",rel:"noopener",class:"mp-stat mp-stat--link mp-stat--marketplace"},[q(O,{name:oe(t8),size:11},null,8,["name"]),H[14]||(H[14]=ce(" Marketplace ",-1))],8,EO)])]),b("div",$O,[u.value.has(G.name)?(g(),he(Q,{key:0,variant:"danger",size:"sm",outlined:"",loading:r.value===G.name,disabled:!!r.value,onClick:de=>C(G.name)},{default:te(()=>[...H[15]||(H[15]=[ce(" Remove ",-1)])]),_:1},8,["loading","disabled","onClick"])):(g(),he(Q,{key:1,variant:"primary",size:"sm",loading:c.value===G.name,disabled:!!c.value,onClick:de=>p(G)},{default:te(()=>[...H[16]||(H[16]=[ce(" Install ",-1)])]),_:1},8,["loading","disabled","onClick"]))])]),_:2},1032,["class"]))),128)),n.value.length>0&&n.value.length<a.value?(g(),E("div",xO,[q(Q,{variant:"ghost",size:"sm",loading:o.value,disabled:o.value,onClick:V},{default:te(()=>[ce(Z(o.value?"Loading…":`Load more (${a.value-n.value.length} remaining)`),1)]),_:1},8,["loading","disabled"])])):F("",!0)])])}}}),OO=jt(PO,[["__scopeId","data-v-789c3f61"]]),IO={key:0,class:"inspector-content nb-inspector"},RO={class:"detail-header"},DO={class:"detail-icon native-icon"},VO={style:{flex:"1","min-width":"0"}},BO={key:1,class:"rename-row"},ZO={class:"detail-type"},FO={class:"info-grid"},zO={class:"info-val"},UO={class:"info-val"},WO={class:"info-val"},jO={class:"info-val"},KO={class:"info-val mono"},qO={key:0,class:"widget-energy"},GO={class:"energy-primary"},YO={class:"energy-value"},XO={class:"energy-secondary"},JO={key:0,class:"energy-item"},QO={class:"energy-item-val"},eI={key:1,class:"energy-item"},tI={class:"energy-item-val"},iI={key:1,class:"widget-thermo"},rI={class:"thermo-row"},sI={class:"thermo-value"},nI={class:"thermo-row"},aI={class:"thermo-value accent"},oI={class:"thermo-row"},lI={key:2,class:"widget-thermo"},cI={class:"thermo-row"},uI={class:"thermo-value"},hI={class:"thermo-row"},dI={class:"thermo-value accent"},fI={class:"thermo-row"},pI={key:3,class:"widget-generic"},_I={key:0,class:"no-telemetry"},mI={class:"char-name"},gI={class:"char-value"},vI={class:"event-list"},bI=["title"],yI={class:"event-body"},wI={class:"event-message"},SI={key:0,class:"event-source"},CI={class:"history-tabs"},kI=["onClick"],AI={key:0,class:"history-nav"},MI={class:"history-nav-center"},LI={class:"history-total"},EI={class:"history-date"},$I={key:2,class:"no-history"},xI={key:3,class:"no-history"},TI={key:4,class:"no-history"},NI={class:"calibration-actions"},HI={class:"char-list"},PI={class:"char-name"},OI={class:"char-value"},II={key:0,class:"homekit-notice"},RI={class:"homekit-row"},DI={key:1,class:"homekit-notice"},VI={class:"detail-header"},BI={class:"detail-icon"},ZI={style:{flex:"1","min-width":"0"}},FI={key:1,class:"rename-row"},zI={class:"detail-type"},UI={class:"info-grid"},WI={key:0,class:"info-key"},jI={key:1,class:"info-val"},KI={key:0,class:"homekit-row"},qI={key:1,class:"homekit-notice"},GI={class:"char-list"},YI={class:"char-name"},XI={class:"homekit-row"},JI={key:0,class:"homekit-notice"},QI={class:"detail-uuid"},eR=Re({__name:"DeviceInspector",setup(e){const t=X(new Set),i=X(!1),r=X("");function s(fe){return!t.value.has(fe)}async function n(){try{const{hidden:fe}=await Ie.homekitHidden();t.value=new Set(fe)}catch{}}async function a(fe,ae){i.value=!0,r.value="";try{const Ee=await Ie.setHomekitVisibility(fe,ae),ze=new Set(t.value);ae?ze.delete(fe):ze.add(fe),t.value=ze,Ee.applied||(r.value="Saved. This takes effect after the next OpenBridge restart.")}catch(Ee){r.value=`Could not change visibility: ${Ee.message}`}finally{i.value=!1}}const o=X({}),l=X([]),c=X(""),u=Y(()=>[{value:"",label:"Default (as published)"},...l.value.map(fe=>({value:fe.key,label:fe.label}))]);function h(fe){return l.value.some(ae=>ae.serviceUuid===fe)}function d(fe,ae){var Ee;return((Ee=o.value[fe])==null?void 0:Ee[ae])??""}const f=X(null);function m(fe){return fe.homekitType||fe.widgetType}async function _(fe){f.value=null;try{const{accessory:ae}=await Ie.deviceAccessory(fe);f.value=ae}catch{}}async function y(){try{const{overrides:fe,available:ae}=await Ie.homekitServiceTypes();o.value=fe,l.value=ae}catch{}}async function p(fe,ae,Ee){i.value=!0,c.value="";try{await Ie.setHomekitServiceType(fe,ae,Ee||null);const ze={...o.value},We={...ze[fe]??{}};Ee?We[ae]=Ee:delete We[ae],Object.keys(We).length>0?ze[fe]=We:delete ze[fe],o.value=ze,c.value="Saved. This takes effect after the next OpenBridge restart."}catch(ze){c.value=`Could not change type: ${ze.message}`}finally{i.value=!1}}ut(()=>{n(),y()});const C=Sl(),S=j$(),v=X(""),k=X(""),$=X("success"),L=Y(()=>{const fe=C.selectedDevice;return!fe||fe.kind!=="native"?null:fe.dev.health??null}),V=Y(()=>{var ae;const fe=(ae=L.value)==null?void 0:ae.lastSeen;return fe?`Not responding since ${new Date(fe).toLocaleString()}`:"Not responding"}),P=Y(()=>{const fe=C.selectedDevice;return!fe||fe.kind!=="native"?[]:fe.dev.actions??[]});async function D(fe){const ae=C.selectedDevice;if(!(!ae||ae.kind!=="native")&&!(fe.confirm&&!await S({title:fe.label,subjectLabel:"Device",subject:ae.dev.name,message:fe.confirm,confirmLabel:fe.label}))){v.value=fe.id,k.value="";try{await Ie.controlDevice(ae.dev.id,fe.id,!0),$.value="success",k.value=`${fe.label} sent.`}catch(Ee){$.value="error",k.value=`${fe.label} failed: ${Ee.message}`}finally{v.value=""}}}const x=Y(()=>C.selectedDevice),H=Y(()=>x.value?x.value.kind==="native"?x.value.dev.id:x.value.acc.uuid:null),O={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 U(fe){return O[fe]??{label:`Category ${fe}`,icon:"cube"}}const j=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]);function re(fe){return fe.services.filter(ae=>!j.has(ae.name)&&!j.has(ae.uuid))}function Q(fe){return fe.services.find(ae=>j.has(ae.name)||j.has(ae.uuid))}function ie(fe){const ae=Q(fe);if(!ae)return null;const Ee=ze=>{var We;return(We=ae.characteristics.find(Ct=>Ct.name===ze||Ct.name.includes(ze)))==null?void 0:We.value};return{manufacturer:Ee("Manufacturer")??Ee("Manuf"),model:Ee("Model"),serial:Ee("SerialNumber")??Ee("Serial"),firmware:Ee("FirmwareRevision")??Ee("Firmware")}}function G(fe){return fe.value===null||fe.value===void 0?"—":fe.format==="bool"?fe.value?"On":"Off":typeof fe.value=="number"?String(Math.round(fe.value*100)/100):String(fe.value)}function de(fe){return fe.perms.includes("pw")}const pe=X(!1),_e=X("");function Ne(fe){_e.value=fe,pe.value=!0}async function Le(fe){var ae,Ee;if(_e.value.trim())try{const ze=_e.value.trim();await Ie.renameDevice(fe,ze),pe.value=!1,((ae=x.value)==null?void 0:ae.kind)==="native"?x.value.dev.name=ze:((Ee=x.value)==null?void 0:Ee.kind)==="hap"&&(x.value.acc.displayName=ze);const{useDaemonStore:We}=await g6(async()=>{const{useDaemonStore:gt}=await Promise.resolve().then(()=>R6);return{useDaemonStore:gt}},void 0);await We().fetchAccessories()}catch(ze){console.error("Rename failed:",ze)}}async function ye(fe,ae,Ee,ze){try{await Ie.setCharacteristic(fe,ae,Ee,ze);const{useDaemonStore:We}=await g6(async()=>{const{useDaemonStore:gt}=await Promise.resolve().then(()=>R6);return{useDaemonStore:gt}},void 0);await We().fetchAccessories()}catch(We){console.error("Failed to set characteristic:",We)}}const ge=X([]);function I(fe){const ae=new Date(fe);return Number.isNaN(ae.getTime())?fe:new Date().toDateString()===ae.toDateString()?ae.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):ae.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}async function ee(){const fe=x.value;if((fe==null?void 0:fe.kind)!=="native"){ge.value=[];return}try{const ae=await Ie.deviceEvents(fe.dev.id,100);ge.value=ae.events}catch{ge.value=[]}}const ne={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse",camera:"camera"},ve={camera:"Camera",switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",gate:"Gate",sensor:"Sensor"};function ke(fe){return ne[fe]??"cube"}function N(fe){return ve[fe]??fe}function T(fe,ae=1){if(fe==null)return"—";const Ee=Number(fe);return isFinite(Ee)?Ee.toFixed(ae):String(fe)}function K(fe){return Object.entries(fe.telemetry).filter(([ae])=>!ae.startsWith("_"))}const J=X("day"),le=X(new Date().toISOString().slice(0,10)),ue=X(null),w=X(!1);async function A(fe){if(!w.value){w.value=!0;try{ue.value=await Ie.deviceHistory(fe,J.value,le.value)}catch{}finally{w.value=!1}}}function B(fe){var Ee;const ae=new Date(le.value+(le.value.length<=7?"-01":""));J.value==="day"?(ae.setDate(ae.getDate()+fe),le.value=ae.toISOString().slice(0,10)):J.value==="month"?(ae.setMonth(ae.getMonth()+fe),le.value=ae.toISOString().slice(0,7)):(ae.setFullYear(ae.getFullYear()+fe),le.value=String(ae.getFullYear())),((Ee=x.value)==null?void 0:Ee.kind)==="native"&&A(x.value.dev.id)}Ue(J,()=>{var ae;const fe=new Date;J.value==="day"?le.value=fe.toISOString().slice(0,10):J.value==="month"?le.value=fe.toISOString().slice(0,7):le.value=String(fe.getFullYear()),((ae=x.value)==null?void 0:ae.kind)==="native"&&x.value.dev.widgetType==="energy_meter"&&A(x.value.dev.id)}),Ue(H,(fe,ae)=>{if(fe===ae&&ue.value)return;const Ee=x.value;(Ee==null?void 0:Ee.kind)==="native"?_(Ee.dev.id):f.value=null,ee(),(Ee==null?void 0:Ee.kind)==="native"&&Ee.dev.widgetType==="energy_meter"&&(le.value=new Date().toISOString().slice(0,10),J.value="day",A(Ee.dev.id))},{immediate:!0});const M=X([]),R=X([]),z=X(!1),W=X(!1),se=X(!1),Se=Y(()=>JSON.stringify(M.value)!==JSON.stringify(R.value)),xe=Y(()=>!x.value||x.value.kind!=="native"?null:x.value.dev);async function De(fe){const{plugins:ae}=await Ie.plugins(),Ee=ae.find(We=>We.id===fe.pluginId);if(!Ee)return null;if(Ee.source!=="homebridge"){const{config:We}=await Ie.config.getPlugin(fe.pluginId);return We?{pluginConfig:We,isNative:!0,pluginName:fe.pluginId,platformName:void 0}:null}else{const We=Ee.platformName??fe.pluginId,{config:Ct}=await Ie.config.getPlatform(We);return Ct?{pluginConfig:Ct,isNative:!1,pluginName:fe.pluginId,platformName:We}:null}}async function Xe(){const fe=xe.value;if(fe!=null&&fe.interpolation){z.value=!0,se.value=!1;try{const ae=await De(fe);if(!ae)return;const ze=(ae.pluginConfig.devices??[]).find(Xr=>Xr.id===fe.id);if(!ze)return;const We=fe.interpolation,gt=(ze[We.configField]??[]).map(Xr=>({input:Xr[We.configShape.inputKey]??0,output:Xr[We.configShape.outputKey]??0}));M.value=gt,R.value=JSON.parse(JSON.stringify(gt))}catch(ae){console.error("Failed to load interpolation config:",ae)}finally{z.value=!1}}}async function $e(){const fe=xe.value;if(fe!=null&&fe.interpolation){W.value=!0,se.value=!1;try{const ae=await De(fe);if(!ae)return;const Ee=fe.interpolation,ze=ae.pluginConfig.devices??[],We=ze.findIndex(gt=>gt.id===fe.id);if(We<0)return;const Ct=M.value.map(gt=>({[Ee.configShape.inputKey]:gt.input,[Ee.configShape.outputKey]:gt.output}));ze[We]={...ze[We],[Ee.configField]:Ct},ae.pluginConfig.devices=ze,ae.isNative?await Ie.config.savePlugin(ae.pluginName,ae.pluginConfig):await Ie.config.savePlatform(ae.pluginConfig),R.value=JSON.parse(JSON.stringify(M.value)),se.value=!0}catch(ae){console.error("Failed to save interpolation config:",ae)}finally{W.value=!1}}}function Nt(){M.value=JSON.parse(JSON.stringify(R.value)),se.value=!1}Ue(H,(fe,ae)=>{var Ee;fe===ae&&R.value.length>0||(se.value=!1,((Ee=x.value)==null?void 0:Ee.kind)==="native"&&x.value.dev.interpolation?Xe():(M.value=[],R.value=[]))},{immediate:!0});const pi=Y(()=>{var ae;return(ae=ue.value)!=null&&ae.buckets?[{name:"kWh",data:ue.value.buckets.map(Ee=>{let ze=Ee.label;return J.value==="day"?ze=parseInt(Ee.label)%6===0?Ee.label:"":J.value==="month"&&(ze=parseInt(Ee.label)%5===1?Ee.label:""),{x:ze,y:Math.max(0,Math.round((Ee.kwh??0)*100)/100)}})}]:[]});return(fe,ae)=>{const Ee=Ye,ze=la,We=ai,Ct=mc,gt=gd,Xr=w9,Oc=pL,no=yc,Ce=bc;return x.value?(g(),E("div",IO,[x.value.kind==="native"?(g(),E(we,{key:0},[b("div",RO,[b("div",DO,[q(Ee,{name:ke(m(x.value.dev)),size:26},null,8,["name"])]),b("div",VO,[pe.value?(g(),E("div",BO,[q(ze,{modelValue:_e.value,"onUpdate:modelValue":ae[1]||(ae[1]=me=>_e.value=me),size:"sm",onKeyup:[ae[2]||(ae[2]=Rr(me=>Le(x.value.dev.id),["enter"])),ae[3]||(ae[3]=Rr(me=>pe.value=!1,["escape"]))]},null,8,["modelValue"]),q(We,{variant:"primary",size:"sm",icon:bs,"aria-label":"Save name",onClick:ae[4]||(ae[4]=me=>Le(x.value.dev.id))}),q(We,{variant:"ghost",size:"sm",icon:fu,"aria-label":"Cancel rename",onClick:ae[5]||(ae[5]=me=>pe.value=!1)})])):(g(),E("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:ae[0]||(ae[0]=me=>Ne(x.value.dev.name))},Z(x.value.dev.name),1)),b("div",ZO,Z(N(m(x.value.dev))),1)])]),q(gt,{title:"Device info",fluid:""},x_({default:te(()=>[L.value&&L.value.status==="stale"?(g(),he(Ct,{key:0,status:"warning",title:V.value,style:{"margin-bottom":"0.5rem"}},{default:te(()=>[ce(Z(L.value.reason),1)]),_:1},8,["title"])):F("",!0),k.value?(g(),he(Ct,{key:1,status:$.value,title:k.value,style:{"margin-bottom":"0.5rem"}},null,8,["status","title"])):F("",!0),b("div",FO,[ae[19]||(ae[19]=b("span",{class:"info-key"},"Plugin",-1)),b("span",zO,Z(x.value.dev.pluginId),1),x.value.dev.manufacturer?(g(),E(we,{key:0},[ae[17]||(ae[17]=b("span",{class:"info-key"},"Manufacturer",-1)),b("span",UO,Z(x.value.dev.manufacturer),1)],64)):F("",!0),x.value.dev.model?(g(),E(we,{key:1},[ae[18]||(ae[18]=b("span",{class:"info-key"},"Model",-1)),b("span",WO,Z(x.value.dev.model),1)],64)):F("",!0),ae[20]||(ae[20]=b("span",{class:"info-key"},"Status",-1)),b("span",jO,Z(x.value.dev.pluginStatus),1),ae[21]||(ae[21]=b("span",{class:"info-key"},"ID",-1)),b("span",KO,Z(x.value.dev.id),1)])]),_:2},[P.value.length>0?{name:"toolbar",fn:te(()=>[(g(!0),E(we,null,Ze(P.value,me=>(g(),he(We,{key:me.id,size:"xs",variant:me.danger?"danger":"ghost",disabled:v.value!=="",loading:v.value===me.id,onClick:Fe=>D(me)},{default:te(()=>[ce(Z(me.label),1)]),_:2},1032,["variant","disabled","loading","onClick"]))),128))]),key:"0"}:void 0]),1024),q(gt,{title:"State",fluid:""},{default:te(()=>[x.value.dev.widgetType==="energy_meter"?(g(),E("div",qO,[b("div",GO,[b("span",YO,Z(T(x.value.dev.telemetry.power,1)),1),ae[22]||(ae[22]=b("span",{class:"energy-unit"},"W",-1))]),b("div",XO,[x.value.dev.telemetry.voltage!==void 0?(g(),E("span",JO,[ae[23]||(ae[23]=b("span",{class:"energy-label"},"Voltage",-1)),b("span",QO,Z(T(x.value.dev.telemetry.voltage,1))+" V",1)])):F("",!0),x.value.dev.telemetry.current!==void 0?(g(),E("span",eI,[ae[24]||(ae[24]=b("span",{class:"energy-label"},"Current",-1)),b("span",tI,Z(T(x.value.dev.telemetry.current,3))+" A",1)])):F("",!0)])])):x.value.dev.widgetType==="thermostat"?(g(),E("div",iI,[b("div",rI,[ae[25]||(ae[25]=b("span",{class:"thermo-label"},"Current",-1)),b("span",sI,Z(T(x.value.dev.telemetry.currentTemperature,1))+"°C",1)]),b("div",nI,[ae[26]||(ae[26]=b("span",{class:"thermo-label"},"Target",-1)),b("span",aI,Z(T(x.value.dev.telemetry.targetTemperature,1))+"°C ",1)]),b("div",oI,[ae[27]||(ae[27]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Te(["thermo-value",x.value.dev.telemetry.active?"on":"off"])},Z(x.value.dev.telemetry.active?"On":"Off"),3)])])):x.value.dev.widgetType==="dehumidifier"?(g(),E("div",lI,[b("div",cI,[ae[28]||(ae[28]=b("span",{class:"thermo-label"},"Humidity",-1)),b("span",uI,Z(T(x.value.dev.telemetry.currentHumidity,0))+"%",1)]),b("div",hI,[ae[29]||(ae[29]=b("span",{class:"thermo-label"},"Target",-1)),b("span",dI,Z(T(x.value.dev.telemetry.targetHumidity,0))+"%",1)]),b("div",fI,[ae[30]||(ae[30]=b("span",{class:"thermo-label"},"Active",-1)),b("span",{class:Te(["thermo-value",x.value.dev.telemetry.active?"on":"off"])},Z(x.value.dev.telemetry.active?"On":"Off"),3)])])):(g(),E("div",pI,[Object.keys(x.value.dev.telemetry).filter(me=>!me.startsWith("_")).length===0?(g(),E("span",_I,"No telemetry yet")):F("",!0),(g(!0),E(we,null,Ze(K(x.value.dev),([me,Fe])=>(g(),E("div",{key:me,class:"char-row"},[b("span",mI,Z(me),1),b("span",gI,Z(String(Fe)),1)]))),128))]))]),_:1}),ge.value.length>0?(g(),he(gt,{key:0,title:"Recent activity",fluid:""},{default:te(()=>[b("ul",vI,[(g(!0),E(we,null,Ze(ge.value,(me,Fe)=>(g(),E("li",{key:`${me.at}-${Fe}`,class:"event"},[b("span",{class:"event-time",title:me.at},Z(I(me.at)),9,bI),b("span",yI,[b("span",wI,Z(me.message),1),me.source?(g(),E("span",SI,Z(me.source),1)):F("",!0)])]))),128))])]),_:1})):F("",!0),x.value.dev.widgetType==="energy_meter"?(g(),he(gt,{key:1,title:"Energy history",class:"energy-history",fluid:""},{default:te(()=>[b("div",CI,[(g(),E(we,null,Ze(["day","month","year"],me=>b("button",{key:me,class:Te(["history-tab",{active:J.value===me}]),onClick:Fe=>J.value=me},Z(me),11,kI)),64))]),ue.value?(g(),E("div",AI,[q(We,{variant:"ghost",size:"xs",icon:I9,title:"Previous",onClick:ae[6]||(ae[6]=me=>B(-1))}),b("div",MI,[b("span",LI,[ce(Z(ue.value.totalKwh.toFixed(2))+" ",1),ae[31]||(ae[31]=b("span",{class:"history-unit"},"kWh",-1))]),b("span",EI,Z(ue.value.date),1)]),q(We,{variant:"ghost",size:"xs",icon:tS,title:"Next",onClick:ae[7]||(ae[7]=me=>B(1))})])):F("",!0),ue.value&&ue.value.totalKwh>0?(g(),he(Xr,{key:1,series:pi.value,height:120,"show-legend":!1,"show-tooltip":!0},null,8,["series"])):F("",!0),ue.value&&ue.value.totalKwh===0?(g(),E("div",$I," No consumption recorded for this period. Data accumulates every 5 minutes. ")):F("",!0),!ue.value&&!w.value?(g(),E("div",xI,"No data available for this period.")):F("",!0),w.value?(g(),E("div",TI,"Loading history…")):F("",!0)]),_:1})):F("",!0),x.value.dev.interpolation&&M.value.length>0?(g(),he(gt,{key:2,title:"Calibration",fluid:""},{default:te(()=>[q(Oc,{modelValue:M.value,"onUpdate:modelValue":ae[8]||(ae[8]=me=>M.value=me),height:220,"input-label":x.value.dev.interpolation.inputLabel,"output-label":x.value.dev.interpolation.outputLabel,"input-min":x.value.dev.interpolation.inputMin,"input-max":x.value.dev.interpolation.inputMax,"output-min":x.value.dev.interpolation.outputMin,"output-max":x.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"]),ae[34]||(ae[34]=b("div",{class:"calibration-hint"},"Drag points to adjust. Double-click to add. Right-click to remove.",-1)),b("div",NI,[q(We,{variant:"primary",size:"sm",disabled:!Se.value||W.value,onClick:$e},{default:te(()=>[ce(Z(W.value?"Saving...":"Save"),1)]),_:1},8,["disabled"]),q(We,{variant:"ghost",size:"sm",disabled:!Se.value,onClick:Nt},{default:te(()=>[...ae[32]||(ae[32]=[ce(" Reset ",-1)])]),_:1},8,["disabled"])]),se.value?(g(),he(Ct,{key:0,status:"success",title:"Configuration saved"},{default:te(()=>[...ae[33]||(ae[33]=[ce(" Restart the plugin to apply the new mapping. ",-1)])]),_:1})):F("",!0)]),_:1})):x.value.dev.interpolation&&z.value?(g(),he(gt,{key:3,title:"Calibration",fluid:""},{default:te(()=>[...ae[35]||(ae[35]=[b("div",{class:"no-history"},"Loading calibration data...",-1)])]),_:1})):F("",!0),K(x.value.dev).length>0?(g(),he(gt,{key:4,title:"All telemetry",fluid:""},{default:te(()=>[b("div",HI,[(g(!0),E(we,null,Ze(K(x.value.dev),([me,Fe])=>(g(),E("div",{key:me,class:"char-row"},[b("span",PI,Z(me),1),b("span",OI,Z(String(Fe)),1)]))),128))])]),_:1})):F("",!0),f.value?(g(),he(gt,{key:5,title:"HomeKit",fluid:""},{default:te(()=>[(g(!0),E(we,null,Ze(re(f.value),me=>Gs((g(),E("div",{key:me.uuid,class:"homekit-row"},[ae[36]||(ae[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)),q(no,{"model-value":d(f.value.uuid,me.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":Fe=>p(f.value.uuid,me.uuid,String(Fe))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])),[[nm,h(me.uuid)]])),128)),c.value?(g(),E("div",II,Z(c.value),1)):F("",!0),b("div",RI,[ae[37]||(ae[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)),q(Ce,{name:`homekit-visible-${f.value.uuid}`,"model-value":s(f.value.uuid),disabled:i.value,"onUpdate:modelValue":ae[9]||(ae[9]=me=>a(f.value.uuid,!!me))},null,8,["name","model-value","disabled"])]),r.value?(g(),E("div",DI,Z(r.value),1)):F("",!0)]),_:1})):F("",!0)],64)):x.value.kind==="hap"?(g(),E(we,{key:1},[b("div",VI,[b("div",BI,[q(Ee,{name:U(x.value.acc.category).icon,size:26},null,8,["name"])]),b("div",ZI,[pe.value?(g(),E("div",FI,[q(ze,{modelValue:_e.value,"onUpdate:modelValue":ae[11]||(ae[11]=me=>_e.value=me),size:"sm",onKeyup:[ae[12]||(ae[12]=Rr(me=>Le(x.value.acc.uuid),["enter"])),ae[13]||(ae[13]=Rr(me=>pe.value=!1,["escape"]))]},null,8,["modelValue"]),q(We,{variant:"primary",size:"sm",icon:bs,"aria-label":"Save name",onClick:ae[14]||(ae[14]=me=>Le(x.value.acc.uuid))}),q(We,{variant:"ghost",size:"sm",icon:fu,"aria-label":"Cancel rename",onClick:ae[15]||(ae[15]=me=>pe.value=!1)})])):(g(),E("h2",{key:0,class:"detail-name",title:"Click to rename",onClick:ae[10]||(ae[10]=me=>Ne(x.value.acc.displayName))},Z(x.value.acc.displayName),1)),b("div",zI,Z(U(x.value.acc.category).label),1)])]),ie(x.value.acc)?(g(),he(gt,{key:0,title:"Device info",fluid:""},{default:te(()=>[b("div",UI,[(g(!0),E(we,null,Ze(Object.entries(ie(x.value.acc)),([me,Fe])=>(g(),E(we,{key:me},[Fe?(g(),E("span",WI,Z(me),1)):F("",!0),Fe?(g(),E("span",jI,Z(Fe),1)):F("",!0)],64))),128))])]),_:1})):F("",!0),(g(!0),E(we,null,Ze(re(x.value.acc),me=>(g(),he(gt,{key:me.uuid,title:me.displayName||me.name,fluid:""},{default:te(()=>[h(me.uuid)?(g(),E("div",KI,[ae[38]||(ae[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)),q(no,{"model-value":d(x.value.acc.uuid,me.uuid),options:u.value,disabled:i.value,size:"sm","onUpdate:modelValue":Fe=>p(x.value.acc.uuid,me.uuid,String(Fe))},null,8,["model-value","options","disabled","onUpdate:modelValue"])])):F("",!0),c.value?(g(),E("div",qI,Z(c.value),1)):F("",!0),b("div",GI,[(g(!0),E(we,null,Ze(me.characteristics,Fe=>(g(),E("div",{key:Fe.uuid,class:"char-row"},[b("span",YI,Z(Fe.name),1),de(Fe)&&Fe.format==="bool"?(g(),he(Ce,{key:0,name:`hap-char-${me.uuid}-${Fe.uuid}`,"model-value":!!Fe.value,"onUpdate:modelValue":$s=>ye(x.value.acc.uuid,me.uuid,Fe.uuid,$s?1:0)},null,8,["name","model-value","onUpdate:modelValue"])):(g(),E("span",{key:1,class:Te(["char-value",{on:Fe.format==="bool"&&Fe.value}])},Z(G(Fe)),3))]))),128))])]),_:2},1032,["title"]))),128)),q(gt,{title:"HomeKit",fluid:""},{default:te(()=>[b("div",XI,[ae[39]||(ae[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)),q(Ce,{name:`homekit-visible-${x.value.acc.uuid}`,"model-value":s(x.value.acc.uuid),disabled:i.value,"onUpdate:modelValue":ae[16]||(ae[16]=me=>a(x.value.acc.uuid,!!me))},null,8,["name","model-value","disabled"])]),r.value?(g(),E("div",JI,Z(r.value),1)):F("",!0)]),_:1}),b("div",QI,"UUID: "+Z(x.value.acc.uuid),1)],64)):F("",!0)])):F("",!0)}}}),tR=jt(eR,[["__scopeId","data-v-9745f993"]]),iR={class:"logs-filter"},rR={key:0,class:"log-empty"},sR={class:"log-time"},nR={class:"log-plugin"},aR={class:"log-msg"},i8="openbridge.logs.panelSize",oR=Re({__name:"LiveLogsPanel",setup(e){const t=Ls(),i=["collapsed","default","full"],r=X("collapsed");ut(()=>{const c=localStorage.getItem(i8);c&&i.includes(c)&&(r.value=c)}),Ue(r,c=>localStorage.setItem(i8,c));const s=X([]),n=X(null),a=Y(()=>[{value:"system",label:"system"},...t.plugins.map(c=>({value:c.manifest.name,label:c.manifest.name}))]),o=Y(()=>s.value.length===0?t.logs:t.logs.filter(c=>s.value.includes(c.plugin)));function l(){t.logs.length=0}return Ue(()=>o.value.length,async()=>{const c=n.value;!c||!(c.scrollHeight-c.scrollTop-c.clientHeight<40)||(await fi(),c.scrollTop=c.scrollHeight)}),(c,u)=>{const h=yc,d=ai,f=gd;return g(),he(f,{size:r.value,"onUpdate:size":u[1]||(u[1]=m=>r.value=m),title:"Live Logs"},{toolbar:te(()=>[b("div",iR,[q(h,{modelValue:s.value,"onUpdate:modelValue":u[0]||(u[0]=m=>s.value=m),multiple:"",options:a.value,placeholder:"All plugins",size:"xs"},null,8,["modelValue","options"])]),q(d,{size:"xs",variant:"ghost",icon:Sd,title:"Clear",onClick:l})]),default:te(()=>[b("div",{ref_key:"logsEl",ref:n,class:"log-list"},[o.value.length===0?(g(),E("div",rR,"No log entries yet.")):F("",!0),(g(!0),E(we,null,Ze(o.value,(m,_)=>(g(),E("div",{key:_,class:"log-line"},[b("span",sR,Z(new Date(m.timestamp).toLocaleTimeString()),1),b("span",{class:Te(["log-level",`log-level--${m.level}`])},Z(m.level.toUpperCase()),3),b("span",nR,Z(m.plugin),1),b("span",aR,Z(m.message),1)]))),128))],512)]),_:1},8,["size"])}}}),lR=jt(oR,[["__scopeId","data-v-2d8d29ff"]]),cR=["data-tooltip"],uR=["onClick"],hR=Re({__name:"AppLayout",setup(e){const t=kc(),i=wl(),r=Ls(),s=Sl(),n=nn(),a=Ac();async function o(){await a.logout()}const{theme:l,resolved:c,followsSystem:u,setTheme:h}=vd(),d=[{value:"light",label:"Light"},{value:"dark",label:"Dark"},{value:"system",label:"System"}],f=Y({get:()=>l.value,set:D=>h(D)}),m=Y(()=>u.value?`Following your system, currently ${c.value}`:"Pinned, ignoring your system setting");function _(){var x;const D=(x=a.config.value)==null?void 0:x.issuer;D&&window.open(`${D}/profile`,"_blank","noopener")}const y=X([]),p=X(!0),C=Y(()=>y.value.map(D=>{var x;return{id:D.sub,email:D.email,name:D.name,current:D.sub===((x=a.user.value)==null?void 0:x.id)}}));async function S(){const D=await a.listIdentities();y.value=D,p.value=D.length===0}function v(D){a.switchAccount(D.email)}async function k(D){await a.removeIdentity(D.id),await S()}const $=X(null),L=X(!1);async function V(){try{const D=await fetch("/api/updates/check");if(!D.ok)return;const x=await D.json();x.updateAvailable&&x.latest&&($.value=x.latest)}catch{}}const P=[{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 Ue(()=>t.name,()=>s.close()),ut(async()=>{await r.fetchHealth(),await r.fetchPlugins(),r.fetchLogs(),r.connectLiveLogs();const D=setInterval(()=>r.fetchHealth(),1e4);Pi(()=>clearInterval(D)),V()}),Pi(()=>r.disconnectLiveLogs()),(D,x)=>{const H=jo("RouterLink"),O=Ye,U=RE,j=WE,re=md,Q=NA,ie=u4,G=qn,de=ai,pe=mc,_e=jo("RouterView"),Ne=IE;return g(),he(Ne,{"inspector-visible":oe(s).visible,"main-padding":!oe(n).fullBleed},x_({"sidebar-logo":te(()=>[q(H,{to:"/dashboard","data-tooltip":"OpenBridge",class:"sidebar-logo"},{default:te(()=>[...x[4]||(x[4]=[b("img",{src:gT,width:"32",height:"32",alt:"OpenBridge logo"},null,-1)])]),_:1})]),"sidebar-nav":te(()=>[(g(),E(we,null,Ze(P,Le=>q(U,{key:Le.name,to:Le.href,tooltip:Le.label,active:oe(t).name===Le.name,onClick:lt(ye=>oe(i).push(Le.href),["prevent"])},{default:te(()=>[q(O,{name:Le.icon,size:18},null,8,["name"])]),_:2},1032,["to","tooltip","active","onClick"])),64))]),"sidebar-bottom":te(()=>{var Le;return[b("div",{class:Te(["daemon-status",oe(r).connected?"online":"offline"]),"data-tooltip":oe(r).connected?"Daemon connected":"Daemon offline"},[...x[5]||(x[5]=[b("span",{class:"daemon-dot"},null,-1)])],10,cR),(Le=oe(a).config.value)!=null&&Le.enabled&&oe(a).user.value?(g(),he(Q,{key:0,user:{email:oe(a).user.value.email,picture:oe(a).user.value.picture},accounts:C.value,"accounts-unknown":p.value,"show-account-actions":oe(a).isNubiscoPlatform.value,"show-profile":oe(a).isNubiscoPlatform.value,brand:oe(a).isNubiscoPlatform.value?"footer":void 0,onOpen:S,onSwitch:v,onSwitchAccount:x[1]||(x[1]=ye=>oe(a).chooseAccount()),onAddAccount:x[2]||(x[2]=ye=>oe(a).addAccount()),onRemove:k,onProfile:_,onSignOut:o},{default:te(({close:ye})=>[q(re,{label:"Theme",hint:m.value,control:"fit",class:"menu-theme"},{default:te(()=>[q(j,{modelValue:f.value,"onUpdate:modelValue":x[0]||(x[0]=ge=>f.value=ge),name:"theme",options:d,direction:"horizontal"},null,8,["modelValue"])]),_:1},8,["hint"]),b("button",{type:"button",role:"menuitem",class:"nb-user-menu__action nb-user-menu__action--danger",onClick:ge=>(ye(),oe(a).logoutEverywhere())},[q(O,{name:oe(V4),size:15},null,8,["name"]),x[6]||(x[6]=ce(" Sign out of all apps ",-1))],8,uR)]),_:1},8,["user","accounts","accounts-unknown","show-account-actions","show-profile","brand"])):F("",!0)]}),"topbar-left":te(()=>[q(ie,{subtitle:oe(n).title},null,8,["subtitle"]),oe(n).count!==null?(g(),he(G,{key:0},{default:te(()=>[ce(Z(oe(n).count),1)]),_:1})):F("",!0),x[7]||(x[7]=b("div",{id:"ob-topbar-left",class:"topbar-slot"},null,-1))]),"topbar-right":te(()=>[x[8]||(x[8]=b("div",{id:"ob-topbar-right",class:"topbar-slot"},null,-1))]),inspector:te(()=>[oe(s).mode==="plugin"?(g(),he(IP,{key:0})):oe(s).mode==="marketplace"?(g(),he(OO,{key:1})):oe(s).mode==="device"?(g(),he(tR,{key:2})):F("",!0)]),bottom:te(()=>[q(lR)]),default:te(()=>[q(_e)]),_:2},[$.value&&!L.value?{name:"notification",fn:te(()=>[q(pe,{status:"info",icon:wd,flush:"",dismissible:"",title:`OpenBridge v${$.value} is available`,onDismiss:x[3]||(x[3]=Le=>L.value=!0)},{action:te(()=>[q(de,{variant:"ghost",size:"sm",href:"https://github.com/nubisco/openbridge/releases",target:"_blank",rel:"noopener"},{default:te(()=>[...x[9]||(x[9]=[ce(" See what's new ",-1)])]),_:1})]),_:1},8,["title"])]),key:"0"}:void 0]),1032,["inspector-visible","main-padding"])}}}),dR=jt(hR,[["__scopeId","data-v-01a1c16f"]]),fR=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},pR=fR("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"/>'),_R=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},mR=_R("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"/>'),gR=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},vR=gR("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"/>'),bR=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},yR=bR("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"/>'),ba=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},wR=ba("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"/>'),SR=ba("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"/>'),Du=ba("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"/>'),CR=ba("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"/>'),kR=ba("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"/>'),AR=ba("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"/>'),MR="pulse",LR=Object.freeze(Object.defineProperty({__proto__:null,bold:CR,default:Du,duotone:AR,fill:kR,glyphName:MR,light:SR,regular:Du,thin:wR},Symbol.toStringTag,{value:"Module"})),ER={class:"dashboard"},$R={class:"top-row"},xR={class:"hk-body"},TR={key:0,class:"qr-wrap"},NR=["src"],HR={key:1,class:"qr-placeholder"},PR={class:"hk-details"},OR={key:0,class:"pin-display"},IR={key:1,class:"pin-label"},RR={class:"hk-status"},DR={key:2,class:"hk-error"},VR={key:0,class:"sys-grid"},BR={class:"sys-val"},ZR={class:"sys-val"},FR={class:"sys-val"},zR={class:"sys-val"},UR={class:"sys-val"},WR={class:"sys-val"},jR={class:"sys-val"},KR={class:"sys-val mono"},qR={class:"sys-val mono"},GR={class:"sys-val mono"},YR={key:1,class:"loading-inline"},XR={class:"card-title"},JR={class:"plugins-counts"},QR={key:0,class:"pill red"},eD={key:0,class:"empty-inline"},tD={key:1,class:"plugins-list"},iD={class:"plugin-name"},rD={class:"plugin-ver"},sD={class:"metrics-row"},nD={class:"metric-header"},aD={class:"metric-icon purple"},oD={class:"metric-values"},lD={class:"metric-big"},cD={key:0,class:"metric-sub"},uD={class:"metric-chart"},hD={class:"metric-header"},dD={class:"metric-icon blue"},fD={class:"metric-values"},pD={class:"metric-big"},_D={class:"metric-sub"},mD={class:"metric-chart"},gD={class:"metric-header"},vD={class:"metric-icon green"},bD={class:"uptime-rows"},yD={class:"uptime-row"},wD={class:"uptime-val"},SD={class:"uptime-row"},CD={class:"uptime-val"},kD={style:{"margin-top":"0.75rem"}},AD={class:"metric-header"},MD={class:"metric-icon amber"},LD={class:"net-values"},ED={class:"net-val"},$D={class:"net-val"},xD={class:"metric-chart net-charts"},TD=Re({__name:"DashboardView",setup(e){const t=Ls(),i=nn();function r(H){return H==="running"?"green":H==="error"?"red":H==="loading"?"blue":"grey"}const s=X(!1),n=X(!1);async function a(){if(!s.value){s.value=!0,n.value=!1;try{await Ie.daemon.restart(),n.value=!0;let H=0;const O=setInterval(async()=>{H++;try{await Ie.health(),clearInterval(O),location.reload()}catch{}H>60&&(clearInterval(O),s.value=!1)},1e3)}catch{s.value=!1}}}const o=X(null),l=X(""),c=X(""),u=X(""),h=Y(()=>t.connected?u.value?"red":"green":"gray"),d=Y(()=>t.connected?u.value?"HomeKit offline":"Bridge running":"Daemon offline"),f=X([]),m=X([]),_=X([]),y=X([]),p=Cr(null);let C=null;function S(){C&&(C.onclose=null,C.close(),C=null);const H=location.protocol==="https:"?"wss:":"ws:";C=new WebSocket(`${H}//${location.host}/ws/metrics`),C.onmessage=O=>{if(!document.hidden)try{const U=JSON.parse(O.data);if(U.type==="history"){const j=U.data;f.value=j.map(re=>re.cpu),m.value=j.map(re=>$(re)),_.value=j.map(re=>re.netRxSec),y.value=j.map(re=>re.netTxSec),j.length&&(p.value=j[j.length-1])}else if(U.type==="snapshot"){const j=U.data;p.value=j,k(f,j.cpu),k(m,$(j)),k(_,j.netRxSec),k(y,j.netTxSec)}}catch{}},C.onclose=()=>{C=null,setTimeout(S,3e3)}}function v(){document.hidden||S()}function k(H,O){H.value=[...H.value.slice(-59),O]}function $(H){return H.memTotal?Math.round((H.memTotal-H.memFree)/H.memTotal*100):0}function L(H){return H<1024?`${H} B`:H<1024**2?`${(H/1024).toFixed(1)} KB`:H<1024**3?`${(H/1024**2).toFixed(1)} MB`:`${(H/1024**3).toFixed(1)} GB`}function V(H){const O=Math.floor(H/86400),U=Math.floor(H%86400/3600),j=Math.floor(H%3600/60);return O>0?`${O}d ${U}h`:U>0?`${U}h ${j}m`:`${j}m`}const P=Y(()=>p.value?L(p.value.memTotal-p.value.memFree):"—"),D=Y(()=>p.value?L(p.value.memTotal):"—"),x=Y(()=>p.value?$(p.value):0);return ut(async()=>{i.setPage("Dashboard"),t.fetchPlugins();try{o.value=await Ie.system()}catch{}try{const H=await Ie.qr();u.value=H.error??"",H.setupURI&&(c.value=H.pincode??"",l.value=await va.toDataURL(H.setupURI,{width:148,margin:1,color:{dark:"#000000",light:"#ffffff"}}))}catch{}S(),document.addEventListener("visibilitychange",v)}),Pi(()=>{C==null||C.close(),C=null,document.removeEventListener("visibilitychange",v)}),(H,O)=>{const U=Ye,j=yl,re=qn,Q=m$,ie=j4,G=ai;return g(),E("div",ER,[b("div",$R,[q(j,{class:"hk-card"},{default:te(()=>[O[0]||(O[0]=b("div",{class:"card-title"},"HomeKit Pairing",-1)),b("div",xR,[l.value?(g(),E("div",TR,[b("img",{src:l.value,alt:"HomeKit QR Code",class:"qr-img"},null,8,NR)])):(g(),E("div",HR,[q(U,{name:oe(pR),size:48},null,8,["name"]),b("span",null,Z(u.value?"HomeKit bridge unavailable":"No HAP bridge configured"),1)])),b("div",PR,[c.value?(g(),E("div",OR,Z(c.value),1)):F("",!0),c.value?(g(),E("div",IR,"Scan to add to HomeKit")):F("",!0),b("div",RR,[b("span",{class:Te(["dot",h.value])},null,2),ce(" "+Z(d.value),1)]),u.value?(g(),E("div",DR,Z(u.value),1)):F("",!0)])])]),_:1}),q(j,{class:"sys-card"},{default:te(()=>{var de;return[O[12]||(O[12]=b("div",{class:"card-title"},"System Information",-1)),o.value?(g(),E("div",VR,[O[1]||(O[1]=b("span",{class:"sys-key"},"OS",-1)),b("span",BR,Z(o.value.os),1),O[2]||(O[2]=b("span",{class:"sys-key"},"Arch",-1)),b("span",ZR,Z(o.value.arch),1),O[3]||(O[3]=b("span",{class:"sys-key"},"Hostname",-1)),b("span",FR,Z(o.value.hostname),1),O[4]||(O[4]=b("span",{class:"sys-key"},"IP Address",-1)),b("span",zR,Z(o.value.ip),1),O[5]||(O[5]=b("span",{class:"sys-key"},"User",-1)),b("span",UR,Z(o.value.user),1),O[6]||(O[6]=b("span",{class:"sys-key"},"Node.js",-1)),b("span",WR,Z(o.value.nodeVersion),1),O[7]||(O[7]=b("span",{class:"sys-key"},"OpenBridge",-1)),b("span",jR,"v"+Z(((de=oe(t).health)==null?void 0:de.version)??"—"),1),O[8]||(O[8]=b("span",{class:"sys-key"},"Config",-1)),b("span",KR,Z(o.value.configPath),1),O[9]||(O[9]=b("span",{class:"sys-key"},"OB plugins",-1)),b("span",qR,Z(o.value.obPluginsDir),1),O[10]||(O[10]=b("span",{class:"sys-key"},"HB plugins",-1)),b("span",GR,Z(o.value.hbPluginsDir),1)])):(g(),E("div",YR,[q(U,{name:oe(Dn),size:16},null,8,["name"]),O[11]||(O[11]=ce(" Loading... ",-1))]))]}),_:1}),q(j,{class:"plugins-card"},{default:te(()=>[b("div",XR,[O[13]||(O[13]=ce(" Plugins ",-1)),b("span",JR,[q(re,{variant:"green"},{default:te(()=>[ce(Z(oe(t).runningCount)+" running",1)]),_:1}),oe(t).errorCount?(g(),E("span",QR,Z(oe(t).errorCount)+" error",1)):F("",!0)])]),oe(t).plugins.length===0?(g(),E("div",eD,"No plugins loaded yet.")):(g(),E("div",tD,[(g(!0),E(we,null,Ze(oe(t).plugins,de=>(g(),E("div",{key:de.id,class:"plugin-row"},[b("div",{class:Te(["plugin-dot",de.status])},null,2),b("span",iD,Z(de.manifest.name),1),b("span",rD,"v"+Z(de.manifest.version),1),de.source==="homebridge"?(g(),he(re,{key:0,variant:"orange",size:"sm"},{default:te(()=>[...O[14]||(O[14]=[ce("HB",-1)])]),_:1})):F("",!0),q(re,{variant:r(de.status),size:"sm"},{default:te(()=>[ce(Z(de.status),1)]),_:2},1032,["variant"])]))),128))]))]),_:1})]),b("div",sD,[q(j,{class:"metric-card"},{default:te(()=>{var de,pe;return[b("div",nD,[b("div",aD,[q(U,{name:oe(mR),size:13},null,8,["name"])]),O[15]||(O[15]=b("span",{class:"metric-title"},"CPU",-1))]),b("div",oD,[b("div",lD,[ce(Z(((de=p.value)==null?void 0:de.cpu)??"—")+" ",1),O[16]||(O[16]=b("span",{class:"metric-unit"},"%",-1))]),(pe=p.value)!=null&&pe.cpuTemp&&p.value.cpuTemp>0?(g(),E("div",cD,Z(p.value.cpuTemp)+"°C",1)):F("",!0)]),b("div",uD,[q(Q,{data:f.value,color:"var(--nb-c-primary)",height:40},null,8,["data"])])]}),_:1}),q(j,{class:"metric-card"},{default:te(()=>[b("div",hD,[b("div",dD,[q(U,{name:oe(vR),size:13},null,8,["name"])]),O[17]||(O[17]=b("span",{class:"metric-title"},"Memory",-1))]),b("div",fD,[b("div",pD,[ce(Z(x.value)+" ",1),O[18]||(O[18]=b("span",{class:"metric-unit"},"%",-1))]),b("div",_D,Z(P.value)+" / "+Z(D.value),1)]),q(ie,{value:x.value,max:100,size:"sm"},null,8,["value"]),b("div",mD,[q(Q,{data:m.value,color:"var(--nb-c-info)",height:32},null,8,["data"])])]),_:1}),q(j,{class:"metric-card"},{default:te(()=>[b("div",gD,[b("div",vD,[q(U,{name:oe(yR),size:13},null,8,["name"])]),O[19]||(O[19]=b("span",{class:"metric-title"},"Uptime",-1))]),b("div",bD,[b("div",yD,[b("span",wD,Z(o.value?V(o.value.uptimeSystem):"—"),1),O[20]||(O[20]=b("span",{class:"uptime-label"},"System",-1))]),O[22]||(O[22]=b("div",{class:"uptime-divider"},null,-1)),b("div",SD,[b("span",CD,Z(o.value?V(o.value.uptimeProcess):"—"),1),O[21]||(O[21]=b("span",{class:"uptime-label"},"Process",-1))])]),b("div",kD,[q(G,{variant:"secondary",size:"sm",outlined:"",style:{width:"100%","justify-content":"center"},loading:s.value,icon:n.value?bs:s.value?ll:Xs,onClick:a},{default:te(()=>[ce(Z(n.value?"Restarted":s.value?"Restarting…":"Restart OpenBridge"),1)]),_:1},8,["loading","icon"])])]),_:1}),q(j,{class:"metric-card net-card"},{default:te(()=>[b("div",AD,[b("div",MD,[q(U,{name:oe(Du),size:13},null,8,["name"])]),O[23]||(O[23]=b("span",{class:"metric-title"},"Network",-1))]),b("div",LD,[b("div",null,[b("div",ED,Z(p.value?L(p.value.netRxSec)+"/s":"—"),1),O[24]||(O[24]=b("div",{class:"net-label"},"↓ Received",-1))]),b("div",null,[b("div",$D,Z(p.value?L(p.value.netTxSec)+"/s":"—"),1),O[25]||(O[25]=b("div",{class:"net-label"},"↑ Sent",-1))])]),b("div",xD,[q(Q,{data:_.value,color:"var(--nb-c-success)",height:28},null,8,["data"]),q(Q,{data:y.value,color:"var(--nb-c-warning)",height:28},null,8,["data"])])]),_:1})])])}}}),ND=jt(TD,[["__scopeId","data-v-d9b075b5"]]),ya=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},HD=ya("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"/>'),PD=ya("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"/>'),r8=ya("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"/>'),OD=ya("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"/>'),ID=ya("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"/>'),RD=ya("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"/>'),DD="arrow-clockwise",VD=Object.freeze(Object.defineProperty({__proto__:null,bold:OD,default:r8,duotone:RD,fill:ID,glyphName:DD,light:PD,regular:r8,thin:HD},Symbol.toStringTag,{value:"Module"})),Fg=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),wa=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},BD=wa("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"/>'),ZD=wa("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"/>'),s8=wa("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"/>'),FD=wa("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"/>'),zD=wa("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"/>'),UD=wa("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"/>'),WD="list",zg=Object.freeze(Object.defineProperty({__proto__:null,bold:FD,default:s8,duotone:UD,fill:zD,glyphName:WD,light:ZD,regular:s8,thin:BD},Symbol.toStringTag,{value:"Module"})),Sa=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},jD=Sa("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"/>'),KD=Sa("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"/>'),n8=Sa("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"/>'),qD=Sa("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"/>'),GD=Sa("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"/>'),YD=Sa("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"/>'),XD="squares-four",Ug=Object.freeze(Object.defineProperty({__proto__:null,bold:qD,default:n8,duotone:YD,fill:GD,glyphName:XD,light:KD,regular:n8,thin:jD},Symbol.toStringTag,{value:"Module"})),JD={key:0,class:"plugin-cards"},QD={class:"plugin-avatar"},eV=["src","alt"],tV={class:"plugin-meta"},iV={class:"plugin-name"},rV={key:0,class:"plugin-platform"},sV={class:"plugin-version"},nV={key:0,class:"plugin-desc"},aV={key:1,class:"plugin-author"},oV={key:2,class:"plugin-links"},lV=["href"],cV=["href"],uV={key:3,class:"plugin-error"},hV={class:"cell-name"},dV={class:"plugin-avatar plugin-avatar--sm"},fV=["src","alt"],pV={class:"plugin-name"},_V={key:0,class:"plugin-platform"},mV=Re({__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=X({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=Y(()=>{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=qn,d=Xi,f=yl,m=B4;return e.view==="cards"?(g(),E("div",JD,[(g(!0),E(we,null,Ze(e.rows,_=>(g(),he(f,{key:_.plugin.id,class:Te(["plugin-card",{"plugin-card--selected":_.plugin.id===e.selectedId}]),onClick:y=>r("select",_.plugin)},{default:te(()=>[b("span",{class:Te(["plugin-card__accent",`plugin-card__accent--${_.plugin.status}`])},null,2),q(d,{dir:"row",align:"start",gap:"sm",class:"plugin-card__header"},{default:te(()=>[b("div",QD,[_.avatarUrl?(g(),E("img",{key:0,src:_.avatarUrl,alt:_.plugin.manifest.name,onError:c[0]||(c[0]=y=>y.target.style.display="none")},null,40,eV)):(g(),he(u,{key:1,name:_.isOpenBridge?oe(yn):oe(en),size:20},null,8,["name"]))]),b("div",tV,[b("div",iV,Z(_.plugin.manifest.name),1),_.plugin.source==="homebridge"&&_.plugin.platformName?(g(),E("div",rV," Platform: "+Z(_.plugin.platformName),1)):F("",!0),b("div",sV,[ce(" v"+Z(_.plugin.manifest.version)+" ",1),_.plugin.availableUpdate?(g(),he(h,{key:0,variant:"blue",size:"sm"},{default:te(()=>[ce(" v"+Z(_.plugin.availableUpdate)+" available ",1)]),_:2},1024)):F("",!0)])]),q(h,{variant:s(_.plugin.status)},{default:te(()=>[ce(Z(_.plugin.status),1)]),_:2},1032,["variant"])]),_:2},1024),_.plugin.manifest.description?(g(),E("p",nV,Z(_.plugin.manifest.description),1)):F("",!0),_.plugin.manifest.author?(g(),E("p",aV,"by "+Z(_.plugin.manifest.author),1)):F("",!0),_.sponsorUrl||_.docsUrl?(g(),E("div",oV,[_.sponsorUrl?(g(),E("a",{key:0,href:_.sponsorUrl,target:"_blank",rel:"noopener",onClick:c[1]||(c[1]=lt(()=>{},["stop"]))},[q(u,{name:oe(Vg),weight:"fill",size:11},null,8,["name"]),c[6]||(c[6]=ce(" Sponsor ",-1))],8,lV)):F("",!0),_.docsUrl?(g(),E("a",{key:1,href:_.docsUrl,target:"_blank",rel:"noopener",onClick:c[2]||(c[2]=lt(()=>{},["stop"]))},[q(u,{name:oe(Bg),size:11},null,8,["name"]),c[7]||(c[7]=ce(" Docs ",-1))],8,cV)):F("",!0)])):F("",!0),_.plugin.error?(g(),E("div",uV,Z(_.plugin.error),1)):F("",!0)]),_:2},1032,["class","onClick"]))),128))])):(g(),he(m,{key:1,columns:a,rows:o.value,"row-key":"id",size:"sm",zebra:"","sort-state":n.value,onSort:c[4]||(c[4]=_=>n.value=_),onRowClick:c[5]||(c[5]=_=>r("select",_.plugin))},{"cell-name":te(({row:_})=>[b("div",hV,[b("div",dV,[_.avatarUrl?(g(),E("img",{key:0,src:_.avatarUrl,alt:_.name,onError:c[3]||(c[3]=y=>y.target.style.display="none")},null,40,fV)):(g(),he(u,{key:1,name:_.isOpenBridge?oe(yn):oe(en),size:14},null,8,["name"]))]),b("div",null,[b("div",pV,Z(_.name),1),_.platform?(g(),E("div",_V,"Platform: "+Z(_.platform),1)):F("",!0)])])]),"cell-version":te(({row:_})=>[ce(Z(_.version)+" ",1),_.availableUpdate?(g(),he(h,{key:0,variant:"blue",size:"sm"},{default:te(()=>[ce("v"+Z(_.availableUpdate),1)]),_:2},1024)):F("",!0)]),"cell-status":te(({row:_})=>[q(h,{variant:s(_.status)},{default:te(()=>[ce(Z(_.status),1)]),_:2},1032,["variant"])]),_:1},8,["rows","sort-state"]))}}}),gV=jt(mV,[["__scopeId","data-v-8fdf7ec9"]]),vV={class:"plugins-view"},bV={key:0,class:"empty-state"},yV={key:0},a8="openbridge.plugins.view",wV=Re({__name:"PluginsView",setup(e){const t=Ls(),i=Sl(),r=nn(),s=Zg(),n=X(""),a=X(new Map),o=X(new Set),l=X(!1),c=X(localStorage.getItem(a8)==="table"?"table":"cards");function u(){c.value=c.value==="cards"?"table":"cards",localStorage.setItem(a8,c.value)}const h=Y(()=>{var P;return i.visible&&i.mode==="plugin"?((P=i.selectedPlugin)==null?void 0:P.id)??null:null}),d=Y(()=>_().map(P=>{const D=C(P);return{plugin:P,avatarUrl:$(P),isOpenBridge:p(P),sponsorUrl:D==null?void 0:D.githubSponsorsUrl,docsUrl:D==null?void 0:D.documentationUrl}}));function f(P){if(P.source==="homebridge"){const x=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/);if(x!=null&&x[1])return x[1]}return P.manifest.name}function m(P){var O;const x=(O=(P.manifest.description??"").match(/Homebridge platform:\s*([^\s]+)/))==null?void 0:O[1],H=[f(P),x,P.manifest.name,P.id];return Array.from(new Set(H.filter(U=>!!U&&U.trim().length>0)))}function _(){const P=n.value.toLowerCase();return t.plugins.filter(D=>D.manifest.name.toLowerCase().includes(P)||(D.manifest.description??"").toLowerCase().includes(P))}function y(P){var D;((D=i.selectedPlugin)==null?void 0:D.id)===P.id&&i.visible&&i.mode==="plugin"?i.close():i.openPlugin(P)}function p(P){return P.manifest.name.includes("openbridge-")||P.source==="native"}function C(P){const D=m(P);for(const x of D){const H=a.value.get(x);if(H)return H}if(P.enrichedMetadata)return P.enrichedMetadata}async function S(P,D=!1){var H;const x=m(P);for(const O of x)if(!(!D&&a.value.has(O))&&!(!D&&o.value.has(O))){o.value.add(O);try{const U=await Ie.marketplace.enriched(O),j=new Map(a.value);if(j.set(O,U),j.set(f(P),U),a.value=j,P.enrichedMetadata=U,U.documentationUrl||U.githubSponsorsUrl||(H=U.links)!=null&&H.repository)return}catch{}finally{const U=new Set(o.value);U.delete(O),o.value=U}}}const v=X(new Map);function k(P){const x=P.trim().replace(/^github:/,"https://github.com/").replace(/^git\+/,"").replace(/^git@github\.com:/,"https://github.com/").match(/github\.com[/:]([^/]+)/);return x?`https://github.com/${x[1]}.png?size=48`:null}function $(P){var O,U;const D=C(P),x=((O=D==null?void 0:D.links)==null?void 0:O.repository)??((U=D==null?void 0:D.links)==null?void 0:U.homepage)??"";if(x){const j=k(x);if(j)return j}const H=m(P);for(const j of H){const re=v.value.get(j);if(re)return re}return null}async function L(P,D=!1){var x;if(!(!D&&v.value.has(P)))try{const H=await fetch(`https://registry.npmjs.org/${encodeURIComponent(P)}/latest`,{signal:AbortSignal.timeout(5e3)});if(!H.ok){v.value.set(P,"");return}const O=await H.json(),U=((x=O==null?void 0:O.repository)==null?void 0:x.url)??(O==null?void 0:O.homepage)??"";v.value.set(P,k(U)??"")}catch{v.value.set(P,"")}}async function V(P=!1){if(!l.value){l.value=!0;try{P&&(a.value=new Map,v.value=new Map);const D=t.plugins;for(const x of D){const H=m(x);for(const O of H)await L(O,P);await S(x,P)}P&&s.success("Plugin metadata refreshed")}catch{s.error("Failed to refresh plugin metadata")}finally{l.value=!1}}}return ut(async()=>{await t.fetchPlugins()}),Ue(()=>t.plugins.length,P=>{r.setPage("Plugins",P)},{immediate:!0}),(P,D)=>{const x=la,H=ai,O=Ye;return g(),E("div",vV,[(g(),he(gr,{defer:"",to:"#ob-topbar-right"},[q(x,{modelValue:n.value,"onUpdate:modelValue":D[0]||(D[0]=U=>n.value=U),placeholder:"Search plugins...",size:"sm",style:{width:"200px"}},null,8,["modelValue"]),q(H,{variant:"ghost",size:"sm",icon:VD,title:"Refresh metadata",loading:l.value,disabled:l.value,onClick:D[1]||(D[1]=U=>V(!0))},null,8,["loading","disabled"]),q(H,{variant:"ghost",size:"sm",icon:c.value===Fg?zg:Ug,title:c.value==="cards"?"Show as table":"Show as cards",onClick:u},null,8,["icon","title"]),q(H,{variant:"primary",size:"sm",icon:Ef,onClick:D[2]||(D[2]=U=>oe(i).openMarketplace())},{default:te(()=>[...D[5]||(D[5]=[ce(" Browse plugins ",-1)])]),_:1})])),d.value.length===0?(g(),E("div",bV,[q(O,{name:oe(en),size:40},null,8,["name"]),n.value?(g(),E("p",yV,'No plugins matching "'+Z(n.value)+'"',1)):(g(),E(we,{key:1},[D[7]||(D[7]=b("p",null,"No plugins loaded yet.",-1)),q(H,{variant:"primary",size:"sm",icon:Ef,onClick:D[3]||(D[3]=U=>oe(i).openMarketplace())},{default:te(()=>[...D[6]||(D[6]=[ce(" Browse & install plugins ",-1)])]),_:1})],64))])):(g(),E("div",{key:1,class:"plugins-body",onClick:D[4]||(D[4]=lt(U=>oe(i).close(),["self"]))},[q(gV,{rows:d.value,view:c.value,"selected-id":h.value,onSelect:y},null,8,["rows","view","selected-id"])]))])}}}),SV=jt(wV,[["__scopeId","data-v-95e3ebc4"]]),Ca=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},CV=Ca("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"/>'),kV=Ca("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"/>'),Vu=Ca("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"/>'),AV=Ca("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"/>'),MV=Ca("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"/>'),LV=Ca("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"/>'),EV="devices",$V=Object.freeze(Object.defineProperty({__proto__:null,bold:AV,default:Vu,duotone:LV,fill:MV,glyphName:EV,light:kV,regular:Vu,thin:CV},Symbol.toStringTag,{value:"Module"})),xV={class:"devices-view"},TV={class:"toolbar-count"},NV={key:1,class:"empty-state"},HV={class:"device-icon native-icon"},PV={class:"device-info"},OV={class:"device-name"},IV={class:"device-type"},RV={class:"device-summary"},DV={key:0,class:"summary-primary"},VV={class:"summary-primary"},BV={key:0,class:"summary-secondary"},ZV={key:2,class:"summary-primary"},FV=["title"],zV={class:"device-info"},UV={class:"device-name"},WV={class:"device-type"},jV={key:0,class:"device-summary"},KV={class:"summary-primary"},qV=["title"],GV=["title"],YV={key:1},XV={class:"confirm-dialog"},JV={class:"confirm-icon"},QV={class:"confirm-message"},eB={class:"confirm-actions"},o8="openbridge.devices.view",tB=Re({__name:"DevicesView",setup(e){const t=Ls(),i=Sl(),r=wl();function s(N){var T;return((T=N.health)==null?void 0:T.status)==="stale"}function n(N){return N<90?`${Math.round(N)} seconds`:N<5400?`${Math.round(N/60)} minutes`:N<172800?`${Math.round(N/3600)} hours`:`${Math.round(N/86400)} days`}function a(N){const T=N.health;if(!T||T.status!=="stale")return"";const K=["Not responding"];return T.silentForSeconds!==null?K.push(`Silent for ${n(T.silentForSeconds)}.`):T.lastSeen&&K.push(`Last seen ${new Date(T.lastSeen).toLocaleString()}.`),T.reason&&K.push(T.reason),K.push("OpenBridge is running: the device itself is not answering. Check it is powered and reachable at its configured address.","Click to open it for its address, readings and recent events."),K.join(`
68
68
  `)}const o=["Not responding","HomeKit reports this accessory as unreachable. Check it is powered and on the network.","Click to open it for its services and characteristics."].join(`
69
- `);function l(N){var K;const T=(K=N.health)==null?void 0:K.status;return T==="ok"?"online":T==="stale"?"stale":"offline"}function c(N){var K;const T=(K=N.health)==null?void 0:K.status;return T==="ok"?"Responding":T==="stale"?"Not responding":"No data yet"}function u(N){r.push({name:"device-detail",params:{id:N.id}})}const h=nn(),d=X(!1),f=X([]),m=X(localStorage.getItem(o8)==="table"?"table":"cards");function _(){m.value=m.value==="cards"?"table":"cards",localStorage.setItem(o8,m.value)}const y=X({key:"name",direction:"asc"}),p=[{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}],C=Y(()=>{const N=[...f.value.map(J=>({key:"native:"+J.id,name:J.name,type:O(v(J)),source:"Native",state:J.telemetry.active===void 0?"":J.telemetry.active?"On":"Off",stateOn:!!J.telemetry.active,detail:S(J),icon:H(v(J)),unhealthy:s(J),healthTooltip:a(J),select:()=>L(J)})),...t.accessories.map(J=>{const le=Q(J);return{key:"hap:"+J.uuid,name:J.displayName,type:P(J.category).label,source:"HomeKit",state:J.reachable?le?le.value?"On":"Off":"":"Not responding",stateOn:J.reachable&&!!(le!=null&&le.value),detail:ie(J)??"",icon:P(J.category).icon,unhealthy:!J.reachable,healthTooltip:J.reachable?"":o,select:()=>$(J)}})],T=y.value;if(!T||T.direction==="none")return N;const K=T.direction==="asc"?1:-1;return[...N].sort((J,le)=>K*String(J[T.key]??"").localeCompare(String(le[T.key]??"")))});function S(N){const T=N.telemetry;return N.widgetType==="energy_meter"&&T.power!==void 0?`${de(T.power,1)} W`:N.widgetType==="thermostat"&&T.currentTemperature!==void 0?`${de(T.currentTemperature,1)}°C`:N.widgetType==="dehumidifier"&&T.currentHumidity!==void 0?`${de(T.currentHumidity,0)}%`:T.power!==void 0?`${de(T.power,1)} W`:""}function v(N){return N.homekitType||N.widgetType}const k=Y(()=>i.mode!=="device"||!i.selectedDevice?null:i.selectedDevice.kind==="native"?i.selectedDevice.dev.id:i.selectedDevice.acc.uuid);function $(N){k.value===N.uuid?i.close():i.openDevice({kind:"hap",acc:N})}function L(N){k.value===N.id?i.close():i.openDevice({kind:"native",dev:N})}const V={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 P(N){return V[N]??{label:`Category ${N}`,icon:"cube"}}const D={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse"},x={switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",gate:"Gate",sensor:"Sensor"};function H(N){return D[N]??"cube"}function O(N){return x[N]??N}const U=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]),j=new Set(["On","Active","LockTargetState","TargetDoorState"]);function re(N){return N.services.find(T=>!U.has(T.name)&&!U.has(T.uuid))}function Q(N){const T=re(N);return T?T.characteristics.find(K=>j.has(K.name)&&K.perms.includes("pw"))??null:null}function ie(N){if(!N.reachable)return"Not responding";const T=re(N);if(!T)return null;for(const J of T.characteristics){if(J.name==="CurrentTemperature"&&J.value!=null)return`${Number(J.value).toFixed(1)}°C`;if(J.name==="CurrentRelativeHumidity"&&J.value!=null)return`${Math.round(Number(J.value))}%`;if(J.name==="CurrentPosition"&&J.value!=null)return`${Math.round(Number(J.value))}%`;if(J.name==="Brightness"&&J.value!=null)return`${Math.round(Number(J.value))}%`}const K=T.characteristics.find(J=>J.name==="On");return K?K.value?"On":"Off":null}async function G(N,T){const K=re(N),J=Q(N);if(!(!K||!J))try{await Ie.setCharacteristic(N.uuid,K.uuid,J.uuid,T?1:0),await t.fetchAccessories()}catch(le){console.error("HAP control failed",le)}}function de(N,T=1){if(N==null)return"—";const K=Number(N);return isFinite(K)?K.toFixed(T):String(N)}const pe=Y(()=>t.accessories.length+f.value.length);async function _e(){var N;try{const T=await Ie.devices();if(f.value=T.devices,i.mode==="device"&&((N=i.selectedDevice)==null?void 0:N.kind)==="native"){const K=i.selectedDevice.dev.id,J=T.devices.find(le=>le.id===K);J&&i.updateDevice({kind:"native",dev:J})}}catch{}}async function Ne(){d.value=!0,await Promise.all([t.fetchAccessories(),_e()]),d.value=!1}let Le=null;const ye=X({visible:!1,deviceId:"",control:"",value:null,message:""});function ge(N,T,K){return N.widgetType==="energy_meter"&&T==="active"?K?`Turn on ${N.name}? This will energise the connected circuit.`:`Turn off ${N.name}? This will cut power to the connected circuit.`:!1}async function I(N,T,K){try{await Ie.controlDevice(N,T,K),await _e()}catch(J){console.error("Control failed",J)}}function ee(N,T,K){const J=ge(N,T,K);J?ye.value={visible:!0,deviceId:N.id,control:T,value:K,message:J}:I(N.id,T,K)}function ne(){const{deviceId:N,control:T,value:K}=ye.value;ye.value.visible=!1,I(N,T,K)}function ve(){ye.value.visible=!1}async function ke(){var N;if(await Promise.all([t.fetchAccessories(),_e()]),i.mode==="device"&&((N=i.selectedDevice)==null?void 0:N.kind)==="hap"){const T=i.selectedDevice.acc.uuid,K=t.accessories.find(J=>J.uuid===T);K&&i.updateDevice({kind:"hap",acc:K})}}return ut(async()=>{h.setPage("Devices"),await ke(),Le=setInterval(ke,3e3)}),Pi(()=>{Le&&clearInterval(Le)}),(N,T)=>{const K=qn,J=ai,le=Ye,ue=bc,w=q4,A=yl,B=B4;return g(),E("div",xV,[pe.value>0?(g(),he(gr,{key:0,defer:"",to:"#ob-topbar-left"},[b("span",TV,Z(pe.value)+" device"+Z(pe.value!==1?"s":""),1),f.value.length>0?(g(),he(K,{key:0},{default:te(()=>[ce(Z(f.value.length)+" native",1)]),_:1})):F("",!0)])):F("",!0),(g(),he(gr,{defer:"",to:"#ob-topbar-right"},[q(J,{variant:"ghost",size:"sm",icon:m.value===Fg?zg:Ug,title:m.value==="cards"?"Show as table":"Show as cards",onClick:_},null,8,["icon","title"]),q(J,{variant:"ghost",size:"sm",icon:Xs,title:"Refresh",loading:d.value,onClick:Ne},null,8,["loading"])])),pe.value===0?(g(),E("div",NV,[q(le,{name:oe(Vu),size:40},null,8,["name"]),T[8]||(T[8]=b("p",null,"No devices registered yet.",-1)),T[9]||(T[9]=b("p",{class:"empty-hint"},[ce(" Devices appear here once a platform plugin registers accessories. "),b("br"),ce(" This page auto-refreshes every 3 seconds: discovery can take up to 60s. ")],-1))])):(g(),E("div",{key:2,class:"devices-layout",onClick:T[7]||(T[7]=lt(M=>oe(i).close(),["self"]))},[m.value==="cards"?(g(),E("div",{key:0,class:"device-grid",onClick:T[4]||(T[4]=lt(M=>oe(i).close(),["self"]))},[(g(!0),E(we,null,Ze(f.value,M=>(g(),he(A,{key:"native:"+M.id,class:Te(["device-card native-card",{selected:k.value===M.id,unhealthy:s(M)}]),title:s(M)?a(M):void 0,onClick:R=>L(M),onDblclick:R=>u(M)},{default:te(()=>{var R;return[T[10]||(T[10]=b("span",{class:"device-card__accent"},null,-1)),b("div",HV,[q(le,{name:H(v(M)),size:22},null,8,["name"])]),b("div",PV,[b("div",OV,[s(M)?(g(),he(le,{key:0,name:oe(pr),size:14,class:"name-health-icon"},null,8,["name"])):F("",!0),b("span",null,Z(M.name),1)]),b("div",IV,Z(O(v(M))),1),b("div",RV,[M.widgetType==="energy_meter"&&M.telemetry.power!==void 0?(g(),E("span",DV,Z(de(M.telemetry.power,1))+" W",1)):M.widgetType==="thermostat"&&M.telemetry.currentTemperature!==void 0?(g(),E(we,{key:1},[b("span",VV,Z(de(M.telemetry.currentTemperature,1))+"°C",1),M.telemetry.targetTemperature!==void 0?(g(),E("span",BV," target "+Z(de(M.telemetry.targetTemperature,1))+"°C ",1)):F("",!0)],64)):M.widgetType==="dehumidifier"&&M.telemetry.currentHumidity!==void 0?(g(),E("span",ZV,Z(de(M.telemetry.currentHumidity,0))+"%",1)):M.telemetry.active!==void 0?(g(),E("span",{key:3,class:Te(["summary-status",M.telemetry.active?"on":"off"])},Z(M.telemetry.active?"On":"Off"),3)):F("",!0)]),M.telemetry.active!==void 0?(g(),E("div",{key:0,class:"card-controls",onClick:T[0]||(T[0]=lt(()=>{},["stop"]))},[q(ue,{name:`device-active-${M.id}`,"model-value":!!M.telemetry.active,"onUpdate:modelValue":z=>ee(M,"active",z)},null,8,["name","model-value","onUpdate:modelValue"])])):F("",!0),M.widgetType==="thermostat"&&M.telemetry.targetTemperature!==void 0?(g(),E("div",{key:1,class:"card-controls",onClick:T[1]||(T[1]=lt(()=>{},["stop"]))},[q(w,{"model-value":Number(M.telemetry.targetTemperature),size:"xs",min:5,max:35,step:1,"onUpdate:modelValue":z=>z!==null&&I(M.id,"targetTemperature",z)},null,8,["model-value","onUpdate:modelValue"])])):F("",!0),M.widgetType==="dehumidifier"&&M.telemetry.targetHumidity!==void 0?(g(),E("div",{key:2,class:"card-controls",onClick:T[2]||(T[2]=lt(()=>{},["stop"]))},[q(w,{"model-value":Number(M.telemetry.targetHumidity),size:"xs",min:30,max:80,step:5,"onUpdate:modelValue":z=>z!==null&&I(M.id,"targetHumidity",z)},null,8,["model-value","onUpdate:modelValue"])])):F("",!0)]),b("div",{class:Te(["device-reachability",l(M)]),title:((R=M.health)==null?void 0:R.reason)??c(M)},null,10,FV)]}),_:2},1032,["class","title","onClick","onDblclick"]))),128)),(g(!0),E(we,null,Ze(oe(t).accessories,M=>(g(),he(A,{key:M.uuid,class:Te(["device-card hap-card",{selected:k.value===M.uuid,unreachable:!M.reachable,unhealthy:!M.reachable}]),title:M.reachable?void 0:oe(o),onClick:R=>$(M)},{default:te(()=>{var R;return[b("div",{class:Te(["device-icon hap-icon",{unreachable:!M.reachable}])},[q(le,{name:P(M.category).icon,size:22},null,8,["name"])],2),b("div",zV,[b("div",UV,[M.reachable?F("",!0):(g(),he(le,{key:0,name:oe(pr),size:14,class:"name-health-icon"},null,8,["name"])),b("span",null,Z(M.displayName),1)]),b("div",WV,Z(P(M.category).label),1),ie(M)?(g(),E("div",jV,[b("span",KV,Z(ie(M)),1)])):F("",!0),Q(M)?(g(),E("div",{key:1,class:"card-controls",onClick:T[3]||(T[3]=lt(()=>{},["stop"]))},[q(ue,{name:`hap-on-${M.uuid}`,"model-value":!!((R=Q(M))!=null&&R.value),"onUpdate:modelValue":z=>G(M,!!z)},null,8,["name","model-value","onUpdate:modelValue"])])):F("",!0)]),b("div",{class:Te(["device-reachability",M.reachable?"online":"stale"]),title:M.reachable?"Responding":oe(o)},null,10,qV)]}),_:2},1032,["class","title","onClick"]))),128))])):(g(),he(B,{key:1,columns:p,rows:C.value,"row-key":"key",size:"sm",zebra:"","sort-state":y.value,onSort:T[5]||(T[5]=M=>y.value=M),onRowClick:T[6]||(T[6]=M=>M.select())},{"cell-name":te(({row:M})=>[b("div",{class:"cell-name",title:M.healthTooltip||void 0},[q(le,{name:M.icon,size:16},null,8,["name"]),b("span",null,Z(M.name),1),M.unhealthy?(g(),he(le,{key:0,name:oe(pr),size:14,class:"cell-health-icon"},null,8,["name"])):F("",!0)],8,GV)]),"cell-state":te(({row:M})=>[M.state?(g(),he(K,{key:0,variant:M.unhealthy?"orange":M.stateOn?"green":"grey"},{default:te(()=>[ce(Z(M.state),1)]),_:2},1032,["variant"])):(g(),E("span",YV,"—"))]),_:1},8,["rows","sort-state"]))])),(g(),he(gr,{to:"body"},[ye.value.visible?(g(),E("div",{key:0,class:"confirm-overlay",onClick:lt(ve,["self"])},[b("div",XV,[b("div",JV,[q(le,{name:oe(pr),size:24},null,8,["name"])]),b("p",QV,Z(ye.value.message),1),b("div",eB,[q(J,{variant:"ghost",size:"sm",onClick:ve},{default:te(()=>[...T[11]||(T[11]=[ce("Cancel",-1)])]),_:1}),q(J,{variant:"primary",size:"sm",onClick:ne},{default:te(()=>[...T[12]||(T[12]=[ce("Confirm",-1)])]),_:1})])])])):F("",!0)]))])}}}),iB=jt(tB,[["__scopeId","data-v-d92f6868"]]),ka=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},rB=ka("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"/>'),sB=ka("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"/>'),l8=ka("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"/>'),nB=ka("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"/>'),aB=ka("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"/>'),oB=ka("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"/>'),lB="arrow-left",cB=Object.freeze(Object.defineProperty({__proto__:null,bold:nB,default:l8,duotone:oB,fill:aB,glyphName:lB,light:sB,regular:l8,thin:rB},Symbol.toStringTag,{value:"Module"})),uB={class:"device-detail"},hB={key:0,class:"detail-message"},dB={class:"summary-row"},fB=["onClick"],pB={class:"tile-label"},_B={class:"tile-value"},mB={class:"tile-unit"},gB={key:0,class:"detail-message"},vB={class:"chart-toolbar"},bB={class:"range-tabs"},yB=["onClick"],wB={key:0,class:"resolution-note"},SB={class:"chart-panel"},CB={key:1,class:"chart-empty"},kB={key:2,class:"chart-empty"},AB={key:2,class:"detail-message"},MB=Re({__name:"DeviceDetailView",setup(e){const t=kc(),i=wl(),r=Y(()=>String(t.params.id??"")),s=X(null),n=X([]),a=X(""),o=X(!1),l=X(""),c=X(0),u=X([]),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=X("24h"),f=Y(()=>{var D;return((D=s.value)==null?void 0:D.model)??"Device"}),m=Y(()=>n.value.find(D=>D.key===a.value)??null),_=Y(()=>{const D=m.value;if(!D||u.value.length===0)return[];const x={name:D.label,data:u.value.map(O=>({x:new Date(O.t*1e3),y:O.value??0}))};return u.value.some(O=>O.min!==void 0&&O.min!==null&&O.min!==O.value)?[x,{name:"Min",data:u.value.map(O=>({x:new Date(O.t*1e3),y:O.min??O.value??0}))},{name:"Max",data:u.value.map(O=>({x:new Date(O.t*1e3),y:O.max??O.value??0}))}]:[x]}),y=Y(()=>{if(!c.value)return"";const D=c.value;return D<60?`${D}s resolution`:D<3600?`${Math.round(D/60)} min resolution`:`${Math.round(D/3600)} h resolution`});function p(D){var O,U;const x=(U=(O=s.value)==null?void 0:O.telemetry)==null?void 0:U[D.key],H=Number(x);return Number.isFinite(H)?H:null}function C(D,x){return D===null?"—":D.toFixed(x.precision??2)}function S(){i.push({name:"devices"})}function v(D){a.value!==D&&(a.value=D,L())}function k(D){d.value!==D&&(d.value=D,L())}async function $(){try{const{devices:D}=await Ie.devices(),x=D.find(H=>H.id===r.value);if(!x){l.value=`Device "${r.value}" was not found. It may have been removed, or its plugin stopped.`;return}s.value=x,n.value=x.metrics??[],!a.value&&n.value.length>0&&(a.value=n.value[0].key)}catch(D){l.value=`Could not load device: ${D.message}`}}async function L(){var O,U;if(!a.value)return;const D=h.find(j=>j.key===d.value),x=Math.floor(Date.now()/1e3),H=x-D.seconds;o.value=!0;try{const j=await Ie.deviceMetrics(r.value,{metric:a.value,from:H,to:x});u.value=((O=j.series)==null?void 0:O.points)??[],c.value=((U=j.series)==null?void 0:U.resolution)??0}catch(j){l.value=`Could not load history: ${j.message}`}finally{o.value=!1}}let V=null,P=null;return ut(async()=>{await $(),await L(),V=setInterval(()=>void $(),5e3),P=setInterval(()=>void L(),3e4)}),Ki(()=>{V&&clearInterval(V),P&&clearInterval(P)}),Ue(r,async()=>{s.value=null,n.value=[],a.value="",u.value=[],l.value="",await $(),await L()}),(D,x)=>{var re;const H=ai,O=u4,U=ot,j=LL;return g(),E("div",uB,[q(O,{title:f.value,subtitle:((re=s.value)==null?void 0:re.name)??r.value},{default:te(()=>[q(H,{variant:"ghost",size:"sm",icon:cB,onClick:S},{default:te(()=>[...x[0]||(x[0]=[ce("Devices",-1)])]),_:1})]),_:1},8,["title","subtitle"]),l.value?(g(),E("div",hB,[q(U,{variant:"error"},{default:te(()=>[ce(Z(l.value),1)]),_:1})])):s.value?(g(),E(we,{key:1},[b("div",dB,[(g(!0),E(we,null,Ze(n.value,Q=>(g(),E("div",{key:Q.key,class:Te(["summary-tile",{active:Q.key===a.value}]),onClick:ie=>v(Q.key)},[b("span",pB,Z(Q.label),1),b("span",_B,[ce(Z(C(p(Q),Q))+" ",1),b("span",mB,Z(Q.unit),1)])],10,fB))),128))]),n.value.length===0?(g(),E("div",gB,[q(U,{variant:"helper"},{default:te(()=>[...x[1]||(x[1]=[ce(" 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})])):(g(),E(we,{key:1},[b("div",vB,[b("div",bB,[(g(),E(we,null,Ze(h,Q=>b("button",{key:Q.key,class:Te(["range-tab",{active:Q.key===d.value}]),onClick:ie=>k(Q.key)},Z(Q.label),11,yB)),64))]),y.value?(g(),E("span",wB,Z(y.value),1)):F("",!0)]),b("div",SB,[_.value.length>0&&_.value[0].data.length>0?(g(),he(j,{key:0,series:_.value,height:320,"show-legend":_.value.length>1,"show-grid":!0,"show-tooltip":!0,points:!1,curve:"smooth"},null,8,["series","show-legend"])):o.value?(g(),E("div",CB,"Loading…")):(g(),E("div",kB," No data recorded yet for this range. History starts accumulating once the device reports. "))])],64))],64)):(g(),E("div",AB,"Loading…"))])}}}),LB=jt(MB,[["__scopeId","data-v-df1516e5"]]),Aa=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},EB=Aa("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"/>'),$B=Aa("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"/>'),c8=Aa("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"/>'),xB=Aa("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"/>'),TB=Aa("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"/>'),NB=Aa("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"/>'),HB="magic-wand",PB=Object.freeze(Object.defineProperty({__proto__:null,bold:xB,default:c8,duotone:NB,fill:TB,glyphName:HB,light:$B,regular:c8,thin:EB},Symbol.toStringTag,{value:"Module"})),OB={class:"config-view"},IB={key:0,class:"error-banner"},RB={key:1,class:"loading-state"},DB=Re({__name:"ConfigView",setup(e){const t=nn(),{resolved:i}=vd(),r=X(null),s=Cr(null),n=X(!1),a=X(!1),o=X(null),l=X(!0);ut(async()=>{t.setPage("Config",void 0,{fullBleed:!0});let h="{}";try{h=(await Ie.config.get()).content}catch(f){o.value=`Failed to load config: ${f}`}finally{l.value=!1}const d=await Dg.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&&(Ue(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}))}),Ki(()=>{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 Ie.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=ai,m=Ye;return g(),E("div",OB,[(g(),he(gr,{defer:"",to:"#ob-topbar-left"},[d[0]||(d[0]=b("span",{class:"config-path"},"~/.openbridge/config.json",-1))])),(g(),he(gr,{defer:"",to:"#ob-topbar-right"},[q(f,{variant:"ghost",size:"sm",icon:PB,title:"Format JSON",onClick:u},{default:te(()=>[...d[1]||(d[1]=[ce("Format",-1)])]),_:1}),q(f,{variant:"primary",size:"sm",icon:a.value?bs:B0,loading:n.value,disabled:n.value,title:"Changes take effect after restarting the daemon",onClick:c},{default:te(()=>[ce(Z(a.value?"Saved!":n.value?"Saving…":"Save"),1)]),_:1},8,["icon","loading","disabled"])])),o.value?(g(),E("div",IB,[q(m,{name:oe(pr),size:14},null,8,["name"]),ce(" "+Z(o.value),1)])):F("",!0),l.value?(g(),E("div",RB,[q(m,{name:oe(Dn),size:28},null,8,["name"]),d[2]||(d[2]=b("span",null,"Loading config...",-1))])):(g(),E("div",{key:2,ref_key:"editorContainer",ref:r,class:"editor-container"},null,512))])}}}),VB=jt(DB,[["__scopeId","data-v-483debe2"]]),BB=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},ZB=BB("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"/>'),FB={class:"settings-view"},zB={class:"card-header"},UB={class:"card-icon"},WB={class:"pin-row"},jB={class:"card-actions"},KB={key:0,class:"action-hint"},qB={class:"card-header"},GB={class:"card-icon"},YB={class:"update-row"},XB={class:"update-versions"},JB={class:"update-actions"},QB={class:"update-command"},eZ={key:3,class:"update-error-row"},tZ={class:"info-title"},iZ=Re({__name:"SettingsView",setup(e){const t=nn(),i=[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warn"},{value:"error",label:"Error"}],r=X(!1),s=X(!1),n=X(null),a=X(!1),o=X(null),l=X(!1),c=X(!1),u=X(!1),h=X(null),d=X(""),f=X(0),m=X("");let _=null;async function y(){l.value=!0,h.value=null;try{o.value=await Ie.updates.check()}catch(P){h.value=String(P)}finally{l.value=!1}}function p(){const P=location.protocol==="https:"?"wss":"ws";_=new WebSocket(`${P}://${location.host}/ws/updates`),_.onmessage=D=>{try{const x=JSON.parse(D.data);d.value=x.stage??"",f.value=Math.round((x.progress??0)*100),m.value=x.message??"",x.stage==="restarting"&&C(),x.stage==="error"&&(h.value=x.message,c.value=!1)}catch{}},_.onclose=()=>{c.value&&C()}}function C(){let P=0;const D=setInterval(async()=>{P++;try{await Ie.health(),clearInterval(D),c.value=!1,d.value="",m.value="",o.value=null,await y()}catch{}P>60&&(clearInterval(D),c.value=!1,h.value="Timed out waiting for restart")},2e3)}async function S(){if(!c.value){c.value=!0,u.value=!1,h.value=null,d.value="downloading",m.value="Starting update...",f.value=0,p();try{await Ie.updates.apply(),u.value=!0}catch(P){h.value=P instanceof Error?P.message:String(P),c.value=!1}}}async function v(){if(!c.value){c.value=!0,h.value=null,m.value="Rolling back...";try{await Ie.updates.rollback(),C()}catch(P){h.value=P instanceof Error?P.message:String(P),c.value=!1}}}const k=X({name:"OpenBridge",port:8582,hapPort:51829,pincode:"031-45-154",username:"",logLevel:"info"});ut(async()=>{t.setPage("Settings");try{const P=await Ie.bridge();P&&typeof P=="object"&&(k.value={name:P.name??"OpenBridge",port:P.port??8582,hapPort:P.hapPort??51829,pincode:P.pincode??"031-45-154",username:P.username??"",logLevel:P.logLevel??"info"})}catch{}y()}),Pi(()=>{_&&(_.close(),_=null)});async function $(){if(!r.value){r.value=!0,n.value=null,s.value=!1;try{const P={name:k.value.name,port:Number(k.value.port),hapPort:Number(k.value.hapPort),pincode:k.value.pincode,logLevel:k.value.logLevel};k.value.username&&(P.username=k.value.username),await Ie.saveBridge(P),s.value=!0,setTimeout(()=>{s.value=!1},3e3)}catch(P){n.value=String(P)}finally{r.value=!1}}}async function L(){if(!a.value){a.value=!0;try{await Ie.daemon.restart();let P=0;const D=setInterval(async()=>{P++;try{await Ie.health(),clearInterval(D),location.reload()}catch{}P>60&&(clearInterval(D),a.value=!1)},1e3)}catch{a.value=!1}}}function V(){const P=()=>Math.floor(Math.random()*9)+1,D=()=>`${P()}${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`,x=()=>`${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`;k.value.pincode=`${D()}-${x()}-${D()}`}return(P,D)=>{const x=Ye,H=la,O=md,U=q4,j=ai,re=yc,Q=Xi,ie=ot,G=yl,de=qn,pe=j4;return g(),E("div",FB,[q(G,{class:"settings-card"},{default:te(()=>[b("div",zB,[b("div",UB,[q(x,{name:oe(ZB),size:18},null,8,["name"])]),D[6]||(D[6]=b("div",null,[b("h2",{class:"card-title"},"Bridge"),b("p",{class:"card-subtitle"},"HomeKit bridge identity and network settings")],-1))]),q(Q,{dir:"col",gap:"sm",class:"field-grid"},{default:te(()=>[q(O,{label:"Bridge name",hint:"Displayed in the Home app"},{default:te(()=>[q(H,{modelValue:k.value.name,"onUpdate:modelValue":D[0]||(D[0]=_e=>k.value.name=_e),size:"sm",placeholder:"OpenBridge"},null,8,["modelValue"])]),_:1}),q(O,{label:"HTTP port",hint:"OpenBridge web UI & API",control:"fit"},{default:te(()=>[q(U,{modelValue:k.value.port,"onUpdate:modelValue":D[1]||(D[1]=_e=>k.value.port=_e),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),q(O,{label:"HAP port",hint:"HomeKit accessory protocol port",control:"fit"},{default:te(()=>[q(U,{modelValue:k.value.hapPort,"onUpdate:modelValue":D[2]||(D[2]=_e=>k.value.hapPort=_e),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),q(O,{label:"PIN code",hint:"Format: XXX-XX-XXX, used to pair with HomeKit"},{default:te(()=>[b("div",WB,[q(H,{modelValue:k.value.pincode,"onUpdate:modelValue":D[3]||(D[3]=_e=>k.value.pincode=_e),size:"sm",placeholder:"031-45-154"},null,8,["modelValue"]),q(j,{variant:"ghost",size:"sm",icon:Xs,title:"Generate random PIN",onClick:V})])]),_:1}),q(O,{label:"Bridge MAC",hint:"Leave empty to auto-generate. Change this only if pairing with HomeKit fails."},{default:te(()=>[q(H,{modelValue:k.value.username,"onUpdate:modelValue":D[4]||(D[4]=_e=>k.value.username=_e),size:"sm",class:"mono",placeholder:"AA:BB:CC:DD:EE:FF"},null,8,["modelValue"])]),_:1}),q(O,{label:"Log level",control:"fit"},{default:te(()=>[q(re,{modelValue:k.value.logLevel,"onUpdate:modelValue":D[5]||(D[5]=_e=>k.value.logLevel=_e),size:"sm",options:i},null,8,["modelValue"])]),_:1})]),_:1}),n.value?(g(),he(ie,{key:0,variant:"error"},{default:te(()=>[ce(Z(n.value),1)]),_:1})):F("",!0),b("div",jB,[q(j,{variant:"primary",size:"sm",loading:r.value,icon:s.value?bs:B0,onClick:$},{default:te(()=>[ce(Z(s.value?"Saved!":"Save"),1)]),_:1},8,["loading","icon"]),q(j,{variant:"secondary",size:"sm",outlined:"",loading:a.value,icon:a.value?ll:Xs,onClick:L},{default:te(()=>[ce(Z(a.value?"Restarting…":"Save & Restart OpenBridge"),1)]),_:1},8,["loading","icon"]),s.value&&!a.value?(g(),E("span",KB,[q(x,{name:oe(x0),size:12},null,8,["name"]),D[7]||(D[7]=ce(" Restart the daemon for changes to take effect ",-1))])):F("",!0)])]),_:1}),q(G,{class:"settings-card"},{default:te(()=>{var _e,Ne;return[b("div",qB,[b("div",GB,[q(x,{name:oe(Hu),size:18},null,8,["name"])]),D[8]||(D[8]=b("div",null,[b("h2",{class:"card-title"},"Updates"),b("p",{class:"card-subtitle"},"OpenBridge daemon and UI")],-1))]),b("div",YB,[b("div",XB,[q(de,{variant:"grey"},{default:te(()=>{var Le;return[ce("Current: v"+Z(((Le=o.value)==null?void 0:Le.current)??"…"),1)]}),_:1}),o.value&&!l.value?(g(),E(we,{key:0},[o.value.updateAvailable?(g(),he(de,{key:0,variant:"blue"},{default:te(()=>[ce("Available: v"+Z(o.value.latest),1)]),_:1})):o.value.latest===null?(g(),he(de,{key:1,variant:"orange"},{default:te(()=>[...D[9]||(D[9]=[ce("Unable to check",-1)])]),_:1})):(g(),he(de,{key:2,variant:"green"},{default:te(()=>[...D[10]||(D[10]=[ce("Up to date",-1)])]),_:1}))],64)):F("",!0),l.value?(g(),he(de,{key:1,variant:"grey"},{default:te(()=>[...D[11]||(D[11]=[ce("Checking…",-1)])]),_:1})):F("",!0)]),b("div",JB,[q(j,{variant:"secondary",size:"sm",outlined:"",loading:l.value,icon:Xs,onClick:y},{default:te(()=>[...D[12]||(D[12]=[ce(" Check ",-1)])]),_:1},8,["loading"]),(_e=o.value)!=null&&_e.updateAvailable&&o.value.updateMethod==="self"?(g(),he(j,{key:0,variant:"primary",size:"sm",loading:c.value,icon:c.value?ll:wd,onClick:S},{default:te(()=>[ce(Z(c.value?"Updating…":"Install update"),1)]),_:1},8,["loading","icon"])):F("",!0)])]),c.value&&d.value?(g(),he(pe,{key:0,label:m.value,value:d.value==="downloading"&&f.value>0?f.value:void 0,max:100,status:"active",size:"sm"},null,8,["label","value"])):F("",!0),c.value&&!d.value?(g(),he(ie,{key:1,variant:"helper"},{default:te(()=>[...D[13]||(D[13]=[ce(" Starting update... This page will reconnect automatically. ",-1)])]),_:1})):F("",!0),((Ne=o.value)==null?void 0:Ne.updateMethod)==="manual"&&o.value.updateAvailable?(g(),he(ie,{key:2,variant:"helper"},{default:te(()=>[o.value.pinnedTo?(g(),E(we,{key:0},[ce(" This deployment is pinned to "+Z(o.value.pinnedTo)+". To move version: ",1)],64)):o.value.updateBlockedBy?(g(),E(we,{key:1},[ce(" Self-update is not available here ("+Z(o.value.updateBlockedBy)+"). To update: ",1)],64)):(g(),E(we,{key:2},[ce("Self-update is not available for this install. To update:")],64)),b("code",QB,Z(o.value.updateCommand),1)]),_:1})):F("",!0),h.value?(g(),E("div",eZ,[q(ie,{variant:"error"},{default:te(()=>[ce(Z(h.value),1)]),_:1}),u.value?(g(),he(j,{key:0,variant:"ghost",size:"sm",onClick:v},{default:te(()=>[...D[14]||(D[14]=[ce("Rollback",-1)])]),_:1})):F("",!0)])):F("",!0)]}),_:1}),q(G,{class:"settings-card info-card"},{default:te(()=>[b("h3",tZ,[q(x,{name:oe(x0),size:14},null,8,["name"]),D[15]||(D[15]=ce(" How to pair with HomeKit ",-1))]),D[16]||(D[16]=b("ol",{class:"info-list"},[b("li",null,[ce(" Open the "),b("strong",null,"Home"),ce(" app on your iPhone or iPad ")]),b("li",null,[ce(" Tap "),b("strong",null,"+"),ce(" → "),b("strong",null,"Add Accessory")]),b("li",null,[ce(" Scan the QR code from the Dashboard, or tap "),b("strong",null,"More options"),ce(" 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})])}}}),rZ=jt(iZ,[["__scopeId","data-v-4dc01a9f"]]);/**
69
+ `);function l(N){var K;const T=(K=N.health)==null?void 0:K.status;return T==="ok"?"online":T==="stale"?"stale":"offline"}function c(N){var K;const T=(K=N.health)==null?void 0:K.status;return T==="ok"?"Responding":T==="stale"?"Not responding":"No data yet"}function u(N){r.push({name:"device-detail",params:{id:N.id}})}const h=nn(),d=X(!1),f=X([]),m=X(localStorage.getItem(o8)==="table"?"table":"cards");function _(){m.value=m.value==="cards"?"table":"cards",localStorage.setItem(o8,m.value)}const y=X({key:"name",direction:"asc"}),p=[{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}],C=Y(()=>{const N=[...f.value.map(J=>({key:"native:"+J.id,name:J.name,type:O(v(J)),source:"Native",state:J.telemetry.active===void 0?"":J.telemetry.active?"On":"Off",stateOn:!!J.telemetry.active,detail:S(J),icon:H(v(J)),unhealthy:s(J),healthTooltip:a(J),select:()=>L(J)})),...t.accessories.map(J=>{const le=Q(J);return{key:"hap:"+J.uuid,name:J.displayName,type:P(J.category).label,source:"HomeKit",state:J.reachable?le?le.value?"On":"Off":"":"Not responding",stateOn:J.reachable&&!!(le!=null&&le.value),detail:ie(J)??"",icon:P(J.category).icon,unhealthy:!J.reachable,healthTooltip:J.reachable?"":o,select:()=>$(J)}})],T=y.value;if(!T||T.direction==="none")return N;const K=T.direction==="asc"?1:-1;return[...N].sort((J,le)=>K*String(J[T.key]??"").localeCompare(String(le[T.key]??"")))});function S(N){const T=N.telemetry;return N.widgetType==="energy_meter"&&T.power!==void 0?`${de(T.power,1)} W`:N.widgetType==="thermostat"&&T.currentTemperature!==void 0?`${de(T.currentTemperature,1)}°C`:N.widgetType==="dehumidifier"&&T.currentHumidity!==void 0?`${de(T.currentHumidity,0)}%`:T.power!==void 0?`${de(T.power,1)} W`:""}function v(N){return N.homekitType||N.widgetType}const k=Y(()=>i.mode!=="device"||!i.selectedDevice?null:i.selectedDevice.kind==="native"?i.selectedDevice.dev.id:i.selectedDevice.acc.uuid);function $(N){k.value===N.uuid?i.close():i.openDevice({kind:"hap",acc:N})}function L(N){k.value===N.id?i.close():i.openDevice({kind:"native",dev:N})}const V={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 P(N){return V[N]??{label:`Category ${N}`,icon:"cube"}}const D={switch:"plugs",light:"lightbulb",thermostat:"thermometer",dehumidifier:"drop",energy_meter:"lightning",gate:"garage",sensor:"pulse",camera:"camera"},x={camera:"Camera",switch:"Switch",light:"Light",thermostat:"Thermostat",dehumidifier:"Dehumidifier",energy_meter:"Energy Meter",gate:"Gate",sensor:"Sensor"};function H(N){return D[N]??"cube"}function O(N){return x[N]??N}const U=new Set(["AccessoryInformation","0000003E-0000-1000-8000-0026BB765291","ProtocolInformation","000000A2-0000-1000-8000-0026BB765291"]),j=new Set(["On","Active","LockTargetState","TargetDoorState"]);function re(N){return N.services.find(T=>!U.has(T.name)&&!U.has(T.uuid))}function Q(N){const T=re(N);return T?T.characteristics.find(K=>j.has(K.name)&&K.perms.includes("pw"))??null:null}function ie(N){if(!N.reachable)return"Not responding";const T=re(N);if(!T)return null;for(const J of T.characteristics){if(J.name==="CurrentTemperature"&&J.value!=null)return`${Number(J.value).toFixed(1)}°C`;if(J.name==="CurrentRelativeHumidity"&&J.value!=null)return`${Math.round(Number(J.value))}%`;if(J.name==="CurrentPosition"&&J.value!=null)return`${Math.round(Number(J.value))}%`;if(J.name==="Brightness"&&J.value!=null)return`${Math.round(Number(J.value))}%`}const K=T.characteristics.find(J=>J.name==="On");return K?K.value?"On":"Off":null}async function G(N,T){const K=re(N),J=Q(N);if(!(!K||!J))try{await Ie.setCharacteristic(N.uuid,K.uuid,J.uuid,T?1:0),await t.fetchAccessories()}catch(le){console.error("HAP control failed",le)}}function de(N,T=1){if(N==null)return"—";const K=Number(N);return isFinite(K)?K.toFixed(T):String(N)}const pe=Y(()=>t.accessories.length+f.value.length);async function _e(){var N;try{const T=await Ie.devices();if(f.value=T.devices,i.mode==="device"&&((N=i.selectedDevice)==null?void 0:N.kind)==="native"){const K=i.selectedDevice.dev.id,J=T.devices.find(le=>le.id===K);J&&i.updateDevice({kind:"native",dev:J})}}catch{}}async function Ne(){d.value=!0,await Promise.all([t.fetchAccessories(),_e()]),d.value=!1}let Le=null;const ye=X({visible:!1,deviceId:"",control:"",value:null,message:""});function ge(N,T,K){return N.widgetType==="energy_meter"&&T==="active"?K?`Turn on ${N.name}? This will energise the connected circuit.`:`Turn off ${N.name}? This will cut power to the connected circuit.`:!1}async function I(N,T,K){try{await Ie.controlDevice(N,T,K),await _e()}catch(J){console.error("Control failed",J)}}function ee(N,T,K){const J=ge(N,T,K);J?ye.value={visible:!0,deviceId:N.id,control:T,value:K,message:J}:I(N.id,T,K)}function ne(){const{deviceId:N,control:T,value:K}=ye.value;ye.value.visible=!1,I(N,T,K)}function ve(){ye.value.visible=!1}async function ke(){var N;if(await Promise.all([t.fetchAccessories(),_e()]),i.mode==="device"&&((N=i.selectedDevice)==null?void 0:N.kind)==="hap"){const T=i.selectedDevice.acc.uuid,K=t.accessories.find(J=>J.uuid===T);K&&i.updateDevice({kind:"hap",acc:K})}}return ut(async()=>{h.setPage("Devices"),await ke(),Le=setInterval(ke,3e3)}),Pi(()=>{Le&&clearInterval(Le)}),(N,T)=>{const K=qn,J=ai,le=Ye,ue=bc,w=q4,A=yl,B=B4;return g(),E("div",xV,[pe.value>0?(g(),he(gr,{key:0,defer:"",to:"#ob-topbar-left"},[b("span",TV,Z(pe.value)+" device"+Z(pe.value!==1?"s":""),1),f.value.length>0?(g(),he(K,{key:0},{default:te(()=>[ce(Z(f.value.length)+" native",1)]),_:1})):F("",!0)])):F("",!0),(g(),he(gr,{defer:"",to:"#ob-topbar-right"},[q(J,{variant:"ghost",size:"sm",icon:m.value===Fg?zg:Ug,title:m.value==="cards"?"Show as table":"Show as cards",onClick:_},null,8,["icon","title"]),q(J,{variant:"ghost",size:"sm",icon:Xs,title:"Refresh",loading:d.value,onClick:Ne},null,8,["loading"])])),pe.value===0?(g(),E("div",NV,[q(le,{name:oe(Vu),size:40},null,8,["name"]),T[8]||(T[8]=b("p",null,"No devices registered yet.",-1)),T[9]||(T[9]=b("p",{class:"empty-hint"},[ce(" Devices appear here once a platform plugin registers accessories. "),b("br"),ce(" This page auto-refreshes every 3 seconds: discovery can take up to 60s. ")],-1))])):(g(),E("div",{key:2,class:"devices-layout",onClick:T[7]||(T[7]=lt(M=>oe(i).close(),["self"]))},[m.value==="cards"?(g(),E("div",{key:0,class:"device-grid",onClick:T[4]||(T[4]=lt(M=>oe(i).close(),["self"]))},[(g(!0),E(we,null,Ze(f.value,M=>(g(),he(A,{key:"native:"+M.id,class:Te(["device-card native-card",{selected:k.value===M.id,unhealthy:s(M)}]),title:s(M)?a(M):void 0,onClick:R=>L(M),onDblclick:R=>u(M)},{default:te(()=>{var R;return[T[10]||(T[10]=b("span",{class:"device-card__accent"},null,-1)),b("div",HV,[q(le,{name:H(v(M)),size:22},null,8,["name"])]),b("div",PV,[b("div",OV,[s(M)?(g(),he(le,{key:0,name:oe(pr),size:14,class:"name-health-icon"},null,8,["name"])):F("",!0),b("span",null,Z(M.name),1)]),b("div",IV,Z(O(v(M))),1),b("div",RV,[M.widgetType==="energy_meter"&&M.telemetry.power!==void 0?(g(),E("span",DV,Z(de(M.telemetry.power,1))+" W",1)):M.widgetType==="thermostat"&&M.telemetry.currentTemperature!==void 0?(g(),E(we,{key:1},[b("span",VV,Z(de(M.telemetry.currentTemperature,1))+"°C",1),M.telemetry.targetTemperature!==void 0?(g(),E("span",BV," target "+Z(de(M.telemetry.targetTemperature,1))+"°C ",1)):F("",!0)],64)):M.widgetType==="dehumidifier"&&M.telemetry.currentHumidity!==void 0?(g(),E("span",ZV,Z(de(M.telemetry.currentHumidity,0))+"%",1)):M.telemetry.active!==void 0?(g(),E("span",{key:3,class:Te(["summary-status",M.telemetry.active?"on":"off"])},Z(M.telemetry.active?"On":"Off"),3)):F("",!0)]),M.telemetry.active!==void 0?(g(),E("div",{key:0,class:"card-controls",onClick:T[0]||(T[0]=lt(()=>{},["stop"]))},[q(ue,{name:`device-active-${M.id}`,"model-value":!!M.telemetry.active,"onUpdate:modelValue":z=>ee(M,"active",z)},null,8,["name","model-value","onUpdate:modelValue"])])):F("",!0),M.widgetType==="thermostat"&&M.telemetry.targetTemperature!==void 0?(g(),E("div",{key:1,class:"card-controls",onClick:T[1]||(T[1]=lt(()=>{},["stop"]))},[q(w,{"model-value":Number(M.telemetry.targetTemperature),size:"xs",min:5,max:35,step:1,"onUpdate:modelValue":z=>z!==null&&I(M.id,"targetTemperature",z)},null,8,["model-value","onUpdate:modelValue"])])):F("",!0),M.widgetType==="dehumidifier"&&M.telemetry.targetHumidity!==void 0?(g(),E("div",{key:2,class:"card-controls",onClick:T[2]||(T[2]=lt(()=>{},["stop"]))},[q(w,{"model-value":Number(M.telemetry.targetHumidity),size:"xs",min:30,max:80,step:5,"onUpdate:modelValue":z=>z!==null&&I(M.id,"targetHumidity",z)},null,8,["model-value","onUpdate:modelValue"])])):F("",!0)]),b("div",{class:Te(["device-reachability",l(M)]),title:((R=M.health)==null?void 0:R.reason)??c(M)},null,10,FV)]}),_:2},1032,["class","title","onClick","onDblclick"]))),128)),(g(!0),E(we,null,Ze(oe(t).accessories,M=>(g(),he(A,{key:M.uuid,class:Te(["device-card hap-card",{selected:k.value===M.uuid,unreachable:!M.reachable,unhealthy:!M.reachable}]),title:M.reachable?void 0:oe(o),onClick:R=>$(M)},{default:te(()=>{var R;return[b("div",{class:Te(["device-icon hap-icon",{unreachable:!M.reachable}])},[q(le,{name:P(M.category).icon,size:22},null,8,["name"])],2),b("div",zV,[b("div",UV,[M.reachable?F("",!0):(g(),he(le,{key:0,name:oe(pr),size:14,class:"name-health-icon"},null,8,["name"])),b("span",null,Z(M.displayName),1)]),b("div",WV,Z(P(M.category).label),1),ie(M)?(g(),E("div",jV,[b("span",KV,Z(ie(M)),1)])):F("",!0),Q(M)?(g(),E("div",{key:1,class:"card-controls",onClick:T[3]||(T[3]=lt(()=>{},["stop"]))},[q(ue,{name:`hap-on-${M.uuid}`,"model-value":!!((R=Q(M))!=null&&R.value),"onUpdate:modelValue":z=>G(M,!!z)},null,8,["name","model-value","onUpdate:modelValue"])])):F("",!0)]),b("div",{class:Te(["device-reachability",M.reachable?"online":"stale"]),title:M.reachable?"Responding":oe(o)},null,10,qV)]}),_:2},1032,["class","title","onClick"]))),128))])):(g(),he(B,{key:1,columns:p,rows:C.value,"row-key":"key",size:"sm",zebra:"","sort-state":y.value,onSort:T[5]||(T[5]=M=>y.value=M),onRowClick:T[6]||(T[6]=M=>M.select())},{"cell-name":te(({row:M})=>[b("div",{class:"cell-name",title:M.healthTooltip||void 0},[q(le,{name:M.icon,size:16},null,8,["name"]),b("span",null,Z(M.name),1),M.unhealthy?(g(),he(le,{key:0,name:oe(pr),size:14,class:"cell-health-icon"},null,8,["name"])):F("",!0)],8,GV)]),"cell-state":te(({row:M})=>[M.state?(g(),he(K,{key:0,variant:M.unhealthy?"orange":M.stateOn?"green":"grey"},{default:te(()=>[ce(Z(M.state),1)]),_:2},1032,["variant"])):(g(),E("span",YV,"—"))]),_:1},8,["rows","sort-state"]))])),(g(),he(gr,{to:"body"},[ye.value.visible?(g(),E("div",{key:0,class:"confirm-overlay",onClick:lt(ve,["self"])},[b("div",XV,[b("div",JV,[q(le,{name:oe(pr),size:24},null,8,["name"])]),b("p",QV,Z(ye.value.message),1),b("div",eB,[q(J,{variant:"ghost",size:"sm",onClick:ve},{default:te(()=>[...T[11]||(T[11]=[ce("Cancel",-1)])]),_:1}),q(J,{variant:"primary",size:"sm",onClick:ne},{default:te(()=>[...T[12]||(T[12]=[ce("Confirm",-1)])]),_:1})])])])):F("",!0)]))])}}}),iB=jt(tB,[["__scopeId","data-v-5ae916c1"]]),ka=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},rB=ka("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"/>'),sB=ka("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"/>'),l8=ka("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"/>'),nB=ka("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"/>'),aB=ka("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"/>'),oB=ka("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"/>'),lB="arrow-left",cB=Object.freeze(Object.defineProperty({__proto__:null,bold:nB,default:l8,duotone:oB,fill:aB,glyphName:lB,light:sB,regular:l8,thin:rB},Symbol.toStringTag,{value:"Module"})),uB={class:"device-detail"},hB={key:0,class:"detail-message"},dB={class:"summary-row"},fB=["onClick"],pB={class:"tile-label"},_B={class:"tile-value"},mB={class:"tile-unit"},gB={key:0,class:"detail-message"},vB={class:"chart-toolbar"},bB={class:"range-tabs"},yB=["onClick"],wB={key:0,class:"resolution-note"},SB={class:"chart-panel"},CB={key:1,class:"chart-empty"},kB={key:2,class:"chart-empty"},AB={key:2,class:"detail-message"},MB=Re({__name:"DeviceDetailView",setup(e){const t=kc(),i=wl(),r=Y(()=>String(t.params.id??"")),s=X(null),n=X([]),a=X(""),o=X(!1),l=X(""),c=X(0),u=X([]),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=X("24h"),f=Y(()=>{var D;return((D=s.value)==null?void 0:D.model)??"Device"}),m=Y(()=>n.value.find(D=>D.key===a.value)??null),_=Y(()=>{const D=m.value;if(!D||u.value.length===0)return[];const x={name:D.label,data:u.value.map(O=>({x:new Date(O.t*1e3),y:O.value??0}))};return u.value.some(O=>O.min!==void 0&&O.min!==null&&O.min!==O.value)?[x,{name:"Min",data:u.value.map(O=>({x:new Date(O.t*1e3),y:O.min??O.value??0}))},{name:"Max",data:u.value.map(O=>({x:new Date(O.t*1e3),y:O.max??O.value??0}))}]:[x]}),y=Y(()=>{if(!c.value)return"";const D=c.value;return D<60?`${D}s resolution`:D<3600?`${Math.round(D/60)} min resolution`:`${Math.round(D/3600)} h resolution`});function p(D){var O,U;const x=(U=(O=s.value)==null?void 0:O.telemetry)==null?void 0:U[D.key],H=Number(x);return Number.isFinite(H)?H:null}function C(D,x){return D===null?"—":D.toFixed(x.precision??2)}function S(){i.push({name:"devices"})}function v(D){a.value!==D&&(a.value=D,L())}function k(D){d.value!==D&&(d.value=D,L())}async function $(){try{const{devices:D}=await Ie.devices(),x=D.find(H=>H.id===r.value);if(!x){l.value=`Device "${r.value}" was not found. It may have been removed, or its plugin stopped.`;return}s.value=x,n.value=x.metrics??[],!a.value&&n.value.length>0&&(a.value=n.value[0].key)}catch(D){l.value=`Could not load device: ${D.message}`}}async function L(){var O,U;if(!a.value)return;const D=h.find(j=>j.key===d.value),x=Math.floor(Date.now()/1e3),H=x-D.seconds;o.value=!0;try{const j=await Ie.deviceMetrics(r.value,{metric:a.value,from:H,to:x});u.value=((O=j.series)==null?void 0:O.points)??[],c.value=((U=j.series)==null?void 0:U.resolution)??0}catch(j){l.value=`Could not load history: ${j.message}`}finally{o.value=!1}}let V=null,P=null;return ut(async()=>{await $(),await L(),V=setInterval(()=>void $(),5e3),P=setInterval(()=>void L(),3e4)}),Ki(()=>{V&&clearInterval(V),P&&clearInterval(P)}),Ue(r,async()=>{s.value=null,n.value=[],a.value="",u.value=[],l.value="",await $(),await L()}),(D,x)=>{var re;const H=ai,O=u4,U=ot,j=LL;return g(),E("div",uB,[q(O,{title:f.value,subtitle:((re=s.value)==null?void 0:re.name)??r.value},{default:te(()=>[q(H,{variant:"ghost",size:"sm",icon:cB,onClick:S},{default:te(()=>[...x[0]||(x[0]=[ce("Devices",-1)])]),_:1})]),_:1},8,["title","subtitle"]),l.value?(g(),E("div",hB,[q(U,{variant:"error"},{default:te(()=>[ce(Z(l.value),1)]),_:1})])):s.value?(g(),E(we,{key:1},[b("div",dB,[(g(!0),E(we,null,Ze(n.value,Q=>(g(),E("div",{key:Q.key,class:Te(["summary-tile",{active:Q.key===a.value}]),onClick:ie=>v(Q.key)},[b("span",pB,Z(Q.label),1),b("span",_B,[ce(Z(C(p(Q),Q))+" ",1),b("span",mB,Z(Q.unit),1)])],10,fB))),128))]),n.value.length===0?(g(),E("div",gB,[q(U,{variant:"helper"},{default:te(()=>[...x[1]||(x[1]=[ce(" 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})])):(g(),E(we,{key:1},[b("div",vB,[b("div",bB,[(g(),E(we,null,Ze(h,Q=>b("button",{key:Q.key,class:Te(["range-tab",{active:Q.key===d.value}]),onClick:ie=>k(Q.key)},Z(Q.label),11,yB)),64))]),y.value?(g(),E("span",wB,Z(y.value),1)):F("",!0)]),b("div",SB,[_.value.length>0&&_.value[0].data.length>0?(g(),he(j,{key:0,series:_.value,height:320,"show-legend":_.value.length>1,"show-grid":!0,"show-tooltip":!0,points:!1,curve:"smooth"},null,8,["series","show-legend"])):o.value?(g(),E("div",CB,"Loading…")):(g(),E("div",kB," No data recorded yet for this range. History starts accumulating once the device reports. "))])],64))],64)):(g(),E("div",AB,"Loading…"))])}}}),LB=jt(MB,[["__scopeId","data-v-df1516e5"]]),Aa=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},EB=Aa("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"/>'),$B=Aa("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"/>'),c8=Aa("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"/>'),xB=Aa("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"/>'),TB=Aa("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"/>'),NB=Aa("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"/>'),HB="magic-wand",PB=Object.freeze(Object.defineProperty({__proto__:null,bold:xB,default:c8,duotone:NB,fill:TB,glyphName:HB,light:$B,regular:c8,thin:EB},Symbol.toStringTag,{value:"Module"})),OB={class:"config-view"},IB={key:0,class:"error-banner"},RB={key:1,class:"loading-state"},DB=Re({__name:"ConfigView",setup(e){const t=nn(),{resolved:i}=vd(),r=X(null),s=Cr(null),n=X(!1),a=X(!1),o=X(null),l=X(!0);ut(async()=>{t.setPage("Config",void 0,{fullBleed:!0});let h="{}";try{h=(await Ie.config.get()).content}catch(f){o.value=`Failed to load config: ${f}`}finally{l.value=!1}const d=await Dg.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&&(Ue(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}))}),Ki(()=>{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 Ie.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=ai,m=Ye;return g(),E("div",OB,[(g(),he(gr,{defer:"",to:"#ob-topbar-left"},[d[0]||(d[0]=b("span",{class:"config-path"},"~/.openbridge/config.json",-1))])),(g(),he(gr,{defer:"",to:"#ob-topbar-right"},[q(f,{variant:"ghost",size:"sm",icon:PB,title:"Format JSON",onClick:u},{default:te(()=>[...d[1]||(d[1]=[ce("Format",-1)])]),_:1}),q(f,{variant:"primary",size:"sm",icon:a.value?bs:B0,loading:n.value,disabled:n.value,title:"Changes take effect after restarting the daemon",onClick:c},{default:te(()=>[ce(Z(a.value?"Saved!":n.value?"Saving…":"Save"),1)]),_:1},8,["icon","loading","disabled"])])),o.value?(g(),E("div",IB,[q(m,{name:oe(pr),size:14},null,8,["name"]),ce(" "+Z(o.value),1)])):F("",!0),l.value?(g(),E("div",RB,[q(m,{name:oe(Dn),size:28},null,8,["name"]),d[2]||(d[2]=b("span",null,"Loading config...",-1))])):(g(),E("div",{key:2,ref_key:"editorContainer",ref:r,class:"editor-container"},null,512))])}}}),VB=jt(DB,[["__scopeId","data-v-483debe2"]]),BB=(e,t,i)=>{const r=s=>Me("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:t,fill:"currentColor",...s,innerHTML:i});return r.displayName="NbGlyph",r.glyphName=e,r},ZB=BB("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"/>'),FB={class:"settings-view"},zB={class:"card-header"},UB={class:"card-icon"},WB={class:"pin-row"},jB={class:"card-actions"},KB={key:0,class:"action-hint"},qB={class:"card-header"},GB={class:"card-icon"},YB={class:"update-row"},XB={class:"update-versions"},JB={class:"update-actions"},QB={class:"update-command"},eZ={key:3,class:"update-error-row"},tZ={class:"info-title"},iZ=Re({__name:"SettingsView",setup(e){const t=nn(),i=[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warn"},{value:"error",label:"Error"}],r=X(!1),s=X(!1),n=X(null),a=X(!1),o=X(null),l=X(!1),c=X(!1),u=X(!1),h=X(null),d=X(""),f=X(0),m=X("");let _=null;async function y(){l.value=!0,h.value=null;try{o.value=await Ie.updates.check()}catch(P){h.value=String(P)}finally{l.value=!1}}function p(){const P=location.protocol==="https:"?"wss":"ws";_=new WebSocket(`${P}://${location.host}/ws/updates`),_.onmessage=D=>{try{const x=JSON.parse(D.data);d.value=x.stage??"",f.value=Math.round((x.progress??0)*100),m.value=x.message??"",x.stage==="restarting"&&C(),x.stage==="error"&&(h.value=x.message,c.value=!1)}catch{}},_.onclose=()=>{c.value&&C()}}function C(){let P=0;const D=setInterval(async()=>{P++;try{await Ie.health(),clearInterval(D),c.value=!1,d.value="",m.value="",o.value=null,await y()}catch{}P>60&&(clearInterval(D),c.value=!1,h.value="Timed out waiting for restart")},2e3)}async function S(){if(!c.value){c.value=!0,u.value=!1,h.value=null,d.value="downloading",m.value="Starting update...",f.value=0,p();try{await Ie.updates.apply(),u.value=!0}catch(P){h.value=P instanceof Error?P.message:String(P),c.value=!1}}}async function v(){if(!c.value){c.value=!0,h.value=null,m.value="Rolling back...";try{await Ie.updates.rollback(),C()}catch(P){h.value=P instanceof Error?P.message:String(P),c.value=!1}}}const k=X({name:"OpenBridge",port:8582,hapPort:51829,pincode:"031-45-154",username:"",logLevel:"info"});ut(async()=>{t.setPage("Settings");try{const P=await Ie.bridge();P&&typeof P=="object"&&(k.value={name:P.name??"OpenBridge",port:P.port??8582,hapPort:P.hapPort??51829,pincode:P.pincode??"031-45-154",username:P.username??"",logLevel:P.logLevel??"info"})}catch{}y()}),Pi(()=>{_&&(_.close(),_=null)});async function $(){if(!r.value){r.value=!0,n.value=null,s.value=!1;try{const P={name:k.value.name,port:Number(k.value.port),hapPort:Number(k.value.hapPort),pincode:k.value.pincode,logLevel:k.value.logLevel};k.value.username&&(P.username=k.value.username),await Ie.saveBridge(P),s.value=!0,setTimeout(()=>{s.value=!1},3e3)}catch(P){n.value=String(P)}finally{r.value=!1}}}async function L(){if(!a.value){a.value=!0;try{await Ie.daemon.restart();let P=0;const D=setInterval(async()=>{P++;try{await Ie.health(),clearInterval(D),location.reload()}catch{}P>60&&(clearInterval(D),a.value=!1)},1e3)}catch{a.value=!1}}}function V(){const P=()=>Math.floor(Math.random()*9)+1,D=()=>`${P()}${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`,x=()=>`${Math.floor(Math.random()*10)}${Math.floor(Math.random()*10)}`;k.value.pincode=`${D()}-${x()}-${D()}`}return(P,D)=>{const x=Ye,H=la,O=md,U=q4,j=ai,re=yc,Q=Xi,ie=ot,G=yl,de=qn,pe=j4;return g(),E("div",FB,[q(G,{class:"settings-card"},{default:te(()=>[b("div",zB,[b("div",UB,[q(x,{name:oe(ZB),size:18},null,8,["name"])]),D[6]||(D[6]=b("div",null,[b("h2",{class:"card-title"},"Bridge"),b("p",{class:"card-subtitle"},"HomeKit bridge identity and network settings")],-1))]),q(Q,{dir:"col",gap:"sm",class:"field-grid"},{default:te(()=>[q(O,{label:"Bridge name",hint:"Displayed in the Home app"},{default:te(()=>[q(H,{modelValue:k.value.name,"onUpdate:modelValue":D[0]||(D[0]=_e=>k.value.name=_e),size:"sm",placeholder:"OpenBridge"},null,8,["modelValue"])]),_:1}),q(O,{label:"HTTP port",hint:"OpenBridge web UI & API",control:"fit"},{default:te(()=>[q(U,{modelValue:k.value.port,"onUpdate:modelValue":D[1]||(D[1]=_e=>k.value.port=_e),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),q(O,{label:"HAP port",hint:"HomeKit accessory protocol port",control:"fit"},{default:te(()=>[q(U,{modelValue:k.value.hapPort,"onUpdate:modelValue":D[2]||(D[2]=_e=>k.value.hapPort=_e),size:"sm",min:1024,max:65535},null,8,["modelValue"])]),_:1}),q(O,{label:"PIN code",hint:"Format: XXX-XX-XXX, used to pair with HomeKit"},{default:te(()=>[b("div",WB,[q(H,{modelValue:k.value.pincode,"onUpdate:modelValue":D[3]||(D[3]=_e=>k.value.pincode=_e),size:"sm",placeholder:"031-45-154"},null,8,["modelValue"]),q(j,{variant:"ghost",size:"sm",icon:Xs,title:"Generate random PIN",onClick:V})])]),_:1}),q(O,{label:"Bridge MAC",hint:"Leave empty to auto-generate. Change this only if pairing with HomeKit fails."},{default:te(()=>[q(H,{modelValue:k.value.username,"onUpdate:modelValue":D[4]||(D[4]=_e=>k.value.username=_e),size:"sm",class:"mono",placeholder:"AA:BB:CC:DD:EE:FF"},null,8,["modelValue"])]),_:1}),q(O,{label:"Log level",control:"fit"},{default:te(()=>[q(re,{modelValue:k.value.logLevel,"onUpdate:modelValue":D[5]||(D[5]=_e=>k.value.logLevel=_e),size:"sm",options:i},null,8,["modelValue"])]),_:1})]),_:1}),n.value?(g(),he(ie,{key:0,variant:"error"},{default:te(()=>[ce(Z(n.value),1)]),_:1})):F("",!0),b("div",jB,[q(j,{variant:"primary",size:"sm",loading:r.value,icon:s.value?bs:B0,onClick:$},{default:te(()=>[ce(Z(s.value?"Saved!":"Save"),1)]),_:1},8,["loading","icon"]),q(j,{variant:"secondary",size:"sm",outlined:"",loading:a.value,icon:a.value?ll:Xs,onClick:L},{default:te(()=>[ce(Z(a.value?"Restarting…":"Save & Restart OpenBridge"),1)]),_:1},8,["loading","icon"]),s.value&&!a.value?(g(),E("span",KB,[q(x,{name:oe(x0),size:12},null,8,["name"]),D[7]||(D[7]=ce(" Restart the daemon for changes to take effect ",-1))])):F("",!0)])]),_:1}),q(G,{class:"settings-card"},{default:te(()=>{var _e,Ne;return[b("div",qB,[b("div",GB,[q(x,{name:oe(Hu),size:18},null,8,["name"])]),D[8]||(D[8]=b("div",null,[b("h2",{class:"card-title"},"Updates"),b("p",{class:"card-subtitle"},"OpenBridge daemon and UI")],-1))]),b("div",YB,[b("div",XB,[q(de,{variant:"grey"},{default:te(()=>{var Le;return[ce("Current: v"+Z(((Le=o.value)==null?void 0:Le.current)??"…"),1)]}),_:1}),o.value&&!l.value?(g(),E(we,{key:0},[o.value.updateAvailable?(g(),he(de,{key:0,variant:"blue"},{default:te(()=>[ce("Available: v"+Z(o.value.latest),1)]),_:1})):o.value.latest===null?(g(),he(de,{key:1,variant:"orange"},{default:te(()=>[...D[9]||(D[9]=[ce("Unable to check",-1)])]),_:1})):(g(),he(de,{key:2,variant:"green"},{default:te(()=>[...D[10]||(D[10]=[ce("Up to date",-1)])]),_:1}))],64)):F("",!0),l.value?(g(),he(de,{key:1,variant:"grey"},{default:te(()=>[...D[11]||(D[11]=[ce("Checking…",-1)])]),_:1})):F("",!0)]),b("div",JB,[q(j,{variant:"secondary",size:"sm",outlined:"",loading:l.value,icon:Xs,onClick:y},{default:te(()=>[...D[12]||(D[12]=[ce(" Check ",-1)])]),_:1},8,["loading"]),(_e=o.value)!=null&&_e.updateAvailable&&o.value.updateMethod==="self"?(g(),he(j,{key:0,variant:"primary",size:"sm",loading:c.value,icon:c.value?ll:wd,onClick:S},{default:te(()=>[ce(Z(c.value?"Updating…":"Install update"),1)]),_:1},8,["loading","icon"])):F("",!0)])]),c.value&&d.value?(g(),he(pe,{key:0,label:m.value,value:d.value==="downloading"&&f.value>0?f.value:void 0,max:100,status:"active",size:"sm"},null,8,["label","value"])):F("",!0),c.value&&!d.value?(g(),he(ie,{key:1,variant:"helper"},{default:te(()=>[...D[13]||(D[13]=[ce(" Starting update... This page will reconnect automatically. ",-1)])]),_:1})):F("",!0),((Ne=o.value)==null?void 0:Ne.updateMethod)==="manual"&&o.value.updateAvailable?(g(),he(ie,{key:2,variant:"helper"},{default:te(()=>[o.value.pinnedTo?(g(),E(we,{key:0},[ce(" This deployment is pinned to "+Z(o.value.pinnedTo)+". To move version: ",1)],64)):o.value.updateBlockedBy?(g(),E(we,{key:1},[ce(" Self-update is not available here ("+Z(o.value.updateBlockedBy)+"). To update: ",1)],64)):(g(),E(we,{key:2},[ce("Self-update is not available for this install. To update:")],64)),b("code",QB,Z(o.value.updateCommand),1)]),_:1})):F("",!0),h.value?(g(),E("div",eZ,[q(ie,{variant:"error"},{default:te(()=>[ce(Z(h.value),1)]),_:1}),u.value?(g(),he(j,{key:0,variant:"ghost",size:"sm",onClick:v},{default:te(()=>[...D[14]||(D[14]=[ce("Rollback",-1)])]),_:1})):F("",!0)])):F("",!0)]}),_:1}),q(G,{class:"settings-card info-card"},{default:te(()=>[b("h3",tZ,[q(x,{name:oe(x0),size:14},null,8,["name"]),D[15]||(D[15]=ce(" How to pair with HomeKit ",-1))]),D[16]||(D[16]=b("ol",{class:"info-list"},[b("li",null,[ce(" Open the "),b("strong",null,"Home"),ce(" app on your iPhone or iPad ")]),b("li",null,[ce(" Tap "),b("strong",null,"+"),ce(" → "),b("strong",null,"Add Accessory")]),b("li",null,[ce(" Scan the QR code from the Dashboard, or tap "),b("strong",null,"More options"),ce(" 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})])}}}),rZ=jt(iZ,[["__scopeId","data-v-4dc01a9f"]]);/**
70
70
  * Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
71
71
  * @license MIT
72
72
  *