node-red-contrib-knx-ultimate 4.3.7 → 4.3.9

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.
@@ -1,3 +1,3 @@
1
1
  (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))o(d);new MutationObserver(d=>{for(const u of d)if(u.type==="childList")for(const f of u.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&o(f)}).observe(document,{childList:!0,subtree:!0});function i(d){const u={};return d.integrity&&(u.integrity=d.integrity),d.referrerPolicy&&(u.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?u.credentials="include":d.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function o(d){if(d.ep)return;d.ep=!0;const u=i(d);fetch(d.href,u)}})();function Qn(e){const t=Object.create(null);for(const i of e.split(","))t[i]=1;return i=>i in t}const we={},Oa=[],Dt=()=>{},zi=()=>!1,qs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),er=e=>e.startsWith("onUpdate:"),We=Object.assign,tr=(e,t)=>{const i=e.indexOf(t);i>-1&&e.splice(i,1)},Id=Object.prototype.hasOwnProperty,me=(e,t)=>Id.call(e,t),J=Array.isArray,za=e=>bs(e)==="[object Map]",Ua=e=>bs(e)==="[object Set]",Yr=e=>bs(e)==="[object Date]",te=e=>typeof e=="function",Ge=e=>typeof e=="string",Rt=e=>typeof e=="symbol",Ae=e=>e!==null&&typeof e=="object",$i=e=>(Ae(e)||te(e))&&te(e.then)&&te(e.catch),Bi=Object.prototype.toString,bs=e=>Bi.call(e),Rd=e=>bs(e).slice(8,-1),Ki=e=>bs(e)==="[object Object]",ar=e=>Ge(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ss=Qn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Js=e=>{const t=Object.create(null);return(i=>t[i]||(t[i]=e(i)))},Nd=/-\w/g,ft=Js(e=>e.replace(Nd,t=>t.slice(1).toUpperCase())),kd=/\B([A-Z])/g,fa=Js(e=>e.replace(kd,"-$1").toLowerCase()),Vi=Js(e=>e.charAt(0).toUpperCase()+e.slice(1)),xn=Js(e=>e?`on${Vi(e)}`:""),_t=(e,t)=>!Object.is(e,t),Os=(e,...t)=>{for(let i=0;i<e.length;i++)e[i](...t)},Wi=(e,t,i,o=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:o,value:i})},Zs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Qr;const Ys=()=>Qr||(Qr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function cs(e){if(J(e)){const t={};for(let i=0;i<e.length;i++){const o=e[i],d=Ge(o)?Gd(o):cs(o);if(d)for(const u in d)t[u]=d[u]}return t}else if(Ge(e)||Ae(e))return e}const Cd=/;(?![^(]*\))/g,xd=/:([^]+)/,Ed=/\/\*[^]*?\*\//g;function Gd(e){const t={};return e.replace(Ed,"").split(Cd).forEach(i=>{if(i){const o=i.split(xd);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function ue(e){let t="";if(Ge(e))t=e;else if(J(e))for(let i=0;i<e.length;i++){const o=ue(e[i]);o&&(t+=o+" ")}else if(Ae(e))for(const i in e)e[i]&&(t+=i+" ");return t.trim()}const Fd="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Ld=Qn(Fd);function Ui(e){return!!e||e===""}function Md(e,t){if(e.length!==t.length)return!1;let i=!0;for(let o=0;i&&o<e.length;o++)i=ja(e[o],t[o]);return i}function ja(e,t){if(e===t)return!0;let i=Yr(e),o=Yr(t);if(i||o)return i&&o?e.getTime()===t.getTime():!1;if(i=Rt(e),o=Rt(t),i||o)return e===t;if(i=J(e),o=J(t),i||o)return i&&o?Md(e,t):!1;if(i=Ae(e),o=Ae(t),i||o){if(!i||!o)return!1;const d=Object.keys(e).length,u=Object.keys(t).length;if(d!==u)return!1;for(const f in e){const p=e.hasOwnProperty(f),m=t.hasOwnProperty(f);if(p&&!m||!p&&m||!ja(e[f],t[f]))return!1}}return String(e)===String(t)}function sr(e,t){return e.findIndex(i=>ja(i,t))}const ji=e=>!!(e&&e.__v_isRef===!0),S=e=>Ge(e)?e:e==null?"":J(e)||Ae(e)&&(e.toString===Bi||!te(e.toString))?ji(e)?S(e.value):JSON.stringify(e,Hi,2):String(e),Hi=(e,t)=>ji(t)?Hi(e,t.value):za(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((i,[o,d],u)=>(i[En(o,u)+" =>"]=d,i),{})}:Ua(t)?{[`Set(${t.size})`]:[...t.values()].map(i=>En(i))}:Rt(t)?En(t):Ae(t)&&!J(t)&&!Ki(t)?String(t):t,En=(e,t="")=>{var i;return Rt(e)?`Symbol(${(i=e.description)!=null?i:t})`:e};let tt;class Od{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=tt,!t&&tt&&(this.index=(tt.scopes||(tt.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,i;if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].pause();for(t=0,i=this.effects.length;t<i;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,i;if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].resume();for(t=0,i=this.effects.length;t<i;t++)this.effects[t].resume()}}run(t){if(this._active){const i=tt;try{return tt=this,t()}finally{tt=i}}}on(){++this._on===1&&(this.prevScope=tt,tt=this)}off(){this._on>0&&--this._on===0&&(tt=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let i,o;for(i=0,o=this.effects.length;i<o;i++)this.effects[i].stop();for(this.effects.length=0,i=0,o=this.cleanups.length;i<o;i++)this.cleanups[i]();if(this.cleanups.length=0,this.scopes){for(i=0,o=this.scopes.length;i<o;i++)this.scopes[i].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const d=this.parent.scopes.pop();d&&d!==this&&(this.parent.scopes[this.index]=d,d.index=this.index)}this.parent=void 0}}}function zd(){return tt}let Te;const Gn=new WeakSet;class Xi{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,tt&&tt.active&&tt.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,Gn.has(this)&&(Gn.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Ji(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,ei(this),Zi(this);const t=Te,i=pt;Te=this,pt=!0;try{return this.fn()}finally{Yi(this),Te=t,pt=i,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)ir(t);this.deps=this.depsTail=void 0,ei(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?Gn.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Kn(this)&&this.run()}get dirty(){return Kn(this)}}let qi=0,ns,rs;function Ji(e,t=!1){if(e.flags|=8,t){e.next=rs,rs=e;return}e.next=ns,ns=e}function nr(){qi++}function rr(){if(--qi>0)return;if(rs){let t=rs;for(rs=void 0;t;){const i=t.next;t.next=void 0,t.flags&=-9,t=i}}let e;for(;ns;){let t=ns;for(ns=void 0;t;){const i=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(o){e||(e=o)}t=i}}if(e)throw e}function Zi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Yi(e){let t,i=e.depsTail,o=i;for(;o;){const d=o.prevDep;o.version===-1?(o===i&&(i=d),ir(o),$d(o)):t=o,o.dep.activeLink=o.prevActiveLink,o.prevActiveLink=void 0,o=d}e.deps=t,e.depsTail=i}function Kn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Qi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Qi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===fs)||(e.globalVersion=fs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Kn(e))))return;e.flags|=2;const t=e.dep,i=Te,o=pt;Te=e,pt=!0;try{Zi(e);const d=e.fn(e._value);(t.version===0||_t(d,e._value))&&(e.flags|=128,e._value=d,t.version++)}catch(d){throw t.version++,d}finally{Te=i,pt=o,Yi(e),e.flags&=-3}}function ir(e,t=!1){const{dep:i,prevSub:o,nextSub:d}=e;if(o&&(o.nextSub=d,e.prevSub=void 0),d&&(d.prevSub=o,e.nextSub=void 0),i.subs===e&&(i.subs=o,!o&&i.computed)){i.computed.flags&=-5;for(let u=i.computed.deps;u;u=u.nextDep)ir(u,!0)}!t&&!--i.sc&&i.map&&i.map.delete(i.key)}function $d(e){const{prevDep:t,nextDep:i}=e;t&&(t.nextDep=i,e.prevDep=void 0),i&&(i.prevDep=t,e.nextDep=void 0)}let pt=!0;const eo=[];function Xt(){eo.push(pt),pt=!1}function qt(){const e=eo.pop();pt=e===void 0?!0:e}function ei(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const i=Te;Te=void 0;try{t()}finally{Te=i}}}let fs=0;class Bd{constructor(t,i){this.sub=t,this.dep=i,this.version=i.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class or{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Te||!pt||Te===this.computed)return;let i=this.activeLink;if(i===void 0||i.sub!==Te)i=this.activeLink=new Bd(Te,this),Te.deps?(i.prevDep=Te.depsTail,Te.depsTail.nextDep=i,Te.depsTail=i):Te.deps=Te.depsTail=i,to(i);else if(i.version===-1&&(i.version=this.version,i.nextDep)){const o=i.nextDep;o.prevDep=i.prevDep,i.prevDep&&(i.prevDep.nextDep=o),i.prevDep=Te.depsTail,i.nextDep=void 0,Te.depsTail.nextDep=i,Te.depsTail=i,Te.deps===i&&(Te.deps=o)}return i}trigger(t){this.version++,fs++,this.notify(t)}notify(t){nr();try{for(let i=this.subs;i;i=i.prevSub)i.sub.notify()&&i.sub.dep.notify()}finally{rr()}}}function to(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let o=t.deps;o;o=o.nextDep)to(o)}const i=e.dep.subs;i!==e&&(e.prevSub=i,i&&(i.nextSub=e)),e.dep.subs=e}}const Vn=new WeakMap,_a=Symbol(""),Wn=Symbol(""),ps=Symbol("");function Ke(e,t,i){if(pt&&Te){let o=Vn.get(e);o||Vn.set(e,o=new Map);let d=o.get(i);d||(o.set(i,d=new or),d.map=o,d.key=i),d.track()}}function Ut(e,t,i,o,d,u){const f=Vn.get(e);if(!f){fs++;return}const p=m=>{m&&m.trigger()};if(nr(),t==="clear")f.forEach(p);else{const m=J(e),P=m&&ar(i);if(m&&i==="length"){const A=Number(o);f.forEach((R,O)=>{(O==="length"||O===ps||!Rt(O)&&O>=A)&&p(R)})}else switch((i!==void 0||f.has(void 0))&&p(f.get(i)),P&&p(f.get(ps)),t){case"add":m?P&&p(f.get("length")):(p(f.get(_a)),za(e)&&p(f.get(Wn)));break;case"delete":m||(p(f.get(_a)),za(e)&&p(f.get(Wn)));break;case"set":za(e)&&p(f.get(_a));break}}rr()}function La(e){const t=he(e);return t===e?t:(Ke(t,"iterate",ps),ut(e)?t:t.map(gt))}function Qs(e){return Ke(e=he(e),"iterate",ps),e}function Pt(e,t){return Jt(e)?Ka(Da(e)?gt(t):t):gt(t)}const Kd={__proto__:null,[Symbol.iterator](){return Fn(this,Symbol.iterator,e=>Pt(this,e))},concat(...e){return La(this).concat(...e.map(t=>J(t)?La(t):t))},entries(){return Fn(this,"entries",e=>(e[1]=Pt(this,e[1]),e))},every(e,t){return Bt(this,"every",e,t,void 0,arguments)},filter(e,t){return Bt(this,"filter",e,t,i=>i.map(o=>Pt(this,o)),arguments)},find(e,t){return Bt(this,"find",e,t,i=>Pt(this,i),arguments)},findIndex(e,t){return Bt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Bt(this,"findLast",e,t,i=>Pt(this,i),arguments)},findLastIndex(e,t){return Bt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Bt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ln(this,"includes",e)},indexOf(...e){return Ln(this,"indexOf",e)},join(e){return La(this).join(e)},lastIndexOf(...e){return Ln(this,"lastIndexOf",e)},map(e,t){return Bt(this,"map",e,t,void 0,arguments)},pop(){return es(this,"pop")},push(...e){return es(this,"push",e)},reduce(e,...t){return ti(this,"reduce",e,t)},reduceRight(e,...t){return ti(this,"reduceRight",e,t)},shift(){return es(this,"shift")},some(e,t){return Bt(this,"some",e,t,void 0,arguments)},splice(...e){return es(this,"splice",e)},toReversed(){return La(this).toReversed()},toSorted(e){return La(this).toSorted(e)},toSpliced(...e){return La(this).toSpliced(...e)},unshift(...e){return es(this,"unshift",e)},values(){return Fn(this,"values",e=>Pt(this,e))}};function Fn(e,t,i){const o=Qs(e),d=o[t]();return o!==e&&!ut(e)&&(d._next=d.next,d.next=()=>{const u=d._next();return u.done||(u.value=i(u.value)),u}),d}const Vd=Array.prototype;function Bt(e,t,i,o,d,u){const f=Qs(e),p=f!==e&&!ut(e),m=f[t];if(m!==Vd[t]){const R=m.apply(e,u);return p?gt(R):R}let P=i;f!==e&&(p?P=function(R,O){return i.call(this,Pt(e,R),O,e)}:i.length>2&&(P=function(R,O){return i.call(this,R,O,e)}));const A=m.call(f,P,o);return p&&d?d(A):A}function ti(e,t,i,o){const d=Qs(e),u=d!==e&&!ut(e);let f=i,p=!1;d!==e&&(u?(p=o.length===0,f=function(P,A,R){return p&&(p=!1,P=Pt(e,P)),i.call(this,P,Pt(e,A),R,e)}):i.length>3&&(f=function(P,A,R){return i.call(this,P,A,R,e)}));const m=d[t](f,...o);return p?Pt(e,m):m}function Ln(e,t,i){const o=he(e);Ke(o,"iterate",ps);const d=o[t](...i);return(d===-1||d===!1)&&ur(i[0])?(i[0]=he(i[0]),o[t](...i)):d}function es(e,t,i=[]){Xt(),nr();const o=he(e)[t].apply(e,i);return rr(),qt(),o}const Wd=Qn("__proto__,__v_isRef,__isVue"),ao=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Rt));function Ud(e){Rt(e)||(e=String(e));const t=he(this);return Ke(t,"has",e),t.hasOwnProperty(e)}class so{constructor(t=!1,i=!1){this._isReadonly=t,this._isShallow=i}get(t,i,o){if(i==="__v_skip")return t.__v_skip;const d=this._isReadonly,u=this._isShallow;if(i==="__v_isReactive")return!d;if(i==="__v_isReadonly")return d;if(i==="__v_isShallow")return u;if(i==="__v_raw")return o===(d?u?tu:oo:u?io:ro).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(o)?t:void 0;const f=J(t);if(!d){let m;if(f&&(m=Kd[i]))return m;if(i==="hasOwnProperty")return Ud}const p=Reflect.get(t,i,Ve(t)?t:o);if((Rt(i)?ao.has(i):Wd(i))||(d||Ke(t,"get",i),u))return p;if(Ve(p)){const m=f&&ar(i)?p:p.value;return d&&Ae(m)?jn(m):m}return Ae(p)?d?jn(p):en(p):p}}class no extends so{constructor(t=!1){super(!1,t)}set(t,i,o,d){let u=t[i];const f=J(t)&&ar(i);if(!this._isShallow){const P=Jt(u);if(!ut(o)&&!Jt(o)&&(u=he(u),o=he(o)),!f&&Ve(u)&&!Ve(o))return P||(u.value=o),!0}const p=f?Number(i)<t.length:me(t,i),m=Reflect.set(t,i,o,Ve(t)?t:d);return t===he(d)&&(p?_t(o,u)&&Ut(t,"set",i,o):Ut(t,"add",i,o)),m}deleteProperty(t,i){const o=me(t,i);t[i];const d=Reflect.deleteProperty(t,i);return d&&o&&Ut(t,"delete",i,void 0),d}has(t,i){const o=Reflect.has(t,i);return(!Rt(i)||!ao.has(i))&&Ke(t,"has",i),o}ownKeys(t){return Ke(t,"iterate",J(t)?"length":_a),Reflect.ownKeys(t)}}class jd extends so{constructor(t=!1){super(!0,t)}set(t,i){return!0}deleteProperty(t,i){return!0}}const Hd=new no,Xd=new jd,qd=new no(!0);const Un=e=>e,Fs=e=>Reflect.getPrototypeOf(e);function Jd(e,t,i){return function(...o){const d=this.__v_raw,u=he(d),f=za(u),p=e==="entries"||e===Symbol.iterator&&f,m=e==="keys"&&f,P=d[e](...o),A=i?Un:t?Ka:gt;return!t&&Ke(u,"iterate",m?Wn:_a),We(Object.create(P),{next(){const{value:R,done:O}=P.next();return O?{value:R,done:O}:{value:p?[A(R[0]),A(R[1])]:A(R),done:O}}})}}function Ls(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Zd(e,t){const i={get(d){const u=this.__v_raw,f=he(u),p=he(d);e||(_t(d,p)&&Ke(f,"get",d),Ke(f,"get",p));const{has:m}=Fs(f),P=t?Un:e?Ka:gt;if(m.call(f,d))return P(u.get(d));if(m.call(f,p))return P(u.get(p));u!==f&&u.get(d)},get size(){const d=this.__v_raw;return!e&&Ke(he(d),"iterate",_a),d.size},has(d){const u=this.__v_raw,f=he(u),p=he(d);return e||(_t(d,p)&&Ke(f,"has",d),Ke(f,"has",p)),d===p?u.has(d):u.has(d)||u.has(p)},forEach(d,u){const f=this,p=f.__v_raw,m=he(p),P=t?Un:e?Ka:gt;return!e&&Ke(m,"iterate",_a),p.forEach((A,R)=>d.call(u,P(A),P(R),f))}};return We(i,e?{add:Ls("add"),set:Ls("set"),delete:Ls("delete"),clear:Ls("clear")}:{add(d){const u=he(this),f=Fs(u),p=he(d),m=!t&&!ut(d)&&!Jt(d)?p:d;return f.has.call(u,m)||_t(d,m)&&f.has.call(u,d)||_t(p,m)&&f.has.call(u,p)||(u.add(m),Ut(u,"add",m,m)),this},set(d,u){!t&&!ut(u)&&!Jt(u)&&(u=he(u));const f=he(this),{has:p,get:m}=Fs(f);let P=p.call(f,d);P||(d=he(d),P=p.call(f,d));const A=m.call(f,d);return f.set(d,u),P?_t(u,A)&&Ut(f,"set",d,u):Ut(f,"add",d,u),this},delete(d){const u=he(this),{has:f,get:p}=Fs(u);let m=f.call(u,d);m||(d=he(d),m=f.call(u,d)),p&&p.call(u,d);const P=u.delete(d);return m&&Ut(u,"delete",d,void 0),P},clear(){const d=he(this),u=d.size!==0,f=d.clear();return u&&Ut(d,"clear",void 0,void 0),f}}),["keys","values","entries",Symbol.iterator].forEach(d=>{i[d]=Jd(d,e,t)}),i}function lr(e,t){const i=Zd(e,t);return(o,d,u)=>d==="__v_isReactive"?!e:d==="__v_isReadonly"?e:d==="__v_raw"?o:Reflect.get(me(i,d)&&d in o?i:o,d,u)}const Yd={get:lr(!1,!1)},Qd={get:lr(!1,!0)},eu={get:lr(!0,!1)};const ro=new WeakMap,io=new WeakMap,oo=new WeakMap,tu=new WeakMap;function au(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function su(e){return e.__v_skip||!Object.isExtensible(e)?0:au(Rd(e))}function en(e){return Jt(e)?e:dr(e,!1,Hd,Yd,ro)}function nu(e){return dr(e,!1,qd,Qd,io)}function jn(e){return dr(e,!0,Xd,eu,oo)}function dr(e,t,i,o,d){if(!Ae(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const u=su(e);if(u===0)return e;const f=d.get(e);if(f)return f;const p=new Proxy(e,u===2?o:i);return d.set(e,p),p}function Da(e){return Jt(e)?Da(e.__v_raw):!!(e&&e.__v_isReactive)}function Jt(e){return!!(e&&e.__v_isReadonly)}function ut(e){return!!(e&&e.__v_isShallow)}function ur(e){return e?!!e.__v_raw:!1}function he(e){const t=e&&e.__v_raw;return t?he(t):e}function ru(e){return!me(e,"__v_skip")&&Object.isExtensible(e)&&Wi(e,"__v_skip",!0),e}const gt=e=>Ae(e)?en(e):e,Ka=e=>Ae(e)?jn(e):e;function Ve(e){return e?e.__v_isRef===!0:!1}function la(e){return iu(e,!1)}function iu(e,t){return Ve(e)?e:new ou(e,t)}class ou{constructor(t,i){this.dep=new or,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=i?t:he(t),this._value=i?t:gt(t),this.__v_isShallow=i}get value(){return this.dep.track(),this._value}set value(t){const i=this._rawValue,o=this.__v_isShallow||ut(t)||Jt(t);t=o?t:he(t),_t(t,i)&&(this._rawValue=t,this._value=o?t:gt(t),this.dep.trigger())}}function lu(e){return Ve(e)?e.value:e}const du={get:(e,t,i)=>t==="__v_raw"?e:lu(Reflect.get(e,t,i)),set:(e,t,i,o)=>{const d=e[t];return Ve(d)&&!Ve(i)?(d.value=i,!0):Reflect.set(e,t,i,o)}};function lo(e){return Da(e)?e:new Proxy(e,du)}class uu{constructor(t,i,o){this.fn=t,this.setter=i,this._value=void 0,this.dep=new or(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=fs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!i,this.isSSR=o}notify(){if(this.flags|=16,!(this.flags&8)&&Te!==this)return Ji(this,!0),!0}get value(){const t=this.dep.track();return Qi(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function cu(e,t,i=!1){let o,d;return te(e)?o=e:(o=e.get,d=e.set),new uu(o,d,i)}const Ms={},Vs=new WeakMap;let Ta;function fu(e,t=!1,i=Ta){if(i){let o=Vs.get(i);o||Vs.set(i,o=[]),o.push(e)}}function pu(e,t,i=we){const{immediate:o,deep:d,once:u,scheduler:f,augmentJob:p,call:m}=i,P=K=>d?K:ut(K)||d===!1||d===0?jt(K,1):jt(K);let A,R,O,B,oe=!1,U=!1;if(Ve(e)?(R=()=>e.value,oe=ut(e)):Da(e)?(R=()=>P(e),oe=!0):J(e)?(U=!0,oe=e.some(K=>Da(K)||ut(K)),R=()=>e.map(K=>{if(Ve(K))return K.value;if(Da(K))return P(K);if(te(K))return m?m(K,2):K()})):te(e)?t?R=m?()=>m(e,2):e:R=()=>{if(O){Xt();try{O()}finally{qt()}}const K=Ta;Ta=A;try{return m?m(e,3,[B]):e(B)}finally{Ta=K}}:R=Dt,t&&d){const K=R,Ne=d===!0?1/0:d;R=()=>jt(K(),Ne)}const Ie=zd(),Pe=()=>{A.stop(),Ie&&Ie.active&&tr(Ie.effects,A)};if(u&&t){const K=t;t=(...Ne)=>{K(...Ne),Pe()}}let re=U?new Array(e.length).fill(Ms):Ms;const Se=K=>{if(!(!(A.flags&1)||!A.dirty&&!K))if(t){const Ne=A.run();if(d||oe||(U?Ne.some((Oe,it)=>_t(Oe,re[it])):_t(Ne,re))){O&&O();const Oe=Ta;Ta=A;try{const it=[Ne,re===Ms?void 0:U&&re[0]===Ms?[]:re,B];re=Ne,m?m(t,3,it):t(...it)}finally{Ta=Oe}}}else A.run()};return p&&p(Se),A=new Xi(R),A.scheduler=f?()=>f(Se,!1):Se,B=K=>fu(K,!1,A),O=A.onStop=()=>{const K=Vs.get(A);if(K){if(m)m(K,4);else for(const Ne of K)Ne();Vs.delete(A)}},t?o?Se(!0):re=A.run():f?f(Se.bind(null,!0),!0):A.run(),Pe.pause=A.pause.bind(A),Pe.resume=A.resume.bind(A),Pe.stop=Pe,Pe}function jt(e,t=1/0,i){if(t<=0||!Ae(e)||e.__v_skip||(i=i||new Map,(i.get(e)||0)>=t))return e;if(i.set(e,t),t--,Ve(e))jt(e.value,t,i);else if(J(e))for(let o=0;o<e.length;o++)jt(e[o],t,i);else if(Ua(e)||za(e))e.forEach(o=>{jt(o,t,i)});else if(Ki(e)){for(const o in e)jt(e[o],t,i);for(const o of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,o)&&jt(e[o],t,i)}return e}function ys(e,t,i,o){try{return o?e(...o):e()}catch(d){tn(d,t,i)}}function Nt(e,t,i,o){if(te(e)){const d=ys(e,t,i,o);return d&&$i(d)&&d.catch(u=>{tn(u,t,i)}),d}if(J(e)){const d=[];for(let u=0;u<e.length;u++)d.push(Nt(e[u],t,i,o));return d}}function tn(e,t,i,o=!0){const d=t?t.vnode:null,{errorHandler:u,throwUnhandledErrorInProduction:f}=t&&t.appContext.config||we;if(t){let p=t.parent;const m=t.proxy,P=`https://vuejs.org/error-reference/#runtime-${i}`;for(;p;){const A=p.ec;if(A){for(let R=0;R<A.length;R++)if(A[R](e,m,P)===!1)return}p=p.parent}if(u){Xt(),ys(u,null,10,[e,m,P]),qt();return}}gu(e,i,d,o,f)}function gu(e,t,i,o=!0,d=!1){if(d)throw e;console.error(e)}const Xe=[];let wt=-1;const $a=[];let da=null,Ma=0;const uo=Promise.resolve();let Ws=null;function is(e){const t=Ws||uo;return e?t.then(this?e.bind(this):e):t}function hu(e){let t=wt+1,i=Xe.length;for(;t<i;){const o=t+i>>>1,d=Xe[o],u=gs(d);u<e||u===e&&d.flags&2?t=o+1:i=o}return t}function cr(e){if(!(e.flags&1)){const t=gs(e),i=Xe[Xe.length-1];!i||!(e.flags&2)&&t>=gs(i)?Xe.push(e):Xe.splice(hu(t),0,e),e.flags|=1,co()}}function co(){Ws||(Ws=uo.then(po))}function mu(e){J(e)?$a.push(...e):da&&e.id===-1?da.splice(Ma+1,0,e):e.flags&1||($a.push(e),e.flags|=1),co()}function ai(e,t,i=wt+1){for(;i<Xe.length;i++){const o=Xe[i];if(o&&o.flags&2){if(e&&o.id!==e.uid)continue;Xe.splice(i,1),i--,o.flags&4&&(o.flags&=-2),o(),o.flags&4||(o.flags&=-2)}}}function fo(e){if($a.length){const t=[...new Set($a)].sort((i,o)=>gs(i)-gs(o));if($a.length=0,da){da.push(...t);return}for(da=t,Ma=0;Ma<da.length;Ma++){const i=da[Ma];i.flags&4&&(i.flags&=-2),i.flags&8||i(),i.flags&=-2}da=null,Ma=0}}const gs=e=>e.id==null?e.flags&2?-1:1/0:e.id;function po(e){try{for(wt=0;wt<Xe.length;wt++){const t=Xe[wt];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),ys(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;wt<Xe.length;wt++){const t=Xe[wt];t&&(t.flags&=-2)}wt=-1,Xe.length=0,fo(),Ws=null,(Xe.length||$a.length)&&po()}}let dt=null,go=null;function Us(e){const t=dt;return dt=e,go=e&&e.type.__scopeId||null,t}function vu(e,t=dt,i){if(!t||e._n)return e;const o=(...d)=>{o._d&&pi(-1);const u=Us(t);let f;try{f=e(...d)}finally{Us(u),o._d&&pi(1)}return f};return o._n=!0,o._c=!0,o._d=!0,o}function pe(e,t){if(dt===null)return e;const i=rn(dt),o=e.dirs||(e.dirs=[]);for(let d=0;d<t.length;d++){let[u,f,p,m=we]=t[d];u&&(te(u)&&(u={mounted:u,updated:u}),u.deep&&jt(f),o.push({dir:u,instance:i,value:f,oldValue:void 0,arg:p,modifiers:m}))}return e}function Aa(e,t,i,o){const d=e.dirs,u=t&&t.dirs;for(let f=0;f<d.length;f++){const p=d[f];u&&(p.oldValue=u[f].value);let m=p.dir[o];m&&(Xt(),Nt(m,i,8,[e.el,p,e,t]),qt())}}function bu(e,t){if(qe){let i=qe.provides;const o=qe.parent&&qe.parent.provides;o===i&&(i=qe.provides=Object.create(o)),i[e]=t}}function zs(e,t,i=!1){const o=mc();if(o||Ba){let d=Ba?Ba._context.provides:o?o.parent==null||o.ce?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides:void 0;if(d&&e in d)return d[e];if(arguments.length>1)return i&&te(t)?t.call(o&&o.proxy):t}}const yu=Symbol.for("v-scx"),Au=()=>zs(yu);function De(e,t,i){return ho(e,t,i)}function ho(e,t,i=we){const{immediate:o,deep:d,flush:u,once:f}=i,p=We({},i),m=t&&o||!t&&u!=="post";let P;if(ms){if(u==="sync"){const B=Au();P=B.__watcherHandles||(B.__watcherHandles=[])}else if(!m){const B=()=>{};return B.stop=Dt,B.resume=Dt,B.pause=Dt,B}}const A=qe;p.call=(B,oe,U)=>Nt(B,A,oe,U);let R=!1;u==="post"?p.scheduler=B=>{et(B,A&&A.suspense)}:u!=="sync"&&(R=!0,p.scheduler=(B,oe)=>{oe?B():cr(B)}),p.augmentJob=B=>{t&&(B.flags|=4),R&&(B.flags|=2,A&&(B.id=A.uid,B.i=A))};const O=pu(e,t,p);return ms&&(P?P.push(O):m&&O()),O}function Su(e,t,i){const o=this.proxy,d=Ge(e)?e.includes(".")?mo(o,e):()=>o[e]:e.bind(o,o);let u;te(t)?u=t:(u=t.handler,i=t);const f=As(this),p=ho(d,u.bind(o),i);return f(),p}function mo(e,t){const i=t.split(".");return()=>{let o=e;for(let d=0;d<i.length&&o;d++)o=o[i[d]];return o}}const wu=Symbol("_vte"),Pu=e=>e.__isTeleport,Tu=Symbol("_leaveCb");function fr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,fr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function vo(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function si(e,t){let i;return!!((i=Object.getOwnPropertyDescriptor(e,t))&&!i.configurable)}const js=new WeakMap;function os(e,t,i,o,d=!1){if(J(e)){e.forEach((U,Ie)=>os(U,t&&(J(t)?t[Ie]:t),i,o,d));return}if(ls(o)&&!d){o.shapeFlag&512&&o.type.__asyncResolved&&o.component.subTree.component&&os(e,t,i,o.component.subTree);return}const u=o.shapeFlag&4?rn(o.component):o.el,f=d?null:u,{i:p,r:m}=e,P=t&&t.r,A=p.refs===we?p.refs={}:p.refs,R=p.setupState,O=he(R),B=R===we?zi:U=>si(A,U)?!1:me(O,U),oe=(U,Ie)=>!(Ie&&si(A,Ie));if(P!=null&&P!==m){if(ni(t),Ge(P))A[P]=null,B(P)&&(R[P]=null);else if(Ve(P)){const U=t;oe(P,U.k)&&(P.value=null),U.k&&(A[U.k]=null)}}if(te(m))ys(m,p,12,[f,A]);else{const U=Ge(m),Ie=Ve(m);if(U||Ie){const Pe=()=>{if(e.f){const re=U?B(m)?R[m]:A[m]:oe()||!e.k?m.value:A[e.k];if(d)J(re)&&tr(re,u);else if(J(re))re.includes(u)||re.push(u);else if(U)A[m]=[u],B(m)&&(R[m]=A[m]);else{const Se=[u];oe(m,e.k)&&(m.value=Se),e.k&&(A[e.k]=Se)}}else U?(A[m]=f,B(m)&&(R[m]=f)):Ie&&(oe(m,e.k)&&(m.value=f),e.k&&(A[e.k]=f))};if(f){const re=()=>{Pe(),js.delete(e)};re.id=-1,js.set(e,re),et(re,i)}else ni(e),Pe()}}}function ni(e){const t=js.get(e);t&&(t.flags|=8,js.delete(e))}Ys().requestIdleCallback;Ys().cancelIdleCallback;const ls=e=>!!e.type.__asyncLoader,bo=e=>e.type.__isKeepAlive;function _u(e,t){yo(e,"a",t)}function Du(e,t){yo(e,"da",t)}function yo(e,t,i=qe){const o=e.__wdc||(e.__wdc=()=>{let d=i;for(;d;){if(d.isDeactivated)return;d=d.parent}return e()});if(an(t,o,i),i){let d=i.parent;for(;d&&d.parent;)bo(d.parent.vnode)&&Iu(o,t,i,d),d=d.parent}}function Iu(e,t,i,o){const d=an(t,e,o,!0);wo(()=>{tr(o[t],d)},i)}function an(e,t,i=qe,o=!1){if(i){const d=i[e]||(i[e]=[]),u=t.__weh||(t.__weh=(...f)=>{Xt();const p=As(i),m=Nt(t,i,e,f);return p(),qt(),m});return o?d.unshift(u):d.push(u),u}}const Zt=e=>(t,i=qe)=>{(!ms||e==="sp")&&an(e,(...o)=>t(...o),i)},Ru=Zt("bm"),Ao=Zt("m"),Nu=Zt("bu"),ku=Zt("u"),So=Zt("bum"),wo=Zt("um"),Cu=Zt("sp"),xu=Zt("rtg"),Eu=Zt("rtc");function Gu(e,t=qe){an("ec",e,t)}const Fu=Symbol.for("v-ndc");function ie(e,t,i,o){let d;const u=i,f=J(e);if(f||Ge(e)){const p=f&&Da(e);let m=!1,P=!1;p&&(m=!ut(e),P=Jt(e),e=Qs(e)),d=new Array(e.length);for(let A=0,R=e.length;A<R;A++)d[A]=t(m?P?Ka(gt(e[A])):gt(e[A]):e[A],A,void 0,u)}else if(typeof e=="number"){d=new Array(e);for(let p=0;p<e;p++)d[p]=t(p+1,p,void 0,u)}else if(Ae(e))if(e[Symbol.iterator])d=Array.from(e,(p,m)=>t(p,m,void 0,u));else{const p=Object.keys(e);d=new Array(p.length);for(let m=0,P=p.length;m<P;m++){const A=p[m];d[m]=t(e[A],A,m,u)}}else d=[];return d}const Hn=e=>e?Vo(e)?rn(e):Hn(e.parent):null,ds=We(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hn(e.parent),$root:e=>Hn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>To(e),$forceUpdate:e=>e.f||(e.f=()=>{cr(e.update)}),$nextTick:e=>e.n||(e.n=is.bind(e.proxy)),$watch:e=>Su.bind(e)}),Mn=(e,t)=>e!==we&&!e.__isScriptSetup&&me(e,t),Lu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:i,setupState:o,data:d,props:u,accessCache:f,type:p,appContext:m}=e;if(t[0]!=="$"){const O=f[t];if(O!==void 0)switch(O){case 1:return o[t];case 2:return d[t];case 4:return i[t];case 3:return u[t]}else{if(Mn(o,t))return f[t]=1,o[t];if(d!==we&&me(d,t))return f[t]=2,d[t];if(me(u,t))return f[t]=3,u[t];if(i!==we&&me(i,t))return f[t]=4,i[t];Xn&&(f[t]=0)}}const P=ds[t];let A,R;if(P)return t==="$attrs"&&Ke(e.attrs,"get",""),P(e);if((A=p.__cssModules)&&(A=A[t]))return A;if(i!==we&&me(i,t))return f[t]=4,i[t];if(R=m.config.globalProperties,me(R,t))return R[t]},set({_:e},t,i){const{data:o,setupState:d,ctx:u}=e;return Mn(d,t)?(d[t]=i,!0):o!==we&&me(o,t)?(o[t]=i,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(u[t]=i,!0)},has({_:{data:e,setupState:t,accessCache:i,ctx:o,appContext:d,props:u,type:f}},p){let m;return!!(i[p]||e!==we&&p[0]!=="$"&&me(e,p)||Mn(t,p)||me(u,p)||me(o,p)||me(ds,p)||me(d.config.globalProperties,p)||(m=f.__cssModules)&&m[p])},defineProperty(e,t,i){return i.get!=null?e._.accessCache[t]=0:me(i,"value")&&this.set(e,t,i.value,null),Reflect.defineProperty(e,t,i)}};function ri(e){return J(e)?e.reduce((t,i)=>(t[i]=null,t),{}):e}let Xn=!0;function Mu(e){const t=To(e),i=e.proxy,o=e.ctx;Xn=!1,t.beforeCreate&&ii(t.beforeCreate,e,"bc");const{data:d,computed:u,methods:f,watch:p,provide:m,inject:P,created:A,beforeMount:R,mounted:O,beforeUpdate:B,updated:oe,activated:U,deactivated:Ie,beforeDestroy:Pe,beforeUnmount:re,destroyed:Se,unmounted:K,render:Ne,renderTracked:Oe,renderTriggered:it,errorCaptured:ht,serverPrefetch:pa,expose:mt,inheritAttrs:ga,components:s,directives:Yt,filters:ha}=t;if(P&&Ou(P,o,null),f)for(const ve in f){const ce=f[ve];te(ce)&&(o[ve]=ce.bind(i))}if(d){const ve=d.call(i,i);Ae(ve)&&(e.data=en(ve))}if(Xn=!0,u)for(const ve in u){const ce=u[ve],Le=te(ce)?ce.bind(i,i):te(ce.get)?ce.get.bind(i,i):Dt,Je=!te(ce)&&te(ce.set)?ce.set.bind(i):Dt,Ue=j({get:Le,set:Je});Object.defineProperty(o,ve,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:Ze=>Ue.value=Ze})}if(p)for(const ve in p)Po(p[ve],o,i,ve);if(m){const ve=te(m)?m.call(i):m;Reflect.ownKeys(ve).forEach(ce=>{bu(ce,ve[ce])})}A&&ii(A,e,"c");function ke(ve,ce){J(ce)?ce.forEach(Le=>ve(Le.bind(i))):ce&&ve(ce.bind(i))}if(ke(Ru,R),ke(Ao,O),ke(Nu,B),ke(ku,oe),ke(_u,U),ke(Du,Ie),ke(Gu,ht),ke(Eu,Oe),ke(xu,it),ke(So,re),ke(wo,K),ke(Cu,pa),J(mt))if(mt.length){const ve=e.exposed||(e.exposed={});mt.forEach(ce=>{Object.defineProperty(ve,ce,{get:()=>i[ce],set:Le=>i[ce]=Le,enumerable:!0})})}else e.exposed||(e.exposed={});Ne&&e.render===Dt&&(e.render=Ne),ga!=null&&(e.inheritAttrs=ga),s&&(e.components=s),Yt&&(e.directives=Yt),pa&&vo(e)}function Ou(e,t,i=Dt){J(e)&&(e=qn(e));for(const o in e){const d=e[o];let u;Ae(d)?"default"in d?u=zs(d.from||o,d.default,!0):u=zs(d.from||o):u=zs(d),Ve(u)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>u.value,set:f=>u.value=f}):t[o]=u}}function ii(e,t,i){Nt(J(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,i)}function Po(e,t,i,o){let d=o.includes(".")?mo(i,o):()=>i[o];if(Ge(e)){const u=t[e];te(u)&&De(d,u)}else if(te(e))De(d,e.bind(i));else if(Ae(e))if(J(e))e.forEach(u=>Po(u,t,i,o));else{const u=te(e.handler)?e.handler.bind(i):t[e.handler];te(u)&&De(d,u,e)}}function To(e){const t=e.type,{mixins:i,extends:o}=t,{mixins:d,optionsCache:u,config:{optionMergeStrategies:f}}=e.appContext,p=u.get(t);let m;return p?m=p:!d.length&&!i&&!o?m=t:(m={},d.length&&d.forEach(P=>Hs(m,P,f,!0)),Hs(m,t,f)),Ae(t)&&u.set(t,m),m}function Hs(e,t,i,o=!1){const{mixins:d,extends:u}=t;u&&Hs(e,u,i,!0),d&&d.forEach(f=>Hs(e,f,i,!0));for(const f in t)if(!(o&&f==="expose")){const p=zu[f]||i&&i[f];e[f]=p?p(e[f],t[f]):t[f]}return e}const zu={data:oi,props:li,emits:li,methods:as,computed:as,beforeCreate:He,created:He,beforeMount:He,mounted:He,beforeUpdate:He,updated:He,beforeDestroy:He,beforeUnmount:He,destroyed:He,unmounted:He,activated:He,deactivated:He,errorCaptured:He,serverPrefetch:He,components:as,directives:as,watch:Bu,provide:oi,inject:$u};function oi(e,t){return t?e?function(){return We(te(e)?e.call(this,this):e,te(t)?t.call(this,this):t)}:t:e}function $u(e,t){return as(qn(e),qn(t))}function qn(e){if(J(e)){const t={};for(let i=0;i<e.length;i++)t[e[i]]=e[i];return t}return e}function He(e,t){return e?[...new Set([].concat(e,t))]:t}function as(e,t){return e?We(Object.create(null),e,t):t}function li(e,t){return e?J(e)&&J(t)?[...new Set([...e,...t])]:We(Object.create(null),ri(e),ri(t??{})):t}function Bu(e,t){if(!e)return t;if(!t)return e;const i=We(Object.create(null),e);for(const o in t)i[o]=He(e[o],t[o]);return i}function _o(){return{app:null,config:{isNativeTag:zi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Ku=0;function Vu(e,t){return function(o,d=null){te(o)||(o=We({},o)),d!=null&&!Ae(d)&&(d=null);const u=_o(),f=new WeakSet,p=[];let m=!1;const P=u.app={_uid:Ku++,_component:o,_props:d,_container:null,_context:u,_instance:null,version:wc,get config(){return u.config},set config(A){},use(A,...R){return f.has(A)||(A&&te(A.install)?(f.add(A),A.install(P,...R)):te(A)&&(f.add(A),A(P,...R))),P},mixin(A){return u.mixins.includes(A)||u.mixins.push(A),P},component(A,R){return R?(u.components[A]=R,P):u.components[A]},directive(A,R){return R?(u.directives[A]=R,P):u.directives[A]},mount(A,R,O){if(!m){const B=P._ceVNode||It(o,d);return B.appContext=u,O===!0?O="svg":O===!1&&(O=void 0),e(B,A,O),m=!0,P._container=A,A.__vue_app__=P,rn(B.component)}},onUnmount(A){p.push(A)},unmount(){m&&(Nt(p,P._instance,16),e(null,P._container),delete P._container.__vue_app__)},provide(A,R){return u.provides[A]=R,P},runWithContext(A){const R=Ba;Ba=P;try{return A()}finally{Ba=R}}};return P}}let Ba=null;const Wu=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${ft(t)}Modifiers`]||e[`${fa(t)}Modifiers`];function Uu(e,t,...i){if(e.isUnmounted)return;const o=e.vnode.props||we;let d=i;const u=t.startsWith("update:"),f=u&&Wu(o,t.slice(7));f&&(f.trim&&(d=i.map(A=>Ge(A)?A.trim():A)),f.number&&(d=i.map(Zs)));let p,m=o[p=xn(t)]||o[p=xn(ft(t))];!m&&u&&(m=o[p=xn(fa(t))]),m&&Nt(m,e,6,d);const P=o[p+"Once"];if(P){if(!e.emitted)e.emitted={};else if(e.emitted[p])return;e.emitted[p]=!0,Nt(P,e,6,d)}}const ju=new WeakMap;function Do(e,t,i=!1){const o=i?ju:t.emitsCache,d=o.get(e);if(d!==void 0)return d;const u=e.emits;let f={},p=!1;if(!te(e)){const m=P=>{const A=Do(P,t,!0);A&&(p=!0,We(f,A))};!i&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}return!u&&!p?(Ae(e)&&o.set(e,null),null):(J(u)?u.forEach(m=>f[m]=null):We(f,u),Ae(e)&&o.set(e,f),f)}function sn(e,t){return!e||!qs(t)?!1:(t=t.slice(2).replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,fa(t))||me(e,t))}function di(e){const{type:t,vnode:i,proxy:o,withProxy:d,propsOptions:[u],slots:f,attrs:p,emit:m,render:P,renderCache:A,props:R,data:O,setupState:B,ctx:oe,inheritAttrs:U}=e,Ie=Us(e);let Pe,re;try{if(i.shapeFlag&4){const K=d||o,Ne=K;Pe=Tt(P.call(Ne,K,A,R,B,O,oe)),re=p}else{const K=t;Pe=Tt(K.length>1?K(R,{attrs:p,slots:f,emit:m}):K(R,null)),re=t.props?p:Hu(p)}}catch(K){us.length=0,tn(K,e,1),Pe=It(ca)}let Se=Pe;if(re&&U!==!1){const K=Object.keys(re),{shapeFlag:Ne}=Se;K.length&&Ne&7&&(u&&K.some(er)&&(re=Xu(re,u)),Se=Va(Se,re,!1,!0))}return i.dirs&&(Se=Va(Se,null,!1,!0),Se.dirs=Se.dirs?Se.dirs.concat(i.dirs):i.dirs),i.transition&&fr(Se,i.transition),Pe=Se,Us(Ie),Pe}const Hu=e=>{let t;for(const i in e)(i==="class"||i==="style"||qs(i))&&((t||(t={}))[i]=e[i]);return t},Xu=(e,t)=>{const i={};for(const o in e)(!er(o)||!(o.slice(9)in t))&&(i[o]=e[o]);return i};function qu(e,t,i){const{props:o,children:d,component:u}=e,{props:f,children:p,patchFlag:m}=t,P=u.emitsOptions;if(t.dirs||t.transition)return!0;if(i&&m>=0){if(m&1024)return!0;if(m&16)return o?ui(o,f,P):!!f;if(m&8){const A=t.dynamicProps;for(let R=0;R<A.length;R++){const O=A[R];if(Io(f,o,O)&&!sn(P,O))return!0}}}else return(d||p)&&(!p||!p.$stable)?!0:o===f?!1:o?f?ui(o,f,P):!0:!!f;return!1}function ui(e,t,i){const o=Object.keys(t);if(o.length!==Object.keys(e).length)return!0;for(let d=0;d<o.length;d++){const u=o[d];if(Io(t,e,u)&&!sn(i,u))return!0}return!1}function Io(e,t,i){const o=e[i],d=t[i];return i==="style"&&Ae(o)&&Ae(d)?!ja(o,d):o!==d}function Ju({vnode:e,parent:t},i){for(;t;){const o=t.subTree;if(o.suspense&&o.suspense.activeBranch===e&&(o.el=e.el),o===e)(e=t.vnode).el=i,t=t.parent;else break}}const Ro={},No=()=>Object.create(Ro),ko=e=>Object.getPrototypeOf(e)===Ro;function Zu(e,t,i,o=!1){const d={},u=No();e.propsDefaults=Object.create(null),Co(e,t,d,u);for(const f in e.propsOptions[0])f in d||(d[f]=void 0);i?e.props=o?d:nu(d):e.type.props?e.props=d:e.props=u,e.attrs=u}function Yu(e,t,i,o){const{props:d,attrs:u,vnode:{patchFlag:f}}=e,p=he(d),[m]=e.propsOptions;let P=!1;if((o||f>0)&&!(f&16)){if(f&8){const A=e.vnode.dynamicProps;for(let R=0;R<A.length;R++){let O=A[R];if(sn(e.emitsOptions,O))continue;const B=t[O];if(m)if(me(u,O))B!==u[O]&&(u[O]=B,P=!0);else{const oe=ft(O);d[oe]=Jn(m,p,oe,B,e,!1)}else B!==u[O]&&(u[O]=B,P=!0)}}}else{Co(e,t,d,u)&&(P=!0);let A;for(const R in p)(!t||!me(t,R)&&((A=fa(R))===R||!me(t,A)))&&(m?i&&(i[R]!==void 0||i[A]!==void 0)&&(d[R]=Jn(m,p,R,void 0,e,!0)):delete d[R]);if(u!==p)for(const R in u)(!t||!me(t,R))&&(delete u[R],P=!0)}P&&Ut(e.attrs,"set","")}function Co(e,t,i,o){const[d,u]=e.propsOptions;let f=!1,p;if(t)for(let m in t){if(ss(m))continue;const P=t[m];let A;d&&me(d,A=ft(m))?!u||!u.includes(A)?i[A]=P:(p||(p={}))[A]=P:sn(e.emitsOptions,m)||(!(m in o)||P!==o[m])&&(o[m]=P,f=!0)}if(u){const m=he(i),P=p||we;for(let A=0;A<u.length;A++){const R=u[A];i[R]=Jn(d,m,R,P[R],e,!me(P,R))}}return f}function Jn(e,t,i,o,d,u){const f=e[i];if(f!=null){const p=me(f,"default");if(p&&o===void 0){const m=f.default;if(f.type!==Function&&!f.skipFactory&&te(m)){const{propsDefaults:P}=d;if(i in P)o=P[i];else{const A=As(d);o=P[i]=m.call(null,t),A()}}else o=m;d.ce&&d.ce._setProp(i,o)}f[0]&&(u&&!p?o=!1:f[1]&&(o===""||o===fa(i))&&(o=!0))}return o}const Qu=new WeakMap;function xo(e,t,i=!1){const o=i?Qu:t.propsCache,d=o.get(e);if(d)return d;const u=e.props,f={},p=[];let m=!1;if(!te(e)){const A=R=>{m=!0;const[O,B]=xo(R,t,!0);We(f,O),B&&p.push(...B)};!i&&t.mixins.length&&t.mixins.forEach(A),e.extends&&A(e.extends),e.mixins&&e.mixins.forEach(A)}if(!u&&!m)return Ae(e)&&o.set(e,Oa),Oa;if(J(u))for(let A=0;A<u.length;A++){const R=ft(u[A]);ci(R)&&(f[R]=we)}else if(u)for(const A in u){const R=ft(A);if(ci(R)){const O=u[A],B=f[R]=J(O)||te(O)?{type:O}:We({},O),oe=B.type;let U=!1,Ie=!0;if(J(oe))for(let Pe=0;Pe<oe.length;++Pe){const re=oe[Pe],Se=te(re)&&re.name;if(Se==="Boolean"){U=!0;break}else Se==="String"&&(Ie=!1)}else U=te(oe)&&oe.name==="Boolean";B[0]=U,B[1]=Ie,(U||me(B,"default"))&&p.push(R)}}const P=[f,p];return Ae(e)&&o.set(e,P),P}function ci(e){return e[0]!=="$"&&!ss(e)}const pr=e=>e==="_"||e==="_ctx"||e==="$stable",gr=e=>J(e)?e.map(Tt):[Tt(e)],ec=(e,t,i)=>{if(t._n)return t;const o=vu((...d)=>gr(t(...d)),i);return o._c=!1,o},Eo=(e,t,i)=>{const o=e._ctx;for(const d in e){if(pr(d))continue;const u=e[d];if(te(u))t[d]=ec(d,u,o);else if(u!=null){const f=gr(u);t[d]=()=>f}}},Go=(e,t)=>{const i=gr(t);e.slots.default=()=>i},Fo=(e,t,i)=>{for(const o in t)(i||!pr(o))&&(e[o]=t[o])},tc=(e,t,i)=>{const o=e.slots=No();if(e.vnode.shapeFlag&32){const d=t._;d?(Fo(o,t,i),i&&Wi(o,"_",d,!0)):Eo(t,o)}else t&&Go(e,t)},ac=(e,t,i)=>{const{vnode:o,slots:d}=e;let u=!0,f=we;if(o.shapeFlag&32){const p=t._;p?i&&p===1?u=!1:Fo(d,t,i):(u=!t.$stable,Eo(t,d)),f=t}else t&&(Go(e,t),f={default:1});if(u)for(const p in d)!pr(p)&&f[p]==null&&delete d[p]},et=oc;function sc(e){return nc(e)}function nc(e,t){const i=Ys();i.__VUE__=!0;const{insert:o,remove:d,patchProp:u,createElement:f,createText:p,createComment:m,setText:P,setElementText:A,parentNode:R,nextSibling:O,setScopeId:B=Dt,insertStaticContent:oe}=e,U=(h,y,T,x=null,C=null,k=null,M=void 0,L=null,F=!!y.dynamicChildren)=>{if(h===y)return;h&&!ts(h,y)&&(x=Qt(h),Ze(h,C,k,!0),h=null),y.patchFlag===-2&&(F=!1,y.dynamicChildren=null);const{type:I,ref:_,shapeFlag:E}=y;switch(I){case nn:Ie(h,y,T,x);break;case ca:Pe(h,y,T,x);break;case $s:h==null&&re(y,T,x,M);break;case q:s(h,y,T,x,C,k,M,L,F);break;default:E&1?Ne(h,y,T,x,C,k,M,L,F):E&6?Yt(h,y,T,x,C,k,M,L,F):(E&64||E&128)&&I.process(h,y,T,x,C,k,M,L,F,Ct)}_!=null&&C?os(_,h&&h.ref,k,y||h,!y):_==null&&h&&h.ref!=null&&os(h.ref,null,k,h,!0)},Ie=(h,y,T,x)=>{if(h==null)o(y.el=p(y.children),T,x);else{const C=y.el=h.el;y.children!==h.children&&P(C,y.children)}},Pe=(h,y,T,x)=>{h==null?o(y.el=m(y.children||""),T,x):y.el=h.el},re=(h,y,T,x)=>{[h.el,h.anchor]=oe(h.children,y,T,x,h.el,h.anchor)},Se=({el:h,anchor:y},T,x)=>{let C;for(;h&&h!==y;)C=O(h),o(h,T,x),h=C;o(y,T,x)},K=({el:h,anchor:y})=>{let T;for(;h&&h!==y;)T=O(h),d(h),h=T;d(y)},Ne=(h,y,T,x,C,k,M,L,F)=>{if(y.type==="svg"?M="svg":y.type==="math"&&(M="mathml"),h==null)Oe(y,T,x,C,k,M,L,F);else{const I=h.el&&h.el._isVueCE?h.el:null;try{I&&I._beginPatch(),pa(h,y,C,k,M,L,F)}finally{I&&I._endPatch()}}},Oe=(h,y,T,x,C,k,M,L)=>{let F,I;const{props:_,shapeFlag:E,transition:W,dirs:H}=h;if(F=h.el=f(h.type,k,_&&_.is,_),E&8?A(F,h.children):E&16&&ht(h.children,F,null,x,C,On(h,k),M,L),H&&Aa(h,null,x,"created"),it(F,h,h.scopeId,M,x),_){for(const be in _)be!=="value"&&!ss(be)&&u(F,be,null,_[be],k,x);"value"in _&&u(F,"value",null,_.value,k),(I=_.onVnodeBeforeMount)&&St(I,x,h)}H&&Aa(h,null,x,"beforeMount");const se=rc(C,W);se&&W.beforeEnter(F),o(F,y,T),((I=_&&_.onVnodeMounted)||se||H)&&et(()=>{I&&St(I,x,h),se&&W.enter(F),H&&Aa(h,null,x,"mounted")},C)},it=(h,y,T,x,C)=>{if(T&&B(h,T),x)for(let k=0;k<x.length;k++)B(h,x[k]);if(C){let k=C.subTree;if(y===k||zo(k.type)&&(k.ssContent===y||k.ssFallback===y)){const M=C.vnode;it(h,M,M.scopeId,M.slotScopeIds,C.parent)}}},ht=(h,y,T,x,C,k,M,L,F=0)=>{for(let I=F;I<h.length;I++){const _=h[I]=L?Wt(h[I]):Tt(h[I]);U(null,_,y,T,x,C,k,M,L)}},pa=(h,y,T,x,C,k,M)=>{const L=y.el=h.el;let{patchFlag:F,dynamicChildren:I,dirs:_}=y;F|=h.patchFlag&16;const E=h.props||we,W=y.props||we;let H;if(T&&Sa(T,!1),(H=W.onVnodeBeforeUpdate)&&St(H,T,y,h),_&&Aa(y,h,T,"beforeUpdate"),T&&Sa(T,!0),(E.innerHTML&&W.innerHTML==null||E.textContent&&W.textContent==null)&&A(L,""),I?mt(h.dynamicChildren,I,L,T,x,On(y,C),k):M||ce(h,y,L,null,T,x,On(y,C),k,!1),F>0){if(F&16)ga(L,E,W,T,C);else if(F&2&&E.class!==W.class&&u(L,"class",null,W.class,C),F&4&&u(L,"style",E.style,W.style,C),F&8){const se=y.dynamicProps;for(let be=0;be<se.length;be++){const le=se[be],ze=E[le],$e=W[le];($e!==ze||le==="value")&&u(L,le,ze,$e,C,T)}}F&1&&h.children!==y.children&&A(L,y.children)}else!M&&I==null&&ga(L,E,W,T,C);((H=W.onVnodeUpdated)||_)&&et(()=>{H&&St(H,T,y,h),_&&Aa(y,h,T,"updated")},x)},mt=(h,y,T,x,C,k,M)=>{for(let L=0;L<y.length;L++){const F=h[L],I=y[L],_=F.el&&(F.type===q||!ts(F,I)||F.shapeFlag&198)?R(F.el):T;U(F,I,_,null,x,C,k,M,!0)}},ga=(h,y,T,x,C)=>{if(y!==T){if(y!==we)for(const k in y)!ss(k)&&!(k in T)&&u(h,k,y[k],null,C,x);for(const k in T){if(ss(k))continue;const M=T[k],L=y[k];M!==L&&k!=="value"&&u(h,k,L,M,C,x)}"value"in T&&u(h,"value",y.value,T.value,C)}},s=(h,y,T,x,C,k,M,L,F)=>{const I=y.el=h?h.el:p(""),_=y.anchor=h?h.anchor:p("");let{patchFlag:E,dynamicChildren:W,slotScopeIds:H}=y;H&&(L=L?L.concat(H):H),h==null?(o(I,T,x),o(_,T,x),ht(y.children||[],T,_,C,k,M,L,F)):E>0&&E&64&&W&&h.dynamicChildren&&h.dynamicChildren.length===W.length?(mt(h.dynamicChildren,W,T,C,k,M,L),(y.key!=null||C&&y===C.subTree)&&Lo(h,y,!0)):ce(h,y,T,_,C,k,M,L,F)},Yt=(h,y,T,x,C,k,M,L,F)=>{y.slotScopeIds=L,h==null?y.shapeFlag&512?C.ctx.activate(y,T,x,M,F):ha(y,T,x,C,k,M,F):Ia(h,y,F)},ha=(h,y,T,x,C,k,M)=>{const L=h.component=hc(h,x,C);if(bo(h)&&(L.ctx.renderer=Ct),vc(L,!1,M),L.asyncDep){if(C&&C.registerDep(L,ke,M),!h.el){const F=L.subTree=It(ca);Pe(null,F,y,T),h.placeholder=F.el}}else ke(L,h,y,T,C,k,M)},Ia=(h,y,T)=>{const x=y.component=h.component;if(qu(h,y,T))if(x.asyncDep&&!x.asyncResolved){ve(x,y,T);return}else x.next=y,x.update();else y.el=h.el,x.vnode=y},ke=(h,y,T,x,C,k,M)=>{const L=()=>{if(h.isMounted){let{next:E,bu:W,u:H,parent:se,vnode:be}=h;{const Ye=Mo(h);if(Ye){E&&(E.el=be.el,ve(h,E,M)),Ye.asyncDep.then(()=>{et(()=>{h.isUnmounted||I()},C)});return}}let le=E,ze;Sa(h,!1),E?(E.el=be.el,ve(h,E,M)):E=be,W&&Os(W),(ze=E.props&&E.props.onVnodeBeforeUpdate)&&St(ze,se,E,be),Sa(h,!0);const $e=di(h),at=h.subTree;h.subTree=$e,U(at,$e,R(at.el),Qt(at),h,C,k),E.el=$e.el,le===null&&Ju(h,$e.el),H&&et(H,C),(ze=E.props&&E.props.onVnodeUpdated)&&et(()=>St(ze,se,E,be),C)}else{let E;const{el:W,props:H}=y,{bm:se,m:be,parent:le,root:ze,type:$e}=h,at=ls(y);Sa(h,!1),se&&Os(se),!at&&(E=H&&H.onVnodeBeforeMount)&&St(E,le,y),Sa(h,!0);{ze.ce&&ze.ce._hasShadowRoot()&&ze.ce._injectChildStyle($e,h.parent?h.parent.type:void 0);const Ye=h.subTree=di(h);U(null,Ye,T,x,h,C,k),y.el=Ye.el}if(be&&et(be,C),!at&&(E=H&&H.onVnodeMounted)){const Ye=y;et(()=>St(E,le,Ye),C)}(y.shapeFlag&256||le&&ls(le.vnode)&&le.vnode.shapeFlag&256)&&h.a&&et(h.a,C),h.isMounted=!0,y=T=x=null}};h.scope.on();const F=h.effect=new Xi(L);h.scope.off();const I=h.update=F.run.bind(F),_=h.job=F.runIfDirty.bind(F);_.i=h,_.id=h.uid,F.scheduler=()=>cr(_),Sa(h,!0),I()},ve=(h,y,T)=>{y.component=h;const x=h.vnode.props;h.vnode=y,h.next=null,Yu(h,y.props,x,T),ac(h,y.children,T),Xt(),ai(h),qt()},ce=(h,y,T,x,C,k,M,L,F=!1)=>{const I=h&&h.children,_=h?h.shapeFlag:0,E=y.children,{patchFlag:W,shapeFlag:H}=y;if(W>0){if(W&128){Je(I,E,T,x,C,k,M,L,F);return}else if(W&256){Le(I,E,T,x,C,k,M,L,F);return}}H&8?(_&16&&kt(I,C,k),E!==I&&A(T,E)):_&16?H&16?Je(I,E,T,x,C,k,M,L,F):kt(I,C,k,!0):(_&8&&A(T,""),H&16&&ht(E,T,x,C,k,M,L,F))},Le=(h,y,T,x,C,k,M,L,F)=>{h=h||Oa,y=y||Oa;const I=h.length,_=y.length,E=Math.min(I,_);let W;for(W=0;W<E;W++){const H=y[W]=F?Wt(y[W]):Tt(y[W]);U(h[W],H,T,null,C,k,M,L,F)}I>_?kt(h,C,k,!0,!1,E):ht(y,T,x,C,k,M,L,F,E)},Je=(h,y,T,x,C,k,M,L,F)=>{let I=0;const _=y.length;let E=h.length-1,W=_-1;for(;I<=E&&I<=W;){const H=h[I],se=y[I]=F?Wt(y[I]):Tt(y[I]);if(ts(H,se))U(H,se,T,null,C,k,M,L,F);else break;I++}for(;I<=E&&I<=W;){const H=h[E],se=y[W]=F?Wt(y[W]):Tt(y[W]);if(ts(H,se))U(H,se,T,null,C,k,M,L,F);else break;E--,W--}if(I>E){if(I<=W){const H=W+1,se=H<_?y[H].el:x;for(;I<=W;)U(null,y[I]=F?Wt(y[I]):Tt(y[I]),T,se,C,k,M,L,F),I++}}else if(I>W)for(;I<=E;)Ze(h[I],C,k,!0),I++;else{const H=I,se=I,be=new Map;for(I=se;I<=W;I++){const Me=y[I]=F?Wt(y[I]):Tt(y[I]);Me.key!=null&&be.set(Me.key,I)}let le,ze=0;const $e=W-se+1;let at=!1,Ye=0;const ma=new Array($e);for(I=0;I<$e;I++)ma[I]=0;for(I=H;I<=E;I++){const Me=h[I];if(ze>=$e){Ze(Me,C,k,!0);continue}let Be;if(Me.key!=null)Be=be.get(Me.key);else for(le=se;le<=W;le++)if(ma[le-se]===0&&ts(Me,y[le])){Be=le;break}Be===void 0?Ze(Me,C,k,!0):(ma[Be-se]=I+1,Be>=Ye?Ye=Be:at=!0,U(Me,y[Be],T,null,C,k,M,L,F),ze++)}const Ss=at?ic(ma):Oa;for(le=Ss.length-1,I=$e-1;I>=0;I--){const Me=se+I,Be=y[Me],ws=y[Me+1],Ca=Me+1<_?ws.el||Oo(ws):x;ma[I]===0?U(null,Be,T,Ca,C,k,M,L,F):at&&(le<0||I!==Ss[le]?Ue(Be,T,Ca,2):le--)}}},Ue=(h,y,T,x,C=null)=>{const{el:k,type:M,transition:L,children:F,shapeFlag:I}=h;if(I&6){Ue(h.component.subTree,y,T,x);return}if(I&128){h.suspense.move(y,T,x);return}if(I&64){M.move(h,y,T,Ct);return}if(M===q){o(k,y,T);for(let E=0;E<F.length;E++)Ue(F[E],y,T,x);o(h.anchor,y,T);return}if(M===$s){Se(h,y,T);return}if(x!==2&&I&1&&L)if(x===0)L.beforeEnter(k),o(k,y,T),et(()=>L.enter(k),C);else{const{leave:E,delayLeave:W,afterLeave:H}=L,se=()=>{h.ctx.isUnmounted?d(k):o(k,y,T)},be=()=>{k._isLeaving&&k[Tu](!0),E(k,()=>{se(),H&&H()})};W?W(k,se,be):be()}else o(k,y,T)},Ze=(h,y,T,x=!1,C=!1)=>{const{type:k,props:M,ref:L,children:F,dynamicChildren:I,shapeFlag:_,patchFlag:E,dirs:W,cacheIndex:H}=h;if(E===-2&&(C=!1),L!=null&&(Xt(),os(L,null,T,h,!0),qt()),H!=null&&(y.renderCache[H]=void 0),_&256){y.ctx.deactivate(h);return}const se=_&1&&W,be=!ls(h);let le;if(be&&(le=M&&M.onVnodeBeforeUnmount)&&St(le,y,h),_&6)Ha(h.component,T,x);else{if(_&128){h.suspense.unmount(T,x);return}se&&Aa(h,null,y,"beforeUnmount"),_&64?h.type.remove(h,y,T,Ct,x):I&&!I.hasOnce&&(k!==q||E>0&&E&64)?kt(I,y,T,!1,!0):(k===q&&E&384||!C&&_&16)&&kt(F,y,T),x&&Ra(h)}(be&&(le=M&&M.onVnodeUnmounted)||se)&&et(()=>{le&&St(le,y,h),se&&Aa(h,null,y,"unmounted")},T)},Ra=h=>{const{type:y,el:T,anchor:x,transition:C}=h;if(y===q){Na(T,x);return}if(y===$s){K(h);return}const k=()=>{d(T),C&&!C.persisted&&C.afterLeave&&C.afterLeave()};if(h.shapeFlag&1&&C&&!C.persisted){const{leave:M,delayLeave:L}=C,F=()=>M(T,k);L?L(h.el,k,F):F()}else k()},Na=(h,y)=>{let T;for(;h!==y;)T=O(h),d(h),h=T;d(y)},Ha=(h,y,T)=>{const{bum:x,scope:C,job:k,subTree:M,um:L,m:F,a:I}=h;fi(F),fi(I),x&&Os(x),C.stop(),k&&(k.flags|=8,Ze(M,h,y,T)),L&&et(L,y),et(()=>{h.isUnmounted=!0},y)},kt=(h,y,T,x=!1,C=!1,k=0)=>{for(let M=k;M<h.length;M++)Ze(h[M],y,T,x,C)},Qt=h=>{if(h.shapeFlag&6)return Qt(h.component.subTree);if(h.shapeFlag&128)return h.suspense.next();const y=O(h.anchor||h.el),T=y&&y[wu];return T?O(T):y};let ea=!1;const ka=(h,y,T)=>{let x;h==null?y._vnode&&(Ze(y._vnode,null,null,!0),x=y._vnode.component):U(y._vnode||null,h,y,null,null,null,T),y._vnode=h,ea||(ea=!0,ai(x),fo(),ea=!1)},Ct={p:U,um:Ze,m:Ue,r:Ra,mt:ha,mc:ht,pc:ce,pbc:mt,n:Qt,o:e};return{render:ka,hydrate:void 0,createApp:Vu(ka)}}function On({type:e,props:t},i){return i==="svg"&&e==="foreignObject"||i==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:i}function Sa({effect:e,job:t},i){i?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function rc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Lo(e,t,i=!1){const o=e.children,d=t.children;if(J(o)&&J(d))for(let u=0;u<o.length;u++){const f=o[u];let p=d[u];p.shapeFlag&1&&!p.dynamicChildren&&((p.patchFlag<=0||p.patchFlag===32)&&(p=d[u]=Wt(d[u]),p.el=f.el),!i&&p.patchFlag!==-2&&Lo(f,p)),p.type===nn&&(p.patchFlag===-1&&(p=d[u]=Wt(p)),p.el=f.el),p.type===ca&&!p.el&&(p.el=f.el)}}function ic(e){const t=e.slice(),i=[0];let o,d,u,f,p;const m=e.length;for(o=0;o<m;o++){const P=e[o];if(P!==0){if(d=i[i.length-1],e[d]<P){t[o]=d,i.push(o);continue}for(u=0,f=i.length-1;u<f;)p=u+f>>1,e[i[p]]<P?u=p+1:f=p;P<e[i[u]]&&(u>0&&(t[o]=i[u-1]),i[u]=o)}}for(u=i.length,f=i[u-1];u-- >0;)i[u]=f,f=t[f];return i}function Mo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Mo(t)}function fi(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Oo(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?Oo(t.subTree):null}const zo=e=>e.__isSuspense;function oc(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):mu(e)}const q=Symbol.for("v-fgt"),nn=Symbol.for("v-txt"),ca=Symbol.for("v-cmt"),$s=Symbol.for("v-stc"),us=[];let rt=null;function v(e=!1){us.push(rt=e?null:[])}function lc(){us.pop(),rt=us[us.length-1]||null}let hs=1;function pi(e,t=!1){hs+=e,e<0&&rt&&t&&(rt.hasOnce=!0)}function $o(e){return e.dynamicChildren=hs>0?rt||Oa:null,lc(),hs>0&&rt&&rt.push(e),e}function b(e,t,i,o,d,u){return $o(l(e,t,i,o,d,u,!0))}function dc(e,t,i,o,d){return $o(It(e,t,i,o,d,!0))}function Bo(e){return e?e.__v_isVNode===!0:!1}function ts(e,t){return e.type===t.type&&e.key===t.key}const Ko=({key:e})=>e??null,Bs=({ref:e,ref_key:t,ref_for:i})=>(typeof e=="number"&&(e=""+e),e!=null?Ge(e)||Ve(e)||te(e)?{i:dt,r:e,k:t,f:!!i}:e:null);function l(e,t=null,i=null,o=0,d=null,u=e===q?0:1,f=!1,p=!1){const m={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ko(t),ref:t&&Bs(t),scopeId:go,slotScopeIds:null,children:i,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:u,patchFlag:o,dynamicProps:d,dynamicChildren:null,appContext:null,ctx:dt};return p?(hr(m,i),u&128&&e.normalize(m)):i&&(m.shapeFlag|=Ge(i)?8:16),hs>0&&!f&&rt&&(m.patchFlag>0||u&6)&&m.patchFlag!==32&&rt.push(m),m}const It=uc;function uc(e,t=null,i=null,o=0,d=null,u=!1){if((!e||e===Fu)&&(e=ca),Bo(e)){const p=Va(e,t,!0);return i&&hr(p,i),hs>0&&!u&&rt&&(p.shapeFlag&6?rt[rt.indexOf(e)]=p:rt.push(p)),p.patchFlag=-2,p}if(Sc(e)&&(e=e.__vccOpts),t){t=cc(t);let{class:p,style:m}=t;p&&!Ge(p)&&(t.class=ue(p)),Ae(m)&&(ur(m)&&!J(m)&&(m=We({},m)),t.style=cs(m))}const f=Ge(e)?1:zo(e)?128:Pu(e)?64:Ae(e)?4:te(e)?2:0;return l(e,t,i,o,d,f,u,!0)}function cc(e){return e?ur(e)||ko(e)?We({},e):e:null}function Va(e,t,i=!1,o=!1){const{props:d,ref:u,patchFlag:f,children:p,transition:m}=e,P=t?fc(d||{},t):d,A={__v_isVNode:!0,__v_skip:!0,type:e.type,props:P,key:P&&Ko(P),ref:t&&t.ref?i&&u?J(u)?u.concat(Bs(t)):[u,Bs(t)]:Bs(t):u,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:p,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==q?f===-1?16:f|16:f,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:m,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Va(e.ssContent),ssFallback:e.ssFallback&&Va(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return m&&o&&fr(A,m.clone(A)),A}function de(e=" ",t=0){return It(nn,null,e,t)}function wa(e,t){const i=It($s,null,e);return i.staticCount=t,i}function G(e="",t=!1){return t?(v(),dc(ca,null,e)):It(ca,null,e)}function Tt(e){return e==null||typeof e=="boolean"?It(ca):J(e)?It(q,null,e.slice()):Bo(e)?Wt(e):It(nn,null,String(e))}function Wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Va(e)}function hr(e,t){let i=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(J(t))i=16;else if(typeof t=="object")if(o&65){const d=t.default;d&&(d._c&&(d._d=!1),hr(e,d()),d._c&&(d._d=!0));return}else{i=32;const d=t._;!d&&!ko(t)?t._ctx=dt:d===3&&dt&&(dt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else te(t)?(t={default:t,_ctx:dt},i=32):(t=String(t),o&64?(i=16,t=[de(t)]):i=8);e.children=t,e.shapeFlag|=i}function fc(...e){const t={};for(let i=0;i<e.length;i++){const o=e[i];for(const d in o)if(d==="class")t.class!==o.class&&(t.class=ue([t.class,o.class]));else if(d==="style")t.style=cs([t.style,o.style]);else if(qs(d)){const u=t[d],f=o[d];f&&u!==f&&!(J(u)&&u.includes(f))&&(t[d]=u?[].concat(u,f):f)}else d!==""&&(t[d]=o[d])}return t}function St(e,t,i,o=null){Nt(e,t,7,[i,o])}const pc=_o();let gc=0;function hc(e,t,i){const o=e.type,d=(t?t.appContext:e.appContext)||pc,u={uid:gc++,vnode:e,type:o,parent:t,appContext:d,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Od(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(d.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:xo(o,d),emitsOptions:Do(o,d),emit:null,emitted:null,propsDefaults:we,inheritAttrs:o.inheritAttrs,ctx:we,data:we,props:we,attrs:we,slots:we,refs:we,setupState:we,setupContext:null,suspense:i,suspenseId:i?i.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return u.ctx={_:u},u.root=t?t.root:u,u.emit=Uu.bind(null,u),e.ce&&e.ce(u),u}let qe=null;const mc=()=>qe||dt;let Xs,Zn;{const e=Ys(),t=(i,o)=>{let d;return(d=e[i])||(d=e[i]=[]),d.push(o),u=>{d.length>1?d.forEach(f=>f(u)):d[0](u)}};Xs=t("__VUE_INSTANCE_SETTERS__",i=>qe=i),Zn=t("__VUE_SSR_SETTERS__",i=>ms=i)}const As=e=>{const t=qe;return Xs(e),e.scope.on(),()=>{e.scope.off(),Xs(t)}},gi=()=>{qe&&qe.scope.off(),Xs(null)};function Vo(e){return e.vnode.shapeFlag&4}let ms=!1;function vc(e,t=!1,i=!1){t&&Zn(t);const{props:o,children:d}=e.vnode,u=Vo(e);Zu(e,o,u,t),tc(e,d,i||t);const f=u?bc(e,t):void 0;return t&&Zn(!1),f}function bc(e,t){const i=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Lu);const{setup:o}=i;if(o){Xt();const d=e.setupContext=o.length>1?Ac(e):null,u=As(e),f=ys(o,e,0,[e.props,d]),p=$i(f);if(qt(),u(),(p||e.sp)&&!ls(e)&&vo(e),p){if(f.then(gi,gi),t)return f.then(m=>{hi(e,m)}).catch(m=>{tn(m,e,0)});e.asyncDep=f}else hi(e,f)}else Wo(e)}function hi(e,t,i){te(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ae(t)&&(e.setupState=lo(t)),Wo(e)}function Wo(e,t,i){const o=e.type;e.render||(e.render=o.render||Dt);{const d=As(e);Xt();try{Mu(e)}finally{qt(),d()}}}const yc={get(e,t){return Ke(e,"get",""),e[t]}};function Ac(e){const t=i=>{e.exposed=i||{}};return{attrs:new Proxy(e.attrs,yc),slots:e.slots,emit:e.emit,expose:t}}function rn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(lo(ru(e.exposed)),{get(t,i){if(i in t)return t[i];if(i in ds)return ds[i](e)},has(t,i){return i in t||i in ds}})):e.proxy}function Sc(e){return te(e)&&"__vccOpts"in e}const j=(e,t)=>cu(e,t,ms),wc="3.5.30";let Yn;const mi=typeof window<"u"&&window.trustedTypes;if(mi)try{Yn=mi.createPolicy("vue",{createHTML:e=>e})}catch{}const Uo=Yn?e=>Yn.createHTML(e):e=>e,Pc="http://www.w3.org/2000/svg",Tc="http://www.w3.org/1998/Math/MathML",Vt=typeof document<"u"?document:null,vi=Vt&&Vt.createElement("template"),_c={insert:(e,t,i)=>{t.insertBefore(e,i||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,i,o)=>{const d=t==="svg"?Vt.createElementNS(Pc,e):t==="mathml"?Vt.createElementNS(Tc,e):i?Vt.createElement(e,{is:i}):Vt.createElement(e);return e==="select"&&o&&o.multiple!=null&&d.setAttribute("multiple",o.multiple),d},createText:e=>Vt.createTextNode(e),createComment:e=>Vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,i,o,d,u){const f=i?i.previousSibling:t.lastChild;if(d&&(d===u||d.nextSibling))for(;t.insertBefore(d.cloneNode(!0),i),!(d===u||!(d=d.nextSibling)););else{vi.innerHTML=Uo(o==="svg"?`<svg>${e}</svg>`:o==="mathml"?`<math>${e}</math>`:e);const p=vi.content;if(o==="svg"||o==="mathml"){const m=p.firstChild;for(;m.firstChild;)p.appendChild(m.firstChild);p.removeChild(m)}t.insertBefore(p,i)}return[f?f.nextSibling:t.firstChild,i?i.previousSibling:t.lastChild]}},Dc=Symbol("_vtc");function Ic(e,t,i){const o=e[Dc];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):i?e.setAttribute("class",t):e.className=t}const bi=Symbol("_vod"),Rc=Symbol("_vsh"),Nc=Symbol(""),kc=/(?:^|;)\s*display\s*:/;function Cc(e,t,i){const o=e.style,d=Ge(i);let u=!1;if(i&&!d){if(t)if(Ge(t))for(const f of t.split(";")){const p=f.slice(0,f.indexOf(":")).trim();i[p]==null&&Ks(o,p,"")}else for(const f in t)i[f]==null&&Ks(o,f,"");for(const f in i)f==="display"&&(u=!0),Ks(o,f,i[f])}else if(d){if(t!==i){const f=o[Nc];f&&(i+=";"+f),o.cssText=i,u=kc.test(i)}}else t&&e.removeAttribute("style");bi in e&&(e[bi]=u?o.display:"",e[Rc]&&(o.display="none"))}const yi=/\s*!important$/;function Ks(e,t,i){if(J(i))i.forEach(o=>Ks(e,t,o));else if(i==null&&(i=""),t.startsWith("--"))e.setProperty(t,i);else{const o=xc(e,t);yi.test(i)?e.setProperty(fa(o),i.replace(yi,""),"important"):e[o]=i}}const Ai=["Webkit","Moz","ms"],zn={};function xc(e,t){const i=zn[t];if(i)return i;let o=ft(t);if(o!=="filter"&&o in e)return zn[t]=o;o=Vi(o);for(let d=0;d<Ai.length;d++){const u=Ai[d]+o;if(u in e)return zn[t]=u}return t}const Si="http://www.w3.org/1999/xlink";function wi(e,t,i,o,d,u=Ld(t)){o&&t.startsWith("xlink:")?i==null?e.removeAttributeNS(Si,t.slice(6,t.length)):e.setAttributeNS(Si,t,i):i==null||u&&!Ui(i)?e.removeAttribute(t):e.setAttribute(t,u?"":Rt(i)?String(i):i)}function Pi(e,t,i,o,d){if(t==="innerHTML"||t==="textContent"){i!=null&&(e[t]=t==="innerHTML"?Uo(i):i);return}const u=e.tagName;if(t==="value"&&u!=="PROGRESS"&&!u.includes("-")){const p=u==="OPTION"?e.getAttribute("value")||"":e.value,m=i==null?e.type==="checkbox"?"on":"":String(i);(p!==m||!("_value"in e))&&(e.value=m),i==null&&e.removeAttribute(t),e._value=i;return}let f=!1;if(i===""||i==null){const p=typeof e[t];p==="boolean"?i=Ui(i):i==null&&p==="string"?(i="",f=!0):p==="number"&&(i=0,f=!0)}try{e[t]=i}catch{}f&&e.removeAttribute(d||t)}function ua(e,t,i,o){e.addEventListener(t,i,o)}function Ec(e,t,i,o){e.removeEventListener(t,i,o)}const Ti=Symbol("_vei");function Gc(e,t,i,o,d=null){const u=e[Ti]||(e[Ti]={}),f=u[t];if(o&&f)f.value=o;else{const[p,m]=Fc(t);if(o){const P=u[t]=Oc(o,d);ua(e,p,P,m)}else f&&(Ec(e,p,f,m),u[t]=void 0)}}const _i=/(?:Once|Passive|Capture)$/;function Fc(e){let t;if(_i.test(e)){t={};let o;for(;o=e.match(_i);)e=e.slice(0,e.length-o[0].length),t[o[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):fa(e.slice(2)),t]}let $n=0;const Lc=Promise.resolve(),Mc=()=>$n||(Lc.then(()=>$n=0),$n=Date.now());function Oc(e,t){const i=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=i.attached)return;Nt(zc(o,i.value),t,5,[o])};return i.value=e,i.attached=Mc(),i}function zc(e,t){if(J(t)){const i=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{i.call(e),e._stopped=!0},t.map(o=>d=>!d._stopped&&o&&o(d))}else return t}const Di=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,$c=(e,t,i,o,d,u)=>{const f=d==="svg";t==="class"?Ic(e,o,f):t==="style"?Cc(e,i,o):qs(t)?er(t)||Gc(e,t,i,o,u):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Bc(e,t,o,f))?(Pi(e,t,o),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&wi(e,t,o,f,u,t!=="value")):e._isVueCE&&(Kc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Ge(o)))?Pi(e,ft(t),o,u,t):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),wi(e,t,o,f))};function Bc(e,t,i,o){if(o)return!!(t==="innerHTML"||t==="textContent"||t in e&&Di(t)&&te(i));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const d=e.tagName;if(d==="IMG"||d==="VIDEO"||d==="CANVAS"||d==="SOURCE")return!1}return Di(t)&&Ge(i)?!1:t in e}function Kc(e,t){const i=e._def.props;if(!i)return!1;const o=ft(t);return Array.isArray(i)?i.some(d=>ft(d)===o):Object.keys(i).some(d=>ft(d)===o)}const Wa=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?i=>Os(t,i):t};function Vc(e){e.target.composing=!0}function Ii(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ht=Symbol("_assign");function Ri(e,t,i){return t&&(e=e.trim()),i&&(e=Zs(e)),e}const Ce={created(e,{modifiers:{lazy:t,trim:i,number:o}},d){e[Ht]=Wa(d);const u=o||d.props&&d.props.type==="number";ua(e,t?"change":"input",f=>{f.target.composing||e[Ht](Ri(e.value,i,u))}),(i||u)&&ua(e,"change",()=>{e.value=Ri(e.value,i,u)}),t||(ua(e,"compositionstart",Vc),ua(e,"compositionend",Ii),ua(e,"change",Ii))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:i,modifiers:{lazy:o,trim:d,number:u}},f){if(e[Ht]=Wa(f),e.composing)return;const p=(u||e.type==="number")&&!/^0\d/.test(e.value)?Zs(e.value):e.value,m=t??"";p!==m&&(document.activeElement===e&&e.type!=="range"&&(o&&t===i||d&&e.value.trim()===m)||(e.value=m))}},Bn={deep:!0,created(e,t,i){e[Ht]=Wa(i),ua(e,"change",()=>{const o=e._modelValue,d=vs(e),u=e.checked,f=e[Ht];if(J(o)){const p=sr(o,d),m=p!==-1;if(u&&!m)f(o.concat(d));else if(!u&&m){const P=[...o];P.splice(p,1),f(P)}}else if(Ua(o)){const p=new Set(o);u?p.add(d):p.delete(d),f(p)}else f(jo(e,u))})},mounted:Ni,beforeUpdate(e,t,i){e[Ht]=Wa(i),Ni(e,t,i)}};function Ni(e,{value:t,oldValue:i},o){e._modelValue=t;let d;if(J(t))d=sr(t,o.props.value)>-1;else if(Ua(t))d=t.has(o.props.value);else{if(t===i)return;d=ja(t,jo(e,!0))}e.checked!==d&&(e.checked=d)}const Pa={deep:!0,created(e,{value:t,modifiers:{number:i}},o){const d=Ua(t);ua(e,"change",()=>{const u=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>i?Zs(vs(f)):vs(f));e[Ht](e.multiple?d?new Set(u):u:u[0]),e._assigning=!0,is(()=>{e._assigning=!1})}),e[Ht]=Wa(o)},mounted(e,{value:t}){ki(e,t)},beforeUpdate(e,t,i){e[Ht]=Wa(i)},updated(e,{value:t}){e._assigning||ki(e,t)}};function ki(e,t){const i=e.multiple,o=J(t);if(!(i&&!o&&!Ua(t))){for(let d=0,u=e.options.length;d<u;d++){const f=e.options[d],p=vs(f);if(i)if(o){const m=typeof p;m==="string"||m==="number"?f.selected=t.some(P=>String(P)===String(p)):f.selected=sr(t,p)>-1}else f.selected=t.has(p);else if(ja(vs(f),t)){e.selectedIndex!==d&&(e.selectedIndex=d);return}}!i&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function vs(e){return"_value"in e?e._value:e.value}function jo(e,t){const i=t?"_trueValue":"_falseValue";return i in e?e[i]:t}const Wc=["ctrl","shift","alt","meta"],Uc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Wc.some(i=>e[`${i}Key`]&&!t.includes(i))},Kt=(e,t)=>{if(!e)return e;const i=e._withMods||(e._withMods={}),o=t.join(".");return i[o]||(i[o]=((d,...u)=>{for(let f=0;f<t.length;f++){const p=Uc[t[f]];if(p&&p(d,t))return}return e(d,...u)}))},jc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Hc=(e,t)=>{const i=e._withKeys||(e._withKeys={}),o=t.join(".");return i[o]||(i[o]=(d=>{if(!("key"in d))return;const u=fa(d.key);if(t.some(f=>f===u||jc[f]===u))return e(d)}))},Xc=We({patchProp:$c},_c);let Ci;function qc(){return Ci||(Ci=sc(Xc))}const Jc=((...e)=>{const t=qc().createApp(...e),{mount:i}=t;return t.mount=o=>{const d=Yc(o);if(!d)return;const u=t._component;!te(u)&&!u.render&&!u.template&&(u.template=d.innerHTML),d.nodeType===1&&(d.textContent="");const f=i(d,!1,Zc(d));return d instanceof Element&&(d.removeAttribute("v-cloak"),d.setAttribute("data-v-app","")),f},t});function Zc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Yc(e){return Ge(e)?document.querySelector(e):e}const Qc="modulepreload",ef=function(e,t){return new URL(e,t).href},xi={},tf=function(t,i,o){let d=Promise.resolve();if(i&&i.length>0){let P=function(A){return Promise.all(A.map(R=>Promise.resolve(R).then(O=>({status:"fulfilled",value:O}),O=>({status:"rejected",reason:O}))))};const f=document.getElementsByTagName("link"),p=document.querySelector("meta[property=csp-nonce]"),m=p?.nonce||p?.getAttribute("nonce");d=P(i.map(A=>{if(A=ef(A,o),A in xi)return;xi[A]=!0;const R=A.endsWith(".css"),O=R?'[rel="stylesheet"]':"";if(o)for(let oe=f.length-1;oe>=0;oe--){const U=f[oe];if(U.href===A&&(!R||U.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${A}"]${O}`))return;const B=document.createElement("link");if(B.rel=R?"stylesheet":Qc,R||(B.as="script"),B.crossOrigin="",B.href=A,m&&B.setAttribute("nonce",m),document.head.appendChild(B),R)return new Promise((oe,U)=>{B.addEventListener("load",oe),B.addEventListener("error",()=>U(new Error(`Unable to preload CSS for ${A}`)))})}))}function u(f){const p=new Event("vite:preloadError",{cancelable:!0});if(p.payload=f,window.dispatchEvent(p),!p.defaultPrevented)throw f}return d.then(f=>{for(const p of f||[])p.status==="rejected"&&u(p.reason);return t().catch(u)})},af={en:{},it:{"{{count}} areas":"{{count}} aree","{{count}} available":"{{count}} disponibile","{{count}} event types":"{{count}} tipi di eventi","{{count}} recent":"{{count}} recente","{{count}} saved plans":"{{count}} piani salvati","{{count}} visible":"{{count}} visibile","Activate main actuators":"Attiva gli attuatori principali","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Attivare i principali attuatori presenti nell'area e verificare il feedback di stato per confermare che segua i comandi.","Active Read Request To Status GA":"Richiesta di lettura attiva allo stato GA","Actuator preset deleted":"Preimpostazione dell'attuatore cancellata","Actuator preset saved":"Preimpostazione dell'attuatore salvata","Actuator test complete":"Test dell'attuatore completato","Add group addresses to this area":"Aggiungi indirizzi di gruppo a quest'area","Add Step":"Aggiungi passaggio","Add Wait":"Aggiungi Aspetta","AI Area Builder":"Costruttore di aree AI","AI is selecting area GA...":"L'IA sta selezionando l'area GA...","anomaly x{{value}}":"anomalia x{{value}}","Applies to all matching lighting command GA in the selected area.":"Si applica a tutti i comandi di illuminazione corrispondenti GA nell'area selezionata.",Area:"Zona","Area {{value}}":"Area {{value}}","Area deleted":"Area eliminata","Area editor closed":"Redazione di area chiusa","Area GA membership":"Iscrizione all'area GA","Area name":"Nome dell'area","Area reset":"Reimpostazione dell'area","Area to test":"Zona da testare",Areas:"Aree","Ask failed":"Domanda fallita","Asking...":"Asking...",Assistant:"Assistente","Assistant prompt":"Richiesta dell'assistente","Available GA":"Disponibile GA","Building test plan...":"Piano di prova della costruzione...","Builds a deterministic active test using the supported command GA in the selected area.":"Costruisce un test attivo deterministico utilizzando il comando supportato GA nell'area selezionata.","Bus Connection Persistence":"Persistenza della connessione bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Scegli un report per esaminare metriche, controlli dettagliati e suggerimenti.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Scegli un modello di test standard per l'area selezionata, quindi crea il piano in modo deterministico dal catalogo ETS.",Close:"Chiudi","Close menu":"Chiudi menù",Command:"Comando","Command DPT":"Comando DPT","Command GA":"Comando GA","Command payload":"Carico utile del comando",Completed:"Completato","Config exported":"Configurazione esportata","Config imported":"Configurazione importata","Connected {{value}}":"Connesso {{value}}","Coverage {{value}}%":"Copertura {{value}}%","Define at least one area before creating a test plan":"Definire almeno un'area prima di creare un piano di test","Define at least one area before using Tests":"Definire almeno un'area prima di utilizzare i test","Delete Area":"Elimina area","Deleting actuator preset...":"Eliminazione della preimpostazione dell'attuatore...","Deleting area...":"Eliminazione area...","Deleting profile...":"Eliminazione profilo...","Deleting test plan...":"Eliminazione del piano di test...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Descrivi la stanza, la zona o la funzione che desideri.L'intelligenza artificiale suggerirà gli indirizzi dei gruppi più rilevanti per questa bozza.",Description:"Descrizione","Disconnected {{value}}":"Disconnesso {{value}}","Documentation: KNX AI Vue":"Documentazione: KNX AI Vue","Donate via PayPal":"Dona tramite PayPal","Drag step":"Trascina il passaggio",Duplicate:"Duplica","Duplicate Plan":"Duplica piano","Edit Area":"Modifica area","Edit Plan":"Modifica piano","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Abilita l'IA nel nodo KNX AI per rigenerare aree o suggerire GA per una nuova bozza.","Event distribution will appear after the first samples.":"La distribuzione degli eventi apparirà dopo i primi campioni.","Event Mix":"Mix di eventi","Example: Add all technical room lighting command and status GA.":"Esempio: aggiungere tutti i comandi e lo stato dell'illuminazione del locale tecnico GA.",Expected:"Previsto","Expected feedback value":"Valore di feedback previsto","Expected payload":"Carico utile previsto","Explain any anomalies you see and suggest what to check first.":"Spiega eventuali anomalie riscontrate e suggerisci cosa controllare prima.","Export PDF":"Esporta PDF","Exporting config...":"Esportazione della configurazione...",Fail:"Fallire","Failed to build the test plan":"Impossibile creare il piano di test","Failed to delete actuator preset":"Impossibile eliminare la preimpostazione dell'attuatore","Failed to delete area":"Impossibile eliminare l'area","Failed to delete profile":"Impossibile eliminare il profilo","Failed to delete test plan":"Impossibile eliminare il piano di test","Failed to delete test result":"Impossibile eliminare il risultato del test","Failed to export config":"Impossibile esportare la configurazione","Failed to import config":"Impossibile importare la configurazione","Failed to load area command/status catalog":"Impossibile caricare il catalogo comandi/stati dell'area","Failed to load GA catalog":"Impossibile caricare il catalogo GA","Failed to load nodes":"Impossibile caricare i nodi","Failed to load state":"Impossibile caricare lo stato","Failed to regenerate AI areas":"Impossibile rigenerare le aree AI","Failed to reset area":"Impossibile reimpostare l'area","Failed to run actuator test":"Impossibile eseguire il test dell'attuatore","Failed to run profile":"Impossibile eseguire il profilo","Failed to run test plan":"Impossibile eseguire il piano di test","Failed to save actuator preset":"Impossibile salvare la preimpostazione dell'attuatore","Failed to save area":"Impossibile salvare l'area","Failed to save GA role":"Impossibile salvare il ruolo GA","Failed to save profile":"Impossibile salvare il profilo","Failed to save test plan":"Impossibile salvare il piano di test","Failed to save test result":"Impossibile salvare il risultato del test","Failed to suggest area GA":"Impossibile suggerire l'area GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Genera un grafico a barre SVG dei principali indirizzi del gruppo con conteggi e titolo.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Il verde mostra l'ora collegata al bus KNX.Il rosso mostra i tempi di inattività all'interno della finestra della cronologia selezionata.",GroupValue_Response:"Response",GroupValue_Write:"Write","HVAC active check":"HVAC controllo attivo","Importing config...":"Importazione configurazione...","in progress":"in corso","Installer alias":"Alias dell'installatore","KNX active test name":"KNX nome del test attivo","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Luci accese, poi spente","Live and saved reports generated by KNX active and read-only tests.":"Report in tempo reale e salvati generati da test attivi e di sola lettura di KNX.","Loading nodes...":"Caricamento nodi...","Loading...":"Loading...","n/a":"n/a","New Area":"Nuova zona","New Plan":"Nuovo piano","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Nessuna area corrisponde alla ricerca corrente oppure il file ETS non espone ancora una gerarchia utilizzabile.","No detailed entries stored for this report yet.":"Nessuna voce dettagliata ancora memorizzata per questo rapporto.","No feedback":"Nessun feedback","No GA selected for this area yet.":"Nessun GA ancora selezionato per quest'area.","No KNX AI nodes found.":"Nessun nodo KNX AI trovato.","No saved plans yet.":"Nessun piano ancora salvato.","No saved test results yet.":"Nessun risultato del test ancora salvato.","No test result selected to export":"Nessun risultato del test selezionato per l'esportazione","No test result selected.":"Nessun risultato del test selezionato.","No top group address data available yet.":"Nessun dato sugli indirizzi dei gruppi principali ancora disponibile.","Nodes {{nodes}} | Links {{links}}":"Nodi {{nodes}} |Collegamenti {{links}}",Now:"Adesso","Open and close shading":"Apri e chiudi l'ombreggiatura","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Aprire e chiudere gli attuatori ombreggianti presenti nell'area, quindi verificare che lo stato corrisponda ai comandi inviati.","Open Source Test":"Prova dell'open source","Optional note for diagnostics and reports":"Nota facoltativa per diagnostica e report","Original ETS path:":"Percorso ETS originale:",Overview:"Panoramica",Pass:"Passa",Payload:"Carico utile","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Scegli dal catalogo ETS.Gli GA già selezionati sono nascosti da questo elenco.","Plan changes discarded":"Modifiche al piano annullate","Plan duplicated":"Piano duplicato","Plan name":"Nome del piano",Plans:"Piani","Profile deleted":"Profilo eliminato","Profile report ready":"Rapporto sul profilo pronto","Profile saved":"Profilo salvato","Provider: {{provider}} | Model: {{model}}":"Fornitore: {{provider}} |Modello: {{model}}",Rate:"Vota","Read response timeout ms":"Leggi il timeout della risposta ms",Ready:"Pronto",Reason:"Motivo",Refresh:"Aggiorna","Regenerating AI areas...":"Rigenerazione delle aree AI...",Remove:"Rimuovi",Repeat:"Ripeti",Reset:"Ripristina","Resetting area...":"Reimpostazione dell'area...","Response timeout":"Timeout della risposta","Returned to the Tests page for the source actuator test.":"Ritornato alla pagina Test per il test dell'attuatore sorgente.","Returned to the Tests page for the source read-only profile.":"Ritornato alla pagina Test per il profilo di sola lettura di origine.","Returned to the Tests page.":"Ritornato alla pagina dei test.","Reusable deterministic active tests saved by the installer.":"Test attivi deterministici riutilizzabili salvati dall'installatore.",Role:"Ruolo","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Eseguire un test completo dei comandi HVAC nell'area e verificare che i setpoint e gli stati siano coerenti.",Running:"Correre","Running actuator test...":"Esecuzione del test dell'attuatore in corso...","Running profile...":"Profilo in esecuzione...","Running...":"Running...","Saving actuator preset...":"Salvataggio della preimpostazione dell'attuatore...","Saving profile...":"Salvataggio profilo...","Saving test plan...":"Salvataggio del piano di test...","Search GA, label or ETS path":"Cerca GA, etichetta o percorso ETS","Select an Area":"Seleziona un'area","Select area":"Seleziona zona","Select command GA":"Seleziona il comando GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Seleziona uno dei modelli standard.Il piano viene costruito solo dal comando GA disponibile nell'area selezionata.","Select test plan":"Seleziona il piano di prova","Select Test Result":"Seleziona Risultato del test","Selected template":"Modello selezionato","Send a":"Invia un",Settings:"Impostazioni","Short operator-facing description":"Breve descrizione rivolta all'operatore","Show AI Area Builder":"Mostra AI Area Builder","Show Template Builder":"Mostra generatore di modelli","Spontaneous Write From Status GA":"Scrittura spontanea dallo stato GA",Status:"Stato","Status DPT":"Stato DPT","Status GA":"Stato GA","Status write timeout ms":"Timeout scrittura stato ms","Step title":"Titolo del passaggio","Stopping repeat mode after the current cycle...":"Interruzione della modalità di ripetizione dopo il ciclo corrente...",Subscribe:"Iscriviti",Suggestions:"Suggerimenti","Summarize the current KNX traffic and highlight the busiest group addresses.":"Riepiloga il traffico corrente KNX ed evidenzia gli indirizzi dei gruppi più trafficati.",Summary:"Sommario","Targets supported HVAC command GA in the selected area.":"Bersagli supportati HVAC comando GA nell'area selezionata.","Targets supported shading command GA in the selected area.":"Gli obiettivi supportano il comando di ombreggiatura GA nell'area selezionata.","telegram from the status GA.":"telegramma dallo stato GA.","telegram to the status GA and wait for a":"telegramma allo stato GA e attendere un",Telegrams:"Telegrammi","Template Builder":"Generatore di modelli","Test editor closed":"Editor del test chiuso","Test plan deleted":"Piano di test eliminato","Test plan ready":"Piano di prova pronto","Test plan saved":"Piano di test salvato","Test completed":"Test completato","Repeat mode stopped":"Modalità ripetizione arrestata","Test result deleted":"Risultato del test cancellato","Test Results":"Risultati dei test","Test Running":"Prova in esecuzione",Tests:"Test","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"L'installatore può rinominare l'area e decidere esattamente a quali indirizzi di gruppo appartenere.Tutto è persistente per nodo KNX AI.",Timeout:"Timeout",Title:"Titolo","Toggle menu":"Cambia menu","Toggle sidebar":"Attiva/disattiva la barra laterale","Top Group Addresses":"Indirizzi di gruppo principali","true, false, 50":"vero, falso, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Accendi le luci, poi spegnile e verifica che i relativi valori di stato siano coerenti.","Unknown DPT":"Sconosciuto DPT","Unsaved changes":"Modifiche non salvate",Voice:"Voce",Wait:"Aspetta","Wait for a spontaneous":"Aspetta uno spontaneo","Wait ms":"Aspetta, signorina",Warn:"Avvertire","What this step checks":"Cosa controlla questo passaggio","Why this step exists":"Perché esiste questo passaggio","Window {{value}}s.":"Finestra {{value}}s.","Write timeout":"Scrivi timeout"},de:{"{{count}} areas":"{{count}} Bereiche","{{count}} available":"{{count}} verfügbar","{{count}} event types":"{{count}} Ereignistypen","{{count}} recent":"{{count}} aktuell","{{count}} saved plans":"{{count}} gespeicherte Pläne","{{count}} visible":"{{count}} sichtbar","Activate main actuators":"Hauptaktoren aktivieren","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Aktivieren Sie die Hauptaktoren im Bereich und überprüfen Sie die Statusrückmeldung, um zu bestätigen, dass die Befehle befolgt werden.","Active Read Request To Status GA":"Aktive Leseanforderung an Status GA","Actuator preset deleted":"Aktorvoreinstellung gelöscht","Actuator preset saved":"Aktorvoreinstellung gespeichert","Actuator test complete":"Aktuatortest abgeschlossen","Add group addresses to this area":"Fügen Sie diesem Bereich Gruppenadressen hinzu","Add Step":"Schritt hinzufügen","Add Wait":"Warten hinzufügen","AI Area Builder":"AI Area Builder","AI is selecting area GA...":"KI wählt Bereich GA aus...","anomaly x{{value}}":"Anomalie x{{value}}","Applies to all matching lighting command GA in the selected area.":"Gilt für alle passenden Beleuchtungsbefehle GA im ausgewählten Bereich.",Area:"Bereich","Area {{value}}":"Bereich {{value}}","Area deleted":"Bereich gelöscht","Area editor closed":"Bereichseditor geschlossen","Area GA membership":"Bereich GA Mitgliedschaft","Area name":"Gebietsname","Area reset":"Bereich zurückgesetzt","Area to test":"Bereich zum Testen",Areas:"Bereiche","Ask failed":"Die Anfrage ist fehlgeschlagen","Asking...":"Asking...",Assistant:"Assistent","Assistant prompt":"Eingabeaufforderung des Assistenten","Available GA":"Verfügbar GA","Building test plan...":"Bautestplan...","Builds a deterministic active test using the supported command GA in the selected area.":"Erstellt einen deterministischen aktiven Test mit dem unterstützten Befehl GA im ausgewählten Bereich.","Bus Connection Persistence":"Persistenz der Busverbindung","Choose a report to inspect metrics, detailed checks, and suggestions.":"Wählen Sie einen Bericht aus, um Metriken, detaillierte Prüfungen und Vorschläge zu prüfen.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Wählen Sie eine Standardtestvorlage für den ausgewählten Bereich und erstellen Sie dann den Plan deterministisch aus dem Katalog ETS.",Close:"Schließen","Close menu":"Menü schließen",Command:"Befehl","Command DPT":"Befehl DPT","Command GA":"Befehl GA","Command payload":"Befehlsnutzlast",Completed:"Abgeschlossen","Config exported":"Konfiguration exportiert","Config imported":"Konfiguration importiert","Connected {{value}}":"Verbunden {{value}}","Coverage {{value}}%":"Abdeckung {{value}}%","Define at least one area before creating a test plan":"Definieren Sie mindestens einen Bereich, bevor Sie einen Testplan erstellen","Define at least one area before using Tests":"Definieren Sie mindestens einen Bereich, bevor Sie Tests verwenden","Delete Area":"Bereich löschen","Deleting actuator preset...":"Aktor-Preset wird gelöscht...","Deleting area...":"Bereich wird gelöscht...","Deleting profile...":"Profil wird gelöscht...","Deleting test plan...":"Testplan wird gelöscht...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Beschreiben Sie den Raum, die Zone oder die Funktion, die Sie wünschen.Die KI schlägt für diesen Entwurf die relevantesten Gruppenadressen vor.",Description:"Beschreibung","Disconnected {{value}}":"Getrennt {{value}}","Documentation: KNX AI Vue":"Dokumentation: KNX AI Vue","Donate via PayPal":"Spenden Sie über PayPal","Drag step":"Schritt ziehen",Duplicate:"Duplizieren","Duplicate Plan":"Plan duplizieren","Edit Area":"Bereich bearbeiten","Edit Plan":"Plan bearbeiten","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Aktivieren Sie die KI im Knoten KNX AI, um Bereiche neu zu generieren, oder schlagen Sie GA für einen neuen Entwurf vor.","Event distribution will appear after the first samples.":"Die Ereignisverteilung erscheint nach den ersten Proben.","Event Mix":"Event-Mix","Example: Add all technical room lighting command and status GA.":"Beispiel: Alle technischen Raumbeleuchtungsbefehle und den Status GA hinzufügen.",Expected:"Erwartet","Expected feedback value":"Erwarteter Feedbackwert","Expected payload":"Erwartete Nutzlast","Explain any anomalies you see and suggest what to check first.":"Erklären Sie alle Anomalien, die Sie sehen, und schlagen Sie vor, was Sie zuerst überprüfen sollten.","Export PDF":"PDF exportieren","Exporting config...":"Konfiguration wird exportiert...",Fail:"Scheitern","Failed to build the test plan":"Der Testplan konnte nicht erstellt werden","Failed to delete actuator preset":"Aktorvoreinstellung konnte nicht gelöscht werden","Failed to delete area":"Bereich konnte nicht gelöscht werden","Failed to delete profile":"Profil konnte nicht gelöscht werden","Failed to delete test plan":"Testplan konnte nicht gelöscht werden","Failed to delete test result":"Testergebnis konnte nicht gelöscht werden","Failed to export config":"Konfiguration konnte nicht exportiert werden","Failed to import config":"Konfiguration konnte nicht importiert werden","Failed to load area command/status catalog":"Der Befehls-/Statuskatalog für den Bereich konnte nicht geladen werden","Failed to load GA catalog":"Der Katalog GA konnte nicht geladen werden","Failed to load nodes":"Knoten konnten nicht geladen werden","Failed to load state":"Status konnte nicht geladen werden","Failed to regenerate AI areas":"KI-Bereiche konnten nicht regeneriert werden","Failed to reset area":"Bereich konnte nicht zurückgesetzt werden","Failed to run actuator test":"Aktuatortest konnte nicht ausgeführt werden","Failed to run profile":"Profil konnte nicht ausgeführt werden","Failed to run test plan":"Testplan konnte nicht ausgeführt werden","Failed to save actuator preset":"Aktorvoreinstellung konnte nicht gespeichert werden","Failed to save area":"Bereich konnte nicht gespeichert werden","Failed to save GA role":"Die Rolle GA konnte nicht gespeichert werden","Failed to save profile":"Profil konnte nicht gespeichert werden","Failed to save test plan":"Der Testplan konnte nicht gespeichert werden","Failed to save test result":"Testergebnis konnte nicht gespeichert werden","Failed to suggest area GA":"Bereich GA konnte nicht vorgeschlagen werden","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Erstellen Sie ein SVG-Balkendiagramm der Top-Gruppenadressen mit Anzahl und Titel.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Grün zeigt die mit dem Bus KNX verbundene Zeit an.Rot zeigt Ausfallzeiten im ausgewählten Verlaufsfenster an.",GroupValue_Response:"Response",GroupValue_Write:"Write","HVAC active check":"HVAC aktive Prüfung","Importing config...":"Konfiguration wird importiert...","in progress":"in Bearbeitung","Installer alias":"Installer-Alias","KNX active test name":"KNX aktiver Testname","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Licht an, dann aus","Live and saved reports generated by KNX active and read-only tests.":"Live- und gespeicherte Berichte, die von KNX aktiven und schreibgeschützten Tests generiert wurden.","Loading nodes...":"Knoten werden geladen...","Loading...":"Loading...","n/a":"n/a","New Area":"Neuer Bereich","New Plan":"Neuer Plan","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Keine Bereiche stimmten mit der aktuellen Suche überein oder die Datei ETS stellt noch keine verwendbare Hierarchie bereit.","No detailed entries stored for this report yet.":"Für diesen Bericht sind noch keine detaillierten Einträge hinterlegt.","No feedback":"Keine Rückmeldung","No GA selected for this area yet.":"Für diesen Bereich wurde noch kein GA ausgewählt.","No KNX AI nodes found.":"Keine KNX AI Knoten gefunden.","No saved plans yet.":"Noch keine gespeicherten Pläne.","No saved test results yet.":"Noch keine gespeicherten Testergebnisse.","No test result selected to export":"Kein Testergebnis zum Exportieren ausgewählt","No test result selected.":"Kein Testergebnis ausgewählt.","No top group address data available yet.":"Es sind noch keine Daten zur Top-Gruppenadresse verfügbar.","Nodes {{nodes}} | Links {{links}}":"Knoten {{nodes}} |Links {{links}}",Now:"Jetzt","Open and close shading":"Beschattung öffnen und schließen","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Öffnen und schließen Sie die Beschattungsaktoren im Bereich und überprüfen Sie dann, ob der Status mit den gesendeten Befehlen übereinstimmt.","Open Source Test":"Open-Source-Test","Optional note for diagnostics and reports":"Optionaler Hinweis für Diagnosen und Berichte","Original ETS path:":"Ursprünglicher ETS Pfad:",Overview:"Übersicht",Pass:"Pass",Payload:"Nutzlast","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Wählen Sie aus dem Katalog ETS.Bereits ausgewählte GA werden aus dieser Liste ausgeblendet.","Plan changes discarded":"Planänderungen verworfen","Plan duplicated":"Plan dupliziert","Plan name":"Planname",Plans:"Pläne","Profile deleted":"Profil gelöscht","Profile report ready":"Profilbericht bereit","Profile saved":"Profil gespeichert","Provider: {{provider}} | Model: {{model}}":"Anbieter: {{provider}} |Modell: {{model}}",Rate:"Bewerten","Read response timeout ms":"Leseantwort-Timeout ms",Ready:"Bereit",Reason:"Grund",Refresh:"Aktualisieren","Regenerating AI areas...":"KI-Bereiche werden regeneriert...",Remove:"Entfernen",Repeat:"Wiederholen",Reset:"Zurücksetzen","Resetting area...":"Bereich wird zurückgesetzt...","Response timeout":"Antwortzeitüberschreitung","Returned to the Tests page for the source actuator test.":"Zurück zur Seite „Tests“ für den Quellaktuatortest.","Returned to the Tests page for the source read-only profile.":"Kehrt zur Seite „Tests“ für das schreibgeschützte Quellprofil zurück.","Returned to the Tests page.":"Zurück zur Seite „Tests“.","Reusable deterministic active tests saved by the installer.":"Wiederverwendbare deterministische aktive Tests, die vom Installationsprogramm gespeichert werden.",Role:"Rolle","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Führen Sie einen vollständigen Test der HVAC-Befehle im Bereich durch und stellen Sie sicher, dass Sollwerte und Status kohärent sind.",Running:"Laufen","Running actuator test...":"Aktuatortest wird ausgeführt...","Running profile...":"Laufprofil...","Running...":"Running...","Saving actuator preset...":"Aktorvoreinstellung speichern...","Saving profile...":"Profil wird gespeichert...","Saving test plan...":"Testplan wird gespeichert...","Search GA, label or ETS path":"Suchen Sie nach GA, Label oder ETS Pfad","Select an Area":"Wählen Sie einen Bereich aus","Select area":"Bereich auswählen","Select command GA":"Wählen Sie den Befehl GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Wählen Sie eine der Standardvorlagen aus.Der Plan wird nur mit dem Befehl GA erstellt, der im ausgewählten Bereich verfügbar ist.","Select test plan":"Testplan auswählen","Select Test Result":"Wählen Sie Testergebnis","Selected template":"Ausgewählte Vorlage","Send a":"Senden Sie eine",Settings:"Einstellungen","Short operator-facing description":"Kurze Beschreibung für den Bediener","Show AI Area Builder":"AI Area Builder anzeigen","Show Template Builder":"Template Builder anzeigen","Spontaneous Write From Status GA":"Spontanes Schreiben aus Status GA",Status:"Status","Status DPT":"Status DPT","Status GA":"Status GA","Status write timeout ms":"Statusschreib-Timeout ms","Step title":"Schritttitel","Stopping repeat mode after the current cycle...":"Stoppen des Wiederholungsmodus nach dem aktuellen Zyklus...",Subscribe:"Abonnieren",Suggestions:"Vorschläge","Summarize the current KNX traffic and highlight the busiest group addresses.":"Fassen Sie den aktuellen KNX-Verkehr zusammen und markieren Sie die am stärksten ausgelasteten Gruppenadressen.",Summary:"Zusammenfassung","Targets supported HVAC command GA in the selected area.":"Unterstützte Ziele: HVAC Befehl GA im ausgewählten Bereich.","Targets supported shading command GA in the selected area.":"Zielt auf den unterstützten Schattierungsbefehl GA im ausgewählten Bereich.","telegram from the status GA.":"Telegramm vom Status GA.","telegram to the status GA and wait for a":"Telegramm auf den Status GA und warten Sie auf a",Telegrams:"Telegramme","Template Builder":"Vorlagenersteller","Test editor closed":"Testeditor geschlossen","Test plan deleted":"Testplan gelöscht","Test plan ready":"Testplan fertig","Test plan saved":"Testplan gespeichert","Test completed":"Test abgeschlossen","Repeat mode stopped":"Wiederholungsmodus gestoppt","Test result deleted":"Testergebnis gelöscht","Test Results":"Testergebnisse","Test Running":"Testlauf",Tests:"Tests","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"Der Installateur kann den Bereich umbenennen und genau entscheiden, welche Gruppenadressen dazu gehören.Alles wird pro KNX AI-Knoten beibehalten.",Timeout:"Auszeit",Title:"Titel","Toggle menu":"Menü umschalten","Toggle sidebar":"Seitenleiste umschalten","Top Group Addresses":"Top-Gruppenadressen","true, false, 50":"wahr, falsch, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Schalten Sie die Lichter ein und wieder aus und überprüfen Sie, ob die zugehörigen Statuswerte kohärent sind.","Unknown DPT":"Unbekannt DPT","Unsaved changes":"Nicht gespeicherte Änderungen",Voice:"Stimme",Wait:"Warte","Wait for a spontaneous":"Warten Sie auf eine spontane","Wait ms":"Warten Sie, Frau",Warn:"Warnen","What this step checks":"Was dieser Schritt prüft","Why this step exists":"Warum es diesen Schritt gibt","Window {{value}}s.":"Fenster {{value}}s.","Write timeout":"Timeout schreiben"},fr:{"{{count}} areas":"Zones {{count}}","{{count}} available":"{{count}} disponible","{{count}} event types":"{{count}} types d'événements","{{count}} recent":"{{count}} récent","{{count}} saved plans":"{{count}} plans enregistrés","{{count}} visible":"{{count}} visible","Activate main actuators":"Activer les actionneurs principaux","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Activez les principaux actionneurs de la zone et vérifiez le retour d'état pour confirmer qu'il suit les commandes.","Active Read Request To Status GA":"Demande de lecture active vers l'état GA","Actuator preset deleted":"Préréglage de l'actionneur supprimé","Actuator preset saved":"Préréglage de l'actionneur enregistré","Actuator test complete":"Test de l'actionneur terminé","Add group addresses to this area":"Ajouter des adresses de groupe à cette zone","Add Step":"Ajouter une étape","Add Wait":"Ajouter une attente","AI Area Builder":"Générateur de zones IA","AI is selecting area GA...":"L'IA sélectionne la zone GA...","anomaly x{{value}}":"anomalie x{{value}}","Applies to all matching lighting command GA in the selected area.":"S'applique à toutes les commandes d'éclairage correspondantes GA dans la zone sélectionnée.",Area:"Zone","Area {{value}}":"Zone {{value}}","Area deleted":"Zone supprimée","Area editor closed":"Éditeur de zone fermé","Area GA membership":"Adhésion à la zone GA","Area name":"Nom de la zone","Area reset":"Réinitialisation de la zone","Area to test":"Zone à tester",Areas:"Domaines","Ask failed":"La demande a échoué","Asking...":"Asking...",Assistant:"Assistante","Assistant prompt":"Invite de l'assistant","Available GA":"Disponible GA","Building test plan...":"Plan de test de construction...","Builds a deterministic active test using the supported command GA in the selected area.":"Construit un test actif déterministe à l'aide de la commande prise en charge GA dans la zone sélectionnée.","Bus Connection Persistence":"Persistance de la connexion de bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Choisissez un rapport pour inspecter les métriques, les contrôles détaillés et les suggestions.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Choisissez un modèle de test standard pour la zone sélectionnée, puis construisez le plan de manière déterministe à partir du catalogue ETS.",Close:"Fermer","Close menu":"Fermer le menu",Command:"Commande","Command DPT":"Commande DPT","Command GA":"Commande GA","Command payload":"Charge utile de commande",Completed:"Terminé","Config exported":"Configuration exportée","Config imported":"Configuration importée","Connected {{value}}":"Connecté {{value}}","Coverage {{value}}%":"Couverture {{value}}%","Define at least one area before creating a test plan":"Définir au moins un domaine avant de créer un plan de test","Define at least one area before using Tests":"Définir au moins une zone avant d'utiliser les tests","Delete Area":"Supprimer la zone","Deleting actuator preset...":"Suppression du préréglage de l'actionneur...","Deleting area...":"Suppression de la zone...","Deleting profile...":"Suppression du profil...","Deleting test plan...":"Suppression du plan de test...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Décrivez la pièce, la zone ou la fonction souhaitée.L'IA proposera les adresses de groupes les plus pertinentes pour ce projet.",Description:"Descriptif","Disconnected {{value}}":"Déconnecté {{value}}","Documentation: KNX AI Vue":"Documentation : KNX AI Vue","Donate via PayPal":"Faites un don via PayPal","Drag step":"Glisser l'étape",Duplicate:"Dupliquer","Duplicate Plan":"Dupliquer le plan","Edit Area":"Modifier la zone","Edit Plan":"Modifier le forfait","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Activez l'IA dans le nœud KNX AI pour régénérer les zones ou suggérez GA pour un nouveau brouillon.","Event distribution will appear after the first samples.":"La distribution des événements apparaîtra après les premiers échantillons.","Event Mix":"Mélange d'événements","Example: Add all technical room lighting command and status GA.":"Exemple : Ajouter toutes les commandes et statuts d'éclairage du local technique GA.",Expected:"Attendu","Expected feedback value":"Valeur attendue des commentaires","Expected payload":"Charge utile attendue","Explain any anomalies you see and suggest what to check first.":"Expliquez toutes les anomalies que vous voyez et suggérez quoi vérifier en premier.","Export PDF":"Exporter un PDF","Exporting config...":"Exportation de la configuration...",Fail:"Échec","Failed to build the test plan":"Échec de la création du plan de test","Failed to delete actuator preset":"Échec de la suppression du préréglage de l'actionneur","Failed to delete area":"Échec de la suppression de la zone","Failed to delete profile":"Échec de la suppression du profil","Failed to delete test plan":"Échec de la suppression du plan de test","Failed to delete test result":"Échec de la suppression du résultat du test","Failed to export config":"Échec de l'exportation de la configuration","Failed to import config":"Échec de l'importation de la configuration","Failed to load area command/status catalog":"Échec du chargement du catalogue de commandes/statuts de zone","Failed to load GA catalog":"Échec du chargement du catalogue GA","Failed to load nodes":"Échec du chargement des nœuds","Failed to load state":"Échec du chargement de l'état","Failed to regenerate AI areas":"Échec de la régénération des zones IA","Failed to reset area":"Échec de la réinitialisation de la zone","Failed to run actuator test":"Échec de l'exécution du test de l'actionneur","Failed to run profile":"Échec de l'exécution du profil","Failed to run test plan":"Échec de l'exécution du plan de test","Failed to save actuator preset":"Échec de l'enregistrement du préréglage de l'actionneur","Failed to save area":"Échec de l'enregistrement de la zone","Failed to save GA role":"Échec de l'enregistrement du rôle GA","Failed to save profile":"Échec de l'enregistrement du profil","Failed to save test plan":"Échec de l'enregistrement du plan de test","Failed to save test result":"Échec de l'enregistrement du résultat du test","Failed to suggest area GA":"Échec de la suggestion de la zone GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Générez un graphique à barres SVG des principales adresses des groupes avec le nombre et le titre.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Le vert indique l'heure connectée au bus KNX.Le rouge affiche les temps d'arrêt dans la fenêtre d'historique sélectionnée.",GroupValue_Response:"Response",GroupValue_Write:"Write","HVAC active check":"HVAC chèque actif","Importing config...":"Importation de la configuration...","in progress":"en cours","Installer alias":"Alias de l'installateur","KNX active test name":"KNX nom du test actif","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Les lumières s'allument, puis s'éteignent","Live and saved reports generated by KNX active and read-only tests.":"Rapports en direct et enregistrés générés par KNX tests actifs et en lecture seule.","Loading nodes...":"Chargement des nœuds...","Loading...":"Loading...","n/a":"n/a","New Area":"Nouvelle zone","New Plan":"Nouveau forfait","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Aucune zone ne correspond à la recherche actuelle ou le fichier ETS n'expose pas encore de hiérarchie utilisable.","No detailed entries stored for this report yet.":"Aucune entrée détaillée n'est encore stockée pour ce rapport.","No feedback":"Aucun retour","No GA selected for this area yet.":"Aucun GA n'est encore sélectionné pour cette zone.","No KNX AI nodes found.":"Aucun nœud KNX AI trouvé.","No saved plans yet.":"Aucun plan enregistré pour l'instant.","No saved test results yet.":"Aucun résultat de test enregistré pour l'instant.","No test result selected to export":"Aucun résultat de test sélectionné pour exporter","No test result selected.":"Aucun résultat de test sélectionné.","No top group address data available yet.":"Aucune donnée d'adresse du groupe principal n'est encore disponible.","Nodes {{nodes}} | Links {{links}}":"Nœuds {{nodes}} |Liens {{links}}",Now:"Maintenant","Open and close shading":"Ombrage ouvert et fermé","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Ouvrez et fermez les actionneurs d'ombrage de la zone, puis vérifiez que l'état correspond aux commandes envoyées.","Open Source Test":"Test Open Source","Optional note for diagnostics and reports":"Remarque facultative pour les diagnostics et les rapports","Original ETS path:":"Chemin ETS d'origine :",Overview:"Aperçu",Pass:"Passer",Payload:"Charge utile","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Choisissez dans le catalogue ETS.Les GA déjà sélectionnés sont masqués de cette liste.","Plan changes discarded":"Modifications du plan rejetées","Plan duplicated":"Plan dupliqué","Plan name":"Nom du forfait",Plans:"Forfaits","Profile deleted":"Profil supprimé","Profile report ready":"Rapport de profil prêt","Profile saved":"Profil enregistré","Provider: {{provider}} | Model: {{model}}":"Fournisseur : {{provider}} |Modèle : {{model}}",Rate:"Tarif","Read response timeout ms":"Lire le délai de réponse ms",Ready:"Prêt",Reason:"Raison",Refresh:"Actualiser","Regenerating AI areas...":"Régénérer les zones d'IA...",Remove:"Supprimer",Repeat:"Répéter",Reset:"Réinitialiser","Resetting area...":"Zone de réinitialisation...","Response timeout":"Délai de réponse","Returned to the Tests page for the source actuator test.":"Retour à la page Tests pour le test de l'actionneur source.","Returned to the Tests page for the source read-only profile.":"Renvoyé à la page Tests pour le profil source en lecture seule.","Returned to the Tests page.":"Retour à la page Tests.","Reusable deterministic active tests saved by the installer.":"Tests actifs déterministes réutilisables enregistrés par l'installateur.",Role:"Rôle","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Exécutez un test complet des commandes HVAC dans la zone et vérifiez que les consignes et les états sont cohérents.",Running:"Courir","Running actuator test...":"Test de l'actionneur en cours...","Running profile...":"Profil de course...","Running...":"Running...","Saving actuator preset...":"Enregistrement du préréglage de l'actionneur...","Saving profile...":"Enregistrement du profil...","Saving test plan...":"Sauvegarde du plan de test...","Search GA, label or ETS path":"Recherchez GA, l'étiquette ou le chemin ETS","Select an Area":"Sélectionnez une zone","Select area":"Sélectionnez une zone","Select command GA":"Sélectionnez la commande GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Sélectionnez l'un des modèles standard.Le plan est construit uniquement à partir de la commande GA disponible dans la zone sélectionnée.","Select test plan":"Sélectionnez le plan de test","Select Test Result":"Sélectionnez le résultat du test","Selected template":"Modèle sélectionné","Send a":"Envoyez un",Settings:"Paramètres","Short operator-facing description":"Brève description destinée à l'opérateur","Show AI Area Builder":"Afficher le générateur de zone AI","Show Template Builder":"Afficher le générateur de modèles","Spontaneous Write From Status GA":"Écriture spontanée à partir du statut GA",Status:"Statut","Status DPT":"Statut DPT","Status GA":"Statut GA","Status write timeout ms":"Délai d'expiration de l'état en ms","Step title":"Titre de l'étape","Stopping repeat mode after the current cycle...":"Arrêt du mode répétition après le cycle en cours...",Subscribe:"Abonnez-vous",Suggestions:"Suggestions","Summarize the current KNX traffic and highlight the busiest group addresses.":"Résumez le trafic KNX actuel et mettez en surbrillance les adresses de groupe les plus fréquentées.",Summary:"Résumé","Targets supported HVAC command GA in the selected area.":"Cibles prises en charge par la commande HVAC GA dans la zone sélectionnée.","Targets supported shading command GA in the selected area.":"Cibles prenant en charge la commande d'ombrage GA dans la zone sélectionnée.","telegram from the status GA.":"télégramme du statut GA.","telegram to the status GA and wait for a":"télégramme au statut GA et attendez un",Telegrams:"Télégrammes","Template Builder":"Générateur de modèles","Test editor closed":"Éditeur de tests fermé","Test plan deleted":"Plan de test supprimé","Test plan ready":"Plan de test prêt","Test plan saved":"Plan de test enregistré","Test completed":"Test terminé","Repeat mode stopped":"Mode répétition arrêté","Test result deleted":"Résultat du test supprimé","Test Results":"Résultats des tests","Test Running":"Test en cours",Tests:"Essais","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"L'installateur peut renommer la zone et décider exactement quelles adresses de groupe lui appartiennent.Tout est conservé par nœud KNX AI.",Timeout:"Délai d'attente",Title:"Titre","Toggle menu":"Changer de menu","Toggle sidebar":"Basculer la barre latérale","Top Group Addresses":"Principales adresses des groupes","true, false, 50":"vrai, faux, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Allumez puis éteignez les lumières et vérifiez que les valeurs d'état associées sont cohérentes.","Unknown DPT":"Inconnu DPT","Unsaved changes":"Modifications non enregistrées",Voice:"Voix",Wait:"Attends","Wait for a spontaneous":"Attendez un spontané","Wait ms":"Attends madame",Warn:"Avertir","What this step checks":"Ce que cette étape vérifie","Why this step exists":"Pourquoi cette étape existe","Window {{value}}s.":"Fenêtre {{value}}s.","Write timeout":"Délai d'écriture"},es:{"{{count}} areas":"{{count}} áreas","{{count}} available":"{{count}} disponible","{{count}} event types":"{{count}} tipos de eventos","{{count}} recent":"{{count}} reciente","{{count}} saved plans":"{{count}} planes guardados","{{count}} visible":"{{count}} visible","Activate main actuators":"Activar actuadores principales","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Active los principales actuadores del área y verifique la retroalimentación de estado para confirmar que sigue los comandos.","Active Read Request To Status GA":"Solicitud de lectura activa al estado GA","Actuator preset deleted":"Preajuste del actuador eliminado","Actuator preset saved":"Preajuste del actuador guardado","Actuator test complete":"Prueba del actuador completa","Add group addresses to this area":"Agregar direcciones de grupo a esta área","Add Step":"Agregar paso","Add Wait":"Agregar esperar","AI Area Builder":"Generador de áreas de IA","AI is selecting area GA...":"La IA está seleccionando el área GA...","anomaly x{{value}}":"anomalía x{{value}}","Applies to all matching lighting command GA in the selected area.":"Se aplica a todos los comandos de iluminación coincidentes GA en el área seleccionada.",Area:"Área","Area {{value}}":"Área {{value}}","Area deleted":"Área eliminada","Area editor closed":"Editor de área cerrado","Area GA membership":"Membresía del área GA","Area name":"Nombre del área","Area reset":"Restablecer área","Area to test":"Área para probar",Areas:"Áreas","Ask failed":"Pregunta fallida","Asking...":"Asking...",Assistant:"Asistente","Assistant prompt":"Aviso del asistente","Available GA":"Disponible GA","Building test plan...":"Plano de pruebas del edificio...","Builds a deterministic active test using the supported command GA in the selected area.":"Crea una prueba activa determinista utilizando el comando admitido GA en el área seleccionada.","Bus Connection Persistence":"Persistencia de la conexión de bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Elija un informe para inspeccionar métricas, comprobaciones detalladas y sugerencias.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Elija una plantilla de prueba estándar para el área seleccionada y luego cree el plan de manera determinista a partir del catálogo ETS.",Close:"Cerrar","Close menu":"Cerrar menú",Command:"Comando","Command DPT":"Comando DPT","Command GA":"Comando GA","Command payload":"Carga útil de comando",Completed:"Completado","Config exported":"Configuración exportada","Config imported":"Configuración importada","Connected {{value}}":"Conectado {{value}}","Coverage {{value}}%":"Cobertura {{value}}%","Define at least one area before creating a test plan":"Defina al menos un área antes de crear un plan de prueba","Define at least one area before using Tests":"Defina al menos un área antes de usar Pruebas","Delete Area":"Eliminar área","Deleting actuator preset...":"Eliminando preajuste del actuador...","Deleting area...":"Eliminando área...","Deleting profile...":"Eliminando perfil...","Deleting test plan...":"Eliminando plan de prueba...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Describe la habitación, zona o función que deseas.La AI sugerirá las direcciones de grupo más relevantes para este borrador.",Description:"Descripción","Disconnected {{value}}":"Desconectado {{value}}","Documentation: KNX AI Vue":"Documentación: KNX AI Vue","Donate via PayPal":"Donar a través de PayPal","Drag step":"Paso de arrastre",Duplicate:"Duplicar","Duplicate Plan":"Duplicar plan","Edit Area":"Editar área","Edit Plan":"Editar plano","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Habilite la IA en el nodo KNX AI para regenerar áreas o sugiera GA para un nuevo borrador.","Event distribution will appear after the first samples.":"La distribución de eventos aparecerá después de las primeras muestras.","Event Mix":"Mezcla de eventos","Example: Add all technical room lighting command and status GA.":"Ejemplo: agregue todos los comandos y estados de iluminación de la sala técnica GA.",Expected:"esperado","Expected feedback value":"Valor de retroalimentación esperado","Expected payload":"Carga útil esperada","Explain any anomalies you see and suggest what to check first.":"Explique cualquier anomalía que observe y sugiera qué comprobar primero.","Export PDF":"Exportar PDF","Exporting config...":"Exportando configuración...",Fail:"fallar","Failed to build the test plan":"No se pudo construir el plan de prueba","Failed to delete actuator preset":"No se pudo eliminar el ajuste preestablecido del actuador","Failed to delete area":"No se pudo eliminar el área","Failed to delete profile":"No se pudo eliminar el perfil","Failed to delete test plan":"No se pudo eliminar el plan de prueba","Failed to delete test result":"No se pudo eliminar el resultado de la prueba","Failed to export config":"No se pudo exportar la configuración","Failed to import config":"No se pudo importar la configuración","Failed to load area command/status catalog":"No se pudo cargar el catálogo de comando/estado del área","Failed to load GA catalog":"No se pudo cargar el catálogo GA","Failed to load nodes":"No se pudieron cargar los nodos","Failed to load state":"No se pudo cargar el estado","Failed to regenerate AI areas":"No se pudieron regenerar las áreas de IA","Failed to reset area":"No se pudo restablecer el área","Failed to run actuator test":"No se pudo ejecutar la prueba del actuador","Failed to run profile":"No se pudo ejecutar el perfil","Failed to run test plan":"No se pudo ejecutar el plan de prueba","Failed to save actuator preset":"No se pudo guardar el ajuste preestablecido del actuador","Failed to save area":"No se pudo guardar el área","Failed to save GA role":"No se pudo guardar el rol GA","Failed to save profile":"No se pudo guardar el perfil","Failed to save test plan":"No se pudo guardar el plan de prueba","Failed to save test result":"No se pudo guardar el resultado de la prueba","Failed to suggest area GA":"No se pudo sugerir el área GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Genere un gráfico de barras SVG de direcciones de grupos principales con recuentos y título.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"El verde muestra el tiempo conectado al bus KNX.El rojo muestra el tiempo de inactividad dentro de la ventana del historial seleccionado.",GroupValue_Response:"Response",GroupValue_Write:"Write","HVAC active check":"HVAC verificación activa","Importing config...":"Importando configuración...","in progress":"en progreso","Installer alias":"Alias del instalador","KNX active test name":"KNX nombre de prueba activo","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Luces encendidas y luego apagadas","Live and saved reports generated by KNX active and read-only tests.":"Informes en vivo y guardados generados por KNX pruebas activas y de solo lectura.","Loading nodes...":"Cargando nodos...","Loading...":"Loading...","n/a":"n/a","New Area":"Nueva Área","New Plan":"Nuevo Plan","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Ninguna área coincidió con la búsqueda actual o el archivo ETS aún no expone una jerarquía utilizable.","No detailed entries stored for this report yet.":"Aún no se han almacenado entradas detalladas para este informe.","No feedback":"Sin comentarios","No GA selected for this area yet.":"Aún no se ha seleccionado ningún GA para esta área.","No KNX AI nodes found.":"No se encontraron nodos KNX AI.","No saved plans yet.":"Aún no hay planes guardados.","No saved test results yet.":"Aún no hay resultados de pruebas guardados.","No test result selected to export":"No se seleccionó ningún resultado de prueba para exportar","No test result selected.":"No se seleccionó ningún resultado de prueba.","No top group address data available yet.":"Aún no hay datos de direcciones de grupos principales disponibles.","Nodes {{nodes}} | Links {{links}}":"Nodos {{nodes}} |Enlaces {{links}}",Now:"Ahora","Open and close shading":"Abrir y cerrar sombreado","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Abra y cierre los actuadores de sombreado del área, luego verifique que el estado coincida con los comandos enviados.","Open Source Test":"Prueba de código abierto","Optional note for diagnostics and reports":"Nota opcional para diagnósticos e informes.","Original ETS path:":"Ruta original ETS:",Overview:"Descripción general",Pass:"Pase",Payload:"Carga útil","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Elija del catálogo ETS.Los GA ya seleccionados están ocultos de esta lista.","Plan changes discarded":"Cambios de plan descartados","Plan duplicated":"Plano duplicado","Plan name":"Nombre del plan",Plans:"Planes","Profile deleted":"Perfil eliminado","Profile report ready":"Informe de perfil listo","Profile saved":"Perfil guardado","Provider: {{provider}} | Model: {{model}}":"Proveedor: {{provider}} |Modelo: {{model}}",Rate:"Tarifa","Read response timeout ms":"Tiempo de espera de respuesta de lectura ms",Ready:"Listo",Reason:"Razón",Refresh:"Actualizar","Regenerating AI areas...":"Regenerando áreas de IA...",Remove:"Quitar",Repeat:"repetir",Reset:"Reiniciar","Resetting area...":"Restableciendo área...","Response timeout":"Tiempo de espera de respuesta","Returned to the Tests page for the source actuator test.":"Regresó a la página Pruebas para la prueba del actuador fuente.","Returned to the Tests page for the source read-only profile.":"Regresó a la página Pruebas para el perfil de solo lectura de origen.","Returned to the Tests page.":"Regresó a la página de Pruebas.","Reusable deterministic active tests saved by the installer.":"Pruebas activas deterministas reutilizables guardadas por el instalador.",Role:"Rol","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Ejecute una prueba completa de los comandos HVAC en el área y verifique que los puntos de ajuste y los estados sean coherentes.",Running:"corriendo","Running actuator test...":"Ejecutando la prueba del actuador...","Running profile...":"Perfil de carrera...","Running...":"Running...","Saving actuator preset...":"Guardando preajuste del actuador...","Saving profile...":"Guardando perfil...","Saving test plan...":"Guardando plan de prueba...","Search GA, label or ETS path":"Buscar GA, etiqueta o ruta ETS","Select an Area":"Seleccione un área","Select area":"Seleccionar área","Select command GA":"Seleccione el comando GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Seleccione una de las plantillas estándar.El plan se construye únicamente a partir del comando GA disponible en el área seleccionada.","Select test plan":"Seleccionar plan de prueba","Select Test Result":"Seleccionar resultado de la prueba","Selected template":"Plantilla seleccionada","Send a":"Enviar un",Settings:"Configuración","Short operator-facing description":"Breve descripción orientada al operador","Show AI Area Builder":"Mostrar generador de áreas de IA","Show Template Builder":"Mostrar generador de plantillas","Spontaneous Write From Status GA":"Escritura espontánea desde el estado GA",Status:"Estado","Status DPT":"Estado DPT","Status GA":"Estado GA","Status write timeout ms":"Tiempo de espera de escritura de estado ms","Step title":"Título del paso","Stopping repeat mode after the current cycle...":"Deteniendo el modo de repetición después del ciclo actual...",Subscribe:"Suscríbete",Suggestions:"Sugerencias","Summarize the current KNX traffic and highlight the busiest group addresses.":"Resuma el tráfico KNX actual y resalte las direcciones de grupo más ocupadas.",Summary:"Resumen","Targets supported HVAC command GA in the selected area.":"Los objetivos admitieron el comando HVAC GA en el área seleccionada.","Targets supported shading command GA in the selected area.":"Los objetivos admiten el comando de sombreado GA en el área seleccionada.","telegram from the status GA.":"telegrama del estado GA.","telegram to the status GA and wait for a":"telegrama al estado GA y espere un",Telegrams:"telegramas","Template Builder":"Generador de plantillas","Test editor closed":"Editor de pruebas cerrado","Test plan deleted":"Plan de prueba eliminado","Test plan ready":"Plan de prueba listo","Test plan saved":"Plan de prueba guardado","Test completed":"Prueba completada","Repeat mode stopped":"Modo repetición detenido","Test result deleted":"Resultado de la prueba eliminado","Test Results":"Resultados de la prueba","Test Running":"Ejecución de prueba",Tests:"Pruebas","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"El instalador puede cambiar el nombre del área y decidir exactamente qué direcciones de grupo pertenecen a ella.Todo persiste por nodo KNX AI.",Timeout:"Tiempo de espera",Title:"Título","Toggle menu":"Alternar menú","Toggle sidebar":"Alternar barra lateral","Top Group Addresses":"Direcciones de grupos principales","true, false, 50":"verdadero, falso, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Encienda las luces, luego apáguelas y verifique que los valores de estado relacionados sean coherentes.","Unknown DPT":"Desconocido DPT","Unsaved changes":"Cambios no guardados",Voice:"Voz",Wait:"espera","Wait for a spontaneous":"Espere un espontaneo","Wait ms":"Espere señora",Warn:"Advertir","What this step checks":"Lo que verifica este paso","Why this step exists":"Por qué existe este paso","Window {{value}}s.":"Ventana {{value}}s.","Write timeout":"Escribir tiempo de espera"},"zh-CN":{"{{count}} areas":"{{count}} 区域","{{count}} available":"{{count}} 可用","{{count}} event types":"{{count}} 事件类型","{{count}} recent":"{{count}} 最近","{{count}} saved plans":"{{count}} 已保存计划","{{count}} visible":"{{count}} 可见","Activate main actuators":"激活主执行器","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"激活该区域的主执行器并验证状态反馈以确认其遵循命令。","Active Read Request To Status GA":"对状态 GA 的主动读取请求","Actuator preset deleted":"执行器预设已删除","Actuator preset saved":"执行器预设已保存","Actuator test complete":"执行器测试完成","Add group addresses to this area":"将组地址添加到该区域","Add Step":"添加步骤","Add Wait":"添加等待","AI Area Builder":"人工智能区域生成器","AI is selecting area GA...":"AI 正在选择区域 GA...","anomaly x{{value}}":"异常 x{{value}}","Applies to all matching lighting command GA in the selected area.":"适用于所选区域中所有匹配的照明命令 GA。",Area:"面积","Area {{value}}":"区域 {{value}}","Area deleted":"区域已删除","Area editor closed":"区域编辑器已关闭","Area GA membership":"区域 GA 会员资格","Area name":"地区名称","Area reset":"区域重置","Area to test":"测试区域",Areas:"领域","Ask failed":"询问失败","Asking...":"Asking...",Assistant:"助理","Assistant prompt":"助手提示","Available GA":"可用 GA","Building test plan...":"构建测试计划...","Builds a deterministic active test using the supported command GA in the selected area.":"在选定区域中使用支持的命令 GA 构建确定性主动测试。","Bus Connection Persistence":"总线连接持久性","Choose a report to inspect metrics, detailed checks, and suggestions.":"选择报告来检查指标、详细检查和建议。","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"为所选区域选择一个标准测试模板,然后从 ETS 目录中确定性地构建计划。",Close:"关闭","Close menu":"关闭菜单",Command:"命令","Command DPT":"命令 DPT","Command GA":"命令 GA","Command payload":"命令负载",Completed:"已完成","Config exported":"配置导出","Config imported":"配置已导入","Connected {{value}}":"已连接 {{value}}","Coverage {{value}}%":"覆盖率 {{value}}%","Define at least one area before creating a test plan":"在创建测试计划之前至少定义一个区域","Define at least one area before using Tests":"使用测试之前至少定义一个区域","Delete Area":"删除区域","Deleting actuator preset...":"正在删除执行器预设...","Deleting area...":"正在删除区域...","Deleting profile...":"正在删除个人资料...","Deleting test plan...":"正在删除测试计划...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"描述您想要的房间、区域或功能。AI 将为该草案建议最相关的群组地址。",Description:"描述","Disconnected {{value}}":"已断开连接 {{value}}","Documentation: KNX AI Vue":"文档:KNX AI Vue","Donate via PayPal":"通过 PayPal 捐赠","Drag step":"拖步",Duplicate:"复制","Duplicate Plan":"复制计划","Edit Area":"编辑区","Edit Plan":"编辑计划","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"启用 KNX AI 节点中的 AI 来重新生成区域或建议 GA 进行新草稿。","Event distribution will appear after the first samples.":"事件分布将出现在第一个样本之后。","Event Mix":"活动组合","Example: Add all technical room lighting command and status GA.":"示例:添加所有技术室照明命令和状态 GA。",Expected:"预计","Expected feedback value":"期望反馈值","Expected payload":"预期有效负载","Explain any anomalies you see and suggest what to check first.":"解释您看到的任何异常情况并建议首先检查哪些内容。","Export PDF":"导出PDF","Exporting config...":"正在导出配置...",Fail:"失败","Failed to build the test plan":"无法构建测试计划","Failed to delete actuator preset":"删除执行器预设失败","Failed to delete area":"删除区域失败","Failed to delete profile":"删除个人资料失败","Failed to delete test plan":"删除测试计划失败","Failed to delete test result":"删除测试结果失败","Failed to export config":"导出配置失败","Failed to import config":"导入配置失败","Failed to load area command/status catalog":"无法加载区域命令/状态目录","Failed to load GA catalog":"无法加载 GA 目录","Failed to load nodes":"加载节点失败","Failed to load state":"加载状态失败","Failed to regenerate AI areas":"无法重新生成AI区域","Failed to reset area":"重置区域失败","Failed to run actuator test":"无法运行执行器测试","Failed to run profile":"运行配置文件失败","Failed to run test plan":"无法运行测试计划","Failed to save actuator preset":"无法保存执行器预设","Failed to save area":"保存区域失败","Failed to save GA role":"无法保存 GA 角色","Failed to save profile":"保存个人资料失败","Failed to save test plan":"保存测试计划失败","Failed to save test result":"无法保存测试结果","Failed to suggest area GA":"无法建议区域 GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"生成包含计数和标题的顶级组地址的 SVG 条形图。","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"绿色显示连接到 KNX 总线的时间。红色显示所选历史窗口内的停机时间。",GroupValue_Response:"Response",GroupValue_Write:"Write","HVAC active check":"HVAC 主动检查","Importing config...":"正在导入配置...","in progress":"进行中","Installer alias":"安装人员别名","KNX active test name":"KNX 活动测试名称","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"灯亮,然后灭","Live and saved reports generated by KNX active and read-only tests.":"由 KNX 活动和只读测试生成的实时和保存的报告。","Loading nodes...":"正在加载节点...","Loading...":"Loading...","n/a":"n/a","New Area":"新区","New Plan":"新计划","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"没有区域与当前搜索匹配,或者 ETS 文件尚未公开可用的层次结构。","No detailed entries stored for this report yet.":"尚未存储此报告的详细条目。","No feedback":"无反馈","No GA selected for this area yet.":"尚未为此区域选择 GA。","No KNX AI nodes found.":"未找到 KNX AI 节点。","No saved plans yet.":"尚未保存计划。","No saved test results yet.":"尚未保存测试结果。","No test result selected to export":"未选择导出测试结果","No test result selected.":"未选择测试结果。","No top group address data available yet.":"尚无可用的顶级组地址数据。","Nodes {{nodes}} | Links {{links}}":"节点 {{nodes}} |链接 {{links}}",Now:"现在","Open and close shading":"打开和关闭阴影","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"打开和关闭该区域中的遮阳执行器,然后验证状态是否与发送的命令匹配。","Open Source Test":"开源测试","Optional note for diagnostics and reports":"诊断和报告的可选注释","Original ETS path:":"原始 ETS 路径:",Overview:"概述",Pass:"通行证",Payload:"有效载荷","Pick from the ETS catalog. Already selected GA are hidden from this list.":"从 ETS 目录中选择。已选择的 GA 从此列表中隐藏。","Plan changes discarded":"计划变更被放弃","Plan duplicated":"计划重复","Plan name":"计划名称",Plans:"计划","Profile deleted":"个人资料已删除","Profile report ready":"概况报告已准备就绪","Profile saved":"个人资料已保存","Provider: {{provider}} | Model: {{model}}":"提供商:{{provider}} |型号:{{model}}",Rate:"率","Read response timeout ms":"读取响应超时毫秒",Ready:"准备好",Reason:"原因",Refresh:"刷新","Regenerating AI areas...":"再生人工智能领域...",Remove:"删除",Repeat:"重复",Reset:"重置","Resetting area...":"重置区域...","Response timeout":"响应超时","Returned to the Tests page for the source actuator test.":"返回到源执行器测试的测试页面。","Returned to the Tests page for the source read-only profile.":"返回源只读配置文件的测试页面。","Returned to the Tests page.":"返回测试页面。","Reusable deterministic active tests saved by the installer.":"安装程序保存的可重复使用的确定性主动测试。",Role:"角色","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"在该区域中运行 HVAC 命令的完整测试,并验证设定点和状态是否一致。",Running:"跑步","Running actuator test...":"运行执行器测试...","Running profile...":"运行配置文件...","Running...":"Running...","Saving actuator preset...":"正在保存执行器预设...","Saving profile...":"正在保存个人资料...","Saving test plan...":"正在保存测试计划...","Search GA, label or ETS path":"搜索 GA、标签或 ETS 路径","Select an Area":"选择一个区域","Select area":"选择区域","Select command GA":"选择命令 GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"选择标准模板之一。该计划仅根据所选区域中可用的命令 GA 构建。","Select test plan":"选择测试计划","Select Test Result":"选择测试结果","Selected template":"选定的模板","Send a":"发送一个",Settings:"设置","Short operator-facing description":"面向操作员的简短描述","Show AI Area Builder":"显示 AI 区域生成器","Show Template Builder":"显示模板生成器","Spontaneous Write From Status GA":"从状态 GA 自发写入",Status:"状态","Status DPT":"状态 DPT","Status GA":"状态 GA","Status write timeout ms":"状态写入超时毫秒","Step title":"步骤标题","Stopping repeat mode after the current cycle...":"在当前周期后停止重复模式...",Subscribe:"订阅",Suggestions:"建议","Summarize the current KNX traffic and highlight the busiest group addresses.":"总结当前 KNX 流量并突出显示最繁忙的组地址。",Summary:"总结","Targets supported HVAC command GA in the selected area.":"所选区域中支持 HVAC 命令 GA 的目标。","Targets supported shading command GA in the selected area.":"目标在选定区域中支持着色命令 GA。","telegram from the status GA.":"来自状态 GA 的电报。","telegram to the status GA and wait for a":"电报到状态 GA 并等待",Telegrams:"电报","Template Builder":"模板生成器","Test editor closed":"测试编辑器已关闭","Test plan deleted":"测试计划已删除","Test plan ready":"测试计划准备就绪","Test plan saved":"测试计划已保存","Test completed":"测试完成","Repeat mode stopped":"重复模式已停止","Test result deleted":"测试结果已删除","Test Results":"测试结果","Test Running":"试运行",Tests:"测试","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"安装程序可以重命名该区域并准确决定哪些组地址属于该区域。一切都保存在每个 KNX AI 节点上。",Timeout:"超时",Title:"标题","Toggle menu":"切换菜单","Toggle sidebar":"切换侧边栏","Top Group Addresses":"顶级组地址","true, false, 50":"真、假、50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"打开灯,然后关闭它们,并验证相关状态值是否一致。","Unknown DPT":"未知 DPT","Unsaved changes":"未保存的更改",Voice:"语音",Wait:"等等","Wait for a spontaneous":"等待自发的","Wait ms":"等待毫秒",Warn:"警告","What this step checks":"此步骤检查什么","Why this step exists":"为什么存在这一步","Window {{value}}s.":"窗口 {{value}}s。","Write timeout":"写入超时"}},sf=(e,t)=>{const i=e.__vccOpts||e;for(const[o,d]of t)i[o]=d;return i},nf={class:"m-header"},rf=["aria-expanded"],of={class:"app-sidebar"},lf={id:"knx-ai-sidebar",class:"sidebar-brand-wrap"},df=["aria-expanded"],uf={class:"sidebar-collapse-icon"},cf={class:"sidebar-nav"},ff=["disabled"],pf={key:0,class:"sidebar-panel sidebar-actions"},gf=["disabled"],hf={key:1,class:"sidebar-footer"},mf={key:0,class:"running-spinner status-pill-spinner","aria-hidden":"true"},vf={key:0,class:"status-detail"},bf={class:"workspace-shell"},yf={class:"content-grid workspace-main"},Af={key:0,class:"card card-summary"},Sf={class:"card-head"},wf={key:0,class:"meta-chip"},Pf={class:"summary-pre"},Tf={class:"metric-grid"},_f={class:"metric"},Df={class:"metric"},If={class:"metric"},Rf={class:"metric"},Nf={key:1,class:"card card-areas"},kf={class:"card-head"},Cf={class:"card-head-actions"},xf={class:"meta-chip"},Ef=["disabled"],Gf={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},Ff=["disabled"],Lf={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},Mf={key:0,class:"planner-error-banner area-regenerate-error"},Of={class:"areas-toolbar"},zf={class:"pill-row"},$f={class:"pill neutral"},Bf={class:"pill neutral"},Kf={class:"pill neutral"},Vf={class:"pill neutral"},Wf={key:1,class:"areas-layout"},Uf={key:0,class:"area-listbox-shell"},jf={class:"flow-field"},Hf={class:"area-search-select"},Xf=["placeholder"],qf={key:0,class:"area-search-select-menu"},Jf=["onMousedown"],Zf={class:"area-editor"},Yf={key:0,class:"card-head"},Qf={class:"card-head-actions action-cluster"},ep=["disabled"],tp=["disabled"],ap=["disabled"],sp=["disabled"],np={key:1,class:"area-editor-grid"},rp={class:"flow-field"},ip={class:"flow-field area-editor-span"},op={class:"flow-field area-editor-span"},lp={key:2,class:"ai-planner-shell area-llm-shell"},dp={key:0,class:"card-head-actions action-cluster"},up={class:"area-editor-grid"},cp={class:"flow-field area-editor-span"},fp={class:"profile-runbar"},pp=["disabled"],gp={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},hp={key:0,class:"planner-error-banner"},mp={key:1,class:"area-detail-subhead"},vp={key:3,class:"area-ga-editor"},bp={key:0,class:"simple-list simple-list-mono area-ga-list"},yp={class:"area-ga-main"},Ap={key:0},Sp={key:0},wp={class:"area-ga-actions"},Pp={class:"flow-field area-ga-role-field"},Tp=["value","disabled","onChange"],_p=["value"],Dp=["onClick"],Ip={key:1,class:"empty-state"},Rp={class:"card-head"},Np={class:"meta-chip"},kp={class:"area-ga-catalog"},Cp=["onClick"],xp={class:"area-list-title"},Ep={class:"area-list-meta"},Gp={class:"area-list-tags"},Fp={key:0},Lp={key:4,class:"area-editor-note"},Mp={key:2,class:"empty-state"},Op={class:"card-head"},zp={class:"area-detail-subhead"},$p={key:0,class:"card-head-actions"},Bp={class:"meta-chip"},Kp={class:"meta-chip"},Vp=["disabled"],Wp={key:1,class:"card-head-actions"},Up={class:"meta-chip"},jp=["disabled"],Hp={class:"profile-editor-stack"},Xp={key:0,class:"area-detail planner-sidecard"},qp={class:"area-listbox-shell"},Jp={class:"flow-field"},Zp={class:"area-search-select"},Yp=["placeholder"],Qp={key:0,class:"area-search-select-menu"},eg=["onMousedown"],tg={key:0,class:"empty-state"},ag={key:1,class:"area-detail"},sg={key:0,class:"card-head"},ng={key:0,class:"area-detail-subhead"},rg={class:"card-head-actions action-cluster"},ig={key:0,class:"meta-chip"},og={class:"checkbox flow-toggle compact-toggle"},lg=["disabled"],dg=["disabled"],ug=["disabled"],cg={key:2,class:"plan-run-actions"},fg=["disabled"],pg=["disabled"],gg={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},hg={key:1,class:"ai-planner-shell"},mg={key:0,class:"card-head-actions action-cluster"},vg={class:"area-editor-grid"},bg={class:"flow-field"},yg=["value"],Ag={class:"flow-field area-editor-span"},Sg=["value"],wg={class:"preset-row compact-preset-row"},Pg=["onClick"],Tg={class:"area-detail-subhead"},_g={class:"profile-runbar"},Dg=["disabled"],Ig={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},Rg={key:0,class:"planner-error-banner"},Ng={key:1,class:"planner-generation"},kg={key:0,class:"area-detail-subhead"},Cg={key:1,class:"area-detail-subhead"},xg={key:2,class:"area-detail planner-run-focus"},Eg={class:"card-head"},Gg={class:"area-detail-subhead"},Fg={class:"meta-chip"},Lg={class:"metric-grid area-metrics"},Mg={class:"metric"},Og={class:"metric"},zg={class:"metric"},$g={class:"metric"},Bg={key:0,class:"report-check report-pass planner-step-card planner-step-running"},Kg={class:"anomaly-head"},Vg={class:"area-detail-subhead"},Wg={key:0,class:"planner-step-grid"},Ug={key:1,class:"planner-step-grid"},jg={key:2,class:"planner-check-sections"},Hg={class:"planner-check-section"},Xg={class:"planner-step-grid compact-grid"},qg={class:"planner-check-section"},Jg={class:"planner-step-grid compact-grid"},Zg={class:"card-head"},Yg={class:"area-detail-subhead"},Qg={class:"card-head-actions action-cluster"},eh={class:"meta-chip"},th={key:0,class:"meta-chip"},ah={class:"meta-chip"},sh={class:"metric-grid area-metrics"},nh={class:"report-checks"},rh={class:"anomaly-head"},ih={class:"area-detail-subhead"},oh={key:0,class:"planner-check-sections result-check-sections"},lh={class:"planner-step-grid compact-grid"},dh={key:1,class:"planner-step-grid"},uh={key:0,class:"empty-state"},ch={key:1},fh={class:"simple-list"},ph={key:4,class:"area-detail plan-draft-shell"},gh={class:"card-head"},hh={class:"running-headline"},mh={key:0,class:"running-spinner","aria-hidden":"true"},vh={class:"card-head-actions action-cluster"},bh={class:"meta-chip"},yh={class:"area-editor-grid"},Ah={class:"flow-field"},Sh=["value","disabled"],wh=["value"],Ph={class:"flow-field"},Th={class:"flow-field area-editor-span"},_h={class:"report-checks plan-steps-stack"},Dh=["onDragenter","onDrop"],Ih={class:"anomaly-head"},Rh={class:"planner-step-title"},Nh=["onDragstart"],kh=["aria-expanded","title","onClick"],Ch={class:"card-head-actions action-cluster compact-actions"},xh=["onClick"],Eh=["onClick"],Gh={key:0,class:"planner-step-summary"},Fh={key:0},Lh={key:1},Mh={key:2},Oh={key:3},zh={key:4},$h={key:5},Bh={key:1,class:"planner-step-editor"},Kh={class:"flow-field"},Vh=["onUpdate:modelValue"],Wh={class:"flow-field area-editor-span"},Uh=["onUpdate:modelValue"],jh={key:0,class:"flow-field"},Hh=["onUpdate:modelValue"],Xh={key:1,class:"planner-field-group area-editor-span"},qh={class:"planner-field-group-grid"},Jh={class:"flow-field"},Zh=["onUpdate:modelValue","onChange"],Yh=["value"],Qh={class:"flow-field"},em=["onUpdate:modelValue","onChange"],tm={class:"flow-field group-span"},am=["onUpdate:modelValue"],sm=["value"],nm=["onUpdate:modelValue"],rm={key:2,class:"planner-field-group area-editor-span"},im={class:"planner-field-group-grid"},om={class:"flow-field group-span"},lm=["onUpdate:modelValue","onChange"],dm=["value"],um={class:"flow-field"},cm=["onUpdate:modelValue","onChange"],fm={class:"flow-field"},pm=["onUpdate:modelValue"],gm=["value"],hm=["onUpdate:modelValue"],mm={key:3,class:"planner-check-sections editor-check-sections area-editor-span"},vm={class:"planner-check-section"},bm={class:"flow-field"},ym=["onUpdate:modelValue"],Am={class:"planner-check-section"},Sm={class:"flow-field"},wm=["onUpdate:modelValue"],Pm={class:"flow-field area-editor-span"},Tm=["onUpdate:modelValue"],_m={key:3,class:"card card-profiles"},Dm={class:"card-head"},Im={class:"card-head-actions"},Rm={class:"meta-chip"},Nm={class:"profiles-layout results-page-layout"},km={class:"area-detail planner-sidecard"},Cm={class:"sidebar-results-list results-page-list"},xm=["onClick"],Em={class:"sidebar-result-head"},Gm={class:"sidebar-result-title"},Fm={key:0,class:"running-spinner","aria-hidden":"true"},Lm={class:"area-list-meta"},Mm={key:0},Om={class:"area-list-tags"},zm={class:"area-list-tags"},$m=["disabled","onClick"],Bm={key:0,class:"empty-state sidebar-empty-state"},Km={class:"card-head"},Vm={class:"area-detail-subhead"},Wm={class:"card-head-actions action-cluster"},Um={class:"meta-chip"},jm={key:0,class:"meta-chip"},Hm={class:"meta-chip"},Xm=["disabled"],qm={class:"metric-grid area-metrics"},Jm={class:"report-checks"},Zm={class:"anomaly-head"},Ym={class:"area-detail-subhead"},Qm={key:0,class:"planner-check-sections result-check-sections"},ev={class:"planner-step-grid compact-grid"},tv={key:1,class:"planner-step-grid"},av={key:0,class:"empty-state"},sv={key:1},nv={class:"simple-list"},rv={key:1,class:"area-detail"},iv={key:4,class:"card"},ov={class:"card-head"},lv={class:"meta-chip"},dv={key:0,class:"rank-list"},uv={class:"rank-title"},cv={class:"rank-label"},fv={key:1,class:"empty-state"},pv={key:5,class:"card"},gv={class:"card-head"},hv={class:"meta-chip"},mv={key:0,class:"event-list"},vv={class:"event-name"},bv={class:"event-bar"},yv={key:1,class:"empty-state"},Av={key:6,class:"card card-bus"},Sv={class:"card-head"},wv={key:0,class:"meta-chip"},Pv={class:"pill-row"},Tv={class:"pill success"},_v={class:"pill danger"},Dv={class:"pill neutral"},Iv={class:"bus-track"},Rv=["title"],Nv={class:"bus-scale"},kv={key:1,class:"empty-state"},Cv={class:"card-head"},xv={class:"card-head-actions"},Ev={class:"meta-chip"},Gv={class:"flow-toolbar"},Fv={class:"flow-field"},Lv={class:"flow-field flow-field-search"},Mv={class:"flow-field flow-field-select"},Ov=["value"],zv={class:"checkbox flow-toggle flow-toggle-inline"},$v={class:"flow-frame"},Bv=["viewBox"],Kv=["id"],Vv=["fill"],Wv=["d","stroke","stroke-width","opacity","marker-end"],Uv=["cx","cy"],jv=["x","y"],Hv=["x","y"],Xv=["x","y"],qv=["x","y"],Jv={key:1,class:"empty-state flow-empty"},Zv={class:"flow-note"},Yv={key:8,class:"card card-anomalies"},Qv={class:"card-head"},eb={class:"meta-chip"},tb={key:0,class:"anomaly-list"},ab={class:"anomaly-head"},sb={class:"anomaly-time"},nb={key:1,class:"empty-state"},rb={key:9,class:"card card-chat"},ib={class:"card-head"},ob={class:"meta-chip"},lb={class:"chat-log"},db=["innerHTML"],ub={key:1},cb={key:0,class:"chat-message chat-pending"},fb={class:"preset-row"},pb=["disabled","onClick"],gb={class:"ask-row"},hb=["disabled"],mb=["disabled"],vb={key:10,class:"card card-settings"},bb={class:"settings-tab-strip"},yb={key:0,class:"area-detail settings-panel"},Ab={class:"settings-node-grid"},Sb={class:"flow-field"},wb=["value"],Pb={class:"checkbox settings-node-checkbox"},Tb={key:1,class:"area-detail settings-panel"},_b={class:"card-head-actions action-cluster settings-config-actions"},Db=["disabled"],Ib=["disabled"],Rb={key:0,class:"global-wait-overlay",role:"status","aria-live":"polite","aria-busy":"true"},Nb={class:"global-wait-card"},kb={class:"area-detail-subhead"},Cb={class:"modal-actions"},xb=["disabled"],Eb={class:"area-detail-subhead"},Gb={class:"modal-actions"},Fb=["disabled"],Ei="knxUltimateAI:selectedNodeId",Gi="knxUltimateAI:autoRefresh",Lb="knxUltimateAI:activeTab",Fi="knxUltimateAI:settingsTab",Li="knxUltimateAI:flowPreview",Mi="knxUltimateAI:voiceEnabled",Oi="knxUltimateAI:sidebarExpanded",Mb="knxUltimateAI:selectedTestAreaId:",Ob="https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/knxUltimateAI-vue",zb="https://www.paypal.com/donate/?hosted_button_id=S8SKPUBSPK758",$b="https://www.youtube.com/@maxsupervibe",Bb={__name:"App",setup(e){const t=["Summarize the current KNX traffic and highlight the busiest group addresses.","Explain any anomalies you see and suggest what to check first.","Generate an SVG bar chart of Top Group Addresses with counts and title."],i=[{id:"lights_on_off",title:"Lights on, then off",prompt:"Turn the lights on, then turn them off, and verify that the related status values are coherent.",description:"Applies to all matching lighting command GA in the selected area."},{id:"area_activate",title:"Activate main actuators",prompt:"Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.",description:"Builds a deterministic active test using the supported command GA in the selected area."},{id:"shading_open_close",title:"Open and close shading",prompt:"Open and close the shading actuators in the area, then verify that the status matches the commands sent.",description:"Targets supported shading command GA in the selected area."},{id:"hvac_check",title:"HVAC active check",prompt:"Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.",description:"Targets supported HVAC command GA in the selected area."}],o=[{value:"command",label:"Command"},{value:"status",label:"Status"},{value:"neutral",label:"Don't use in tests"}],d={write:"#ff9800",response:"#46b86d",read:"#d99a34",repeat:"#c34747",other:"#8d8578"},u=(()=>{try{return new URLSearchParams(window.location.search).get("nodeId")||""}catch{return""}})(),f=(()=>{try{return new URLSearchParams(window.location.search).get("access_token")||""}catch{return""}})();function p(){try{if(!window.localStorage)return"";const n=[];for(let a=0;a<window.localStorage.length;a+=1){const r=String(window.localStorage.key(a)||"");if(!r.startsWith("auth-tokens"))continue;const c=window.localStorage.getItem(r);if(!c)continue;let g=null;try{g=JSON.parse(c)}catch{g=null}const D=g&&typeof g.access_token=="string"?g.access_token.trim():"";if(!D)continue;const N=Number(g&&(g.expires_at||g.expiry||g.expires)?g.expires_at||g.expiry||g.expires:0);n.push({token:D,expiresAt:Number.isFinite(N)?N:0})}return n.length?(n.sort((a,r)=>r.expiresAt-a.expiresAt),n[0].token||""):""}catch{return""}}const m=(()=>{const n=String(f||"").trim();return n||p()})();function P(n){const a=Object.assign({},n||{});return m&&!a.Authorization&&!a.authorization&&(a.Authorization=`Bearer ${m}`),a}const A=la("en");let R=null,O=0,B=!1;const oe={it:{countAreas:"{{count}} aree",countSavedPlans:"{{count}} piani salvati",countAvailable:"{{count}} disponibili",countVisible:"{{count}} visibili",countEventTypes:"{{count}} tipi di eventi",countRecent:"{{count}} recenti",nodesLinks:"Nodi {{nodes}} | Link {{links}}",connected:"Connesso {{value}}",disconnected:"Disconnesso {{value}}",coverage:"Copertura {{value}}%",windowSec:"Finestra {{value}}s.",anomalyCount:"anomalia x{{value}}",areaLabel:"Area {{value}}",providerModel:"Provider: {{provider}} | Modello: {{model}}"},de:{countAreas:"{{count}} Bereiche",countSavedPlans:"{{count}} gespeicherte Pläne",countAvailable:"{{count}} verfügbar",countVisible:"{{count}} sichtbar",countEventTypes:"{{count}} Ereignistypen",countRecent:"{{count}} aktuell",nodesLinks:"Knoten {{nodes}} | Verbindungen {{links}}",connected:"Verbunden {{value}}",disconnected:"Getrennt {{value}}",coverage:"Abdeckung {{value}}%",windowSec:"Fenster {{value}}s.",anomalyCount:"Anomalie x{{value}}",areaLabel:"Bereich {{value}}",providerModel:"Anbieter: {{provider}} | Modell: {{model}}"},fr:{countAreas:"{{count}} zones",countSavedPlans:"{{count}} plans enregistrés",countAvailable:"{{count}} disponibles",countVisible:"{{count}} visibles",countEventTypes:"{{count}} types d'événements",countRecent:"{{count}} récents",nodesLinks:"Nœuds {{nodes}} | Liens {{links}}",connected:"Connecté {{value}}",disconnected:"Déconnecté {{value}}",coverage:"Couverture {{value}}%",windowSec:"Fenêtre {{value}}s.",anomalyCount:"anomalie x{{value}}",areaLabel:"Zone {{value}}",providerModel:"Fournisseur : {{provider}} | Modèle : {{model}}"},es:{countAreas:"{{count}} áreas",countSavedPlans:"{{count}} planes guardados",countAvailable:"{{count}} disponibles",countVisible:"{{count}} visibles",countEventTypes:"{{count}} tipos de eventos",countRecent:"{{count}} recientes",nodesLinks:"Nodos {{nodes}} | Enlaces {{links}}",connected:"Conectado {{value}}",disconnected:"Desconectado {{value}}",coverage:"Cobertura {{value}}%",windowSec:"Ventana {{value}}s.",anomalyCount:"anomalía x{{value}}",areaLabel:"Área {{value}}",providerModel:"Proveedor: {{provider}} | Modelo: {{model}}"},"zh-CN":{countAreas:"{{count}} 个区域",countSavedPlans:"{{count}} 个已保存计划",countAvailable:"{{count}} 可用",countVisible:"{{count}} 可见",countEventTypes:"{{count}} 种事件类型",countRecent:"{{count}} 条最近记录",nodesLinks:"节点 {{nodes}} | 连线 {{links}}",connected:"已连接 {{value}}",disconnected:"已断开 {{value}}",coverage:"覆盖率 {{value}}%",windowSec:"窗口 {{value}} 秒。",anomalyCount:"异常 x{{value}}",areaLabel:"区域 {{value}}",providerModel:"提供方: {{provider}} | 模型: {{model}}"}},U={en:"en","en-us":"en","en-gb":"en",it:"it","it-it":"it",de:"de","de-de":"de",fr:"fr","fr-fr":"fr",es:"es","es-es":"es",zh:"zh-CN","zh-cn":"zh-CN","zh-hans":"zh-CN","zh-hans-cn":"zh-CN"},Ie=new Set(["KNX AI","KNX Ultimate","GroupValue_Write","GroupValue_Response","GA","DPT","ETS","SVG"]),Pe={it:{"Open Source Test":"Apri Test Sorgente","Asking...":"Sto chiedendo...","Loading...":"Caricamento...","Running...":"In esecuzione...",Running:"In esecuzione","Flow Map":"Mappa Flussi",Anomalies:"Anomalie",Rate:"Frequenza",Pass:"OK",Fail:"Errore",Warn:"Attenzione",Wait:"Attesa","Wait ms":"Attesa (ms)","Response timeout":"Timeout risposta","Read response timeout ms":"Timeout risposta lettura (ms)","Status write timeout ms":"Timeout scrittura stato (ms)","Regenerating...":"Rigenerazione...","Regenerate AI Areas":"Rigenera Aree AI","Deleting...":"Eliminazione...","Delete AI Areas":"Elimina Aree AI","Test Results":"Risultati Test","Select Test Result":"Seleziona risultato test","No test result selected.":"Nessun risultato test selezionato.","Open and close shading":"Apri e chiudi schermature"},de:{"Open Source Test":"Quelltest öffnen","Asking...":"Anfrage läuft...","Loading...":"Wird geladen...","Running...":"Läuft...",Running:"Läuft","Flow Map":"Flusskarte",Anomalies:"Anomalien",Rate:"Rate",Pass:"OK",Fail:"Fehler",Warn:"Warnung",Wait:"Warten","Wait ms":"Warten (ms)","Regenerating...":"Wird neu erstellt...","Regenerate AI Areas":"KI-Bereiche neu erstellen","Deleting...":"Wird gelöscht...","Delete AI Areas":"KI-Bereiche löschen"},fr:{"Open Source Test":"Ouvrir le test source","Asking...":"Interrogation en cours...","Loading...":"Chargement...","Running...":"En cours...",Running:"En cours","Flow Map":"Carte des flux",Anomalies:"Anomalies",Rate:"Débit",Pass:"OK",Fail:"Échec",Warn:"Alerte",Wait:"Attente","Wait ms":"Attente (ms)","Regenerating...":"Régénération...","Regenerate AI Areas":"Régénérer les zones IA","Deleting...":"Suppression...","Delete AI Areas":"Supprimer les zones IA"},es:{"Open Source Test":"Abrir prueba de origen","Asking...":"Consultando...","Loading...":"Cargando...","Running...":"En ejecución...",Running:"En ejecución","Flow Map":"Mapa de flujo",Anomalies:"Anomalías",Rate:"Tasa",Pass:"OK",Fail:"Fallo",Warn:"Aviso",Wait:"Espera","Wait ms":"Espera (ms)","Regenerating...":"Regenerando...","Regenerate AI Areas":"Regenerar áreas de IA","Deleting...":"Eliminando...","Delete AI Areas":"Eliminar áreas de IA"},"zh-CN":{"Open Source Test":"打开源测试","Asking...":"正在提问...","Loading...":"加载中...","Running...":"运行中...",Running:"运行中","Flow Map":"流量拓扑图",Anomalies:"异常",Rate:"速率",Pass:"通过",Fail:"失败",Warn:"警告",Wait:"等待","Wait ms":"等待(毫秒)","Regenerating...":"正在重新生成...","Regenerate AI Areas":"重新生成 AI 区域","Deleting...":"正在删除...","Delete AI Areas":"删除 AI 区域"}};function re(n,a="en"){const r=String(n||"").trim().toLowerCase();if(!r)return a;if(U[r])return U[r];if(r.includes("-")){const c=r.split("-")[0];if(U[c])return U[c]}return a}function Se(){try{const r=new URLSearchParams(window.location.search).get("lang");if(r)return re(r,"en")}catch{}const n=re(String(navigator.language||""),"");if(n)return n;const a=String(document&&document.documentElement&&document.documentElement.lang?document.documentElement.lang:"").trim();return a?re(a,"en"):"en"}function K(n,a={}){return String(n||"").replace(/\{\{\s*([^}\s]+)\s*\}\}/g,(r,c)=>Object.prototype.hasOwnProperty.call(a,c)?String(a[c]):r)}function Ne(n){const a=oe[A.value];if(!a)return"";let r=n.match(/^(\d+)\sareas$/i);return r?K(a.countAreas,{count:r[1]}):(r=n.match(/^(\d+)\ssaved plans$/i),r?K(a.countSavedPlans,{count:r[1]}):(r=n.match(/^(\d+)\savailable$/i),r?K(a.countAvailable,{count:r[1]}):(r=n.match(/^(\d+)\svisible$/i),r?K(a.countVisible,{count:r[1]}):(r=n.match(/^(\d+)\sevent types$/i),r?K(a.countEventTypes,{count:r[1]}):(r=n.match(/^(\d+)\srecent$/i),r?K(a.countRecent,{count:r[1]}):(r=n.match(/^Nodes\s+(.+?)\s+\|\s+Links\s+(.+)$/),r?K(a.nodesLinks,{nodes:r[1],links:r[2]}):(r=n.match(/^Connected\s+(.+)$/),r?K(a.connected,{value:r[1]}):(r=n.match(/^Disconnected\s+(.+)$/),r?K(a.disconnected,{value:r[1]}):(r=n.match(/^Coverage\s+(.+?)%$/),r?K(a.coverage,{value:r[1]}):(r=n.match(/^Window\s+(.+?)s\.$/),r?K(a.windowSec,{value:r[1]}):(r=n.match(/^anomaly x(.+)$/i),r?K(a.anomalyCount,{value:r[1]}):(r=n.match(/^Area\s+(.+)$/),r?K(a.areaLabel,{value:r[1]}):(r=n.match(/^Provider:\s+(.+?)\s+\|\s+Model:\s+(.+)$/),r?K(a.providerModel,{provider:r[1],model:r[2]}):"")))))))))))))}function Oe(n){const a=String(n||""),r=a.trim();if(!r||A.value==="en"||Ie.has(r))return a;const c=Pe[A.value]||{},g=af[A.value]||{},D=c[r]||g[r]||Ne(r);return!D||D===r?a:a.replace(r,D)}function it(n){const a=n&&n.parentElement;if(!a)return!0;const r=String(a.tagName||"").toUpperCase();return!!(r==="SCRIPT"||r==="STYLE"||r==="CODE"||r==="PRE"||a.closest(".chat-log"))}function ht(n){const a=n||document.body;if(!(!a||A.value==="en")&&!B){B=!0;try{const r=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let c=r.nextNode();for(;c;){if(!it(c)){const D=Oe(c.nodeValue);D!==c.nodeValue&&(c.nodeValue=D)}c=r.nextNode()}const g=a.querySelectorAll("[placeholder], [title], [aria-label]");for(const D of g){const N=D.getAttribute("placeholder");if(N){const Q=Oe(N);Q!==N&&D.setAttribute("placeholder",Q)}const z=D.getAttribute("title");if(z){const Q=Oe(z);Q!==z&&D.setAttribute("title",Q)}const $=D.getAttribute("aria-label");if($){const Q=Oe($);Q!==$&&D.setAttribute("aria-label",Q)}}}finally{B=!1}}}function pa(){A.value!=="en"&&(O||(O=window.requestAnimationFrame(()=>{O=0,ht(document.body)})))}function mt(){R&&(R.disconnect(),R=null),O&&(window.cancelAnimationFrame(O),O=0)}function ga(){A.value!=="en"&&(mt(),R=new MutationObserver(()=>{B||pa()}),R.observe(document.body,{childList:!0,subtree:!0,characterData:!0}),pa())}const s=en({nodes:[],selectedNodeId:"",activeTab:"overview",settingsTab:Ha(Fi,"config"),autoRefresh:kt(Gi,!0),voiceEnabled:kt(Mi,!0),flowMaxNodes:Qt().maxNodes,flowSelectedGa:Qt().selectedGa,flowShowUniversalNodes:Qt().showUniversalNodes,flowSearch:"",areaSearch:"",areaSearchOpen:!1,areaSelectedId:"",testAreaSelectedId:"",areaDraftName:"",areaDraftDescription:"",areaDraftTags:"",areaDraftGaList:[],areaDraftId:"",areaDraftIsNew:!1,areaLlmPrompt:"",areaLlmBusy:!1,areaLlmError:"",areaLlmRegenerating:!1,areaLlmBulkDeleting:!1,gaCatalog:[],gaCatalogSearch:"",gaCatalogLoading:!1,areaGaRoleSavingGa:"",areaSaving:!1,profileSelectedId:"",profileDraftMode:!1,profileDraftId:"",profileDraftName:"",profileDraftDescription:"",profileDraftTargetTags:"",profileDraftMinActivityPct:20,profileDraftMaxSilentPct:60,profileDraftMaxAnomalies:2,profileSaving:!1,profileRunning:!1,actuatorPresetSelectedId:"",actuatorDraftMode:!1,actuatorDraftId:"",actuatorDraftName:"",actuatorDraftDescription:"",actuatorDraftCommandGA:"",actuatorDraftCommandDPT:"",actuatorDraftCommandPayload:"",actuatorDraftStatusGA:"",actuatorDraftStatusDPT:"",actuatorDraftStatusWriteTimeoutMs:5e3,actuatorDraftStatusResponseTimeoutMs:5e3,actuatorSaving:!1,actuatorRunning:!1,testPlanSelectedId:"",testPlanSearch:"",testPlanSearchOpen:!1,selectedTestResultId:"",liveTestResultId:"",testResultsMenuOpen:!0,testResultFocusMode:!1,deletingTestResultId:"",testPlanPrompt:"",testPlanDraft:null,testPlanCatalog:null,testPlanCatalogLoading:!1,testPlanCatalogError:"",testPlanGenerating:!1,testPlanSaving:!1,testPlanDeleting:!1,testPlanRunning:!1,testPlanGeneration:null,testPlanGenerationError:"",testPlanRunConfirmOpen:!1,testPlanRunMode:"single",testPlanRunningStepId:"",testPlanRepeatForever:!1,testPlanRepeatStopRequested:!1,testPlanDraftBaseline:"",testPlanUnsavedConfirmOpen:!1,areaUnsavedConfirmOpen:!1,testPlanPendingActionLabel:"",draggedTestPlanStepId:"",dragOverTestPlanStepId:"",showAiPlanner:!0,testTemplateBuilderFocus:!1,showAiAreaBuilder:!1,areaBuilderFocus:!1,status:"Ready",loadingNodes:!1,loadingState:!1,asking:!1,stateData:null,lastError:"",chatMessages:[],chatDraft:"",pollStateHandle:null,pollNodesHandle:null}),Yt=la(null),ha=la(!1),Ia=la(null),ke=la(null),ve=la(kt(Oi,!0)),ce=la(!1),Le=la(!1),Je=j(()=>Le.value?ce.value:ve.value);let Ue=null,Ze=null,Ra=null;function Na(){if(Ue){try{Ue.pause(),Ue.src=""}catch{}Ue=null}}function Ha(n,a=""){try{return window.localStorage&&window.localStorage.getItem(n)||a}catch{return a}}function kt(n,a){try{if(!window.localStorage)return a;const r=window.localStorage.getItem(n);return r==null||r===""?a:r==="true"}catch{return a}}function Qt(){try{if(!window.localStorage)return{maxNodes:14,selectedGa:[],showUniversalNodes:!1};const n=window.localStorage.getItem(Li);if(!n)return{maxNodes:14,selectedGa:[],showUniversalNodes:!1};const a=JSON.parse(n),r=Math.max(4,Math.min(32,Number(a&&a.maxNodes)||14)),c=Array.isArray(a&&a.selectedGa)?Array.from(new Set(a.selectedGa.map(D=>String(D||"").trim()).filter(Boolean))).slice(0,80):[],g=a&&a.showUniversalNodes===!0;return{maxNodes:r,selectedGa:c,showUniversalNodes:g}}catch{return{maxNodes:14,selectedGa:[],showUniversalNodes:!1}}}function ea(n,a){try{window.localStorage&&window.localStorage.setItem(n,String(a??""))}catch{}}function ka(n,a){try{window.localStorage&&window.localStorage.setItem(n,a?"true":"false")}catch{}}function Ct(){try{Le.value=window.matchMedia("(max-width: 1100px)").matches}catch{Le.value=window.innerWidth<=1100}Le.value||(ce.value=!1)}function on(){if(Le.value){ce.value=ce.value!==!0;return}ve.value=ve.value!==!0}function h(){Le.value&&(ce.value=!1)}function y(n){!n||n.key!=="Escape"||h()}function T(n){const a=String(n||"").trim();return a?`${Mb}${a}`:""}function x(n){const a=T(n);return a?Ha(a,""):""}function C(n,a){const r=T(n);if(!r)return;const c=String(a||"").trim();c&&ea(r,c)}function k(){const n=x(s.selectedNodeId);return!n||!ye.value.find(a=>a.id===n)?!1:(s.testAreaSelectedId===n||(s.testAreaSelectedId=n),!0)}function M(){try{if(!window.localStorage)return;window.localStorage.setItem(Li,JSON.stringify({maxNodes:Math.max(4,Math.min(32,Number(s.flowMaxNodes)||14)),selectedGa:Array.from(new Set((s.flowSelectedGa||[]).map(n=>String(n||"").trim()).filter(Boolean))).slice(0,80),showUniversalNodes:s.flowShowUniversalNodes===!0}))}catch{}}async function L(){const n=Yt.value;if(!(!n||typeof n.requestFullscreen!="function"))try{document.fullscreenElement===n?await document.exitFullscreen():document.fullscreenElement||await n.requestFullscreen()}catch{}}function F(){ha.value=document.fullscreenElement===Yt.value}function I(n){const a=new URL(n,window.location.href);return f&&a.searchParams.set("access_token",f),a.toString()}function _(n){s.status=Oe(String(n||""))}async function E(n,a){const r=Object.assign({credentials:"same-origin"},a||{});r.headers=P(r.headers);const c=await fetch(n,r),g=String(c.headers.get("content-type")||"").toLowerCase(),D=await c.text();if(c.ok&&g.includes("text/html"))throw new Error("Authentication required or insufficient permissions (session token missing or expired).");let N={};try{N=D?JSON.parse(D):{}}catch{N={error:D||`HTTP ${c.status}`}}if(!c.ok){const z=N&&N.error?N.error:`HTTP ${c.status}`;throw c.status===401||c.status===403?new Error(`Authentication required or insufficient permissions (${c.status}).`):new Error(z)}return N}async function W(n,a){const r=Object.assign({credentials:"same-origin",cache:"no-store"},a||{});r.headers=P(r.headers);const c=await fetch(n,r);if(!c.ok){const D=await c.text();let N=D||`HTTP ${c.status}`;try{const z=D?JSON.parse(D):{};N=z&&z.error?z.error:N}catch{}throw c.status===401||c.status===403?new Error(`Authentication required or insufficient permissions (${c.status}).`):new Error(N)}const g=String(c.headers.get("content-type")||"").toLowerCase();if(!g.includes("audio/")){const D=await c.text();if(g.includes("text/html"))throw new Error("Authentication required or insufficient permissions (invalid audio response).");let N=D||`Unexpected audio response (${g||"unknown"}).`;try{const z=D?JSON.parse(D):{};N=z&&z.error?z.error:N}catch{}throw new Error(N)}return await c.blob()}function H(n){if(n==null)return"";if(typeof n=="string")return n;try{return JSON.stringify(n,null,2)}catch{return String(n)}}function se(n){return String(n||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function be(n){const a=String(n||"").trim();return a.includes("-")&&/^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(a)}function le(n){let a=String(n||"").trim();return a.startsWith("|")&&(a=a.slice(1)),a.endsWith("|")&&(a=a.slice(0,-1)),a.split("|").map(r=>String(r||"").trim())}function ze(n){return le(n).map(a=>{const r=String(a||"").trim(),c=r.startsWith(":"),g=r.endsWith(":");return c&&g?"center":g?"right":"left"})}function $e(n){const a=String(n||"").split(/\r?\n/);let r="",c=!1;const g=D=>{let N=String(D||"");return N=N.replace(/`([^`]+)`/g,"<code>$1</code>"),N=N.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),N=N.replace(/\*([^*]+)\*/g,"<em>$1</em>"),N=N.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(z,$,Q)=>`<a href="${/^javascript:/i.test(String(Q||"").trim())?"#":Q}" target="_blank" rel="noopener noreferrer">${$}</a>`),N};for(let D=0;D<a.length;D++){const N=a[D];if(/^```/.test(N.trim())){c=!c,r+=c?"<pre><code>":"</code></pre>";continue}if(c){r+=`${N}
2
2
  `;continue}if(/^###\s+/.test(N)){r+=`<h3>${N.replace(/^###\s+/,"")}</h3>`;continue}if(/^##\s+/.test(N)){r+=`<h2>${N.replace(/^##\s+/,"")}</h2>`;continue}if(/^#\s+/.test(N)){r+=`<h1>${N.replace(/^#\s+/,"")}</h1>`;continue}if(N.includes("|")&&D+1<a.length&&be(a[D+1])){const Q=le(N),X=ze(a[D+1]),fe=[];for(D+=2;D<a.length&&a[D]&&a[D].includes("|")&&!/^```/.test(a[D].trim());)fe.push(le(a[D])),D++;D-=1;const Z=Math.max(Q.length,X.length,...fe.map(Y=>Y.length),0);r+='<div class="chat-table-wrap"><table><thead><tr>';for(let Y=0;Y<Z;Y++)r+=`<th style="text-align:${X[Y]||"left"};">${g(Q[Y]||"")}</th>`;r+="</tr></thead><tbody>",fe.forEach(Y=>{r+="<tr>";for(let ee=0;ee<Z;ee++)r+=`<td style="text-align:${X[ee]||"left"};">${g(Y[ee]||"")}</td>`;r+="</tr>"}),r+="</tbody></table></div>";continue}const z=/^\s*[-*]\s+/.test(N),$=/^\s*\d+\.\s+/.test(N);if(z||$){const Q=$?"ol":"ul",X=$?/^\s*\d+\.\s+/:/^\s*[-*]\s+/;for(r+=`<${Q}>`;D<a.length&&X.test(a[D]);)r+=`<li>${g(a[D].replace(X,""))}</li>`,D++;D-=1,r+=`</${Q}>`;continue}if(N.trim()===""){r+="<br>";continue}r+=`<p>${g(N)}</p>`}return c&&(r+="</code></pre>"),r}function at(n){return String(n||"").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/&amp;/gi,"&")}function Ye(n){const a=[],r=/<svg[\s\S]*?<\/svg>/gi;let c;for(;(c=r.exec(String(n||"")))!==null;)c&&c[0]&&a.push(String(c[0]));return a}const ma=new Set(["svg","g","path","line","polyline","polygon","circle","ellipse","rect","text","tspan","title","desc","defs","marker","lineargradient","radialgradient","stop","clippath"]),Ss=new Set(["xmlns","xmlns:xlink","viewbox","preserveaspectratio","width","height","role","aria-label","id","class","x","y","x1","y1","x2","y2","cx","cy","r","rx","ry","d","points","transform","fill","fill-opacity","stroke","stroke-width","stroke-opacity","stroke-dasharray","stroke-linecap","stroke-linejoin","opacity","font-size","font-family","font-weight","text-anchor","dominant-baseline","offset","stop-color","stop-opacity","gradientunits","gradienttransform","fx","fy","marker-start","marker-mid","marker-end","markerwidth","markerheight","refx","refy","orient","markerunits","href","xlink:href","clip-path","clippathunits"]);function Me(n){try{const r=new window.DOMParser().parseFromString(String(n||""),"image/svg+xml");if(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)return"";const c=r.documentElement;if(String(c.tagName||"").toLowerCase()!=="svg")return"";const g=N=>{const z=String(N.tagName||"").toLowerCase();if(!ma.has(z)){N.remove();return}Array.from(N.attributes||[]).forEach($=>{const Q=String($.name||"").toLowerCase(),X=String($.value||"");if(Q.startsWith("on")||!Ss.has(Q)){N.removeAttribute($.name);return}(Q==="href"||Q==="xlink:href")&&X&&!String(X).trim().startsWith("#")&&N.removeAttribute($.name)}),Array.from(N.childNodes||[]).forEach($=>{$.nodeType===1?g($):$.nodeType!==3&&$.remove()})};g(c),!c.getAttribute("viewBox")&&!c.getAttribute("viewbox")&&c.setAttribute("viewBox","0 0 920 360"),c.setAttribute("role",c.getAttribute("role")||"img");const D=new window.XMLSerializer().serializeToString(c);return D.length>12e4?"":D}catch{return""}}function Be(n){return $e(se(n||""))}function ws(n){const a=H(n),r=a.trim();if(!r)return Be("(empty answer)");const c=/```(?:svg|xml|html)?\s*([\s\S]*?)```/gi;let g="",D=0,N=!1,z;for(;(z=c.exec(a))!==null;){const Q=a.slice(D,z.index);Q.trim()&&(g+=Be(Q));const X=String(z[1]||""),fe=at(X),Z=Ye(fe);if(Z.length){let Y=0;Z.forEach(ee=>{const ge=Me(ee);ge&&(Y++,N=!0,g+=`<div class="chat-svg-wrap">${ge}</div>`)}),Y||(g+=`<pre><code>${se(X)}</code></pre>`)}else{const Y=Me(fe);Y?(N=!0,g+=`<div class="chat-svg-wrap">${Y}</div>`):g+=`<pre><code>${se(X)}</code></pre>`}D=z.index+z[0].length}const $=a.slice(D);if($.trim()&&(g+=Be($)),!N){const Q=at(a),X=Array.from(new Set([...Ye(a),...Ye(Q)])).map(fe=>Me(fe)).filter(Boolean);if(X.length){const fe=a.replace(/<svg[\s\S]*?<\/svg>/gi,"").replace(/&lt;svg[\s\S]*?&lt;\/svg&gt;/gi,"").trim();g=fe?Be(fe):"",X.forEach(Z=>{g+=`<div class="chat-svg-wrap">${Z}</div>`})}}return g||Be(r)}function Ca(n){const a=Math.max(0,Math.round(Number(n)||0)),r=Math.floor(a/3600),c=Math.floor(a%3600/60),g=a%60;return r?`${r}h ${c}m`:c?`${c}m ${g}s`:`${g}s`}function Ps(n){if(!n)return"n/a";try{return new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return"n/a"}}function xt(n){if(!n)return"";try{return new Date(n).toLocaleString()}catch{return String(n)}}function Ts(n){return n&&n.payload&&typeof n.payload=="object"?n.payload:{}}function mr(n){return n==null?"":String(n).trim()}function Et(n,a=null){try{return JSON.parse(JSON.stringify(n))}catch{return a}}function ln(n=[]){return Array.from(new Set((Array.isArray(n)?n:[]).map(a=>String(a||"").trim()).filter(Boolean))).sort()}function Ho(n=""){return ln(String(n||"").split(","))}function dn(n={}){return JSON.stringify({isNew:n.isNew===!0,areaId:String(n.areaId||"").trim(),name:String(n.name||"").trim(),description:String(n.description||"").trim(),tags:ln(n.tags||[]),gaList:ln(n.gaList||[]),llmPrompt:String(n.llmPrompt||"").trim()})}function vr(n={}){return JSON.stringify({prompt:String(n.prompt||""),draft:Et(n.draft,null)})}function Xo(){return{selectedId:String(s.testPlanSelectedId||""),prompt:String(s.testPlanPrompt||""),draft:Et(s.testPlanDraft,null),generation:Et(s.testPlanGeneration,null),showAiPlanner:s.showAiPlanner===!0}}function xa(){Ze=Xo(),s.testPlanDraftBaseline=vr(Ze)}function qo(){const n=Et(Ze,null);if(!n){s.testPlanSelectedId="",s.testPlanPrompt="",s.testPlanDraft=null,s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!0;return}s.testPlanSelectedId=String(n.selectedId||""),s.testPlanPrompt=String(n.prompt||""),s.testPlanDraft=Et(n.draft,null),s.testPlanGeneration=Et(n.generation,null),s.testPlanRunConfirmOpen=!1,s.showAiPlanner=n.showAiPlanner!==!1,n.draft&&n.draft.areaId&&ye.value.find(a=>a.id===n.draft.areaId)&&(s.areaSelectedId=n.draft.areaId)}function Jo(n){const a=String(n||"").trim();return a.length>14?`${a.slice(0,12)}..`:a}function Zo(n){const a=String(n||"").trim();return a?a.length>28?`${a.slice(0,26)}..`:a:""}function Yo(n){const a=mr(n).replace(/\s+/g," ");return a?a.length>30?`${a.slice(0,28)}..`:a:""}function Qo(n){const a=String(n||"").toLowerCase();return a.includes("repeat")?"repeat":a.includes("write")?"write":a.includes("response")?"response":a.includes("read")?"read":"other"}function el(n){const a={write:0,response:0,read:0,repeat:0,other:0};return Object.keys(n||{}).forEach(r=>{const c=Number(n[r]||0);c<=0||(a[Qo(r)]+=c)}),Object.keys(a).sort((r,c)=>a[c]-a[r])[0]||"other"}function un(n){return!!(n&&n.kind==="node"&&n.listenAllGA)}function tl(n){const a=n&&n.summary?n.summary:{},r=Array.isArray(n&&n.anomalies)?n.anomalies:[],c=Array.isArray(a.patternTransitions)?a.patternTransitions:[],g=Array.isArray(a.patterns)?a.patterns:[],D=a&&typeof a.gaLabels=="object"?a.gaLabels:{},N=a&&typeof a.gaLastPayload=="object"?a.gaLastPayload:{},z=a&&typeof a.gaLastSeenAt=="object"?a.gaLastSeenAt:{},$=new Set((Array.isArray(a.flowKnownGAs)?a.flowKnownGAs:[]).map(w=>String(w||"").trim()).filter(Boolean)),Q={};r.forEach(w=>{const V=String(w&&w.payload&&w.payload.ga?w.payload.ga:"BUS").trim()||"BUS";Q[V]=(Q[V]||0)+1});const X=a&&a.flowMapTopology&&typeof a.flowMapTopology=="object"?a.flowMapTopology:null,fe=Array.isArray(X&&X.nodes)?X.nodes:[],Z=Array.isArray(X&&X.edges)?X.edges:[],Y=new Map,ee=w=>{const V=String(w&&w.from?w.from:"").trim(),ae=String(w&&w.to?w.to:"").trim();if(!V||!ae||V===ae)return;const Fe=`${V}->${ae}`,je={key:Fe,from:V,to:ae,weight:Math.max(1,Number(w&&(w.weight??w.currentWindowCount??w.totalCount??w.count)||1)),delta:Number(w&&w.delta?w.delta:0),edgeByEvent:w&&typeof w.edgeByEvent=="object"?w.edgeByEvent:{},lastAtMs:(()=>{const nt=Number(w&&w.lastAtMs?w.lastAtMs:0);if(Number.isFinite(nt)&&nt>0)return nt;const oa=new Date(String(w&&w.lastAt?w.lastAt:"")).getTime();return Number.isFinite(oa)?oa:0})(),linkType:String(w&&w.linkType?w.linkType:"").trim()};if(!Y.has(Fe)){Y.set(Fe,je);return}const Qe=Y.get(Fe);Qe.weight+=je.weight,Qe.delta+=je.delta,Qe.lastAtMs=Math.max(Number(Qe.lastAtMs||0),Number(je.lastAtMs||0)),Object.keys(je.edgeByEvent||{}).forEach(nt=>{Qe.edgeByEvent[nt]=Number(Qe.edgeByEvent[nt]||0)+Number(je.edgeByEvent[nt]||0)})};Z.length?Z.forEach(ee):c.length?c.forEach(ee):g.forEach(w=>ee({from:w&&w.from,to:w&&w.to,count:w&&w.count,edgeByEvent:{}}));const ge=new Map,ia=(w,V={})=>{const ae=String(w||"").trim();return ae?(ge.has(ae)||ge.set(ae,{id:ae,displayId:String(V.displayId||ae).trim()||ae,kind:String(V.kind||(ae.startsWith("N:")?"node":"ga")).trim()||"ga",subtitle:String(V.subtitle||"").trim(),payload:mr(V.payload),anomalyCount:Number(V.anomalyCount||Q[ae]||0),inFlow:V.inFlow!==void 0?!!V.inFlow:$.size?$.has(ae)||ae==="BUS"||ae.startsWith("N:"):!0,lastSeenAtMs:Number(V.lastSeenAtMs||0),score:Number(V.score||0),listenAllGA:V.listenAllGA===!0}),ge.get(ae)):null};return fe.forEach(w=>{const V=String(w&&w.id?w.id:"").trim();V&&ia(V,{displayId:w&&w.displayId,kind:w&&w.kind,subtitle:w&&w.subtitle?w.subtitle:D[V],payload:w&&w.payload!==void 0?w.payload:N[V],anomalyCount:Number(w&&w.anomalyCount?w.anomalyCount:Q[V]||0),inFlow:w&&w.inFlow!==void 0?!!w.inFlow:void 0,lastSeenAtMs:Number(w&&w.lastSeenAtMs?w.lastSeenAtMs:new Date(String(w&&w.lastAt?w.lastAt:z[V]||"")).getTime()||0),score:Number(w&&w.score?w.score:0),listenAllGA:w&&w.listenAllGA===!0})}),Array.from(Y.values()).forEach(w=>{ia(w.from,{subtitle:D[w.from],payload:N[w.from],lastSeenAtMs:new Date(String(z[w.from]||"")).getTime()||w.lastAtMs||0}),ia(w.to,{subtitle:D[w.to],payload:N[w.to],lastSeenAtMs:new Date(String(z[w.to]||"")).getTime()||w.lastAtMs||0});const V=ge.get(w.from),ae=ge.get(w.to);V&&(V.score+=Number(w.weight||0)),ae&&(ae.score+=Number(w.weight||0))}),(Array.isArray(a.topGAs)?a.topGAs:[]).slice(0,12).forEach(w=>{const V=String(w&&w.ga?w.ga:"").trim();if(!V)return;const ae=ia(V,{subtitle:w&&w.label?w.label:D[V],payload:N[V],lastSeenAtMs:new Date(String(z[V]||"")).getTime()||0});ae&&(ae.score+=Number(w&&w.count?w.count:0))}),{nodes:Array.from(ge.values()),edges:Array.from(Y.values()).sort((w,V)=>Number(V.weight||0)-Number(w.weight||0)).slice(0,48),telemetryWindowSec:Number(a&&a.graph&&a.graph.windowSec?a.graph.windowSec:a?.meta?.analysisWindowSec||0)}}function al(n){let a=Array.isArray(n&&n.nodes)?n.nodes.slice():[];const r=Array.isArray(n&&n.edges)?n.edges.slice():[];s.flowShowUniversalNodes!==!0&&(a=a.filter(w=>!un(w)));const c=new Set(a.map(w=>w.id)),g=new Set((s.flowSelectedGa||[]).map(w=>String(w||"").trim()).filter(w=>w&&c.has(w))),D=Math.max(4,Math.min(32,Number(s.flowMaxNodes)||14));let N=a.slice().sort((w,V)=>{const ae=Number(w.anomalyCount||0)*10+Number(w.score||0),Fe=Number(V.anomalyCount||0)*10+Number(V.score||0);return Fe!==ae?Fe-ae:String(w.id||"").localeCompare(String(V.id||""))});if(g.size){const w=new Set(g);r.forEach(V=>{g.has(V.from)&&w.add(V.to),g.has(V.to)&&w.add(V.from)}),N=N.filter(V=>w.has(V.id))}else N=N.slice(0,D);const z=new Set(N.map(w=>w.id)),$=r.filter(w=>z.has(w.from)&&z.has(w.to)),Q=Math.max(...$.map(w=>Number(w.weight||0)),1),X=Math.max(2,Math.min(6,Math.ceil(Math.sqrt(Math.max(N.length,4)*1.5)))),fe=Math.max(1,Math.ceil(N.length/X)),Z=1080,Y=Math.max(420,140+(fe-1)*150),ee=new Map;N.forEach((w,V)=>{const ae=Math.floor(V/X),Fe=V%X,je=X===1?Z/2:90+Fe*((Z-180)/Math.max(X-1,1)),Qe=92+ae*148;ee.set(w.id,{x:je,y:Qe,row:ae,col:Fe})});const ge=Date.now(),ia=$.map((w,V)=>{const ae=ee.get(w.from),Fe=ee.get(w.to);if(!ae||!Fe)return null;const je=Fe.x-ae.x,Qe=Fe.y-ae.y,nt=Math.max(Math.hypot(je,Qe),1),oa=je/nt,Fa=Qe/nt,_e=24,At=ae.x+oa*(_e+2),Ot=ae.y+Fa*(_e+2),zt=Fe.x-oa*(_e+8),$t=Fe.y-Fa*(_e+8),xs=-Fa,Es=oa,Qa=28+V%3*14,Gs=V%2===0?1:-1,Cn=(At+zt)/2+xs*Qa*Gs,Dd=(Ot+$t)/2+Es*Qa*Gs,Jr=el(w.edgeByEvent),Zr=Number(w.lastAtMs||0)>0&&ge-Number(w.lastAtMs||0)<=5e3;return{key:w.key,from:w.from,to:w.to,d:`M ${At} ${Ot} Q ${Cn} ${Dd} ${zt} ${$t}`,width:(.9+Number(w.weight||0)/Q*1.7).toFixed(2),color:d[Jr]||d.other,opacity:Zr?.82:.24,markerId:`flow-arrow-${Jr}`,tooltip:`${w.from} -> ${w.to} | traffic: ${Number(w.weight||0)}${w.delta?` | delta: ${w.delta>0?"+":""}${w.delta}`:""}`,active:Zr}}).filter(Boolean);return{width:Z,height:Y,telemetryWindowSec:Number(n&&n.telemetryWindowSec?n.telemetryWindowSec:0),nodes:N.map(w=>{const V=ee.get(w.id),ae=Number(w.lastSeenAtMs||0);return Object.assign({},w,V,{shortLabel:Jo(w.displayId||w.id),shortSubtitle:Zo(w.subtitle),shortPayload:Yo(w.payload),isIdle:ae>0&&ge-ae>45e3})}),edges:ia,maxNodes:D,selectedCount:g.size}}const _s=j(()=>s.nodes.find(n=>n.id===s.selectedNodeId)||null),xe=j(()=>s.stateData&&s.stateData.summary?s.stateData.summary:{}),ta=j(()=>s.stateData&&s.stateData.node?s.stateData.node:{}),va=j(()=>s.stateData&&s.stateData.areas?s.stateData.areas:{suggested:[],totals:{}}),ye=j(()=>Array.isArray(va.value&&va.value.suggested)?va.value.suggested:[]),sl=j(()=>ye.value.filter(n=>String(n&&n.id?n.id:"").startsWith("llm:"))),br=j(()=>Number(sl.value.length||0)),Xa=j(()=>va.value&&va.value.totals?va.value.totals:{}),ba=j(()=>Array.isArray(s.stateData&&s.stateData.profiles)?s.stateData.profiles:[]),nl=j(()=>s.stateData&&s.stateData.profileReport?s.stateData.profileReport:null),ya=j(()=>Array.isArray(s.stateData&&s.stateData.actuatorTests)?s.stateData.actuatorTests:[]),rl=j(()=>s.stateData&&s.stateData.actuatorTestReport?s.stateData.actuatorTestReport:null),vt=j(()=>Array.isArray(s.stateData&&s.stateData.testPlans)?s.stateData.testPlans:[]),yr=j(()=>{const n=String(s.testPlanSearch||"").trim().toLowerCase();return vt.value.filter(a=>n?[a.name,a.description,a.areaName,a.areaId].filter(Boolean).join(" ").toLowerCase().includes(n):!0)}),ct=j(()=>s.stateData&&s.stateData.testPlanReport?s.stateData.testPlanReport:null),qa=j(()=>Array.isArray(s.stateData&&s.stateData.testResults)?s.stateData.testResults:[]),Ar=j(()=>!s.liveTestResultId||!ct.value||ct.value.id!==s.liveTestResultId?null:Object.assign({},ct.value,{live:s.testPlanRunning===!0})),aa=j(()=>{const n=[],a=new Set,r=(c,g=!1)=>{if(!c||typeof c!="object"||!c.id)return;const D=String(c.id);a.has(D)||(a.add(D),n.push(Object.assign({},c,{live:g})))};return r(Ar.value,!0),qa.value.forEach(c=>r(c,!1)),n}),ne=j(()=>{if(s.selectedTestResultId){const n=aa.value.find(a=>a&&a.id===s.selectedTestResultId);if(n)return n}return Ar.value||qa.value[0]||null}),bt=j(()=>s.activeTab==="tests"&&s.testResultFocusMode===!0&&!!ne.value),il=j(()=>t.map(n=>{const a=String(n||"").trim(),r=String(Oe(a)||"").trim();return{key:a,text:r||a}})),cn=j(()=>{const n=String(s.areaSearch||"").trim().toLowerCase();return ye.value.filter(a=>n?[a.path,a.name,a.parentName,...Array.isArray(a.tags)?a.tags:[],...Array.isArray(a.sampleLabels)?a.sampleLabels:[]].filter(Boolean).join(" ").toLowerCase().includes(n):!0)}),Ee=j(()=>{if(s.areaDraftIsNew===!0&&!String(s.areaSelectedId||"").trim())return null;if(s.areaSelectedId){const n=ye.value.find(a=>a.id===s.areaSelectedId);if(n)return n}return null}),ot=j(()=>{if(s.testAreaSelectedId){const n=ye.value.find(a=>a.id===s.testAreaSelectedId);if(n)return n}return ye.value[0]||null}),Gt=j(()=>{const n=String(s.testPlanDraft&&s.testPlanDraft.areaId?s.testPlanDraft.areaId:"").trim();if(n){const a=ye.value.find(r=>r.id===n);if(a)return a}return ot.value}),Sr=j(()=>{const n=String(s.gaCatalogSearch||"").trim().toLowerCase(),a=new Set((s.areaDraftGaList||[]).map(r=>String(r||"").trim()).filter(Boolean));return(Array.isArray(s.gaCatalog)?s.gaCatalog:[]).filter(r=>!r||!r.ga||a.has(r.ga)?!1:n?[r.ga,r.label,r.hierarchyPath,...Array.isArray(r.tags)?r.tags:[]].filter(Boolean).join(" ").toLowerCase().includes(n):!0).slice(0,80)}),wr=j(()=>{const n=new Map((Array.isArray(s.gaCatalog)?s.gaCatalog:[]).map(a=>[String(a&&a.ga?a.ga:"").trim(),a]));return(s.areaDraftGaList||[]).map(a=>n.get(String(a||"").trim())||{ga:String(a||"").trim(),label:"",dpt:"",hierarchyPath:"",tags:[]})}),fn=j(()=>Array.isArray(s.testPlanCatalog&&s.testPlanCatalog.commandSignals)?s.testPlanCatalog.commandSignals:[]),Pr=j(()=>Array.isArray(s.testPlanCatalog&&s.testPlanCatalog.statusSignals)?s.testPlanCatalog.statusSignals:[]),yt=j(()=>{if(s.profileDraftMode===!0)return null;if(s.profileSelectedId){const n=ba.value.find(a=>a.id===s.profileSelectedId);if(n)return n}return ba.value[0]||null}),lt=j(()=>{if(s.actuatorDraftMode===!0)return null;if(s.actuatorPresetSelectedId){const n=ya.value.find(a=>a.id===s.actuatorPresetSelectedId);if(n)return n}return ya.value[0]||null}),sa=j(()=>s.testPlanSelectedId&&vt.value.find(n=>n.id===s.testPlanSelectedId)||null),Re=j(()=>!s.testPlanRunningStepId||!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps)?null:s.testPlanDraft.steps.find(n=>String(n&&n.id?n.id:"")===s.testPlanRunningStepId)||null),ol=j(()=>!!(s.testPlanDraft&&Array.isArray(s.testPlanDraft.steps)&&s.testPlanDraft.steps.length>0)),pn=j(()=>s.showAiPlanner===!0),Tr=j(()=>s.showAiAreaBuilder===!0),_r=j(()=>s.testPlanDraft?vr({prompt:s.testPlanPrompt,draft:s.testPlanDraft})!==s.testPlanDraftBaseline:!1),ll=j(()=>{if(!(s.areaDraftIsNew===!0||!!Ee.value))return!1;const a=dn({isNew:s.areaDraftIsNew===!0,areaId:String(s.areaDraftId||s.areaSelectedId||"").trim(),name:s.areaDraftName,description:s.areaDraftDescription,tags:Ho(s.areaDraftTags),gaList:s.areaDraftGaList||[],llmPrompt:s.areaLlmPrompt});if(s.areaDraftIsNew===!0){const g=dn({isNew:!0,areaId:"",name:"New Area",description:"",tags:[],gaList:[],llmPrompt:""});return a!==g}const r=Ee.value;if(!r)return!1;const c=dn({isNew:!1,areaId:String(r.id||"").trim(),name:String(r.name||""),description:String(r.customDescription||""),tags:Array.isArray(r.tags)?r.tags:[],gaList:Array.isArray(r.gaList)?r.gaList:[],llmPrompt:""});return a!==c}),gn=j(()=>Array.isArray(s.stateData&&s.stateData.anomalies)?s.stateData.anomalies.slice().reverse():[]),hn=j(()=>{const n=Array.isArray(xe.value.topGAs)?xe.value.topGAs:[],a=xe.value&&typeof xe.value.gaLabels=="object"?xe.value.gaLabels:{};return n.slice(0,10).map(r=>{const c=r&&typeof r=="object"?r:{},g=String(c.ga||"").trim(),D=String(c.label||"").trim(),N=g?String(a[g]||"").trim():"";return Object.assign({},c,{ga:g,label:D||N})})}),Ds=j(()=>{const n=xe.value&&xe.value.byEvent&&typeof xe.value.byEvent=="object"?xe.value.byEvent:{};return Object.keys(n).map(a=>({name:a,count:Number(n[a]||0)})).filter(a=>a.count>0).sort((a,r)=>r.count-a.count)}),dl=j(()=>Math.max(...Ds.value.map(n=>n.count),1)),mn=j(()=>tl(s.stateData)),na=j(()=>al(mn.value)),ul=j(()=>{const n=String(s.flowSearch||"").trim().toLowerCase();return mn.value.nodes.slice().filter(a=>s.flowShowUniversalNodes===!0||!un(a)).sort((a,r)=>String(a.id||"").localeCompare(String(r.id||""))).filter(a=>n?`${a.id} ${a.subtitle||""}`.toLowerCase().includes(n):!0).slice(0,120)}),st=j(()=>xe.value&&xe.value.busConnection&&typeof xe.value.busConnection=="object"?xe.value.busConnection:null),cl=j(()=>{const n=xe.value||{};if(!Object.keys(n).length)return"No data available.";const a=n.counters||{},r=[];return r.push(ta.value.name||_s.value?.name||"KNX AI"),r.push(`Analysis window: ${Number(n.meta?.analysisWindowSec||0)}s`),r.push(`Telegrams: ${Number(a.telegrams||0)} | Rate: ${Number(a.overallRatePerSec||0)}/s`),r.push(`Echoed: ${Number(a.echoed||0)} | Repeat: ${Number(a.repeated||0)} | Unknown DPT: ${Number(a.unknownDpt||0)}`),st.value&&r.push(`Bus: ${String(st.value.currentState||"unknown")} | Connected: ${Number(st.value.connectedPct||0)}% | Disconnected: ${Number(st.value.disconnectedPct||0)}%`),r.join(`
3
- `)}),fl=j(()=>{const n=st.value;return!n||!Array.isArray(n.segments)?[]:n.segments.map((a,r)=>{const c=Math.max(0,Math.min(1,Number(a&&a.ratioStart)||0)),g=Math.max(0,Math.min(1,Number(a&&a.ratioWidth)||0));return{key:`${r}-${a?.startedAt||""}`,left:`${(c*100).toFixed(3)}%`,width:`${Math.max(g*100,.4).toFixed(3)}%`,title:`${a?.state==="connected"?"Connected":"Disconnected"} | ${Ps(a?.startedAt)} -> ${Ps(a?.endedAt)} | ${Ca(a?.durationSec||0)}`,className:a?.state==="connected"?"segment-connected":"segment-disconnected"}}).filter(a=>Number.parseFloat(a.width)>0)}),pl=j(()=>s.chatMessages.map((n,a)=>({key:`${a}-${n.kind}`,kind:n.kind,rawText:H(n.text),html:n.kind==="assistant"?ws(n.text):""})));De(()=>s.selectedNodeId,n=>{ea(Ei,n||""),s.areaSelectedId="",s.testAreaSelectedId=x(n||"")}),De(()=>s.autoRefresh,n=>{ka(Gi,n)}),De(()=>s.voiceEnabled,n=>{ka(Mi,n),n!==!0&&Na()}),De(ve,n=>{ka(Oi,n)}),De(()=>s.activeTab,n=>{ea(Lb,n||"overview")}),De(()=>s.settingsTab,n=>{ea(Fi,n||"config")}),De(()=>s.flowMaxNodes,n=>{s.flowMaxNodes=Math.max(4,Math.min(32,Number(n)||14)),M()}),De(()=>(s.flowSelectedGa||[]).join("|"),()=>{M()}),De(()=>s.flowShowUniversalNodes,n=>{n!==!0&&(s.flowSelectedGa=(s.flowSelectedGa||[]).filter(a=>{const r=mn.value.nodes.find(c=>c.id===a);return!un(r)})),M()}),De(()=>ye.value.map(n=>n.id).join("|"),()=>{if(!ye.value.length){s.areaSelectedId="",s.testAreaSelectedId="",s.activeTab==="tests"&&(s.activeTab="areas");return}if(s.areaDraftIsNew===!0&&!String(s.areaSelectedId||"").trim()){const r=String(s.testAreaSelectedId||"").trim();if(k())return;(!r||!ye.value.find(c=>c.id===r))&&(s.testAreaSelectedId=ye.value[0].id);return}const n=String(s.areaSelectedId||"").trim();n&&!ye.value.find(r=>r.id===n)&&(s.areaSelectedId="");const a=String(s.testAreaSelectedId||"").trim();k()||(!a||!ye.value.find(r=>r.id===a))&&(s.testAreaSelectedId=ye.value[0].id)}),De(()=>s.testAreaSelectedId,n=>{s.selectedNodeId&&C(s.selectedNodeId,n||"")}),De(()=>Ee.value?JSON.stringify({id:Ee.value.id,name:Ee.value.name,customDescription:Ee.value.customDescription||"",tags:Ee.value.tags||[]}):"",()=>{if(s.areaDraftIsNew===!0&&!String(s.areaSelectedId||"").trim())return;const n=Ee.value;if(!n){s.areaDraftId="",s.areaDraftName="",s.areaDraftDescription="",s.areaDraftTags="",s.areaDraftGaList=[],s.areaLlmPrompt="",s.areaLlmError="",s.areaDraftIsNew=!1;return}s.areaDraftId=String(n.id||""),s.areaDraftName=String(n.name||""),s.areaDraftDescription=String(n.customDescription||""),s.areaDraftTags=Array.isArray(n.tags)?n.tags.join(", "):"",s.areaDraftGaList=Array.isArray(n.gaList)?n.gaList.slice():[],s.areaLlmPrompt="",s.areaLlmError="",s.areaDraftIsNew=!1}),De(()=>Gt.value?Gt.value.id:"",async(n,a)=>{if(!n||!s.selectedNodeId){s.testPlanCatalog=null,s.testPlanCatalogError="";return}a&&n!==a&&(s.testPlanRunConfirmOpen=!1,s.testPlanDraft&&!s.testPlanSelectedId&&(s.testPlanDraft.areaId=String(n||""),s.testPlanDraft.areaName=Gt.value?String(Gt.value.path||Gt.value.name||""):"")),await Mr()}),De(()=>ba.value.map(n=>n.id).join("|"),()=>{if(!ba.value.length){s.profileSelectedId="";return}s.profileDraftMode!==!0&&(!s.profileSelectedId||!ba.value.find(n=>n.id===s.profileSelectedId))&&(s.profileSelectedId=ba.value[0].id)}),De(()=>yt.value?JSON.stringify({id:yt.value.id,name:yt.value.name,description:yt.value.description,targetTags:yt.value.targetTags||[],minActivityPct:yt.value.minActivityPct,maxSilentPct:yt.value.maxSilentPct,maxAnomalies:yt.value.maxAnomalies,builtIn:yt.value.builtIn===!0}):"",()=>{const n=yt.value;if(!n){s.profileDraftId="",s.profileDraftName="",s.profileDraftDescription="",s.profileDraftTargetTags="",s.profileDraftMinActivityPct=20,s.profileDraftMaxSilentPct=60,s.profileDraftMaxAnomalies=2;return}s.profileDraftId=String(n.id||""),s.profileDraftName=String(n.name||""),s.profileDraftDescription=String(n.description||""),s.profileDraftTargetTags=Array.isArray(n.targetTags)?n.targetTags.join(", "):"",s.profileDraftMinActivityPct=Number(n.minActivityPct||20),s.profileDraftMaxSilentPct=Number(n.maxSilentPct||60),s.profileDraftMaxAnomalies=Number(n.maxAnomalies||2)}),De(()=>ya.value.map(n=>n.id).join("|"),()=>{if(!ya.value.length){s.actuatorPresetSelectedId="";return}s.actuatorDraftMode!==!0&&(!s.actuatorPresetSelectedId||!ya.value.find(n=>n.id===s.actuatorPresetSelectedId))&&(s.actuatorPresetSelectedId=ya.value[0].id)}),De(()=>lt.value?JSON.stringify({id:lt.value.id,name:lt.value.name,description:lt.value.description,commandGA:lt.value.commandGA,commandDPT:lt.value.commandDPT,commandPayload:lt.value.commandPayload,statusGA:lt.value.statusGA,statusDPT:lt.value.statusDPT,statusWriteTimeoutMs:lt.value.statusWriteTimeoutMs,statusResponseTimeoutMs:lt.value.statusResponseTimeoutMs}):"",()=>{const n=lt.value;if(!n){s.actuatorDraftId="",s.actuatorDraftName="",s.actuatorDraftDescription="",s.actuatorDraftCommandGA="",s.actuatorDraftCommandDPT="",s.actuatorDraftCommandPayload="",s.actuatorDraftStatusGA="",s.actuatorDraftStatusDPT="",s.actuatorDraftStatusWriteTimeoutMs=5e3,s.actuatorDraftStatusResponseTimeoutMs=5e3;return}s.actuatorDraftId=String(n.id||""),s.actuatorDraftName=String(n.name||""),s.actuatorDraftDescription=String(n.description||""),s.actuatorDraftCommandGA=String(n.commandGA||""),s.actuatorDraftCommandDPT=String(n.commandDPT||""),s.actuatorDraftCommandPayload=String(n.commandPayload||""),s.actuatorDraftStatusGA=String(n.statusGA||""),s.actuatorDraftStatusDPT=String(n.statusDPT||""),s.actuatorDraftStatusWriteTimeoutMs=Number(n.statusWriteTimeoutMs||5e3),s.actuatorDraftStatusResponseTimeoutMs=Number(n.statusResponseTimeoutMs||5e3)}),De(()=>vt.value.map(n=>n.id).join("|"),()=>{if(!vt.value.length){s.testPlanSelectedId="";return}s.testPlanSelectedId&&!vt.value.find(n=>n.id===s.testPlanSelectedId)&&(s.testPlanSelectedId="")}),De(()=>aa.value.map(n=>n.id).join("|"),()=>{if(!aa.value.length){s.selectedTestResultId="";return}(!s.selectedTestResultId||!aa.value.find(n=>n.id===s.selectedTestResultId))&&(s.selectedTestResultId=String(aa.value[0].id||"")),s.liveTestResultId&&qa.value.some(n=>String(n&&n.id?n.id:"")===s.liveTestResultId)&&s.testPlanRunning!==!0&&(s.liveTestResultId="")}),De(()=>`${s.selectedTestResultId}|${s.activeTab}`,()=>{s.activeTab!=="results"||!s.selectedTestResultId||requestAnimationFrame(()=>{const n=document.querySelector(".results-page-list .area-list-item.active");n&&typeof n.scrollIntoView=="function"&&n.scrollIntoView({block:"nearest",behavior:"smooth"})})});function vn(n,a){s.chatMessages.push({kind:n,text:a})}function gl(){s.chatMessages=[]}function hl(n,a=null){const r=Array.isArray(n)?n:[];return{totalSteps:Math.max(r.length,Number(a||0)),pass:r.filter(g=>g&&g.status==="pass").length,warn:r.filter(g=>g&&g.status==="warn").length,fail:r.filter(g=>g&&g.status==="fail").length}}function ml(n){const a=[];return Number(n&&n.fail)>0&&a.push("At least one feedback object returned an incoherent value. Check the actuator/status pairing in ETS first."),Number(n&&n.warn)>0&&a.push("Some steps did not receive feedback in time. Verify the status group address and the actuator programming."),a.length||a.push("The selected active test completed with coherent feedback on all verified steps."),a}function bn({plan:n,area:a,stepResults:r,reportId:c=""}){const g=hl(r,Array.isArray(n&&n.steps)?n.steps.length:0),D=g.fail>0?"fail":g.warn>0?"warn":"pass";return{id:String(c||`${n.id||"plan"}:${Date.now()}`),generatedAt:new Date().toISOString(),mode:"ai_test_plan",overallStatus:D,name:n.name,description:n.description,prompt:n.prompt,area:a,metrics:g,steps:r,suggestions:ml(g)}}function Is(n){return!n||typeof n!="object"?"Test result":String(n.name||n.profile?.name||"Test result")}function Rs(n){return!n||typeof n!="object"?"":String(n.area?.path||n.area?.name||n.area?.id||"")}function Ja(n){const a=String(n&&n.mode?n.mode:"").trim().toLowerCase();return a==="ai_test_plan"?"Test Plan":a==="active_test"?"Actuator":a==="read_only"?"Read-only":a||"Test"}function yn(n){const a=n&&n.metrics&&typeof n.metrics=="object"?n.metrics:{};return String(n&&n.mode?n.mode:"")==="read_only"?[{label:"Total GA",value:Number(a.totalGAs||0)},{label:"Active GA",value:Number(a.activeGaCount||0)},{label:"Silent GA",value:Number(a.silentGaCount||0)},{label:"Anomalies",value:Number(a.anomalyCount||0)}]:String(n&&n.mode?n.mode:"")==="active_test"?[{label:"Command GA",value:n&&n.command&&n.command.ga?n.command.ga:"n/a"},{label:"Status GA",value:n&&(n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga)?n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga:"n/a"},{label:"Status",value:n&&n.overallStatus?n.overallStatus:"n/a"},{label:"Generated",value:xt(n&&n.generatedAt?n.generatedAt:"")||"n/a"}]:[{label:"Total Steps",value:Number(a.totalSteps||0)},{label:"Pass",value:Number(a.pass||0)},{label:"Warn",value:Number(a.warn||0)},{label:"Fail",value:Number(a.fail||0)}]}function Ft(n){if(n==null||n==="")return"n/a";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function An(n,a,r="n/a"){const c=String(a||"").trim(),g=n==null?"":String(n);if(!c)return g||r;const D=Dn(g,c),N=ra(c).find(z=>String(z.value)===String(D));return N&&N.label?N.label:g||r}function Dr(n){if(!n||typeof n!="object")return"n/a";const a=n.ga||"n/a";if(n.ok===!0){const r=n.payloadLabel||Ft(n.payload),c=n.coherent===!1?"mismatch":"ok";return`${a} / ${r} / ${c}`}return`${a} / ${n.error||"timeout"}`}function Sn(n){return xt(n||"")||"n/a"}function vl(n,a="report"){return String(n||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||a}function Ir({command:n,statusWrite:a,statusResponse:r,statusRead:c,expectedPayloadLabel:g,expectedPayload:D}){const N=r||c;return[{title:"Command",items:[{label:"Command",value:`${n?.ga||"n/a"} / ${n?.payloadLabel||Ft(n?.payload)}`},{label:"Command Sent",value:Sn(n?.sentAt)}]},{title:"Spontaneous Write From Status GA",items:[{label:"Result",value:Dr(a)},{label:"Expected",value:a?.expectedPayloadLabel||g||Ft(D)},{label:"Received At",value:Sn(a?.at)},{label:"Event",value:a?.event||"n/a"}]},{title:"Active Read Request To Status GA",items:[{label:"Result",value:Dr(N)},{label:"Expected",value:N?.expectedPayloadLabel||g||Ft(D)},{label:"Received At",value:Sn(N?.at)},{label:"Event",value:N?.event||"n/a"}]}]}function Za(n){return!n||typeof n!="object"?[]:Array.isArray(n.steps)&&n.steps.length?n.steps.map(a=>{const r=a.kind==="wait"?[{label:"Wait",value:`${Number(a.delayMs||0)} ms`},{label:"Reason",value:a.reason||"Pause before next action"}]:[];return{id:String(a.id||`${n.id}-step`),title:a.title||a.id||"Step",status:a.status||"pass",message:a.message||a.description||"",details:r,detailGroups:a.kind==="wait"?[]:Ir({command:a.command,statusWrite:a.statusWrite,statusResponse:a.statusResponse,statusRead:a.statusRead,expectedPayloadLabel:a.expectedPayloadLabel,expectedPayload:a.expectedPayload})}}):Array.isArray(n.checks)&&n.checks.length?n.checks.map(a=>({id:String(a.id||`${n.id}-check`),title:a.title||a.id||"Check",status:a.status||"pass",message:a.message||"",details:[{label:"Metrics",value:Ft(a.metrics||{})},{label:"Sample",value:Ft(a.sample||[])}]})):String(n.mode||"")==="active_test"?[{id:String(n.id||"active-test"),title:n.name||"Actuator Test",status:n.overallStatus||"pass",message:n.overallStatus==="pass"?"Both feedback checks passed.":n.overallStatus==="warn"?"One feedback check passed and one failed.":"Both feedback checks failed.",details:[],detailGroups:Ir({command:n.command,statusWrite:n.statusWrite,statusResponse:n.statusResponse,statusRead:n.statusRead,expectedPayloadLabel:n.statusResponse?.expectedPayloadLabel||n.statusWrite?.expectedPayloadLabel||n.statusRead?.expectedPayloadLabel,expectedPayload:n.statusRead?.expectedPayload})}]:[]}function Ya(n){return Array.isArray(n&&n.suggestions)?n.suggestions:[]}function bl(n){const a=n&&n.source&&typeof n.source=="object"?n.source:{},r=String(n&&n.mode?n.mode:"").trim().toLowerCase(),c=String(a.areaId||n?.area?.id||"").trim();return r==="ai_test_plan"?{type:"ai_test_plan",planId:String(a.planId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:r==="read_only"?{type:"profile",profileId:String(a.profileId||n?.profile?.id||"").trim(),areaId:c}:r==="active_test"?{type:"actuator_test",presetId:String(a.presetId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:{type:"",areaId:c}}async function Rr(){const n=ne.value;if(!n||typeof n!="object"){_("No test result selected to export");return}try{const{jsPDF:a}=await tf(async()=>{const{jsPDF:_e}=await import("./chunk-jspdf.es.min.js").then(At=>At.j);return{jsPDF:_e}},[],import.meta.url),r=new a({orientation:"portrait",unit:"pt",format:"a4"}),c=r.internal.pageSize.getWidth(),g=r.internal.pageSize.getHeight(),D=42,N=42,z=44,$=42,Q=c-D-N;let X=z;const fe=(_e=14)=>{X+_e<=g-$||(r.addPage(),X=z)},Z=(_e,{size:At=11,bold:Ot=!1,indent:zt=0,color:$t=[35,41,52],lineHeight:xs=14,gapAfter:Es=0}={})=>{const Qa=String(_e||"").trim();if(!Qa)return;r.setFont("helvetica",Ot?"bold":"normal"),r.setFontSize(At),r.setTextColor($t[0],$t[1],$t[2]);const Gs=r.splitTextToSize(Qa,Math.max(80,Q-zt));for(const Cn of Gs)fe(xs),r.text(String(Cn),D+zt,X),X+=xs;Es>0&&(X+=Es)},Y=()=>{fe(12),r.setDrawColor(210,214,222),r.line(D,X,c-N,X),X+=12},ee=Is(n),ge=xt(new Date().toISOString())||new Date().toISOString(),ia=xt(n.generatedAt||"")||String(n.generatedAt||"n/a"),w=Rs(n)||"n/a",V=Ja(n),ae=String(n.overallStatus||"n/a"),Fe=yn(n),je=Za(n),Qe=Ya(n);Z("KNX AI Test Result",{size:17,bold:!0,color:[20,28,39],lineHeight:20}),Z(ee,{size:14,bold:!0,color:[20,28,39],lineHeight:17,gapAfter:4}),Z(`Exported: ${ge}`,{size:10,color:[88,96,113]}),Z(`Generated: ${ia}`,{size:10,color:[88,96,113]}),Z(`Mode: ${V}`,{size:10,color:[88,96,113]}),Z(`Status: ${ae}`,{size:10,color:[88,96,113]}),Z(`Area: ${w}`,{size:10,color:[88,96,113]}),Z(`Report ID: ${String(n.id||"n/a")}`,{size:10,color:[88,96,113],gapAfter:2}),Y(),Fe.length&&(Z("Metrics",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Fe.forEach(_e=>{Z(`${_e.label}: ${Ft(_e.value)}`,{size:10,color:[35,41,52]})}),X+=4,Y()),Z(`Checks (${je.length})`,{size:12,bold:!0,color:[20,28,39],gapAfter:2}),je.length?je.forEach((_e,At)=>{Z(`${At+1}. ${_e.title||"Check"} [${String(_e.status||"n/a").toUpperCase()}]`,{size:11,bold:!0,color:[31,41,55]}),Z(_e.message||"No additional details available.",{size:10,color:[70,78,94]}),Array.isArray(_e.detailGroups)&&_e.detailGroups.length?_e.detailGroups.forEach(Ot=>{Z(Ot.title||"Details",{size:10,bold:!0,indent:12,color:[35,41,52]}),(Array.isArray(Ot.items)?Ot.items:[]).forEach($t=>{Z(`${$t.label}: ${Ft($t.value)}`,{size:10,indent:24,color:[70,78,94]})})}):(Array.isArray(_e.details)?_e.details:[]).forEach(zt=>{Z(`${zt.label}: ${Ft(zt.value)}`,{size:10,indent:12,color:[70,78,94]})}),X+=2}):Z("No detailed entries stored for this report yet.",{size:10,color:[88,96,113]}),Qe.length&&(X+=4,Y(),Z("Suggestions",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Qe.forEach((_e,At)=>{Z(`${At+1}. ${String(_e||"")}`,{size:10,color:[35,41,52]})}));const nt=new Date(n.generatedAt||Date.now()),oa=Number.isFinite(nt.getTime())?nt.toISOString().replace(/[:.]/g,"-"):String(Date.now()),Fa=`knx-ai-test-result-${vl(ee,"report")}-${oa}.pdf`;r.save(Fa),_(`PDF exported (${Fa})`)}catch(a){s.lastError=a&&a.message?a.message:"Failed to export PDF",_(s.lastError)}}function Nr(n,a,r=new Date().toISOString()){const c=n&&n.kind==="wait";return{id:n&&n.id?n.id:`step-${Date.now()}`,title:n&&n.title?n.title:"Test Step",description:n&&n.description?n.description:"",reason:n&&n.reason?n.reason:"",kind:n&&n.kind?n.kind:"write_and_verify",status:"warn",command:c?null:{ga:n&&n.commandGA?n.commandGA:"",dpt:n&&n.commandDPT?n.commandDPT:"",payload:n?n.commandPayload:void 0,sentAt:r},statusWrite:null,statusResponse:null,statusRead:null,expectedPayload:c?void 0:n?n.expectedPayload:void 0,delayMs:Number(n&&n.delayMs?n.delayMs:0),statusWriteTimeoutMs:c?0:Number(n&&n.statusWriteTimeoutMs?n.statusWriteTimeoutMs:0),statusResponseTimeoutMs:c?0:Number(n&&n.statusResponseTimeoutMs?n.statusResponseTimeoutMs:0),message:a&&a.message?a.message:"Failed to run step"}}async function kr(n){return Na(),await new Promise((a,r)=>{const c=URL.createObjectURL(n),g=new Audio(c);Ue=g;const D=()=>{Ue===g&&(Ue=null),g.onended=null,g.onerror=null,URL.revokeObjectURL(c)};g.onended=()=>{D(),a()},g.onerror=()=>{D(),r(new Error("Audio playback failed"))};const N=g.play();N&&typeof N.then=="function"&&N.catch(z=>{D(),r(z instanceof Error?z:new Error(String(z)))})})}function yl(n,a=null){const r=String(n||"").trim();return!r||!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps)?a:s.testPlanDraft.steps.find(c=>String(c&&c.id?c.id:"")===r)||a}function Cr(n,a=""){const r=`${String(n||"")} ${String(a||"")}`.trim().toLowerCase(),c=` ${r} `;if(!r)return String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it";const g=z=>z.some($=>c.includes($)),D=[{voice:"it",score:[g([" accendi "," spegni "," stato "," verifica "," coerente "," leggi "," apri "," chiudi "," attiva "," controlla "," area "," luce "," luci "," tapparella "," tapparelle "," clima "])?3:0,/[àèéìíîòóù]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"en",score:[g([" turn on "," turn off "," verify "," feedback "," status "," check "," read "," open "," close "," command "," area "," light "," lights "])?3:0].reduce((z,$)=>z+$,0)},{voice:"fr",score:[g([" allume "," éteins "," etat "," état "," vérifier "," ouvre "," ferme "," lumière "," lumières "," zone "])?3:0,/[àâçéèêëîïôûùüÿœ]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"de",score:[g([" einschalten "," ausschalten "," status "," prüfen "," öffne "," schließe "," licht "," bereich "])?3:0,/[äöüß]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"es",score:[g([" enciende "," apaga "," estado "," verifica "," abre "," cierra "," luz "," luces "," zona "])?3:0,/[áéíóúñü]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"pt",score:[g([" liga "," desliga "," estado "," verificar "," abre "," fecha "," luz "," luzes "," área "])?3:0,/[ãõâêôçáéíóú]/.test(r)?2:0].reduce((z,$)=>z+$,0)}];return D.sort((z,$)=>$.score-z.score),D[0]&&D[0].score>0?D[0].voice:String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it"}function Al(n={},a=null){const r=yl(n&&n.id?n.id:"",n),c=String(r&&r.title?r.title:"").trim(),g=String(r&&r.description?r.description:"").trim();return{text:`${Number.isInteger(a)&&a>0?`${a}. `:""}${c}`.trim(),voice:Cr(c,g)}}async function Sl(n={},a=null){if(s.voiceEnabled!==!0)return;const r=Al(n,a),c=String(r.text||"").trim();if(!c||!s.selectedNodeId)return;const g=await W(`${I("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,text:c,voice:r.voice,slow:!1})});await kr(g)}async function xr(n,a=""){if(s.voiceEnabled!==!0||!s.selectedNodeId)return;const r=String(n||"").trim();if(!r)return;const c=Cr(r,a),g=await W(`${I("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,text:r,voice:c,slow:!1})});await kr(g)}function wl(n){const a=u&&n.find(g=>g.id===u)?u:"",r=Ha(Ei,""),c=r&&n.find(g=>g.id===r)?r:"";return a||c||(n[0]?n[0].id:"")}async function wn({preserveSelection:n=!0}={}){s.loadingNodes=!0,_("Loading nodes...");try{const a=await E(I("nodes")),r=Array.isArray(a&&a.nodes)?a.nodes:[];if(s.nodes=r,!r.length){s.selectedNodeId="",s.stateData=null,s.lastError="No KNX AI nodes found.",_(s.lastError);return}const c=n&&s.selectedNodeId&&r.find(g=>g.id===s.selectedNodeId)?s.selectedNodeId:wl(r);s.selectedNodeId=c,s.lastError="",_("Ready")}catch(a){s.lastError=a.message||"Failed to load nodes",_(s.lastError)}finally{s.loadingNodes=!1}}async function Lt({fresh:n=!1}={}){if(!(!s.selectedNodeId||s.loadingState)){s.loadingState=!0,n&&_("Loading...");try{const a=s.testPlanRunning===!0&&s.liveTestResultId?Et(s.stateData&&s.stateData.testPlanReport?s.stateData.testPlanReport:null,null):null,r=await E(I(`state?nodeId=${encodeURIComponent(s.selectedNodeId)}&fresh=${n?1:0}`));a&&a.id===s.liveTestResultId&&(r.testPlanReport=a),s.stateData=r,is(()=>{s.areaDraftIsNew!==!0&&s.areaSelectedId&&!ye.value.find(c=>c.id===s.areaSelectedId)&&(s.areaSelectedId=""),!k()&&!s.testAreaSelectedId&&ye.value[0]&&(s.testAreaSelectedId=ye.value[0].id)}),s.lastError="",_("Ready")}catch(a){s.lastError=a.message||"Failed to load state",_(s.lastError)}finally{s.loadingState=!1}}}async function Pl(){await wn({preserveSelection:!0}),await Lt({fresh:!0}),await Ga()}async function Tl(){gl(),s.selectedTestResultId="",s.liveTestResultId="",s.testResultFocusMode=!1,s.testAreaSelectedId=x(s.selectedNodeId),await Lt({fresh:!0}),await Ga()}function Er(){s.selectedTestResultId="",s.testResultFocusMode=!1,s.testPlanSelectedId="",s.testPlanDraft=null,s.testPlanPrompt="",s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.testPlanUnsavedConfirmOpen=!1,s.showAiPlanner=!0,s.testTemplateBuilderFocus=!1,!k()&&!s.testAreaSelectedId&&ye.value[0]&&(s.testAreaSelectedId=ye.value[0].id),Nn(),Rn()}function _l(){s.showAiPlanner=!0,s.testTemplateBuilderFocus=!0}function Dl(){s.testTemplateBuilderFocus=!1,s.showAiPlanner=!1}function Il(){s.showAiAreaBuilder=!0,s.areaBuilderFocus=!0}function Rl(){s.areaBuilderFocus=!1,s.showAiAreaBuilder=!1}function Pn(){s.areaSelectedId="",s.areaDraftIsNew=!1,s.areaDraftId="",s.areaDraftName="",s.areaDraftDescription="",s.areaDraftTags="",s.areaDraftGaList=[],s.areaLlmPrompt="",s.areaLlmError="",s.areaSearch="",s.areaSearchOpen=!1,s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1,s.areaUnsavedConfirmOpen=!1}function Nl(){if(ll.value){s.areaUnsavedConfirmOpen=!0;return}Pn(),_("Area editor closed")}function Gr(){s.areaUnsavedConfirmOpen=!1}function kl(){s.areaUnsavedConfirmOpen=!1,Pn(),_("Area editor closed")}function Cl(){s.testPlanRunning||kn(()=>{Er(),s.testPlanSearchOpen=!1,_("Test editor closed")},"close the current test editor")}function Fr(n){const a=String(n||"").trim();a!=="node"&&a!=="config"||(s.settingsTab=a)}function Ea(n){const a=String(n||"").trim();if(a){if(a==="tests"&&ye.value.length===0){_("Define at least one area before using Tests");return}if(a==="areas"){const r=!!String(s.areaSelectedId||"").trim(),c=s.areaDraftIsNew===!0;!r&&!c&&Pn()}if(a==="tests"){const r=!!String(s.testPlanSelectedId||"").trim(),c=!!String(s.selectedTestResultId||"").trim(),g=!!s.testPlanDraft;!r&&!c&&!g&&Er()}s.activeTab!==a?s.activeTab=a:(s.activeTab="",is(()=>{s.activeTab=a})),h()}}async function Tn(n){const a=String(n||"").trim();if(!(!a||!s.selectedNodeId||s.deletingTestResultId)){s.deletingTestResultId=a;try{const r=await E(I("test-results/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,reportId:a})}),c=Array.isArray(r&&r.testResults)?r.testResults:[];s.stateData=Object.assign({},s.stateData||{},{testResults:c}),s.selectedTestResultId===a&&(s.selectedTestResultId=c[0]&&c[0].id?String(c[0].id):"",c.length||(s.testResultFocusMode=!1)),s.liveTestResultId===a&&(s.liveTestResultId=""),_("Test result deleted")}catch(r){s.lastError=r.message||"Failed to delete test result",_(s.lastError)}finally{s.deletingTestResultId=""}}}function Ns(n,{openMenu:a=!0,activateTestsTab:r=!1,activateResultsTab:c=!1,resultOnly:g=!0}={}){const D=String(n||"").trim();if(!D)return;a&&(s.testResultsMenuOpen=!0);const N=c?"results":r?"tests":"",z=()=>{N&&(s.activeTab=N),s.selectedTestResultId=D,s.testResultFocusMode=g===!0,is(()=>{const $=document.querySelector(".results-page-list .area-list-item.active");$&&typeof $.scrollIntoView=="function"&&$.scrollIntoView({block:"nearest",behavior:"smooth"})})};s.selectedTestResultId===D&&(!N||s.activeTab===N)||z()}function Lr(){const n=ne.value;if(!n)return;if(!ye.value.length){_("Define at least one area before using Tests");return}const a=bl(n);if(s.activeTab="tests",s.testResultFocusMode=!1,a.type==="ai_test_plan"&&a.planId){const r=vt.value.find(c=>c&&c.id===a.planId);if(r){Ur(r),_(`Opened source plan "${r.name||r.id}"`);return}}if(a.type==="profile"){_("Returned to the Tests page for the source read-only profile.");return}if(a.type==="actuator_test"){_("Returned to the Tests page for the source actuator test.");return}_("Returned to the Tests page.")}async function xl(n){if(!s.selectedNodeId||!n||typeof n!="object")return null;const a=await E(I("test-results/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,report:n})});return s.stateData=Object.assign({},s.stateData||{},{testResults:a.testResults||qa.value,testPlanReport:a.report&&a.report.mode==="ai_test_plan"?a.report:ct.value,actuatorTestReport:a.report&&a.report.mode==="active_test"?a.report:rl.value,profileReport:a.report&&a.report.mode==="read_only"?a.report:nl.value}),a&&a.report&&a.report.id&&(s.liveTestResultId="",Ns(a.report.id,{openMenu:!0,activateResultsTab:!0,resultOnly:!0})),a}async function _n(n=""){const a=String(n||"").trim(),r=String(s.chatDraft||"").trim(),c=a||r;if(!(!c||!s.selectedNodeId)){vn("user",c),a||(s.chatDraft=""),s.asking=!0,_("Asking...");try{const g=await E(I("ask"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,question:c})});vn("assistant",g&&g.answer!==void 0?g.answer:""),_("Ready")}catch(g){vn("error",g.message||"Ask failed"),_(g.message||"Ask failed")}finally{s.asking=!1}}}async function El(){const n=Ee.value;if(!s.selectedNodeId||s.areaSaving||!s.areaDraftIsNew&&!n)return;const a=s.areaDraftIsNew===!0;s.areaSaving=!0,_(a?"Creating area...":"Saving area...");try{const c=await E(I(a?"areas/create":"areas/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:s.areaDraftIsNew?void 0:n.id,name:s.areaDraftName,description:s.areaDraftDescription,tags:String(s.areaDraftTags||"").split(",").map(g=>String(g||"").trim()).filter(Boolean),gaList:s.areaDraftGaList||[]})});c&&c.areas?(s.stateData=Object.assign({},s.stateData||{},{areas:c.areas}),c.areaId&&(s.areaSelectedId=c.areaId),s.areaLlmPrompt="",s.areaLlmError="",s.areaDraftIsNew=!1):await Lt({fresh:!0}),_(a?"Area created":"Area saved")}catch(r){s.lastError=r.message||"Failed to save area",_(s.lastError)}finally{s.areaSaving=!1}}async function Gl(){const n=Ee.value;if(!(!n||!s.selectedNodeId||s.areaSaving)){s.areaSaving=!0,_("Resetting area...");try{const a=await E(I("areas/reset"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id})});a&&a.areas?s.stateData=Object.assign({},s.stateData||{},{areas:a.areas}):await Lt({fresh:!0}),_("Area reset")}catch(a){s.lastError=a.message||"Failed to reset area",_(s.lastError)}finally{s.areaSaving=!1}}}async function Fl(){const n=Ee.value;if(!(!n||!s.selectedNodeId||s.areaSaving)){s.areaSaving=!0,_("Deleting area...");try{const a=await E(I("areas/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id})});if(a&&a.areas){s.stateData=Object.assign({},s.stateData||{},{areas:a.areas});const r=Array.isArray(a.areas&&a.areas.suggested)?a.areas.suggested:[];s.areaDraftIsNew=!1,s.areaSelectedId=r[0]&&r[0].id?r[0].id:""}else await Lt({fresh:!0});_("Area deleted")}catch(a){s.lastError=a.message||"Failed to delete area",_(s.lastError)}finally{s.areaSaving=!1}}}async function Mr(){const n=Gt.value;if(!n||!s.selectedNodeId){s.testPlanCatalog=null,s.testPlanCatalogError="";return}s.testPlanCatalogLoading=!0,s.testPlanCatalogError="";try{const a=await E(I("test-plans/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id})});s.testPlanCatalog=a&&a.catalog?a.catalog:null,a&&a.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:a.testPlans}))}catch(a){s.testPlanCatalog=null,s.testPlanCatalogError=a.message||"Failed to load area command/status catalog"}finally{s.testPlanCatalogLoading=!1}}async function Ga(){if(!(!s.selectedNodeId||s.gaCatalogLoading)){s.gaCatalogLoading=!0;try{const n=await E(I("areas/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId})});s.gaCatalog=Array.isArray(n&&n.gaCatalog)?n.gaCatalog:[]}catch(n){s.lastError=n.message||"Failed to load GA catalog",_(s.lastError)}finally{s.gaCatalogLoading=!1}}}function Ll(n){const a=String(n||"").trim();a&&((s.areaDraftGaList||[]).includes(a)||(s.areaDraftGaList=[...s.areaDraftGaList||[],a]))}function Or(n){const a=String(n||"").trim().toLowerCase(),r=o.find(c=>c.value===a);return r?r.label:a==="auto"?"Auto":"Command"}function zr(n){const a=n&&typeof n=="object"?n:{},r=String(a.path||a.name||"Area").trim(),c=String(a.kind||"").trim(),g=Number(a.gaCount||0),D=Number(a.activeGaCount||0),N=[c,`${g} GA`,`active ${D}`].filter(Boolean).join(" | ");return N?`${r} ${N}`:r}function Ml(n){const a=n&&typeof n=="object"?n:null;!a||!a.id||(s.areaDraftIsNew=!1,s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1,s.areaSelectedId=a.id,s.areaSearch="",s.areaSearchOpen=!1)}function Ol(){setTimeout(()=>{s.areaSearchOpen=!1},150)}function $r(n){const a=n&&typeof n=="object"?n:{},r=String(a.name||"Plan").trim(),c=String(a.areaName||a.areaId||"").trim(),g=Number(a.steps&&a.steps.length?a.steps.length:0),D=[c,`${g} steps`].filter(Boolean).join(" | ");return D?`${r} ${D}`:r}function zl(n){const a=n&&typeof n=="object"?n:null;!a||!a.id||(pd(a),s.testPlanSearch="",s.testPlanSearchOpen=!1)}function $l(){setTimeout(()=>{s.testPlanSearchOpen=!1},150)}function Bl(){return re(A.value,"en")}function Kl(n){const a=String(n||"").trim();a&&(s.areaDraftGaList=(s.areaDraftGaList||[]).filter(r=>r!==a))}async function Vl(n,a){const r=String(n||"").trim();if(!(!s.selectedNodeId||!r||s.areaGaRoleSavingGa===r)){s.areaGaRoleSavingGa=r,_(`Saving role for ${r}...`);try{const c=await E(I("areas/ga-role/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,ga:r,role:a})});Array.isArray(c&&c.gaCatalog)&&(s.gaCatalog=c.gaCatalog),c&&c.areas&&(s.stateData=Object.assign({},s.stateData||{},{areas:c.areas})),Gt.value&&Array.isArray(Gt.value.gaList)&&Gt.value.gaList.includes(r)&&await Mr(),_(`Role saved for ${r}`)}catch(c){s.lastError=c.message||"Failed to save GA role",_(s.lastError)}finally{s.areaGaRoleSavingGa=""}}}function Wl(){s.activeTab="areas",s.areaDraftIsNew=!0,s.areaSelectedId="",s.areaDraftId="",s.areaDraftName="New Area",s.areaDraftDescription="",s.areaDraftTags="",s.areaDraftGaList=[],s.areaLlmPrompt="",s.areaLlmError="",s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1}async function Ul(){const n=String(s.selectedNodeId||"").trim();if(!(s.areaLlmRegenerating||s.areaLlmBulkDeleting)){if(!n){s.areaLlmError="Select a KNX AI node first",_(s.areaLlmError);return}s.areaLlmRegenerating=!0,s.areaLlmError="",_("Regenerating AI areas...");try{const a=await E(I("areas/regenerate-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})}),r=Array.isArray(a&&a.gaCatalog);if(r&&(s.gaCatalog=a.gaCatalog),a&&(a.areas||a.profiles||a.actuatorTests||a.testPlans)){const c=Object.assign({},s.stateData||{});a.areas&&(c.areas=a.areas),a.profiles&&(c.profiles=a.profiles),a.actuatorTests&&(c.actuatorTests=a.actuatorTests),a.testPlans&&(c.testPlans=a.testPlans),s.stateData=c}else await Lt({fresh:!0});r||await Ga(),_(`AI areas regenerated (${Number(a&&a.generatedCount?a.generatedCount:0)})`)}catch(a){s.areaLlmError=a.message||"Failed to regenerate AI areas",_(s.areaLlmError)}finally{s.areaLlmRegenerating=!1}}}async function jl(){const n=String(s.selectedNodeId||"").trim();if(s.areaLlmRegenerating||s.areaLlmBulkDeleting)return;if(!n){s.areaLlmError="Select a KNX AI node first",_(s.areaLlmError);return}const a=Number(br.value||0);if(a<=0){_("No AI areas to delete");return}if(window.confirm(`Delete all AI-generated areas (${a})?`)){s.areaLlmBulkDeleting=!0,s.areaLlmError="",_("Deleting AI areas...");try{const c=await E(I("areas/delete-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})});if(Array.isArray(c&&c.gaCatalog)&&(s.gaCatalog=c.gaCatalog),c&&(c.areas||c.profiles||c.actuatorTests||c.testPlans)){const g=Object.assign({},s.stateData||{});c.areas&&(g.areas=c.areas),c.profiles&&(g.profiles=c.profiles),c.actuatorTests&&(g.actuatorTests=c.actuatorTests),c.testPlans&&(g.testPlans=c.testPlans),s.stateData=g}else await Lt({fresh:!0});Array.isArray(c&&c.gaCatalog)||await Ga(),_(`AI areas deleted (${Number(c&&c.deletedCount?c.deletedCount:a)})`)}catch(c){s.areaLlmError=c.message||"Failed to delete AI areas",_(s.areaLlmError)}finally{s.areaLlmBulkDeleting=!1}}}async function Hl(){if(!s.selectedNodeId||s.areaLlmBusy)return;const n=String(s.areaLlmPrompt||"").trim();if(n){s.areaLlmBusy=!0,s.areaLlmError="",_("AI is selecting area GA...");try{const a=await E(I("areas/suggest-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,prompt:n,name:s.areaDraftName,description:s.areaDraftDescription,gaList:s.areaDraftGaList||[]})}),r=a&&a.suggestion?a.suggestion:null;if(Array.isArray(a&&a.gaCatalog)&&(s.gaCatalog=a.gaCatalog),!r||!Array.isArray(r.gaList)||!r.gaList.length)throw new Error("The AI did not return any group addresses");!String(s.areaDraftName||"").trim()&&r.name&&(s.areaDraftName=String(r.name)),!String(s.areaDraftDescription||"").trim()&&r.description&&(s.areaDraftDescription=String(r.description)),(!s.areaDraftTags||!String(s.areaDraftTags).trim())&&Array.isArray(r.tags)&&r.tags.length&&(s.areaDraftTags=r.tags.join(", ")),s.areaDraftGaList=Array.from(new Set([...s.areaDraftGaList||[],...r.gaList.map(c=>String(c||"").trim()).filter(Boolean)])),s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1,_(`AI added ${Number(r.gaList.length||0)} GA to the draft`)}catch(a){s.areaLlmError=a.message||"Failed to suggest area GA",_(s.areaLlmError)}finally{s.areaLlmBusy=!1}}}function Xl(n){if(n&&typeof n=="object"){s.testPlanPrompt=String(n.prompt||"").trim();return}s.testPlanPrompt=String(n||"").trim()}function Br(n){const a=String(n||"").trim();return a&&(Array.isArray(s.testPlanCatalog&&s.testPlanCatalog.pairs)?s.testPlanCatalog.pairs:[]).find(c=>c&&c.command&&c.command.ga===a)||null}function Kr(n){const a=String(n||"").trim();return fn.value.find(r=>r&&r.ga===a)||null}function ql(n){const a=String(n||"").trim();return Pr.value.find(r=>r&&r.ga===a)||null}function ra(n){const a=String(n||"").trim();if(!a)return[];const r=s.testPlanCatalog&&s.testPlanCatalog.dptOptionsById&&typeof s.testPlanCatalog.dptOptionsById=="object"?s.testPlanCatalog.dptOptionsById:{};return Array.isArray(r[a])?r[a]:[]}function Mt(n){return String(n||"").trim().normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}const Jl=[{type:"on",patterns:[/\bturn on\b/g,/\bturn(?:\s+\w+){1,4}\s+on\b/g,/\bswitch on\b/g,/\bswitch(?:\s+\w+){1,4}\s+on\b/g,/\bpower on\b/g,/\bpower(?:\s+\w+){1,4}\s+on\b/g,/\bstart\b/g,/\benable\b/g,/\bactivate\b/g,/\baccendi\b/g,/\battiva\b/g,/\ballume\b/g,/\bactive\b/g,/\beinschalten\b/g,/\baktivieren\b/g,/\benciende\b/g,/\bactivar\b/g,/\bliga\b/g,/\bativa\b/g,/\baan\b/g,/\binschakelen\b/g]},{type:"off",patterns:[/\bturn off\b/g,/\bturn(?:\s+\w+){1,4}\s+off\b/g,/\bswitch off\b/g,/\bswitch(?:\s+\w+){1,4}\s+off\b/g,/\bpower off\b/g,/\bpower(?:\s+\w+){1,4}\s+off\b/g,/\bdisable\b/g,/\bdeactivate\b/g,/\bshutdown\b/g,/\bspegni\b/g,/\bdisattiva\b/g,/\beteins\b/g,/\bdesactive\b/g,/\bausschalten\b/g,/\bdeaktivieren\b/g,/\bapaga\b/g,/\bdesactiva\b/g,/\bdesliga\b/g,/\bdesativa\b/g,/\buit\b/g,/\buitschakelen\b/g]},{type:"open",patterns:[/\bopen\b/g,/\braise\b/g,/\blift\b/g,/\bmove up\b/g,/\bapri\b/g,/\balza\b/g,/\bsolleva\b/g,/\bouvre\b/g,/\bmonte\b/g,/\boffnen\b/g,/\bhoch\b/g,/\bauf\b/g,/\babre\b/g,/\bsube\b/g,/\babrir\b/g,/\bsobe\b/g,/\bopenen\b/g,/\bomhoog\b/g]},{type:"close",patterns:[/\bclose\b/g,/\blower\b/g,/\bmove down\b/g,/\bchiudi\b/g,/\babbassa\b/g,/\bferme\b/g,/\bdescends?\b/g,/\bschliessen\b/g,/\brunter\b/g,/\bzu\b/g,/\bcierra\b/g,/\bbaja\b/g,/\bfechar\b/g,/\bdesce\b/g,/\bsluiten\b/g,/\bomlaag\b/g]},{type:"stop",patterns:[/\bstop\b/g,/\bhalt\b/g,/\bpause\b/g,/\bferma\b/g,/\barresta\b/g,/\barrete\b/g,/\bstoppe\b/g,/\banhalten\b/g,/\bstopp\b/g,/\bdeten\b/g,/\bparar\b/g,/\bpare\b/g,/\bstoppen\b/g]}];function Zl(n){const a=Mt(n);if(!a)return"";const r=[];return Jl.forEach(c=>{c.patterns.forEach(g=>{g.lastIndex=0;let D;for(;(D=g.exec(a))!==null;)r.push({type:c.type,index:D.index})})}),r.sort((c,g)=>c.index-g.index),r[0]?r[0].type:""}function Yl(n){return["on","open"].includes(String(n||"").trim().toLowerCase())}function Ql(n){return["off","close","stop"].includes(String(n||"").trim().toLowerCase())}function Dn(n,a,r=""){const c=ra(a);if(!c.length)return String(n??"");const g=String(n??"").trim(),D=Mt(g),N=Mt(r),z=`${D} ${N}`.trim(),$=Zl(r||z);if($){if(Yl($)){const Y=c.find(ge=>["true","1","100"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su|einschalten|allume|enciende|liga|aan)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}if(Ql($)){const Y=c.find(ge=>["false","0"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(off|close|down|stop|disable|disabled|inactive|chiuso|spento|giu|ausschalten|eteins|apaga|desliga|uit)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}}if(c.some(Y=>String(Y.value)===g))return g;const Q=c.find(Y=>Mt(Y.label)===D);if(Q)return String(Q.value);const X=c.find(Y=>{const ee=Mt(Y.label);return D&&(ee.includes(D)||D.includes(ee))});if(X)return String(X.value);const fe=/\b(on|open|up|true|1|accendi|attiva|apri|su|acceso|accesa|accesi|accese|aperto|aperta|enabled|enable|start|allume|einschalten|enciende|liga|aan)\b/,Z=/\b(off|close|down|false|0|spegni|disattiva|chiudi|giu|spento|spenta|spenti|spente|chiuso|chiusa|disabled|disable|stop|ferma|eteins|ausschalten|apaga|desliga|uit)\b/;if(fe.test(z)){const Y=c.find(ge=>["true","1","100"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}if(Z.test(z)){const Y=c.find(ge=>["false","0"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(off|close|down|stop|disable|disabled|inactive|spento|spenta|chiuso|chiusa|giu)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}return String(c[0].value)}function ks(n){if(!n)return;const a=ra(n.commandDPT),r=ra(n.statusDPT||n.commandDPT),c=String(n.action||"").trim().toLowerCase();a.length&&(n.commandPayload=Dn(n.commandPayload,n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`)),r.length&&(n.expectedPayload=Dn(n.expectedPayload,n.statusDPT||n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`))}function In(n={}){if(String(n.kind||"").trim().toLowerCase()==="wait")return{id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:"wait",action:"",collapsed:n.collapsed!==!1,title:String(n.title||"Wait"),description:String(n.description||""),reason:String(n.reason||""),delayMs:Number(n.delayMs||n.readDelayMs||1200),commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:0,statusResponseTimeoutMs:0};const r=String(n.commandGA||"").trim()||String(fn.value[0]?.ga||""),c=Br(r),g=Kr(r),D=c&&c.status?c.status:null,N={id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:String(n.kind||(D?"write_and_verify":"write_only")),action:String(n.action||"").trim().toLowerCase(),collapsed:n.collapsed!==!1,title:String(n.title||(g?`Step ${g.label}`:"Manual Step")),description:String(n.description||""),reason:String(n.reason||""),commandGA:r,commandDPT:String(n.commandDPT||g?.dpt||""),commandPayload:String(n.commandPayload??""),statusGA:String(n.statusGA||D?.ga||""),statusDPT:String(n.statusDPT||D?.dpt||""),expectedPayload:String(n.expectedPayload??n.commandPayload??""),statusWriteTimeoutMs:Number(n.statusWriteTimeoutMs||n.timeoutMs||5e3),statusResponseTimeoutMs:Number(n.statusResponseTimeoutMs||n.timeoutMs||5e3)};return ks(N),N}function Cs(n){const a=Et(n,null);return a?(a.steps=(Array.isArray(a.steps)?a.steps:[]).map(r=>In(r)),a):null}function ed(){return Cs({id:"",name:"",description:"",areaId:ot.value?String(ot.value.id||""):"",areaName:ot.value?String(ot.value.path||ot.value.name||""):"",prompt:"",source:"manual",generatedAt:new Date().toISOString(),steps:[]})}function Vr(n){if(!n||n.kind==="wait")return;const a=Kr(n.commandGA),r=ql(n.statusGA),c=Br(n.commandGA);a&&(n.commandDPT=String(a.dpt||"")),r&&(n.statusDPT=String(r.dpt||"")),c&&c.status&&(!n.statusGA||n.statusGA==="")&&(n.statusGA=String(c.status.ga||""),n.statusDPT=String(c.status.dpt||""),n.kind="write_and_verify"),n.statusGA&&(n.kind="write_and_verify"),n.expectedPayload||(n.expectedPayload=String(n.commandPayload??"")),n.statusGA||(n.statusDPT="",n.kind="write_only"),ks(n)}function td(){if(!s.testPlanDraft)return;const n={id:`step-${Date.now()}-${Math.round(Math.random()*1e3)}`,kind:"write_only",action:"",collapsed:!0,title:"Manual Step",description:"",reason:"",commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:5e3,statusResponseTimeoutMs:5e3};s.testPlanDraft.steps=[...s.testPlanDraft.steps||[],n]}function ad(){if(!s.testPlanDraft)return;const n=In({id:`wait-${(s.testPlanDraft.steps?.length||0)+1}`,kind:"wait",title:"Wait",description:"Pause the test before the next action.",delayMs:1200});s.testPlanDraft.steps=[...s.testPlanDraft.steps||[],n]}function sd(n){if(!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps))return;const a=s.testPlanDraft.steps[n];if(!a)return;const r=In(Object.assign({},a,{id:`${a.id||"step"}-copy`}));s.testPlanDraft.steps.splice(n+1,0,r)}function nd(n){!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps)||s.testPlanDraft.steps.splice(n,1)}function rd(n){n&&(n.collapsed=n.collapsed!==!0)}function Rn(){s.draggedTestPlanStepId="",s.dragOverTestPlanStepId=""}function id(n,a){const r=String(n||"").trim();r&&(s.draggedTestPlanStepId=r,s.dragOverTestPlanStepId="",a&&a.dataTransfer&&(a.dataTransfer.effectAllowed="move",a.dataTransfer.setData("text/plain",r)))}function od(n){const a=String(n||"").trim();!a||!s.draggedTestPlanStepId||a===s.draggedTestPlanStepId||(s.dragOverTestPlanStepId=a)}function ld(n,a){if(!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps))return;const r=String(n||"").trim(),c=String(a||"").trim();if(!r||!c||r===c)return;const g=s.testPlanDraft.steps.slice(),D=g.findIndex($=>String($&&$.id?$.id:"")===r),N=g.findIndex($=>String($&&$.id?$.id:"")===c);if(D===-1||N===-1)return;const[z]=g.splice(D,1);g.splice(N,0,z),s.testPlanDraft.steps=g}function dd(n,a){a&&a.preventDefault();const r=String(s.draggedTestPlanStepId||"").trim(),c=String(n||"").trim();r&&c&&r!==c&&ld(r,c),Rn()}function ud(){!s.testPlanDraft||s.testPlanRunning||(s.testPlanRunMode="single",s.testPlanRepeatStopRequested=!1,s.testPlanRunConfirmOpen=!0)}function cd(){!s.testPlanDraft||s.testPlanRunning||(s.testPlanRunMode="repeat",s.testPlanRepeatStopRequested=!1,s.testPlanRunConfirmOpen=!0)}function Wr(){s.testPlanRunConfirmOpen=!1,s.testPlanRunMode="single"}function fd(){s.testPlanRepeatForever===!0&&(s.testPlanRepeatStopRequested=!0,_("Stopping repeat mode after the current cycle..."))}function Ur(n=null){const a=n||sa.value;a&&(s.testResultFocusMode=!1,s.testPlanSelectedId=String(a.id||""),s.testPlanDraft=Cs(a),s.testPlanPrompt=String(a.prompt||""),s.testPlanGeneration={provider:String(a.source||"saved"),model:"",fallback:!1,error:""},s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!1,s.testTemplateBuilderFocus=!1,xa())}function Nn(){Ra=null,s.testPlanPendingActionLabel=""}function jr(){s.testPlanUnsavedConfirmOpen=!1,Nn()}function Hr(){const n=Ra;s.testPlanUnsavedConfirmOpen=!1,Nn(),typeof n=="function"&&n()}function kn(n,a="another plan"){if(!_r.value){n();return}Ra=n,s.testPlanPendingActionLabel=String(a||"another plan"),s.testPlanUnsavedConfirmOpen=!0}function pd(n){if(!n||!n.id)return;const a=String(n.id);s.testPlanSelectedId!==a&&kn(()=>Ur(n),`plan "${n.name||a}"`)}function gd(){qo(),_("Plan changes discarded")}async function hd(){await qr()&&Hr()}function Xr(){if(!ye.value.length){_("Define at least one area before creating a test plan");return}kn(()=>{s.activeTab="tests",s.testResultFocusMode=!1,s.testPlanSelectedId="",s.testPlanDraft=ed(),s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.testPlanPrompt="",s.showAiPlanner=!1,s.testTemplateBuilderFocus=!1,xa()},"a new plan")}function md(n){const a=String(n||"").trim();if(!a)return;const r=ye.value.find(c=>c&&c.id===a);r&&(s.testAreaSelectedId=a,s.testPlanDraft&&(s.testPlanDraft.areaId=a,s.testPlanDraft.areaName=String(r.path||r.name||"")))}function vd(){const n=Et(s.testPlanDraft||sa.value,null);n&&(s.activeTab="tests",s.testResultFocusMode=!1,s.testPlanSelectedId="",s.testPlanRunConfirmOpen=!1,s.testPlanGeneration={provider:"duplicated",model:"",fallback:!1,error:""},n.id="",n.name=String(n.name||"Plan Draft").trim()?`${String(n.name||"Plan Draft").trim()} Copy`:"Plan Copy",s.testPlanPrompt=String(n.prompt||s.testPlanPrompt||""),s.testPlanDraft=Cs(n),s.showAiPlanner=!0,s.testTemplateBuilderFocus=!1,xa(),_("Plan duplicated"))}async function bd(){const n=ot.value,a=String(s.testPlanPrompt||"").trim(),r=Bl();if(!(!s.selectedNodeId||!n||!a||s.testPlanGenerating)){s.testPlanGenerating=!0,s.testTemplateBuilderFocus=!1,s.showAiPlanner=!1,s.testResultFocusMode=!1,s.testPlanGenerationError="",_("Building test plan...");try{const c=await E(I("test-plans/generate"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id,prompt:a,language:r})});s.testPlanDraft=c&&c.plan?Cs(c.plan):null,s.testPlanCatalog=c&&c.catalog?c.catalog:s.testPlanCatalog,s.testPlanGeneration=c&&c.generation?c.generation:null,s.testPlanGenerationError="",s.testPlanSelectedId="",s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!1,c&&c.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:c.testPlans})),xa(),_("Test plan ready")}catch(c){const g=c.message||"Failed to build the test plan";s.lastError=g,s.testPlanGenerationError=g,s.testPlanGeneration={provider:"",model:"",fallback:!1,error:g},_(g)}finally{s.testPlanGenerating=!1}}}async function qr(){if(!s.selectedNodeId||!s.testPlanDraft||s.testPlanSaving)return!1;s.testPlanSaving=!0,_("Saving test plan...");try{const n=await E(I("test-plans/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,plan:Object.assign({},s.testPlanDraft,{prompt:s.testPlanPrompt})})});return n&&n.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:n.testPlans})),n&&n.planId&&(s.testPlanSelectedId=n.planId),n&&n.planId&&s.testPlanDraft&&(s.testPlanDraft.id=n.planId),s.testPlanRunConfirmOpen=!1,xa(),_("Test plan saved"),!0}catch(n){return s.lastError=n.message||"Failed to save test plan",_(s.lastError),!1}finally{s.testPlanSaving=!1}}async function yd(){const n=sa.value;if(!(!n||!s.selectedNodeId||s.testPlanDeleting)){s.testPlanDeleting=!0,_("Deleting test plan...");try{const a=await E(I("test-plans/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,planId:n.id})});a&&a.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:a.testPlans})),s.testPlanDraft=null,s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!0,s.testTemplateBuilderFocus=!1,xa(),_("Test plan deleted")}catch(a){s.lastError=a.message||"Failed to delete test plan",_(s.lastError)}finally{s.testPlanDeleting=!1}}}async function Ad(n="single"){if(!s.selectedNodeId||!s.testPlanDraft||s.testPlanRunning)return;const r=String(n||s.testPlanRunMode||"single").trim().toLowerCase()==="repeat";s.testPlanRunning=!0,s.showAiPlanner=!1,s.testTemplateBuilderFocus=!1,s.testPlanRepeatForever=r,s.testPlanRepeatStopRequested=!1,s.testPlanRunningStepId="",s.testPlanRunConfirmOpen=!1,s.lastError="",_(r?"Running test plan in repeat mode...":"Running test plan...");try{const c=JSON.parse(JSON.stringify(Object.assign({},s.testPlanDraft,{prompt:s.testPlanPrompt}))),g=Array.isArray(c.steps)?c.steps:[];if(!c.areaId)throw new Error("Missing areaId in test plan");if(!g.length)throw new Error("The test plan has no executable steps");let D=ot.value,N=0;do{N+=1;const $=`${c.id||"plan"}:${Date.now()}`,Q=[];s.liveTestResultId=$,s.testResultsMenuOpen=!0,Ns($,{openMenu:!0,activateResultsTab:!0,resultOnly:!0}),s.stateData=Object.assign({},s.stateData||{},{testPlanReport:bn({plan:c,area:D,stepResults:[],reportId:$})});try{await xr(c.name||"Test plan",c.description||"")}catch{}for(let fe=0;fe<g.length;fe+=1){const Z=g[fe];s.testPlanRunningStepId=Z&&Z.id?Z.id:"";const Y=r?`Cycle ${N} · `:"";_(`${Y}Step ${fe+1}/${g.length}: ${Z&&Z.title?Z.title:"Running..."}`);try{await Sl(Z||{title:`Step ${fe+1}`},fe+1)}catch{_(`Voice unavailable for step ${fe+1}. Continuing test...`)}try{const ee=await E(I("test-plans/run-step"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:c.areaId,step:Z})});ee&&ee.area&&(D=ee.area),Q.push(ee&&ee.stepResult?ee.stepResult:Nr(Z,new Error("Step returned no result")))}catch(ee){Q.push(Nr(Z,ee))}s.stateData=Object.assign({},s.stateData||{},{testPlanReport:bn({plan:c,area:D,stepResults:Q.slice(),reportId:$})})}const X=bn({plan:c,area:D,stepResults:Q,reportId:$});s.stateData=Object.assign({},s.stateData||{},{testPlans:vt.value,testPlanReport:X}),Ns($,{openMenu:!0,activateResultsTab:!0,resultOnly:!0});try{await xl(X)}catch(fe){s.lastError=fe.message||"Failed to save test result",_(`Test completed, but the result was not saved: ${s.lastError}`)}r&&s.testPlanRepeatStopRequested!==!0&&(s.testResultFocusMode=!1,_(`Cycle ${N} completed. Starting the next cycle...`))}while(r&&s.testPlanRepeatStopRequested!==!0);const z=r?"Repeat mode stopped":"Test completed";s.testPlanRunConfirmOpen=!1,s.lastError||_(z);try{await xr(Oe(z))}catch{}requestAnimationFrame(()=>{try{ke.value&&typeof ke.value.scrollIntoView=="function"&&ke.value.scrollIntoView({behavior:"smooth",block:"start"})}catch{}})}catch(c){s.lastError=c.message||"Failed to run test plan",_(s.lastError)}finally{s.testPlanRunningStepId="",Na(),s.testPlanRunning=!1,s.testPlanRepeatForever=!1,s.testPlanRepeatStopRequested=!1,s.testPlanRunMode="single"}}async function Sd(){if(s.selectedNodeId){_("Exporting config...");try{const n=await E(I("config/export"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId})}),a=new Blob([JSON.stringify(n,null,2)],{type:"application/json"}),r=window.URL.createObjectURL(a),c=document.createElement("a");c.href=r,c.download=`knx-ai-config-${s.selectedNodeId}.json`,document.body.appendChild(c),c.click(),document.body.removeChild(c),window.URL.revokeObjectURL(r),_("Config exported")}catch(n){s.lastError=n.message||"Failed to export config",_(s.lastError)}}}function wd(){Ia.value&&Ia.value.click()}async function Pd(n){const a=n&&n.target&&n.target.files&&n.target.files[0]?n.target.files[0]:null;if(!(!a||!s.selectedNodeId)){_("Importing config...");try{const r=await a.text(),c=JSON.parse(r),g=await E(I("config/import"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,config:c})});s.stateData=Object.assign({},s.stateData||{},{areas:g.areas||va.value,profiles:g.profiles||ba.value,actuatorTests:g.actuatorTests||ya.value,testPlans:g.testPlans||vt.value,testResults:g.testResults||qa.value}),await Ga(),_("Config imported")}catch(r){s.lastError=r.message||"Failed to import config",_(s.lastError)}finally{n&&n.target&&(n.target.value="")}}}function Td(){s.pollStateHandle||(s.pollStateHandle=window.setInterval(()=>{s.autoRefresh&&Lt({fresh:!1})},1500)),s.pollNodesHandle||(s.pollNodesHandle=window.setInterval(()=>{wn({preserveSelection:!0})},15e3))}function _d(){s.pollStateHandle&&(window.clearInterval(s.pollStateHandle),s.pollStateHandle=null),s.pollNodesHandle&&(window.clearInterval(s.pollNodesHandle),s.pollNodesHandle=null)}return Ao(async()=>{A.value=Se(),Ct(),window.addEventListener("resize",Ct),document.addEventListener("keydown",y),document.addEventListener("fullscreenchange",F),await wn({preserveSelection:!1}),await Lt({fresh:!0}),await Ga(),Td(),ga()}),So(()=>{window.removeEventListener("resize",Ct),document.removeEventListener("keydown",y),document.removeEventListener("fullscreenchange",F),mt(),_d(),Na()}),(n,a)=>(v(),b(q,null,[l("header",nf,[a[42]||(a[42]=l("div",{class:"m-header-brand"},[l("span",{class:"m-logo-mark"},"K"),l("span",{class:"hb-logo-text-mobile"},"KNX AI")],-1)),l("button",{class:ue(["hamburger-icon",{"hamburger-icon-cross":Je.value}]),type:"button","aria-expanded":Je.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle menu",onClick:on},[...a[41]||(a[41]=[l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1)])],10,rf)]),Le.value&&Je.value?(v(),b("button",{key:0,class:"sidebar-overlay",type:"button","aria-label":"Close menu",onClick:h})):G("",!0),l("div",{class:ue(["page-shell",{"sidebar-collapsed":!Je.value,"sidebar-mobile-open":Le.value&&Je.value}])},[l("aside",of,[l("div",lf,[a[43]||(a[43]=l("div",{class:"sidebar-brand-mark","aria-hidden":"true"},"K",-1)),a[44]||(a[44]=l("div",{class:"sidebar-brand"},[l("p",{class:"eyebrow"},"KNX Ultimate")],-1)),l("button",{class:"sidebar-collapse-toggle",type:"button","aria-expanded":Je.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle sidebar",onClick:on},[l("span",uf,S(Je.value?Le.value?"×":"‹":"›"),1)],8,df)]),l("nav",cf,[l("button",{class:ue(["tab-button",{active:s.activeTab==="overview"}]),type:"button",title:"Overview","aria-label":"Overview",onClick:a[0]||(a[0]=r=>Ea("overview"))},[...a[45]||(a[45]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-59cb3d8a><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-59cb3d8a><path d="M3 10.8 12 3l9 7.8v9.2a1 1 0 0 1-1 1h-5v-6h-6v6H4a1 1 0 0 1-1-1z" data-v-59cb3d8a></path></svg></span><span class="sidebar-nav-copy" data-v-59cb3d8a><span class="sidebar-nav-title" data-v-59cb3d8a>Overview</span></span>',2)])],2),l("button",{class:ue(["tab-button",{active:s.activeTab==="areas"}]),type:"button",title:"Areas","aria-label":"Areas",onClick:a[1]||(a[1]=r=>Ea("areas"))},[...a[46]||(a[46]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-59cb3d8a><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-59cb3d8a><path d="M3 3h8v8H3zm10 0h8v8h-8zM3 13h8v8H3zm10 0h8v8h-8z" data-v-59cb3d8a></path></svg></span><span class="sidebar-nav-copy" data-v-59cb3d8a><span class="sidebar-nav-title" data-v-59cb3d8a>Areas</span></span>',2)])],2),l("button",{class:ue(["tab-button sidebar-nav-child",{active:s.activeTab==="tests"}]),type:"button",title:"Tests","aria-label":"Tests",disabled:!ye.value.length,onClick:a[2]||(a[2]=r=>Ea("tests"))},[...a[47]||(a[47]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-59cb3d8a><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-59cb3d8a><path d="M9 3h6v2h-1v4.3l5.5 8.8A2 2 0 0 1 17.8 21H6.2a2 2 0 0 1-1.7-2.9L10 9.3V5H9zm1.9 8.2L6.9 18h10.2l-4-6.8z" data-v-59cb3d8a></path></svg></span><span class="sidebar-nav-copy" data-v-59cb3d8a><span class="sidebar-nav-title" data-v-59cb3d8a>Tests</span></span>',2)])],10,ff),l("button",{class:ue(["tab-button sidebar-nav-child",{active:s.activeTab==="results"}]),type:"button",title:"Test Results","aria-label":"Test Results",onClick:a[3]||(a[3]=r=>Ea("results"))},[...a[48]||(a[48]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-59cb3d8a><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-59cb3d8a><path d="M4 4h16v4H4zm0 6h16v4H4zm0 6h16v4H4z" data-v-59cb3d8a></path></svg></span><span class="sidebar-nav-copy" data-v-59cb3d8a><span class="sidebar-nav-title" data-v-59cb3d8a>Test Results</span></span>',2)])],2),l("button",{class:ue(["tab-button",{active:s.activeTab==="assistant"}]),type:"button",title:"Assistant","aria-label":"Assistant",onClick:a[4]||(a[4]=r=>Ea("assistant"))},[...a[49]||(a[49]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-59cb3d8a><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-59cb3d8a><path d="M4 5h16a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-5 4v-4H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z" data-v-59cb3d8a></path></svg></span><span class="sidebar-nav-copy" data-v-59cb3d8a><span class="sidebar-nav-title" data-v-59cb3d8a>Assistant</span></span>',2)])],2),l("button",{class:ue(["tab-button",{active:s.activeTab==="settings"}]),type:"button",title:"Settings","aria-label":"Settings",onClick:a[5]||(a[5]=r=>Ea("settings"))},[...a[50]||(a[50]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-59cb3d8a><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-59cb3d8a><path d="M19.14 12.94a7.43 7.43 0 0 0 .05-.94 7.43 7.43 0 0 0-.05-.94l2.03-1.58a.5.5 0 0 0 .12-.64l-1.92-3.32a.5.5 0 0 0-.6-.22l-2.39.96a7.18 7.18 0 0 0-1.63-.94l-.36-2.54A.5.5 0 0 0 13.9 2h-3.8a.5.5 0 0 0-.49.42l-.36 2.54a7.18 7.18 0 0 0-1.63.94l-2.39-.96a.5.5 0 0 0-.6.22L2.71 8.48a.5.5 0 0 0 .12.64l2.03 1.58a7.43 7.43 0 0 0-.05.94 7.43 7.43 0 0 0 .05.94l-2.03 1.58a.5.5 0 0 0-.12.64l1.92 3.32a.5.5 0 0 0 .6.22l2.39-.96c.5.39 1.04.71 1.63.94l.36 2.54a.5.5 0 0 0 .49.42h3.8a.5.5 0 0 0 .49-.42l.36-2.54c.59-.23 1.13-.55 1.63-.94l2.39.96a.5.5 0 0 0 .6-.22l1.92-3.32a.5.5 0 0 0-.12-.64zM12 15.2A3.2 3.2 0 1 1 12 8.8a3.2 3.2 0 0 1 0 6.4z" data-v-59cb3d8a></path></svg></span><span class="sidebar-nav-copy" data-v-59cb3d8a><span class="sidebar-nav-title" data-v-59cb3d8a>Settings</span></span>',2)])],2)]),Je.value?(v(),b("div",pf,[l("button",{class:"primary-button sidebar-action-button",type:"button",disabled:s.loadingNodes||s.loadingState,onClick:Pl}," Refresh ",8,gf),l("div",{class:"support-link-row"},[l("a",{class:"secondary-button support-link-button",href:zb,target:"_blank",rel:"noopener noreferrer"}," Donate via PayPal "),l("a",{class:"secondary-button support-link-button support-link-button-youtube",href:$b,target:"_blank",rel:"noopener noreferrer"}," Subscribe ")])])):G("",!0),Je.value?(v(),b("div",hf,[l("span",{class:ue(["status-pill",{error:!!s.lastError}])},[s.loadingNodes||s.loadingState||s.areaLlmRegenerating||s.areaLlmBulkDeleting||s.areaLlmBusy||s.testPlanGenerating||s.asking?(v(),b("span",mf)):G("",!0),l("span",null,S(s.status),1)],2),_s.value?(v(),b("span",vf,"Provider: "+S(_s.value.llmProvider||"n/a")+" | Model: "+S(_s.value.llmModel||"n/a"),1)):G("",!0),l("a",{class:"sidebar-doc-link",href:Ob,target:"_blank",rel:"noopener noreferrer"}," Documentation: KNX AI Vue ")])):G("",!0)]),l("section",bf,[l("main",yf,[s.activeTab==="overview"?(v(),b("section",Af,[l("div",Sf,[a[51]||(a[51]=l("h2",null,"Summary",-1)),xe.value.meta?.generatedAt?(v(),b("span",wf,S(xt(xe.value.meta.generatedAt)),1)):G("",!0)]),l("pre",Pf,S(cl.value),1),l("div",Tf,[l("article",_f,[a[52]||(a[52]=l("span",null,"Telegrams",-1)),l("strong",null,S(Number(xe.value.counters?.telegrams||0)),1)]),l("article",Df,[a[53]||(a[53]=l("span",null,"Rate",-1)),l("strong",null,S(Number(xe.value.counters?.overallRatePerSec||0))+"/s",1)]),l("article",If,[a[54]||(a[54]=l("span",null,"Repeat",-1)),l("strong",null,S(Number(xe.value.counters?.repeated||0)),1)]),l("article",Rf,[a[55]||(a[55]=l("span",null,"Unknown DPT",-1)),l("strong",null,S(Number(xe.value.counters?.unknownDpt||0)),1)])])])):G("",!0),s.activeTab==="areas"?(v(),b("section",Nf,[l("div",kf,[a[56]||(a[56]=l("h2",null,"Select an Area",-1)),l("div",Cf,[l("span",xf,S(Number(Xa.value.suggestedAreaCount||0))+" areas",1),l("button",{class:"secondary-button",type:"button",disabled:s.areaLlmRegenerating||s.areaLlmBulkDeleting||!ta.value.llmEnabled,onClick:Ul},[s.areaLlmRegenerating?(v(),b("span",Gf)):G("",!0),l("span",null,S(s.areaLlmRegenerating?"Regenerating...":"Regenerate AI Areas"),1)],8,Ef),l("button",{class:"danger-button",type:"button",disabled:s.areaLlmRegenerating||s.areaLlmBulkDeleting||br.value<=0,onClick:jl},[s.areaLlmBulkDeleting?(v(),b("span",Lf)):G("",!0),l("span",null,S(s.areaLlmBulkDeleting?"Deleting...":"Delete AI Areas"),1)],8,Ff),l("button",{class:"secondary-button new-button",type:"button",onClick:Wl}," New Area ")])]),s.areaLlmError?(v(),b("p",Mf,S(s.areaLlmError),1)):G("",!0),l("div",Of,[l("div",zf,[l("span",$f,"GA "+S(Number(Xa.value.gaCount||0)),1),l("span",Bf,"Hierarchical "+S(Number(Xa.value.hierarchicalGaCount||0)),1),l("span",Kf,"Secondary "+S(Number(Xa.value.secondaryGroupCount||0)),1),l("span",Vf,"Active "+S(Number(Xa.value.activeAreaCount||0)),1)])]),cn.value.length||s.areaDraftIsNew?(v(),b("div",Wf,[!Ee.value&&!s.areaDraftIsNew?(v(),b("div",Uf,[l("label",jf,[a[57]||(a[57]=l("span",null,"Areas",-1)),l("div",Hf,[pe(l("input",{"onUpdate:modelValue":a[6]||(a[6]=r=>s.areaSearch=r),class:"area-search-select-input",type:"text",placeholder:Ee.value?zr(Ee.value):"Search area...",onFocus:a[7]||(a[7]=r=>s.areaSearchOpen=!0),onInput:a[8]||(a[8]=r=>s.areaSearchOpen=!0),onBlur:Ol},null,40,Xf),[[Ce,s.areaSearch]]),s.areaSearchOpen&&cn.value.length?(v(),b("div",qf,[(v(!0),b(q,null,ie(cn.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:ue(["area-search-select-option",{active:Ee.value&&Ee.value.id===r.id}]),onMousedown:Kt(c=>Ml(r),["prevent"])},S(zr(r)),43,Jf))),128))])):G("",!0)])])])):G("",!0),Ee.value||s.areaDraftIsNew?(v(),b("article",{key:1,class:ue(["area-detail",{"area-detail-wide":s.areaDraftIsNew}])},[l("div",Zf,[s.areaBuilderFocus!==!0?(v(),b("div",Yf,[a[58]||(a[58]=l("div",null,[l("h4",null,"Edit Area"),l("p",{class:"area-detail-subhead"},"The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.")],-1)),l("div",Qf,[s.areaDraftIsNew&&!Tr.value?(v(),b("button",{key:0,class:"secondary-button",type:"button",onClick:Il}," Show AI Area Builder ")):G("",!0),s.areaDraftIsNew?G("",!0):(v(),b("button",{key:1,class:"danger-button",type:"button",disabled:s.areaSaving,onClick:Fl}," Delete Area ",8,ep)),l("button",{class:"secondary-button",type:"button",disabled:s.areaSaving,onClick:Gl}," Reset ",8,tp),l("button",{class:"primary-button",type:"button",disabled:s.areaSaving,onClick:El},S(s.areaSaving?"Saving...":"Save Area"),9,ap),l("button",{class:"secondary-button",type:"button",disabled:s.areaSaving,onClick:Nl}," Close ",8,sp)])])):G("",!0),s.areaBuilderFocus!==!0?(v(),b("div",np,[l("label",rp,[a[59]||(a[59]=l("span",null,"Area name",-1)),pe(l("input",{"onUpdate:modelValue":a[9]||(a[9]=r=>s.areaDraftName=r),type:"text",placeholder:"Installer alias"},null,512),[[Ce,s.areaDraftName]])]),l("label",ip,[a[60]||(a[60]=l("span",null,"Description",-1)),pe(l("textarea",{"onUpdate:modelValue":a[10]||(a[10]=r=>s.areaDraftDescription=r),rows:"3",placeholder:"Optional note for diagnostics and reports"},null,512),[[Ce,s.areaDraftDescription]])]),l("label",op,[a[61]||(a[61]=l("span",null,"Add group addresses to this area",-1)),pe(l("input",{"onUpdate:modelValue":a[11]||(a[11]=r=>s.gaCatalogSearch=r),type:"text",placeholder:"Search GA, label or ETS path"},null,512),[[Ce,s.gaCatalogSearch]])])])):G("",!0),s.areaDraftIsNew&&Tr.value?(v(),b("div",lp,[l("div",{class:ue(["ai-planner-shell-head",{"template-builder-focus-head":s.areaBuilderFocus===!0}])},[a[62]||(a[62]=l("div",null,[l("h4",null,"AI Area Builder"),l("p",{class:"area-detail-subhead"},"Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.")],-1)),s.areaBuilderFocus===!0?(v(),b("div",dp,[l("button",{class:"secondary-button",type:"button",onClick:Rl}," Close ")])):G("",!0)],2),l("div",up,[l("label",cp,[a[63]||(a[63]=l("span",null,"Assistant prompt",-1)),pe(l("textarea",{"onUpdate:modelValue":a[12]||(a[12]=r=>s.areaLlmPrompt=r),rows:"3",placeholder:"Example: Add all technical room lighting command and status GA."},null,512),[[Ce,s.areaLlmPrompt]])])]),l("div",fp,[l("button",{class:"primary-button",type:"button",disabled:s.areaLlmBusy||!s.areaLlmPrompt.trim()||!ta.value.llmEnabled,onClick:Hl},[s.areaLlmBusy?(v(),b("span",gp)):G("",!0),de(" "+S(s.areaLlmBusy?"Suggesting...":"Suggest GA with AI"),1)],8,pp)]),s.areaLlmError?(v(),b("p",hp,S(s.areaLlmError),1)):G("",!0),ta.value.llmEnabled?G("",!0):(v(),b("p",mp," Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft. "))])):G("",!0),s.areaBuilderFocus!==!0?(v(),b("div",vp,[l("div",null,[a[65]||(a[65]=l("h4",null,"Area GA membership",-1)),wr.value.length?(v(),b("ul",bp,[(v(!0),b(q,null,ie(wr.value,r=>(v(),b("li",{key:r.ga,class:"area-ga-item"},[l("div",yp,[l("strong",null,S(r.ga),1),l("span",null,[de(S(r.label||"Unlabeled GA"),1),r.dpt?(v(),b("span",Ap," | DPT "+S(r.dpt),1)):G("",!0)]),l("span",null,[de("Role "+S(Or(r.role)),1),r.roleSource?(v(),b("span",Sp," | source "+S(r.roleSource),1)):G("",!0)])]),l("div",wp,[l("label",Pp,[a[64]||(a[64]=l("span",null,"Role",-1)),l("select",{value:r.roleOverride&&r.roleOverride!=="auto"?r.roleOverride:r.role||"neutral",disabled:s.areaGaRoleSavingGa===r.ga,onChange:c=>Vl(r.ga,c.target.value)},[(v(),b(q,null,ie(o,c=>l("option",{key:c.value,value:c.value},S(c.label),9,_p)),64))],40,Tp)]),l("button",{class:"secondary-button",type:"button",onClick:c=>Kl(r.ga)}," Remove ",8,Dp)])]))),128))])):(v(),b("p",Ip,"No GA selected for this area yet."))]),l("div",null,[l("div",Rp,[a[66]||(a[66]=l("div",null,[l("h4",null,"Available GA"),l("p",{class:"area-detail-subhead"},"Pick from the ETS catalog. Already selected GA are hidden from this list.")],-1)),l("span",Np,S(s.gaCatalogLoading?"Loading...":`${Sr.value.length} visible`),1)]),l("div",kp,[(v(!0),b(q,null,ie(Sr.value,r=>(v(),b("button",{key:r.ga,type:"button",class:"area-list-item",onClick:c=>Ll(r.ga)},[l("span",xp,S(r.ga),1),l("span",Ep,S(r.label||"Unlabeled GA"),1),l("span",Gp,[de(S(r.hierarchyPath||r.dpt||""),1),r.role?(v(),b("span",Fp," | "+S(Or(r.role)),1)):G("",!0)])],8,Cp))),128))])])])):G("",!0),s.areaBuilderFocus!==!0?(v(),b("p",Lp,[a[67]||(a[67]=de(" Original ETS path: ",-1)),l("strong",null,S(s.areaDraftIsNew?"Manual area":Ee.value.basePath||Ee.value.path||Ee.value.name),1)])):G("",!0)])],2)):G("",!0)])):(v(),b("p",Mp,"No areas matched the current search or the ETS file does not expose a usable hierarchy yet."))])):G("",!0),s.activeTab==="tests"?(v(),b("section",{key:2,class:ue(["card card-profiles",{"card-results-focus":bt.value}])},[l("div",Op,[l("div",null,[l("h2",null,S(bt.value?"Test Result":"Test Planner"),1),l("p",zp,S(bt.value?"Showing only the selected test report.":"Select an area, choose a standard test template, review the generated plan, then save or run it."),1)]),bt.value?(v(),b("div",Wp,[l("span",Up,S(Ja(ne.value)),1),l("button",{class:"danger-button",type:"button",disabled:!ne.value||s.deletingTestResultId===ne.value.id,onClick:a[13]||(a[13]=r=>Tn(ne.value?.id))},S(s.deletingTestResultId===ne.value?.id?"Deleting...":"Delete"),9,jp),l("button",{class:"secondary-button",type:"button",onClick:Lr}," Open Source Test ")])):(v(),b("div",$p,[l("span",Bp,"Area "+S(ot.value?ot.value.path||ot.value.name:"n/a"),1),l("span",Kp,S(vt.value.length)+" saved plans",1),l("button",{class:"secondary-button",type:"button",disabled:!s.testPlanDraft,onClick:vd}," Duplicate Plan ",8,Vp),l("button",{class:"secondary-button new-button",type:"button",onClick:Xr}," New Plan ")]))]),l("div",{class:ue(["profiles-layout test-planner-layout",{"result-only-layout":bt.value}])},[l("div",Hp,[!bt.value&&!s.testPlanDraft&&!s.testPlanRunning?(v(),b("article",Xp,[a[69]||(a[69]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select test plan"),l("p",{class:"area-detail-subhead"},"Reusable deterministic active tests saved by the installer.")])],-1)),l("div",qp,[l("label",Jp,[a[68]||(a[68]=l("span",null,"Plans",-1)),l("div",Zp,[pe(l("input",{"onUpdate:modelValue":a[14]||(a[14]=r=>s.testPlanSearch=r),class:"area-search-select-input",type:"text",placeholder:sa.value?$r(sa.value):"Search saved plan...",onFocus:a[15]||(a[15]=r=>s.testPlanSearchOpen=!0),onInput:a[16]||(a[16]=r=>s.testPlanSearchOpen=!0),onBlur:$l},null,40,Yp),[[Ce,s.testPlanSearch]]),s.testPlanSearchOpen&&yr.value.length?(v(),b("div",Qp,[(v(!0),b(q,null,ie(yr.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:ue(["area-search-select-option",{active:sa.value&&sa.value.id===r.id}]),onMousedown:Kt(c=>zl(r),["prevent"])},S($r(r)),43,eg))),128))])):G("",!0)])])]),vt.value.length?G("",!0):(v(),b("p",tg,"No saved plans yet."))])):G("",!0),!bt.value&&s.testPlanDraft?(v(),b("article",ag,[s.testTemplateBuilderFocus!==!0?(v(),b("div",sg,[l("div",null,[l("h3",null,S(s.testPlanDraft?.name||"Plan Draft"),1),pn.value?(v(),b("p",ng,"Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.")):G("",!0)]),l("div",rg,[_r.value?(v(),b("span",ig,"Unsaved changes")):G("",!0),l("button",{class:"secondary-button new-button",type:"button",onClick:Xr}," New Plan "),pn.value?G("",!0):(v(),b("button",{key:1,class:"secondary-button",type:"button",onClick:_l}," Show Template Builder ")),l("label",og,[pe(l("input",{"onUpdate:modelValue":a[17]||(a[17]=r=>s.voiceEnabled=r),type:"checkbox"},null,512),[[Bn,s.voiceEnabled]]),a[70]||(a[70]=l("span",null,"Voice",-1))]),l("button",{class:"danger-button",type:"button",disabled:s.testPlanDeleting||!sa.value,onClick:yd},S(s.testPlanDeleting?"Deleting...":"Delete"),9,lg),l("button",{class:"secondary-button",type:"button",disabled:s.testPlanSaving||s.testPlanRunning,onClick:Cl}," Close ",8,dg),l("button",{class:"secondary-button",type:"button",disabled:s.testPlanSaving||!s.testPlanDraft,onClick:qr},S(s.testPlanSaving?"Saving...":"Save Plan"),9,ug),ol.value?(v(),b("div",cg,[l("button",{class:"secondary-button",type:"button",disabled:!s.testPlanDraft&&s.testPlanRepeatForever!==!0||s.testPlanRunning&&s.testPlanRepeatForever!==!0||s.testPlanRepeatStopRequested===!0,onClick:a[18]||(a[18]=r=>s.testPlanRepeatForever===!0?fd():cd())},S(s.testPlanRepeatForever===!0?s.testPlanRepeatStopRequested===!0?"Stopping...":"Stop Repeat":"Repeat Forever"),9,fg),l("button",{class:"primary-button",type:"button",disabled:s.testPlanRunning||!s.testPlanDraft,onClick:ud},[s.testPlanRunning?(v(),b("span",gg)):G("",!0),l("span",null,S(s.testPlanRunning?"Running...":"Run Plan"),1)],8,pg)])):G("",!0)])])):G("",!0),pn.value?(v(),b("div",hg,[l("div",{class:ue(["ai-planner-shell-head",{"template-builder-focus-head":s.testTemplateBuilderFocus===!0}])},[a[71]||(a[71]=l("div",null,[l("h4",null,"Template Builder"),l("p",{class:"area-detail-subhead"},"Select one of the standard templates. The plan is built only from the command GA available in the selected area.")],-1)),s.testTemplateBuilderFocus===!0?(v(),b("div",mg,[l("button",{class:"secondary-button",type:"button",onClick:Dl}," Close ")])):G("",!0)],2),l("div",vg,[l("label",bg,[a[72]||(a[72]=l("span",null,"Area to test",-1)),pe(l("select",{"onUpdate:modelValue":a[19]||(a[19]=r=>s.testAreaSelectedId=r)},[(v(!0),b(q,null,ie(ye.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,yg))),128))],512),[[Pa,s.testAreaSelectedId]])]),l("label",Ag,[a[73]||(a[73]=l("span",null,"Selected template",-1)),l("textarea",{value:s.testPlanPrompt||"Select one of the templates below.",rows:"4",readonly:""},null,8,Sg)])]),l("div",wg,[(v(),b(q,null,ie(i,r=>l("button",{key:r.id,class:ue(["preset-button",{active:s.testPlanPrompt===r.prompt}]),type:"button",onClick:c=>Xl(r)},S(r.title),11,Pg)),64))]),l("p",Tg,S((i.find(r=>r.prompt===s.testPlanPrompt)||{}).description||"Choose a template to see what the deterministic builder will do in the selected area."),1),l("div",_g,[l("button",{class:"primary-button",type:"button",disabled:s.testPlanGenerating||!ot.value||!s.testPlanPrompt.trim(),onClick:bd},[s.testPlanGenerating?(v(),b("span",Ig)):G("",!0),de(" "+S(s.testPlanGenerating?"Building...":"Build Test Plan"),1)],8,Dg)]),s.testPlanGenerationError?(v(),b("p",Rg,S(s.testPlanGenerationError),1)):G("",!0),s.testPlanGeneration?(v(),b("div",Ng,[s.testPlanGeneration.error?G("",!0):(v(),b("p",kg," Built with "+S(s.testPlanGeneration.provider||"deterministic builder")+". ",1)),s.testPlanGeneration.error?(v(),b("p",Cg,S(s.testPlanGeneration.error),1)):G("",!0)])):G("",!0)])):G("",!0)])):G("",!0),s.testPlanRunning&&!bt.value?(v(),b("article",xg,[l("div",Eg,[l("div",null,[a[74]||(a[74]=l("h3",{class:"running-headline"},[l("span",{class:"running-spinner","aria-hidden":"true"}),l("span",null,"Test Running")],-1)),l("p",Gg,S(Re.value?.title||"Executing current step..."),1)]),l("span",Fg,S(ct.value?.metrics?.totalSteps?`${Number(ct.value.steps?.length||0)}/${Number(ct.value.metrics.totalSteps||0)}`:"in progress"),1)]),l("div",Lg,[l("article",Mg,[a[75]||(a[75]=l("span",null,"Completed",-1)),l("strong",null,S(Number(ct.value?.steps?.length||0)),1)]),l("article",Og,[a[76]||(a[76]=l("span",null,"Pass",-1)),l("strong",null,S(Number(ct.value?.metrics?.pass||0)),1)]),l("article",zg,[a[77]||(a[77]=l("span",null,"Warn",-1)),l("strong",null,S(Number(ct.value?.metrics?.warn||0)),1)]),l("article",$g,[a[78]||(a[78]=l("span",null,"Fail",-1)),l("strong",null,S(Number(ct.value?.metrics?.fail||0)),1)])]),Re.value?(v(),b("div",Bg,[l("div",Kg,[l("strong",null,S(Re.value.title||Re.value.id),1),l("span",null,S(Re.value.kind),1)]),l("p",Vg,S(Re.value.description||"Current step in execution."),1),Re.value.kind==="wait"?(v(),b("div",Wg,[l("span",null,[a[79]||(a[79]=l("strong",null,"Wait",-1)),de(" "+S(Number(Re.value.delayMs||0))+" ms",1)]),l("span",null,[a[80]||(a[80]=l("strong",null,"Reason",-1)),de(" "+S(Re.value.reason||"Pause before next action"),1)])])):(v(),b("div",Ug,[l("span",null,[a[81]||(a[81]=l("strong",null,"Command",-1)),de(" "+S(Re.value.commandGA||"n/a"),1)]),l("span",null,[a[82]||(a[82]=l("strong",null,"Status GA",-1)),de(" "+S(Re.value.statusGA||"n/a"),1)]),l("span",null,[a[83]||(a[83]=l("strong",null,"Payload",-1)),de(" "+S(An(Re.value.commandPayload,Re.value.commandDPT)),1)]),l("span",null,[a[84]||(a[84]=l("strong",null,"Expected",-1)),de(" "+S(An(Re.value.expectedPayload,Re.value.statusDPT||Re.value.commandDPT)),1)])])),Re.value.kind!=="wait"&&Re.value.statusGA?(v(),b("div",jg,[l("section",Hg,[a[87]||(a[87]=l("h4",null,"Spontaneous Write From Status GA",-1)),l("div",Xg,[l("span",null,[a[85]||(a[85]=l("strong",null,"Status GA",-1)),de(" "+S(Re.value.statusGA||"n/a"),1)]),l("span",null,[a[86]||(a[86]=l("strong",null,"Timeout",-1)),de(" "+S(Number(Re.value.statusWriteTimeoutMs||0))+" ms",1)])])]),l("section",qg,[a[90]||(a[90]=l("h4",null,"Active Read Request To Status GA",-1)),l("div",Jg,[l("span",null,[a[88]||(a[88]=l("strong",null,"Status GA",-1)),de(" "+S(Re.value.statusGA||"n/a"),1)]),l("span",null,[a[89]||(a[89]=l("strong",null,"Timeout",-1)),de(" "+S(Number(Re.value.statusResponseTimeoutMs||0))+" ms",1)])])])])):G("",!0)])):G("",!0)])):G("",!0),ne.value&&bt.value?(v(),b("article",{key:3,ref_key:"testPlanReportRef",ref:ke,class:"area-detail"},[l("div",Zg,[l("div",null,[l("h3",null,S(Is(ne.value)),1),l("p",Yg,S(Rs(ne.value)||xt(ne.value.generatedAt)),1)]),l("div",Qg,[l("span",eh,S(Ja(ne.value)),1),ne.value.live===!0?(v(),b("span",th,[...a[91]||(a[91]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):G("",!0),l("span",ah,S(ne.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:Rr}," Export PDF ")])]),l("div",sh,[(v(!0),b(q,null,ie(yn(ne.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",nh,[(v(!0),b(q,null,ie(Za(ne.value),r=>(v(),b("article",{key:r.id,class:ue(["report-check",`report-${r.status}`])},[l("div",rh,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",ih,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",oh,[(v(!0),b(q,null,ie(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",lh,[(v(!0),b(q,null,ie(c.items,g=>(v(),b("span",{key:`${r.id}-${c.title}-${g.label}`},[l("strong",null,S(g.label),1),de(" "+S(g.value),1)]))),128))])]))),128))])):(v(),b("div",dh,[(v(!0),b(q,null,ie(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),de(" "+S(c.value),1)]))),128))]))],2))),128))]),Za(ne.value).length?G("",!0):(v(),b("p",uh,"No detailed entries stored for this report yet.")),Ya(ne.value).length?(v(),b("div",ch,[a[92]||(a[92]=l("h4",null,"Suggestions",-1)),l("ul",fh,[(v(!0),b(q,null,ie(Ya(ne.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):G("",!0)],512)):G("",!0),s.testPlanDraft&&!s.testPlanRunning&&!bt.value&&s.testTemplateBuilderFocus!==!0?(v(),b("article",ph,[l("div",gh,[l("div",null,[l("h3",hh,[a[93]||(a[93]=l("span",null,"Edit Plan",-1)),s.testPlanGenerating?(v(),b("span",mh)):G("",!0)])]),l("div",vh,[l("span",bh,S(Number(s.testPlanDraft.steps?.length||0))+" steps",1),l("button",{class:"secondary-button",type:"button",onClick:td}," Add Step "),l("button",{class:"secondary-button",type:"button",onClick:ad}," Add Wait ")])]),l("div",yh,[l("label",Ah,[a[95]||(a[95]=l("span",null,"Area",-1)),l("select",{value:s.testPlanDraft.areaId||s.testAreaSelectedId||"",disabled:!ye.value.length,onChange:a[20]||(a[20]=r=>md(r.target.value))},[a[94]||(a[94]=l("option",{value:"",disabled:""},"Select area",-1)),(v(!0),b(q,null,ie(ye.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,wh))),128))],40,Sh)]),l("label",Ph,[a[96]||(a[96]=l("span",null,"Plan name",-1)),pe(l("input",{"onUpdate:modelValue":a[21]||(a[21]=r=>s.testPlanDraft.name=r),type:"text",placeholder:"KNX active test name"},null,512),[[Ce,s.testPlanDraft.name]])]),l("label",Th,[a[97]||(a[97]=l("span",null,"Description",-1)),pe(l("textarea",{"onUpdate:modelValue":a[22]||(a[22]=r=>s.testPlanDraft.description=r),rows:"2",placeholder:"Short operator-facing description"},null,512),[[Ce,s.testPlanDraft.description]])])]),l("div",_h,[(v(!0),b(q,null,ie(s.testPlanDraft.steps||[],(r,c)=>(v(),b("article",{key:r.id,class:ue(["report-check report-pass planner-step-card",{"planner-step-running":s.testPlanRunning&&s.testPlanRunningStepId===r.id,"planner-step-dragging":s.draggedTestPlanStepId===r.id,"planner-step-drop-target":s.dragOverTestPlanStepId===r.id}]),onDragenter:Kt(g=>od(r.id),["prevent"]),onDragover:a[23]||(a[23]=Kt(()=>{},["prevent"])),onDrop:g=>dd(r.id,g)},[l("div",Ih,[l("div",Rh,[l("button",{class:"drag-handle",type:"button",draggable:"true",tabindex:"-1","aria-label":"Drag step",title:"Drag step",onDragstart:g=>id(r.id,g),onDragend:Rn}," ⋮⋮ ",40,Nh),l("button",{class:"collapse-toggle",type:"button","aria-expanded":r.collapsed!==!0,title:r.collapsed===!0?"Expand step":"Collapse step",onClick:g=>rd(r)},[l("span",{class:ue(["collapse-icon",{collapsed:r.collapsed===!0}])},"▾",2)],8,kh),l("strong",null,S(r.title||r.id),1)]),l("div",Ch,[l("span",null,S(r.kind),1),l("button",{class:"secondary-button",type:"button",onClick:g=>sd(c)}," Duplicate ",8,xh),l("button",{class:"secondary-button",type:"button",onClick:g=>nd(c)}," Remove ",8,Eh)])]),r.collapsed===!0?(v(),b("div",Gh,[r.kind==="wait"?(v(),b("span",Fh,[a[98]||(a[98]=l("strong",null,"Wait",-1)),de(" "+S(Number(r.delayMs||0))+" ms",1)])):(v(),b("span",Lh,[a[99]||(a[99]=l("strong",null,"Command",-1)),de(" "+S(r.commandGA||"n/a"),1)])),r.kind!=="wait"?(v(),b("span",Mh,[a[100]||(a[100]=l("strong",null,"Status GA",-1)),de(" "+S(r.statusGA||"n/a"),1)])):G("",!0),r.kind!=="wait"?(v(),b("span",Oh,[a[101]||(a[101]=l("strong",null,"Payload",-1)),de(" "+S(An(r.commandPayload,r.commandDPT)),1)])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",zh,[a[102]||(a[102]=l("strong",null,"Write timeout",-1)),de(" "+S(Number(r.statusWriteTimeoutMs||0))+" ms",1)])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",$h,[a[103]||(a[103]=l("strong",null,"Response timeout",-1)),de(" "+S(Number(r.statusResponseTimeoutMs||0))+" ms",1)])):G("",!0)])):(v(),b("div",Bh,[l("label",Kh,[a[104]||(a[104]=l("span",null,"Title",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.title=g,type:"text",placeholder:"Step title"},null,8,Vh),[[Ce,r.title]])]),l("label",Wh,[a[105]||(a[105]=l("span",null,"Description",-1)),pe(l("textarea",{"onUpdate:modelValue":g=>r.description=g,rows:"2",placeholder:"What this step checks"},null,8,Uh),[[Ce,r.description]])]),r.kind==="wait"?(v(),b("label",jh,[a[106]||(a[106]=l("span",null,"Wait ms",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.delayMs=g,type:"number",min:"0",max:"30000",step:"100"},null,8,Hh),[[Ce,r.delayMs,void 0,{number:!0}]])])):G("",!0),r.kind!=="wait"?(v(),b("section",Xh,[a[111]||(a[111]=l("h4",null,"Command",-1)),l("div",qh,[l("label",Jh,[a[108]||(a[108]=l("span",null,"Command GA",-1)),pe(l("select",{"onUpdate:modelValue":g=>r.commandGA=g,onChange:g=>Vr(r)},[a[107]||(a[107]=l("option",{value:""},"Select command GA",-1)),(v(!0),b(q,null,ie(fn.value,g=>(v(),b("option",{key:g.ga,value:g.ga},S(`${g.ga} | ${g.label}`),9,Yh))),128))],40,Zh),[[Pa,r.commandGA]])]),l("label",Qh,[a[109]||(a[109]=l("span",null,"Command DPT",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.commandDPT=g,type:"text",placeholder:"1.001",onChange:g=>ks(r)},null,40,em),[[Ce,r.commandDPT]])]),l("label",tm,[a[110]||(a[110]=l("span",null,"Command payload",-1)),ra(r.commandDPT).length?pe((v(),b("select",{key:0,"onUpdate:modelValue":g=>r.commandPayload=g},[(v(!0),b(q,null,ie(ra(r.commandDPT),g=>(v(),b("option",{key:`${r.id}-command-${g.value}`,value:String(g.value)},S(g.label),9,sm))),128))],8,am)),[[Pa,r.commandPayload]]):pe((v(),b("input",{key:1,"onUpdate:modelValue":g=>r.commandPayload=g,type:"text",placeholder:"true, false, 50"},null,8,nm)),[[Ce,r.commandPayload]])])])])):G("",!0),r.kind!=="wait"?(v(),b("section",rm,[a[116]||(a[116]=l("h4",null,"Status",-1)),l("div",im,[l("label",om,[a[113]||(a[113]=l("span",null,"Status GA",-1)),pe(l("select",{"onUpdate:modelValue":g=>r.statusGA=g,onChange:g=>Vr(r)},[a[112]||(a[112]=l("option",{value:""},"No feedback",-1)),(v(!0),b(q,null,ie(Pr.value,g=>(v(),b("option",{key:g.ga,value:g.ga},S(`${g.ga} | ${g.label}`),9,dm))),128))],40,lm),[[Pa,r.statusGA]])]),l("label",um,[a[114]||(a[114]=l("span",null,"Status DPT",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.statusDPT=g,type:"text",placeholder:"1.001",onChange:g=>ks(r)},null,40,cm),[[Ce,r.statusDPT]])]),l("label",fm,[a[115]||(a[115]=l("span",null,"Expected payload",-1)),ra(r.statusDPT||r.commandDPT).length?pe((v(),b("select",{key:0,"onUpdate:modelValue":g=>r.expectedPayload=g},[(v(!0),b(q,null,ie(ra(r.statusDPT||r.commandDPT),g=>(v(),b("option",{key:`${r.id}-expected-${g.value}`,value:String(g.value)},S(g.label),9,gm))),128))],8,pm)),[[Pa,r.expectedPayload]]):pe((v(),b("input",{key:1,"onUpdate:modelValue":g=>r.expectedPayload=g,type:"text",placeholder:"Expected feedback value"},null,8,hm)),[[Ce,r.expectedPayload]])])])])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("div",mm,[l("section",vm,[a[118]||(a[118]=l("h4",null,"Spontaneous Write From Status GA",-1)),a[119]||(a[119]=l("p",{class:"area-detail-subhead"},[de("Wait for a spontaneous "),l("code",null,"GroupValue_Write"),de(" telegram from the status GA.")],-1)),l("label",bm,[a[117]||(a[117]=l("span",null,"Status write timeout ms",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.statusWriteTimeoutMs=g,type:"number",min:"500",max:"60000",step:"100"},null,8,ym),[[Ce,r.statusWriteTimeoutMs,void 0,{number:!0}]])])]),l("section",Am,[a[121]||(a[121]=l("h4",null,"Active Read Request To Status GA",-1)),a[122]||(a[122]=l("p",{class:"area-detail-subhead"},[de("Send a "),l("code",null,"read"),de(" telegram to the status GA and wait for a "),l("code",null,"GroupValue_Response"),de(".")],-1)),l("label",Sm,[a[120]||(a[120]=l("span",null,"Read response timeout ms",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.statusResponseTimeoutMs=g,type:"number",min:"500",max:"60000",step:"100"},null,8,wm),[[Ce,r.statusResponseTimeoutMs,void 0,{number:!0}]])])])])):G("",!0),l("label",Pm,[a[123]||(a[123]=l("span",null,"Reason",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.reason=g,type:"text",placeholder:"Why this step exists"},null,8,Tm),[[Ce,r.reason]])])]))],42,Dh))),128))])])):G("",!0)])],2)],2)):G("",!0),s.activeTab==="results"?(v(),b("section",_m,[l("div",Dm,[a[124]||(a[124]=l("div",null,[l("h2",null,"Test Results"),l("p",{class:"area-detail-subhead"},"Live and saved reports generated by KNX active and read-only tests.")],-1)),l("div",Im,[l("span",Rm,S(aa.value.length)+" available",1)])]),l("div",Nm,[l("article",km,[a[125]||(a[125]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select Test Result"),l("p",{class:"area-detail-subhead"},"Choose a report to inspect metrics, detailed checks, and suggestions.")])],-1)),l("div",Cm,[(v(!0),b(q,null,ie(aa.value,r=>(v(),b("div",{key:r.id,class:"sidebar-result-row"},[l("button",{type:"button",class:ue(["area-list-item sidebar-result-item",{active:ne.value&&ne.value.id===r.id,running:r.live===!0}]),onClick:c=>Ns(r.id,{openMenu:!1,activateResultsTab:!0,resultOnly:!0})},[l("span",Em,[l("strong",Gm,[r.live===!0?(v(),b("span",Fm)):G("",!0),l("span",null,S(Is(r)),1)]),l("span",{class:ue(["sidebar-result-status",`status-${r.overallStatus||"pass"}`])},S(r.overallStatus||"n/a"),3)]),l("span",Lm,[de(S(Ja(r)),1),r.live===!0?(v(),b("span",Mm," | running")):G("",!0)]),l("span",Om,S(Rs(r)||xt(r.generatedAt)),1),l("span",zm,S(xt(r.generatedAt)),1)],10,xm),l("button",{class:"sidebar-result-delete-button",type:"button",disabled:s.deletingTestResultId===r.id,onClick:Kt(c=>Tn(r.id),["stop"])},S(s.deletingTestResultId===r.id?"Deleting...":"Delete"),9,$m)]))),128)),aa.value.length?G("",!0):(v(),b("p",Bm,"No saved test results yet."))])]),ne.value?(v(),b("article",{key:0,ref_key:"testPlanReportRef",ref:ke,class:"area-detail"},[l("div",Km,[l("div",null,[l("h3",null,S(Is(ne.value)),1),l("p",Vm,S(Rs(ne.value)||xt(ne.value.generatedAt)),1)]),l("div",Wm,[l("span",Um,S(Ja(ne.value)),1),ne.value.live===!0?(v(),b("span",jm,[...a[126]||(a[126]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):G("",!0),l("span",Hm,S(ne.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:Rr}," Export PDF "),l("button",{class:"danger-button",type:"button",disabled:!ne.value||s.deletingTestResultId===ne.value.id,onClick:a[24]||(a[24]=r=>Tn(ne.value?.id))},S(s.deletingTestResultId===ne.value?.id?"Deleting...":"Delete"),9,Xm),l("button",{class:"secondary-button",type:"button",onClick:Lr}," Open Source Test ")])]),l("div",qm,[(v(!0),b(q,null,ie(yn(ne.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",Jm,[(v(!0),b(q,null,ie(Za(ne.value),r=>(v(),b("article",{key:r.id,class:ue(["report-check",`report-${r.status}`])},[l("div",Zm,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",Ym,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",Qm,[(v(!0),b(q,null,ie(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",ev,[(v(!0),b(q,null,ie(c.items,g=>(v(),b("span",{key:`${r.id}-${c.title}-${g.label}`},[l("strong",null,S(g.label),1),de(" "+S(g.value),1)]))),128))])]))),128))])):(v(),b("div",tv,[(v(!0),b(q,null,ie(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),de(" "+S(c.value),1)]))),128))]))],2))),128))]),Za(ne.value).length?G("",!0):(v(),b("p",av,"No detailed entries stored for this report yet.")),Ya(ne.value).length?(v(),b("div",sv,[a[127]||(a[127]=l("h4",null,"Suggestions",-1)),l("ul",nv,[(v(!0),b(q,null,ie(Ya(ne.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):G("",!0)],512)):(v(),b("article",rv,[...a[128]||(a[128]=[l("p",{class:"empty-state"},"No test result selected.",-1)])]))])])):G("",!0),s.activeTab==="overview"?(v(),b("section",iv,[l("div",ov,[a[129]||(a[129]=l("h2",null,"Top Group Addresses",-1)),l("span",lv,S(hn.value.length)+" visible",1)]),hn.value.length?(v(),b("ul",dv,[(v(!0),b(q,null,ie(hn.value,r=>(v(),b("li",{key:r.ga,class:"rank-row"},[l("span",uv,S(r.ga),1),l("span",cv,S(r.label||"Unlabeled"),1),l("strong",null,S(Number(r.count||0)),1)]))),128))])):(v(),b("p",fv,"No top group address data available yet."))])):G("",!0),s.activeTab==="overview"?(v(),b("section",pv,[l("div",gv,[a[130]||(a[130]=l("h2",null,"Event Mix",-1)),l("span",hv,S(Ds.value.length)+" event types",1)]),Ds.value.length?(v(),b("ul",mv,[(v(!0),b(q,null,ie(Ds.value,r=>(v(),b("li",{key:r.name,class:"event-row"},[l("span",vv,S(r.name),1),l("div",bv,[l("span",{class:"event-bar-fill",style:cs({width:`${Math.max(r.count/dl.value*100,6)}%`})},null,4)]),l("strong",null,S(r.count),1)]))),128))])):(v(),b("p",yv,"Event distribution will appear after the first samples."))])):G("",!0),s.activeTab==="overview"?(v(),b("section",Av,[l("div",Sv,[a[131]||(a[131]=l("h2",null,"Bus Connection Persistence",-1)),st.value?(v(),b("span",wv,S(String(st.value.currentState||"unknown")),1)):G("",!0)]),st.value?(v(),b(q,{key:0},[l("div",Pv,[l("span",Tv,"Connected "+S(Ca(st.value.connectedSec||0)),1),l("span",_v,"Disconnected "+S(Ca(st.value.disconnectedSec||0)),1),l("span",Dv,"Coverage "+S(Number(st.value.knownCoveragePct||0))+"%",1)]),l("div",Iv,[(v(!0),b(q,null,ie(fl.value,r=>(v(),b("span",{key:r.key,class:ue(["bus-segment",r.className]),style:cs({left:r.left,width:r.width}),title:r.title},null,14,Rv))),128))]),l("div",Nv,[l("span",null,S(Ps(st.value.windowStartAt)),1),l("span",null,S(Ps(st.value.windowEndAt)),1),a[132]||(a[132]=l("span",null,"Now",-1))]),a[133]||(a[133]=l("p",{class:"bus-note"},"Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.",-1))],64)):(v(),b("p",kv,"Waiting for connection persistence data..."))])):G("",!0),s.activeTab==="overview"?(v(),b("section",{key:7,ref_key:"flowCardRef",ref:Yt,class:ue(["card card-flow",{"is-fullscreen":ha.value}])},[l("div",Cv,[a[134]||(a[134]=l("h2",null,"Flow Map",-1)),l("div",xv,[l("span",Ev," Nodes "+S(na.value.nodes.length)+" | Links "+S(na.value.edges.length),1),l("button",{class:"secondary-button",type:"button",onClick:L},S(ha.value?"Exit Fullscreen":"Fullscreen"),1)])]),l("div",Gv,[l("label",Fv,[a[135]||(a[135]=l("span",null,"Max nodes",-1)),pe(l("input",{"onUpdate:modelValue":a[25]||(a[25]=r=>s.flowMaxNodes=r),type:"number",min:"4",max:"32",step:"1"},null,512),[[Ce,s.flowMaxNodes,void 0,{number:!0}]])]),l("label",Lv,[a[136]||(a[136]=l("span",null,"Find GA",-1)),pe(l("input",{"onUpdate:modelValue":a[26]||(a[26]=r=>s.flowSearch=r),type:"text",placeholder:"Search GA or label"},null,512),[[Ce,s.flowSearch]])]),l("div",Mv,[a[138]||(a[138]=l("span",null,"Select Nodes to Filter by",-1)),pe(l("select",{"onUpdate:modelValue":a[27]||(a[27]=r=>s.flowSelectedGa=r),multiple:"",size:"5"},[(v(!0),b(q,null,ie(ul.value,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}`),9,Ov))),128))],512),[[Pa,s.flowSelectedGa]]),l("label",zv,[pe(l("input",{"onUpdate:modelValue":a[28]||(a[28]=r=>s.flowShowUniversalNodes=r),type:"checkbox"},null,512),[[Bn,s.flowShowUniversalNodes]]),a[137]||(a[137]=l("span",null,"Show Universal Mode nodes",-1))])]),a[139]||(a[139]=wa('<div class="flow-legend" data-v-59cb3d8a><span data-v-59cb3d8a><i class="legend-line legend-write" data-v-59cb3d8a></i>Write</span><span data-v-59cb3d8a><i class="legend-line legend-response" data-v-59cb3d8a></i>Response</span><span data-v-59cb3d8a><i class="legend-line legend-read" data-v-59cb3d8a></i>Read</span><span data-v-59cb3d8a><i class="legend-line legend-repeat" data-v-59cb3d8a></i>Repeat</span><span data-v-59cb3d8a><i class="legend-dot legend-anomaly" data-v-59cb3d8a></i>Anomaly</span><span data-v-59cb3d8a><i class="legend-dot legend-external" data-v-59cb3d8a></i>External</span></div>',1))]),l("div",$v,[na.value.nodes.length?(v(),b("svg",{key:0,class:"flow-svg",viewBox:`0 0 ${na.value.width} ${na.value.height}`,preserveAspectRatio:"xMidYMid meet"},[l("defs",null,[(v(),b(q,null,ie(d,(r,c)=>l("marker",{id:`flow-arrow-${c}`,key:c,viewBox:"0 0 10 8",markerWidth:"10",markerHeight:"8",refX:"8.8",refY:"4",orient:"auto",markerUnits:"userSpaceOnUse"},[l("path",{d:"M0,0 L10,4 L0,8 z",fill:r},null,8,Vv)],8,Kv)),64))]),(v(!0),b(q,null,ie(na.value.edges,r=>(v(),b("path",{key:r.key,class:ue(["flow-edge",{"flow-edge-active":r.active,"flow-edge-idle":!r.active}]),d:r.d,stroke:r.color,"stroke-width":r.width,opacity:r.opacity,"marker-end":`url(#${r.markerId})`},[l("title",null,S(r.tooltip),1)],10,Wv))),128)),(v(!0),b(q,null,ie(na.value.nodes,r=>(v(),b("g",{key:r.id,class:ue(["flow-node",{"is-anomaly":r.anomalyCount>0,"is-external":!r.inFlow,"is-idle":r.isIdle}])},[l("circle",{cx:r.x,cy:r.y,r:"24"},null,8,Uv),l("text",{class:"node-label",x:r.x,y:r.y+1},S(r.shortLabel),9,jv),r.shortSubtitle?(v(),b("text",{key:0,class:"node-subtitle",x:r.x,y:r.y+38},S(r.shortSubtitle),9,Hv)):G("",!0),r.shortPayload?(v(),b("text",{key:1,class:"node-payload",x:r.x,y:r.y+52},S(r.shortPayload),9,Xv)):G("",!0),r.anomalyCount>0?(v(),b("text",{key:2,class:"node-badge",x:r.x,y:r.y-30},"anomaly x"+S(r.anomalyCount),9,qv)):G("",!0),l("title",null,S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}${r.payload?` | payload: ${r.payload}`:""}`),1)],2))),128))],8,Bv)):(v(),b("p",Jv,"No topology data available yet."))]),l("p",Zv,"Window "+S(na.value.telemetryWindowSec||0)+"s.",1)],2)):G("",!0),s.activeTab==="overview"?(v(),b("section",Yv,[l("div",Qv,[a[140]||(a[140]=l("h2",null,"Anomalies",-1)),l("span",eb,S(gn.value.length)+" recent",1)]),gn.value.length?(v(),b("div",tb,[(v(!0),b(q,null,ie(gn.value.slice(0,20),r=>(v(),b("article",{key:`${r.at}-${Ts(r).ga||""}`,class:"anomaly-card"},[l("div",ab,[l("strong",null,S(Ts(r).type||"anomaly"),1),l("span",null,S(Ts(r).ga||"no GA"),1)]),l("p",sb,S(r.at||""),1),l("pre",null,S(JSON.stringify(Ts(r),null,2)),1)]))),128))])):(v(),b("p",nb,"No anomalies detected right now."))])):G("",!0),s.activeTab==="assistant"?(v(),b("section",rb,[l("div",ib,[a[141]||(a[141]=l("h2",null,"Ask",-1)),l("span",ob,S(ta.value.llmEnabled?"AI enabled":"AI disabled"),1)]),l("div",lb,[(v(!0),b(q,null,ie(pl.value,r=>(v(),b("article",{key:r.key,class:ue(["chat-message",`chat-${r.kind}`])},[r.kind==="assistant"?(v(),b("div",{key:0,innerHTML:r.html},null,8,db)):(v(),b("pre",ub,S(r.rawText),1))],2))),128)),s.asking?(v(),b("article",cb,[...a[142]||(a[142]=[l("span",{class:"chat-pending-spinner","aria-hidden":"true"},null,-1),l("span",null,"Thinking...",-1)])])):G("",!0)]),l("div",fb,[(v(!0),b(q,null,ie(il.value,r=>(v(),b("button",{key:r.key,class:"preset-button",type:"button",disabled:s.asking||!ta.value.llmEnabled,onClick:c=>_n(r.text)},S(r.text),9,pb))),128))]),l("div",gb,[pe(l("input",{"onUpdate:modelValue":a[29]||(a[29]=r=>s.chatDraft=r),class:"ask-input",type:"text",disabled:s.asking||!ta.value.llmEnabled,placeholder:"Ask a question about KNX traffic...",onKeydown:a[30]||(a[30]=Hc(Kt(r=>_n(),["prevent"]),["enter"]))},null,40,hb),[[Ce,s.chatDraft]]),l("button",{class:"primary-button",type:"button",disabled:s.asking||!ta.value.llmEnabled,onClick:a[31]||(a[31]=r=>_n())}," Send ",8,mb)])])):G("",!0),s.activeTab==="settings"?(v(),b("section",vb,[a[149]||(a[149]=l("div",{class:"card-head"},[l("div",null,[l("h2",null,"Settings"),l("p",{class:"area-detail-subhead"},"Manage node options and full configuration import/export.")])],-1)),l("div",bb,[l("button",{class:ue(["settings-tab-button",{active:s.settingsTab==="node"}]),type:"button",onClick:a[32]||(a[32]=r=>Fr("node"))}," KNX AI Node ",2),l("button",{class:ue(["settings-tab-button",{active:s.settingsTab==="config"}]),type:"button",onClick:a[33]||(a[33]=r=>Fr("config"))}," Import / Export ",2)]),s.settingsTab==="node"?(v(),b("article",yb,[a[145]||(a[145]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"KNX AI Node"),l("span",{class:"meta-chip"},"Runtime preferences")],-1)),a[146]||(a[146]=l("p",{class:"area-detail-subhead"},"Select the node used by this UI and control refresh behavior.",-1)),l("div",Ab,[l("label",Sb,[a[143]||(a[143]=l("span",null,"Node",-1)),pe(l("select",{"onUpdate:modelValue":a[34]||(a[34]=r=>s.selectedNodeId=r),class:"node-select",onChange:Tl},[(v(!0),b(q,null,ie(s.nodes,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.name||"KNX AI"}${r.gatewayName?` | ${r.gatewayName}`:""}`),9,wb))),128))],544),[[Pa,s.selectedNodeId]])]),l("label",Pb,[pe(l("input",{"onUpdate:modelValue":a[35]||(a[35]=r=>s.autoRefresh=r),type:"checkbox"},null,512),[[Bn,s.autoRefresh]]),a[144]||(a[144]=l("span",null,"Auto refresh",-1))])])])):(v(),b("article",Tb,[a[147]||(a[147]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"Import / Export"),l("span",{class:"meta-chip"},"Full configuration")],-1)),a[148]||(a[148]=l("p",{class:"area-detail-subhead"},"Export or import the full KNX AI configuration for the selected node.",-1)),l("div",_b,[l("button",{class:"secondary-button",type:"button",disabled:!s.selectedNodeId,onClick:Sd}," Export Configuration ",8,Db),l("button",{class:"secondary-button",type:"button",disabled:!s.selectedNodeId,onClick:wd}," Import Configuration ",8,Ib)])])),l("input",{ref_key:"configImportRef",ref:Ia,type:"file",accept:"application/json,.json",class:"hidden-file-input",onChange:Pd},null,544)])):G("",!0)])]),s.areaLlmRegenerating||s.areaLlmBulkDeleting||s.testPlanGenerating?(v(),b("div",Rb,[l("div",Nb,[a[150]||(a[150]=l("span",{class:"running-spinner global-wait-spinner","aria-hidden":"true"},null,-1)),l("strong",null,S(s.testPlanGenerating?"Building Test Plan":s.areaLlmBulkDeleting?"Deleting AI Areas":"Regenerating AI Areas"),1),l("span",null,S(s.testPlanGenerating?"Please wait while the template builder generates the test plan.":s.areaLlmBulkDeleting?"Please wait while AI-generated areas are removed.":"Please wait, this can take a while with large ETS projects."),1)])])):G("",!0),s.testPlanRunConfirmOpen?(v(),b("div",{key:1,class:"modal-backdrop",onClick:Wr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"run-test-title",onClick:a[37]||(a[37]=Kt(()=>{},["stop"]))},[a[151]||(a[151]=l("h3",{id:"run-test-title"},"Start test?",-1)),l("p",kb,S(s.testPlanRunMode==="repeat"?"This will send real telegrams on the KNX bus and repeat the selected test plan until you press Stop Repeat.":"This will send real telegrams on the KNX bus for the selected test plan."),1),l("div",Cb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Wr}," Cancel "),l("button",{class:"primary-button",type:"button",disabled:s.testPlanRunning,onClick:a[36]||(a[36]=r=>Ad(s.testPlanRunMode))}," Start Test ",8,xb)])])])):G("",!0),s.testPlanUnsavedConfirmOpen?(v(),b("div",{key:2,class:"modal-backdrop",onClick:jr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-plan-title",onClick:a[39]||(a[39]=Kt(()=>{},["stop"]))},[a[152]||(a[152]=l("h3",{id:"unsaved-plan-title"},"Unsaved changes",-1)),l("p",Eb,"Save or discard the current plan changes before opening "+S(s.testPlanPendingActionLabel||"another plan")+".",1),l("div",Gb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:jr}," Stay Here "),l("button",{class:"secondary-button",type:"button",onClick:a[38]||(a[38]=r=>{gd(),Hr()})}," Discard Changes "),l("button",{class:"primary-button",type:"button",disabled:s.testPlanSaving||!s.testPlanDraft,onClick:hd},S(s.testPlanSaving?"Saving...":"Save and Continue"),9,Fb)])])])):G("",!0),s.areaUnsavedConfirmOpen?(v(),b("div",{key:3,class:"modal-backdrop",onClick:Gr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-area-title",onClick:a[40]||(a[40]=Kt(()=>{},["stop"]))},[a[153]||(a[153]=l("h3",{id:"unsaved-area-title"},"Unsaved changes",-1)),a[154]||(a[154]=l("p",{class:"area-detail-subhead"},"Discard the current area changes and close the editor?",-1)),l("div",{class:"modal-actions"},[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Gr}," Stay Here "),l("button",{class:"primary-button",type:"button",onClick:kl}," Discard and Close ")])])])):G("",!0)],2)],64))}},Kb=sf(Bb,[["__scopeId","data-v-59cb3d8a"]]);Jc(Kb).mount("#app");export{tf as _};
3
+ `)}),fl=j(()=>{const n=st.value;return!n||!Array.isArray(n.segments)?[]:n.segments.map((a,r)=>{const c=Math.max(0,Math.min(1,Number(a&&a.ratioStart)||0)),g=Math.max(0,Math.min(1,Number(a&&a.ratioWidth)||0));return{key:`${r}-${a?.startedAt||""}`,left:`${(c*100).toFixed(3)}%`,width:`${Math.max(g*100,.4).toFixed(3)}%`,title:`${a?.state==="connected"?"Connected":"Disconnected"} | ${Ps(a?.startedAt)} -> ${Ps(a?.endedAt)} | ${Ca(a?.durationSec||0)}`,className:a?.state==="connected"?"segment-connected":"segment-disconnected"}}).filter(a=>Number.parseFloat(a.width)>0)}),pl=j(()=>s.chatMessages.map((n,a)=>({key:`${a}-${n.kind}`,kind:n.kind,rawText:H(n.text),html:n.kind==="assistant"?ws(n.text):""})));De(()=>s.selectedNodeId,n=>{ea(Ei,n||""),s.areaSelectedId="",s.testAreaSelectedId=x(n||"")}),De(()=>s.autoRefresh,n=>{ka(Gi,n)}),De(()=>s.voiceEnabled,n=>{ka(Mi,n),n!==!0&&Na()}),De(ve,n=>{ka(Oi,n)}),De(()=>s.activeTab,n=>{ea(Lb,n||"overview")}),De(()=>s.settingsTab,n=>{ea(Fi,n||"config")}),De(()=>s.flowMaxNodes,n=>{s.flowMaxNodes=Math.max(4,Math.min(32,Number(n)||14)),M()}),De(()=>(s.flowSelectedGa||[]).join("|"),()=>{M()}),De(()=>s.flowShowUniversalNodes,n=>{n!==!0&&(s.flowSelectedGa=(s.flowSelectedGa||[]).filter(a=>{const r=mn.value.nodes.find(c=>c.id===a);return!un(r)})),M()}),De(()=>ye.value.map(n=>n.id).join("|"),()=>{if(!ye.value.length){s.areaSelectedId="",s.testAreaSelectedId="",s.activeTab==="tests"&&(s.activeTab="areas");return}if(s.areaDraftIsNew===!0&&!String(s.areaSelectedId||"").trim()){const r=String(s.testAreaSelectedId||"").trim();if(k())return;(!r||!ye.value.find(c=>c.id===r))&&(s.testAreaSelectedId=ye.value[0].id);return}const n=String(s.areaSelectedId||"").trim();n&&!ye.value.find(r=>r.id===n)&&(s.areaSelectedId="");const a=String(s.testAreaSelectedId||"").trim();k()||(!a||!ye.value.find(r=>r.id===a))&&(s.testAreaSelectedId=ye.value[0].id)}),De(()=>s.testAreaSelectedId,n=>{s.selectedNodeId&&C(s.selectedNodeId,n||"")}),De(()=>Ee.value?JSON.stringify({id:Ee.value.id,name:Ee.value.name,customDescription:Ee.value.customDescription||"",tags:Ee.value.tags||[]}):"",()=>{if(s.areaDraftIsNew===!0&&!String(s.areaSelectedId||"").trim())return;const n=Ee.value;if(!n){s.areaDraftId="",s.areaDraftName="",s.areaDraftDescription="",s.areaDraftTags="",s.areaDraftGaList=[],s.areaLlmPrompt="",s.areaLlmError="",s.areaDraftIsNew=!1;return}s.areaDraftId=String(n.id||""),s.areaDraftName=String(n.name||""),s.areaDraftDescription=String(n.customDescription||""),s.areaDraftTags=Array.isArray(n.tags)?n.tags.join(", "):"",s.areaDraftGaList=Array.isArray(n.gaList)?n.gaList.slice():[],s.areaLlmPrompt="",s.areaLlmError="",s.areaDraftIsNew=!1}),De(()=>Gt.value?Gt.value.id:"",async(n,a)=>{if(!n||!s.selectedNodeId){s.testPlanCatalog=null,s.testPlanCatalogError="";return}a&&n!==a&&(s.testPlanRunConfirmOpen=!1,s.testPlanDraft&&!s.testPlanSelectedId&&(s.testPlanDraft.areaId=String(n||""),s.testPlanDraft.areaName=Gt.value?String(Gt.value.path||Gt.value.name||""):"")),await Mr()}),De(()=>ba.value.map(n=>n.id).join("|"),()=>{if(!ba.value.length){s.profileSelectedId="";return}s.profileDraftMode!==!0&&(!s.profileSelectedId||!ba.value.find(n=>n.id===s.profileSelectedId))&&(s.profileSelectedId=ba.value[0].id)}),De(()=>yt.value?JSON.stringify({id:yt.value.id,name:yt.value.name,description:yt.value.description,targetTags:yt.value.targetTags||[],minActivityPct:yt.value.minActivityPct,maxSilentPct:yt.value.maxSilentPct,maxAnomalies:yt.value.maxAnomalies,builtIn:yt.value.builtIn===!0}):"",()=>{const n=yt.value;if(!n){s.profileDraftId="",s.profileDraftName="",s.profileDraftDescription="",s.profileDraftTargetTags="",s.profileDraftMinActivityPct=20,s.profileDraftMaxSilentPct=60,s.profileDraftMaxAnomalies=2;return}s.profileDraftId=String(n.id||""),s.profileDraftName=String(n.name||""),s.profileDraftDescription=String(n.description||""),s.profileDraftTargetTags=Array.isArray(n.targetTags)?n.targetTags.join(", "):"",s.profileDraftMinActivityPct=Number(n.minActivityPct||20),s.profileDraftMaxSilentPct=Number(n.maxSilentPct||60),s.profileDraftMaxAnomalies=Number(n.maxAnomalies||2)}),De(()=>ya.value.map(n=>n.id).join("|"),()=>{if(!ya.value.length){s.actuatorPresetSelectedId="";return}s.actuatorDraftMode!==!0&&(!s.actuatorPresetSelectedId||!ya.value.find(n=>n.id===s.actuatorPresetSelectedId))&&(s.actuatorPresetSelectedId=ya.value[0].id)}),De(()=>lt.value?JSON.stringify({id:lt.value.id,name:lt.value.name,description:lt.value.description,commandGA:lt.value.commandGA,commandDPT:lt.value.commandDPT,commandPayload:lt.value.commandPayload,statusGA:lt.value.statusGA,statusDPT:lt.value.statusDPT,statusWriteTimeoutMs:lt.value.statusWriteTimeoutMs,statusResponseTimeoutMs:lt.value.statusResponseTimeoutMs}):"",()=>{const n=lt.value;if(!n){s.actuatorDraftId="",s.actuatorDraftName="",s.actuatorDraftDescription="",s.actuatorDraftCommandGA="",s.actuatorDraftCommandDPT="",s.actuatorDraftCommandPayload="",s.actuatorDraftStatusGA="",s.actuatorDraftStatusDPT="",s.actuatorDraftStatusWriteTimeoutMs=5e3,s.actuatorDraftStatusResponseTimeoutMs=5e3;return}s.actuatorDraftId=String(n.id||""),s.actuatorDraftName=String(n.name||""),s.actuatorDraftDescription=String(n.description||""),s.actuatorDraftCommandGA=String(n.commandGA||""),s.actuatorDraftCommandDPT=String(n.commandDPT||""),s.actuatorDraftCommandPayload=String(n.commandPayload||""),s.actuatorDraftStatusGA=String(n.statusGA||""),s.actuatorDraftStatusDPT=String(n.statusDPT||""),s.actuatorDraftStatusWriteTimeoutMs=Number(n.statusWriteTimeoutMs||5e3),s.actuatorDraftStatusResponseTimeoutMs=Number(n.statusResponseTimeoutMs||5e3)}),De(()=>vt.value.map(n=>n.id).join("|"),()=>{if(!vt.value.length){s.testPlanSelectedId="";return}s.testPlanSelectedId&&!vt.value.find(n=>n.id===s.testPlanSelectedId)&&(s.testPlanSelectedId="")}),De(()=>aa.value.map(n=>n.id).join("|"),()=>{if(!aa.value.length){s.selectedTestResultId="";return}(!s.selectedTestResultId||!aa.value.find(n=>n.id===s.selectedTestResultId))&&(s.selectedTestResultId=String(aa.value[0].id||"")),s.liveTestResultId&&qa.value.some(n=>String(n&&n.id?n.id:"")===s.liveTestResultId)&&s.testPlanRunning!==!0&&(s.liveTestResultId="")}),De(()=>`${s.selectedTestResultId}|${s.activeTab}`,()=>{s.activeTab!=="results"||!s.selectedTestResultId||requestAnimationFrame(()=>{const n=document.querySelector(".results-page-list .area-list-item.active");n&&typeof n.scrollIntoView=="function"&&n.scrollIntoView({block:"nearest",behavior:"smooth"})})});function vn(n,a){s.chatMessages.push({kind:n,text:a})}function gl(){s.chatMessages=[]}function hl(n,a=null){const r=Array.isArray(n)?n:[];return{totalSteps:Math.max(r.length,Number(a||0)),pass:r.filter(g=>g&&g.status==="pass").length,warn:r.filter(g=>g&&g.status==="warn").length,fail:r.filter(g=>g&&g.status==="fail").length}}function ml(n){const a=[];return Number(n&&n.fail)>0&&a.push("At least one feedback object returned an incoherent value. Check the actuator/status pairing in ETS first."),Number(n&&n.warn)>0&&a.push("Some steps did not receive feedback in time. Verify the status group address and the actuator programming."),a.length||a.push("The selected active test completed with coherent feedback on all verified steps."),a}function bn({plan:n,area:a,stepResults:r,reportId:c=""}){const g=hl(r,Array.isArray(n&&n.steps)?n.steps.length:0),D=g.fail>0?"fail":g.warn>0?"warn":"pass";return{id:String(c||`${n.id||"plan"}:${Date.now()}`),generatedAt:new Date().toISOString(),mode:"ai_test_plan",overallStatus:D,name:n.name,description:n.description,prompt:n.prompt,area:a,metrics:g,steps:r,suggestions:ml(g)}}function Is(n){return!n||typeof n!="object"?"Test result":String(n.name||n.profile?.name||"Test result")}function Rs(n){return!n||typeof n!="object"?"":String(n.area?.path||n.area?.name||n.area?.id||"")}function Ja(n){const a=String(n&&n.mode?n.mode:"").trim().toLowerCase();return a==="ai_test_plan"?"Test Plan":a==="active_test"?"Actuator":a==="read_only"?"Read-only":a||"Test"}function yn(n){const a=n&&n.metrics&&typeof n.metrics=="object"?n.metrics:{};return String(n&&n.mode?n.mode:"")==="read_only"?[{label:"Total GA",value:Number(a.totalGAs||0)},{label:"Active GA",value:Number(a.activeGaCount||0)},{label:"Silent GA",value:Number(a.silentGaCount||0)},{label:"Anomalies",value:Number(a.anomalyCount||0)}]:String(n&&n.mode?n.mode:"")==="active_test"?[{label:"Command GA",value:n&&n.command&&n.command.ga?n.command.ga:"n/a"},{label:"Status GA",value:n&&(n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga)?n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga:"n/a"},{label:"Status",value:n&&n.overallStatus?n.overallStatus:"n/a"},{label:"Generated",value:xt(n&&n.generatedAt?n.generatedAt:"")||"n/a"}]:[{label:"Total Steps",value:Number(a.totalSteps||0)},{label:"Pass",value:Number(a.pass||0)},{label:"Warn",value:Number(a.warn||0)},{label:"Fail",value:Number(a.fail||0)}]}function Ft(n){if(n==null||n==="")return"n/a";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function An(n,a,r="n/a"){const c=String(a||"").trim(),g=n==null?"":String(n);if(!c)return g||r;const D=Dn(g,c),N=ra(c).find(z=>String(z.value)===String(D));return N&&N.label?N.label:g||r}function Dr(n){if(!n||typeof n!="object")return"n/a";const a=n.ga||"n/a";if(n.ok===!0){const r=n.payloadLabel||Ft(n.payload),c=n.coherent===!1?"mismatch":"ok";return`${a} / ${r} / ${c}`}return`${a} / ${n.error||"timeout"}`}function Sn(n){return xt(n||"")||"n/a"}function vl(n,a="report"){return String(n||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||a}function Ir({command:n,statusWrite:a,statusResponse:r,statusRead:c,expectedPayloadLabel:g,expectedPayload:D}){const N=r||c;return[{title:"Command",items:[{label:"Command",value:`${n?.ga||"n/a"} / ${n?.payloadLabel||Ft(n?.payload)}`},{label:"Command Sent",value:Sn(n?.sentAt)}]},{title:"Spontaneous Write From Status GA",items:[{label:"Result",value:Dr(a)},{label:"Expected",value:a?.expectedPayloadLabel||g||Ft(D)},{label:"Received At",value:Sn(a?.at)},{label:"Event",value:a?.event||"n/a"}]},{title:"Active Read Request To Status GA",items:[{label:"Result",value:Dr(N)},{label:"Expected",value:N?.expectedPayloadLabel||g||Ft(D)},{label:"Received At",value:Sn(N?.at)},{label:"Event",value:N?.event||"n/a"}]}]}function Za(n){return!n||typeof n!="object"?[]:Array.isArray(n.steps)&&n.steps.length?n.steps.map(a=>{const r=a.kind==="wait"?[{label:"Wait",value:`${Number(a.delayMs||0)} ms`},{label:"Reason",value:a.reason||"Pause before next action"}]:[];return{id:String(a.id||`${n.id}-step`),title:a.title||a.id||"Step",status:a.status||"pass",message:a.message||a.description||"",details:r,detailGroups:a.kind==="wait"?[]:Ir({command:a.command,statusWrite:a.statusWrite,statusResponse:a.statusResponse,statusRead:a.statusRead,expectedPayloadLabel:a.expectedPayloadLabel,expectedPayload:a.expectedPayload})}}):Array.isArray(n.checks)&&n.checks.length?n.checks.map(a=>({id:String(a.id||`${n.id}-check`),title:a.title||a.id||"Check",status:a.status||"pass",message:a.message||"",details:[{label:"Metrics",value:Ft(a.metrics||{})},{label:"Sample",value:Ft(a.sample||[])}]})):String(n.mode||"")==="active_test"?[{id:String(n.id||"active-test"),title:n.name||"Actuator Test",status:n.overallStatus||"pass",message:n.overallStatus==="pass"?"Both feedback checks passed.":n.overallStatus==="warn"?"One feedback check passed and one failed.":"Both feedback checks failed.",details:[],detailGroups:Ir({command:n.command,statusWrite:n.statusWrite,statusResponse:n.statusResponse,statusRead:n.statusRead,expectedPayloadLabel:n.statusResponse?.expectedPayloadLabel||n.statusWrite?.expectedPayloadLabel||n.statusRead?.expectedPayloadLabel,expectedPayload:n.statusRead?.expectedPayload})}]:[]}function Ya(n){return Array.isArray(n&&n.suggestions)?n.suggestions:[]}function bl(n){const a=n&&n.source&&typeof n.source=="object"?n.source:{},r=String(n&&n.mode?n.mode:"").trim().toLowerCase(),c=String(a.areaId||n?.area?.id||"").trim();return r==="ai_test_plan"?{type:"ai_test_plan",planId:String(a.planId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:r==="read_only"?{type:"profile",profileId:String(a.profileId||n?.profile?.id||"").trim(),areaId:c}:r==="active_test"?{type:"actuator_test",presetId:String(a.presetId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:{type:"",areaId:c}}async function Rr(){const n=ne.value;if(!n||typeof n!="object"){_("No test result selected to export");return}try{const{jsPDF:a}=await tf(async()=>{const{jsPDF:_e}=await import("./chunk-jspdf.es.min.js").then(At=>At.j);return{jsPDF:_e}},[],import.meta.url),r=new a({orientation:"portrait",unit:"pt",format:"a4"}),c=r.internal.pageSize.getWidth(),g=r.internal.pageSize.getHeight(),D=42,N=42,z=44,$=42,Q=c-D-N;let X=z;const fe=(_e=14)=>{X+_e<=g-$||(r.addPage(),X=z)},Z=(_e,{size:At=11,bold:Ot=!1,indent:zt=0,color:$t=[35,41,52],lineHeight:xs=14,gapAfter:Es=0}={})=>{const Qa=String(_e||"").trim();if(!Qa)return;r.setFont("helvetica",Ot?"bold":"normal"),r.setFontSize(At),r.setTextColor($t[0],$t[1],$t[2]);const Gs=r.splitTextToSize(Qa,Math.max(80,Q-zt));for(const Cn of Gs)fe(xs),r.text(String(Cn),D+zt,X),X+=xs;Es>0&&(X+=Es)},Y=()=>{fe(12),r.setDrawColor(210,214,222),r.line(D,X,c-N,X),X+=12},ee=Is(n),ge=xt(new Date().toISOString())||new Date().toISOString(),ia=xt(n.generatedAt||"")||String(n.generatedAt||"n/a"),w=Rs(n)||"n/a",V=Ja(n),ae=String(n.overallStatus||"n/a"),Fe=yn(n),je=Za(n),Qe=Ya(n);Z("KNX AI Test Result",{size:17,bold:!0,color:[20,28,39],lineHeight:20}),Z(ee,{size:14,bold:!0,color:[20,28,39],lineHeight:17,gapAfter:4}),Z(`Exported: ${ge}`,{size:10,color:[88,96,113]}),Z(`Generated: ${ia}`,{size:10,color:[88,96,113]}),Z(`Mode: ${V}`,{size:10,color:[88,96,113]}),Z(`Status: ${ae}`,{size:10,color:[88,96,113]}),Z(`Area: ${w}`,{size:10,color:[88,96,113]}),Z(`Report ID: ${String(n.id||"n/a")}`,{size:10,color:[88,96,113],gapAfter:2}),Y(),Fe.length&&(Z("Metrics",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Fe.forEach(_e=>{Z(`${_e.label}: ${Ft(_e.value)}`,{size:10,color:[35,41,52]})}),X+=4,Y()),Z(`Checks (${je.length})`,{size:12,bold:!0,color:[20,28,39],gapAfter:2}),je.length?je.forEach((_e,At)=>{Z(`${At+1}. ${_e.title||"Check"} [${String(_e.status||"n/a").toUpperCase()}]`,{size:11,bold:!0,color:[31,41,55]}),Z(_e.message||"No additional details available.",{size:10,color:[70,78,94]}),Array.isArray(_e.detailGroups)&&_e.detailGroups.length?_e.detailGroups.forEach(Ot=>{Z(Ot.title||"Details",{size:10,bold:!0,indent:12,color:[35,41,52]}),(Array.isArray(Ot.items)?Ot.items:[]).forEach($t=>{Z(`${$t.label}: ${Ft($t.value)}`,{size:10,indent:24,color:[70,78,94]})})}):(Array.isArray(_e.details)?_e.details:[]).forEach(zt=>{Z(`${zt.label}: ${Ft(zt.value)}`,{size:10,indent:12,color:[70,78,94]})}),X+=2}):Z("No detailed entries stored for this report yet.",{size:10,color:[88,96,113]}),Qe.length&&(X+=4,Y(),Z("Suggestions",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Qe.forEach((_e,At)=>{Z(`${At+1}. ${String(_e||"")}`,{size:10,color:[35,41,52]})}));const nt=new Date(n.generatedAt||Date.now()),oa=Number.isFinite(nt.getTime())?nt.toISOString().replace(/[:.]/g,"-"):String(Date.now()),Fa=`knx-ai-test-result-${vl(ee,"report")}-${oa}.pdf`;r.save(Fa),_(`PDF exported (${Fa})`)}catch(a){s.lastError=a&&a.message?a.message:"Failed to export PDF",_(s.lastError)}}function Nr(n,a,r=new Date().toISOString()){const c=n&&n.kind==="wait";return{id:n&&n.id?n.id:`step-${Date.now()}`,title:n&&n.title?n.title:"Test Step",description:n&&n.description?n.description:"",reason:n&&n.reason?n.reason:"",kind:n&&n.kind?n.kind:"write_and_verify",status:"warn",command:c?null:{ga:n&&n.commandGA?n.commandGA:"",dpt:n&&n.commandDPT?n.commandDPT:"",payload:n?n.commandPayload:void 0,sentAt:r},statusWrite:null,statusResponse:null,statusRead:null,expectedPayload:c?void 0:n?n.expectedPayload:void 0,delayMs:Number(n&&n.delayMs?n.delayMs:0),statusWriteTimeoutMs:c?0:Number(n&&n.statusWriteTimeoutMs?n.statusWriteTimeoutMs:0),statusResponseTimeoutMs:c?0:Number(n&&n.statusResponseTimeoutMs?n.statusResponseTimeoutMs:0),message:a&&a.message?a.message:"Failed to run step"}}async function kr(n){return Na(),await new Promise((a,r)=>{const c=URL.createObjectURL(n),g=new Audio(c);Ue=g;const D=()=>{Ue===g&&(Ue=null),g.onended=null,g.onerror=null,URL.revokeObjectURL(c)};g.onended=()=>{D(),a()},g.onerror=()=>{D(),r(new Error("Audio playback failed"))};const N=g.play();N&&typeof N.then=="function"&&N.catch(z=>{D(),r(z instanceof Error?z:new Error(String(z)))})})}function yl(n,a=null){const r=String(n||"").trim();return!r||!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps)?a:s.testPlanDraft.steps.find(c=>String(c&&c.id?c.id:"")===r)||a}function Cr(n,a=""){const r=`${String(n||"")} ${String(a||"")}`.trim().toLowerCase(),c=` ${r} `;if(!r)return String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it";const g=z=>z.some($=>c.includes($)),D=[{voice:"it",score:[g([" accendi "," spegni "," stato "," verifica "," coerente "," leggi "," apri "," chiudi "," attiva "," controlla "," area "," luce "," luci "," tapparella "," tapparelle "," clima "])?3:0,/[àèéìíîòóù]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"en",score:[g([" turn on "," turn off "," verify "," feedback "," status "," check "," read "," open "," close "," command "," area "," light "," lights "])?3:0].reduce((z,$)=>z+$,0)},{voice:"fr",score:[g([" allume "," éteins "," etat "," état "," vérifier "," ouvre "," ferme "," lumière "," lumières "," zone "])?3:0,/[àâçéèêëîïôûùüÿœ]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"de",score:[g([" einschalten "," ausschalten "," status "," prüfen "," öffne "," schließe "," licht "," bereich "])?3:0,/[äöüß]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"es",score:[g([" enciende "," apaga "," estado "," verifica "," abre "," cierra "," luz "," luces "," zona "])?3:0,/[áéíóúñü]/.test(r)?2:0].reduce((z,$)=>z+$,0)},{voice:"pt",score:[g([" liga "," desliga "," estado "," verificar "," abre "," fecha "," luz "," luzes "," área "])?3:0,/[ãõâêôçáéíóú]/.test(r)?2:0].reduce((z,$)=>z+$,0)}];return D.sort((z,$)=>$.score-z.score),D[0]&&D[0].score>0?D[0].voice:String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it"}function Al(n={},a=null){const r=yl(n&&n.id?n.id:"",n),c=String(r&&r.title?r.title:"").trim(),g=String(r&&r.description?r.description:"").trim();return{text:`${Number.isInteger(a)&&a>0?`${a}. `:""}${c}`.trim(),voice:Cr(c,g)}}async function Sl(n={},a=null){if(s.voiceEnabled!==!0)return;const r=Al(n,a),c=String(r.text||"").trim();if(!c||!s.selectedNodeId)return;const g=await W(`${I("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,text:c,voice:r.voice,slow:!1})});await kr(g)}async function xr(n,a=""){if(s.voiceEnabled!==!0||!s.selectedNodeId)return;const r=String(n||"").trim();if(!r)return;const c=Cr(r,a),g=await W(`${I("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,text:r,voice:c,slow:!1})});await kr(g)}function wl(n){const a=u&&n.find(g=>g.id===u)?u:"",r=Ha(Ei,""),c=r&&n.find(g=>g.id===r)?r:"";return a||c||(n[0]?n[0].id:"")}async function wn({preserveSelection:n=!0}={}){s.loadingNodes=!0,_("Loading nodes...");try{const a=await E(I("nodes")),r=Array.isArray(a&&a.nodes)?a.nodes:[];if(s.nodes=r,!r.length){s.selectedNodeId="",s.stateData=null,s.lastError="No KNX AI nodes found.",_(s.lastError);return}const c=n&&s.selectedNodeId&&r.find(g=>g.id===s.selectedNodeId)?s.selectedNodeId:wl(r);s.selectedNodeId=c,s.lastError="",_("Ready")}catch(a){s.lastError=a.message||"Failed to load nodes",_(s.lastError)}finally{s.loadingNodes=!1}}async function Lt({fresh:n=!1}={}){if(!(!s.selectedNodeId||s.loadingState)){s.loadingState=!0,n&&_("Loading...");try{const a=s.testPlanRunning===!0&&s.liveTestResultId?Et(s.stateData&&s.stateData.testPlanReport?s.stateData.testPlanReport:null,null):null,r=await E(I(`state?nodeId=${encodeURIComponent(s.selectedNodeId)}&fresh=${n?1:0}`));a&&a.id===s.liveTestResultId&&(r.testPlanReport=a),s.stateData=r,is(()=>{s.areaDraftIsNew!==!0&&s.areaSelectedId&&!ye.value.find(c=>c.id===s.areaSelectedId)&&(s.areaSelectedId=""),!k()&&!s.testAreaSelectedId&&ye.value[0]&&(s.testAreaSelectedId=ye.value[0].id)}),s.lastError="",_("Ready")}catch(a){s.lastError=a.message||"Failed to load state",_(s.lastError)}finally{s.loadingState=!1}}}async function Pl(){await wn({preserveSelection:!0}),await Lt({fresh:!0}),await Ga()}async function Tl(){gl(),s.selectedTestResultId="",s.liveTestResultId="",s.testResultFocusMode=!1,s.testAreaSelectedId=x(s.selectedNodeId),await Lt({fresh:!0}),await Ga()}function Er(){s.selectedTestResultId="",s.testResultFocusMode=!1,s.testPlanSelectedId="",s.testPlanDraft=null,s.testPlanPrompt="",s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.testPlanUnsavedConfirmOpen=!1,s.showAiPlanner=!0,s.testTemplateBuilderFocus=!1,!k()&&!s.testAreaSelectedId&&ye.value[0]&&(s.testAreaSelectedId=ye.value[0].id),Nn(),Rn()}function _l(){s.showAiPlanner=!0,s.testTemplateBuilderFocus=!0}function Dl(){s.testTemplateBuilderFocus=!1,s.showAiPlanner=!1}function Il(){s.showAiAreaBuilder=!0,s.areaBuilderFocus=!0}function Rl(){s.areaBuilderFocus=!1,s.showAiAreaBuilder=!1}function Pn(){s.areaSelectedId="",s.areaDraftIsNew=!1,s.areaDraftId="",s.areaDraftName="",s.areaDraftDescription="",s.areaDraftTags="",s.areaDraftGaList=[],s.areaLlmPrompt="",s.areaLlmError="",s.areaSearch="",s.areaSearchOpen=!1,s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1,s.areaUnsavedConfirmOpen=!1}function Nl(){if(ll.value){s.areaUnsavedConfirmOpen=!0;return}Pn(),_("Area editor closed")}function Gr(){s.areaUnsavedConfirmOpen=!1}function kl(){s.areaUnsavedConfirmOpen=!1,Pn(),_("Area editor closed")}function Cl(){s.testPlanRunning||kn(()=>{Er(),s.testPlanSearchOpen=!1,_("Test editor closed")},"close the current test editor")}function Fr(n){const a=String(n||"").trim();a!=="node"&&a!=="config"||(s.settingsTab=a)}function Ea(n){const a=String(n||"").trim();if(a){if(a==="tests"&&ye.value.length===0){_("Define at least one area before using Tests");return}if(a==="areas"){const r=!!String(s.areaSelectedId||"").trim(),c=s.areaDraftIsNew===!0;!r&&!c&&Pn()}if(a==="tests"){const r=!!String(s.testPlanSelectedId||"").trim(),c=!!String(s.selectedTestResultId||"").trim(),g=!!s.testPlanDraft;!r&&!c&&!g&&Er()}s.activeTab!==a?s.activeTab=a:(s.activeTab="",is(()=>{s.activeTab=a})),h()}}async function Tn(n){const a=String(n||"").trim();if(!(!a||!s.selectedNodeId||s.deletingTestResultId)){s.deletingTestResultId=a;try{const r=await E(I("test-results/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,reportId:a})}),c=Array.isArray(r&&r.testResults)?r.testResults:[];s.stateData=Object.assign({},s.stateData||{},{testResults:c}),s.selectedTestResultId===a&&(s.selectedTestResultId=c[0]&&c[0].id?String(c[0].id):"",c.length||(s.testResultFocusMode=!1)),s.liveTestResultId===a&&(s.liveTestResultId=""),_("Test result deleted")}catch(r){s.lastError=r.message||"Failed to delete test result",_(s.lastError)}finally{s.deletingTestResultId=""}}}function Ns(n,{openMenu:a=!0,activateTestsTab:r=!1,activateResultsTab:c=!1,resultOnly:g=!0}={}){const D=String(n||"").trim();if(!D)return;a&&(s.testResultsMenuOpen=!0);const N=c?"results":r?"tests":"",z=()=>{N&&(s.activeTab=N),s.selectedTestResultId=D,s.testResultFocusMode=g===!0,is(()=>{const $=document.querySelector(".results-page-list .area-list-item.active");$&&typeof $.scrollIntoView=="function"&&$.scrollIntoView({block:"nearest",behavior:"smooth"})})};s.selectedTestResultId===D&&(!N||s.activeTab===N)||z()}function Lr(){const n=ne.value;if(!n)return;if(!ye.value.length){_("Define at least one area before using Tests");return}const a=bl(n);if(s.activeTab="tests",s.testResultFocusMode=!1,a.type==="ai_test_plan"&&a.planId){const r=vt.value.find(c=>c&&c.id===a.planId);if(r){Ur(r),_(`Opened source plan "${r.name||r.id}"`);return}}if(a.type==="profile"){_("Returned to the Tests page for the source read-only profile.");return}if(a.type==="actuator_test"){_("Returned to the Tests page for the source actuator test.");return}_("Returned to the Tests page.")}async function xl(n){if(!s.selectedNodeId||!n||typeof n!="object")return null;const a=await E(I("test-results/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,report:n})});return s.stateData=Object.assign({},s.stateData||{},{testResults:a.testResults||qa.value,testPlanReport:a.report&&a.report.mode==="ai_test_plan"?a.report:ct.value,actuatorTestReport:a.report&&a.report.mode==="active_test"?a.report:rl.value,profileReport:a.report&&a.report.mode==="read_only"?a.report:nl.value}),a&&a.report&&a.report.id&&(s.liveTestResultId="",Ns(a.report.id,{openMenu:!0,activateResultsTab:!0,resultOnly:!0})),a}async function _n(n=""){const a=String(n||"").trim(),r=String(s.chatDraft||"").trim(),c=a||r;if(!(!c||!s.selectedNodeId)){vn("user",c),a||(s.chatDraft=""),s.asking=!0,_("Asking...");try{const g=await E(I("ask"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,question:c})});vn("assistant",g&&g.answer!==void 0?g.answer:""),_("Ready")}catch(g){vn("error",g.message||"Ask failed"),_(g.message||"Ask failed")}finally{s.asking=!1}}}async function El(){const n=Ee.value;if(!s.selectedNodeId||s.areaSaving||!s.areaDraftIsNew&&!n)return;const a=s.areaDraftIsNew===!0;s.areaSaving=!0,_(a?"Creating area...":"Saving area...");try{const c=await E(I(a?"areas/create":"areas/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:s.areaDraftIsNew?void 0:n.id,name:s.areaDraftName,description:s.areaDraftDescription,tags:String(s.areaDraftTags||"").split(",").map(g=>String(g||"").trim()).filter(Boolean),gaList:s.areaDraftGaList||[]})});c&&c.areas?(s.stateData=Object.assign({},s.stateData||{},{areas:c.areas}),c.areaId&&(s.areaSelectedId=c.areaId),s.areaLlmPrompt="",s.areaLlmError="",s.areaDraftIsNew=!1):await Lt({fresh:!0}),_(a?"Area created":"Area saved")}catch(r){s.lastError=r.message||"Failed to save area",_(s.lastError)}finally{s.areaSaving=!1}}async function Gl(){const n=Ee.value;if(!(!n||!s.selectedNodeId||s.areaSaving)){s.areaSaving=!0,_("Resetting area...");try{const a=await E(I("areas/reset"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id})});a&&a.areas?s.stateData=Object.assign({},s.stateData||{},{areas:a.areas}):await Lt({fresh:!0}),_("Area reset")}catch(a){s.lastError=a.message||"Failed to reset area",_(s.lastError)}finally{s.areaSaving=!1}}}async function Fl(){const n=Ee.value;if(!(!n||!s.selectedNodeId||s.areaSaving)){s.areaSaving=!0,_("Deleting area...");try{const a=await E(I("areas/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id})});if(a&&a.areas){s.stateData=Object.assign({},s.stateData||{},{areas:a.areas});const r=Array.isArray(a.areas&&a.areas.suggested)?a.areas.suggested:[];s.areaDraftIsNew=!1,s.areaSelectedId=r[0]&&r[0].id?r[0].id:""}else await Lt({fresh:!0});_("Area deleted")}catch(a){s.lastError=a.message||"Failed to delete area",_(s.lastError)}finally{s.areaSaving=!1}}}async function Mr(){const n=Gt.value;if(!n||!s.selectedNodeId){s.testPlanCatalog=null,s.testPlanCatalogError="";return}s.testPlanCatalogLoading=!0,s.testPlanCatalogError="";try{const a=await E(I("test-plans/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id})});s.testPlanCatalog=a&&a.catalog?a.catalog:null,a&&a.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:a.testPlans}))}catch(a){s.testPlanCatalog=null,s.testPlanCatalogError=a.message||"Failed to load area command/status catalog"}finally{s.testPlanCatalogLoading=!1}}async function Ga(){if(!(!s.selectedNodeId||s.gaCatalogLoading)){s.gaCatalogLoading=!0;try{const n=await E(I("areas/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId})});s.gaCatalog=Array.isArray(n&&n.gaCatalog)?n.gaCatalog:[]}catch(n){s.lastError=n.message||"Failed to load GA catalog",_(s.lastError)}finally{s.gaCatalogLoading=!1}}}function Ll(n){const a=String(n||"").trim();a&&((s.areaDraftGaList||[]).includes(a)||(s.areaDraftGaList=[...s.areaDraftGaList||[],a]))}function Or(n){const a=String(n||"").trim().toLowerCase(),r=o.find(c=>c.value===a);return r?r.label:a==="auto"?"Auto":"Command"}function zr(n){const a=n&&typeof n=="object"?n:{},r=String(a.path||a.name||"Area").trim(),c=String(a.kind||"").trim(),g=Number(a.gaCount||0),D=Number(a.activeGaCount||0),N=[c,`${g} GA`,`active ${D}`].filter(Boolean).join(" | ");return N?`${r} ${N}`:r}function Ml(n){const a=n&&typeof n=="object"?n:null;!a||!a.id||(s.areaDraftIsNew=!1,s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1,s.areaSelectedId=a.id,s.areaSearch="",s.areaSearchOpen=!1)}function Ol(){setTimeout(()=>{s.areaSearchOpen=!1},150)}function $r(n){const a=n&&typeof n=="object"?n:{},r=String(a.name||"Plan").trim(),c=String(a.areaName||a.areaId||"").trim(),g=Number(a.steps&&a.steps.length?a.steps.length:0),D=[c,`${g} steps`].filter(Boolean).join(" | ");return D?`${r} ${D}`:r}function zl(n){const a=n&&typeof n=="object"?n:null;!a||!a.id||(pd(a),s.testPlanSearch="",s.testPlanSearchOpen=!1)}function $l(){setTimeout(()=>{s.testPlanSearchOpen=!1},150)}function Bl(){return re(A.value,"en")}function Kl(n){const a=String(n||"").trim();a&&(s.areaDraftGaList=(s.areaDraftGaList||[]).filter(r=>r!==a))}async function Vl(n,a){const r=String(n||"").trim();if(!(!s.selectedNodeId||!r||s.areaGaRoleSavingGa===r)){s.areaGaRoleSavingGa=r,_(`Saving role for ${r}...`);try{const c=await E(I("areas/ga-role/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,ga:r,role:a})});Array.isArray(c&&c.gaCatalog)&&(s.gaCatalog=c.gaCatalog),c&&c.areas&&(s.stateData=Object.assign({},s.stateData||{},{areas:c.areas})),Gt.value&&Array.isArray(Gt.value.gaList)&&Gt.value.gaList.includes(r)&&await Mr(),_(`Role saved for ${r}`)}catch(c){s.lastError=c.message||"Failed to save GA role",_(s.lastError)}finally{s.areaGaRoleSavingGa=""}}}function Wl(){s.activeTab="areas",s.areaDraftIsNew=!0,s.areaSelectedId="",s.areaDraftId="",s.areaDraftName="New Area",s.areaDraftDescription="",s.areaDraftTags="",s.areaDraftGaList=[],s.areaLlmPrompt="",s.areaLlmError="",s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1}async function Ul(){const n=String(s.selectedNodeId||"").trim();if(!(s.areaLlmRegenerating||s.areaLlmBulkDeleting)){if(!n){s.areaLlmError="Select a KNX AI node first",_(s.areaLlmError);return}s.areaLlmRegenerating=!0,s.areaLlmError="",_("Regenerating AI areas...");try{const a=await E(I("areas/regenerate-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})}),r=Array.isArray(a&&a.gaCatalog);if(r&&(s.gaCatalog=a.gaCatalog),a&&(a.areas||a.profiles||a.actuatorTests||a.testPlans)){const c=Object.assign({},s.stateData||{});a.areas&&(c.areas=a.areas),a.profiles&&(c.profiles=a.profiles),a.actuatorTests&&(c.actuatorTests=a.actuatorTests),a.testPlans&&(c.testPlans=a.testPlans),s.stateData=c}else await Lt({fresh:!0});r||await Ga(),_(`AI areas regenerated (${Number(a&&a.generatedCount?a.generatedCount:0)})`)}catch(a){s.areaLlmError=a.message||"Failed to regenerate AI areas",_(s.areaLlmError)}finally{s.areaLlmRegenerating=!1}}}async function jl(){const n=String(s.selectedNodeId||"").trim();if(s.areaLlmRegenerating||s.areaLlmBulkDeleting)return;if(!n){s.areaLlmError="Select a KNX AI node first",_(s.areaLlmError);return}const a=Number(br.value||0);if(a<=0){_("No AI areas to delete");return}if(window.confirm(`Delete all AI-generated areas (${a})?`)){s.areaLlmBulkDeleting=!0,s.areaLlmError="",_("Deleting AI areas...");try{const c=await E(I("areas/delete-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})});if(Array.isArray(c&&c.gaCatalog)&&(s.gaCatalog=c.gaCatalog),c&&(c.areas||c.profiles||c.actuatorTests||c.testPlans)){const g=Object.assign({},s.stateData||{});c.areas&&(g.areas=c.areas),c.profiles&&(g.profiles=c.profiles),c.actuatorTests&&(g.actuatorTests=c.actuatorTests),c.testPlans&&(g.testPlans=c.testPlans),s.stateData=g}else await Lt({fresh:!0});Array.isArray(c&&c.gaCatalog)||await Ga(),_(`AI areas deleted (${Number(c&&c.deletedCount?c.deletedCount:a)})`)}catch(c){s.areaLlmError=c.message||"Failed to delete AI areas",_(s.areaLlmError)}finally{s.areaLlmBulkDeleting=!1}}}async function Hl(){if(!s.selectedNodeId||s.areaLlmBusy)return;const n=String(s.areaLlmPrompt||"").trim();if(n){s.areaLlmBusy=!0,s.areaLlmError="",_("AI is selecting area GA...");try{const a=await E(I("areas/suggest-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,prompt:n,name:s.areaDraftName,description:s.areaDraftDescription,gaList:s.areaDraftGaList||[]})}),r=a&&a.suggestion?a.suggestion:null;if(Array.isArray(a&&a.gaCatalog)&&(s.gaCatalog=a.gaCatalog),!r||!Array.isArray(r.gaList)||!r.gaList.length)throw new Error("The AI did not return any group addresses");!String(s.areaDraftName||"").trim()&&r.name&&(s.areaDraftName=String(r.name)),!String(s.areaDraftDescription||"").trim()&&r.description&&(s.areaDraftDescription=String(r.description)),(!s.areaDraftTags||!String(s.areaDraftTags).trim())&&Array.isArray(r.tags)&&r.tags.length&&(s.areaDraftTags=r.tags.join(", ")),s.areaDraftGaList=Array.from(new Set([...s.areaDraftGaList||[],...r.gaList.map(c=>String(c||"").trim()).filter(Boolean)])),s.showAiAreaBuilder=!1,s.areaBuilderFocus=!1,_(`AI added ${Number(r.gaList.length||0)} GA to the draft`)}catch(a){s.areaLlmError=a.message||"Failed to suggest area GA",_(s.areaLlmError)}finally{s.areaLlmBusy=!1}}}function Xl(n){if(n&&typeof n=="object"){s.testPlanPrompt=String(n.prompt||"").trim();return}s.testPlanPrompt=String(n||"").trim()}function Br(n){const a=String(n||"").trim();return a&&(Array.isArray(s.testPlanCatalog&&s.testPlanCatalog.pairs)?s.testPlanCatalog.pairs:[]).find(c=>c&&c.command&&c.command.ga===a)||null}function Kr(n){const a=String(n||"").trim();return fn.value.find(r=>r&&r.ga===a)||null}function ql(n){const a=String(n||"").trim();return Pr.value.find(r=>r&&r.ga===a)||null}function ra(n){const a=String(n||"").trim();if(!a)return[];const r=s.testPlanCatalog&&s.testPlanCatalog.dptOptionsById&&typeof s.testPlanCatalog.dptOptionsById=="object"?s.testPlanCatalog.dptOptionsById:{};return Array.isArray(r[a])?r[a]:[]}function Mt(n){return String(n||"").trim().normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}const Jl=[{type:"on",patterns:[/\bturn on\b/g,/\bturn(?:\s+\w+){1,4}\s+on\b/g,/\bswitch on\b/g,/\bswitch(?:\s+\w+){1,4}\s+on\b/g,/\bpower on\b/g,/\bpower(?:\s+\w+){1,4}\s+on\b/g,/\bstart\b/g,/\benable\b/g,/\bactivate\b/g,/\baccendi\b/g,/\battiva\b/g,/\ballume\b/g,/\bactive\b/g,/\beinschalten\b/g,/\baktivieren\b/g,/\benciende\b/g,/\bactivar\b/g,/\bliga\b/g,/\bativa\b/g,/\baan\b/g,/\binschakelen\b/g]},{type:"off",patterns:[/\bturn off\b/g,/\bturn(?:\s+\w+){1,4}\s+off\b/g,/\bswitch off\b/g,/\bswitch(?:\s+\w+){1,4}\s+off\b/g,/\bpower off\b/g,/\bpower(?:\s+\w+){1,4}\s+off\b/g,/\bdisable\b/g,/\bdeactivate\b/g,/\bshutdown\b/g,/\bspegni\b/g,/\bdisattiva\b/g,/\beteins\b/g,/\bdesactive\b/g,/\bausschalten\b/g,/\bdeaktivieren\b/g,/\bapaga\b/g,/\bdesactiva\b/g,/\bdesliga\b/g,/\bdesativa\b/g,/\buit\b/g,/\buitschakelen\b/g]},{type:"open",patterns:[/\bopen\b/g,/\braise\b/g,/\blift\b/g,/\bmove up\b/g,/\bapri\b/g,/\balza\b/g,/\bsolleva\b/g,/\bouvre\b/g,/\bmonte\b/g,/\boffnen\b/g,/\bhoch\b/g,/\bauf\b/g,/\babre\b/g,/\bsube\b/g,/\babrir\b/g,/\bsobe\b/g,/\bopenen\b/g,/\bomhoog\b/g]},{type:"close",patterns:[/\bclose\b/g,/\blower\b/g,/\bmove down\b/g,/\bchiudi\b/g,/\babbassa\b/g,/\bferme\b/g,/\bdescends?\b/g,/\bschliessen\b/g,/\brunter\b/g,/\bzu\b/g,/\bcierra\b/g,/\bbaja\b/g,/\bfechar\b/g,/\bdesce\b/g,/\bsluiten\b/g,/\bomlaag\b/g]},{type:"stop",patterns:[/\bstop\b/g,/\bhalt\b/g,/\bpause\b/g,/\bferma\b/g,/\barresta\b/g,/\barrete\b/g,/\bstoppe\b/g,/\banhalten\b/g,/\bstopp\b/g,/\bdeten\b/g,/\bparar\b/g,/\bpare\b/g,/\bstoppen\b/g]}];function Zl(n){const a=Mt(n);if(!a)return"";const r=[];return Jl.forEach(c=>{c.patterns.forEach(g=>{g.lastIndex=0;let D;for(;(D=g.exec(a))!==null;)r.push({type:c.type,index:D.index})})}),r.sort((c,g)=>c.index-g.index),r[0]?r[0].type:""}function Yl(n){return["on","open"].includes(String(n||"").trim().toLowerCase())}function Ql(n){return["off","close","stop"].includes(String(n||"").trim().toLowerCase())}function Dn(n,a,r=""){const c=ra(a);if(!c.length)return String(n??"");const g=String(n??"").trim(),D=Mt(g),N=Mt(r),z=`${D} ${N}`.trim(),$=Zl(r||z);if($){if(Yl($)){const Y=c.find(ge=>["true","1","100"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su|einschalten|allume|enciende|liga|aan)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}if(Ql($)){const Y=c.find(ge=>["false","0"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(off|close|down|stop|disable|disabled|inactive|chiuso|spento|giu|ausschalten|eteins|apaga|desliga|uit)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}}if(c.some(Y=>String(Y.value)===g))return g;const Q=c.find(Y=>Mt(Y.label)===D);if(Q)return String(Q.value);const X=c.find(Y=>{const ee=Mt(Y.label);return D&&(ee.includes(D)||D.includes(ee))});if(X)return String(X.value);const fe=/\b(on|open|up|true|1|accendi|attiva|apri|su|acceso|accesa|accesi|accese|aperto|aperta|enabled|enable|start|allume|einschalten|enciende|liga|aan)\b/,Z=/\b(off|close|down|false|0|spegni|disattiva|chiudi|giu|spento|spenta|spenti|spente|chiuso|chiusa|disabled|disable|stop|ferma|eteins|ausschalten|apaga|desliga|uit)\b/;if(fe.test(z)){const Y=c.find(ge=>["true","1","100"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}if(Z.test(z)){const Y=c.find(ge=>["false","0"].includes(String(ge.value)));if(Y)return String(Y.value);const ee=c.find(ge=>/\b(off|close|down|stop|disable|disabled|inactive|spento|spenta|chiuso|chiusa|giu)\b/.test(Mt(ge.label)));if(ee)return String(ee.value)}return String(c[0].value)}function ks(n){if(!n)return;const a=ra(n.commandDPT),r=ra(n.statusDPT||n.commandDPT),c=String(n.action||"").trim().toLowerCase();a.length&&(n.commandPayload=Dn(n.commandPayload,n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`)),r.length&&(n.expectedPayload=Dn(n.expectedPayload,n.statusDPT||n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`))}function In(n={}){if(String(n.kind||"").trim().toLowerCase()==="wait")return{id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:"wait",action:"",collapsed:n.collapsed!==!1,title:String(n.title||"Wait"),description:String(n.description||""),reason:String(n.reason||""),delayMs:Number(n.delayMs||n.readDelayMs||1200),commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:0,statusResponseTimeoutMs:0};const r=String(n.commandGA||"").trim()||String(fn.value[0]?.ga||""),c=Br(r),g=Kr(r),D=c&&c.status?c.status:null,N={id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:String(n.kind||(D?"write_and_verify":"write_only")),action:String(n.action||"").trim().toLowerCase(),collapsed:n.collapsed!==!1,title:String(n.title||(g?`Step ${g.label}`:"Manual Step")),description:String(n.description||""),reason:String(n.reason||""),commandGA:r,commandDPT:String(n.commandDPT||g?.dpt||""),commandPayload:String(n.commandPayload??""),statusGA:String(n.statusGA||D?.ga||""),statusDPT:String(n.statusDPT||D?.dpt||""),expectedPayload:String(n.expectedPayload??n.commandPayload??""),statusWriteTimeoutMs:Number(n.statusWriteTimeoutMs||n.timeoutMs||5e3),statusResponseTimeoutMs:Number(n.statusResponseTimeoutMs||n.timeoutMs||5e3)};return ks(N),N}function Cs(n){const a=Et(n,null);return a?(a.steps=(Array.isArray(a.steps)?a.steps:[]).map(r=>In(r)),a):null}function ed(){return Cs({id:"",name:"",description:"",areaId:ot.value?String(ot.value.id||""):"",areaName:ot.value?String(ot.value.path||ot.value.name||""):"",prompt:"",source:"manual",generatedAt:new Date().toISOString(),steps:[]})}function Vr(n){if(!n||n.kind==="wait")return;const a=Kr(n.commandGA),r=ql(n.statusGA),c=Br(n.commandGA);a&&(n.commandDPT=String(a.dpt||"")),r&&(n.statusDPT=String(r.dpt||"")),c&&c.status&&(!n.statusGA||n.statusGA==="")&&(n.statusGA=String(c.status.ga||""),n.statusDPT=String(c.status.dpt||""),n.kind="write_and_verify"),n.statusGA&&(n.kind="write_and_verify"),n.expectedPayload||(n.expectedPayload=String(n.commandPayload??"")),n.statusGA||(n.statusDPT="",n.kind="write_only"),ks(n)}function td(){if(!s.testPlanDraft)return;const n={id:`step-${Date.now()}-${Math.round(Math.random()*1e3)}`,kind:"write_only",action:"",collapsed:!0,title:"Manual Step",description:"",reason:"",commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:5e3,statusResponseTimeoutMs:5e3};s.testPlanDraft.steps=[...s.testPlanDraft.steps||[],n]}function ad(){if(!s.testPlanDraft)return;const n=In({id:`wait-${(s.testPlanDraft.steps?.length||0)+1}`,kind:"wait",title:"Wait",description:"Pause the test before the next action.",delayMs:1200});s.testPlanDraft.steps=[...s.testPlanDraft.steps||[],n]}function sd(n){if(!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps))return;const a=s.testPlanDraft.steps[n];if(!a)return;const r=In(Object.assign({},a,{id:`${a.id||"step"}-copy`}));s.testPlanDraft.steps.splice(n+1,0,r)}function nd(n){!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps)||s.testPlanDraft.steps.splice(n,1)}function rd(n){n&&(n.collapsed=n.collapsed!==!0)}function Rn(){s.draggedTestPlanStepId="",s.dragOverTestPlanStepId=""}function id(n,a){const r=String(n||"").trim();r&&(s.draggedTestPlanStepId=r,s.dragOverTestPlanStepId="",a&&a.dataTransfer&&(a.dataTransfer.effectAllowed="move",a.dataTransfer.setData("text/plain",r)))}function od(n){const a=String(n||"").trim();!a||!s.draggedTestPlanStepId||a===s.draggedTestPlanStepId||(s.dragOverTestPlanStepId=a)}function ld(n,a){if(!s.testPlanDraft||!Array.isArray(s.testPlanDraft.steps))return;const r=String(n||"").trim(),c=String(a||"").trim();if(!r||!c||r===c)return;const g=s.testPlanDraft.steps.slice(),D=g.findIndex($=>String($&&$.id?$.id:"")===r),N=g.findIndex($=>String($&&$.id?$.id:"")===c);if(D===-1||N===-1)return;const[z]=g.splice(D,1);g.splice(N,0,z),s.testPlanDraft.steps=g}function dd(n,a){a&&a.preventDefault();const r=String(s.draggedTestPlanStepId||"").trim(),c=String(n||"").trim();r&&c&&r!==c&&ld(r,c),Rn()}function ud(){!s.testPlanDraft||s.testPlanRunning||(s.testPlanRunMode="single",s.testPlanRepeatStopRequested=!1,s.testPlanRunConfirmOpen=!0)}function cd(){!s.testPlanDraft||s.testPlanRunning||(s.testPlanRunMode="repeat",s.testPlanRepeatStopRequested=!1,s.testPlanRunConfirmOpen=!0)}function Wr(){s.testPlanRunConfirmOpen=!1,s.testPlanRunMode="single"}function fd(){s.testPlanRepeatForever===!0&&(s.testPlanRepeatStopRequested=!0,_("Stopping repeat mode after the current cycle..."))}function Ur(n=null){const a=n||sa.value;a&&(s.testResultFocusMode=!1,s.testPlanSelectedId=String(a.id||""),s.testPlanDraft=Cs(a),s.testPlanPrompt=String(a.prompt||""),s.testPlanGeneration={provider:String(a.source||"saved"),model:"",fallback:!1,error:""},s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!1,s.testTemplateBuilderFocus=!1,xa())}function Nn(){Ra=null,s.testPlanPendingActionLabel=""}function jr(){s.testPlanUnsavedConfirmOpen=!1,Nn()}function Hr(){const n=Ra;s.testPlanUnsavedConfirmOpen=!1,Nn(),typeof n=="function"&&n()}function kn(n,a="another plan"){if(!_r.value){n();return}Ra=n,s.testPlanPendingActionLabel=String(a||"another plan"),s.testPlanUnsavedConfirmOpen=!0}function pd(n){if(!n||!n.id)return;const a=String(n.id);s.testPlanSelectedId!==a&&kn(()=>Ur(n),`plan "${n.name||a}"`)}function gd(){qo(),_("Plan changes discarded")}async function hd(){await qr()&&Hr()}function Xr(){if(!ye.value.length){_("Define at least one area before creating a test plan");return}kn(()=>{s.activeTab="tests",s.testResultFocusMode=!1,s.testPlanSelectedId="",s.testPlanDraft=ed(),s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.testPlanPrompt="",s.showAiPlanner=!1,s.testTemplateBuilderFocus=!1,xa()},"a new plan")}function md(n){const a=String(n||"").trim();if(!a)return;const r=ye.value.find(c=>c&&c.id===a);r&&(s.testAreaSelectedId=a,s.testPlanDraft&&(s.testPlanDraft.areaId=a,s.testPlanDraft.areaName=String(r.path||r.name||"")))}function vd(){const n=Et(s.testPlanDraft||sa.value,null);n&&(s.activeTab="tests",s.testResultFocusMode=!1,s.testPlanSelectedId="",s.testPlanRunConfirmOpen=!1,s.testPlanGeneration={provider:"duplicated",model:"",fallback:!1,error:""},n.id="",n.name=String(n.name||"Plan Draft").trim()?`${String(n.name||"Plan Draft").trim()} Copy`:"Plan Copy",s.testPlanPrompt=String(n.prompt||s.testPlanPrompt||""),s.testPlanDraft=Cs(n),s.showAiPlanner=!0,s.testTemplateBuilderFocus=!1,xa(),_("Plan duplicated"))}async function bd(){const n=ot.value,a=String(s.testPlanPrompt||"").trim(),r=Bl();if(!(!s.selectedNodeId||!n||!a||s.testPlanGenerating)){s.testPlanGenerating=!0,s.testTemplateBuilderFocus=!1,s.showAiPlanner=!1,s.testResultFocusMode=!1,s.testPlanGenerationError="",_("Building test plan...");try{const c=await E(I("test-plans/generate"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:n.id,prompt:a,language:r})});s.testPlanDraft=c&&c.plan?Cs(c.plan):null,s.testPlanCatalog=c&&c.catalog?c.catalog:s.testPlanCatalog,s.testPlanGeneration=c&&c.generation?c.generation:null,s.testPlanGenerationError="",s.testPlanSelectedId="",s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!1,c&&c.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:c.testPlans})),xa(),_("Test plan ready")}catch(c){const g=c.message||"Failed to build the test plan";s.lastError=g,s.testPlanGenerationError=g,s.testPlanGeneration={provider:"",model:"",fallback:!1,error:g},_(g)}finally{s.testPlanGenerating=!1}}}async function qr(){if(!s.selectedNodeId||!s.testPlanDraft||s.testPlanSaving)return!1;s.testPlanSaving=!0,_("Saving test plan...");try{const n=await E(I("test-plans/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,plan:Object.assign({},s.testPlanDraft,{prompt:s.testPlanPrompt})})});return n&&n.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:n.testPlans})),n&&n.planId&&(s.testPlanSelectedId=n.planId),n&&n.planId&&s.testPlanDraft&&(s.testPlanDraft.id=n.planId),s.testPlanRunConfirmOpen=!1,xa(),_("Test plan saved"),!0}catch(n){return s.lastError=n.message||"Failed to save test plan",_(s.lastError),!1}finally{s.testPlanSaving=!1}}async function yd(){const n=sa.value;if(!(!n||!s.selectedNodeId||s.testPlanDeleting)){s.testPlanDeleting=!0,_("Deleting test plan...");try{const a=await E(I("test-plans/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,planId:n.id})});a&&a.testPlans&&(s.stateData=Object.assign({},s.stateData||{},{testPlans:a.testPlans})),s.testPlanDraft=null,s.testPlanGeneration=null,s.testPlanRunConfirmOpen=!1,s.showAiPlanner=!0,s.testTemplateBuilderFocus=!1,xa(),_("Test plan deleted")}catch(a){s.lastError=a.message||"Failed to delete test plan",_(s.lastError)}finally{s.testPlanDeleting=!1}}}async function Ad(n="single"){if(!s.selectedNodeId||!s.testPlanDraft||s.testPlanRunning)return;const r=String(n||s.testPlanRunMode||"single").trim().toLowerCase()==="repeat";s.testPlanRunning=!0,s.showAiPlanner=!1,s.testTemplateBuilderFocus=!1,s.testPlanRepeatForever=r,s.testPlanRepeatStopRequested=!1,s.testPlanRunningStepId="",s.testPlanRunConfirmOpen=!1,s.lastError="",_(r?"Running test plan in repeat mode...":"Running test plan...");try{const c=JSON.parse(JSON.stringify(Object.assign({},s.testPlanDraft,{prompt:s.testPlanPrompt}))),g=Array.isArray(c.steps)?c.steps:[];if(!c.areaId)throw new Error("Missing areaId in test plan");if(!g.length)throw new Error("The test plan has no executable steps");let D=ot.value,N=0;do{N+=1;const $=`${c.id||"plan"}:${Date.now()}`,Q=[];s.liveTestResultId=$,s.testResultsMenuOpen=!0,Ns($,{openMenu:!0,activateResultsTab:!0,resultOnly:!0}),s.stateData=Object.assign({},s.stateData||{},{testPlanReport:bn({plan:c,area:D,stepResults:[],reportId:$})});try{await xr(c.name||"Test plan",c.description||"")}catch{}for(let fe=0;fe<g.length;fe+=1){const Z=g[fe];s.testPlanRunningStepId=Z&&Z.id?Z.id:"";const Y=r?`Cycle ${N} · `:"";_(`${Y}Step ${fe+1}/${g.length}: ${Z&&Z.title?Z.title:"Running..."}`);try{await Sl(Z||{title:`Step ${fe+1}`},fe+1)}catch{_(`Voice unavailable for step ${fe+1}. Continuing test...`)}try{const ee=await E(I("test-plans/run-step"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,areaId:c.areaId,step:Z})});ee&&ee.area&&(D=ee.area),Q.push(ee&&ee.stepResult?ee.stepResult:Nr(Z,new Error("Step returned no result")))}catch(ee){Q.push(Nr(Z,ee))}s.stateData=Object.assign({},s.stateData||{},{testPlanReport:bn({plan:c,area:D,stepResults:Q.slice(),reportId:$})})}const X=bn({plan:c,area:D,stepResults:Q,reportId:$});s.stateData=Object.assign({},s.stateData||{},{testPlans:vt.value,testPlanReport:X}),Ns($,{openMenu:!0,activateResultsTab:!0,resultOnly:!0});try{await xl(X)}catch(fe){s.lastError=fe.message||"Failed to save test result",_(`Test completed, but the result was not saved: ${s.lastError}`)}r&&s.testPlanRepeatStopRequested!==!0&&(s.testResultFocusMode=!1,_(`Cycle ${N} completed. Starting the next cycle...`))}while(r&&s.testPlanRepeatStopRequested!==!0);const z=r?"Repeat mode stopped":"Test completed";s.testPlanRunConfirmOpen=!1,s.lastError||_(z);try{await xr(Oe(z))}catch{}requestAnimationFrame(()=>{try{ke.value&&typeof ke.value.scrollIntoView=="function"&&ke.value.scrollIntoView({behavior:"smooth",block:"start"})}catch{}})}catch(c){s.lastError=c.message||"Failed to run test plan",_(s.lastError)}finally{s.testPlanRunningStepId="",Na(),s.testPlanRunning=!1,s.testPlanRepeatForever=!1,s.testPlanRepeatStopRequested=!1,s.testPlanRunMode="single"}}async function Sd(){if(s.selectedNodeId){_("Exporting config...");try{const n=await E(I("config/export"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId})}),a=new Blob([JSON.stringify(n,null,2)],{type:"application/json"}),r=window.URL.createObjectURL(a),c=document.createElement("a");c.href=r,c.download=`knx-ai-config-${s.selectedNodeId}.json`,document.body.appendChild(c),c.click(),document.body.removeChild(c),window.URL.revokeObjectURL(r),_("Config exported")}catch(n){s.lastError=n.message||"Failed to export config",_(s.lastError)}}}function wd(){Ia.value&&Ia.value.click()}async function Pd(n){const a=n&&n.target&&n.target.files&&n.target.files[0]?n.target.files[0]:null;if(!(!a||!s.selectedNodeId)){_("Importing config...");try{const r=await a.text(),c=JSON.parse(r),g=await E(I("config/import"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:s.selectedNodeId,config:c})});s.stateData=Object.assign({},s.stateData||{},{areas:g.areas||va.value,profiles:g.profiles||ba.value,actuatorTests:g.actuatorTests||ya.value,testPlans:g.testPlans||vt.value,testResults:g.testResults||qa.value}),await Ga(),_("Config imported")}catch(r){s.lastError=r.message||"Failed to import config",_(s.lastError)}finally{n&&n.target&&(n.target.value="")}}}function Td(){s.pollStateHandle||(s.pollStateHandle=window.setInterval(()=>{s.autoRefresh&&Lt({fresh:!1})},1500)),s.pollNodesHandle||(s.pollNodesHandle=window.setInterval(()=>{wn({preserveSelection:!0})},15e3))}function _d(){s.pollStateHandle&&(window.clearInterval(s.pollStateHandle),s.pollStateHandle=null),s.pollNodesHandle&&(window.clearInterval(s.pollNodesHandle),s.pollNodesHandle=null)}return Ao(async()=>{A.value=Se(),Ct(),window.addEventListener("resize",Ct),document.addEventListener("keydown",y),document.addEventListener("fullscreenchange",F),await wn({preserveSelection:!1}),await Lt({fresh:!0}),await Ga(),Td(),ga()}),So(()=>{window.removeEventListener("resize",Ct),document.removeEventListener("keydown",y),document.removeEventListener("fullscreenchange",F),mt(),_d(),Na()}),(n,a)=>(v(),b(q,null,[l("header",nf,[a[42]||(a[42]=l("div",{class:"m-header-brand"},[l("span",{class:"m-logo-mark"},"K"),l("span",{class:"hb-logo-text-mobile"},"KNX AI")],-1)),l("button",{class:ue(["hamburger-icon",{"hamburger-icon-cross":Je.value}]),type:"button","aria-expanded":Je.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle menu",onClick:on},[...a[41]||(a[41]=[l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1)])],10,rf)]),Le.value&&Je.value?(v(),b("button",{key:0,class:"sidebar-overlay",type:"button","aria-label":"Close menu",onClick:h})):G("",!0),l("div",{class:ue(["page-shell",{"sidebar-collapsed":!Je.value,"sidebar-mobile-open":Le.value&&Je.value}])},[l("aside",of,[l("div",lf,[a[43]||(a[43]=l("div",{class:"sidebar-brand-mark","aria-hidden":"true"},"K",-1)),a[44]||(a[44]=l("div",{class:"sidebar-brand"},[l("p",{class:"eyebrow"},"KNX Ultimate")],-1)),l("button",{class:"sidebar-collapse-toggle",type:"button","aria-expanded":Je.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle sidebar",onClick:on},[l("span",uf,S(Je.value?Le.value?"×":"‹":"›"),1)],8,df)]),l("nav",cf,[l("button",{class:ue(["tab-button",{active:s.activeTab==="overview"}]),type:"button",title:"Overview","aria-label":"Overview",onClick:a[0]||(a[0]=r=>Ea("overview"))},[...a[45]||(a[45]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-3e43ecbd><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-3e43ecbd><path d="M3 10.8 12 3l9 7.8v9.2a1 1 0 0 1-1 1h-5v-6h-6v6H4a1 1 0 0 1-1-1z" data-v-3e43ecbd></path></svg></span><span class="sidebar-nav-copy" data-v-3e43ecbd><span class="sidebar-nav-title" data-v-3e43ecbd>Overview</span></span>',2)])],2),l("button",{class:ue(["tab-button",{active:s.activeTab==="areas"}]),type:"button",title:"Areas","aria-label":"Areas",onClick:a[1]||(a[1]=r=>Ea("areas"))},[...a[46]||(a[46]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-3e43ecbd><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-3e43ecbd><path d="M3 3h8v8H3zm10 0h8v8h-8zM3 13h8v8H3zm10 0h8v8h-8z" data-v-3e43ecbd></path></svg></span><span class="sidebar-nav-copy" data-v-3e43ecbd><span class="sidebar-nav-title" data-v-3e43ecbd>Areas</span></span>',2)])],2),l("button",{class:ue(["tab-button sidebar-nav-child",{active:s.activeTab==="tests"}]),type:"button",title:"Tests","aria-label":"Tests",disabled:!ye.value.length,onClick:a[2]||(a[2]=r=>Ea("tests"))},[...a[47]||(a[47]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-3e43ecbd><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-3e43ecbd><path d="M9 3h6v2h-1v4.3l5.5 8.8A2 2 0 0 1 17.8 21H6.2a2 2 0 0 1-1.7-2.9L10 9.3V5H9zm1.9 8.2L6.9 18h10.2l-4-6.8z" data-v-3e43ecbd></path></svg></span><span class="sidebar-nav-copy" data-v-3e43ecbd><span class="sidebar-nav-title" data-v-3e43ecbd>Tests</span></span>',2)])],10,ff),l("button",{class:ue(["tab-button sidebar-nav-child",{active:s.activeTab==="results"}]),type:"button",title:"Test Results","aria-label":"Test Results",onClick:a[3]||(a[3]=r=>Ea("results"))},[...a[48]||(a[48]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-3e43ecbd><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-3e43ecbd><path d="M4 4h16v4H4zm0 6h16v4H4zm0 6h16v4H4z" data-v-3e43ecbd></path></svg></span><span class="sidebar-nav-copy" data-v-3e43ecbd><span class="sidebar-nav-title" data-v-3e43ecbd>Test Results</span></span>',2)])],2),l("button",{class:ue(["tab-button",{active:s.activeTab==="assistant"}]),type:"button",title:"Assistant","aria-label":"Assistant",onClick:a[4]||(a[4]=r=>Ea("assistant"))},[...a[49]||(a[49]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-3e43ecbd><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-3e43ecbd><path d="M4 5h16a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-5 4v-4H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z" data-v-3e43ecbd></path></svg></span><span class="sidebar-nav-copy" data-v-3e43ecbd><span class="sidebar-nav-title" data-v-3e43ecbd>Assistant</span></span>',2)])],2),l("button",{class:ue(["tab-button",{active:s.activeTab==="settings"}]),type:"button",title:"Settings","aria-label":"Settings",onClick:a[5]||(a[5]=r=>Ea("settings"))},[...a[50]||(a[50]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-3e43ecbd><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-3e43ecbd><path d="M19.14 12.94a7.43 7.43 0 0 0 .05-.94 7.43 7.43 0 0 0-.05-.94l2.03-1.58a.5.5 0 0 0 .12-.64l-1.92-3.32a.5.5 0 0 0-.6-.22l-2.39.96a7.18 7.18 0 0 0-1.63-.94l-.36-2.54A.5.5 0 0 0 13.9 2h-3.8a.5.5 0 0 0-.49.42l-.36 2.54a7.18 7.18 0 0 0-1.63.94l-2.39-.96a.5.5 0 0 0-.6.22L2.71 8.48a.5.5 0 0 0 .12.64l2.03 1.58a7.43 7.43 0 0 0-.05.94 7.43 7.43 0 0 0 .05.94l-2.03 1.58a.5.5 0 0 0-.12.64l1.92 3.32a.5.5 0 0 0 .6.22l2.39-.96c.5.39 1.04.71 1.63.94l.36 2.54a.5.5 0 0 0 .49.42h3.8a.5.5 0 0 0 .49-.42l.36-2.54c.59-.23 1.13-.55 1.63-.94l2.39.96a.5.5 0 0 0 .6-.22l1.92-3.32a.5.5 0 0 0-.12-.64zM12 15.2A3.2 3.2 0 1 1 12 8.8a3.2 3.2 0 0 1 0 6.4z" data-v-3e43ecbd></path></svg></span><span class="sidebar-nav-copy" data-v-3e43ecbd><span class="sidebar-nav-title" data-v-3e43ecbd>Settings</span></span>',2)])],2)]),Je.value?(v(),b("div",pf,[l("button",{class:"primary-button sidebar-action-button",type:"button",disabled:s.loadingNodes||s.loadingState,onClick:Pl}," Refresh ",8,gf),l("div",{class:"support-link-row"},[l("a",{class:"secondary-button support-link-button",href:zb,target:"_blank",rel:"noopener noreferrer"}," Donate via PayPal "),l("a",{class:"secondary-button support-link-button support-link-button-youtube",href:$b,target:"_blank",rel:"noopener noreferrer"}," Subscribe ")])])):G("",!0),Je.value?(v(),b("div",hf,[l("span",{class:ue(["status-pill",{error:!!s.lastError}])},[s.loadingNodes||s.loadingState||s.areaLlmRegenerating||s.areaLlmBulkDeleting||s.areaLlmBusy||s.testPlanGenerating||s.asking?(v(),b("span",mf)):G("",!0),l("span",null,S(s.status),1)],2),_s.value?(v(),b("span",vf,"Provider: "+S(_s.value.llmProvider||"n/a")+" | Model: "+S(_s.value.llmModel||"n/a"),1)):G("",!0),l("a",{class:"sidebar-doc-link",href:Ob,target:"_blank",rel:"noopener noreferrer"}," Documentation: KNX AI Vue ")])):G("",!0)]),l("section",bf,[l("main",yf,[s.activeTab==="overview"?(v(),b("section",Af,[l("div",Sf,[a[51]||(a[51]=l("h2",null,"Summary",-1)),xe.value.meta?.generatedAt?(v(),b("span",wf,S(xt(xe.value.meta.generatedAt)),1)):G("",!0)]),l("pre",Pf,S(cl.value),1),l("div",Tf,[l("article",_f,[a[52]||(a[52]=l("span",null,"Telegrams",-1)),l("strong",null,S(Number(xe.value.counters?.telegrams||0)),1)]),l("article",Df,[a[53]||(a[53]=l("span",null,"Rate",-1)),l("strong",null,S(Number(xe.value.counters?.overallRatePerSec||0))+"/s",1)]),l("article",If,[a[54]||(a[54]=l("span",null,"Repeat",-1)),l("strong",null,S(Number(xe.value.counters?.repeated||0)),1)]),l("article",Rf,[a[55]||(a[55]=l("span",null,"Unknown DPT",-1)),l("strong",null,S(Number(xe.value.counters?.unknownDpt||0)),1)])])])):G("",!0),s.activeTab==="areas"?(v(),b("section",Nf,[l("div",kf,[a[56]||(a[56]=l("h2",null,"Select an Area",-1)),l("div",Cf,[l("span",xf,S(Number(Xa.value.suggestedAreaCount||0))+" areas",1),l("button",{class:"secondary-button",type:"button",disabled:s.areaLlmRegenerating||s.areaLlmBulkDeleting||!ta.value.llmEnabled,onClick:Ul},[s.areaLlmRegenerating?(v(),b("span",Gf)):G("",!0),l("span",null,S(s.areaLlmRegenerating?"Regenerating...":"Regenerate AI Areas"),1)],8,Ef),l("button",{class:"danger-button",type:"button",disabled:s.areaLlmRegenerating||s.areaLlmBulkDeleting||br.value<=0,onClick:jl},[s.areaLlmBulkDeleting?(v(),b("span",Lf)):G("",!0),l("span",null,S(s.areaLlmBulkDeleting?"Deleting...":"Delete AI Areas"),1)],8,Ff),l("button",{class:"secondary-button new-button",type:"button",onClick:Wl}," New Area ")])]),s.areaLlmError?(v(),b("p",Mf,S(s.areaLlmError),1)):G("",!0),l("div",Of,[l("div",zf,[l("span",$f,"GA "+S(Number(Xa.value.gaCount||0)),1),l("span",Bf,"Hierarchical "+S(Number(Xa.value.hierarchicalGaCount||0)),1),l("span",Kf,"Secondary "+S(Number(Xa.value.secondaryGroupCount||0)),1),l("span",Vf,"Active "+S(Number(Xa.value.activeAreaCount||0)),1)])]),cn.value.length||s.areaDraftIsNew?(v(),b("div",Wf,[!Ee.value&&!s.areaDraftIsNew?(v(),b("div",Uf,[l("label",jf,[a[57]||(a[57]=l("span",null,"Areas",-1)),l("div",Hf,[pe(l("input",{"onUpdate:modelValue":a[6]||(a[6]=r=>s.areaSearch=r),class:"area-search-select-input",type:"text",placeholder:Ee.value?zr(Ee.value):"Search area...",onFocus:a[7]||(a[7]=r=>s.areaSearchOpen=!0),onInput:a[8]||(a[8]=r=>s.areaSearchOpen=!0),onBlur:Ol},null,40,Xf),[[Ce,s.areaSearch]]),s.areaSearchOpen&&cn.value.length?(v(),b("div",qf,[(v(!0),b(q,null,ie(cn.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:ue(["area-search-select-option",{active:Ee.value&&Ee.value.id===r.id}]),onMousedown:Kt(c=>Ml(r),["prevent"])},S(zr(r)),43,Jf))),128))])):G("",!0)])])])):G("",!0),Ee.value||s.areaDraftIsNew?(v(),b("article",{key:1,class:ue(["area-detail",{"area-detail-wide":s.areaDraftIsNew}])},[l("div",Zf,[s.areaBuilderFocus!==!0?(v(),b("div",Yf,[a[58]||(a[58]=l("div",null,[l("h4",null,"Edit Area"),l("p",{class:"area-detail-subhead"},"The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.")],-1)),l("div",Qf,[s.areaDraftIsNew&&!Tr.value?(v(),b("button",{key:0,class:"secondary-button",type:"button",onClick:Il}," Show AI Area Builder ")):G("",!0),s.areaDraftIsNew?G("",!0):(v(),b("button",{key:1,class:"danger-button",type:"button",disabled:s.areaSaving,onClick:Fl}," Delete Area ",8,ep)),l("button",{class:"secondary-button",type:"button",disabled:s.areaSaving,onClick:Gl}," Reset ",8,tp),l("button",{class:"primary-button",type:"button",disabled:s.areaSaving,onClick:El},S(s.areaSaving?"Saving...":"Save Area"),9,ap),l("button",{class:"secondary-button",type:"button",disabled:s.areaSaving,onClick:Nl}," Close ",8,sp)])])):G("",!0),s.areaBuilderFocus!==!0?(v(),b("div",np,[l("label",rp,[a[59]||(a[59]=l("span",null,"Area name",-1)),pe(l("input",{"onUpdate:modelValue":a[9]||(a[9]=r=>s.areaDraftName=r),type:"text",placeholder:"Installer alias"},null,512),[[Ce,s.areaDraftName]])]),l("label",ip,[a[60]||(a[60]=l("span",null,"Description",-1)),pe(l("textarea",{"onUpdate:modelValue":a[10]||(a[10]=r=>s.areaDraftDescription=r),rows:"3",placeholder:"Optional note for diagnostics and reports"},null,512),[[Ce,s.areaDraftDescription]])]),l("label",op,[a[61]||(a[61]=l("span",null,"Add group addresses to this area",-1)),pe(l("input",{"onUpdate:modelValue":a[11]||(a[11]=r=>s.gaCatalogSearch=r),type:"text",placeholder:"Search GA, label or ETS path"},null,512),[[Ce,s.gaCatalogSearch]])])])):G("",!0),s.areaDraftIsNew&&Tr.value?(v(),b("div",lp,[l("div",{class:ue(["ai-planner-shell-head",{"template-builder-focus-head":s.areaBuilderFocus===!0}])},[a[62]||(a[62]=l("div",null,[l("h4",null,"AI Area Builder"),l("p",{class:"area-detail-subhead"},"Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.")],-1)),s.areaBuilderFocus===!0?(v(),b("div",dp,[l("button",{class:"secondary-button",type:"button",onClick:Rl}," Close ")])):G("",!0)],2),l("div",up,[l("label",cp,[a[63]||(a[63]=l("span",null,"Assistant prompt",-1)),pe(l("textarea",{"onUpdate:modelValue":a[12]||(a[12]=r=>s.areaLlmPrompt=r),rows:"3",placeholder:"Example: Add all technical room lighting command and status GA."},null,512),[[Ce,s.areaLlmPrompt]])])]),l("div",fp,[l("button",{class:"primary-button",type:"button",disabled:s.areaLlmBusy||!s.areaLlmPrompt.trim()||!ta.value.llmEnabled,onClick:Hl},[s.areaLlmBusy?(v(),b("span",gp)):G("",!0),de(" "+S(s.areaLlmBusy?"Suggesting...":"Suggest GA with AI"),1)],8,pp)]),s.areaLlmError?(v(),b("p",hp,S(s.areaLlmError),1)):G("",!0),ta.value.llmEnabled?G("",!0):(v(),b("p",mp," Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft. "))])):G("",!0),s.areaBuilderFocus!==!0?(v(),b("div",vp,[l("div",null,[a[65]||(a[65]=l("h4",null,"Area GA membership",-1)),wr.value.length?(v(),b("ul",bp,[(v(!0),b(q,null,ie(wr.value,r=>(v(),b("li",{key:r.ga,class:"area-ga-item"},[l("div",yp,[l("strong",null,S(r.ga),1),l("span",null,[de(S(r.label||"Unlabeled GA"),1),r.dpt?(v(),b("span",Ap," | DPT "+S(r.dpt),1)):G("",!0)]),l("span",null,[de("Role "+S(Or(r.role)),1),r.roleSource?(v(),b("span",Sp," | source "+S(r.roleSource),1)):G("",!0)])]),l("div",wp,[l("label",Pp,[a[64]||(a[64]=l("span",null,"Role",-1)),l("select",{value:r.roleOverride&&r.roleOverride!=="auto"?r.roleOverride:r.role||"neutral",disabled:s.areaGaRoleSavingGa===r.ga,onChange:c=>Vl(r.ga,c.target.value)},[(v(),b(q,null,ie(o,c=>l("option",{key:c.value,value:c.value},S(c.label),9,_p)),64))],40,Tp)]),l("button",{class:"secondary-button",type:"button",onClick:c=>Kl(r.ga)}," Remove ",8,Dp)])]))),128))])):(v(),b("p",Ip,"No GA selected for this area yet."))]),l("div",null,[l("div",Rp,[a[66]||(a[66]=l("div",null,[l("h4",null,"Available GA"),l("p",{class:"area-detail-subhead"},"Pick from the ETS catalog. Already selected GA are hidden from this list.")],-1)),l("span",Np,S(s.gaCatalogLoading?"Loading...":`${Sr.value.length} visible`),1)]),l("div",kp,[(v(!0),b(q,null,ie(Sr.value,r=>(v(),b("button",{key:r.ga,type:"button",class:"area-list-item",onClick:c=>Ll(r.ga)},[l("span",xp,S(r.ga),1),l("span",Ep,S(r.label||"Unlabeled GA"),1),l("span",Gp,[de(S(r.hierarchyPath||r.dpt||""),1),r.role?(v(),b("span",Fp," | "+S(Or(r.role)),1)):G("",!0)])],8,Cp))),128))])])])):G("",!0),s.areaBuilderFocus!==!0?(v(),b("p",Lp,[a[67]||(a[67]=de(" Original ETS path: ",-1)),l("strong",null,S(s.areaDraftIsNew?"Manual area":Ee.value.basePath||Ee.value.path||Ee.value.name),1)])):G("",!0)])],2)):G("",!0)])):(v(),b("p",Mp,"No areas matched the current search or the ETS file does not expose a usable hierarchy yet."))])):G("",!0),s.activeTab==="tests"?(v(),b("section",{key:2,class:ue(["card card-profiles",{"card-results-focus":bt.value}])},[l("div",Op,[l("div",null,[l("h2",null,S(bt.value?"Test Result":"Test Planner"),1),l("p",zp,S(bt.value?"Showing only the selected test report.":"Select an area, choose a standard test template, review the generated plan, then save or run it."),1)]),bt.value?(v(),b("div",Wp,[l("span",Up,S(Ja(ne.value)),1),l("button",{class:"danger-button",type:"button",disabled:!ne.value||s.deletingTestResultId===ne.value.id,onClick:a[13]||(a[13]=r=>Tn(ne.value?.id))},S(s.deletingTestResultId===ne.value?.id?"Deleting...":"Delete"),9,jp),l("button",{class:"secondary-button",type:"button",onClick:Lr}," Open Source Test ")])):(v(),b("div",$p,[l("span",Bp,"Area "+S(ot.value?ot.value.path||ot.value.name:"n/a"),1),l("span",Kp,S(vt.value.length)+" saved plans",1),l("button",{class:"secondary-button",type:"button",disabled:!s.testPlanDraft,onClick:vd}," Duplicate Plan ",8,Vp),l("button",{class:"secondary-button new-button",type:"button",onClick:Xr}," New Plan ")]))]),l("div",{class:ue(["profiles-layout test-planner-layout",{"result-only-layout":bt.value}])},[l("div",Hp,[!bt.value&&!s.testPlanDraft&&!s.testPlanRunning?(v(),b("article",Xp,[a[69]||(a[69]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select test plan"),l("p",{class:"area-detail-subhead"},"Reusable deterministic active tests saved by the installer.")])],-1)),l("div",qp,[l("label",Jp,[a[68]||(a[68]=l("span",null,"Plans",-1)),l("div",Zp,[pe(l("input",{"onUpdate:modelValue":a[14]||(a[14]=r=>s.testPlanSearch=r),class:"area-search-select-input",type:"text",placeholder:sa.value?$r(sa.value):"Search saved plan...",onFocus:a[15]||(a[15]=r=>s.testPlanSearchOpen=!0),onInput:a[16]||(a[16]=r=>s.testPlanSearchOpen=!0),onBlur:$l},null,40,Yp),[[Ce,s.testPlanSearch]]),s.testPlanSearchOpen&&yr.value.length?(v(),b("div",Qp,[(v(!0),b(q,null,ie(yr.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:ue(["area-search-select-option",{active:sa.value&&sa.value.id===r.id}]),onMousedown:Kt(c=>zl(r),["prevent"])},S($r(r)),43,eg))),128))])):G("",!0)])])]),vt.value.length?G("",!0):(v(),b("p",tg,"No saved plans yet."))])):G("",!0),!bt.value&&s.testPlanDraft?(v(),b("article",ag,[s.testTemplateBuilderFocus!==!0?(v(),b("div",sg,[l("div",null,[l("h3",null,S(s.testPlanDraft?.name||"Plan Draft"),1),pn.value?(v(),b("p",ng,"Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.")):G("",!0)]),l("div",rg,[_r.value?(v(),b("span",ig,"Unsaved changes")):G("",!0),l("button",{class:"secondary-button new-button",type:"button",onClick:Xr}," New Plan "),pn.value?G("",!0):(v(),b("button",{key:1,class:"secondary-button",type:"button",onClick:_l}," Show Template Builder ")),l("label",og,[pe(l("input",{"onUpdate:modelValue":a[17]||(a[17]=r=>s.voiceEnabled=r),type:"checkbox"},null,512),[[Bn,s.voiceEnabled]]),a[70]||(a[70]=l("span",null,"Voice",-1))]),l("button",{class:"danger-button",type:"button",disabled:s.testPlanDeleting||!sa.value,onClick:yd},S(s.testPlanDeleting?"Deleting...":"Delete"),9,lg),l("button",{class:"secondary-button",type:"button",disabled:s.testPlanSaving||s.testPlanRunning,onClick:Cl}," Close ",8,dg),l("button",{class:"secondary-button",type:"button",disabled:s.testPlanSaving||!s.testPlanDraft,onClick:qr},S(s.testPlanSaving?"Saving...":"Save Plan"),9,ug),ol.value?(v(),b("div",cg,[l("button",{class:"secondary-button",type:"button",disabled:!s.testPlanDraft&&s.testPlanRepeatForever!==!0||s.testPlanRunning&&s.testPlanRepeatForever!==!0||s.testPlanRepeatStopRequested===!0,onClick:a[18]||(a[18]=r=>s.testPlanRepeatForever===!0?fd():cd())},S(s.testPlanRepeatForever===!0?s.testPlanRepeatStopRequested===!0?"Stopping...":"Stop Repeat":"Repeat Forever"),9,fg),l("button",{class:"primary-button",type:"button",disabled:s.testPlanRunning||!s.testPlanDraft,onClick:ud},[s.testPlanRunning?(v(),b("span",gg)):G("",!0),l("span",null,S(s.testPlanRunning?"Running...":"Run Plan"),1)],8,pg)])):G("",!0)])])):G("",!0),pn.value?(v(),b("div",hg,[l("div",{class:ue(["ai-planner-shell-head",{"template-builder-focus-head":s.testTemplateBuilderFocus===!0}])},[a[71]||(a[71]=l("div",null,[l("h4",null,"Template Builder"),l("p",{class:"area-detail-subhead"},"Select one of the standard templates. The plan is built only from the command GA available in the selected area.")],-1)),s.testTemplateBuilderFocus===!0?(v(),b("div",mg,[l("button",{class:"secondary-button",type:"button",onClick:Dl}," Close ")])):G("",!0)],2),l("div",vg,[l("label",bg,[a[72]||(a[72]=l("span",null,"Area to test",-1)),pe(l("select",{"onUpdate:modelValue":a[19]||(a[19]=r=>s.testAreaSelectedId=r)},[(v(!0),b(q,null,ie(ye.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,yg))),128))],512),[[Pa,s.testAreaSelectedId]])]),l("label",Ag,[a[73]||(a[73]=l("span",null,"Selected template",-1)),l("textarea",{value:s.testPlanPrompt||"Select one of the templates below.",rows:"4",readonly:""},null,8,Sg)])]),l("div",wg,[(v(),b(q,null,ie(i,r=>l("button",{key:r.id,class:ue(["preset-button",{active:s.testPlanPrompt===r.prompt}]),type:"button",onClick:c=>Xl(r)},S(r.title),11,Pg)),64))]),l("p",Tg,S((i.find(r=>r.prompt===s.testPlanPrompt)||{}).description||"Choose a template to see what the deterministic builder will do in the selected area."),1),l("div",_g,[l("button",{class:"primary-button",type:"button",disabled:s.testPlanGenerating||!ot.value||!s.testPlanPrompt.trim(),onClick:bd},[s.testPlanGenerating?(v(),b("span",Ig)):G("",!0),de(" "+S(s.testPlanGenerating?"Building...":"Build Test Plan"),1)],8,Dg)]),s.testPlanGenerationError?(v(),b("p",Rg,S(s.testPlanGenerationError),1)):G("",!0),s.testPlanGeneration?(v(),b("div",Ng,[s.testPlanGeneration.error?G("",!0):(v(),b("p",kg," Built with "+S(s.testPlanGeneration.provider||"deterministic builder")+". ",1)),s.testPlanGeneration.error?(v(),b("p",Cg,S(s.testPlanGeneration.error),1)):G("",!0)])):G("",!0)])):G("",!0)])):G("",!0),s.testPlanRunning&&!bt.value?(v(),b("article",xg,[l("div",Eg,[l("div",null,[a[74]||(a[74]=l("h3",{class:"running-headline"},[l("span",{class:"running-spinner","aria-hidden":"true"}),l("span",null,"Test Running")],-1)),l("p",Gg,S(Re.value?.title||"Executing current step..."),1)]),l("span",Fg,S(ct.value?.metrics?.totalSteps?`${Number(ct.value.steps?.length||0)}/${Number(ct.value.metrics.totalSteps||0)}`:"in progress"),1)]),l("div",Lg,[l("article",Mg,[a[75]||(a[75]=l("span",null,"Completed",-1)),l("strong",null,S(Number(ct.value?.steps?.length||0)),1)]),l("article",Og,[a[76]||(a[76]=l("span",null,"Pass",-1)),l("strong",null,S(Number(ct.value?.metrics?.pass||0)),1)]),l("article",zg,[a[77]||(a[77]=l("span",null,"Warn",-1)),l("strong",null,S(Number(ct.value?.metrics?.warn||0)),1)]),l("article",$g,[a[78]||(a[78]=l("span",null,"Fail",-1)),l("strong",null,S(Number(ct.value?.metrics?.fail||0)),1)])]),Re.value?(v(),b("div",Bg,[l("div",Kg,[l("strong",null,S(Re.value.title||Re.value.id),1),l("span",null,S(Re.value.kind),1)]),l("p",Vg,S(Re.value.description||"Current step in execution."),1),Re.value.kind==="wait"?(v(),b("div",Wg,[l("span",null,[a[79]||(a[79]=l("strong",null,"Wait",-1)),de(" "+S(Number(Re.value.delayMs||0))+" ms",1)]),l("span",null,[a[80]||(a[80]=l("strong",null,"Reason",-1)),de(" "+S(Re.value.reason||"Pause before next action"),1)])])):(v(),b("div",Ug,[l("span",null,[a[81]||(a[81]=l("strong",null,"Command",-1)),de(" "+S(Re.value.commandGA||"n/a"),1)]),l("span",null,[a[82]||(a[82]=l("strong",null,"Status GA",-1)),de(" "+S(Re.value.statusGA||"n/a"),1)]),l("span",null,[a[83]||(a[83]=l("strong",null,"Payload",-1)),de(" "+S(An(Re.value.commandPayload,Re.value.commandDPT)),1)]),l("span",null,[a[84]||(a[84]=l("strong",null,"Expected",-1)),de(" "+S(An(Re.value.expectedPayload,Re.value.statusDPT||Re.value.commandDPT)),1)])])),Re.value.kind!=="wait"&&Re.value.statusGA?(v(),b("div",jg,[l("section",Hg,[a[87]||(a[87]=l("h4",null,"Spontaneous Write From Status GA",-1)),l("div",Xg,[l("span",null,[a[85]||(a[85]=l("strong",null,"Status GA",-1)),de(" "+S(Re.value.statusGA||"n/a"),1)]),l("span",null,[a[86]||(a[86]=l("strong",null,"Timeout",-1)),de(" "+S(Number(Re.value.statusWriteTimeoutMs||0))+" ms",1)])])]),l("section",qg,[a[90]||(a[90]=l("h4",null,"Active Read Request To Status GA",-1)),l("div",Jg,[l("span",null,[a[88]||(a[88]=l("strong",null,"Status GA",-1)),de(" "+S(Re.value.statusGA||"n/a"),1)]),l("span",null,[a[89]||(a[89]=l("strong",null,"Timeout",-1)),de(" "+S(Number(Re.value.statusResponseTimeoutMs||0))+" ms",1)])])])])):G("",!0)])):G("",!0)])):G("",!0),ne.value&&bt.value?(v(),b("article",{key:3,ref_key:"testPlanReportRef",ref:ke,class:"area-detail"},[l("div",Zg,[l("div",null,[l("h3",null,S(Is(ne.value)),1),l("p",Yg,S(Rs(ne.value)||xt(ne.value.generatedAt)),1)]),l("div",Qg,[l("span",eh,S(Ja(ne.value)),1),ne.value.live===!0?(v(),b("span",th,[...a[91]||(a[91]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):G("",!0),l("span",ah,S(ne.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:Rr}," Export PDF ")])]),l("div",sh,[(v(!0),b(q,null,ie(yn(ne.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",nh,[(v(!0),b(q,null,ie(Za(ne.value),r=>(v(),b("article",{key:r.id,class:ue(["report-check",`report-${r.status}`])},[l("div",rh,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",ih,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",oh,[(v(!0),b(q,null,ie(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",lh,[(v(!0),b(q,null,ie(c.items,g=>(v(),b("span",{key:`${r.id}-${c.title}-${g.label}`},[l("strong",null,S(g.label),1),de(" "+S(g.value),1)]))),128))])]))),128))])):(v(),b("div",dh,[(v(!0),b(q,null,ie(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),de(" "+S(c.value),1)]))),128))]))],2))),128))]),Za(ne.value).length?G("",!0):(v(),b("p",uh,"No detailed entries stored for this report yet.")),Ya(ne.value).length?(v(),b("div",ch,[a[92]||(a[92]=l("h4",null,"Suggestions",-1)),l("ul",fh,[(v(!0),b(q,null,ie(Ya(ne.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):G("",!0)],512)):G("",!0),s.testPlanDraft&&!s.testPlanRunning&&!bt.value&&s.testTemplateBuilderFocus!==!0?(v(),b("article",ph,[l("div",gh,[l("div",null,[l("h3",hh,[a[93]||(a[93]=l("span",null,"Edit Plan",-1)),s.testPlanGenerating?(v(),b("span",mh)):G("",!0)])]),l("div",vh,[l("span",bh,S(Number(s.testPlanDraft.steps?.length||0))+" steps",1),l("button",{class:"secondary-button",type:"button",onClick:td}," Add Step "),l("button",{class:"secondary-button",type:"button",onClick:ad}," Add Wait ")])]),l("div",yh,[l("label",Ah,[a[95]||(a[95]=l("span",null,"Area",-1)),l("select",{value:s.testPlanDraft.areaId||s.testAreaSelectedId||"",disabled:!ye.value.length,onChange:a[20]||(a[20]=r=>md(r.target.value))},[a[94]||(a[94]=l("option",{value:"",disabled:""},"Select area",-1)),(v(!0),b(q,null,ie(ye.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,wh))),128))],40,Sh)]),l("label",Ph,[a[96]||(a[96]=l("span",null,"Plan name",-1)),pe(l("input",{"onUpdate:modelValue":a[21]||(a[21]=r=>s.testPlanDraft.name=r),type:"text",placeholder:"KNX active test name"},null,512),[[Ce,s.testPlanDraft.name]])]),l("label",Th,[a[97]||(a[97]=l("span",null,"Description",-1)),pe(l("textarea",{"onUpdate:modelValue":a[22]||(a[22]=r=>s.testPlanDraft.description=r),rows:"2",placeholder:"Short operator-facing description"},null,512),[[Ce,s.testPlanDraft.description]])])]),l("div",_h,[(v(!0),b(q,null,ie(s.testPlanDraft.steps||[],(r,c)=>(v(),b("article",{key:r.id,class:ue(["report-check report-pass planner-step-card",{"planner-step-running":s.testPlanRunning&&s.testPlanRunningStepId===r.id,"planner-step-dragging":s.draggedTestPlanStepId===r.id,"planner-step-drop-target":s.dragOverTestPlanStepId===r.id}]),onDragenter:Kt(g=>od(r.id),["prevent"]),onDragover:a[23]||(a[23]=Kt(()=>{},["prevent"])),onDrop:g=>dd(r.id,g)},[l("div",Ih,[l("div",Rh,[l("button",{class:"drag-handle",type:"button",draggable:"true",tabindex:"-1","aria-label":"Drag step",title:"Drag step",onDragstart:g=>id(r.id,g),onDragend:Rn}," ⋮⋮ ",40,Nh),l("button",{class:"collapse-toggle",type:"button","aria-expanded":r.collapsed!==!0,title:r.collapsed===!0?"Expand step":"Collapse step",onClick:g=>rd(r)},[l("span",{class:ue(["collapse-icon",{collapsed:r.collapsed===!0}])},"▾",2)],8,kh),l("strong",null,S(r.title||r.id),1)]),l("div",Ch,[l("span",null,S(r.kind),1),l("button",{class:"secondary-button",type:"button",onClick:g=>sd(c)}," Duplicate ",8,xh),l("button",{class:"secondary-button",type:"button",onClick:g=>nd(c)}," Remove ",8,Eh)])]),r.collapsed===!0?(v(),b("div",Gh,[r.kind==="wait"?(v(),b("span",Fh,[a[98]||(a[98]=l("strong",null,"Wait",-1)),de(" "+S(Number(r.delayMs||0))+" ms",1)])):(v(),b("span",Lh,[a[99]||(a[99]=l("strong",null,"Command",-1)),de(" "+S(r.commandGA||"n/a"),1)])),r.kind!=="wait"?(v(),b("span",Mh,[a[100]||(a[100]=l("strong",null,"Status GA",-1)),de(" "+S(r.statusGA||"n/a"),1)])):G("",!0),r.kind!=="wait"?(v(),b("span",Oh,[a[101]||(a[101]=l("strong",null,"Payload",-1)),de(" "+S(An(r.commandPayload,r.commandDPT)),1)])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",zh,[a[102]||(a[102]=l("strong",null,"Write timeout",-1)),de(" "+S(Number(r.statusWriteTimeoutMs||0))+" ms",1)])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",$h,[a[103]||(a[103]=l("strong",null,"Response timeout",-1)),de(" "+S(Number(r.statusResponseTimeoutMs||0))+" ms",1)])):G("",!0)])):(v(),b("div",Bh,[l("label",Kh,[a[104]||(a[104]=l("span",null,"Title",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.title=g,type:"text",placeholder:"Step title"},null,8,Vh),[[Ce,r.title]])]),l("label",Wh,[a[105]||(a[105]=l("span",null,"Description",-1)),pe(l("textarea",{"onUpdate:modelValue":g=>r.description=g,rows:"2",placeholder:"What this step checks"},null,8,Uh),[[Ce,r.description]])]),r.kind==="wait"?(v(),b("label",jh,[a[106]||(a[106]=l("span",null,"Wait ms",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.delayMs=g,type:"number",min:"0",max:"30000",step:"100"},null,8,Hh),[[Ce,r.delayMs,void 0,{number:!0}]])])):G("",!0),r.kind!=="wait"?(v(),b("section",Xh,[a[111]||(a[111]=l("h4",null,"Command",-1)),l("div",qh,[l("label",Jh,[a[108]||(a[108]=l("span",null,"Command GA",-1)),pe(l("select",{"onUpdate:modelValue":g=>r.commandGA=g,onChange:g=>Vr(r)},[a[107]||(a[107]=l("option",{value:""},"Select command GA",-1)),(v(!0),b(q,null,ie(fn.value,g=>(v(),b("option",{key:g.ga,value:g.ga},S(`${g.ga} | ${g.label}`),9,Yh))),128))],40,Zh),[[Pa,r.commandGA]])]),l("label",Qh,[a[109]||(a[109]=l("span",null,"Command DPT",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.commandDPT=g,type:"text",placeholder:"1.001",onChange:g=>ks(r)},null,40,em),[[Ce,r.commandDPT]])]),l("label",tm,[a[110]||(a[110]=l("span",null,"Command payload",-1)),ra(r.commandDPT).length?pe((v(),b("select",{key:0,"onUpdate:modelValue":g=>r.commandPayload=g},[(v(!0),b(q,null,ie(ra(r.commandDPT),g=>(v(),b("option",{key:`${r.id}-command-${g.value}`,value:String(g.value)},S(g.label),9,sm))),128))],8,am)),[[Pa,r.commandPayload]]):pe((v(),b("input",{key:1,"onUpdate:modelValue":g=>r.commandPayload=g,type:"text",placeholder:"true, false, 50"},null,8,nm)),[[Ce,r.commandPayload]])])])])):G("",!0),r.kind!=="wait"?(v(),b("section",rm,[a[116]||(a[116]=l("h4",null,"Status",-1)),l("div",im,[l("label",om,[a[113]||(a[113]=l("span",null,"Status GA",-1)),pe(l("select",{"onUpdate:modelValue":g=>r.statusGA=g,onChange:g=>Vr(r)},[a[112]||(a[112]=l("option",{value:""},"No feedback",-1)),(v(!0),b(q,null,ie(Pr.value,g=>(v(),b("option",{key:g.ga,value:g.ga},S(`${g.ga} | ${g.label}`),9,dm))),128))],40,lm),[[Pa,r.statusGA]])]),l("label",um,[a[114]||(a[114]=l("span",null,"Status DPT",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.statusDPT=g,type:"text",placeholder:"1.001",onChange:g=>ks(r)},null,40,cm),[[Ce,r.statusDPT]])]),l("label",fm,[a[115]||(a[115]=l("span",null,"Expected payload",-1)),ra(r.statusDPT||r.commandDPT).length?pe((v(),b("select",{key:0,"onUpdate:modelValue":g=>r.expectedPayload=g},[(v(!0),b(q,null,ie(ra(r.statusDPT||r.commandDPT),g=>(v(),b("option",{key:`${r.id}-expected-${g.value}`,value:String(g.value)},S(g.label),9,gm))),128))],8,pm)),[[Pa,r.expectedPayload]]):pe((v(),b("input",{key:1,"onUpdate:modelValue":g=>r.expectedPayload=g,type:"text",placeholder:"Expected feedback value"},null,8,hm)),[[Ce,r.expectedPayload]])])])])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("div",mm,[l("section",vm,[a[118]||(a[118]=l("h4",null,"Spontaneous Write From Status GA",-1)),a[119]||(a[119]=l("p",{class:"area-detail-subhead"},[de("Wait for a spontaneous "),l("code",null,"GroupValue_Write"),de(" telegram from the status GA.")],-1)),l("label",bm,[a[117]||(a[117]=l("span",null,"Status write timeout ms",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.statusWriteTimeoutMs=g,type:"number",min:"500",max:"60000",step:"100"},null,8,ym),[[Ce,r.statusWriteTimeoutMs,void 0,{number:!0}]])])]),l("section",Am,[a[121]||(a[121]=l("h4",null,"Active Read Request To Status GA",-1)),a[122]||(a[122]=l("p",{class:"area-detail-subhead"},[de("Send a "),l("code",null,"read"),de(" telegram to the status GA and wait for a "),l("code",null,"GroupValue_Response"),de(".")],-1)),l("label",Sm,[a[120]||(a[120]=l("span",null,"Read response timeout ms",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.statusResponseTimeoutMs=g,type:"number",min:"500",max:"60000",step:"100"},null,8,wm),[[Ce,r.statusResponseTimeoutMs,void 0,{number:!0}]])])])])):G("",!0),l("label",Pm,[a[123]||(a[123]=l("span",null,"Reason",-1)),pe(l("input",{"onUpdate:modelValue":g=>r.reason=g,type:"text",placeholder:"Why this step exists"},null,8,Tm),[[Ce,r.reason]])])]))],42,Dh))),128))])])):G("",!0)])],2)],2)):G("",!0),s.activeTab==="results"?(v(),b("section",_m,[l("div",Dm,[a[124]||(a[124]=l("div",null,[l("h2",null,"Test Results"),l("p",{class:"area-detail-subhead"},"Live and saved reports generated by KNX active and read-only tests.")],-1)),l("div",Im,[l("span",Rm,S(aa.value.length)+" available",1)])]),l("div",Nm,[l("article",km,[a[125]||(a[125]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select Test Result"),l("p",{class:"area-detail-subhead"},"Choose a report to inspect metrics, detailed checks, and suggestions.")])],-1)),l("div",Cm,[(v(!0),b(q,null,ie(aa.value,r=>(v(),b("div",{key:r.id,class:"sidebar-result-row"},[l("button",{type:"button",class:ue(["area-list-item sidebar-result-item",{active:ne.value&&ne.value.id===r.id,running:r.live===!0}]),onClick:c=>Ns(r.id,{openMenu:!1,activateResultsTab:!0,resultOnly:!0})},[l("span",Em,[l("strong",Gm,[r.live===!0?(v(),b("span",Fm)):G("",!0),l("span",null,S(Is(r)),1)]),l("span",{class:ue(["sidebar-result-status",`status-${r.overallStatus||"pass"}`])},S(r.overallStatus||"n/a"),3)]),l("span",Lm,[de(S(Ja(r)),1),r.live===!0?(v(),b("span",Mm," | running")):G("",!0)]),l("span",Om,S(Rs(r)||xt(r.generatedAt)),1),l("span",zm,S(xt(r.generatedAt)),1)],10,xm),l("button",{class:"sidebar-result-delete-button",type:"button",disabled:s.deletingTestResultId===r.id,onClick:Kt(c=>Tn(r.id),["stop"])},S(s.deletingTestResultId===r.id?"Deleting...":"Delete"),9,$m)]))),128)),aa.value.length?G("",!0):(v(),b("p",Bm,"No saved test results yet."))])]),ne.value?(v(),b("article",{key:0,ref_key:"testPlanReportRef",ref:ke,class:"area-detail"},[l("div",Km,[l("div",null,[l("h3",null,S(Is(ne.value)),1),l("p",Vm,S(Rs(ne.value)||xt(ne.value.generatedAt)),1)]),l("div",Wm,[l("span",Um,S(Ja(ne.value)),1),ne.value.live===!0?(v(),b("span",jm,[...a[126]||(a[126]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):G("",!0),l("span",Hm,S(ne.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:Rr}," Export PDF "),l("button",{class:"danger-button",type:"button",disabled:!ne.value||s.deletingTestResultId===ne.value.id,onClick:a[24]||(a[24]=r=>Tn(ne.value?.id))},S(s.deletingTestResultId===ne.value?.id?"Deleting...":"Delete"),9,Xm),l("button",{class:"secondary-button",type:"button",onClick:Lr}," Open Source Test ")])]),l("div",qm,[(v(!0),b(q,null,ie(yn(ne.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",Jm,[(v(!0),b(q,null,ie(Za(ne.value),r=>(v(),b("article",{key:r.id,class:ue(["report-check",`report-${r.status}`])},[l("div",Zm,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",Ym,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",Qm,[(v(!0),b(q,null,ie(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",ev,[(v(!0),b(q,null,ie(c.items,g=>(v(),b("span",{key:`${r.id}-${c.title}-${g.label}`},[l("strong",null,S(g.label),1),de(" "+S(g.value),1)]))),128))])]))),128))])):(v(),b("div",tv,[(v(!0),b(q,null,ie(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),de(" "+S(c.value),1)]))),128))]))],2))),128))]),Za(ne.value).length?G("",!0):(v(),b("p",av,"No detailed entries stored for this report yet.")),Ya(ne.value).length?(v(),b("div",sv,[a[127]||(a[127]=l("h4",null,"Suggestions",-1)),l("ul",nv,[(v(!0),b(q,null,ie(Ya(ne.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):G("",!0)],512)):(v(),b("article",rv,[...a[128]||(a[128]=[l("p",{class:"empty-state"},"No test result selected.",-1)])]))])])):G("",!0),s.activeTab==="overview"?(v(),b("section",iv,[l("div",ov,[a[129]||(a[129]=l("h2",null,"Top Group Addresses",-1)),l("span",lv,S(hn.value.length)+" visible",1)]),hn.value.length?(v(),b("ul",dv,[(v(!0),b(q,null,ie(hn.value,r=>(v(),b("li",{key:r.ga,class:"rank-row"},[l("span",uv,S(r.ga),1),l("span",cv,S(r.label||"Unlabeled"),1),l("strong",null,S(Number(r.count||0)),1)]))),128))])):(v(),b("p",fv,"No top group address data available yet."))])):G("",!0),s.activeTab==="overview"?(v(),b("section",pv,[l("div",gv,[a[130]||(a[130]=l("h2",null,"Event Mix",-1)),l("span",hv,S(Ds.value.length)+" event types",1)]),Ds.value.length?(v(),b("ul",mv,[(v(!0),b(q,null,ie(Ds.value,r=>(v(),b("li",{key:r.name,class:"event-row"},[l("span",vv,S(r.name),1),l("div",bv,[l("span",{class:"event-bar-fill",style:cs({width:`${Math.max(r.count/dl.value*100,6)}%`})},null,4)]),l("strong",null,S(r.count),1)]))),128))])):(v(),b("p",yv,"Event distribution will appear after the first samples."))])):G("",!0),s.activeTab==="overview"?(v(),b("section",Av,[l("div",Sv,[a[131]||(a[131]=l("h2",null,"Bus Connection Persistence",-1)),st.value?(v(),b("span",wv,S(String(st.value.currentState||"unknown")),1)):G("",!0)]),st.value?(v(),b(q,{key:0},[l("div",Pv,[l("span",Tv,"Connected "+S(Ca(st.value.connectedSec||0)),1),l("span",_v,"Disconnected "+S(Ca(st.value.disconnectedSec||0)),1),l("span",Dv,"Coverage "+S(Number(st.value.knownCoveragePct||0))+"%",1)]),l("div",Iv,[(v(!0),b(q,null,ie(fl.value,r=>(v(),b("span",{key:r.key,class:ue(["bus-segment",r.className]),style:cs({left:r.left,width:r.width}),title:r.title},null,14,Rv))),128))]),l("div",Nv,[l("span",null,S(Ps(st.value.windowStartAt)),1),l("span",null,S(Ps(st.value.windowEndAt)),1),a[132]||(a[132]=l("span",null,"Now",-1))]),a[133]||(a[133]=l("p",{class:"bus-note"},"Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.",-1))],64)):(v(),b("p",kv,"Waiting for connection persistence data..."))])):G("",!0),s.activeTab==="overview"?(v(),b("section",{key:7,ref_key:"flowCardRef",ref:Yt,class:ue(["card card-flow",{"is-fullscreen":ha.value}])},[l("div",Cv,[a[134]||(a[134]=l("h2",null,"Flow Map",-1)),l("div",xv,[l("span",Ev," Nodes "+S(na.value.nodes.length)+" | Links "+S(na.value.edges.length),1),l("button",{class:"secondary-button",type:"button",onClick:L},S(ha.value?"Exit Fullscreen":"Fullscreen"),1)])]),l("div",Gv,[l("label",Fv,[a[135]||(a[135]=l("span",null,"Max nodes",-1)),pe(l("input",{"onUpdate:modelValue":a[25]||(a[25]=r=>s.flowMaxNodes=r),type:"number",min:"4",max:"32",step:"1"},null,512),[[Ce,s.flowMaxNodes,void 0,{number:!0}]])]),l("label",Lv,[a[136]||(a[136]=l("span",null,"Find GA",-1)),pe(l("input",{"onUpdate:modelValue":a[26]||(a[26]=r=>s.flowSearch=r),type:"text",placeholder:"Search GA or label"},null,512),[[Ce,s.flowSearch]])]),l("div",Mv,[a[138]||(a[138]=l("span",null,"Select Nodes to Filter by",-1)),pe(l("select",{"onUpdate:modelValue":a[27]||(a[27]=r=>s.flowSelectedGa=r),multiple:"",size:"5"},[(v(!0),b(q,null,ie(ul.value,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}`),9,Ov))),128))],512),[[Pa,s.flowSelectedGa]]),l("label",zv,[pe(l("input",{"onUpdate:modelValue":a[28]||(a[28]=r=>s.flowShowUniversalNodes=r),type:"checkbox"},null,512),[[Bn,s.flowShowUniversalNodes]]),a[137]||(a[137]=l("span",null,"Show Universal Mode nodes",-1))])]),a[139]||(a[139]=wa('<div class="flow-legend" data-v-3e43ecbd><span data-v-3e43ecbd><i class="legend-line legend-write" data-v-3e43ecbd></i>Write</span><span data-v-3e43ecbd><i class="legend-line legend-response" data-v-3e43ecbd></i>Response</span><span data-v-3e43ecbd><i class="legend-line legend-read" data-v-3e43ecbd></i>Read</span><span data-v-3e43ecbd><i class="legend-line legend-repeat" data-v-3e43ecbd></i>Repeat</span><span data-v-3e43ecbd><i class="legend-dot legend-anomaly" data-v-3e43ecbd></i>Anomaly</span><span data-v-3e43ecbd><i class="legend-dot legend-external" data-v-3e43ecbd></i>External</span></div>',1))]),l("div",$v,[na.value.nodes.length?(v(),b("svg",{key:0,class:"flow-svg",viewBox:`0 0 ${na.value.width} ${na.value.height}`,preserveAspectRatio:"xMidYMid meet"},[l("defs",null,[(v(),b(q,null,ie(d,(r,c)=>l("marker",{id:`flow-arrow-${c}`,key:c,viewBox:"0 0 10 8",markerWidth:"10",markerHeight:"8",refX:"8.8",refY:"4",orient:"auto",markerUnits:"userSpaceOnUse"},[l("path",{d:"M0,0 L10,4 L0,8 z",fill:r},null,8,Vv)],8,Kv)),64))]),(v(!0),b(q,null,ie(na.value.edges,r=>(v(),b("path",{key:r.key,class:ue(["flow-edge",{"flow-edge-active":r.active,"flow-edge-idle":!r.active}]),d:r.d,stroke:r.color,"stroke-width":r.width,opacity:r.opacity,"marker-end":`url(#${r.markerId})`},[l("title",null,S(r.tooltip),1)],10,Wv))),128)),(v(!0),b(q,null,ie(na.value.nodes,r=>(v(),b("g",{key:r.id,class:ue(["flow-node",{"is-anomaly":r.anomalyCount>0,"is-external":!r.inFlow,"is-idle":r.isIdle}])},[l("circle",{cx:r.x,cy:r.y,r:"24"},null,8,Uv),l("text",{class:"node-label",x:r.x,y:r.y+1},S(r.shortLabel),9,jv),r.shortSubtitle?(v(),b("text",{key:0,class:"node-subtitle",x:r.x,y:r.y+38},S(r.shortSubtitle),9,Hv)):G("",!0),r.shortPayload?(v(),b("text",{key:1,class:"node-payload",x:r.x,y:r.y+52},S(r.shortPayload),9,Xv)):G("",!0),r.anomalyCount>0?(v(),b("text",{key:2,class:"node-badge",x:r.x,y:r.y-30},"anomaly x"+S(r.anomalyCount),9,qv)):G("",!0),l("title",null,S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}${r.payload?` | payload: ${r.payload}`:""}`),1)],2))),128))],8,Bv)):(v(),b("p",Jv,"No topology data available yet."))]),l("p",Zv,"Window "+S(na.value.telemetryWindowSec||0)+"s.",1)],2)):G("",!0),s.activeTab==="overview"?(v(),b("section",Yv,[l("div",Qv,[a[140]||(a[140]=l("h2",null,"Anomalies",-1)),l("span",eb,S(gn.value.length)+" recent",1)]),gn.value.length?(v(),b("div",tb,[(v(!0),b(q,null,ie(gn.value.slice(0,20),r=>(v(),b("article",{key:`${r.at}-${Ts(r).ga||""}`,class:"anomaly-card"},[l("div",ab,[l("strong",null,S(Ts(r).type||"anomaly"),1),l("span",null,S(Ts(r).ga||"no GA"),1)]),l("p",sb,S(r.at||""),1),l("pre",null,S(JSON.stringify(Ts(r),null,2)),1)]))),128))])):(v(),b("p",nb,"No anomalies detected right now."))])):G("",!0),s.activeTab==="assistant"?(v(),b("section",rb,[l("div",ib,[a[141]||(a[141]=l("h2",null,"Ask",-1)),l("span",ob,S(ta.value.llmEnabled?"AI enabled":"AI disabled"),1)]),l("div",lb,[(v(!0),b(q,null,ie(pl.value,r=>(v(),b("article",{key:r.key,class:ue(["chat-message",`chat-${r.kind}`])},[r.kind==="assistant"?(v(),b("div",{key:0,innerHTML:r.html},null,8,db)):(v(),b("pre",ub,S(r.rawText),1))],2))),128)),s.asking?(v(),b("article",cb,[...a[142]||(a[142]=[l("span",{class:"chat-pending-spinner","aria-hidden":"true"},null,-1),l("span",null,"Thinking...",-1)])])):G("",!0)]),l("div",fb,[(v(!0),b(q,null,ie(il.value,r=>(v(),b("button",{key:r.key,class:"preset-button",type:"button",disabled:s.asking||!ta.value.llmEnabled,onClick:c=>_n(r.text)},S(r.text),9,pb))),128))]),l("div",gb,[pe(l("input",{"onUpdate:modelValue":a[29]||(a[29]=r=>s.chatDraft=r),class:"ask-input",type:"text",disabled:s.asking||!ta.value.llmEnabled,placeholder:"Ask a question about KNX traffic...",onKeydown:a[30]||(a[30]=Hc(Kt(r=>_n(),["prevent"]),["enter"]))},null,40,hb),[[Ce,s.chatDraft]]),l("button",{class:"primary-button",type:"button",disabled:s.asking||!ta.value.llmEnabled,onClick:a[31]||(a[31]=r=>_n())}," Send ",8,mb)])])):G("",!0),s.activeTab==="settings"?(v(),b("section",vb,[a[149]||(a[149]=l("div",{class:"card-head"},[l("div",null,[l("h2",null,"Settings"),l("p",{class:"area-detail-subhead"},"Manage node options and full configuration import/export.")])],-1)),l("div",bb,[l("button",{class:ue(["settings-tab-button",{active:s.settingsTab==="node"}]),type:"button",onClick:a[32]||(a[32]=r=>Fr("node"))}," KNX AI Node ",2),l("button",{class:ue(["settings-tab-button",{active:s.settingsTab==="config"}]),type:"button",onClick:a[33]||(a[33]=r=>Fr("config"))}," Import / Export ",2)]),s.settingsTab==="node"?(v(),b("article",yb,[a[145]||(a[145]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"KNX AI Node"),l("span",{class:"meta-chip"},"Runtime preferences")],-1)),a[146]||(a[146]=l("p",{class:"area-detail-subhead"},"Select the node used by this UI and control refresh behavior.",-1)),l("div",Ab,[l("label",Sb,[a[143]||(a[143]=l("span",null,"Node",-1)),pe(l("select",{"onUpdate:modelValue":a[34]||(a[34]=r=>s.selectedNodeId=r),class:"node-select",onChange:Tl},[(v(!0),b(q,null,ie(s.nodes,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.name||"KNX AI"}${r.gatewayName?` | ${r.gatewayName}`:""}`),9,wb))),128))],544),[[Pa,s.selectedNodeId]])]),l("label",Pb,[pe(l("input",{"onUpdate:modelValue":a[35]||(a[35]=r=>s.autoRefresh=r),type:"checkbox"},null,512),[[Bn,s.autoRefresh]]),a[144]||(a[144]=l("span",null,"Auto refresh",-1))])])])):(v(),b("article",Tb,[a[147]||(a[147]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"Import / Export"),l("span",{class:"meta-chip"},"Full configuration")],-1)),a[148]||(a[148]=l("p",{class:"area-detail-subhead"},"Export or import the full KNX AI configuration for the selected node.",-1)),l("div",_b,[l("button",{class:"secondary-button",type:"button",disabled:!s.selectedNodeId,onClick:Sd}," Export Configuration ",8,Db),l("button",{class:"secondary-button",type:"button",disabled:!s.selectedNodeId,onClick:wd}," Import Configuration ",8,Ib)])])),l("input",{ref_key:"configImportRef",ref:Ia,type:"file",accept:"application/json,.json",class:"hidden-file-input",onChange:Pd},null,544)])):G("",!0)])]),s.areaLlmRegenerating||s.areaLlmBulkDeleting||s.testPlanGenerating?(v(),b("div",Rb,[l("div",Nb,[a[150]||(a[150]=l("span",{class:"running-spinner global-wait-spinner","aria-hidden":"true"},null,-1)),l("strong",null,S(s.testPlanGenerating?"Building Test Plan":s.areaLlmBulkDeleting?"Deleting AI Areas":"Regenerating AI Areas"),1),l("span",null,S(s.testPlanGenerating?"Please wait while the template builder generates the test plan.":s.areaLlmBulkDeleting?"Please wait while AI-generated areas are removed.":"Please wait, this can take a while with large ETS projects."),1)])])):G("",!0),s.testPlanRunConfirmOpen?(v(),b("div",{key:1,class:"modal-backdrop",onClick:Wr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"run-test-title",onClick:a[37]||(a[37]=Kt(()=>{},["stop"]))},[a[151]||(a[151]=l("h3",{id:"run-test-title"},"Start test?",-1)),l("p",kb,S(s.testPlanRunMode==="repeat"?"This will send real telegrams on the KNX bus and repeat the selected test plan until you press Stop Repeat.":"This will send real telegrams on the KNX bus for the selected test plan."),1),l("div",Cb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Wr}," Cancel "),l("button",{class:"primary-button",type:"button",disabled:s.testPlanRunning,onClick:a[36]||(a[36]=r=>Ad(s.testPlanRunMode))}," Start Test ",8,xb)])])])):G("",!0),s.testPlanUnsavedConfirmOpen?(v(),b("div",{key:2,class:"modal-backdrop",onClick:jr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-plan-title",onClick:a[39]||(a[39]=Kt(()=>{},["stop"]))},[a[152]||(a[152]=l("h3",{id:"unsaved-plan-title"},"Unsaved changes",-1)),l("p",Eb,"Save or discard the current plan changes before opening "+S(s.testPlanPendingActionLabel||"another plan")+".",1),l("div",Gb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:jr}," Stay Here "),l("button",{class:"secondary-button",type:"button",onClick:a[38]||(a[38]=r=>{gd(),Hr()})}," Discard Changes "),l("button",{class:"primary-button",type:"button",disabled:s.testPlanSaving||!s.testPlanDraft,onClick:hd},S(s.testPlanSaving?"Saving...":"Save and Continue"),9,Fb)])])])):G("",!0),s.areaUnsavedConfirmOpen?(v(),b("div",{key:3,class:"modal-backdrop",onClick:Gr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-area-title",onClick:a[40]||(a[40]=Kt(()=>{},["stop"]))},[a[153]||(a[153]=l("h3",{id:"unsaved-area-title"},"Unsaved changes",-1)),a[154]||(a[154]=l("p",{class:"area-detail-subhead"},"Discard the current area changes and close the editor?",-1)),l("div",{class:"modal-actions"},[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Gr}," Stay Here "),l("button",{class:"primary-button",type:"button",onClick:kl}," Discard and Close ")])])])):G("",!0)],2)],64))}},Kb=sf(Bb,[["__scopeId","data-v-3e43ecbd"]]);Jc(Kb).mount("#app");export{tf as _};