=r.length);l++){var u=o[l];if(typeof u=="string"||u.content&&typeof u.content=="string"){var c=r[s],d=n.tokenStack[c],f=typeof u=="string"?u:u.content,g=t(a,c),h=f.indexOf(g);if(h>-1){++s;var w=f.substring(0,h),y=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),P=f.substring(h+g.length),_=[];w&&_.push.apply(_,i([w])),_.push(y),P&&_.push.apply(_,i([P])),typeof u=="string"?o.splice.apply(o,[l,1].concat(_)):u.content=_}}else u.content&&i(u.content)}return o}i(n.tokens)}}})})(Prism);var li={},ui;function Dg(){return ui||(ui=1,(function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",function(l){if(/<\?/.test(l.code)){var u=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;e.languages["markup-templating"].buildPlaceholders(l,"php",u)}}),e.hooks.add("after-tokenize",function(l){e.languages["markup-templating"].tokenizePlaceholders(l,"php")})})(Prism)),li}Dg();const Pg={class:"page"},Fg={key:2},Og={class:"script-detail-meta"},Lg=["innerHTML"],Ng={key:1},Mg={class:"script-meta"},Ug={key:0},Bg={class:"scope-name"},Vg={class:"script-info-panel"},jg={key:0,class:"info-row"},Hg={class:"info-value"},Gg={key:1,class:"info-row"},qg={class:"info-value"},zg={key:2,class:"info-row"},Kg={class:"info-value"},Wg={key:1,class:"devices-panel"},Jg={class:"block-title"},Yg={key:2,class:"devices-panel"},Zg={class:"block-title"},Qg={key:3,class:"devices-panel"},Xg={key:2,class:"code-block"},eh=["innerHTML"],th={key:0,class:"form-group"},nh={key:0,class:"form-group"},ah={__name:"ScriptDetailPage",setup(e){const t=ca(),n=yn(),a=wt(),s=mn(),r=Mt(),{areaOptions:i,showAssignModal:o,selectedAreaId:l,assignLoading:u,assignError:c,openAssign:d,submitAssignCore:f}=Qs(),g=Q(()=>t.params.type),h=Q(()=>t.params.id),w=Q(()=>g.value==="actions"),y=Q(()=>g.value==="regular"),P=Q(()=>g.value==="scopes"),_=Q(()=>{var A,X,p;const R=[];return!P.value&&r.has("scripts.edit")&&((A=C.value)!=null&&A.area_id?R.push({label:"Change area",icon:"ph-map-pin",onSelect:ee},{label:"Unassign from area",icon:"ph-x-circle",onSelect:Ve}):R.push({label:"Assign to area",icon:"ph-map-pin",onSelect:ee})),w.value&&r.has("scripts.run")&&R.push({label:"Run",icon:"ph-play",disabled:((X=C.value)==null?void 0:X.state)!=="enabled"||n.isRunning((p=C.value)==null?void 0:p.alias),onSelect:Y}),R}),S=Q(()=>w.value?"Actions":y.value?"Regular":P.value?"Scope":"Script"),E=Q(()=>`Loading ${S.value.toLowerCase()} details`),L=Q(()=>w.value?n.isLoadingActions:y.value?n.isLoadingRegular:P.value?n.isLoadingScopes||n.isLoadingActions||n.isLoadingRegular:!1),D=Q(()=>w.value?n.errorActions:y.value?n.errorRegular:P.value?n.errorScopes:null),T=Q(()=>w.value?n.actions.length>0:y.value?n.regular.length>0:P.value?n.scopes.length>0:!1),C=Q(()=>{const R=h.value;return R?w.value?n.actionByAlias(R):y.value?n.regularByAlias(R):P.value?n.scopeByName(R):null:null}),I=Q(()=>{const R=h.value;return!R||!P.value?[]:n.actionsByScope(R)}),te=Q(()=>{const R=h.value;return!R||!P.value?[]:n.regularByScope(R)}),ue=Q(()=>{var A;const R=(A=C.value)==null?void 0:A.area_id;return R&&a.areasById[String(R)]||null}),ye=Q(()=>P.value?n.isLoadingScopeCode:!1),we=Q(()=>P.value?n.errorScopeCode:null),V=Q(()=>{var R;return w.value||y.value?((R=C.value)==null?void 0:R.code)||"":P.value?n.currentScopeCode:""}),W=Q(()=>{const R=V.value;return R?oi.highlight(R,oi.languages.php,"php"):""});async function Y(){var A,X,p;if(!((A=C.value)!=null&&A.alias))return;const R=await n.runScript(C.value.alias);R!=null&&R.ok?s.success({title:`Ran ${C.value.alias}`,text:(X=n.lastRunResult)!=null&&X.execTime?`Exec time: ${n.lastRunResult.execTime}`:void 0}):s.error({title:`Failed ${C.value.alias}`,text:((p=R==null?void 0:R.error)==null?void 0:p.message)||"Unknown error"})}async function K(R){var m,x;const A=h.value;if(!A)return;let X;w.value?X=await n.setActionState(A,R):y.value?X=await n.setRegularState(A,R):P.value&&(X=await n.setScopeState(A,R));const p=((m=C.value)==null?void 0:m.alias)||A;X&&!X.ok?s.error({title:`Failed to ${R?"enable":"disable"} ${p}`,text:((x=X.error)==null?void 0:x.message)||"Unknown error"}):X&&s.success({title:`${R?"Enabled":"Disabled"} ${p}`})}function ee(){var R;d((R=C.value)==null?void 0:R.area_id)}async function fe(){var X;const R=(X=C.value)==null?void 0:X.id,A=await f(R,n.assignToArea.bind(n));A!=null&&A.ok&&s.success({title:"Assigned",text:"Script assigned to area successfully"})}const Se=Z(!1),Ee=Z(""),be=Z(!1),Me=Z("");function Ve(){C.value&&(Ee.value=`Are you sure you want to unassign script "${C.value.name||C.value.alias}" from its area?`,Me.value="",Se.value=!0)}async function je(){var A;if(!C.value)return;be.value=!0,Me.value="";const R=await n.unassignFromArea(C.value.id);if(be.value=!1,!R.ok){Me.value=((A=R.error)==null?void 0:A.message)||"Failed to unassign script";return}Se.value=!1,s.success({title:"Unassigned",text:"Script unassigned from area successfully"})}async function $e(){const R=h.value;!R||!P.value||await n.loadScopeCode(R)}async function N(){h.value&&(w.value&&n.actions.length===0?await n.loadActions():y.value&&n.regular.length===0?await n.loadRegular():P.value&&n.scopes.length===0&&await n.loadScopes(),P.value&&(n.actions.length===0&&await n.loadActions(),n.regular.length===0&&await n.loadRegular(),await $e()),a.areas.length===0&&await a.loadAreas())}const ae=[{key:"alias",label:"Alias"},{key:"name",label:"Name"},{key:"state",label:"State"}];return bt(()=>{N()}),la(()=>{n.clearScopeCode()}),Ft(()=>[t.params.type,t.params.id],([R,A],[X,p])=>{(R!==X||A!==p)&&(n.clearScopeCode(),N())}),(R,A)=>{const X=sn("router-link");return b(),q("section",Pg,[L.value?(b(),z(_t,{key:0,text:E.value},null,8,["text"])):D.value&&!T.value?(b(),z(pt,{key:1,title:`${S.value} loading failed`,error:D.value,retry:N},null,8,["title","error"])):C.value?(b(),q("div",Fg,[$(v(xt),{title:C.value.name||C.value.alias||C.value.name,kicker:S.value},{actions:k(()=>[v(r).has("scripts.edit")?(b(),z(v(tf),{key:0,"model-value":C.value.state==="enabled",label:"Enabled","onUpdate:modelValue":A[0]||(A[0]=p=>K(p))},null,8,["model-value"])):se("",!0),$(tr,{items:_.value},null,8,["items"])]),_:1},8,["title","kicker"]),F("div",Og,[C.value.icon?(b(),q("div",{key:0,innerHTML:C.value.icon,class:"script-icon"},null,8,Lg)):se("",!0),C.value.description?(b(),q("p",Ng,M(C.value.description),1)):se("",!0),F("div",Mg,[$(v(me),{variant:C.value.state==="enabled"?"success":"secondary"},{default:k(()=>[U(M(C.value.state),1)]),_:1},8,["variant"]),F("code",null,M(C.value.alias||C.value.name),1),C.value.author?(b(),q("small",Ug,M(C.value.author),1)):se("",!0),$(Xs,{area:ue.value,areaId:C.value.area_id},null,8,["area","areaId"]),C.value.scope?(b(),z(X,{key:1,to:{name:"script-detail",params:{type:"scopes",id:C.value.scope}},class:"scope-link"},{default:k(()=>[A[6]||(A[6]=F("span",{class:"scope-label"},"Scope",-1)),F("span",Bg,M(C.value.scope),1),A[7]||(A[7]=F("i",{class:"ph ph-arrow-right"},null,-1))]),_:1},8,["to"])):se("",!0)]),F("div",Vg,[C.value.filename?(b(),q("div",jg,[A[8]||(A[8]=F("span",{class:"info-label text-muted"},"File:",-1)),F("span",Hg,M(C.value.filename),1)])):se("",!0),C.value.path?(b(),q("div",Gg,[A[9]||(A[9]=F("span",{class:"info-label text-muted"},"Path:",-1)),F("span",qg,M(C.value.path),1)])):se("",!0),C.value.created_by?(b(),q("div",zg,[A[10]||(A[10]=F("span",{class:"info-label text-muted"},"Author:",-1)),F("span",Kg,M(C.value.created_by),1)])):se("",!0)])]),P.value?se("",!0):(b(),z(er,{key:0,item:C.value,emptyMessage:"This script is not assigned to any area.",onAssign:ee},{action:k(()=>[v(r).has("scripts.edit")?(b(),z(v(pe),{key:0,variant:"primary",icon:"ph-map-pin",onClick:ee},{default:k(()=>{var p;return[U(M((p=C.value)!=null&&p.area_id?"Change area":"Assign to area"),1)]}),_:1})):se("",!0)]),_:1},8,["item"])),P.value&&I.value.length>0?(b(),q("div",Wg,[F("div",Jg,"Action scripts ("+M(I.value.length)+")",1),$(v(Dn),{rows:I.value,columns:ae},{"cell-state":k(({row:p})=>[$(v(me),{variant:p.state==="enabled"?"success":"secondary"},{default:k(()=>[U(M(p.state),1)]),_:2},1032,["variant"])]),"cell-alias":k(({row:p})=>[$(X,{to:{name:"script-detail",params:{type:"actions",id:p.alias}},class:"script-link"},{default:k(()=>[U(M(p.alias),1)]),_:2},1032,["to"])]),_:1},8,["rows"])])):se("",!0),P.value&&te.value.length>0?(b(),q("div",Yg,[F("div",Zg,"Regular scripts ("+M(te.value.length)+")",1),$(v(Dn),{rows:te.value,columns:ae},{"cell-state":k(({row:p})=>[$(v(me),{variant:p.state==="enabled"?"success":"secondary"},{default:k(()=>[U(M(p.state),1)]),_:2},1032,["variant"])]),"cell-alias":k(({row:p})=>[$(X,{to:{name:"script-detail",params:{type:"regular",id:p.alias}},class:"script-link"},{default:k(()=>[U(M(p.alias),1)]),_:2},1032,["to"])]),_:1},8,["rows"])])):se("",!0),C.value.code||P.value?(b(),q("div",Qg,[A[11]||(A[11]=F("div",{class:"block-title"},"Source code",-1)),ye.value?(b(),z(_t,{key:0,text:"Loading source code"})):we.value?(b(),z(pt,{key:1,title:"Code loading failed",error:we.value,retry:$e},null,8,["error"])):V.value?(b(),q("pre",Xg,[F("code",{class:"language-php",innerHTML:W.value},null,8,eh)])):(b(),z(rt,{key:3,title:"No code",message:"Source code is not available."}))])):se("",!0)])):(b(),z(rt,{key:3,title:"Not found",message:"The requested script does not exist."})),$(v(ut),{open:v(o),title:"Assign to area","onUpdate:open":A[3]||(A[3]=p=>o.value=p)},{footer:k(()=>[$(v(pe),{variant:"secondary",onClick:A[2]||(A[2]=p=>o.value=!1)},{default:k(()=>[...A[12]||(A[12]=[U("Cancel",-1)])]),_:1}),$(v(pe),{variant:"primary",icon:"ph-check",loading:v(u),onClick:fe},{default:k(()=>[...A[13]||(A[13]=[U(" Assign ",-1)])]),_:1},8,["loading"])]),default:k(()=>[$(v(Js),{modelValue:v(l),"onUpdate:modelValue":A[1]||(A[1]=p=>Ue(l)?l.value=p:null),label:"Area",options:v(i),icon:"ph-map-trifold"},null,8,["modelValue","options"]),v(c)?(b(),q("div",th,[$(v(Qe),{variant:"danger"},{default:k(()=>[U(M(v(c)),1)]),_:1})])):se("",!0)]),_:1},8,["open"]),$(v(ut),{open:Se.value,title:"Unassign from area","onUpdate:open":A[5]||(A[5]=p=>Se.value=p)},{footer:k(()=>[$(v(pe),{variant:"secondary",onClick:A[4]||(A[4]=p=>Se.value=!1)},{default:k(()=>[...A[14]||(A[14]=[U("Cancel",-1)])]),_:1}),$(v(pe),{variant:"warning",icon:"ph-x-circle",loading:be.value,onClick:je},{default:k(()=>[...A[15]||(A[15]=[U(" Unassign ",-1)])]),_:1},8,["loading"])]),default:k(()=>[F("p",null,M(Ee.value),1),Me.value?(b(),q("div",nh,[$(v(Qe),{variant:"danger"},{default:k(()=>[U(M(Me.value),1)]),_:1})])):se("",!0)]),_:1},8,["open"])])}}},sh=Ye(ah,[["__scopeId","data-v-31cd836e"]]),rh={class:"page"},ih={key:3,class:"firmwares-panel"},oh={class:"firmwares-summary"},lh={class:"firmwares-list"},uh={class:"firmware-header"},ch={class:"firmware-id"},dh={class:"firmware-meta"},fh={key:0,class:"firmware-desc"},ph={key:1,class:"firmware-changelog"},vh={__name:"FirmwaresListPage",setup(e){const t=Zo(),n=Mt(),a=Z(null);async function s(){var o;a.value=null;const i=await t.loadFirmwares();i.ok||(a.value=((o=i.error)==null?void 0:o.message)||"Failed to load catalog")}async function r(){var o;a.value=null;const i=await t.refreshFirmwares();i.ok||(a.value=((o=i.error)==null?void 0:o.message)||"Failed to refresh catalog")}return bt(s),(i,o)=>(b(),q("section",rh,[$(v(xt),{title:"Firmware Catalog",kicker:"Firmwares"},{actions:k(()=>[v(n).has("firmware.upload")?(b(),z(v(pe),{key:0,loading:v(t).isUpdating,icon:"ph-arrow-clockwise",onClick:r},{default:k(()=>[...o[0]||(o[0]=[U(" Refresh Catalog ",-1)])]),_:1},8,["loading"])):se("",!0)]),_:1}),v(t).isLoadingList?(b(),z(_t,{key:0,text:"Loading firmware catalog"})):a.value?(b(),z(pt,{key:1,title:"Catalog loading failed",error:a.value,retry:s},null,8,["error"])):v(t).firmwares.length===0?(b(),z(rt,{key:2,title:"No firmwares found",message:"No firmware packages detected in the firmwares directory."})):(b(),q("div",ih,[F("div",oh,[$(v(me),{variant:"primary"},{default:k(()=>[U("Total: "+M(v(t).firmwares.length),1)]),_:1})]),F("div",lh,[(b(!0),q(Pe,null,Wt(v(t).firmwares,l=>(b(),q("div",{key:l.id,class:"firmware-card"},[F("div",uh,[F("span",ch,M(l.id),1),$(v(me),{variant:"success"},{default:k(()=>[U(M(l.version),1)]),_:2},1024)]),F("div",dh,[$(v(me),{variant:"secondary"},{default:k(()=>[U(M(l.device_type),1)]),_:2},1024),l.platform?(b(),z(v(me),{key:0,variant:"info"},{default:k(()=>[U(M(l.platform),1)]),_:2},1024)):se("",!0),l.channels?(b(),z(v(me),{key:1,variant:"warning"},{default:k(()=>[U(M(l.channels)+" ch",1)]),_:2},1024)):se("",!0)]),l.description?(b(),q("p",fh,M(l.description),1)):se("",!0),l.changelog?(b(),q("pre",ph,M(l.changelog),1)):se("",!0)]))),128))])]))]))}},gh=Ye(vh,[["__scopeId","data-v-c0c73f70"]]),hh={class:"login-page"},mh={class:"login-card"},yh={key:0,class:"login-loading text-muted"},_h={__name:"LoginPage",setup(e){const t=hn(),n=ca(),a=da();bt(async()=>{const r=n.query.access_token;if(r&&typeof r=="string"&&(jo(r),await a.init(),a.isAuthenticated)){t.replace({name:"areas-favorites"});return}a.isAuthenticated&&t.replace({name:"areas-favorites"})});function s(){const r=window.location.href;window.location.href=`/auth/login?return_to=${encodeURIComponent(r)}`}return(r,i)=>(b(),q("div",hh,[F("div",mh,[i[3]||(i[3]=Vu('Smart Home Server
SHServ Web Client
You need to sign in to access the smart home dashboard.
',3)),$(v(pe),{variant:"primary",size:"lg",class:"login-btn",onClick:s},{icon:k(()=>[...i[0]||(i[0]=[F("i",{class:"ph ph-sign-in"},null,-1)])]),default:k(()=>[i[1]||(i[1]=U(" Sign in with gnexus-auth ",-1))]),_:1}),v(a).isLoading?(b(),q("p",yh,[...i[2]||(i[2]=[F("i",{class:"ph ph-spinner ph-spin"},null,-1),U(" Checking session… ",-1)])])):se("",!0)])]))}},bh=Ye(_h,[["__scopeId","data-v-3580f1e9"]]),wh=[{path:"/",redirect:"/areas/favorites"},{path:"/login",name:"login",component:bh,meta:{public:!0}},{path:"/areas/favorites",name:"areas-favorites",component:Nf,meta:{permission:"areas.view"}},{path:"/areas/tree",name:"areas-tree",component:Xf,meta:{permission:"areas.view"}},{path:"/areas/:id",name:"area-detail",component:cv,meta:{permission:"areas.view"}},{path:"/devices",name:"devices",component:hv,meta:{permission:"devices.view"}},{path:"/devices/scanning",name:"devices-scanning",component:Dv,meta:{permission:"devices.scan"}},{path:"/devices/:id",name:"device-detail",component:yg,meta:{permission:"devices.view"}},{path:"/scripts/actions",name:"scripts-actions",component:wg,meta:{permission:"scripts.run"}},{path:"/scripts/regular",name:"scripts-regular",component:Ag,meta:{permission:"scripts.view"}},{path:"/scripts/scopes",name:"scripts-scopes",component:Rg,meta:{permission:"scripts.view"}},{path:"/scripts/:type(actions|regular|scopes)/:id",name:"script-detail",component:sh,meta:{permission:"scripts.view"}},{path:"/firmwares",name:"firmwares",component:gh,meta:{permission:"firmware.view"}},{path:"/:pathMatch(.*)*",name:"not-found",component:()=>Sf(()=>import("./NotFoundPage-DhEvvSN1.js"),[])}],Qo=Md({history:md(),routes:wh});Qo.beforeEach((e,t,n)=>{var r,i;const a=da();if((r=e.meta)!=null&&r.public){if(e.name==="login"&&a.isAuthenticated){n({name:"areas-favorites"});return}n();return}if(!a.isAuthenticated){if(a.isLoading){n({name:"login"});return}n({name:"login"});return}const s=(i=e.meta)==null?void 0:i.permission;if(s&&!a.hasPermission(s)){n({name:"areas-favorites"});return}n()});function Sh(e){e.config.errorHandler=(t,n,a)=>{const s=(t==null?void 0:t.message)||String(t);console.error(`[Vue errorHandler] ${a}`,s,t)},window.addEventListener("unhandledrejection",t=>{var s;const n=t.reason,a=(n==null?void 0:n.message)||((s=n==null?void 0:n.error)==null?void 0:s.message)||String(n);console.error("[Unhandled rejection]",a,n),t.preventDefault()}),window.addEventListener("error",t=>{const n=t.error,a=(n==null?void 0:n.message)||t.message||"Unknown error";console.error(`[Global error] ${a}`,"at",t.filename,t.lineno,t.colno,n)})}const nr=Ac(_f);Sh(nr);const kh=Ec();nr.use(kh).use(Qo);const Ah=da();Ah.init().finally(()=>{nr.mount("#app")});export{Wd as G,$ as a,q as c,b as o,v as u};
diff --git a/server/dist/index.html b/server/dist/index.html
new file mode 100644
index 0000000..012065f
--- /dev/null
+++ b/server/dist/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ SHServ Vue Client
+
+
+
+
+
+
+