diff --git a/backend/routers/ideen.py b/backend/routers/ideen.py index 9b4e488..7cea3fa 100644 --- a/backend/routers/ideen.py +++ b/backend/routers/ideen.py @@ -26,6 +26,11 @@ class AntwortIn(BaseModel): antwort: str +class ArchivAlleIn(BaseModel): + # Leer = alle fertigen Karten der Queue; gesetzt = nur die dieses Projekts. + projekt: str = "" + + @router.get("/ideen") def list_queue() -> dict: return ideen.list_queue() @@ -114,6 +119,15 @@ def archive(body: TaskIn) -> dict: return res +@router.post("/ideen/archivieren-alle") +def archive_alle(body: ArchivAlleIn) -> dict: + """Fertige Karten sammelweise wegräumen. Fasst ausschließlich `done` an.""" + res = ideen.archive_done(body.projekt) + if not res.get("ok"): + raise HTTPException(400, res.get("error", "Archivieren fehlgeschlagen.")) + return res + + @router.get("/ideen/{id}/log") def get_log(id: str) -> dict: return ideen.log_of(id) diff --git a/backend/services/ideen.py b/backend/services/ideen.py index 91ea5d9..dcb8efa 100644 --- a/backend/services/ideen.py +++ b/backend/services/ideen.py @@ -509,6 +509,41 @@ def archive_task(task_id: str) -> dict: return {"ok": True} +def archive_done(projekt: str = "") -> dict: + """Alle FERTIGEN Karten wegräumen — optional nur die eines Projekts. + + Sammel-Aufräumen (25.07.2026): Bei fünf abgeschlossenen Projekt-Ketten wären das + sonst ~18 Einzelklicks. Wie beim Einzel-Archivieren wird nichts gelöscht — die + Karten wandern ins Kanban-Archiv und bleiben dort lesbar. + + ‼️ Bewusst NUR `done`. Laufende, hängende, wartende und in Ausarbeitung befindliche + Karten werden nie angefasst, auch nicht bei leerem `projekt`-Filter — ein Sammel- + Knopf darf niemals versehentlich Arbeit abräumen. + """ + if not _available(): + return {"ok": False, "error": "Die Ideen-Queue lebt auf der Box."} + q = list_queue() + if not q.get("available"): + return {"ok": False, "error": q.get("fehler") or "Queue nicht lesbar."} + + ziel = [i for i in q.get("items", []) + if i.get("status") == "done" and (not projekt or i.get("projekt") == projekt)] + if not ziel: + return {"ok": True, "archiviert": 0, "fehlgeschlagen": []} + + ok, fehler = 0, [] + for item in ziel: + r = archive_task(item.get("id", "")) + if r.get("ok"): + ok += 1 + else: + # Die Items aus list_queue tragen "titel" (deutsch), nicht das rohe "title". + fehler.append({"id": item.get("id"), "titel": _kurz(item.get("titel") or "", 60), + "error": r.get("error", "")}) + _list_cache["ts"] = 0.0 + return {"ok": True, "archiviert": ok, "fehlgeschlagen": fehler} + + def ergebnis_of(task_id: str) -> dict: """Das ERGEBNIS einer fertigen Aufgabe — die Abschluss-Zusammenfassung des Workers. diff --git a/frontend/dist/assets/AgentView-DvxkXocP.js b/frontend/dist/assets/AgentView-DpL99Ik0.js similarity index 99% rename from frontend/dist/assets/AgentView-DvxkXocP.js rename to frontend/dist/assets/AgentView-DpL99Ik0.js index 83f34bf..99aa709 100644 --- a/frontend/dist/assets/AgentView-DvxkXocP.js +++ b/frontend/dist/assets/AgentView-DpL99Ik0.js @@ -1,4 +1,4 @@ -import{c as A,Y as P,l as B,b as M,u as D,r as z,j as e,Z as T,e as a,$ as g,a0 as b,a1 as W,x as f,a2 as j,W as G,X as I,C as N,g as y,q as i}from"./index-CoRdA_gp.js";/** +import{c as A,Y as P,l as B,b as M,u as D,r as z,j as e,Z as T,e as a,$ as g,a0 as b,a1 as W,x as f,a2 as j,W as G,X as I,C as N,g as y,q as i}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/AuftragsbuchView-BZWvV2pd.js b/frontend/dist/assets/AuftragsbuchView-Ba9tMOnf.js similarity index 99% rename from frontend/dist/assets/AuftragsbuchView-BZWvV2pd.js rename to frontend/dist/assets/AuftragsbuchView-Ba9tMOnf.js index ec14fe7..0fe85a3 100644 --- a/frontend/dist/assets/AuftragsbuchView-BZWvV2pd.js +++ b/frontend/dist/assets/AuftragsbuchView-Ba9tMOnf.js @@ -1,4 +1,4 @@ -import{c as W,ab as H,ac as T,u as F,b as G,r as b,j as e,a3 as O,e as y,L as p,C as z,a9 as P,K as q,U as I,V,ad as K,X as E,T as C,D as M,M as R,g as $,ae as _,q as U}from"./index-CoRdA_gp.js";import{S,H as Q}from"./SectionLabel-DLTvFJ7b.js";/** +import{c as W,ab as H,ac as T,u as F,b as G,r as b,j as e,a3 as O,e as y,L as p,C as z,a9 as P,K as q,U as I,V,ad as K,X as E,T as C,D as M,M as R,g as $,ae as _,q as U}from"./index-DCel3VuW.js";import{S,H as Q}from"./SectionLabel-BpAZbx-8.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/ChronikView-05lPMfKs.js b/frontend/dist/assets/ChronikView-B9KZGo_J.js similarity index 99% rename from frontend/dist/assets/ChronikView-05lPMfKs.js rename to frontend/dist/assets/ChronikView-B9KZGo_J.js index 314c412..062e8c1 100644 --- a/frontend/dist/assets/ChronikView-05lPMfKs.js +++ b/frontend/dist/assets/ChronikView-B9KZGo_J.js @@ -1,4 +1,4 @@ -import{c as m,ai as S,r as c,j as e,aj as z,L as g,U as M,ak as C,ae as D,al as A,am as B,an as Z,e as E,ao as L,u as R,b as q,g as k,q as T}from"./index-CoRdA_gp.js";import{R as j}from"./rotate-ccw-BHsRFGD7.js";/** +import{c as m,ai as S,r as c,j as e,aj as z,L as g,U as M,ak as C,ae as D,al as A,am as B,an as Z,e as E,ao as L,u as R,b as q,g as k,q as T}from"./index-DCel3VuW.js";import{R as j}from"./rotate-ccw-D-_Gb8HQ.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/ConnectView-DjuUKBvu.js b/frontend/dist/assets/ConnectView-pS9nDVLn.js similarity index 98% rename from frontend/dist/assets/ConnectView-DjuUKBvu.js rename to frontend/dist/assets/ConnectView-pS9nDVLn.js index 11eacf8..027fb82 100644 --- a/frontend/dist/assets/ConnectView-DjuUKBvu.js +++ b/frontend/dist/assets/ConnectView-pS9nDVLn.js @@ -1,4 +1,4 @@ -import{c as v,r as c,I,J as A,j as e,K as h,x as B,B as H,D as E,M as z,e as M,L as T,N as F,C as K}from"./index-CoRdA_gp.js";import{F as O}from"./folder-open-BoUGs9bI.js";import{C as R}from"./circle-x-CSyRU1pi.js";import{C as W}from"./copy-BuUsvuS9.js";/** +import{c as v,r as c,I,J as A,j as e,K as h,x as B,B as H,D as E,M as z,e as M,L as T,N as F,C as K}from"./index-DCel3VuW.js";import{F as O}from"./folder-open-wGxbAB4V.js";import{C as R}from"./circle-x-BPOmowbC.js";import{C as W}from"./copy-BMmvuJ2J.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/EigenlebenView-BuEpk3oK.js b/frontend/dist/assets/EigenlebenView-rXqzvB3k.js similarity index 98% rename from frontend/dist/assets/EigenlebenView-BuEpk3oK.js rename to frontend/dist/assets/EigenlebenView-rXqzvB3k.js index f4129b6..2490a32 100644 --- a/frontend/dist/assets/EigenlebenView-BuEpk3oK.js +++ b/frontend/dist/assets/EigenlebenView-rXqzvB3k.js @@ -1,4 +1,4 @@ -import{c as h,ap as b,r as i,j as e,L as g,aq as f,a2 as j,U as k,e as o,D as N,M as v,N as w,g as y}from"./index-CoRdA_gp.js";import{B as S}from"./book-open-x-JfOiM-.js";import{C as z}from"./circle-x-CSyRU1pi.js";/** +import{c as h,ap as b,r as i,j as e,L as g,aq as f,a2 as j,U as k,e as o,D as N,M as v,N as w,g as y}from"./index-DCel3VuW.js";import{B as S}from"./book-open-Dl0AmNw9.js";import{C as z}from"./circle-x-BPOmowbC.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/GraphView-PukEbPEW.js b/frontend/dist/assets/GraphView-4NidXPBK.js similarity index 99% rename from frontend/dist/assets/GraphView-PukEbPEW.js rename to frontend/dist/assets/GraphView-4NidXPBK.js index ee89fb7..653e8d4 100644 --- a/frontend/dist/assets/GraphView-PukEbPEW.js +++ b/frontend/dist/assets/GraphView-4NidXPBK.js @@ -1,4 +1,4 @@ -import{at as Lt,r as V,au as Zi,av as Gn,aw as Vn,ax as Ki,ay as Qi,az as Wn,aA as Bn,aB as Ji,j as lt,a3 as to}from"./index-CoRdA_gp.js";function eo(e,n){let r=0;for(let i of e)(i=+i)&&(r+=i);return r}var Xn=180/Math.PI,un={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function Vr(e,n,r,i,o,a){var s,u,f;return(s=Math.sqrt(e*e+n*n))&&(e/=s,n/=s),(f=e*r+n*i)&&(r-=e*f,i-=n*f),(u=Math.sqrt(r*r+i*i))&&(r/=u,i/=u,f/=u),e*i180?c+=360:c-l>180&&(l+=360),d.push({i:h.push(o(h)+"rotate(",null,i)-2,x:Lt(l,c)})):c&&h.push(o(h)+"rotate("+c+i)}function u(l,c,h,d){l!==c?d.push({i:h.push(o(h)+"skewX(",null,i)-2,x:Lt(l,c)}):c&&h.push(o(h)+"skewX("+c+i)}function f(l,c,h,d,p,y){if(l!==h||c!==d){var v=p.push(o(p)+"scale(",null,",",null,")");y.push({i:v-4,x:Lt(l,h)},{i:v-2,x:Lt(c,d)})}else(h!==1||d!==1)&&p.push(o(p)+"scale("+h+","+d+")")}return function(l,c){var h=[],d=[];return l=e(l),c=e(c),a(l.translateX,l.translateY,c.translateX,c.translateY,h,d),s(l.rotate,c.rotate,h,d),u(l.skewX,c.skewX,h,d),f(l.scaleX,l.scaleY,c.scaleX,c.scaleY,h,d),l=c=null,function(p){for(var y=-1,v=d.length,_;++ye.length)&&(n=e.length);for(var r=0,i=new Array(n);r180?c+=360:c-l>180&&(l+=360),d.push({i:h.push(o(h)+"rotate(",null,i)-2,x:Lt(l,c)})):c&&h.push(o(h)+"rotate("+c+i)}function u(l,c,h,d){l!==c?d.push({i:h.push(o(h)+"skewX(",null,i)-2,x:Lt(l,c)}):c&&h.push(o(h)+"skewX("+c+i)}function f(l,c,h,d,p,y){if(l!==h||c!==d){var v=p.push(o(p)+"scale(",null,",",null,")");y.push({i:v-4,x:Lt(l,h)},{i:v-2,x:Lt(c,d)})}else(h!==1||d!==1)&&p.push(o(p)+"scale("+h+","+d+")")}return function(l,c){var h=[],d=[];return l=e(l),c=e(c),a(l.translateX,l.translateY,c.translateX,c.translateY,h,d),s(l.rotate,c.rotate,h,d),u(l.skewX,c.skewX,h,d),f(l.scaleX,l.scaleY,c.scaleX,c.scaleY,h,d),l=c=null,function(p){for(var y=-1,v=d.length,_;++ye.length)&&(n=e.length);for(var r=0,i=new Array(n);ra,methodNames:i=[],initPropNames:o=[]}={}){return V.forwardRef((a,s)=>{const u=V.useRef(),f=V.useMemo(()=>{const h=Object.fromEntries(o.filter(d=>a.hasOwnProperty(d)).map(d=>[d,a[d]]));return e(h)},[]);Kn(()=>{f(r(u.current))},V.useLayoutEffect),Kn(()=>f._destructor instanceof Function?f._destructor:void 0);const l=V.useCallback((h,...d)=>f[h]instanceof Function?f[h](...d):void 0,[f]),c=V.useRef({});return Object.keys(xo(a,[...i,...o])).filter(h=>c.current[h]!==a[h]).forEach(h=>l(h,a[h])),c.current=a,V.useImperativeHandle(s,()=>Object.fromEntries(i.map(h=>[h,(...d)=>l(h,...d)])),[l]),Zi.createElement(n,{ref:u})})}function Kn(e,n=V.useEffect){const r=V.useRef(),i=V.useRef(!1),o=V.useRef(!1),[a,s]=V.useState(0);i.current&&(o.current=!0),n(()=>(i.current||(r.current=e(),i.current=!0),s(u=>u+1),()=>{o.current&&(r.current&&r.current(),r.current=void 0,i.current=!1,o.current=!1)}),[])}var fn="http://www.w3.org/1999/xhtml";const Qn={svg:"http://www.w3.org/2000/svg",xhtml:fn,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function qe(e){var n=e+="",r=n.indexOf(":");return r>=0&&(n=e.slice(0,r))!=="xmlns"&&(e=e.slice(r+1)),Qn.hasOwnProperty(n)?{space:Qn[n],local:e}:e}function ko(e){return function(){var n=this.ownerDocument,r=this.namespaceURI;return r===fn&&n.documentElement.namespaceURI===fn?n.createElement(e):n.createElementNS(r,e)}}function Co(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Xr(e){var n=qe(e);return(n.local?Co:ko)(n)}function Ao(){}function An(e){return e==null?Ao:function(){return this.querySelector(e)}}function So(e){typeof e!="function"&&(e=An(e));for(var n=this._groups,r=n.length,i=new Array(r),o=0;o=T&&(T=w+1);!(b=_[T])&&++T=0;)(s=i[o])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}function Ko(e){e||(e=Qo);function n(h,d){return h&&d?e(h.__data__,d.__data__):!h-!d}for(var r=this._groups,i=r.length,o=new Array(i),a=0;an?1:e>=n?0:NaN}function Jo(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function ta(){return Array.from(this)}function ea(){for(var e=this._groups,n=0,r=e.length;n1?this.each((n==null?ha:typeof n=="function"?pa:da)(e,n,r??"")):Bt(this.node(),e)}function Bt(e,n){return e.style.getPropertyValue(n)||Jr(e).getComputedStyle(e,null).getPropertyValue(n)}function ya(e){return function(){delete this[e]}}function _a(e,n){return function(){this[e]=n}}function va(e,n){return function(){var r=n.apply(this,arguments);r==null?delete this[e]:this[e]=r}}function ma(e,n){return arguments.length>1?this.each((n==null?ya:typeof n=="function"?va:_a)(e,n)):this.node()[e]}function ti(e){return e.trim().split(/^|\s+/)}function Sn(e){return e.classList||new ei(e)}function ei(e){this._node=e,this._names=ti(e.getAttribute("class")||"")}ei.prototype={add:function(e){var n=this._names.indexOf(e);n<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var n=this._names.indexOf(e);n>=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function ni(e,n){for(var r=Sn(e),i=-1,o=n.length;++i=0&&(r=n.slice(i+1),n=n.slice(0,i)),{type:n,name:r}})}function Ba(e){return function(){var n=this.__on;if(n){for(var r=0,i=-1,o=n.length,a;r{}};function ve(){for(var e=0,n=arguments.length,r={},i;e=0&&(i=r.slice(o+1),r=r.slice(0,o)),r&&!n.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:i}})}Ae.prototype=ve.prototype={constructor:Ae,on:function(e,n){var r=this._,i=rs(e+"",r),o,a=-1,s=i.length;if(arguments.length<2){for(;++a0)for(var r=new Array(o),i=0,o,a;i()=>e;function cn(e,{sourceEvent:n,subject:r,target:i,identifier:o,active:a,x:s,y:u,dx:f,dy:l,dispatch:c}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},subject:{value:r,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:a,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:u,enumerable:!0,configurable:!0},dx:{value:f,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:c}})}cn.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function as(e){return!e.ctrlKey&&!e.button}function ss(){return this.parentNode}function us(e,n){return n??{x:e.x,y:e.y}}function ls(){return navigator.maxTouchPoints||"ontouchstart"in this}function fs(){var e=as,n=ss,r=us,i=ls,o={},a=ve("start","drag","end"),s=0,u,f,l,c,h=0;function d(x){x.on("mousedown.drag",p).filter(i).on("touchstart.drag",_).on("touchmove.drag",g,os).on("touchend.drag touchcancel.drag",w).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(x,b){if(!(c||!e.call(this,x,b))){var C=T(this,n.call(this,x,b),x,b,"mouse");C&&(pt(x.view).on("mousemove.drag",y,pe).on("mouseup.drag",v,pe),ai(x.view),Ze(x),l=!1,u=x.clientX,f=x.clientY,C("start",x))}}function y(x){if(Wt(x),!l){var b=x.clientX-u,C=x.clientY-f;l=b*b+C*C>h}o.mouse("drag",x)}function v(x){pt(x.view).on("mousemove.drag mouseup.drag",null),si(x.view,l),Wt(x),o.mouse("end",x)}function _(x,b){if(e.call(this,x,b)){var C=x.changedTouches,S=n.call(this,x,b),M=C.length,N,P;for(N=0;N=0&&e._call.call(void 0,n),e=e._next;--Xt}function tr(){Ht=(Re=ge.now())+Ge,Xt=ae=0;try{hs()}finally{Xt=0,ps(),Ht=0}}function ds(){var e=ge.now(),n=e-Re;n>ui&&(Ge-=n,Re=e)}function ps(){for(var e,n=ze,r,i=1/0;n;)n._call?(i>n._time&&(i=n._time),e=n,n=n._next):(r=n._next,n._next=null,n=e?e._next=r:ze=r);se=e,hn(i)}function hn(e){if(!Xt){ae&&(ae=clearTimeout(ae));var n=e-Ht;n>24?(e<1/0&&(ae=setTimeout(tr,e-ge.now()-Ge)),Qt&&(Qt=clearInterval(Qt))):(Qt||(Re=ge.now(),Qt=setInterval(ds,ui)),Xt=1,li(tr))}}function er(e,n,r){var i=new Ne;return n=n==null?0:+n,i.restart(o=>{i.stop(),e(o+n)},n,r),i}var gs=ve("start","end","cancel","interrupt"),ys=[],fi=0,nr=1,dn=2,Se=3,rr=4,pn=5,Te=6;function Ve(e,n,r,i,o,a){var s=e.__transition;if(!s)e.__transition={};else if(r in s)return;_s(e,r,{name:n,index:i,group:o,on:gs,tween:ys,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:fi})}function Pn(e,n){var r=vt(e,n);if(r.state>fi)throw new Error("too late; already scheduled");return r}function Ct(e,n){var r=vt(e,n);if(r.state>Se)throw new Error("too late; already running");return r}function vt(e,n){var r=e.__transition;if(!r||!(r=r[n]))throw new Error("transition not found");return r}function _s(e,n,r){var i=e.__transition,o;i[n]=r,r.timer=Mn(a,0,r.time);function a(l){r.state=nr,r.timer.restart(s,r.delay,r.time),r.delay<=l&&s(l-r.delay)}function s(l){var c,h,d,p;if(r.state!==nr)return f();for(c in i)if(p=i[c],p.name===r.name){if(p.state===Se)return er(s);p.state===rr?(p.state=Te,p.timer.stop(),p.on.call("interrupt",e,e.__data__,p.index,p.group),delete i[c]):+cdn&&i.state=0&&(n=n.slice(0,r)),!n||n==="start"})}function Bs(e,n,r){var i,o,a=Ws(n)?Pn:Ct;return function(){var s=a(this,e),u=s.on;u!==i&&(o=(i=u).copy()).on(n,r),s.on=o}}function Xs(e,n){var r=this._id;return arguments.length<2?vt(this.node(),r).on.on(e):this.each(Bs(r,e,n))}function Ys(e){return function(){var n=this.parentNode;for(var r in this.__transition)if(+r!==e)return;n&&n.removeChild(this)}}function Zs(){return this.on("end.remove",Ys(this._id))}function Ks(e){var n=this._name,r=this._id;typeof e!="function"&&(e=An(e));for(var i=this._groups,o=i.length,a=new Array(o),s=0;s()=>e;function wu(e,{sourceEvent:n,target:r,transform:i,dispatch:o}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:o}})}function Et(e,n,r){this.k=e,this.x=n,this.y=r}Et.prototype={constructor:Et,scale:function(e){return e===1?this:new Et(this.k*e,this.x,this.y)},translate:function(e,n){return e===0&n===0?this:new Et(this.k,this.x+this.k*e,this.y+this.k*n)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var En=new Et(1,0,0);mt.prototype=Et.prototype;function mt(e){for(;!e.__zoom;)if(!(e=e.parentNode))return En;return e.__zoom}function Ke(e){e.stopImmediatePropagation()}function Jt(e){e.preventDefault(),e.stopImmediatePropagation()}function ku(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function Cu(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function ir(){return this.__zoom||En}function Au(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function Su(){return navigator.maxTouchPoints||"ontouchstart"in this}function Tu(e,n,r){var i=e.invertX(n[0][0])-r[0][0],o=e.invertX(n[1][0])-r[1][0],a=e.invertY(n[0][1])-r[0][1],s=e.invertY(n[1][1])-r[1][1];return e.translate(o>i?(i+o)/2:Math.min(0,i)||Math.max(0,o),s>a?(a+s)/2:Math.min(0,a)||Math.max(0,s))}function Mu(){var e=ku,n=Cu,r=Tu,i=Au,o=Su,a=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],u=250,f=lo,l=ve("start","zoom","end"),c,h,d,p=500,y=150,v=0,_=10;function g(A){A.property("__zoom",ir).on("wheel.zoom",M,{passive:!1}).on("mousedown.zoom",N).on("dblclick.zoom",P).filter(o).on("touchstart.zoom",R).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",L).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}g.transform=function(A,I,E,k){var O=A.selection?A.selection():A;O.property("__zoom",ir),A!==O?b(A,I,E,k):O.interrupt().each(function(){C(this,arguments).event(k).start().zoom(null,typeof I=="function"?I.apply(this,arguments):I).end()})},g.scaleBy=function(A,I,E,k){g.scaleTo(A,function(){var O=this.__zoom.k,j=typeof I=="function"?I.apply(this,arguments):I;return O*j},E,k)},g.scaleTo=function(A,I,E,k){g.transform(A,function(){var O=n.apply(this,arguments),j=this.__zoom,$=E==null?x(O):typeof E=="function"?E.apply(this,arguments):E,U=j.invert($),F=typeof I=="function"?I.apply(this,arguments):I;return r(T(w(j,F),$,U),O,s)},E,k)},g.translateBy=function(A,I,E,k){g.transform(A,function(){return r(this.__zoom.translate(typeof I=="function"?I.apply(this,arguments):I,typeof E=="function"?E.apply(this,arguments):E),n.apply(this,arguments),s)},null,k)},g.translateTo=function(A,I,E,k,O){g.transform(A,function(){var j=n.apply(this,arguments),$=this.__zoom,U=k==null?x(j):typeof k=="function"?k.apply(this,arguments):k;return r(En.translate(U[0],U[1]).scale($.k).translate(typeof I=="function"?-I.apply(this,arguments):-I,typeof E=="function"?-E.apply(this,arguments):-E),j,s)},k,O)};function w(A,I){return I=Math.max(a[0],Math.min(a[1],I)),I===A.k?A:new Et(I,A.x,A.y)}function T(A,I,E){var k=I[0]-E[0]*A.k,O=I[1]-E[1]*A.k;return k===A.x&&O===A.y?A:new Et(A.k,k,O)}function x(A){return[(+A[0][0]+ +A[1][0])/2,(+A[0][1]+ +A[1][1])/2]}function b(A,I,E,k){A.on("start.zoom",function(){C(this,arguments).event(k).start()}).on("interrupt.zoom end.zoom",function(){C(this,arguments).event(k).end()}).tween("zoom",function(){var O=this,j=arguments,$=C(O,j).event(k),U=n.apply(O,j),F=E==null?x(U):typeof E=="function"?E.apply(O,j):E,q=Math.max(U[1][0]-U[0][0],U[1][1]-U[0][1]),G=O.__zoom,B=typeof I=="function"?I.apply(O,j):I,J=f(G.invert(F).concat(q/G.k),B.invert(F).concat(q/B.k));return function(Y){if(Y===1)Y=B;else{var at=J(Y),tt=q/at[2];Y=new Et(tt,F[0]-at[0]*tt,F[1]-at[1]*tt)}$.zoom(null,Y)}})}function C(A,I,E){return!E&&A.__zooming||new S(A,I)}function S(A,I){this.that=A,this.args=I,this.active=0,this.sourceEvent=null,this.extent=n.apply(A,I),this.taps=0}S.prototype={event:function(A){return A&&(this.sourceEvent=A),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(A,I){return this.mouse&&A!=="mouse"&&(this.mouse[1]=I.invert(this.mouse[0])),this.touch0&&A!=="touch"&&(this.touch0[1]=I.invert(this.touch0[0])),this.touch1&&A!=="touch"&&(this.touch1[1]=I.invert(this.touch1[0])),this.that.__zoom=I,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(A){var I=pt(this.that).datum();l.call(A,this.that,new wu(A,{sourceEvent:this.sourceEvent,target:g,transform:this.that.__zoom,dispatch:l}),I)}};function M(A,...I){if(!e.apply(this,arguments))return;var E=C(this,I).event(A),k=this.__zoom,O=Math.max(a[0],Math.min(a[1],k.k*Math.pow(2,i.apply(this,arguments)))),j=bt(A);if(E.wheel)(E.mouse[0][0]!==j[0]||E.mouse[0][1]!==j[1])&&(E.mouse[1]=k.invert(E.mouse[0]=j)),clearTimeout(E.wheel);else{if(k.k===O)return;E.mouse=[j,k.invert(j)],Me(this),E.start()}Jt(A),E.wheel=setTimeout($,y),E.zoom("mouse",r(T(w(k,O),E.mouse[0],E.mouse[1]),E.extent,s));function $(){E.wheel=null,E.end()}}function N(A,...I){if(d||!e.apply(this,arguments))return;var E=A.currentTarget,k=C(this,I,!0).event(A),O=pt(A.view).on("mousemove.zoom",F,!0).on("mouseup.zoom",q,!0),j=bt(A,E),$=A.clientX,U=A.clientY;ai(A.view),Ke(A),k.mouse=[j,this.__zoom.invert(j)],Me(this),k.start();function F(G){if(Jt(G),!k.moved){var B=G.clientX-$,J=G.clientY-U;k.moved=B*B+J*J>v}k.event(G).zoom("mouse",r(T(k.that.__zoom,k.mouse[0]=bt(G,E),k.mouse[1]),k.extent,s))}function q(G){O.on("mousemove.zoom mouseup.zoom",null),si(G.view,k.moved),Jt(G),k.event(G).end()}}function P(A,...I){if(e.apply(this,arguments)){var E=this.__zoom,k=bt(A.changedTouches?A.changedTouches[0]:A,this),O=E.invert(k),j=E.k*(A.shiftKey?.5:2),$=r(T(w(E,j),k,O),n.apply(this,I),s);Jt(A),u>0?pt(this).transition().duration(u).call(b,$,k,A):pt(this).call(g.transform,$,k,A)}}function R(A,...I){if(e.apply(this,arguments)){var E=A.touches,k=E.length,O=C(this,I,A.changedTouches.length===k).event(A),j,$,U,F;for(Ke(A),$=0;$=n||S<0||h&&M>=a}function g(){var C=Qe();if(_(C))return w(C);u=setTimeout(g,v(C))}function w(C){return u=void 0,d&&i?p(C):(i=o=void 0,s)}function T(){u!==void 0&&clearTimeout(u),l=0,i=f=o=u=void 0}function x(){return u===void 0?s:w(Qe())}function b(){var C=Qe(),S=_(C);if(i=arguments,o=this,f=C,S){if(u===void 0)return y(f);if(h)return clearTimeout(u),u=setTimeout(g,n),p(f)}return u===void 0&&(u=setTimeout(g,n)),s}return b.cancel=T,b.flush=x,b}var tl="Expected a function";function el(e,n,r){var i=!0,o=!0;if(typeof e!="function")throw new TypeError(tl);return De(r)&&(i="leading"in r?!!r.leading:i,o="trailing"in r?!!r.trailing:o),yi(e,n,{leading:i,maxWait:n,trailing:o})}var Ut=Object.freeze({Linear:Object.freeze({None:function(e){return e},In:function(e){return e},Out:function(e){return e},InOut:function(e){return e}}),Quadratic:Object.freeze({In:function(e){return e*e},Out:function(e){return e*(2-e)},InOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)}}),Cubic:Object.freeze({In:function(e){return e*e*e},Out:function(e){return--e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)}}),Quartic:Object.freeze({In:function(e){return e*e*e*e},Out:function(e){return 1- --e*e*e*e},InOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)}}),Quintic:Object.freeze({In:function(e){return e*e*e*e*e},Out:function(e){return--e*e*e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)}}),Sinusoidal:Object.freeze({In:function(e){return 1-Math.sin((1-e)*Math.PI/2)},Out:function(e){return Math.sin(e*Math.PI/2)},InOut:function(e){return .5*(1-Math.sin(Math.PI*(.5-e)))}}),Exponential:Object.freeze({In:function(e){return e===0?0:Math.pow(1024,e-1)},Out:function(e){return e===1?1:1-Math.pow(2,-10*e)},InOut:function(e){return e===0?0:e===1?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)}}),Circular:Object.freeze({In:function(e){return 1-Math.sqrt(1-e*e)},Out:function(e){return Math.sqrt(1- --e*e)},InOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)}}),Elastic:Object.freeze({In:function(e){return e===0?0:e===1?1:-Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI)},Out:function(e){return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1},InOut:function(e){return e===0?0:e===1?1:(e*=2,e<1?-.5*Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI):.5*Math.pow(2,-10*(e-1))*Math.sin((e-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(e){var n=1.70158;return e===1?1:e*e*((n+1)*e-n)},Out:function(e){var n=1.70158;return e===0?0:--e*e*((n+1)*e+n)+1},InOut:function(e){var n=2.5949095;return(e*=2)<1?.5*(e*e*((n+1)*e-n)):.5*((e-=2)*e*((n+1)*e+n)+2)}}),Bounce:Object.freeze({In:function(e){return 1-Ut.Bounce.Out(1-e)},Out:function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},InOut:function(e){return e<.5?Ut.Bounce.In(e*2)*.5:Ut.Bounce.Out(e*2-1)*.5+.5}}),generatePow:function(e){return e===void 0&&(e=4),e=e1e4?1e4:e,{In:function(n){return Math.pow(n,e)},Out:function(n){return 1-Math.pow(1-n,e)},InOut:function(n){return n<.5?Math.pow(n*2,e)/2:(1-Math.pow(2-n*2,e))/2+.5}}}}),ue=function(){return performance.now()},_i=(function(){function e(){this._tweens={},this._tweensAddedDuringUpdate={}}return e.prototype.getAll=function(){var n=this;return Object.keys(this._tweens).map(function(r){return n._tweens[r]})},e.prototype.removeAll=function(){this._tweens={}},e.prototype.add=function(n){this._tweens[n.getId()]=n,this._tweensAddedDuringUpdate[n.getId()]=n},e.prototype.remove=function(n){delete this._tweens[n.getId()],delete this._tweensAddedDuringUpdate[n.getId()]},e.prototype.update=function(n,r){n===void 0&&(n=ue()),r===void 0&&(r=!1);var i=Object.keys(this._tweens);if(i.length===0)return!1;for(;i.length>0;){this._tweensAddedDuringUpdate={};for(var o=0;o1?a(e[r],e[r-1],r-i):a(e[o],e[o+1>r?r:o+1],i-o)},Utils:{Linear:function(e,n,r){return(n-e)*r+e}}},vi=(function(){function e(){}return e.nextId=function(){return e._nextId++},e._nextId=0,e})(),yn=new _i,ur=(function(){function e(n,r){r===void 0&&(r=yn),this._object=n,this._group=r,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Ut.Linear.None,this._interpolationFunction=gn.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=vi.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1}return e.prototype.getId=function(){return this._id},e.prototype.isPlaying=function(){return this._isPlaying},e.prototype.isPaused=function(){return this._isPaused},e.prototype.getDuration=function(){return this._duration},e.prototype.to=function(n,r){if(r===void 0&&(r=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=n,this._propertiesAreSetUp=!1,this._duration=r<0?0:r,this},e.prototype.duration=function(n){return n===void 0&&(n=1e3),this._duration=n<0?0:n,this},e.prototype.dynamic=function(n){return n===void 0&&(n=!1),this._isDynamic=n,this},e.prototype.start=function(n,r){if(n===void 0&&(n=ue()),r===void 0&&(r=!1),this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var i in this._valuesStartRepeat)this._swapEndStartRepeatValues(i),this._valuesStart[i]=this._valuesStartRepeat[i]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=n,this._startTime+=this._delayTime,!this._propertiesAreSetUp||r){if(this._propertiesAreSetUp=!0,!this._isDynamic){var o={};for(var a in this._valuesEnd)o[a]=this._valuesEnd[a];this._valuesEnd=o}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,r)}return this},e.prototype.startFromCurrentValues=function(n){return this.start(n,!0)},e.prototype._setupProperties=function(n,r,i,o,a){for(var s in i){var u=n[s],f=Array.isArray(u),l=f?"array":typeof u,c=!f&&Array.isArray(i[s]);if(!(l==="undefined"||l==="function")){if(c){var h=i[s];if(h.length===0)continue;for(var d=[u],p=0,y=h.length;p"u"||a)&&(r[s]=u),f||(r[s]*=1),c?o[s]=i[s].slice().reverse():o[s]=r[s]||0}}},e.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},e.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},e.prototype.pause=function(n){return n===void 0&&(n=ue()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=n,this._group&&this._group.remove(this),this)},e.prototype.resume=function(n){return n===void 0&&(n=ue()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=n-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this)},e.prototype.stopChainedTweens=function(){for(var n=0,r=this._chainedTweens.length;ns)return!1;r&&this.start(n,!0)}if(this._goToEnd=!1,nl)return 1;var _=Math.trunc(u/f),g=u-_*f,w=Math.min(g/i._duration,1);return w===0&&u===i._duration?1:w},h=c(),d=this._easingFunction(h);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,d),this._onUpdateCallback&&this._onUpdateCallback(this._object,h),this._duration===0||u>=this._duration)if(this._repeat>0){var p=Math.min(Math.trunc((u-this._duration)/f)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=p);for(a in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[a]=="string"&&(this._valuesStartRepeat[a]=this._valuesStartRepeat[a]+parseFloat(this._valuesEnd[a])),this._yoyo&&this._swapEndStartRepeatValues(a),this._valuesStart[a]=this._valuesStartRepeat[a];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=f*p,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var y=0,v=this._chainedTweens.length;ye.length)&&(n=e.length);for(var r=0,i=Array(n);r=0,a=!r&&o&&(n==="hex"||n==="hex6"||n==="hex3"||n==="hex4"||n==="hex8"||n==="name");return a?n==="name"&&this._a===0?this.toName():this.toRgbString():(n==="rgb"&&(i=this.toRgbString()),n==="prgb"&&(i=this.toPercentageRgbString()),(n==="hex"||n==="hex6")&&(i=this.toHexString()),n==="hex3"&&(i=this.toHexString(!0)),n==="hex4"&&(i=this.toHex8String(!0)),n==="hex8"&&(i=this.toHex8String()),n==="name"&&(i=this.toName()),n==="hsl"&&(i=this.toHslString()),n==="hsv"&&(i=this.toHsvString()),i||this.toHexString())},clone:function(){return H(this.toString())},_applyModification:function(n,r){var i=n.apply(null,[this].concat([].slice.call(r)));return this._r=i._r,this._g=i._g,this._b=i._b,this.setAlpha(i._a),this},lighten:function(){return this._applyModification(bl,arguments)},brighten:function(){return this._applyModification(xl,arguments)},darken:function(){return this._applyModification(wl,arguments)},desaturate:function(){return this._applyModification(_l,arguments)},saturate:function(){return this._applyModification(vl,arguments)},greyscale:function(){return this._applyModification(ml,arguments)},spin:function(){return this._applyModification(kl,arguments)},_applyCombination:function(n,r){return n.apply(null,[this].concat([].slice.call(r)))},analogous:function(){return this._applyCombination(Sl,arguments)},complement:function(){return this._applyCombination(Cl,arguments)},monochromatic:function(){return this._applyCombination(Tl,arguments)},splitcomplement:function(){return this._applyCombination(Al,arguments)},triad:function(){return this._applyCombination(pr,[3])},tetrad:function(){return this._applyCombination(pr,[4])}};H.fromRatio=function(e,n){if(je(e)=="object"){var r={};for(var i in e)e.hasOwnProperty(i)&&(i==="a"?r[i]=e[i]:r[i]=le(e[i]));e=r}return H(e,n)};function hl(e){var n={r:0,g:0,b:0},r=1,i=null,o=null,a=null,s=!1,u=!1;return typeof e=="string"&&(e=zl(e)),je(e)=="object"&&(Tt(e.r)&&Tt(e.g)&&Tt(e.b)?(n=dl(e.r,e.g,e.b),s=!0,u=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Tt(e.h)&&Tt(e.s)&&Tt(e.v)?(i=le(e.s),o=le(e.v),n=gl(e.h,i,o),s=!0,u="hsv"):Tt(e.h)&&Tt(e.s)&&Tt(e.l)&&(i=le(e.s),a=le(e.l),n=pl(e.h,i,a),s=!0,u="hsl"),e.hasOwnProperty("a")&&(r=e.a)),r=mi(r),{ok:s,format:e.format||u,r:Math.min(255,Math.max(n.r,0)),g:Math.min(255,Math.max(n.g,0)),b:Math.min(255,Math.max(n.b,0)),a:r}}function dl(e,n,r){return{r:K(e,255)*255,g:K(n,255)*255,b:K(r,255)*255}}function fr(e,n,r){e=K(e,255),n=K(n,255),r=K(r,255);var i=Math.max(e,n,r),o=Math.min(e,n,r),a,s,u=(i+o)/2;if(i==o)a=s=0;else{var f=i-o;switch(s=u>.5?f/(2-i-o):f/(i+o),i){case e:a=(n-r)/f+(n1&&(h-=1),h<1/6?l+(c-l)*6*h:h<1/2?c:h<2/3?l+(c-l)*(2/3-h)*6:l}if(n===0)i=o=a=r;else{var u=r<.5?r*(1+n):r+n-r*n,f=2*r-u;i=s(f,u,e+1/3),o=s(f,u,e),a=s(f,u,e-1/3)}return{r:i*255,g:o*255,b:a*255}}function cr(e,n,r){e=K(e,255),n=K(n,255),r=K(r,255);var i=Math.max(e,n,r),o=Math.min(e,n,r),a,s,u=i,f=i-o;if(s=i===0?0:f/i,i==o)a=0;else{switch(i){case e:a=(n-r)/f+(n>1)+720)%360;--n;)i.h=(i.h+o)%360,a.push(H(i));return a}function Tl(e,n){n=n||6;for(var r=H(e).toHsv(),i=r.h,o=r.s,a=r.v,s=[],u=1/n;n--;)s.push(H({h:i,s:o,v:a})),a=(a+u)%1;return s}H.mix=function(e,n,r){r=r===0?0:r||50;var i=H(e).toRgb(),o=H(n).toRgb(),a=r/100,s={r:(o.r-i.r)*a+i.r,g:(o.g-i.g)*a+i.g,b:(o.b-i.b)*a+i.b,a:(o.a-i.a)*a+i.a};return H(s)};H.readability=function(e,n){var r=H(e),i=H(n);return(Math.max(r.getLuminance(),i.getLuminance())+.05)/(Math.min(r.getLuminance(),i.getLuminance())+.05)};H.isReadable=function(e,n,r){var i=H.readability(e,n),o,a;switch(a=!1,o=Rl(r),o.level+o.size){case"AAsmall":case"AAAlarge":a=i>=4.5;break;case"AAlarge":a=i>=3;break;case"AAAsmall":a=i>=7;break}return a};H.mostReadable=function(e,n,r){var i=null,o=0,a,s,u,f;r=r||{},s=r.includeFallbackColors,u=r.level,f=r.size;for(var l=0;lo&&(o=a,i=H(n[l]));return H.isReadable(e,i,{level:u,size:f})||!s?i:(r.includeFallbackColors=!1,H.mostReadable(e,["#fff","#000"],r))};var _n=H.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Ml=H.hexNames=Pl(_n);function Pl(e){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[e[r]]=r);return n}function mi(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function K(e,n){Ol(e)&&(e="100%");var r=El(e);return e=Math.min(n,Math.max(0,parseFloat(e))),r&&(e=parseInt(e*n,10)/100),Math.abs(e-n)<1e-6?1:e%n/parseFloat(n)}function We(e){return Math.min(1,Math.max(0,e))}function ft(e){return parseInt(e,16)}function Ol(e){return typeof e=="string"&&e.indexOf(".")!=-1&&parseFloat(e)===1}function El(e){return typeof e=="string"&&e.indexOf("%")!=-1}function _t(e){return e.length==1?"0"+e:""+e}function le(e){return e<=1&&(e=e*100+"%"),e}function bi(e){return Math.round(parseFloat(e)*255).toString(16)}function gr(e){return ft(e)/255}var yt=(function(){var e="[-\\+]?\\d+%?",n="[-\\+]?\\d*\\.\\d+%?",r="(?:"+n+")|(?:"+e+")",i="[\\s|\\(]+("+r+")[,|\\s]+("+r+")[,|\\s]+("+r+")\\s*\\)?",o="[\\s|\\(]+("+r+")[,|\\s]+("+r+")[,|\\s]+("+r+")[,|\\s]+("+r+")\\s*\\)?";return{CSS_UNIT:new RegExp(r),rgb:new RegExp("rgb"+i),rgba:new RegExp("rgba"+o),hsl:new RegExp("hsl"+i),hsla:new RegExp("hsla"+o),hsv:new RegExp("hsv"+i),hsva:new RegExp("hsva"+o),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}})();function Tt(e){return!!yt.CSS_UNIT.exec(e)}function zl(e){e=e.replace(fl,"").replace(cl,"").toLowerCase();var n=!1;if(_n[e])e=_n[e],n=!0;else if(e=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var r;return(r=yt.rgb.exec(e))?{r:r[1],g:r[2],b:r[3]}:(r=yt.rgba.exec(e))?{r:r[1],g:r[2],b:r[3],a:r[4]}:(r=yt.hsl.exec(e))?{h:r[1],s:r[2],l:r[3]}:(r=yt.hsla.exec(e))?{h:r[1],s:r[2],l:r[3],a:r[4]}:(r=yt.hsv.exec(e))?{h:r[1],s:r[2],v:r[3]}:(r=yt.hsva.exec(e))?{h:r[1],s:r[2],v:r[3],a:r[4]}:(r=yt.hex8.exec(e))?{r:ft(r[1]),g:ft(r[2]),b:ft(r[3]),a:gr(r[4]),format:n?"name":"hex8"}:(r=yt.hex6.exec(e))?{r:ft(r[1]),g:ft(r[2]),b:ft(r[3]),format:n?"name":"hex"}:(r=yt.hex4.exec(e))?{r:ft(r[1]+""+r[1]),g:ft(r[2]+""+r[2]),b:ft(r[3]+""+r[3]),a:gr(r[4]+""+r[4]),format:n?"name":"hex8"}:(r=yt.hex3.exec(e))?{r:ft(r[1]+""+r[1]),g:ft(r[2]+""+r[2]),b:ft(r[3]+""+r[3]),format:n?"name":"hex"}:!1}function Rl(e){var n,r;return e=e||{level:"AA",size:"small"},n=(e.level||"AA").toUpperCase(),r=(e.size||"small").toLowerCase(),n!=="AA"&&n!=="AAA"&&(n="AA"),r!=="small"&&r!=="large"&&(r="small"),{level:n,size:r}}function vn(e,n){(n==null||n>e.length)&&(n=e.length);for(var r=0,i=Array(n);r{p.length&&(s.push(e.jsx("ul",{className:"mb-3 ml-4 list-disc space-y-1",children:p},g)),p=[])};return j.forEach((g,o)=>{const i=`l${o}`;if(d!==null){g.trimEnd()==="```"?(s.push(e.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px] leading-relaxed text-foreground/85",children:d.join(` -`)},i)),d=null):d.push(g);return}if(g.trimStart().startsWith("```")){u(i),d=[];return}const b=g.trimEnd();if(!b.trim()){u(i);return}const n=b.match(/^(#{1,4})\s+(.*)$/);if(n){u(i);const y=n[1].length,c=y===1?"text-base font-bold mt-1 mb-2":y===2?"text-sm font-bold mt-4 mb-1.5":"text-xs font-bold mt-3 mb-1 uppercase tracking-wide text-muted-foreground";s.push(e.jsx("p",{className:N(c,"font-space text-foreground"),children:G(n[2],i)},i));return}const f=b.match(/^\s*[-*•]\s+(.*)$/);if(f){p.push(e.jsx("li",{className:"text-xs leading-relaxed text-foreground/85",children:G(f[1],i)},i));return}const v=b.match(/^\s*\d+\.\s+(.*)$/);if(v){p.push(e.jsx("li",{className:"text-xs leading-relaxed text-foreground/85",children:G(v[1],i)},i));return}u(i),s.push(e.jsx("p",{className:"mb-2 text-xs leading-relaxed text-foreground/85",children:G(b,i)},i))}),u("end"),d!==null&&s.push(e.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px]",children:d.join(` -`)},"code-end")),e.jsx("div",{className:N("max-w-3xl",m),children:s})}function G(r,m){return r.split(/(\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`)/g).map((s,p)=>{const d=`${m}-${p}`;return/^\*\*[^*]+\*\*$/.test(s)?e.jsx("b",{className:"font-semibold text-foreground",children:s.slice(2,-2)},d):/^\*[^*]+\*$/.test(s)?e.jsx("i",{children:s.slice(1,-1)},d):/^`[^`]+`$/.test(s)?e.jsx("code",{className:"rounded bg-background/50 px-1 font-mono text-[11px] text-foreground/90",children:s.slice(1,-1)},d):e.jsx("span",{children:s},d)})}const Pe={triage:{label:"wird ausgearbeitet …",cls:"text-violet-300 border-violet-500/40 bg-violet-500/10",spin:!0},todo:{label:"wartet",cls:"text-muted-foreground border-border/60 bg-background/30"},scheduled:{label:"geplant",cls:"text-muted-foreground border-border/60 bg-background/30"},ready:{label:"gleich dran",cls:"text-sky-300/80 border-sky-500/30 bg-sky-500/5"},running:{label:"in Arbeit …",cls:"text-sky-300 border-sky-500/40 bg-sky-500/10",spin:!0},review:{label:"im Review",cls:"text-amber-300 border-amber-500/40 bg-amber-500/10"},blocked:{label:"hängt — braucht dich",cls:"text-red-300 border-red-500/40 bg-red-500/10"},done:{label:"fertig ✓",cls:"text-emerald-300 border-emerald-500/40 bg-emerald-500/10"}},Ee={box:{label:"BOX",icon:ie,cls:"border-border/60 bg-background/40 text-muted-foreground",title:"Box-Welt: die Werkstatt baut das selbst. Das Ergebnis kommt als Patch-Vorschlag zurück — nichts geht ohne deinen Klick live."},idee:{label:"IDEE",icon:Z,cls:"border-sky-500/40 bg-sky-500/10 text-sky-300",title:"Nur durchdacht: die Box hat die Produkt-Idee mit voller Denk-Kaskade zu einem Konzept ausgearbeitet. Kein Gerüst, kein Bau — du liest es und entscheidest, ob ein Projekt draus wird."},projekt:{label:"IDE",icon:W,cls:"border-violet-500/40 bg-violet-500/10 text-violet-300",title:"IDE-Welt: die Box bereitet nur vor (Konzept + Repo + Doku, kein Code). Gebaut wird von dir in Zed."}},Be={needs_input:"Die Box hat eine Frage:",capability:"Die Box kam hier nicht weiter:",transient:"Die Aufgabe hakt:"};function Ie(){var U,Y;const{data:r,isLoading:m}=ue(),j=xe(),{showAlert:s,showConfirm:p,dialogElement:d}=he(),[u,g]=l.useState(""),[o,i]=l.useState("box"),b=o==="idee",n=o==="simpel"||o==="gruendlich",f=b||n,[v,y]=l.useState("lxc"),[c,T]=l.useState(!1),[D,w]=l.useState({}),[B,le]=l.useState(null),[O,de]=l.useState(null),[M,q]=l.useState({}),I=(r==null?void 0:r.items)??[],L=()=>j.invalidateQueries({queryKey:je.ideen}),Q=B!==null&&(((U=r==null?void 0:r.items.find(t=>t.id===B))==null?void 0:U.status)==="triage"||((Y=r==null?void 0:r.items.find(t=>t.id===B))==null?void 0:Y.status)==="running"),R=me(B??"",Q);async function X(){const t=u.trim();if(!(t.length<3||c)){T(!0);try{const a=t.length>160?t.slice(0,157)+"…":t;await z("/api/ideen",{method:"POST",body:JSON.stringify({titel:a,notiz:t.length>160?t:"",welt:f?"ide":"box",tiefe:n?o:"",ziel:n?v:"",art:b?"idee":"projekt"})}),g(""),L()}catch(a){s("Das hat nicht geklappt",String((a==null?void 0:a.message)||a))}finally{T(!1)}}}async function ce(t){w(a=>({...a,[t]:!0}));try{await z("/api/ideen/archivieren",{method:"POST",body:JSON.stringify({id:t})}),L()}catch(a){s("Das hat nicht geklappt",String((a==null?void 0:a.message)||a))}finally{w(a=>({...a,[t]:!1}))}}async function F(t,a,x,S){w(k=>({...k,[t+a]:!0}));try{await z(x,{method:"POST",body:JSON.stringify(S)}),L()}catch(k){s("Das hat nicht geklappt",String((k==null?void 0:k.message)||k))}finally{w(k=>({...k,[t+a]:!1}))}}async function J(t){const a=(M[t]||"").trim();if(!(a.length<1||D["ans:"+t])){w(x=>({...x,["ans:"+t]:!0}));try{await z("/api/ideen/antwort",{method:"POST",body:JSON.stringify({id:t,antwort:a})}),q(x=>({...x,[t]:""})),L()}catch(x){s("Das hat nicht geklappt",String((x==null?void 0:x.message)||x))}finally{w(x=>({...x,["ans:"+t]:!1}))}}}const V=t=>{var te,re;const a=Pe[t.status]??{label:t.status,cls:"text-muted-foreground border-border/60 bg-background/30"},x=B===t.id,S=t.status==="triage"||t.status==="running"||t.status==="done",k=t.status==="blocked",h=!!D["ans:"+t.id],P=t.status==="running"&&(t.puls_alter??0)>600,ee=t.status==="todo"||t.status==="ready"||t.status==="scheduled";return e.jsxs("li",{className:N("flex flex-col gap-2 rounded-xl border bg-background/30 px-3 py-2",k?"border-red-500/30":P?"border-amber-500/40":"border-border/40"),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:N("flex shrink-0 items-center gap-1.5 rounded-lg border px-2 py-0.5 text-[10px] font-bold",a.cls),children:[a.spin&&e.jsx(K,{className:"h-3 w-3 animate-spin"}),a.label]}),P&&e.jsxs("span",{className:"flex shrink-0 items-center gap-1 rounded-lg border border-amber-500/40 bg-amber-500/10 px-2 py-0.5 text-[10px] font-bold text-amber-300",title:"Der Worker lebt, gibt aber kein Lebenszeichen mehr — vermutlich wartet er auf etwas, das nie kommt. „Neuer Versuch“ startet die Karte frisch.",children:[e.jsx(ge,{className:"h-3 w-3"})," ",Math.round((t.puls_alter??0)/60)," min ohne Regung"]}),(t.prio??0)!==0&&e.jsxs("span",{className:"shrink-0 rounded bg-background/50 px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground",title:"Priorität — höher kommt zuerst dran (bei gleicher Prio: Erstellzeit)",children:["P",t.prio]}),(()=>{const C=Ee[t.art||(t.welt==="ide"?"projekt":"box")];if(!C)return null;const H=C.icon;return e.jsxs("span",{className:N("flex shrink-0 items-center gap-1 rounded-lg border px-2 py-0.5 text-[10px] font-bold",C.cls),title:C.title,children:[e.jsx(H,{className:"h-3 w-3"})," ",C.label]})})(),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs text-foreground",title:t.titel,children:t.titel}),e.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] text-muted-foreground/70",children:[e.jsx(se,{className:"h-3 w-3"}),be(t.erstellt)]}),ee&&e.jsxs("span",{className:"flex shrink-0 items-center",children:[e.jsx("button",{disabled:!!D["pr:"+t.id],onClick:()=>F("pr:",t.id,"/api/ideen/prio",{id:t.id,richtung:"hoch"}),title:"Vorziehen (Prio +1)",className:"rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer disabled:opacity-50",children:e.jsx(De,{className:"h-3.5 w-3.5"})}),e.jsx("button",{disabled:!!D["pr:"+t.id],onClick:()=>F("pr:",t.id,"/api/ideen/prio",{id:t.id,richtung:"runter"}),title:"Zurückstellen (Prio −1)",className:"rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer disabled:opacity-50",children:e.jsx(ye,{className:"h-3.5 w-3.5"})})]}),(t.status==="running"||k)&&e.jsx("button",{disabled:!!D["rt:"+t.id],onClick:()=>p("Neuer Versuch?",t.status==="running"?`Der laufende Worker von '${t.titel.slice(0,60)}' wird beendet (samt gestarteter Test-Prozesse) und die Karte frisch gestartet. Bisheriger Zwischenstand im Workspace bleibt liegen.`:`Die Karte '${t.titel.slice(0,60)}' wird entsperrt und läuft weiter, sobald ein Platz frei ist.`,()=>F("rt:",t.id,"/api/ideen/retry",{id:t.id})),title:"Neuer Versuch — Karte frisch starten",className:N("shrink-0 rounded-md p-1 transition-colors cursor-pointer disabled:opacity-50",P?"text-amber-300 hover:text-amber-200":"text-muted-foreground/60 hover:text-foreground"),children:D["rt:"+t.id]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(ve,{className:"h-3.5 w-3.5"})}),(t.status==="running"||ee||t.status==="triage")&&e.jsx("button",{disabled:!!D["st:"+t.id],onClick:()=>p("Karte stoppen?",`'${t.titel.slice(0,60)}' wird angehalten${t.status==="running"?" und der laufende Worker beendet":""}. Sie bleibt als gestoppt im Board und kann jederzeit per „Neuer Versuch“ weiterlaufen.`,()=>F("st:",t.id,"/api/ideen/stopp",{id:t.id})),title:"Stoppen — Karte anhalten",className:"shrink-0 rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-red-300 cursor-pointer disabled:opacity-50",children:D["st:"+t.id]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(Ke,{className:"h-3.5 w-3.5"})}),(t.status==="done"||k)&&e.jsx("button",{disabled:!!D[t.id],onClick:()=>ce(t.id),title:k?"Aufgeben und aus der Liste räumen (wandert ins Kanban-Archiv)":"Aus der Liste räumen (wandert ins Kanban-Archiv)",className:"shrink-0 rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer disabled:opacity-50",children:D[t.id]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(fe,{className:"h-3.5 w-3.5"})}),t.welt==="ide"&&(t.status==="running"||t.status==="done")&&e.jsxs("button",{onClick:()=>de(O===t.id?null:t.id),title:"Konzept ansehen (das ausgearbeitete KONZEPT.md)",className:N("flex shrink-0 items-center gap-1 rounded-md px-1.5 py-1 text-[10px] font-bold transition-colors cursor-pointer",O===t.id?"text-violet-300":"text-violet-300/70 hover:text-violet-200"),children:[e.jsx(ae,{className:"h-3.5 w-3.5"})," Konzept"]}),S&&e.jsx("button",{onClick:()=>le(x?null:t.id),title:t.status==="done"?"Ergebnis anzeigen":"Worker-Log anzeigen",className:"shrink-0 rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer",children:x?e.jsx(_,{className:"h-3.5 w-3.5"}):e.jsx(A,{className:"h-3.5 w-3.5"})})]}),O===t.id&&e.jsx(Re,{id:t.id,istIdee:t.art==="idee"&&t.status==="done",onWeiter:L}),t.status==="running"&&t.notiz&&e.jsxs("p",{className:"-mt-1 ml-1 text-[11px] italic leading-relaxed text-sky-200/80",title:"Jüngste Zwischenmeldung des Workers (Heartbeat)",children:["„",t.notiz,"“"]}),(t.status==="todo"||t.status==="scheduled"||t.status==="ready")&&(((te=t.wartet_auf)==null?void 0:te.length)??0)>0&&e.jsxs("p",{className:"-mt-1 ml-1 text-[10px] text-muted-foreground/70",children:["→ wartet auf: ",t.wartet_auf.join(" · ")]}),k&&e.jsxs("div",{className:"space-y-2 border-t border-red-500/20 pt-2",children:[e.jsxs("p",{className:"flex items-start gap-1.5 text-[11px] leading-relaxed text-red-200/90",children:[e.jsx(ke,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-red-300"}),e.jsxs("span",{children:[e.jsx("b",{children:Be[t.frage_kind||""]??"Die Aufgabe hängt und wartet auf dich:"})," ",t.frage?e.jsx("span",{className:"text-foreground/90",children:t.frage}):e.jsx("span",{className:"text-muted-foreground italic",children:"kein genauer Grund hinterlegt — antworte einfach mit einer Entscheidung, dann läuft sie weiter."})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:M[t.id]||"",onChange:C=>q(H=>({...H,[t.id]:C.target.value})),onKeyDown:C=>{C.key==="Enter"&&J(t.id)},placeholder:"Deine Antwort — die Box macht damit weiter",maxLength:2e3,className:"h-8 min-w-0 flex-1 rounded-lg border border-border/60 bg-background/60 px-2.5 text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-red-400/50 focus:outline-none"}),e.jsxs("button",{onClick:()=>J(t.id),disabled:h||(M[t.id]||"").trim().length<1,className:"flex h-8 shrink-0 items-center gap-1.5 rounded-lg border border-emerald-500/40 bg-emerald-500/10 px-3 text-[10px] font-bold uppercase tracking-wide text-emerald-300 transition-all hover:bg-emerald-500/20 cursor-pointer disabled:opacity-50",children:[h?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(ne,{className:"h-3.5 w-3.5"})," Antworten & weiter"]})]})]}),x&&S&&t.status!=="done"&&e.jsx("div",{className:"ml-2 -mt-1",children:e.jsx("div",{className:"rounded-lg border border-border/50 bg-background/50 p-2",children:Q&&R.isLoading?e.jsx("p",{className:"text-[10px] text-muted-foreground animate-pulse",children:"Log wird geladen …"}):R.error?e.jsx("p",{className:"text-[10px] text-red-400",children:"Log nicht ladbar"}):(re=R.data)!=null&&re.available&&R.data.lines.length>0?e.jsx("pre",{className:"max-h-64 overflow-auto font-mono text-[10px] leading-relaxed text-foreground/80 whitespace-pre-wrap",children:R.data.lines.join(` -`)}):e.jsx("p",{className:"text-[10px] text-muted-foreground",children:"Kein Log verfügbar"})})}),x&&t.status==="done"&&e.jsx(We,{id:t.id})]},t.id)};return r&&!r.available?null:e.jsxs("section",{className:"space-y-3",children:[e.jsx(Ne,{icon:Z,children:(()=>{if(!r)return"Ideen-Queue";const t=x=>I.filter(S=>x.includes(S.status)).length,a=[t(["blocked"])>0?`${t(["blocked"])} braucht dich`:"",t(["running","triage","review"])>0?`${t(["running","triage","review"])} in Arbeit`:"",t(["todo","scheduled","ready"])>0?`${t(["todo","scheduled","ready"])} wartet`:"",t(["done"])>0?`${t(["done"])} fertig`:""].filter(Boolean);return`Ideen-Queue${a.length?" — "+a.join(" · "):""}`})()}),e.jsxs("div",{className:"mc-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:u,onChange:t=>g(t.target.value),onKeyDown:t=>{t.key==="Enter"&&X()},placeholder:"Neue Idee — einfach hinschreiben, die Box macht den Rest",className:"h-9 min-w-0 flex-1 rounded-lg border border-border/60 bg-background/50 px-3 text-sm text-foreground placeholder:text-muted-foreground/50 focus:border-primary/50 focus:outline-none"}),e.jsxs("button",{onClick:X,disabled:c||u.trim().length<3,className:N("flex h-9 shrink-0 items-center gap-1.5 rounded-lg border px-3 text-[11px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-50",o==="gruendlich"?"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20":o==="simpel"?"border-violet-500/40 bg-violet-500/10 text-violet-300 hover:bg-violet-500/20":b?"border-sky-500/40 bg-sky-500/10 text-sky-300 hover:bg-sky-500/20":"border-primary/40 bg-primary/10 text-primary hover:bg-primary/20"),children:[c?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):b?e.jsx(Z,{className:"h-3.5 w-3.5"}):n?e.jsx(W,{className:"h-3.5 w-3.5"}):e.jsx(ne,{className:"h-3.5 w-3.5"}),b?"Durchdenken":n?"Vorbereiten":"In die Queue"]})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Modus"}),e.jsxs("div",{className:"flex rounded-lg border border-border/60 p-0.5",children:[e.jsxs("button",{onClick:()=>i("box"),className:N("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="box"?"bg-primary/15 text-primary":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(ie,{className:"h-3 w-3"})," Box"]}),e.jsxs("button",{onClick:()=>i("idee"),title:"Produkt-Idee erst einmal durchdenken lassen: Was ist es, für wen, was gibt es schon, was spricht dagegen? Ergebnis ist ein Konzept — kein Projekt, kein Bau-Druck.",className:N("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="idee"?"bg-sky-500/15 text-sky-300":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(Z,{className:"h-3 w-3"})," Idee"]}),e.jsxs("button",{onClick:()=>i("simpel"),title:"IDE-Projekt, schnell vorbereitet: knappes Konzept, wenige Denk-Runden. Für kleine, klar umrissene Sachen.",className:N("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="simpel"?"bg-violet-500/15 text-violet-300":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(W,{className:"h-3 w-3"})," IDE: simpel"]}),e.jsxs("button",{onClick:()=>i("gruendlich"),title:"IDE-Projekt, gründlich durchdacht: volle Kaskade mit mehreren Rollen und Härtetests. Für große/ambitionierte Projekte.",className:N("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="gruendlich"?"bg-amber-500/15 text-amber-300":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(W,{className:"h-3 w-3"})," IDE: gründlich"]})]})]}),e.jsxs("p",{className:"text-[10px] leading-relaxed text-muted-foreground/60",children:[e.jsx("b",{className:"text-primary/80",children:"Box"}),", wenn die Box es selbst bauen soll (dein Heimlabor, MC2, Lucy — Ergebnis kommt als Patch-Vorschlag zurück). ·"," ",e.jsx("b",{className:"text-sky-300/80",children:"Idee"}),", wenn du noch nicht weißt, ob es das überhaupt wert ist — erst durchdenken, entscheiden kannst du danach. ·"," ",e.jsx("b",{className:"text-violet-300/80",children:"IDE"}),", wenn du es selbst in Zed bauen willst und dafür ein startklares Repo brauchst."]}),n&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Ziel"}),e.jsxs("div",{className:"flex rounded-lg border border-border/40 p-0.5",children:[e.jsx("button",{onClick:()=>y("lxc"),title:"Läuft als Dienst in einem eigenen Proxmox-LXC (systemd, kein Docker). Wird vom Backup-Server automatisch mitgesichert.",className:N("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",v==="lxc"?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:"LXC"}),e.jsx("button",{onClick:()=>y("docker"),title:"Natives Docker nach Standard-Praxis: Dockerfile + compose, portabel, über Gitea-/GitLab-Pipelines baubar. Für Projekte, die bewusst außerhalb der LXC-Welt leben.",className:N("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",v==="docker"?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:"Docker"})]}),e.jsx("span",{className:"text-[10px] text-muted-foreground/50",children:v==="lxc"?"Dienst im Proxmox-Container (deine Heimat)":"natives Docker, portabel & pipeline-tauglich"})]}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:b?e.jsxs(e.Fragment,{children:[e.jsx("b",{className:"text-sky-300/90",children:"Idee durchdenken:"})," Die Box arbeitet deine Produkt-Idee mit Produkt-Blick aus — was ist es genau, für wen, was gibt es dafür schon, was wäre der kleinste sinnvolle Wurf und was spricht dagegen. Volle Denk-Kaskade mit Kritiker, Ergebnis ist ",e.jsx("b",{children:"nur ein Konzept"})," (kein Gerüst, keine Roadmap, kein Bau-Druck) — du liest es hier und entscheidest danach, ob ein Projekt draus wird."]}):n?e.jsxs(e.Fragment,{children:[e.jsxs("b",{className:o==="gruendlich"?"text-amber-300/90":"text-violet-300/90",children:["IDE-Welt",o==="gruendlich"?" · gründlich":" · simpel",":"]})," ","Die Box denkt das Konzept durch",o==="gruendlich"?" — volle Kaskade: mehrere Fach-Rollen, bis zu 3 Denk-Runden, mehrfacher Kritiker-Härtetest (für große/ambitionierte Projekte, dauert entsprechend)":" — schlank: 2 Rollen, 1 Denk-Runde (für kleine, klar umrissene Projekte, ein paar Minuten)",", legt ein leeres Gitea-Repo an und füllt es nur mit den wichtigen Dokumenten (Konzept, Roadmap, AGENTS.md, .aiexclude) — ",e.jsx("b",{children:"kein Code"}),". Danach öffnest du das Repo in Zed und baust selbst."]}):e.jsx(e.Fragment,{children:"Eine Queue, alle Türen: hier, per Telegram oder im Gespräch mit Lucy. Die Box arbeitet Ideen selbst aus und baut — Code-Ergebnisse erscheinen als Karte unter „Patch-Vorschläge“, nichts davon geht ohne deinen Klick live. Nur reine Doku-Bagatellen zieht die Box nachts selbst ein (mit Fangnetz und Meldung)."})}),m&&e.jsxs("p",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"})," Queue wird geladen …"]}),(r==null?void 0:r.fehler)&&e.jsx("p",{className:"text-xs text-amber-300",children:"Queue gerade nicht lesbar — neuer Versuch läuft."}),I.length>0&&e.jsxs("div",{className:"space-y-3",children:[((r==null?void 0:r.projekte)??[]).map(t=>e.jsx(Le,{projekt:t,karten:I.filter(a=>a.projekt===t.key),zeile:V},t.key)),(()=>{const t=new Set(((r==null?void 0:r.projekte)??[]).map(h=>h.key)),a=I.filter(h=>!h.projekt||!t.has(h.projekt));if(a.length===0)return null;const x=a.filter(h=>E[h.status]!==void 0).sort((h,P)=>E[h.status]-E[P.status]||(h.erstellt??0)-(P.erstellt??0)),S=a.filter(h=>["todo","scheduled"].includes(h.status)),k=a.filter(h=>h.status==="done");return e.jsxs("div",{className:"space-y-2",children:[x.length>0&&e.jsx("ul",{className:"space-y-1.5",children:x.map(h=>V(h))}),S.length>0&&e.jsxs("details",{className:"group",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center gap-1.5 py-1 text-[11px] text-muted-foreground/70 hover:text-foreground",children:[e.jsx(A,{className:"h-3 w-3 transition-transform group-open:rotate-90"}),e.jsx(se,{className:"h-3 w-3"})," Wartet (",S.length,")"]}),e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:S.map(h=>V(h))})]}),k.length>0&&e.jsxs("details",{className:"group",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center gap-1.5 py-1 text-[11px] text-muted-foreground/70 hover:text-foreground",children:[e.jsx(A,{className:"h-3 w-3 transition-transform group-open:rotate-90"}),e.jsx(pe,{className:"h-3 w-3 text-emerald-400/70"})," Fertig (",k.length,")"]}),e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:k.map(h=>V(h))})]})]})})()]}),(r==null?void 0:r.available)&&!m&&I.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground/70",children:"Queue ist leer — wirf der Box eine Idee zu."})]}),d]})}const E={blocked:0,running:1,review:2,ready:3,triage:4};function Le({projekt:r,karten:m,zeile:j}){const[s,p]=l.useState(!1),[d,u]=l.useState(!1),g=m.filter(n=>E[n.status]!==void 0).sort((n,f)=>E[n.status]-E[f.status]||(n.erstellt??0)-(f.erstellt??0)),o=m.filter(n=>n.status==="todo"||n.status==="scheduled").sort((n,f)=>{var v,y;return((v=n.wartet_auf)!=null&&v.length?1:0)-((y=f.wartet_auf)!=null&&y.length?1:0)||(n.erstellt??0)-(f.erstellt??0)}),i=m.filter(n=>n.status==="done").sort((n,f)=>(f.fertig??0)-(n.fertig??0)),b=r.gesamt>0?Math.round(r.fertig/r.gesamt*100):0;return e.jsxs("div",{className:"space-y-2 rounded-xl border border-border/50 bg-background/20 p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(we,{className:"h-4 w-4 shrink-0 text-primary/70"}),e.jsx("p",{className:"min-w-0 flex-1 truncate text-xs font-semibold text-foreground",title:r.titel,children:r.titel}),e.jsxs("span",{className:"shrink-0 text-[10px] text-muted-foreground",children:[r.fertig," von ",r.gesamt," fertig"]})]}),e.jsx("div",{className:"h-1 overflow-hidden rounded-full bg-background/60",title:`${b}%`,children:e.jsx("div",{className:"h-1 rounded-full bg-primary/70 transition-all",style:{width:`${b}%`}})}),g.length>0&&e.jsx("ul",{className:"space-y-1.5",children:g.map(n=>j(n))}),o.length>0&&e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>p(n=>!n),className:"flex items-center gap-1.5 text-[11px] font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[s?e.jsx(_,{className:"h-3.5 w-3.5"}):e.jsx(A,{className:"h-3.5 w-3.5"}),o.length," Karte",o.length===1?"":"n"," in der Kette — laufen automatisch der Reihe nach"]}),s&&e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:o.map(n=>j(n))})]}),i.length>0&&e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>u(n=>!n),className:"flex items-center gap-1.5 text-[11px] font-semibold text-emerald-300/70 hover:text-emerald-300 transition-colors cursor-pointer",children:[d?e.jsx(_,{className:"h-3.5 w-3.5"}):e.jsx(A,{className:"h-3.5 w-3.5"}),i.length," fertig"]}),d&&e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:i.map(n=>j(n))})]})]})}function Re({id:r,istIdee:m,onWeiter:j}){const[s,p]=l.useState(null),[d,u]=l.useState(!1),[g,o]=l.useState(0);return l.useEffect(()=>{let i=!1;return p(null),u(!1),z(`/api/ideen/${r}/konzept`).then(b=>{i||p(b)}).catch(()=>{i||u(!0)}),()=>{i=!0}},[r,g]),e.jsx("div",{className:"ml-2 -mt-1",children:e.jsxs("div",{className:"rounded-lg border border-violet-500/25 bg-violet-500/[0.04] p-3",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsxs("p",{className:"flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wide text-violet-300",children:[e.jsx(ae,{className:"h-3 w-3"})," Konzept"]}),(s==null?void 0:s.repo)&&e.jsxs("a",{href:`https://git.tobisniceshomelab.ddnsfree.com/${s.repo}`,className:"flex items-center gap-1 text-[10px] text-violet-300/70 hover:text-violet-200",children:[e.jsx(Ce,{className:"h-3 w-3"})," ",s.repo]}),!(s!=null&&s.repo)&&(s==null?void 0:s.quelle)==="datei"&&e.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/70",title:"Der Worker hat kein Repo angelegt — das Konzept liegt als Datei auf der Box.",children:s.pfad}),e.jsx("button",{onClick:()=>o(i=>i+1),title:"Neu laden",className:"ml-auto rounded p-0.5 text-muted-foreground/50 hover:text-foreground cursor-pointer",children:e.jsx(oe,{className:"h-3 w-3"})})]}),d?e.jsx("p",{className:"text-[11px] text-red-400",children:"Konzept nicht ladbar — später nochmal versuchen."}):s===null?e.jsx("p",{className:"text-[10px] text-muted-foreground animate-pulse",children:"Konzept wird geladen …"}):s.konzept?e.jsx("div",{className:"max-h-[28rem] overflow-y-auto pr-1",children:e.jsx(ze,{text:s.konzept})}):e.jsx("p",{className:"text-[11px] text-muted-foreground italic",children:s.error||"Noch kein Konzept — das Projekt wird gerade vorbereitet."}),m&&(s==null?void 0:s.konzept)&&e.jsx(Ae,{id:r,onFertig:j})]})})}function Ae({id:r,onFertig:m}){const[j,s]=l.useState("lxc"),[p,d]=l.useState("simpel"),[u,g]=l.useState(!1),[o,i]=l.useState(null),[b,n]=l.useState(""),[f,v]=l.useState(""),y=async(c,T,D)=>{g(!0),n("");try{const w=await z(c,{method:"POST",body:JSON.stringify(T)});i({id:w.id,art:D}),m==null||m()}catch(w){n(String((w==null?void 0:w.message)||w))}finally{g(!1)}};return o?e.jsx("p",{className:"mt-3 border-t border-violet-500/20 pt-2 text-[11px] text-emerald-300",children:o.art==="projekt"?e.jsxs(e.Fragment,{children:["Projekt-Karte ",e.jsx("span",{className:"font-mono",children:o.id})," ist angelegt — die Box bereitet das Repo vor (Konzept übernimmt sie, sie denkt es nicht neu). Danach öffnest du es in Zed."]}):e.jsxs(e.Fragment,{children:["Überarbeitung ",e.jsx("span",{className:"font-mono",children:o.id}),' läuft — die Box arbeitet deine Rückmeldung ein und schreibt die neue Fassung an dieselbe Stelle. Danach hier wieder „Konzept" öffnen.']})}):e.jsxs("div",{className:"mt-3 space-y-3 border-t border-violet-500/20 pt-2.5",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[e.jsx("b",{className:"text-sky-300/90",children:"Passt etwas nicht?"})," Schreib hin, was anders werden soll — die Box arbeitet es ein und lässt den Rest stehen. Beliebig oft wiederholbar."]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:f,onChange:c=>v(c.target.value),onKeyDown:c=>{c.key==="Enter"&&f.trim().length>=3&&!u&&y("/api/ideen/nachschaerfen",{id:r,hinweis:f},"runde")},placeholder:"z. B. „Punkt 3: kein WebSocket, das ist mir zu fragil — nimm Polling“",maxLength:2e3,className:"h-8 min-w-0 flex-1 rounded-lg border border-border/60 bg-background/60 px-2.5 text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-sky-400/50 focus:outline-none"}),e.jsxs("button",{onClick:()=>y("/api/ideen/nachschaerfen",{id:r,hinweis:f},"runde"),disabled:u||f.trim().length<3,className:"flex h-8 shrink-0 items-center gap-1.5 rounded-lg border border-sky-500/40 bg-sky-500/10 px-3 text-[10px] font-bold uppercase tracking-wide text-sky-300 transition-all hover:bg-sky-500/20 cursor-pointer disabled:opacity-50",children:[u?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(oe,{className:"h-3.5 w-3.5"}),"Nachschärfen"]})]})]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[e.jsx("b",{className:"text-violet-300/90",children:"Passt es so?"})," Dann macht die Box daraus ein startklares Repo — Konzept wird übernommen (nicht neu gedacht), dazu Roadmap, AGENTS.md & Co. Gebaut wird danach von dir in Zed."]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-2",children:[e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Ziel"}),e.jsx("div",{className:"flex rounded-lg border border-border/40 p-0.5",children:["lxc","docker"].map(c=>e.jsx("button",{onClick:()=>s(c),title:c==="lxc"?"Dienst in einem eigenen Proxmox-LXC (systemd, kein Docker) — wird automatisch mitgesichert.":"Natives Docker: Dockerfile + compose, portabel und pipeline-tauglich.",className:N("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",j===c?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:c==="lxc"?"LXC":"Docker"},c))}),e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Aufwand"}),e.jsx("div",{className:"flex rounded-lg border border-border/40 p-0.5",children:["simpel","gruendlich"].map(c=>e.jsx("button",{onClick:()=>d(c),title:c==="simpel"?"Konzept ist schon gehärtet — nur kurz auf die Bau-Sicht nachschärfen (empfohlen).":"Nochmal volle Kaskade über die Bau-Sicht: mehrere Rollen, Härtetests. Dauert entsprechend.",className:N("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",p===c?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:c==="simpel"?"schlank":"gründlich"},c))}),e.jsxs("button",{onClick:()=>y("/api/ideen/weiterfuehren",{id:r,ziel:j,tiefe:p},"projekt"),disabled:u,className:"ml-auto flex h-8 shrink-0 items-center gap-1.5 rounded-lg border border-violet-500/40 bg-violet-500/10 px-3 text-[10px] font-bold uppercase tracking-wide text-violet-300 transition-all hover:bg-violet-500/20 cursor-pointer disabled:opacity-50",children:[u?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(W,{className:"h-3.5 w-3.5"}),"Gefällt mir — Projekt daraus machen"]})]}),b&&e.jsx("p",{className:"text-[11px] text-red-400",children:b})]})}function We({id:r}){const[m,j]=l.useState(null),[s,p]=l.useState(!1),[d,u]=l.useState(0);l.useEffect(()=>{let o=!1;return p(!1),j(null),z(`/api/ideen/${r}/ergebnis`).then(i=>{o||j(i)}).catch(()=>{o||p(!0)}),()=>{o=!0}},[r,d]);const g=m?m.summary||m.result:"";return e.jsx("div",{className:"ml-2 -mt-1",children:e.jsxs("div",{className:"rounded-lg border border-emerald-500/25 bg-emerald-500/5 p-2.5",children:[e.jsxs("p",{className:"mb-1 flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wide text-emerald-300",children:[e.jsx(Se,{className:"h-3 w-3"})," Ergebnis des Workers"]}),s?e.jsx("button",{type:"button",onClick:()=>u(o=>o+1),className:"text-[10px] text-red-400 underline decoration-dotted underline-offset-2 hover:text-red-300",children:"Ergebnis nicht ladbar — nochmal versuchen"}):m===null?e.jsx("p",{className:"text-[10px] text-muted-foreground animate-pulse",children:"Wird geladen …"}):g?e.jsx("p",{className:"max-h-64 overflow-y-auto whitespace-pre-wrap text-xs leading-relaxed text-foreground/85",children:g}):e.jsx("p",{className:"text-[10px] text-muted-foreground italic",children:"Der Worker hat keine Abschluss-Zusammenfassung hinterlassen (ältere Karte oder Protokollverstoß)."})]})})}function Oe(){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Ideen"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Schreib hin, was entstehen soll — die Box arbeitet es aus. Je nach Modus baut sie es selbst, denkt es nur durch, oder legt dir ein startklares Repo fuer Zed an."})]}),e.jsx(Ie,{})]})}export{Oe as IdeenView}; diff --git a/frontend/dist/assets/IdeenView-CvrKo9TU.js b/frontend/dist/assets/IdeenView-CvrKo9TU.js new file mode 100644 index 0000000..0384443 --- /dev/null +++ b/frontend/dist/assets/IdeenView-CvrKo9TU.js @@ -0,0 +1,30 @@ +import{c as T,j as e,e as w,ac as he,u as me,b as ge,r as u,af as pe,a9 as O,L as K,X as _,M as $,V as ae,C as be,g as P,D as q,T as fe,ad as ke,ag as le,ah as je,q as Ne,a3 as oe}from"./index-DCel3VuW.js";import{S as we,H as de}from"./SectionLabel-BpAZbx-8.js";import{C as W}from"./code-xml-D8KV20lN.js";import{S as ie}from"./send-CgygdWYO.js";import{L as ve}from"./layers-BNyHHdLg.js";import{R as ye}from"./rotate-ccw-D-_Gb8HQ.js";/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const De=T("ArrowDown",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Se=T("ArrowUp",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ke=T("ClipboardCheck",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"m9 14 2 2 4-4",key:"df797q"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ce=T("GitFork",[["circle",{cx:"12",cy:"18",r:"3",key:"1mpf1b"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["path",{d:"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9",key:"1uq4wg"}],["path",{d:"M12 12v3",key:"158kv8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ze=T("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);function Pe({text:r,className:p}){const N=(r||"").split(` +`),s=[];let x=[],h=null;const m=f=>{x.length&&(s.push(e.jsx("ul",{className:"mb-3 ml-4 list-disc space-y-1",children:x},f)),x=[])};return N.forEach((f,o)=>{const l=`l${o}`;if(h!==null){f.trimEnd()==="```"?(s.push(e.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px] leading-relaxed text-foreground/85",children:h.join(` +`)},l)),h=null):h.push(f);return}if(f.trimStart().startsWith("```")){m(l),h=[];return}const g=f.trimEnd();if(!g.trim()){m(l);return}const k=g.match(/^(#{1,4})\s+(.*)$/);if(k){m(l);const j=k[1].length,d=j===1?"text-base font-bold mt-1 mb-2":j===2?"text-sm font-bold mt-4 mb-1.5":"text-xs font-bold mt-3 mb-1 uppercase tracking-wide text-muted-foreground";s.push(e.jsx("p",{className:w(d,"font-space text-foreground"),children:G(k[2],l)},l));return}const D=g.match(/^\s*[-*•]\s+(.*)$/);if(D){x.push(e.jsx("li",{className:"text-xs leading-relaxed text-foreground/85",children:G(D[1],l)},l));return}const i=g.match(/^\s*\d+\.\s+(.*)$/);if(i){x.push(e.jsx("li",{className:"text-xs leading-relaxed text-foreground/85",children:G(i[1],l)},l));return}m(l),s.push(e.jsx("p",{className:"mb-2 text-xs leading-relaxed text-foreground/85",children:G(g,l)},l))}),m("end"),h!==null&&s.push(e.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px]",children:h.join(` +`)},"code-end")),e.jsx("div",{className:w("max-w-3xl",p),children:s})}function G(r,p){return r.split(/(\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`)/g).map((s,x)=>{const h=`${p}-${x}`;return/^\*\*[^*]+\*\*$/.test(s)?e.jsx("b",{className:"font-semibold text-foreground",children:s.slice(2,-2)},h):/^\*[^*]+\*$/.test(s)?e.jsx("i",{children:s.slice(1,-1)},h):/^`[^`]+`$/.test(s)?e.jsx("code",{className:"rounded bg-background/50 px-1 font-mono text-[11px] text-foreground/90",children:s.slice(1,-1)},h):e.jsx("span",{children:s},h)})}const Ee={triage:{label:"wird ausgearbeitet …",cls:"text-violet-300 border-violet-500/40 bg-violet-500/10",spin:!0},todo:{label:"wartet",cls:"text-muted-foreground border-border/60 bg-background/30"},scheduled:{label:"geplant",cls:"text-muted-foreground border-border/60 bg-background/30"},ready:{label:"gleich dran",cls:"text-sky-300/80 border-sky-500/30 bg-sky-500/5"},running:{label:"in Arbeit …",cls:"text-sky-300 border-sky-500/40 bg-sky-500/10",spin:!0},review:{label:"im Review",cls:"text-amber-300 border-amber-500/40 bg-amber-500/10"},blocked:{label:"hängt — braucht dich",cls:"text-red-300 border-red-500/40 bg-red-500/10"},done:{label:"fertig ✓",cls:"text-emerald-300 border-emerald-500/40 bg-emerald-500/10"}},Be={box:{label:"BOX",icon:de,cls:"border-border/60 bg-background/40 text-muted-foreground",title:"Box-Welt: die Werkstatt baut das selbst. Das Ergebnis kommt als Patch-Vorschlag zurück — nichts geht ohne deinen Klick live."},idee:{label:"IDEE",icon:O,cls:"border-sky-500/40 bg-sky-500/10 text-sky-300",title:"Nur durchdacht: die Box hat die Produkt-Idee mit voller Denk-Kaskade zu einem Konzept ausgearbeitet. Kein Gerüst, kein Bau — du liest es und entscheidest, ob ein Projekt draus wird."},projekt:{label:"IDE",icon:W,cls:"border-violet-500/40 bg-violet-500/10 text-violet-300",title:"IDE-Welt: die Box bereitet nur vor (Konzept + Repo + Doku, kein Code). Gebaut wird von dir in Zed."}},Le={needs_input:"Die Box hat eine Frage:",capability:"Die Box kam hier nicht weiter:",transient:"Die Aufgabe hakt:"};function Ie(){var ee,te;const{data:r,isLoading:p}=he(),N=me(),{showAlert:s,showConfirm:x,dialogElement:h}=ge(),[m,f]=u.useState(""),[o,l]=u.useState("box"),g=o==="idee",k=o==="simpel"||o==="gruendlich",D=g||k,[i,j]=u.useState("lxc"),[d,E]=u.useState(!1),[v,y]=u.useState({}),[R,ce]=u.useState(null),[Z,ue]=u.useState(null),[M,Q]=u.useState({}),B=(r==null?void 0:r.items)??[],L=()=>N.invalidateQueries({queryKey:Ne.ideen}),J=R!==null&&(((ee=r==null?void 0:r.items.find(t=>t.id===R))==null?void 0:ee.status)==="triage"||((te=r==null?void 0:r.items.find(t=>t.id===R))==null?void 0:te.status)==="running"),A=pe(R??"",J);async function X(){const t=m.trim();if(!(t.length<3||d)){E(!0);try{const n=t.length>160?t.slice(0,157)+"…":t;await P("/api/ideen",{method:"POST",body:JSON.stringify({titel:n,notiz:t.length>160?t:"",welt:D?"ide":"box",tiefe:k?o:"",ziel:k?i:"",art:g?"idee":"projekt"})}),f(""),L()}catch(n){s("Das hat nicht geklappt",String((n==null?void 0:n.message)||n))}finally{E(!1)}}}function U(t,n,c){x(`${n} fertige Karte${n===1?"":"n"} wegräumen?`,`${c} verschwindet aus der Liste. Gelöscht wird nichts — die Karten wandern ins Archiv der Queue und bleiben dort lesbar. Laufende, hängende und wartende Karten bleiben unberührt.`,async()=>{var b;const S="arch:"+(t||"*");y(a=>({...a,[S]:!0}));try{const a=await P("/api/ideen/archivieren-alle",{method:"POST",body:JSON.stringify({projekt:t})});(b=a.fehlgeschlagen)!=null&&b.length&&s("Teilweise erledigt",`${a.archiviert} weggeräumt, ${a.fehlgeschlagen.length} nicht: `+a.fehlgeschlagen.map(z=>z.titel).join(", ")),L()}catch(a){s("Das hat nicht geklappt",String((a==null?void 0:a.message)||a))}finally{y(a=>({...a,[S]:!1}))}})}async function xe(t){y(n=>({...n,[t]:!0}));try{await P("/api/ideen/archivieren",{method:"POST",body:JSON.stringify({id:t})}),L()}catch(n){s("Das hat nicht geklappt",String((n==null?void 0:n.message)||n))}finally{y(n=>({...n,[t]:!1}))}}async function F(t,n,c,S){y(b=>({...b,[t+n]:!0}));try{await P(c,{method:"POST",body:JSON.stringify(S)}),L()}catch(b){s("Das hat nicht geklappt",String((b==null?void 0:b.message)||b))}finally{y(b=>({...b,[t+n]:!1}))}}async function Y(t){const n=(M[t]||"").trim();if(!(n.length<1||v["ans:"+t])){y(c=>({...c,["ans:"+t]:!0}));try{await P("/api/ideen/antwort",{method:"POST",body:JSON.stringify({id:t,antwort:n})}),Q(c=>({...c,[t]:""})),L()}catch(c){s("Das hat nicht geklappt",String((c==null?void 0:c.message)||c))}finally{y(c=>({...c,["ans:"+t]:!1}))}}}const V=t=>{var se,ne;const n=Ee[t.status]??{label:t.status,cls:"text-muted-foreground border-border/60 bg-background/30"},c=R===t.id,S=t.status==="triage"||t.status==="running"||t.status==="done",b=t.status==="blocked",a=!!v["ans:"+t.id],z=t.status==="running"&&(t.puls_alter??0)>600,re=t.status==="todo"||t.status==="ready"||t.status==="scheduled";return e.jsxs("li",{className:w("flex flex-col gap-2 rounded-xl border bg-background/30 px-3 py-2",b?"border-red-500/30":z?"border-amber-500/40":"border-border/40"),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:w("flex shrink-0 items-center gap-1.5 rounded-lg border px-2 py-0.5 text-[10px] font-bold",n.cls),children:[n.spin&&e.jsx(K,{className:"h-3 w-3 animate-spin"}),n.label]}),z&&e.jsxs("span",{className:"flex shrink-0 items-center gap-1 rounded-lg border border-amber-500/40 bg-amber-500/10 px-2 py-0.5 text-[10px] font-bold text-amber-300",title:"Der Worker lebt, gibt aber kein Lebenszeichen mehr — vermutlich wartet er auf etwas, das nie kommt. „Neuer Versuch“ startet die Karte frisch.",children:[e.jsx(fe,{className:"h-3 w-3"})," ",Math.round((t.puls_alter??0)/60)," min ohne Regung"]}),(t.prio??0)!==0&&e.jsxs("span",{className:"shrink-0 rounded bg-background/50 px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground",title:"Priorität — höher kommt zuerst dran (bei gleicher Prio: Erstellzeit)",children:["P",t.prio]}),(()=>{const C=Be[t.art||(t.welt==="ide"?"projekt":"box")];if(!C)return null;const H=C.icon;return e.jsxs("span",{className:w("flex shrink-0 items-center gap-1 rounded-lg border px-2 py-0.5 text-[10px] font-bold",C.cls),title:C.title,children:[e.jsx(H,{className:"h-3 w-3"})," ",C.label]})})(),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs text-foreground",title:t.titel,children:t.titel}),e.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] text-muted-foreground/70",children:[e.jsx(ae,{className:"h-3 w-3"}),ke(t.erstellt)]}),re&&e.jsxs("span",{className:"flex shrink-0 items-center",children:[e.jsx("button",{disabled:!!v["pr:"+t.id],onClick:()=>F("pr:",t.id,"/api/ideen/prio",{id:t.id,richtung:"hoch"}),title:"Vorziehen (Prio +1)",className:"rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer disabled:opacity-50",children:e.jsx(Se,{className:"h-3.5 w-3.5"})}),e.jsx("button",{disabled:!!v["pr:"+t.id],onClick:()=>F("pr:",t.id,"/api/ideen/prio",{id:t.id,richtung:"runter"}),title:"Zurückstellen (Prio −1)",className:"rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer disabled:opacity-50",children:e.jsx(De,{className:"h-3.5 w-3.5"})})]}),(t.status==="running"||b)&&e.jsx("button",{disabled:!!v["rt:"+t.id],onClick:()=>x("Neuer Versuch?",t.status==="running"?`Der laufende Worker von '${t.titel.slice(0,60)}' wird beendet (samt gestarteter Test-Prozesse) und die Karte frisch gestartet. Bisheriger Zwischenstand im Workspace bleibt liegen.`:`Die Karte '${t.titel.slice(0,60)}' wird entsperrt und läuft weiter, sobald ein Platz frei ist.`,()=>F("rt:",t.id,"/api/ideen/retry",{id:t.id})),title:"Neuer Versuch — Karte frisch starten",className:w("shrink-0 rounded-md p-1 transition-colors cursor-pointer disabled:opacity-50",z?"text-amber-300 hover:text-amber-200":"text-muted-foreground/60 hover:text-foreground"),children:v["rt:"+t.id]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(ye,{className:"h-3.5 w-3.5"})}),(t.status==="running"||re||t.status==="triage")&&e.jsx("button",{disabled:!!v["st:"+t.id],onClick:()=>x("Karte stoppen?",`'${t.titel.slice(0,60)}' wird angehalten${t.status==="running"?" und der laufende Worker beendet":""}. Sie bleibt als gestoppt im Board und kann jederzeit per „Neuer Versuch“ weiterlaufen.`,()=>F("st:",t.id,"/api/ideen/stopp",{id:t.id})),title:"Stoppen — Karte anhalten",className:"shrink-0 rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-red-300 cursor-pointer disabled:opacity-50",children:v["st:"+t.id]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(ze,{className:"h-3.5 w-3.5"})}),(t.status==="done"||b)&&e.jsx("button",{disabled:!!v[t.id],onClick:()=>xe(t.id),title:b?"Aufgeben und aus der Liste räumen (wandert ins Kanban-Archiv)":"Aus der Liste räumen (wandert ins Kanban-Archiv)",className:"shrink-0 rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer disabled:opacity-50",children:v[t.id]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(_,{className:"h-3.5 w-3.5"})}),t.welt==="ide"&&(t.status==="running"||t.status==="done")&&e.jsxs("button",{onClick:()=>ue(Z===t.id?null:t.id),title:"Konzept ansehen (das ausgearbeitete KONZEPT.md)",className:w("flex shrink-0 items-center gap-1 rounded-md px-1.5 py-1 text-[10px] font-bold transition-colors cursor-pointer",Z===t.id?"text-violet-300":"text-violet-300/70 hover:text-violet-200"),children:[e.jsx(le,{className:"h-3.5 w-3.5"})," Konzept"]}),S&&e.jsx("button",{onClick:()=>ce(c?null:t.id),title:t.status==="done"?"Ergebnis anzeigen":"Worker-Log anzeigen",className:"shrink-0 rounded-md p-1 text-muted-foreground/60 transition-colors hover:text-foreground cursor-pointer",children:c?e.jsx(q,{className:"h-3.5 w-3.5"}):e.jsx($,{className:"h-3.5 w-3.5"})})]}),Z===t.id&&e.jsx(Ae,{id:t.id,istIdee:t.art==="idee"&&t.status==="done",onWeiter:L}),t.status==="running"&&t.notiz&&e.jsxs("p",{className:"-mt-1 ml-1 text-[11px] italic leading-relaxed text-sky-200/80",title:"Jüngste Zwischenmeldung des Workers (Heartbeat)",children:["„",t.notiz,"“"]}),(t.status==="todo"||t.status==="scheduled"||t.status==="ready")&&(((se=t.wartet_auf)==null?void 0:se.length)??0)>0&&e.jsxs("p",{className:"-mt-1 ml-1 text-[10px] text-muted-foreground/70",children:["→ wartet auf: ",t.wartet_auf.join(" · ")]}),b&&e.jsxs("div",{className:"space-y-2 border-t border-red-500/20 pt-2",children:[e.jsxs("p",{className:"flex items-start gap-1.5 text-[11px] leading-relaxed text-red-200/90",children:[e.jsx(je,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-red-300"}),e.jsxs("span",{children:[e.jsx("b",{children:Le[t.frage_kind||""]??"Die Aufgabe hängt und wartet auf dich:"})," ",t.frage?e.jsx("span",{className:"text-foreground/90",children:t.frage}):e.jsx("span",{className:"text-muted-foreground italic",children:"kein genauer Grund hinterlegt — antworte einfach mit einer Entscheidung, dann läuft sie weiter."})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:M[t.id]||"",onChange:C=>Q(H=>({...H,[t.id]:C.target.value})),onKeyDown:C=>{C.key==="Enter"&&Y(t.id)},placeholder:"Deine Antwort — die Box macht damit weiter",maxLength:2e3,className:"h-8 min-w-0 flex-1 rounded-lg border border-border/60 bg-background/60 px-2.5 text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-red-400/50 focus:outline-none"}),e.jsxs("button",{onClick:()=>Y(t.id),disabled:a||(M[t.id]||"").trim().length<1,className:"flex h-8 shrink-0 items-center gap-1.5 rounded-lg border border-emerald-500/40 bg-emerald-500/10 px-3 text-[10px] font-bold uppercase tracking-wide text-emerald-300 transition-all hover:bg-emerald-500/20 cursor-pointer disabled:opacity-50",children:[a?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(ie,{className:"h-3.5 w-3.5"})," Antworten & weiter"]})]})]}),c&&S&&t.status!=="done"&&e.jsx("div",{className:"ml-2 -mt-1",children:e.jsx("div",{className:"rounded-lg border border-border/50 bg-background/50 p-2",children:J&&A.isLoading?e.jsx("p",{className:"text-[10px] text-muted-foreground animate-pulse",children:"Log wird geladen …"}):A.error?e.jsx("p",{className:"text-[10px] text-red-400",children:"Log nicht ladbar"}):(ne=A.data)!=null&&ne.available&&A.data.lines.length>0?e.jsx("pre",{className:"max-h-64 overflow-auto font-mono text-[10px] leading-relaxed text-foreground/80 whitespace-pre-wrap",children:A.data.lines.join(` +`)}):e.jsx("p",{className:"text-[10px] text-muted-foreground",children:"Kein Log verfügbar"})})}),c&&t.status==="done"&&e.jsx(We,{id:t.id})]},t.id)};return r&&!r.available?null:e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx(we,{icon:O,children:(()=>{if(!r)return"Ideen-Queue";const t=c=>B.filter(S=>c.includes(S.status)).length,n=[t(["blocked"])>0?`${t(["blocked"])} braucht dich`:"",t(["running","triage","review"])>0?`${t(["running","triage","review"])} in Arbeit`:"",t(["todo","scheduled","ready"])>0?`${t(["todo","scheduled","ready"])} wartet`:"",t(["done"])>0?`${t(["done"])} fertig`:""].filter(Boolean);return`Ideen-Queue${n.length?" — "+n.join(" · "):""}`})()}),(()=>{const t=B.filter(n=>n.status==="done").length;return t===0?null:e.jsxs("button",{disabled:!!v["arch:*"],onClick:()=>U("",t,`Alle ${t} fertigen Karten`),title:"Räumt ALLE fertigen Karten weg — auch die in abgeschlossenen Projekt-Ketten. Laufende, hängende und wartende bleiben unberührt.",className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-border/60 px-2.5 py-1 text-[11px] font-semibold text-muted-foreground transition-all hover:border-primary/40 hover:text-foreground disabled:opacity-50 cursor-pointer",children:[v["arch:*"]?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(_,{className:"h-3.5 w-3.5"}),t," fertige wegräumen"]})})()]}),e.jsxs("div",{className:"mc-card p-4 space-y-3",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:m,onChange:t=>f(t.target.value),onKeyDown:t=>{t.key==="Enter"&&X()},placeholder:"Neue Idee — einfach hinschreiben, die Box macht den Rest",className:"h-9 min-w-0 flex-1 rounded-lg border border-border/60 bg-background/50 px-3 text-sm text-foreground placeholder:text-muted-foreground/50 focus:border-primary/50 focus:outline-none"}),e.jsxs("button",{onClick:X,disabled:d||m.trim().length<3,className:w("flex h-9 shrink-0 items-center gap-1.5 rounded-lg border px-3 text-[11px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-50",o==="gruendlich"?"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20":o==="simpel"?"border-violet-500/40 bg-violet-500/10 text-violet-300 hover:bg-violet-500/20":g?"border-sky-500/40 bg-sky-500/10 text-sky-300 hover:bg-sky-500/20":"border-primary/40 bg-primary/10 text-primary hover:bg-primary/20"),children:[d?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):g?e.jsx(O,{className:"h-3.5 w-3.5"}):k?e.jsx(W,{className:"h-3.5 w-3.5"}):e.jsx(ie,{className:"h-3.5 w-3.5"}),g?"Durchdenken":k?"Vorbereiten":"In die Queue"]})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Modus"}),e.jsxs("div",{className:"flex rounded-lg border border-border/60 p-0.5",children:[e.jsxs("button",{onClick:()=>l("box"),className:w("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="box"?"bg-primary/15 text-primary":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(de,{className:"h-3 w-3"})," Box"]}),e.jsxs("button",{onClick:()=>l("idee"),title:"Produkt-Idee erst einmal durchdenken lassen: Was ist es, für wen, was gibt es schon, was spricht dagegen? Ergebnis ist ein Konzept — kein Projekt, kein Bau-Druck.",className:w("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="idee"?"bg-sky-500/15 text-sky-300":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(O,{className:"h-3 w-3"})," Idee"]}),e.jsxs("button",{onClick:()=>l("simpel"),title:"IDE-Projekt, schnell vorbereitet: knappes Konzept, wenige Denk-Runden. Für kleine, klar umrissene Sachen.",className:w("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="simpel"?"bg-violet-500/15 text-violet-300":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(W,{className:"h-3 w-3"})," IDE: simpel"]}),e.jsxs("button",{onClick:()=>l("gruendlich"),title:"IDE-Projekt, gründlich durchdacht: volle Kaskade mit mehreren Rollen und Härtetests. Für große/ambitionierte Projekte.",className:w("flex items-center gap-1 rounded px-2 py-1 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer",o==="gruendlich"?"bg-amber-500/15 text-amber-300":"text-muted-foreground/60 hover:text-foreground"),children:[e.jsx(W,{className:"h-3 w-3"})," IDE: gründlich"]})]})]}),e.jsxs("p",{className:"text-[10px] leading-relaxed text-muted-foreground/60",children:[e.jsx("b",{className:"text-primary/80",children:"Box"}),", wenn die Box es selbst bauen soll (dein Heimlabor, MC2, Lucy — Ergebnis kommt als Patch-Vorschlag zurück). ·"," ",e.jsx("b",{className:"text-sky-300/80",children:"Idee"}),", wenn du noch nicht weißt, ob es das überhaupt wert ist — erst durchdenken, entscheiden kannst du danach. ·"," ",e.jsx("b",{className:"text-violet-300/80",children:"IDE"}),", wenn du es selbst in Zed bauen willst und dafür ein startklares Repo brauchst."]}),k&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Ziel"}),e.jsxs("div",{className:"flex rounded-lg border border-border/40 p-0.5",children:[e.jsx("button",{onClick:()=>j("lxc"),title:"Läuft als Dienst in einem eigenen Proxmox-LXC (systemd, kein Docker). Wird vom Backup-Server automatisch mitgesichert.",className:w("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",i==="lxc"?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:"LXC"}),e.jsx("button",{onClick:()=>j("docker"),title:"Natives Docker nach Standard-Praxis: Dockerfile + compose, portabel, über Gitea-/GitLab-Pipelines baubar. Für Projekte, die bewusst außerhalb der LXC-Welt leben.",className:w("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",i==="docker"?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:"Docker"})]}),e.jsx("span",{className:"text-[10px] text-muted-foreground/50",children:i==="lxc"?"Dienst im Proxmox-Container (deine Heimat)":"natives Docker, portabel & pipeline-tauglich"})]}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:g?e.jsxs(e.Fragment,{children:[e.jsx("b",{className:"text-sky-300/90",children:"Idee durchdenken:"})," Die Box arbeitet deine Produkt-Idee mit Produkt-Blick aus — was ist es genau, für wen, was gibt es dafür schon, was wäre der kleinste sinnvolle Wurf und was spricht dagegen. Volle Denk-Kaskade mit Kritiker, Ergebnis ist ",e.jsx("b",{children:"nur ein Konzept"})," (kein Gerüst, keine Roadmap, kein Bau-Druck) — du liest es hier und entscheidest danach, ob ein Projekt draus wird."]}):k?e.jsxs(e.Fragment,{children:[e.jsxs("b",{className:o==="gruendlich"?"text-amber-300/90":"text-violet-300/90",children:["IDE-Welt",o==="gruendlich"?" · gründlich":" · simpel",":"]})," ","Die Box denkt das Konzept durch",o==="gruendlich"?" — volle Kaskade: mehrere Fach-Rollen, bis zu 3 Denk-Runden, mehrfacher Kritiker-Härtetest (für große/ambitionierte Projekte, dauert entsprechend)":" — schlank: 2 Rollen, 1 Denk-Runde (für kleine, klar umrissene Projekte, ein paar Minuten)",", legt ein leeres Gitea-Repo an und füllt es nur mit den wichtigen Dokumenten (Konzept, Roadmap, AGENTS.md, .aiexclude) — ",e.jsx("b",{children:"kein Code"}),". Danach öffnest du das Repo in Zed und baust selbst."]}):e.jsx(e.Fragment,{children:"Eine Queue, alle Türen: hier, per Telegram oder im Gespräch mit Lucy. Die Box arbeitet Ideen selbst aus und baut — Code-Ergebnisse erscheinen als Karte unter „Patch-Vorschläge“, nichts davon geht ohne deinen Klick live. Nur reine Doku-Bagatellen zieht die Box nachts selbst ein (mit Fangnetz und Meldung)."})}),p&&e.jsxs("p",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"})," Queue wird geladen …"]}),(r==null?void 0:r.fehler)&&e.jsx("p",{className:"text-xs text-amber-300",children:"Queue gerade nicht lesbar — neuer Versuch läuft."}),B.length>0&&e.jsxs("div",{className:"space-y-3",children:[((r==null?void 0:r.projekte)??[]).map(t=>e.jsx(Re,{projekt:t,karten:B.filter(n=>n.projekt===t.key),zeile:V,onArchivAlle:U,raeumt:!!v["arch:"+t.key]},t.key)),(()=>{const t=new Set(((r==null?void 0:r.projekte)??[]).map(a=>a.key)),n=B.filter(a=>!a.projekt||!t.has(a.projekt));if(n.length===0)return null;const c=n.filter(a=>I[a.status]!==void 0).sort((a,z)=>I[a.status]-I[z.status]||(a.erstellt??0)-(z.erstellt??0)),S=n.filter(a=>["todo","scheduled"].includes(a.status)),b=n.filter(a=>a.status==="done");return e.jsxs("div",{className:"space-y-2",children:[c.length>0&&e.jsx("ul",{className:"space-y-1.5",children:c.map(a=>V(a))}),S.length>0&&e.jsxs("details",{className:"group",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center gap-1.5 py-1 text-[11px] text-muted-foreground/70 hover:text-foreground",children:[e.jsx($,{className:"h-3 w-3 transition-transform group-open:rotate-90"}),e.jsx(ae,{className:"h-3 w-3"})," Wartet (",S.length,")"]}),e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:S.map(a=>V(a))})]}),b.length>0&&e.jsxs("details",{className:"group",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center gap-1.5 py-1 text-[11px] text-muted-foreground/70 hover:text-foreground",children:[e.jsx($,{className:"h-3 w-3 transition-transform group-open:rotate-90"}),e.jsx(be,{className:"h-3 w-3 text-emerald-400/70"})," Fertig (",b.length,")"]}),e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:b.map(a=>V(a))})]})]})})()]}),(r==null?void 0:r.available)&&!p&&B.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground/70",children:"Queue ist leer — wirf der Box eine Idee zu."})]}),h]})}const I={blocked:0,running:1,review:2,ready:3,triage:4};function Re({projekt:r,karten:p,zeile:N,onArchivAlle:s,raeumt:x}){const[h,m]=u.useState(!1),[f,o]=u.useState(!1),l=p.filter(i=>I[i.status]!==void 0).sort((i,j)=>I[i.status]-I[j.status]||(i.erstellt??0)-(j.erstellt??0)),g=p.filter(i=>i.status==="todo"||i.status==="scheduled").sort((i,j)=>{var d,E;return((d=i.wartet_auf)!=null&&d.length?1:0)-((E=j.wartet_auf)!=null&&E.length?1:0)||(i.erstellt??0)-(j.erstellt??0)}),k=p.filter(i=>i.status==="done").sort((i,j)=>(j.fertig??0)-(i.fertig??0)),D=r.gesamt>0?Math.round(r.fertig/r.gesamt*100):0;return e.jsxs("div",{className:"space-y-2 rounded-xl border border-border/50 bg-background/20 p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ve,{className:"h-4 w-4 shrink-0 text-primary/70"}),e.jsx("p",{className:"min-w-0 flex-1 truncate text-xs font-semibold text-foreground",title:r.titel,children:r.titel}),e.jsxs("span",{className:"shrink-0 text-[10px] text-muted-foreground",children:[r.fertig," von ",r.gesamt," fertig"]})]}),e.jsx("div",{className:"h-1 overflow-hidden rounded-full bg-background/60",title:`${D}%`,children:e.jsx("div",{className:"h-1 rounded-full bg-primary/70 transition-all",style:{width:`${D}%`}})}),l.length>0&&e.jsx("ul",{className:"space-y-1.5",children:l.map(i=>N(i))}),g.length>0&&e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>m(i=>!i),className:"flex items-center gap-1.5 text-[11px] font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[h?e.jsx(q,{className:"h-3.5 w-3.5"}):e.jsx($,{className:"h-3.5 w-3.5"}),g.length," Karte",g.length===1?"":"n"," in der Kette — laufen automatisch der Reihe nach"]}),h&&e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:g.map(i=>N(i))})]}),k.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:()=>o(i=>!i),className:"flex items-center gap-1.5 text-[11px] font-semibold text-emerald-300/70 hover:text-emerald-300 transition-colors cursor-pointer",children:[f?e.jsx(q,{className:"h-3.5 w-3.5"}):e.jsx($,{className:"h-3.5 w-3.5"}),k.length," fertig"]}),s&&e.jsxs("button",{disabled:x,onClick:()=>s(r.key,k.length,`„${r.titel}"`),title:"Räumt die fertigen Karten dieser Kette weg (Archiv, nichts wird gelöscht).",className:"flex items-center gap-1 text-[11px] text-muted-foreground/60 transition-colors hover:text-foreground disabled:opacity-50 cursor-pointer",children:[x?e.jsx(K,{className:"h-3 w-3 animate-spin"}):e.jsx(_,{className:"h-3 w-3"}),"wegräumen"]})]}),f&&e.jsx("ul",{className:"mt-1.5 space-y-1.5",children:k.map(i=>N(i))})]})]})}function Ae({id:r,istIdee:p,onWeiter:N}){const[s,x]=u.useState(null),[h,m]=u.useState(!1),[f,o]=u.useState(0);return u.useEffect(()=>{let l=!1;return x(null),m(!1),P(`/api/ideen/${r}/konzept`).then(g=>{l||x(g)}).catch(()=>{l||m(!0)}),()=>{l=!0}},[r,f]),e.jsx("div",{className:"ml-2 -mt-1",children:e.jsxs("div",{className:"rounded-lg border border-violet-500/25 bg-violet-500/[0.04] p-3",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsxs("p",{className:"flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wide text-violet-300",children:[e.jsx(le,{className:"h-3 w-3"})," Konzept"]}),(s==null?void 0:s.repo)&&e.jsxs("a",{href:`https://git.tobisniceshomelab.ddnsfree.com/${s.repo}`,className:"flex items-center gap-1 text-[10px] text-violet-300/70 hover:text-violet-200",children:[e.jsx(Ce,{className:"h-3 w-3"})," ",s.repo]}),!(s!=null&&s.repo)&&(s==null?void 0:s.quelle)==="datei"&&e.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/70",title:"Der Worker hat kein Repo angelegt — das Konzept liegt als Datei auf der Box.",children:s.pfad}),e.jsx("button",{onClick:()=>o(l=>l+1),title:"Neu laden",className:"ml-auto rounded p-0.5 text-muted-foreground/50 hover:text-foreground cursor-pointer",children:e.jsx(oe,{className:"h-3 w-3"})})]}),h?e.jsx("p",{className:"text-[11px] text-red-400",children:"Konzept nicht ladbar — später nochmal versuchen."}):s===null?e.jsx("p",{className:"text-[10px] text-muted-foreground animate-pulse",children:"Konzept wird geladen …"}):s.konzept?e.jsx("div",{className:"max-h-[28rem] overflow-y-auto pr-1",children:e.jsx(Pe,{text:s.konzept})}):e.jsx("p",{className:"text-[11px] text-muted-foreground italic",children:s.error||"Noch kein Konzept — das Projekt wird gerade vorbereitet."}),p&&(s==null?void 0:s.konzept)&&e.jsx($e,{id:r,onFertig:N})]})})}function $e({id:r,onFertig:p}){const[N,s]=u.useState("lxc"),[x,h]=u.useState("simpel"),[m,f]=u.useState(!1),[o,l]=u.useState(null),[g,k]=u.useState(""),[D,i]=u.useState(""),j=async(d,E,v)=>{f(!0),k("");try{const y=await P(d,{method:"POST",body:JSON.stringify(E)});l({id:y.id,art:v}),p==null||p()}catch(y){k(String((y==null?void 0:y.message)||y))}finally{f(!1)}};return o?e.jsx("p",{className:"mt-3 border-t border-violet-500/20 pt-2 text-[11px] text-emerald-300",children:o.art==="projekt"?e.jsxs(e.Fragment,{children:["Projekt-Karte ",e.jsx("span",{className:"font-mono",children:o.id})," ist angelegt — die Box bereitet das Repo vor (Konzept übernimmt sie, sie denkt es nicht neu). Danach öffnest du es in Zed."]}):e.jsxs(e.Fragment,{children:["Überarbeitung ",e.jsx("span",{className:"font-mono",children:o.id}),' läuft — die Box arbeitet deine Rückmeldung ein und schreibt die neue Fassung an dieselbe Stelle. Danach hier wieder „Konzept" öffnen.']})}):e.jsxs("div",{className:"mt-3 space-y-3 border-t border-violet-500/20 pt-2.5",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[e.jsx("b",{className:"text-sky-300/90",children:"Passt etwas nicht?"})," Schreib hin, was anders werden soll — die Box arbeitet es ein und lässt den Rest stehen. Beliebig oft wiederholbar."]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:D,onChange:d=>i(d.target.value),onKeyDown:d=>{d.key==="Enter"&&D.trim().length>=3&&!m&&j("/api/ideen/nachschaerfen",{id:r,hinweis:D},"runde")},placeholder:"z. B. „Punkt 3: kein WebSocket, das ist mir zu fragil — nimm Polling“",maxLength:2e3,className:"h-8 min-w-0 flex-1 rounded-lg border border-border/60 bg-background/60 px-2.5 text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-sky-400/50 focus:outline-none"}),e.jsxs("button",{onClick:()=>j("/api/ideen/nachschaerfen",{id:r,hinweis:D},"runde"),disabled:m||D.trim().length<3,className:"flex h-8 shrink-0 items-center gap-1.5 rounded-lg border border-sky-500/40 bg-sky-500/10 px-3 text-[10px] font-bold uppercase tracking-wide text-sky-300 transition-all hover:bg-sky-500/20 cursor-pointer disabled:opacity-50",children:[m?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(oe,{className:"h-3.5 w-3.5"}),"Nachschärfen"]})]})]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[e.jsx("b",{className:"text-violet-300/90",children:"Passt es so?"})," Dann macht die Box daraus ein startklares Repo — Konzept wird übernommen (nicht neu gedacht), dazu Roadmap, AGENTS.md & Co. Gebaut wird danach von dir in Zed."]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-2",children:[e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Ziel"}),e.jsx("div",{className:"flex rounded-lg border border-border/40 p-0.5",children:["lxc","docker"].map(d=>e.jsx("button",{onClick:()=>s(d),title:d==="lxc"?"Dienst in einem eigenen Proxmox-LXC (systemd, kein Docker) — wird automatisch mitgesichert.":"Natives Docker: Dockerfile + compose, portabel und pipeline-tauglich.",className:w("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",N===d?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:d==="lxc"?"LXC":"Docker"},d))}),e.jsx("span",{className:"text-[11px] text-muted-foreground/70",children:"Aufwand"}),e.jsx("div",{className:"flex rounded-lg border border-border/40 p-0.5",children:["simpel","gruendlich"].map(d=>e.jsx("button",{onClick:()=>h(d),title:d==="simpel"?"Konzept ist schon gehärtet — nur kurz auf die Bau-Sicht nachschärfen (empfohlen).":"Nochmal volle Kaskade über die Bau-Sicht: mehrere Rollen, Härtetests. Dauert entsprechend.",className:w("rounded px-2 py-0.5 text-[10px] font-semibold transition-all cursor-pointer",x===d?"bg-foreground/10 text-foreground":"text-muted-foreground/50 hover:text-foreground/80"),children:d==="simpel"?"schlank":"gründlich"},d))}),e.jsxs("button",{onClick:()=>j("/api/ideen/weiterfuehren",{id:r,ziel:N,tiefe:x},"projekt"),disabled:m,className:"ml-auto flex h-8 shrink-0 items-center gap-1.5 rounded-lg border border-violet-500/40 bg-violet-500/10 px-3 text-[10px] font-bold uppercase tracking-wide text-violet-300 transition-all hover:bg-violet-500/20 cursor-pointer disabled:opacity-50",children:[m?e.jsx(K,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(W,{className:"h-3.5 w-3.5"}),"Gefällt mir — Projekt daraus machen"]})]}),g&&e.jsx("p",{className:"text-[11px] text-red-400",children:g})]})}function We({id:r}){const[p,N]=u.useState(null),[s,x]=u.useState(!1),[h,m]=u.useState(0);u.useEffect(()=>{let o=!1;return x(!1),N(null),P(`/api/ideen/${r}/ergebnis`).then(l=>{o||N(l)}).catch(()=>{o||x(!0)}),()=>{o=!0}},[r,h]);const f=p?p.summary||p.result:"";return e.jsx("div",{className:"ml-2 -mt-1",children:e.jsxs("div",{className:"rounded-lg border border-emerald-500/25 bg-emerald-500/5 p-2.5",children:[e.jsxs("p",{className:"mb-1 flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wide text-emerald-300",children:[e.jsx(Ke,{className:"h-3 w-3"})," Ergebnis des Workers"]}),s?e.jsx("button",{type:"button",onClick:()=>m(o=>o+1),className:"text-[10px] text-red-400 underline decoration-dotted underline-offset-2 hover:text-red-300",children:"Ergebnis nicht ladbar — nochmal versuchen"}):p===null?e.jsx("p",{className:"text-[10px] text-muted-foreground animate-pulse",children:"Wird geladen …"}):f?e.jsx("p",{className:"max-h-64 overflow-y-auto whitespace-pre-wrap text-xs leading-relaxed text-foreground/85",children:f}):e.jsx("p",{className:"text-[10px] text-muted-foreground italic",children:"Der Worker hat keine Abschluss-Zusammenfassung hinterlassen (ältere Karte oder Protokollverstoß)."})]})})}function Me(){return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Ideen"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Schreib hin, was entstehen soll — die Box arbeitet es aus. Je nach Modus baut sie es selbst, denkt es nur durch, oder legt dir ein startklares Repo fuer Zed an."})]}),e.jsx(Ie,{})]})}export{Me as IdeenView}; diff --git a/frontend/dist/assets/KonsoleView-BlZ5qbFv.js b/frontend/dist/assets/KonsoleView-Qdl4WGOp.js similarity index 98% rename from frontend/dist/assets/KonsoleView-BlZ5qbFv.js rename to frontend/dist/assets/KonsoleView-Qdl4WGOp.js index 079bdb7..741a873 100644 --- a/frontend/dist/assets/KonsoleView-BlZ5qbFv.js +++ b/frontend/dist/assets/KonsoleView-Qdl4WGOp.js @@ -1 +1 @@ -import{Y as b,u as f,$ as h,r as d,j as e,e as c,Z as g,T as p,a3 as j,a4 as N,g as v,a5 as w,q as x}from"./index-CoRdA_gp.js";function y(){const{data:s}=b(),m=f(),r=s!=null&&s.box_console_url?h(s.box_console_url):void 0,a=s==null?void 0:s.box_console_reachable,[l,o]=d.useState(!1),[i,n]=d.useState("");async function u(){o(!0),n("");try{const t=await v("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:"box-console"})});n(t.ok?"Neu gestartet — einen Moment, dann lädt das Terminal.":`Fehlgeschlagen: ${t.err||"Unbekannter Fehler"}`),w(m,x.agentStatus,x.services)}catch(t){n(`Fehlgeschlagen: ${(t==null?void 0:t.message)||t}`)}finally{o(!1)}}return e.jsxs("div",{className:"flex h-full flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Konsole"}),e.jsx("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:"Direkte Shell auf der Box — wie ein SSH-Fenster, mitten im Browser."})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[e.jsx("span",{className:c("h-2 w-2 rounded-full",a?"bg-emerald-500 animate-pulse":"bg-amber-500")}),a?"online":"offline"]}),r&&e.jsxs("a",{href:r,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[e.jsx(g,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),r?e.jsxs("div",{className:"relative min-h-[58vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[a===!1&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[e.jsx(p,{className:"h-8 w-8 text-amber-400"}),e.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Konsole nicht erreichbar"}),e.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der Terminal-Dienst (",e.jsx("code",{className:"font-mono text-primary",children:"box-console"}),") läuft gerade nicht."]}),e.jsxs("button",{onClick:u,disabled:l,className:"flex h-9 items-center gap-1.5 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 text-[11px] font-bold uppercase tracking-wide text-amber-300 transition-all hover:bg-amber-500/20 cursor-pointer disabled:opacity-50",children:[e.jsx(j,{className:c("h-3.5 w-3.5",l&&"animate-spin")})," Dienst neu starten"]}),i&&e.jsx("p",{className:"max-w-sm text-[11px] text-muted-foreground",children:i})]}),e.jsx("iframe",{src:r,title:"Box-Konsole",className:"h-full w-full border-0",style:{minHeight:"58vh"}})]}):e.jsxs("div",{className:"flex min-h-[58vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[e.jsx(N,{className:"mr-2 h-4 w-4"})," Lade Konsole…"]})]})}export{y as KonsoleView}; +import{Y as b,u as f,$ as h,r as d,j as e,e as c,Z as g,T as p,a3 as j,a4 as N,g as v,a5 as w,q as x}from"./index-DCel3VuW.js";function y(){const{data:s}=b(),m=f(),r=s!=null&&s.box_console_url?h(s.box_console_url):void 0,a=s==null?void 0:s.box_console_reachable,[l,o]=d.useState(!1),[i,n]=d.useState("");async function u(){o(!0),n("");try{const t=await v("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:"box-console"})});n(t.ok?"Neu gestartet — einen Moment, dann lädt das Terminal.":`Fehlgeschlagen: ${t.err||"Unbekannter Fehler"}`),w(m,x.agentStatus,x.services)}catch(t){n(`Fehlgeschlagen: ${(t==null?void 0:t.message)||t}`)}finally{o(!1)}}return e.jsxs("div",{className:"flex h-full flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Konsole"}),e.jsx("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:"Direkte Shell auf der Box — wie ein SSH-Fenster, mitten im Browser."})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[e.jsx("span",{className:c("h-2 w-2 rounded-full",a?"bg-emerald-500 animate-pulse":"bg-amber-500")}),a?"online":"offline"]}),r&&e.jsxs("a",{href:r,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[e.jsx(g,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),r?e.jsxs("div",{className:"relative min-h-[58vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[a===!1&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[e.jsx(p,{className:"h-8 w-8 text-amber-400"}),e.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Konsole nicht erreichbar"}),e.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der Terminal-Dienst (",e.jsx("code",{className:"font-mono text-primary",children:"box-console"}),") läuft gerade nicht."]}),e.jsxs("button",{onClick:u,disabled:l,className:"flex h-9 items-center gap-1.5 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 text-[11px] font-bold uppercase tracking-wide text-amber-300 transition-all hover:bg-amber-500/20 cursor-pointer disabled:opacity-50",children:[e.jsx(j,{className:c("h-3.5 w-3.5",l&&"animate-spin")})," Dienst neu starten"]}),i&&e.jsx("p",{className:"max-w-sm text-[11px] text-muted-foreground",children:i})]}),e.jsx("iframe",{src:r,title:"Box-Konsole",className:"h-full w-full border-0",style:{minHeight:"58vh"}})]}):e.jsxs("div",{className:"flex min-h-[58vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[e.jsx(N,{className:"mr-2 h-4 w-4"})," Lade Konsole…"]})]})}export{y as KonsoleView}; diff --git a/frontend/dist/assets/MemoryView-Dr_9tmOV.js b/frontend/dist/assets/MemoryView-Bg74Wg9z.js similarity index 98% rename from frontend/dist/assets/MemoryView-Dr_9tmOV.js rename to frontend/dist/assets/MemoryView-Bg74Wg9z.js index 5b4d60d..fa1882d 100644 --- a/frontend/dist/assets/MemoryView-Dr_9tmOV.js +++ b/frontend/dist/assets/MemoryView-Bg74Wg9z.js @@ -1,5 +1,5 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GraphView-PukEbPEW.js","assets/index-CoRdA_gp.js","assets/index-DJ-m2OOM.css"])))=>i.map(i=>d[i]); -var je=Object.defineProperty;var ke=(d,i,c)=>i in d?je(d,i,{enumerable:!0,configurable:!0,writable:!0,value:c}):d[i]=c;var J=(d,i,c)=>ke(d,typeof i!="symbol"?i+"":i,c);import{c as h,r as s,j as e,u as ve,b as Ne,O as W,Q as Se,C as X,R as Ce,S as Ee,P as Me,U as O,e as x,V as ze,W as De,X as Z,A as Y,_ as Oe,g as j}from"./index-CoRdA_gp.js";import{C as ee}from"./copy-BuUsvuS9.js";import{S as _e}from"./send-Dt2f8lfr.js";import{B as Ge}from"./book-open-x-JfOiM-.js";/** +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GraphView-4NidXPBK.js","assets/index-DCel3VuW.js","assets/index-DJ-m2OOM.css"])))=>i.map(i=>d[i]); +var je=Object.defineProperty;var ke=(d,i,c)=>i in d?je(d,i,{enumerable:!0,configurable:!0,writable:!0,value:c}):d[i]=c;var J=(d,i,c)=>ke(d,typeof i!="symbol"?i+"":i,c);import{c as h,r as s,j as e,u as ve,b as Ne,O as W,Q as Se,C as X,R as Ce,S as Ee,P as Me,U as O,e as x,V as ze,W as De,X as Z,A as Y,_ as Oe,g as j}from"./index-DCel3VuW.js";import{C as ee}from"./copy-BMmvuJ2J.js";import{S as _e}from"./send-CgygdWYO.js";import{B as Ge}from"./book-open-Dl0AmNw9.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -34,7 +34,7 @@ var je=Object.defineProperty;var ke=(d,i,c)=>i in d?je(d,i,{enumerable:!0,config * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Pe=h("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);class te extends s.Component{constructor(){super(...arguments);J(this,"state",{error:null})}static getDerivedStateFromError(c){return{error:c}}render(){return this.state.error?e.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[e.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),e.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const se=s.lazy(()=>Oe(()=>import("./GraphView-PukEbPEW.js"),__vite__mapDeps([0,1,2])).then(d=>({default:d.GraphView}))),k=["identity","knowledge","rules","events"],v=new Set(["auto","agent","hermes"]),N={identity:{label:"Identität",icon:Pe,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:De,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:Le,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:ze,bg:"bg-amber-500/10",text:"text-amber-400"}},ne={label:"Gedächtnis",icon:Ge,text:"text-muted-foreground"},Re={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},_={identity:"#00f5ff",knowledge:"#3b82f6",rules:"#d946ef",events:"#fbbf24"},ae=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: + */const Pe=h("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);class te extends s.Component{constructor(){super(...arguments);J(this,"state",{error:null})}static getDerivedStateFromError(c){return{error:c}}render(){return this.state.error?e.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[e.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),e.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const se=s.lazy(()=>Oe(()=>import("./GraphView-4NidXPBK.js"),__vite__mapDeps([0,1,2])).then(d=>({default:d.GraphView}))),k=["identity","knowledge","rules","events"],v=new Set(["auto","agent","hermes"]),N={identity:{label:"Identität",icon:Pe,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:De,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:Le,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:ze,bg:"bg-amber-500/10",text:"text-amber-400"}},ne={label:"Gedächtnis",icon:Ge,text:"text-muted-foreground"},Re={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},_={identity:"#00f5ff",knowledge:"#3b82f6",rules:"#d946ef",events:"#fbbf24"},ae=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: 1) wer ich bin und woran ich gerade arbeite, 2) wie ich angesprochen werden möchte, 3) meine bevorzugten Tools, Sprachen und Arbeitsweise, diff --git a/frontend/dist/assets/ModelsView-DTzsjlIt.js b/frontend/dist/assets/ModelsView-kzJEhvUB.js similarity index 99% rename from frontend/dist/assets/ModelsView-DTzsjlIt.js rename to frontend/dist/assets/ModelsView-kzJEhvUB.js index 92ace32..e6133b3 100644 --- a/frontend/dist/assets/ModelsView-DTzsjlIt.js +++ b/frontend/dist/assets/ModelsView-kzJEhvUB.js @@ -1,4 +1,4 @@ -import{c as q,u as oe,a as Fe,b as ge,j as e,f as ue,d as Re,e as w,g as K,q as P,h as Ie,r as N,C as Y,L as Oe,i as Pe,B as le,k as Te,E as Be,l as de,m as Ge,n as $e,o as He,p as ee,X as pe,P as Qe,H as fe,T as re,s as Ue,t as Ve,v as V,w as We,S as ye,x as Ze,y as Je,z as Xe,A as Ye,D as De,F as et,G as tt}from"./index-CoRdA_gp.js";import{C as rt}from"./code-xml-qgfASNHl.js";import{R as st}from"./rotate-ccw-BHsRFGD7.js";import{C as be,Z as ie,L as nt,a as at}from"./zap-TiNENPLo.js";import{L as ot}from"./layers-Dh094O1c.js";/** +import{c as q,u as oe,a as Fe,b as ge,j as e,f as ue,d as Re,e as w,g as K,q as P,h as Ie,r as N,C as Y,L as Oe,i as Pe,B as le,k as Te,E as Be,l as de,m as Ge,n as $e,o as He,p as ee,X as pe,P as Qe,H as fe,T as re,s as Ue,t as Ve,v as V,w as We,S as ye,x as Ze,y as Je,z as Xe,A as Ye,D as De,F as et,G as tt}from"./index-DCel3VuW.js";import{C as rt}from"./code-xml-D8KV20lN.js";import{R as st}from"./rotate-ccw-D-_Gb8HQ.js";import{C as be,Z as ie,L as nt,a as at}from"./zap-BzgvZa8u.js";import{L as ot}from"./layers-BNyHHdLg.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/SectionLabel-DLTvFJ7b.js b/frontend/dist/assets/SectionLabel-BpAZbx-8.js similarity index 93% rename from frontend/dist/assets/SectionLabel-DLTvFJ7b.js rename to frontend/dist/assets/SectionLabel-BpAZbx-8.js index bce0c5a..0bcfef3 100644 --- a/frontend/dist/assets/SectionLabel-DLTvFJ7b.js +++ b/frontend/dist/assets/SectionLabel-BpAZbx-8.js @@ -1,4 +1,4 @@ -import{c as s,j as e}from"./index-CoRdA_gp.js";/** +import{c as s,j as e}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/WissenView-BGvgpLaU.js b/frontend/dist/assets/WissenView-CrwRIwey.js similarity index 98% rename from frontend/dist/assets/WissenView-BGvgpLaU.js rename to frontend/dist/assets/WissenView-CrwRIwey.js index 86a832f..f136823 100644 --- a/frontend/dist/assets/WissenView-BGvgpLaU.js +++ b/frontend/dist/assets/WissenView-CrwRIwey.js @@ -1,4 +1,4 @@ -import{ar as y,r as x,g as L,j as e,L as v,S,ag as W,U as C,e as w,as as E}from"./index-CoRdA_gp.js";import{F as M}from"./folder-open-BoUGs9bI.js";const D={"":"Allgemein",traeume:"Träume",muster:"Muster","skill-kandidaten":"Skill-Kandidaten","skill-kandidaten/beauftragt":"Skill-Kandidaten · beauftragt","skill-kandidaten/verworfen":"Skill-Kandidaten · verworfen"};function T(){const{data:o,isLoading:h}=y(),[l,f]=x.useState(null),[d,r]=x.useState(null),[u,i]=x.useState(!1),[a,p]=x.useState(""),t=x.useMemo(()=>(o==null?void 0:o.files)??[],[o]),m=x.useMemo(()=>{const s=new Map;for(const n of t)s.set(n.name.toLowerCase(),n.path);return s},[t]),g=x.useMemo(()=>{if(!a.trim())return t;const s=a.toLowerCase();return t.filter(n=>n.title.toLowerCase().includes(s)||n.path.toLowerCase().includes(s))},[t,a]),b=x.useMemo(()=>{const s=[];for(const n of g){const c=s.find(k=>k.dir===n.dir);c?c.files.push(n):s.push({dir:n.dir,files:[n]})}return s.sort((n,c)=>n.dir===""?-1:c.dir===""?1:n.dir.localeCompare(c.dir))},[g]);x.useEffect(()=>{if(!l&&t.length){const s=t.find(n=>n.path.toLowerCase()==="index.md");f((s==null?void 0:s.path)??t[0].path)}},[t,l]),x.useEffect(()=>{l&&(i(!0),L(`/api/wissen/datei?pfad=${encodeURIComponent(l)}`).then(r).catch(()=>r({path:l,content:"*(Notiz nicht ladbar)*",mtime:0})).finally(()=>i(!1)))},[l]);const j=s=>{const n=m.get(s.toLowerCase());n&&f(n)};return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Wissen"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Was sich die Box nachts erschließt — Traum-Notizen, Muster und Skill-Ideen aus dem Wissens-Vault, verlinkt wie ein Wiki."})]}),o&&!o.available&&e.jsx("div",{className:"rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-xs text-amber-300",children:"Der Wissens-Vault liegt auf der Box (~/wissens-vault) — im lokalen Dev-Modus nicht verfügbar."}),h&&e.jsxs("div",{className:"flex items-center gap-2 rounded-2xl border border-border/60 bg-card/30 p-6 text-xs text-muted-foreground",children:[e.jsx(v,{className:"h-4 w-4 animate-spin"})," Vault wird geladen …"]}),(o==null?void 0:o.available)&&t.length===0&&e.jsx("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 text-center text-xs text-muted-foreground",children:"Noch keine Notizen. Der nächtliche Traum (03:15) legt sie an — morgen früh steht hier die erste."}),t.length>0&&e.jsxs("div",{className:"flex flex-col gap-4 lg:flex-row",children:[e.jsxs("aside",{className:"w-full shrink-0 space-y-3 lg:w-72",children:[e.jsxs("div",{className:"relative",children:[e.jsx("input",{value:a,onChange:s=>p(s.target.value),type:"search",placeholder:"Notizen durchsuchen…","aria-label":"Notizen durchsuchen",className:"h-9 w-full rounded-lg border border-border/60 bg-card/45 pl-8 pr-3 text-xs text-foreground outline-none focus:ring-1 focus:ring-primary/50"}),e.jsx(S,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),e.jsx("div",{className:"max-h-[70vh] space-y-3 overflow-y-auto pr-1 scrollbar-thin",children:b.map(({dir:s,files:n})=>e.jsxs("div",{children:[e.jsxs("p",{className:"mb-1 flex items-center gap-1 text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:[e.jsx(M,{className:"h-3 w-3"})," ",D[s]??s]}),e.jsx("div",{className:"space-y-0.5",children:n.map(c=>e.jsxs("button",{onClick:()=>f(c.path),className:w("flex w-full items-center gap-1.5 rounded-lg px-2 py-1.5 text-left text-xs transition-all cursor-pointer",l===c.path?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:[e.jsx(W,{className:"h-3.5 w-3.5 shrink-0"}),e.jsx("span",{className:"truncate",title:c.title,children:c.name}),c.neu&&e.jsxs("span",{className:"ml-auto flex items-center gap-0.5 rounded bg-violet-500/15 px-1 py-0.5 text-[8px] font-bold uppercase text-violet-300",children:[e.jsx(C,{className:"h-2.5 w-2.5"}),"neu"]})]},c.path))})]},s||"__root"))})]}),e.jsx("div",{className:"min-w-0 flex-1 mc-card p-5",children:u?e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(v,{className:"h-4 w-4 animate-spin"})," Notiz wird geladen …"]}):d?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between border-b border-border/40 pb-2",children:[e.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] text-muted-foreground",children:[e.jsx(E,{className:"h-3.5 w-3.5"})," ",d.path]}),d.mtime>0&&e.jsxs("span",{className:"text-[10px] text-muted-foreground/60",children:["Stand ",new Date(d.mtime*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e.jsx(z,{text:d.content,onWikiLink:j,known:m})]}):null})]})]})}function z({text:o,onWikiLink:h,known:l}){const f=o.split(` +import{ar as y,r as x,g as L,j as e,L as v,S,ag as W,U as C,e as w,as as E}from"./index-DCel3VuW.js";import{F as M}from"./folder-open-wGxbAB4V.js";const D={"":"Allgemein",traeume:"Träume",muster:"Muster","skill-kandidaten":"Skill-Kandidaten","skill-kandidaten/beauftragt":"Skill-Kandidaten · beauftragt","skill-kandidaten/verworfen":"Skill-Kandidaten · verworfen"};function T(){const{data:o,isLoading:h}=y(),[l,f]=x.useState(null),[d,r]=x.useState(null),[u,i]=x.useState(!1),[a,p]=x.useState(""),t=x.useMemo(()=>(o==null?void 0:o.files)??[],[o]),m=x.useMemo(()=>{const s=new Map;for(const n of t)s.set(n.name.toLowerCase(),n.path);return s},[t]),g=x.useMemo(()=>{if(!a.trim())return t;const s=a.toLowerCase();return t.filter(n=>n.title.toLowerCase().includes(s)||n.path.toLowerCase().includes(s))},[t,a]),b=x.useMemo(()=>{const s=[];for(const n of g){const c=s.find(k=>k.dir===n.dir);c?c.files.push(n):s.push({dir:n.dir,files:[n]})}return s.sort((n,c)=>n.dir===""?-1:c.dir===""?1:n.dir.localeCompare(c.dir))},[g]);x.useEffect(()=>{if(!l&&t.length){const s=t.find(n=>n.path.toLowerCase()==="index.md");f((s==null?void 0:s.path)??t[0].path)}},[t,l]),x.useEffect(()=>{l&&(i(!0),L(`/api/wissen/datei?pfad=${encodeURIComponent(l)}`).then(r).catch(()=>r({path:l,content:"*(Notiz nicht ladbar)*",mtime:0})).finally(()=>i(!1)))},[l]);const j=s=>{const n=m.get(s.toLowerCase());n&&f(n)};return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Wissen"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Was sich die Box nachts erschließt — Traum-Notizen, Muster und Skill-Ideen aus dem Wissens-Vault, verlinkt wie ein Wiki."})]}),o&&!o.available&&e.jsx("div",{className:"rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-xs text-amber-300",children:"Der Wissens-Vault liegt auf der Box (~/wissens-vault) — im lokalen Dev-Modus nicht verfügbar."}),h&&e.jsxs("div",{className:"flex items-center gap-2 rounded-2xl border border-border/60 bg-card/30 p-6 text-xs text-muted-foreground",children:[e.jsx(v,{className:"h-4 w-4 animate-spin"})," Vault wird geladen …"]}),(o==null?void 0:o.available)&&t.length===0&&e.jsx("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 text-center text-xs text-muted-foreground",children:"Noch keine Notizen. Der nächtliche Traum (03:15) legt sie an — morgen früh steht hier die erste."}),t.length>0&&e.jsxs("div",{className:"flex flex-col gap-4 lg:flex-row",children:[e.jsxs("aside",{className:"w-full shrink-0 space-y-3 lg:w-72",children:[e.jsxs("div",{className:"relative",children:[e.jsx("input",{value:a,onChange:s=>p(s.target.value),type:"search",placeholder:"Notizen durchsuchen…","aria-label":"Notizen durchsuchen",className:"h-9 w-full rounded-lg border border-border/60 bg-card/45 pl-8 pr-3 text-xs text-foreground outline-none focus:ring-1 focus:ring-primary/50"}),e.jsx(S,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),e.jsx("div",{className:"max-h-[70vh] space-y-3 overflow-y-auto pr-1 scrollbar-thin",children:b.map(({dir:s,files:n})=>e.jsxs("div",{children:[e.jsxs("p",{className:"mb-1 flex items-center gap-1 text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:[e.jsx(M,{className:"h-3 w-3"})," ",D[s]??s]}),e.jsx("div",{className:"space-y-0.5",children:n.map(c=>e.jsxs("button",{onClick:()=>f(c.path),className:w("flex w-full items-center gap-1.5 rounded-lg px-2 py-1.5 text-left text-xs transition-all cursor-pointer",l===c.path?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:[e.jsx(W,{className:"h-3.5 w-3.5 shrink-0"}),e.jsx("span",{className:"truncate",title:c.title,children:c.name}),c.neu&&e.jsxs("span",{className:"ml-auto flex items-center gap-0.5 rounded bg-violet-500/15 px-1 py-0.5 text-[8px] font-bold uppercase text-violet-300",children:[e.jsx(C,{className:"h-2.5 w-2.5"}),"neu"]})]},c.path))})]},s||"__root"))})]}),e.jsx("div",{className:"min-w-0 flex-1 mc-card p-5",children:u?e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(v,{className:"h-4 w-4 animate-spin"})," Notiz wird geladen …"]}):d?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between border-b border-border/40 pb-2",children:[e.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] text-muted-foreground",children:[e.jsx(E,{className:"h-3.5 w-3.5"})," ",d.path]}),d.mtime>0&&e.jsxs("span",{className:"text-[10px] text-muted-foreground/60",children:["Stand ",new Date(d.mtime*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e.jsx(z,{text:d.content,onWikiLink:j,known:m})]}):null})]})]})}function z({text:o,onWikiLink:h,known:l}){const f=o.split(` `),d=[];let r=[],u=null;const i=a=>{r.length&&(d.push(e.jsx("ul",{className:"mb-3 ml-4 list-disc space-y-1",children:r},a)),r=[])};return f.forEach((a,p)=>{const t=`l${p}`;if(u!==null){a.trimEnd()==="```"?(d.push(e.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px] leading-relaxed text-foreground/85",children:u.join(` `)},t)),u=null):u.push(a);return}if(a.trimStart().startsWith("```")){i(t),u=[];return}const m=a.trimEnd();if(!m.trim()){i(t);return}const g=m.match(/^(#{1,4})\s+(.*)$/);if(g){i(t);const j=g[1].length,s=j===1?"text-lg font-bold mt-1 mb-3":j===2?"text-base font-bold mt-4 mb-2":"text-sm font-bold mt-3 mb-1.5";d.push(e.jsx("p",{className:w(s,"font-space text-foreground"),children:N(g[2],h,l,t)},t));return}const b=m.match(/^\s*[-*•]\s+(.*)$/);if(b){r.push(e.jsx("li",{className:"text-xs leading-relaxed text-foreground/85",children:N(b[1],h,l,t)},t));return}i(t),d.push(e.jsx("p",{className:"mb-2 text-xs leading-relaxed text-foreground/85",children:N(m,h,l,t)},t))}),i("end"),u!==null&&d.push(e.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px]",children:u.join(` `)},"code-end")),e.jsx("div",{className:"max-w-3xl",children:d})}function N(o,h,l,f){return o.split(/(\[\[[^\]]+\]\]|\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`)/g).map((r,u)=>{const i=`${f}-${u}`,a=r.match(/^\[\[([^\]|]+)(?:\|([^\]]+))?\]\]$/);if(a){const p=a[1].trim(),t=(a[2]??a[1]).trim();return l.has(p.toLowerCase())?e.jsx("button",{onClick:()=>h(p),className:"rounded bg-primary/10 px-1 text-primary underline decoration-primary/40 underline-offset-2 hover:bg-primary/20 cursor-pointer",children:t},i):e.jsx("span",{className:"rounded bg-background/40 px-1 text-muted-foreground",title:"Notiz existiert (noch) nicht",children:t},i)}return r.startsWith("**")&&r.endsWith("**")?e.jsx("b",{className:"font-semibold text-foreground",children:r.slice(2,-2)},i):r.startsWith("*")&&r.endsWith("*")&&r.length>2?e.jsx("i",{children:r.slice(1,-1)},i):r.startsWith("`")&&r.endsWith("`")?e.jsx("code",{className:"rounded bg-background/50 px-1 font-mono text-[11px] text-teal-300",children:r.slice(1,-1)},i):e.jsx("span",{children:r},i)})}export{T as WissenView}; diff --git a/frontend/dist/assets/book-open-x-JfOiM-.js b/frontend/dist/assets/book-open-Dl0AmNw9.js similarity index 90% rename from frontend/dist/assets/book-open-x-JfOiM-.js rename to frontend/dist/assets/book-open-Dl0AmNw9.js index 7751169..d6d3430 100644 --- a/frontend/dist/assets/book-open-x-JfOiM-.js +++ b/frontend/dist/assets/book-open-Dl0AmNw9.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-CoRdA_gp.js";/** +import{c as a}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/circle-x-CSyRU1pi.js b/frontend/dist/assets/circle-x-BPOmowbC.js similarity index 89% rename from frontend/dist/assets/circle-x-CSyRU1pi.js rename to frontend/dist/assets/circle-x-BPOmowbC.js index 28d2288..66dac85 100644 --- a/frontend/dist/assets/circle-x-CSyRU1pi.js +++ b/frontend/dist/assets/circle-x-BPOmowbC.js @@ -1,4 +1,4 @@ -import{c}from"./index-CoRdA_gp.js";/** +import{c}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/code-xml-qgfASNHl.js b/frontend/dist/assets/code-xml-D8KV20lN.js similarity index 88% rename from frontend/dist/assets/code-xml-qgfASNHl.js rename to frontend/dist/assets/code-xml-D8KV20lN.js index fa2fa3a..705c470 100644 --- a/frontend/dist/assets/code-xml-qgfASNHl.js +++ b/frontend/dist/assets/code-xml-D8KV20lN.js @@ -1,4 +1,4 @@ -import{c as e}from"./index-CoRdA_gp.js";/** +import{c as e}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/copy-BuUsvuS9.js b/frontend/dist/assets/copy-BMmvuJ2J.js similarity index 90% rename from frontend/dist/assets/copy-BuUsvuS9.js rename to frontend/dist/assets/copy-BMmvuJ2J.js index 7fed54f..e70114d 100644 --- a/frontend/dist/assets/copy-BuUsvuS9.js +++ b/frontend/dist/assets/copy-BMmvuJ2J.js @@ -1,4 +1,4 @@ -import{c}from"./index-CoRdA_gp.js";/** +import{c}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/folder-open-BoUGs9bI.js b/frontend/dist/assets/folder-open-wGxbAB4V.js similarity index 90% rename from frontend/dist/assets/folder-open-BoUGs9bI.js rename to frontend/dist/assets/folder-open-wGxbAB4V.js index efb67a6..18d9d6b 100644 --- a/frontend/dist/assets/folder-open-BoUGs9bI.js +++ b/frontend/dist/assets/folder-open-wGxbAB4V.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-CoRdA_gp.js";/** +import{c as a}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/index-CoRdA_gp.js b/frontend/dist/assets/index-DCel3VuW.js similarity index 99% rename from frontend/dist/assets/index-CoRdA_gp.js rename to frontend/dist/assets/index-DCel3VuW.js index e4129ea..cae4842 100644 --- a/frontend/dist/assets/index-CoRdA_gp.js +++ b/frontend/dist/assets/index-DCel3VuW.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ModelsView-DTzsjlIt.js","assets/code-xml-qgfASNHl.js","assets/rotate-ccw-BHsRFGD7.js","assets/zap-TiNENPLo.js","assets/layers-Dh094O1c.js","assets/ConnectView-DjuUKBvu.js","assets/folder-open-BoUGs9bI.js","assets/circle-x-CSyRU1pi.js","assets/copy-BuUsvuS9.js","assets/MemoryView-Dr_9tmOV.js","assets/send-Dt2f8lfr.js","assets/book-open-x-JfOiM-.js","assets/GuideView-CbNoyHTt.js","assets/AuftragsbuchView-BZWvV2pd.js","assets/SectionLabel-DLTvFJ7b.js","assets/IdeenView-CKZJTCd1.js","assets/ChronikView-05lPMfKs.js","assets/EigenlebenView-BuEpk3oK.js","assets/WissenView-BGvgpLaU.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ModelsView-kzJEhvUB.js","assets/code-xml-D8KV20lN.js","assets/rotate-ccw-D-_Gb8HQ.js","assets/zap-BzgvZa8u.js","assets/layers-BNyHHdLg.js","assets/ConnectView-pS9nDVLn.js","assets/folder-open-wGxbAB4V.js","assets/circle-x-BPOmowbC.js","assets/copy-BMmvuJ2J.js","assets/MemoryView-Bg74Wg9z.js","assets/send-CgygdWYO.js","assets/book-open-Dl0AmNw9.js","assets/GuideView-DIZxOzg5.js","assets/AuftragsbuchView-Ba9tMOnf.js","assets/SectionLabel-BpAZbx-8.js","assets/IdeenView-CvrKo9TU.js","assets/ChronikView-B9KZGo_J.js","assets/EigenlebenView-rXqzvB3k.js","assets/WissenView-CrwRIwey.js"])))=>i.map(i=>d[i]); var ZI=Object.defineProperty;var S1=e=>{throw TypeError(e)};var JI=(e,t,r)=>t in e?ZI(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var ks=(e,t,r)=>JI(e,typeof t!="symbol"?t+"":t,r),xm=(e,t,r)=>t.has(e)||S1("Cannot "+r);var $=(e,t,r)=>(xm(e,t,"read from private field"),r?r.call(e):t.get(e)),je=(e,t,r)=>t.has(e)?S1("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),pe=(e,t,r,n)=>(xm(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),ze=(e,t,r)=>(xm(e,t,"access private method"),r);var Gc=(e,t,r,n)=>({set _(i){pe(e,t,i,r)},get _(){return $(e,t,n)}});function eM(e,t){for(var r=0;rn[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();function $g(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var bm={exports:{}},Ss={},wm={exports:{}},Le={};/** * @license React * react.production.min.js @@ -468,4 +468,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function DY(e,t){if(e){if(typeof e=="string")return hP(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?hP(e,t):void 0}}function hP(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var s=n.getBoundingClientRect(),u=s.width/n.offsetWidth;Fe(u)&&u!==o&&e(sL(u))}},[n,e,o]),i}function pP(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function zY(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(XW(),null);function Of(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var GY=y.forwardRef((e,t)=>{var r,n,i=y.useRef(null),o=y.useState({containerWidth:Of((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:Of((n=e.style)===null||n===void 0?void 0:n.height)}),s=Af(o,2),u=s[0],d=s[1],f=y.useCallback((m,v)=>{d(b=>{var S=Math.round(m),k=Math.round(v);return b.containerWidth===S&&b.containerHeight===k?b:{containerWidth:S,containerHeight:k}})},[]),h=y.useCallback(m=>{if(typeof t=="function"&&t(m),i.current!=null&&(i.current.disconnect(),i.current=null),m!=null&&typeof ResizeObserver<"u"){var v=m.getBoundingClientRect(),b=v.width,S=v.height;f(b,S);var k=P=>{var j=P[0];if(j!=null){var _=j.contentRect,O=_.width,N=_.height;f(O,N)}},E=new ResizeObserver(k);E.observe(m),i.current=E}},[t,f]);return y.useEffect(()=>()=>{var m=i.current;m!=null&&m.disconnect()},[f]),y.createElement(y.Fragment,null,y.createElement(Ou,{width:u.containerWidth,height:u.containerHeight}),y.createElement("div",Ji({ref:h},e)))}),YY=y.forwardRef((e,t)=>{var r=e.width,n=e.height,i=y.useState({containerWidth:Of(r),containerHeight:Of(n)}),o=Af(i,2),s=o[0],u=o[1],d=y.useCallback((h,m)=>{u(v=>{var b=Math.round(h),S=Math.round(m);return v.containerWidth===b&&v.containerHeight===S?v:{containerWidth:b,containerHeight:S}})},[]),f=y.useCallback(h=>{if(typeof t=="function"&&t(h),h!=null){var m=h.getBoundingClientRect(),v=m.width,b=m.height;d(v,b)}},[t,d]);return y.createElement(y.Fragment,null,y.createElement(Ou,{width:s.containerWidth,height:s.containerHeight}),y.createElement("div",Ji({ref:f},e)))}),QY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return y.createElement(y.Fragment,null,y.createElement(Ou,{width:r,height:n}),y.createElement("div",Ji({ref:t},e)))}),XY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?y.createElement(YY,Ji({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?y.createElement(QY,Ji({},e,{width:r,height:n,ref:t})):y.createElement(y.Fragment,null,y.createElement(Ou,{width:r,height:n}),y.createElement("div",Ji({ref:t},e)))});function ZY(e){return e?GY:XY}var JY=y.forwardRef((e,t)=>{var r=e.children,n=e.className,i=e.height,o=e.onClick,s=e.onContextMenu,u=e.onDoubleClick,d=e.onMouseDown,f=e.onMouseEnter,h=e.onMouseLeave,m=e.onMouseMove,v=e.onMouseUp,b=e.onTouchEnd,S=e.onTouchMove,k=e.onTouchStart,E=e.style,P=e.width,j=e.responsive,_=e.dispatchTouchEvents,O=_===void 0?!0:_,N=y.useRef(null),C=xt(),R=y.useState(null),z=Af(R,2),F=z[0],V=z[1],Q=y.useState(null),B=Af(Q,2),ue=B[0],G=B[1],le=LY(),fe=py(),de=(fe==null?void 0:fe.width)>0?fe.width:P,Y=(fe==null?void 0:fe.height)>0?fe.height:i,ae=y.useCallback(Pe=>{le(Pe),typeof t=="function"&&t(Pe),V(Pe),G(Pe),Pe!=null&&(N.current=Pe)},[le,t,V,G]),X=y.useCallback(Pe=>{C(L_(Pe)),C(Rr({handler:o,reactEvent:Pe}))},[C,o]),M=y.useCallback(Pe=>{C(Mg(Pe)),C(Rr({handler:f,reactEvent:Pe}))},[C,f]),T=y.useCallback(Pe=>{C(Pj()),C(Rr({handler:h,reactEvent:Pe}))},[C,h]),Z=y.useCallback(Pe=>{C(Mg(Pe)),C(Rr({handler:m,reactEvent:Pe}))},[C,m]),se=y.useCallback(()=>{C(H_())},[C]),te=y.useCallback(()=>{C(K_())},[C]),ce=y.useCallback(Pe=>{C(W_(Pe.key))},[C]),ge=y.useCallback(Pe=>{C(Rr({handler:s,reactEvent:Pe}))},[C,s]),_e=y.useCallback(Pe=>{C(Rr({handler:u,reactEvent:Pe}))},[C,u]),J=y.useCallback(Pe=>{C(Rr({handler:d,reactEvent:Pe}))},[C,d]),we=y.useCallback(Pe=>{C(Rr({handler:v,reactEvent:Pe}))},[C,v]),Ae=y.useCallback(Pe=>{C(Rr({handler:k,reactEvent:Pe}))},[C,k]),ne=y.useCallback(Pe=>{O&&C(G_(Pe)),C(Rr({handler:S,reactEvent:Pe}))},[C,O,S]),lt=y.useCallback(Pe=>{C(Rr({handler:b,reactEvent:Pe}))},[C,b]),$e=ZY(j);return y.createElement(qj.Provider,{value:F},y.createElement(h5.Provider,{value:ue},y.createElement($e,{width:de??(E==null?void 0:E.width),height:Y??(E==null?void 0:E.height),className:Xe("recharts-wrapper",n),style:zY({position:"relative",cursor:"default",width:de,height:Y},E),onClick:X,onContextMenu:ge,onDoubleClick:_e,onFocus:se,onBlur:te,onKeyDown:ce,onMouseDown:J,onMouseEnter:M,onMouseLeave:T,onMouseMove:Z,onMouseUp:we,onTouchEnd:lt,onTouchMove:ne,onTouchStart:Ae,ref:ae},y.createElement(qY,null),r)))}),eQ=["width","height","responsive","children","className","style","compact","title","desc"];function tQ(e,t){if(e==null)return{};var r,n,i=rQ(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,i=e.responsive,o=e.children,s=e.className,u=e.style,d=e.compact,f=e.title,h=e.desc,m=tQ(e,eQ),v=ln(m);return d?y.createElement(y.Fragment,null,y.createElement(Ou,{width:r,height:n}),y.createElement(fP,{otherAttributes:v,title:f,desc:h},o)):y.createElement(JY,{className:s,style:u,width:r,height:n,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},y.createElement(fP,{otherAttributes:v,title:f,desc:h,ref:t},y.createElement(nq,null,o)))});function Tg(){return Tg=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.createElement(cQ,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:dQ,tooltipPayloadSearcher:DW,categoricalChartProps:e,ref:t}));const hQ="rgba(130,130,150,0.14)",mv="rgba(130,130,150,0.85)";function pQ(e){if(e<=0)return 10;const t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function Z_(e,t){return`${t==="%"?Math.round(e):e>=1e3?`${(e/1e3).toFixed(1)}k`:Math.round(e).toString()}${t}`}function mQ({active:e,payload:t,unit:r,label:n}){return!e||!(t!=null&&t.length)?null:x.jsxs("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:[Number.isFinite(n)&&x.jsx("div",{className:"mb-1 border-b border-border/40 pb-1 font-mono text-[10px] text-muted-foreground/80",children:new Date(n).toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}),x.jsx("div",{className:"space-y-1",children:t.map(i=>x.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[x.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:i.color}}),x.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:i.name}),x.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:Z_(i.value,r)})]},i.dataKey))})]})}function J_({data:e,series:t,unit:r="%",yMode:n="percent",height:i=176,showTime:o=!1}){var h,m;const s=e.reduce((v,b)=>t.reduce((S,k)=>Math.max(S,Number(b[k.key])||0),v),0),u=n==="percent"?Math.min(100,Math.max(25,Math.ceil(s*1.2/25)*25)):Math.max(pQ(s*1.15),10),d=e.length>1?Number((h=e[e.length-1])==null?void 0:h.t)-Number((m=e[0])==null?void 0:m.t):0,f=v=>new Date(v).toLocaleTimeString("de-DE",d<=10*6e4?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{hour:"2-digit",minute:"2-digit"});return x.jsx("div",{style:{height:i},className:"w-full",children:x.jsx(az,{width:"100%",height:"100%",children:x.jsxs(fQ,{data:e,margin:{top:8,right:6,bottom:0,left:-12},children:[x.jsx("defs",{children:t.map(v=>x.jsxs("linearGradient",{id:`grad-${v.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[x.jsx("stop",{offset:"0%",stopColor:v.color,stopOpacity:.22}),x.jsx("stop",{offset:"100%",stopColor:v.color,stopOpacity:0})]},v.key))}),x.jsx(E_,{vertical:!1,stroke:hQ}),o?x.jsx(_g,{dataKey:"t",type:"number",domain:["dataMin","dataMax"],tickFormatter:f,tickCount:5,minTickGap:40,interval:"preserveStartEnd",axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:mv},height:18}):x.jsx(_g,{dataKey:"t",hide:!0}),x.jsx($_,{domain:[0,u],ticks:[0,u/2,u],tickFormatter:v=>Z_(v,r),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:mv}}),x.jsx(cH,{content:x.jsx(mQ,{unit:r}),cursor:{stroke:mv,strokeOpacity:.4,strokeDasharray:"3 3"}}),t.map(v=>x.jsx(D_,{type:"monotone",dataKey:v.key,name:v.label,stroke:v.color,strokeWidth:2,fill:`url(#grad-${v.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},v.key))]})})})}const eN={"1h":60,"24h":1440},gP={live:"Live","1h":"1 h","24h":"24 h"};function tN({value:e,onChange:t}){return x.jsx("div",{className:"flex rounded-lg border border-border/40 bg-background/30 p-0.5",children:Object.keys(gP).map(r=>x.jsx("button",{onClick:()=>t(r),className:Re("rounded-md px-2 py-0.5 text-[9px] font-bold uppercase tracking-wide transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:gP[r]},r))})}const vQ=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function gQ(){var h,m,v,b;const{sys:e,hist:t}=r5(),[r,n]=y.useState("live"),i=LA(r==="live"?60:eN[r],r!=="live"),o=y.useMemo(()=>{var S;return r==="live"?t:(((S=i.data)==null?void 0:S.points)??[]).map(k=>({t:k.t*1e3,cpu:k.cpu,ram:k.ram,gpu:k.gpu,disk:k.disk}))},[r,t,i.data]),s=!!(e!=null&&e.gpu&&e.gpu.busy_percent!=null&&e.gpu.gtt_used!=null&&e.gpu.gtt_total!=null),u=vQ.filter(S=>S.key!=="gpu"||s),d={cpu:(h=e==null?void 0:e.cpu)==null?void 0:h.percent,ram:(m=e==null?void 0:e.ram)==null?void 0:m.percent,gpu:s?e.gpu.busy_percent:null,disk:(v=e==null?void 0:e.disk)==null?void 0:v.percent},f={cpu:(b=e==null?void 0:e.cpu)!=null&&b.cores?`${e.cpu.cores} Cores`:"",ram:e?`${Io(e.ram.used)}/${Io(e.ram.total)} GB`:"",gpu:s?`${Io(e.gpu.gtt_used)}/${Io(e.gpu.gtt_total)} GB`:"",disk:e!=null&&e.disk?`${Io(e.disk.used)}/${Io(e.disk.total)} GB`:""};return x.jsxs("div",{className:"flex flex-col justify-between mc-card p-5",children:[x.jsxs("div",{children:[x.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[x.jsx(qP,{className:"h-4.5 w-4.5 text-primary"}),x.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),r==="live"&&x.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[x.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]}),x.jsx("div",{className:"ml-auto",children:x.jsx(tN,{value:r,onChange:n})})]}),e?x.jsxs(x.Fragment,{children:[x.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:u.map(S=>x.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[x.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:S.color}}),x.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:S.label}),x.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(d[S.key]??0),"%"]}),f[S.key]&&x.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:f[S.key]})]},S.key))}),r!=="live"&&o.length===0&&x.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:i.isLoading?"Verlauf wird geladen …":"Noch kein Verlauf — der Sammler baut die Historie gerade erst auf."}),(r==="live"||o.length>0)&&x.jsx(J_,{data:o,series:u,unit:"%",yMode:"percent",height:176,showTime:!0})]}):x.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(e==null?void 0:e.temp)&&(e.temp.cpu||e.temp.gpu)&&x.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[e.temp.cpu!=null&&x.jsxs("span",{children:["CPU Temp: ",e.temp.cpu," °C"]}),e.temp.gpu!=null&&x.jsxs("span",{children:["GPU Temp: ",e.temp.gpu," °C"]})]})]})}const yP=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function yQ(){const{data:e}=FA(),t=Y3(),[r,n]=y.useState("live"),i=LA(r==="live"?60:eN[r],r!=="live"),o=y.useMemo(()=>{var h;if(r==="live")return t;const d=((h=i.data)==null?void 0:h.points)??[],f=[];for(let m=1;mx.jsxs("div",{className:"flex items-center gap-1.5",children:[x.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:d.color}}),x.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:d.label}),x.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((s==null?void 0:s[d.key])??0)})]},d.key))})]})]}),r!=="live"&&o.length===0?x.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:i.isLoading?"Verlauf wird geladen …":"Noch kein Verlauf — der Sammler baut die Historie gerade erst auf."}):e?x.jsx(J_,{data:o,series:yP,unit:" tok/s",yMode:"auto",height:150,showTime:!0}):x.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),x.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}const Sl=[{key:"stt_ms",label:"STT",color:"#f59e0b"},{key:"vision_ms",label:"Sehen",color:"#a78bfa"},{key:"hirn_ms",label:"Hirn",color:"#2dd4bf"},{key:"gen_ms",label:"Antwort",color:"#60a5fa"}],_a=e=>e==null?"–":`${(e/1e3).toLocaleString("de-DE",{minimumFractionDigits:1,maximumFractionDigits:1})} s`;function xQ(e){const t=Math.max(0,Date.now()/1e3-e);return t<60?`vor ${Math.round(t)} s`:t<3600?`vor ${Math.round(t/60)} min`:`vor ${Math.round(t/3600)} h`}function Dg(e){return Sl.reduce((t,r)=>t+(e[r.key]??0),0)}function bQ(e){let t=null;for(const r of Sl){const n=e[r.key];n!=null&&(t==null||n>t.ms)&&(t={label:r.label,color:r.color,ms:n})}return t}function wQ({t:e,scale:t}){const r=Sl.map(n=>`${n.label} ${_a(e[n.key])}`).join(" · ")+(e.mem0_ms!=null?` (davon Mem0 ${_a(e.mem0_ms)})`:"");return x.jsxs("div",{className:"flex items-center gap-2.5",children:[x.jsx("span",{className:"w-14 shrink-0 text-right font-mono text-[10px] text-muted-foreground/60",children:xQ(e.ts)}),x.jsxs("div",{className:"relative h-4 flex-1 overflow-hidden rounded-sm bg-muted/25",title:r,children:[x.jsx("div",{className:"absolute inset-0 flex",children:Sl.map(n=>{const i=e[n.key];return!i||i<=0?null:x.jsx("div",{style:{width:`${i/t*100}%`,background:n.color},className:"h-full first:rounded-l-sm"},n.key)})}),e.error&&x.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-rose-500/15 text-[10px] font-semibold text-rose-300",children:"Fehler"})]}),x.jsx("span",{className:"w-12 shrink-0 text-right font-mono text-[11px] font-semibold tabular-nums text-foreground",children:e.error?"–":_a(Dg(e))})]})}function kQ(){const{data:e}=N3(12),t=e??[],r=Math.max(1,...t.map(o=>Dg(o))),n=t[0],i=n?bQ(n):null;return x.jsxs("div",{className:"mc-card p-5",children:[x.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[x.jsxs("div",{children:[x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx(fT,{className:"h-4.5 w-4.5 text-primary"}),x.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Latenz je Turn"}),x.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[x.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),n?x.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[x.jsx("span",{className:`font-space text-3xl font-bold tracking-tight tabular-nums ${n.error?"text-rose-400":"text-foreground"}`,children:n.error?"Fehler":_a(Dg(n))}),x.jsxs("span",{className:"text-xs text-muted-foreground",children:["letzter Turn",!n.error&&i&&x.jsxs(x.Fragment,{children:[" · Täter: ",x.jsx("span",{style:{color:i.color},className:"font-semibold",children:i.label})," ",_a(i.ms)]})]})]}):x.jsx("div",{className:"mt-2 text-xs text-muted-foreground",children:"Noch kein Voice-Turn aufgezeichnet."}),n&&!n.error&&x.jsxs("div",{className:"mt-0.5 font-mono text-[11px] text-muted-foreground/70",children:[Sl.filter(o=>n[o.key]!=null).map(o=>`${o.label} ${_a(n[o.key])}`).join(" · "),n.mem0_ms!=null&&x.jsxs("span",{className:"text-muted-foreground/50",children:[" · davon Mem0 ",_a(n.mem0_ms)]})]})]}),x.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1 pt-1",children:Sl.map(o=>x.jsxs("div",{className:"flex items-center gap-1.5",children:[x.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:o.color}}),x.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:o.label})]},o.key))})]}),t.length>0?x.jsx("div",{className:"space-y-1.5",children:t.map(o=>x.jsx(wQ,{t:o,scale:r},o.id))}):x.jsx("div",{className:"flex h-[120px] items-center justify-center px-6 text-center text-xs text-muted-foreground",children:"Sprich einmal mit Lucy — dann erscheint hier der Zeit-Wasserfall pro Turn, damit man den einen Hänger sofort sieht."}),x.jsx("div",{className:"mt-3 border-t border-border/30 pt-2 text-[10px] leading-relaxed text-muted-foreground/70",children:'„Hirn" = Zeit bis zum ersten Wort (Agent + Mem0-Suche + Modell); Tool-Runden stecken in „Antwort". Reine Telegram-Turns laufen an MC2 vorbei und erscheinen hier nicht.'})]})}const en=e=>e==null?"–":e.toLocaleString("de-DE");function SQ(e){const t=Math.max(0,Date.now()/1e3-e);return t<60?`vor ${Math.round(t)} s`:t<3600?`vor ${Math.round(t/60)} min`:`vor ${Math.round(t/3600)} h`}const EQ={passthrough:{label:"frei",tone:"text-emerald-400"},defer:{label:"wartet",tone:"text-amber-400"},soft:{label:"Savepoint",tone:"text-amber-400"},hard:{label:"STOPP",tone:"text-rose-400"}};function PQ(e){return!(e!=null&&e.est)||!(e!=null&&e.exact)?null:(e.est-e.exact)/e.exact*100}function AQ(){const{data:e}=I3();if(!(e!=null&&e.reachable))return x.jsxs("div",{className:"mc-card p-5",children:[x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx(V1,{className:"h-4.5 w-4.5 text-muted-foreground"}),x.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Wächter"})]}),x.jsxs("div",{className:"mt-3 text-xs text-muted-foreground",children:["Nicht erreichbar. Die Coding-Sitzungen laufen dann ohne Sitzungs-Bremse.",x.jsx("div",{className:"mt-1 font-mono text-[10px] text-muted-foreground/60",children:(e==null?void 0:e.error)??"keine Antwort von :8100"})]})]});const t=e.soft??0,r=e.hard??null,n=e.recent??[],i=n.find(m=>!(e.exempt_models??[]).includes(m.model)),o=(i==null?void 0:i.exact)??(i==null?void 0:i.est)??0,s=Math.max(r??t*1.2,t*1.2,o),u=Math.min(100,o/s*100),d=PQ(n.find(m=>m.est!=null&&m.exact!=null)),f=e.counters,h=r&&o>=r?"bg-rose-500":o>=t?"bg-amber-500":"bg-emerald-500";return x.jsxs("div",{className:"mc-card p-5",children:[x.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[x.jsxs("div",{children:[x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx(V1,{className:"h-4.5 w-4.5 text-primary"}),x.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Wächter"}),x.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[x.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),x.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[x.jsx("span",{className:"font-space text-3xl font-bold tracking-tight tabular-nums text-foreground",children:en(o)}),x.jsx("span",{className:"text-xs text-muted-foreground",children:"Tokens in der letzten Bau-Anfrage"})]})]}),x.jsxs("div",{className:"shrink-0 pt-1 text-right",children:[x.jsxs("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-amber-400",children:["Savepoint ab ",en(t)]}),r!=null&&x.jsxs("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-rose-400",children:["Stopp ab ",en(r)]})]})]}),x.jsxs("div",{className:"relative h-3 overflow-hidden rounded-sm bg-muted/25",children:[x.jsx("div",{className:`h-full ${h} transition-all`,style:{width:`${u}%`}}),x.jsx("div",{className:"absolute inset-y-0 w-px bg-amber-400/80",style:{left:`${Math.min(100,t/s*100)}%`},title:`Savepoint-Marke ${en(t)}`}),r!=null&&x.jsx("div",{className:"absolute inset-y-0 w-px bg-rose-400/80",style:{left:`${Math.min(100,r/s*100)}%`},title:`Harter Stopp ${en(r)}`})]}),x.jsx("div",{className:"mt-3 grid grid-cols-4 gap-2 text-center",children:[{k:"Anfragen",v:en(f==null?void 0:f.chat)},{k:"Savepoints",v:en(f==null?void 0:f.soft)},{k:"Stopps",v:en(f==null?void 0:f.hard)},{k:"Tokens ges.",v:en(f==null?void 0:f.tokens_prompt)}].map(m=>x.jsxs("div",{className:"rounded-sm bg-muted/20 py-1.5",children:[x.jsx("div",{className:"font-mono text-sm font-semibold tabular-nums text-foreground",children:m.v}),x.jsx("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground/70",children:m.k})]},m.k))}),d!=null&&x.jsxs("div",{className:"mt-3 flex items-center gap-2 rounded-sm bg-muted/15 px-2.5 py-1.5",children:[Math.abs(d)<15?x.jsx(KP,{className:"h-3.5 w-3.5 shrink-0 text-emerald-400"}):x.jsx(Mf,{className:"h-3.5 w-3.5 shrink-0 text-amber-400"}),x.jsxs("span",{className:"text-[11px] text-muted-foreground",children:["Schätzung lag"," ",x.jsxs("span",{className:Math.abs(d)<15?"font-semibold text-emerald-400":"font-semibold text-amber-400",children:[d>0?"+":"",d.toFixed(1)," %"]})," ","neben der Wahrheit — er kalibriert sich aus jeder Antwort selbst nach."]})]}),n.length>0&&x.jsx("div",{className:"mt-3 space-y-1",children:n.slice(0,5).map((m,v)=>{const b=EQ[m.action]??{label:m.action,tone:"text-muted-foreground"};return x.jsxs("div",{className:"flex items-center gap-2 text-[11px]",children:[x.jsx("span",{className:"w-14 shrink-0 text-right font-mono text-[10px] text-muted-foreground/60",children:SQ(m.t)}),x.jsx("span",{className:"w-20 shrink-0 truncate font-medium text-foreground",children:m.model||"?"}),x.jsxs("span",{className:"flex-1 font-mono tabular-nums text-muted-foreground",children:[en(m.exact??m.est),m.exact!=null&&m.est!=null&&x.jsxs("span",{className:"text-muted-foreground/50",children:[" (geschätzt ",en(m.est),")"]})]}),x.jsx("span",{className:`shrink-0 font-semibold ${b.tone}`,children:b.label})]},`${m.t}-${v}`)})}),x.jsx("div",{className:"mt-3 border-t border-border/30 pt-2 text-[10px] leading-relaxed text-muted-foreground/70",children:"Alle Coding-Agenten laufen durch den Wächter (:8100). Lucys Alltagsmodelle sind ausgenommen — ein Gespräch ist keine Bau-Sitzung und wird nie unterbrochen."})]})}const Cf=e=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:e}}));function OQ({onNavigate:e}){var de,Y,ae,X;const{data:t}=zA(),{data:r}=Jg(),{data:n}=BA(),{data:i}=R3(),{data:o}=T3(),{data:s}=D3(),{data:u}=A3(),{data:d}=O3(),f=X3(),{showAlert:h,dialogElement:m}=Zg(),v=bu(),[b,S]=y.useState({});async function k(M,T){S(Z=>({...Z,[M]:!0}));try{if(T.kind==="loadModel")await Ie(`/api/models/${encodeURIComponent(T.model)}/load`,{method:"POST"});else{const Z=await Ie("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:T.service})});Z.ok||h("Reparatur nicht ganz geklappt",(Z.err||"Unbekannter Fehler")+(T.needsSudo?` -Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}v.invalidateQueries({queryKey:De.health}),v.invalidateQueries({queryKey:De.services}),v.invalidateQueries({queryKey:De.models})}catch(Z){h("Reparatur fehlgeschlagen",String((Z==null?void 0:Z.message)||Z))}finally{S(Z=>({...Z,[M]:!1}))}}const E=((de=t==null?void 0:t.running)==null?void 0:de.length)??0,P=(r==null?void 0:r.services.filter(M=>M.ok).length)??0,j=(r==null?void 0:r.services.length)??0,_=j-P,O=(i==null?void 0:i.length)??0,N=(n?(n.os>0?1:0)+(n.engine>0?1:0)+(n.swap>0?1:0)+(n.models>0?1:0):0)+(((Y=n==null?void 0:n.components)==null?void 0:Y.filter(M=>M.update===!0).length)??0),C=u!=null&&u.available?u.open_count:0,R=d!=null&&d.available?d.items.filter(M=>M.status==="blocked").length:0,z=s?[s.gateway,s.memory,s.desktop_gateway]:[],F=z.filter(M=>M==null?void 0:M.ok).length,V=s?s.gateway.ok?s.memory.ok?s.desktop_gateway.ok?"":"Desktop-Gateway":"Gedächtnis-Leitung":"Modell-Leitung":"",Q=(ae=t==null?void 0:t.models)==null?void 0:ae.find(M=>M.role==="hermes"),B=Q!=null&&Q.name?(X=Q.name.split("/").pop())==null?void 0:X.replace(/\.gguf$/i,""):"",ue=i?i.filter(M=>["auto","agent","hermes"].includes(M.source)).length:0,G=r==null?void 0:r.services.filter(M=>!M.ok).map(M=>M.name).join(", "),le=n?[n.os>0&&"OS",n.engine>0&&"Engine",n.swap>0&&"Swap",n.models>0&&"Modelle"].filter(Boolean):[],fe=le.length>0?le.join(" + "):"";return x.jsxs("div",{className:"space-y-6",children:[x.jsxs("div",{children:[x.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Cockpit"}),x.jsx("p",{className:"text-sm text-muted-foreground",children:"Deine Box auf einen Blick — Details hinter jeder Kachel."})]}),x.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 items-start",children:[x.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[x.jsx(CQ,{verdict:f.verdict,memory:f.memory,warns:f.warns,problems:f.problems}),x.jsx(e5,{}),x.jsxs("section",{children:[x.jsx(bd,{children:"Leistung"}),x.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[x.jsx(gQ,{}),x.jsx(yQ,{})]}),x.jsx("div",{className:"mt-4",children:x.jsx(kQ,{})}),x.jsx("div",{className:"mt-4",children:x.jsx(AQ,{})})]}),x.jsxs("section",{children:[x.jsx(bd,{children:"Bereiche"}),x.jsxs("div",{className:"grid gap-4 grid-cols-2 md:grid-cols-3",children:[x.jsx(Mo,{icon:Hg,title:"Auftragsbuch",value:u!=null&&u.available?C:"—",unit:C===1?"Vorschlag":"Vorschläge",tone:u?R>0||C>0?"warn":"ok":"loading",hint:R>0?`${R} Karte${R===1?"":"n"} wartet auf deine Antwort`:C>0?`${C} offene Patches`:"Keine ausstehenden Vorschläge",onClick:()=>e("auftraege")}),x.jsx(Mo,{icon:HP,title:"Modelle",value:E,unit:"warm",tone:E>0?"ok":"muted",hint:B?`Hirn: ${B}`:"Kein Hermes-Modell geladen",onClick:()=>e("models")}),x.jsx(Mo,{icon:Wg,title:"Gedächtnis",value:i?O:"…",unit:"Notizen",tone:i?"ok":"loading",hint:i?`${O} Fakten (${ue} auto gelernt)`:"Gedächtnis-Pool laden...",onClick:()=>e("memory")}),x.jsx(Mo,{icon:If,title:"Dienste",value:r?`${P}/${j}`:"…",unit:"laufen",tone:r?_>0?"warn":"ok":"loading",hint:G?`Ausfall: ${G}`:"Alle Dienste online",onClick:()=>Cf("maintenance")}),x.jsx(Mo,{icon:Mf,title:"Updates",value:n?N>0?N:"0":"…",unit:N>0?"bereit":"aktuell",tone:n?N>0?"warn":"ok":"loading",hint:N>0?`Verfügbar: ${fe}`:"Alles auf dem neuesten Stand",onClick:()=>Cf("maintenance")}),x.jsx(Mo,{icon:Kg,title:"Verbinden",value:s?`${F}/${z.length}`:"…",unit:"Leitungen",tone:s?F===z.length?"ok":"warn":"loading",hint:V?`Gestört: ${V}`:"Hermes Desktop & IDEs bereit",onClick:()=>e("connect")})]})]})]}),x.jsxs("div",{className:"space-y-6",children:[x.jsx(jQ,{problems:f.problems,pendingCount:N,openAuftraege:C,blockedIdeen:R,busy:b,onRepair:k,onNavigate:e}),x.jsxs("section",{children:[x.jsx(bd,{children:"Anstehendes"}),x.jsx(t5,{})]}),x.jsxs("section",{children:[x.jsx(bd,{children:"Werkzeuge & Diagnose"}),x.jsx(_Q,{agent:o,svcErrors:_,onNavigate:e})]})]})]}),m]})}function bd({children:e}){return x.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function CQ({verdict:e,memory:t,warns:r,problems:n}){const i=r.length?`${r[0].label}: ${r[0].detail}${r.length>1?` (+${r.length-1} weitere)`:""}`:t.status==="full"?t.text:"Nichts Schlimmes — nur ein Hinweis.",o=n.length?`${n[0].label}: ${n[0].detail}${n.length>1?` (+${n.length-1} weitere)`:""}`:"Ein wichtiger Dienst hakt.",s={loading:{ring:"border-border/60 bg-card/45",icon:Nf,iconCls:"text-muted-foreground animate-spin",title:"Box wird geprüft …",sub:"Einen Moment."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:mT,iconCls:"text-emerald-400",title:"Box gesund",sub:"Alle wichtigen Dienste laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:Ys,iconCls:"text-amber-400",title:"Kleinigkeit an der Box",sub:i},problem:{ring:"border-red-500/50 bg-red-500/5",icon:Ys,iconCls:"text-red-400",title:"Box braucht Hilfe",sub:o}}[e],u=s.icon,d={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[t.status],f={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[t.status];return x.jsxs("div",{className:Re("flex flex-col gap-4 rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors sm:flex-row sm:items-center sm:justify-between h-full",s.ring),children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:x.jsx(u,{className:Re("h-6 w-6",s.iconCls)})}),x.jsxs("div",{className:"min-w-0",children:[x.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:s.title}),x.jsx("p",{className:"text-xs text-muted-foreground",children:s.sub})]})]}),x.jsxs("div",{className:"w-full max-w-[16rem] rounded-xl border border-border/30 bg-background/20 p-3",children:[x.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[x.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[x.jsx(pT,{className:"h-3.5 w-3.5"})," Speicher"]}),x.jsx("span",{className:Re("font-mono font-bold",d),children:t.status==="unknown"?"—":`${t.usedGb.toFixed(1)} / ${t.totalGb.toFixed(1)} GB`})]}),x.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:x.jsx("div",{className:Re("h-full rounded-full transition-all duration-500",f),style:{width:`${t.pct}%`}})})]})]})}function jQ({problems:e,pendingCount:t,openAuftraege:r,blockedIdeen:n,busy:i,onRepair:o,onNavigate:s}){const u=t>0,d=r>0,f=n>0,h=e.length===0&&!u&&!d&&!f;return x.jsx("div",{className:"h-full flex flex-col justify-between",children:h?x.jsxs("div",{className:"flex items-center gap-3 rounded-2xl border border-emerald-500/25 bg-emerald-500/5 p-4 h-full",children:[x.jsx(KP,{className:"h-5 w-5 shrink-0 text-emerald-400"}),x.jsxs("div",{children:[x.jsx("p",{className:"text-sm font-semibold text-foreground",children:"Nichts zu tun"}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Alles läuft. Du musst gerade nichts abnicken."})]})]}):x.jsxs("div",{className:"space-y-2 h-full flex flex-col justify-center",children:[e.map(m=>x.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-2xl border border-red-500/25 bg-red-500/5 p-4",children:[x.jsxs("div",{className:"flex min-w-0 items-center gap-3 w-full",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:x.jsx(m.icon,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{className:"min-w-0 flex-1",children:[x.jsx("p",{className:"text-sm font-bold text-foreground",children:m.label}),x.jsx("p",{className:"truncate text-xs text-muted-foreground",children:m.detail})]})]}),m.repair&&x.jsxs("button",{onClick:()=>m.repair&&o(m.id,m.repair),disabled:!!i[m.id],className:"flex h-9 shrink-0 items-center gap-1.5 rounded-lg border border-red-500/40 bg-red-500/10 px-3 text-[11px] font-bold uppercase tracking-wide text-red-300 transition-all hover:bg-red-500/20 cursor-pointer disabled:opacity-60 w-full sm:w-auto justify-center",children:[i[m.id]?x.jsx(Nf,{className:"h-3.5 w-3.5 animate-spin"}):x.jsx(IT,{className:"h-3.5 w-3.5"}),m.repair.label]})]},m.id)),f&&x.jsxs("button",{onClick:()=>s("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-red-500/30 bg-red-500/5 p-4 text-left transition-all hover:bg-red-500/10 cursor-pointer",children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:x.jsx(VP,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{children:[x.jsxs("p",{className:"text-sm font-bold text-foreground",children:[n," Karte",n===1?"":"n"," braucht deine Antwort"]}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Die Box hängt an einer Frage und wartet auf dich."})]})]}),x.jsx(Vo,{className:"h-4 w-4 shrink-0 text-red-300/70"})]}),d&&x.jsxs("button",{onClick:()=>s("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-primary/30 bg-primary/5 p-4 text-left transition-all hover:bg-primary/10 cursor-pointer",children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-primary/30 bg-background/30 text-primary",children:x.jsx(Hg,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{children:[x.jsxs("p",{className:"text-sm font-bold text-foreground",children:[r," Vorschl",r===1?"ag":"äge"," im Auftragsbuch"]}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Annehmen oder ablehnen."})]})]}),x.jsx(Vo,{className:"h-4 w-4 shrink-0 text-primary/70"})]}),u&&x.jsxs("button",{onClick:()=>Cf("maintenance"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-left transition-all hover:bg-amber-500/10 cursor-pointer",children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-amber-500/30 bg-background/30 text-amber-300",children:x.jsx(Mf,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{children:[x.jsxs("p",{className:"text-sm font-bold text-foreground",children:[t," Update",t===1?"":"s"," bereit"]}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Ansehen und entscheiden."})]})]}),x.jsx(Vo,{className:"h-4 w-4 shrink-0 text-amber-300/70"})]})]})})}function _Q({agent:e,svcErrors:t,onNavigate:r}){const n=[{label:"Hermes Agent",status:e?e.gateway_reachable?"Bereit":"Offline":"…",tone:e?e.gateway_reachable?"ok":"alert":"loading",action:()=>r("agent")},{label:"Konsole (Box-Shell)",status:e?e.box_console_reachable?"Bereit":"Offline":"…",tone:e?e.box_console_reachable?"ok":"warn":"loading",action:()=>r("konsole")},{label:"Systemlogs & Diagnose",status:t>0?`${t} Fehler`:"Keine Fehler",tone:t>0?"alert":"ok",action:()=>Cf("logs")},{label:"Wissens-Vault",status:"Öffnen",tone:"muted",action:()=>r("wissen")},{label:"Chronik & Zeitmaschine",status:"Öffnen",tone:"muted",action:()=>r("chronik")}];return x.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/30 p-4 space-y-3 shadow-sm",children:x.jsx("div",{className:"divide-y divide-border/20",children:n.map((i,o)=>{const s={loading:"bg-muted-foreground/45 animate-pulse",ok:"bg-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]",warn:"bg-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]",alert:"bg-red-500 shadow-[0_0_8px_rgba(239,68,68,0.4)]",muted:"bg-muted-foreground/30"}[i.tone];return x.jsxs("button",{onClick:i.action,className:"w-full py-2.5 px-1.5 flex items-center justify-between text-left hover:bg-card/45 rounded-lg transition-all group cursor-pointer text-xs",children:[x.jsx("span",{className:"text-muted-foreground group-hover:text-foreground transition-colors font-medium",children:i.label}),x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx("span",{className:Re("text-[10px] font-semibold font-mono",i.tone==="ok"?"text-emerald-400":i.tone==="warn"?"text-amber-400":i.tone==="alert"?"text-red-400":"text-muted-foreground/60"),children:i.status}),x.jsx("span",{className:Re("h-1.5 w-1.5 rounded-full",s)})]})]},o)})})})}const NQ=y.lazy(()=>un(()=>import("./ModelsView-DTzsjlIt.js"),__vite__mapDeps([0,1,2,3,4])).then(e=>({default:e.ModelsView}))),IQ=y.lazy(()=>un(()=>import("./ConnectView-DjuUKBvu.js"),__vite__mapDeps([5,6,7,8])).then(e=>({default:e.ConnectView}))),MQ=y.lazy(()=>un(()=>import("./MemoryView-Dr_9tmOV.js"),__vite__mapDeps([9,8,10,11])).then(e=>({default:e.MemoryView}))),TQ=y.lazy(()=>un(()=>import("./AgentView-DvxkXocP.js"),[]).then(e=>({default:e.AgentView}))),DQ=y.lazy(()=>un(()=>import("./KonsoleView-BlZ5qbFv.js"),[]).then(e=>({default:e.KonsoleView}))),RQ=y.lazy(()=>un(()=>import("./GuideView-CbNoyHTt.js"),__vite__mapDeps([12,11,3,4])).then(e=>({default:e.GuideView}))),$Q=y.lazy(()=>un(()=>import("./AuftragsbuchView-BZWvV2pd.js"),__vite__mapDeps([13,14])).then(e=>({default:e.AuftragsbuchView}))),LQ=y.lazy(()=>un(()=>import("./IdeenView-CKZJTCd1.js"),__vite__mapDeps([15,14,1,10,4,2])).then(e=>({default:e.IdeenView}))),zQ=y.lazy(()=>un(()=>import("./ChronikView-05lPMfKs.js"),__vite__mapDeps([16,2])).then(e=>({default:e.ChronikView}))),FQ=y.lazy(()=>un(()=>import("./EigenlebenView-BuEpk3oK.js"),__vite__mapDeps([17,11,7])).then(e=>({default:e.EigenlebenView}))),BQ=y.lazy(()=>un(()=>import("./WissenView-BGvgpLaU.js"),__vite__mapDeps([18,6])).then(e=>({default:e.WissenView})));function UQ(){return x.jsx("div",{className:"flex h-64 items-center justify-center text-muted-foreground",children:x.jsx(Nf,{className:"h-5 w-5 animate-spin","aria-label":"Lädt …"})})}const WQ=/Mac|iPhone|iPad/.test(navigator.platform);function HQ(){Q3(),P3();const[e,t]=y.useState(()=>{const k=window.location.hash.slice(1);return Go.some(E=>E.id===k)?k:"dashboard"}),r=y.useCallback(k=>{window.location.hash.slice(1)===k?t(k):window.location.hash=k},[]),[n,i]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,s]=y.useState(!1),[u,d]=y.useState(!1),[f,h]=y.useState("maintenance"),{data:m,isError:v}=$A(),{data:b}=zf();y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const k=E=>{var j;h(((j=E.detail)==null?void 0:j.tab)||"maintenance"),d(!0)};return window.addEventListener("open-system-drawer",k),()=>window.removeEventListener("open-system-drawer",k)},[]),y.useEffect(()=>{const k=E=>{var j;const P=(j=E.detail)==null?void 0:j.view;P&&r(P)};return window.addEventListener("mc-navigate",k),()=>window.removeEventListener("mc-navigate",k)},[r]),y.useEffect(()=>{const k=()=>{const E=window.location.hash.slice(1);Go.some(P=>P.id===E)&&t(E)};return window.addEventListener("hashchange",k),()=>window.removeEventListener("hashchange",k)},[]),y.useEffect(()=>{s(!1)},[e]);const S=Go.find(k=>k.id===e);return x.jsxs("div",{className:"flex h-full relative",children:[x.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none",style:{backgroundColor:"hsl(224,30%,6%)",backgroundImage:["radial-gradient(45% 40% at 12% 8%, hsl(172 72% 50% / 0.10), transparent 70%)","radial-gradient(50% 45% at 88% 92%, hsl(270 70% 60% / 0.10), transparent 70%)","radial-gradient(40% 35% at 75% 30%, hsl(239 70% 62% / 0.07), transparent 70%)"].join(", ")}}),x.jsx(FR,{onNavigate:r}),x.jsx(K3,{open:u,onClose:()=>d(!1),defaultTab:f}),x.jsx("aside",{className:Re("hidden md:flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:x.jsx(xP,{collapsed:n,onToggleCollapse:()=>{i(k=>{const E=!k;return localStorage.setItem("mc_sidebar_collapsed",E.toString()),E})},view:e,health:m,backendDown:v,sysStatus:b})}),x.jsxs("div",{className:Re("md:hidden fixed inset-0 z-50 transition-opacity duration-200",o?"opacity-100":"pointer-events-none opacity-0"),"aria-hidden":!o,children:[x.jsx("div",{className:"absolute inset-0 bg-black/60",onClick:()=>s(!1)}),x.jsx("aside",{className:Re("absolute inset-y-0 left-0 flex w-72 max-w-[85vw] flex-col border-r border-border/40 bg-[hsl(224,28%,8%)] transition-transform duration-300 ease-in-out",o?"translate-x-0":"-translate-x-full"),children:x.jsx(xP,{collapsed:!1,onClose:()=>s(!1),view:e,health:m,backendDown:v,sysStatus:b})})]}),x.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[x.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/40 px-4 md:px-6 bg-card/20 backdrop-blur-sm",children:[x.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[x.jsx("button",{onClick:()=>s(!0),className:"md:hidden p-1.5 -ml-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation öffnen",children:x.jsx(wT,{className:"h-5 w-5","aria-hidden":"true"})}),x.jsx("div",{className:"truncate text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:S.hint})]}),x.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[x.jsx(k3,{}),x.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"hidden sm:flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),x.jsxs("button",{onClick:()=>{const k=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(k)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[x.jsx(uT,{className:"h-3.5 w-3.5"}),x.jsx("span",{className:"hidden sm:inline",children:"Suchen"}),x.jsx("kbd",{className:"hidden sm:inline rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:WQ?"⌘K":"Strg+K"})]})]})]}),x.jsx("main",{className:"flex-1 overflow-y-auto p-4 md:p-6 scrollbar-thin",children:x.jsxs(y.Suspense,{fallback:x.jsx(UQ,{}),children:[e==="dashboard"&&x.jsx(OQ,{onNavigate:k=>r(k)}),e==="ideen"&&x.jsx(LQ,{}),e==="auftraege"&&x.jsx($Q,{}),e==="models"&&x.jsx(NQ,{}),e==="connect"&&x.jsx(IQ,{}),e==="memory"&&x.jsx(MQ,{}),e==="wissen"&&x.jsx(BQ,{}),e==="chronik"&&x.jsx(zQ,{}),e==="eigenleben"&&x.jsx(FQ,{}),e==="agent"&&x.jsx(TQ,{}),e==="konsole"&&x.jsx(DQ,{}),e==="guide"&&x.jsx(RQ,{})]})})]})]})}function xP({collapsed:e,onToggleCollapse:t,onClose:r,view:n,health:i,backendDown:o,sysStatus:s}){var u,d,f,h,m;return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:Re("flex items-center py-4 border-b border-border/40 shrink-0",e?"flex-col gap-3 px-2":"justify-between px-5"),children:[x.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[x.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!e&&x.jsxs("div",{className:"leading-tight",children:[x.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),x.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),t&&x.jsx("button",{onClick:t,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":e?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:e?"Maximieren":"Minimieren",children:e?x.jsx(Vo,{className:"h-4 w-4","aria-hidden":"true"}):x.jsx(aT,{className:"h-4 w-4","aria-hidden":"true"})}),r&&x.jsx("button",{onClick:r,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation schließen",children:x.jsx(wu,{className:"h-4 w-4","aria-hidden":"true"})})]}),x.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:(()=>{let v=null;return Go.map(b=>{const S=b.group!==v;return v=b.group,x.jsxs("div",{className:"space-y-1",children:[S&&(e?v!==Go[0].group&&x.jsx("div",{className:"my-3 border-t border-border/30"}):x.jsx("div",{className:"mt-5 mb-1.5 px-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground/40 first:mt-0 select-none",children:b.group})),x.jsxs("a",{href:`#${b.id}`,onClick:r,"aria-current":n===b.id?"page":void 0,className:Re("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",e?"justify-center p-2.5":"gap-3 px-3 py-2",n===b.id?e?"nav-active-collapsed":"nav-active":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:e?b.label:void 0,"aria-label":e?b.label:void 0,children:[x.jsx(b.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!e&&x.jsx("span",{className:"truncate",children:b.label})]})]},b.id)})})()}),x.jsx("div",{className:Re("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",e?"px-2 text-center":"px-5"),children:e?x.jsx("div",{className:"flex justify-center",children:x.jsx("span",{className:Re("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",o||!i?"bg-red-500":i.engine_reachable?i.brain&&!i.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500"),title:o?"Zentrale antwortet nicht — Anzeigen evtl. veraltet":i?i.engine_reachable?i.brain&&!i.brain.ready?`Hirn offline (${i.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):x.jsxs("div",{className:"space-y-2 text-left",children:[o?x.jsxs("span",{className:"flex items-center gap-2 text-red-400",children:[x.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500 animate-pulse"}),x.jsx("span",{className:"truncate",children:"Zentrale antwortet nicht"})]}):i?x.jsxs(x.Fragment,{children:[x.jsxs("span",{className:"flex items-center gap-2",children:[x.jsx("span",{className:Re("h-2 w-2 rounded-full animate-pulse",i.engine_reachable?"bg-emerald-500":"bg-amber-500")}),x.jsxs("span",{className:"truncate",children:["Engine ",i.engine_reachable?"online":"offline"]})]}),i.brain&&!i.brain.ready&&x.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${i.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[x.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),x.jsxs("span",{className:"truncate",children:["Hirn offline",i.brain.model?` (${i.brain.model})`:""]})]})]}):x.jsxs("span",{className:"flex items-center gap-2",children:[x.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",x.jsx("span",{className:"truncate",children:"Backend offline"})]}),(s==null?void 0:s.versions)&&x.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[x.jsxs("div",{className:"truncate",title:s.versions.mc2?`${s.versions.mc2.branch}-${s.versions.mc2.hash}${s.versions.mc2.dirty?"*":""} (${s.versions.mc2.date})`:"nicht gefunden",children:[x.jsx("strong",{children:"MC2:"})," ",s.versions.mc2?`${s.versions.mc2.hash}${s.versions.mc2.dirty?"*":""}`:"—"]}),x.jsxs("div",{className:"truncate",title:((u=s.versions.engine)==null?void 0:u.type)==="git"?`${s.versions.engine.branch}-${s.versions.engine.hash}${s.versions.engine.dirty?"*":""} (${s.versions.engine.date})`:((d=s.versions.engine)==null?void 0:d.version_text)||"unbekannt",children:[x.jsx("strong",{children:"Engine:"})," ",((f=s.versions.engine)==null?void 0:f.type)==="git"?`${s.versions.engine.hash}${s.versions.engine.dirty?"*":""}`:((m=(h=s.versions.engine)==null?void 0:h.version_text)==null?void 0:m.split(" ").pop())||"—"]}),x.jsxs("div",{className:"truncate",title:s.versions.hermes_agent?`${s.versions.hermes_agent.branch}-${s.versions.hermes_agent.hash}${s.versions.hermes_agent.dirty?"*":""} (${s.versions.hermes_agent.date})`:"nicht gefunden",children:[x.jsx("strong",{children:"Hermes Agent:"})," ",s.versions.hermes_agent?`${s.versions.hermes_agent.hash}${s.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]})}class KQ extends Lg.Component{constructor(){super(...arguments);ks(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?x.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:x.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[x.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),x.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),x.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const VQ=new DM({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});uM.createRoot(document.getElementById("root")).render(x.jsx(Lg.StrictMode,{children:x.jsx(KQ,{children:x.jsx(RM,{client:VQ,children:x.jsx(HQ,{})})})}));export{GQ as $,NT as A,Wg as B,KP as C,iT as D,_v as E,iX as F,BA as G,pT as H,oX as I,D3 as J,H1 as K,Nf as L,Vo as M,oT as N,R3 as O,G1 as P,eX as Q,_T as R,AT as S,Ys as T,YP as U,lT as V,Vg as W,wu as X,T3 as Y,cT as Z,un as _,M3 as a,_f as a0,JM as a1,IT as a2,qo as a3,jT as a4,Os as a5,If as a6,HP as a7,Kg as a8,bT as a9,vS as aA,$g as aB,fT as aa,A3 as ab,O3 as ac,cX as ad,Hg as ae,XQ as af,dT as ag,VP as ah,C3 as ai,vT as aj,eT as ak,ST as al,Mf as am,mT as an,j3 as ao,JQ as ap,q1 as aq,ZQ as ar,xT as as,sf as at,Lg as au,uu as av,AS as aw,B8 as ax,Ty as ay,gS as az,Zg as b,Se as c,sX as d,Re as e,Dm as f,Ie as g,rX as h,QQ as i,x as j,tT as k,zA as l,tX as m,zf as n,nX as o,lX as p,De as q,y as r,YQ as s,aX as t,bu as u,Io as v,WR as w,qP as x,ET as y,uX as z}; +Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}v.invalidateQueries({queryKey:De.health}),v.invalidateQueries({queryKey:De.services}),v.invalidateQueries({queryKey:De.models})}catch(Z){h("Reparatur fehlgeschlagen",String((Z==null?void 0:Z.message)||Z))}finally{S(Z=>({...Z,[M]:!1}))}}const E=((de=t==null?void 0:t.running)==null?void 0:de.length)??0,P=(r==null?void 0:r.services.filter(M=>M.ok).length)??0,j=(r==null?void 0:r.services.length)??0,_=j-P,O=(i==null?void 0:i.length)??0,N=(n?(n.os>0?1:0)+(n.engine>0?1:0)+(n.swap>0?1:0)+(n.models>0?1:0):0)+(((Y=n==null?void 0:n.components)==null?void 0:Y.filter(M=>M.update===!0).length)??0),C=u!=null&&u.available?u.open_count:0,R=d!=null&&d.available?d.items.filter(M=>M.status==="blocked").length:0,z=s?[s.gateway,s.memory,s.desktop_gateway]:[],F=z.filter(M=>M==null?void 0:M.ok).length,V=s?s.gateway.ok?s.memory.ok?s.desktop_gateway.ok?"":"Desktop-Gateway":"Gedächtnis-Leitung":"Modell-Leitung":"",Q=(ae=t==null?void 0:t.models)==null?void 0:ae.find(M=>M.role==="hermes"),B=Q!=null&&Q.name?(X=Q.name.split("/").pop())==null?void 0:X.replace(/\.gguf$/i,""):"",ue=i?i.filter(M=>["auto","agent","hermes"].includes(M.source)).length:0,G=r==null?void 0:r.services.filter(M=>!M.ok).map(M=>M.name).join(", "),le=n?[n.os>0&&"OS",n.engine>0&&"Engine",n.swap>0&&"Swap",n.models>0&&"Modelle"].filter(Boolean):[],fe=le.length>0?le.join(" + "):"";return x.jsxs("div",{className:"space-y-6",children:[x.jsxs("div",{children:[x.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Cockpit"}),x.jsx("p",{className:"text-sm text-muted-foreground",children:"Deine Box auf einen Blick — Details hinter jeder Kachel."})]}),x.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 items-start",children:[x.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[x.jsx(CQ,{verdict:f.verdict,memory:f.memory,warns:f.warns,problems:f.problems}),x.jsx(e5,{}),x.jsxs("section",{children:[x.jsx(bd,{children:"Leistung"}),x.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[x.jsx(gQ,{}),x.jsx(yQ,{})]}),x.jsx("div",{className:"mt-4",children:x.jsx(kQ,{})}),x.jsx("div",{className:"mt-4",children:x.jsx(AQ,{})})]}),x.jsxs("section",{children:[x.jsx(bd,{children:"Bereiche"}),x.jsxs("div",{className:"grid gap-4 grid-cols-2 md:grid-cols-3",children:[x.jsx(Mo,{icon:Hg,title:"Auftragsbuch",value:u!=null&&u.available?C:"—",unit:C===1?"Vorschlag":"Vorschläge",tone:u?R>0||C>0?"warn":"ok":"loading",hint:R>0?`${R} Karte${R===1?"":"n"} wartet auf deine Antwort`:C>0?`${C} offene Patches`:"Keine ausstehenden Vorschläge",onClick:()=>e("auftraege")}),x.jsx(Mo,{icon:HP,title:"Modelle",value:E,unit:"warm",tone:E>0?"ok":"muted",hint:B?`Hirn: ${B}`:"Kein Hermes-Modell geladen",onClick:()=>e("models")}),x.jsx(Mo,{icon:Wg,title:"Gedächtnis",value:i?O:"…",unit:"Notizen",tone:i?"ok":"loading",hint:i?`${O} Fakten (${ue} auto gelernt)`:"Gedächtnis-Pool laden...",onClick:()=>e("memory")}),x.jsx(Mo,{icon:If,title:"Dienste",value:r?`${P}/${j}`:"…",unit:"laufen",tone:r?_>0?"warn":"ok":"loading",hint:G?`Ausfall: ${G}`:"Alle Dienste online",onClick:()=>Cf("maintenance")}),x.jsx(Mo,{icon:Mf,title:"Updates",value:n?N>0?N:"0":"…",unit:N>0?"bereit":"aktuell",tone:n?N>0?"warn":"ok":"loading",hint:N>0?`Verfügbar: ${fe}`:"Alles auf dem neuesten Stand",onClick:()=>Cf("maintenance")}),x.jsx(Mo,{icon:Kg,title:"Verbinden",value:s?`${F}/${z.length}`:"…",unit:"Leitungen",tone:s?F===z.length?"ok":"warn":"loading",hint:V?`Gestört: ${V}`:"Hermes Desktop & IDEs bereit",onClick:()=>e("connect")})]})]})]}),x.jsxs("div",{className:"space-y-6",children:[x.jsx(jQ,{problems:f.problems,pendingCount:N,openAuftraege:C,blockedIdeen:R,busy:b,onRepair:k,onNavigate:e}),x.jsxs("section",{children:[x.jsx(bd,{children:"Anstehendes"}),x.jsx(t5,{})]}),x.jsxs("section",{children:[x.jsx(bd,{children:"Werkzeuge & Diagnose"}),x.jsx(_Q,{agent:o,svcErrors:_,onNavigate:e})]})]})]}),m]})}function bd({children:e}){return x.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function CQ({verdict:e,memory:t,warns:r,problems:n}){const i=r.length?`${r[0].label}: ${r[0].detail}${r.length>1?` (+${r.length-1} weitere)`:""}`:t.status==="full"?t.text:"Nichts Schlimmes — nur ein Hinweis.",o=n.length?`${n[0].label}: ${n[0].detail}${n.length>1?` (+${n.length-1} weitere)`:""}`:"Ein wichtiger Dienst hakt.",s={loading:{ring:"border-border/60 bg-card/45",icon:Nf,iconCls:"text-muted-foreground animate-spin",title:"Box wird geprüft …",sub:"Einen Moment."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:mT,iconCls:"text-emerald-400",title:"Box gesund",sub:"Alle wichtigen Dienste laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:Ys,iconCls:"text-amber-400",title:"Kleinigkeit an der Box",sub:i},problem:{ring:"border-red-500/50 bg-red-500/5",icon:Ys,iconCls:"text-red-400",title:"Box braucht Hilfe",sub:o}}[e],u=s.icon,d={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[t.status],f={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[t.status];return x.jsxs("div",{className:Re("flex flex-col gap-4 rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors sm:flex-row sm:items-center sm:justify-between h-full",s.ring),children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:x.jsx(u,{className:Re("h-6 w-6",s.iconCls)})}),x.jsxs("div",{className:"min-w-0",children:[x.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:s.title}),x.jsx("p",{className:"text-xs text-muted-foreground",children:s.sub})]})]}),x.jsxs("div",{className:"w-full max-w-[16rem] rounded-xl border border-border/30 bg-background/20 p-3",children:[x.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[x.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[x.jsx(pT,{className:"h-3.5 w-3.5"})," Speicher"]}),x.jsx("span",{className:Re("font-mono font-bold",d),children:t.status==="unknown"?"—":`${t.usedGb.toFixed(1)} / ${t.totalGb.toFixed(1)} GB`})]}),x.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:x.jsx("div",{className:Re("h-full rounded-full transition-all duration-500",f),style:{width:`${t.pct}%`}})})]})]})}function jQ({problems:e,pendingCount:t,openAuftraege:r,blockedIdeen:n,busy:i,onRepair:o,onNavigate:s}){const u=t>0,d=r>0,f=n>0,h=e.length===0&&!u&&!d&&!f;return x.jsx("div",{className:"h-full flex flex-col justify-between",children:h?x.jsxs("div",{className:"flex items-center gap-3 rounded-2xl border border-emerald-500/25 bg-emerald-500/5 p-4 h-full",children:[x.jsx(KP,{className:"h-5 w-5 shrink-0 text-emerald-400"}),x.jsxs("div",{children:[x.jsx("p",{className:"text-sm font-semibold text-foreground",children:"Nichts zu tun"}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Alles läuft. Du musst gerade nichts abnicken."})]})]}):x.jsxs("div",{className:"space-y-2 h-full flex flex-col justify-center",children:[e.map(m=>x.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-2xl border border-red-500/25 bg-red-500/5 p-4",children:[x.jsxs("div",{className:"flex min-w-0 items-center gap-3 w-full",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:x.jsx(m.icon,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{className:"min-w-0 flex-1",children:[x.jsx("p",{className:"text-sm font-bold text-foreground",children:m.label}),x.jsx("p",{className:"truncate text-xs text-muted-foreground",children:m.detail})]})]}),m.repair&&x.jsxs("button",{onClick:()=>m.repair&&o(m.id,m.repair),disabled:!!i[m.id],className:"flex h-9 shrink-0 items-center gap-1.5 rounded-lg border border-red-500/40 bg-red-500/10 px-3 text-[11px] font-bold uppercase tracking-wide text-red-300 transition-all hover:bg-red-500/20 cursor-pointer disabled:opacity-60 w-full sm:w-auto justify-center",children:[i[m.id]?x.jsx(Nf,{className:"h-3.5 w-3.5 animate-spin"}):x.jsx(IT,{className:"h-3.5 w-3.5"}),m.repair.label]})]},m.id)),f&&x.jsxs("button",{onClick:()=>s("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-red-500/30 bg-red-500/5 p-4 text-left transition-all hover:bg-red-500/10 cursor-pointer",children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:x.jsx(VP,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{children:[x.jsxs("p",{className:"text-sm font-bold text-foreground",children:[n," Karte",n===1?"":"n"," braucht deine Antwort"]}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Die Box hängt an einer Frage und wartet auf dich."})]})]}),x.jsx(Vo,{className:"h-4 w-4 shrink-0 text-red-300/70"})]}),d&&x.jsxs("button",{onClick:()=>s("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-primary/30 bg-primary/5 p-4 text-left transition-all hover:bg-primary/10 cursor-pointer",children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-primary/30 bg-background/30 text-primary",children:x.jsx(Hg,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{children:[x.jsxs("p",{className:"text-sm font-bold text-foreground",children:[r," Vorschl",r===1?"ag":"äge"," im Auftragsbuch"]}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Annehmen oder ablehnen."})]})]}),x.jsx(Vo,{className:"h-4 w-4 shrink-0 text-primary/70"})]}),u&&x.jsxs("button",{onClick:()=>Cf("maintenance"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-left transition-all hover:bg-amber-500/10 cursor-pointer",children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-amber-500/30 bg-background/30 text-amber-300",children:x.jsx(Mf,{className:"h-4.5 w-4.5"})}),x.jsxs("div",{children:[x.jsxs("p",{className:"text-sm font-bold text-foreground",children:[t," Update",t===1?"":"s"," bereit"]}),x.jsx("p",{className:"text-xs text-muted-foreground",children:"Ansehen und entscheiden."})]})]}),x.jsx(Vo,{className:"h-4 w-4 shrink-0 text-amber-300/70"})]})]})})}function _Q({agent:e,svcErrors:t,onNavigate:r}){const n=[{label:"Hermes Agent",status:e?e.gateway_reachable?"Bereit":"Offline":"…",tone:e?e.gateway_reachable?"ok":"alert":"loading",action:()=>r("agent")},{label:"Konsole (Box-Shell)",status:e?e.box_console_reachable?"Bereit":"Offline":"…",tone:e?e.box_console_reachable?"ok":"warn":"loading",action:()=>r("konsole")},{label:"Systemlogs & Diagnose",status:t>0?`${t} Fehler`:"Keine Fehler",tone:t>0?"alert":"ok",action:()=>Cf("logs")},{label:"Wissens-Vault",status:"Öffnen",tone:"muted",action:()=>r("wissen")},{label:"Chronik & Zeitmaschine",status:"Öffnen",tone:"muted",action:()=>r("chronik")}];return x.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/30 p-4 space-y-3 shadow-sm",children:x.jsx("div",{className:"divide-y divide-border/20",children:n.map((i,o)=>{const s={loading:"bg-muted-foreground/45 animate-pulse",ok:"bg-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]",warn:"bg-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]",alert:"bg-red-500 shadow-[0_0_8px_rgba(239,68,68,0.4)]",muted:"bg-muted-foreground/30"}[i.tone];return x.jsxs("button",{onClick:i.action,className:"w-full py-2.5 px-1.5 flex items-center justify-between text-left hover:bg-card/45 rounded-lg transition-all group cursor-pointer text-xs",children:[x.jsx("span",{className:"text-muted-foreground group-hover:text-foreground transition-colors font-medium",children:i.label}),x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx("span",{className:Re("text-[10px] font-semibold font-mono",i.tone==="ok"?"text-emerald-400":i.tone==="warn"?"text-amber-400":i.tone==="alert"?"text-red-400":"text-muted-foreground/60"),children:i.status}),x.jsx("span",{className:Re("h-1.5 w-1.5 rounded-full",s)})]})]},o)})})})}const NQ=y.lazy(()=>un(()=>import("./ModelsView-kzJEhvUB.js"),__vite__mapDeps([0,1,2,3,4])).then(e=>({default:e.ModelsView}))),IQ=y.lazy(()=>un(()=>import("./ConnectView-pS9nDVLn.js"),__vite__mapDeps([5,6,7,8])).then(e=>({default:e.ConnectView}))),MQ=y.lazy(()=>un(()=>import("./MemoryView-Bg74Wg9z.js"),__vite__mapDeps([9,8,10,11])).then(e=>({default:e.MemoryView}))),TQ=y.lazy(()=>un(()=>import("./AgentView-DpL99Ik0.js"),[]).then(e=>({default:e.AgentView}))),DQ=y.lazy(()=>un(()=>import("./KonsoleView-Qdl4WGOp.js"),[]).then(e=>({default:e.KonsoleView}))),RQ=y.lazy(()=>un(()=>import("./GuideView-DIZxOzg5.js"),__vite__mapDeps([12,11,3,4])).then(e=>({default:e.GuideView}))),$Q=y.lazy(()=>un(()=>import("./AuftragsbuchView-Ba9tMOnf.js"),__vite__mapDeps([13,14])).then(e=>({default:e.AuftragsbuchView}))),LQ=y.lazy(()=>un(()=>import("./IdeenView-CvrKo9TU.js"),__vite__mapDeps([15,14,1,10,4,2])).then(e=>({default:e.IdeenView}))),zQ=y.lazy(()=>un(()=>import("./ChronikView-B9KZGo_J.js"),__vite__mapDeps([16,2])).then(e=>({default:e.ChronikView}))),FQ=y.lazy(()=>un(()=>import("./EigenlebenView-rXqzvB3k.js"),__vite__mapDeps([17,11,7])).then(e=>({default:e.EigenlebenView}))),BQ=y.lazy(()=>un(()=>import("./WissenView-CrwRIwey.js"),__vite__mapDeps([18,6])).then(e=>({default:e.WissenView})));function UQ(){return x.jsx("div",{className:"flex h-64 items-center justify-center text-muted-foreground",children:x.jsx(Nf,{className:"h-5 w-5 animate-spin","aria-label":"Lädt …"})})}const WQ=/Mac|iPhone|iPad/.test(navigator.platform);function HQ(){Q3(),P3();const[e,t]=y.useState(()=>{const k=window.location.hash.slice(1);return Go.some(E=>E.id===k)?k:"dashboard"}),r=y.useCallback(k=>{window.location.hash.slice(1)===k?t(k):window.location.hash=k},[]),[n,i]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,s]=y.useState(!1),[u,d]=y.useState(!1),[f,h]=y.useState("maintenance"),{data:m,isError:v}=$A(),{data:b}=zf();y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const k=E=>{var j;h(((j=E.detail)==null?void 0:j.tab)||"maintenance"),d(!0)};return window.addEventListener("open-system-drawer",k),()=>window.removeEventListener("open-system-drawer",k)},[]),y.useEffect(()=>{const k=E=>{var j;const P=(j=E.detail)==null?void 0:j.view;P&&r(P)};return window.addEventListener("mc-navigate",k),()=>window.removeEventListener("mc-navigate",k)},[r]),y.useEffect(()=>{const k=()=>{const E=window.location.hash.slice(1);Go.some(P=>P.id===E)&&t(E)};return window.addEventListener("hashchange",k),()=>window.removeEventListener("hashchange",k)},[]),y.useEffect(()=>{s(!1)},[e]);const S=Go.find(k=>k.id===e);return x.jsxs("div",{className:"flex h-full relative",children:[x.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none",style:{backgroundColor:"hsl(224,30%,6%)",backgroundImage:["radial-gradient(45% 40% at 12% 8%, hsl(172 72% 50% / 0.10), transparent 70%)","radial-gradient(50% 45% at 88% 92%, hsl(270 70% 60% / 0.10), transparent 70%)","radial-gradient(40% 35% at 75% 30%, hsl(239 70% 62% / 0.07), transparent 70%)"].join(", ")}}),x.jsx(FR,{onNavigate:r}),x.jsx(K3,{open:u,onClose:()=>d(!1),defaultTab:f}),x.jsx("aside",{className:Re("hidden md:flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:x.jsx(xP,{collapsed:n,onToggleCollapse:()=>{i(k=>{const E=!k;return localStorage.setItem("mc_sidebar_collapsed",E.toString()),E})},view:e,health:m,backendDown:v,sysStatus:b})}),x.jsxs("div",{className:Re("md:hidden fixed inset-0 z-50 transition-opacity duration-200",o?"opacity-100":"pointer-events-none opacity-0"),"aria-hidden":!o,children:[x.jsx("div",{className:"absolute inset-0 bg-black/60",onClick:()=>s(!1)}),x.jsx("aside",{className:Re("absolute inset-y-0 left-0 flex w-72 max-w-[85vw] flex-col border-r border-border/40 bg-[hsl(224,28%,8%)] transition-transform duration-300 ease-in-out",o?"translate-x-0":"-translate-x-full"),children:x.jsx(xP,{collapsed:!1,onClose:()=>s(!1),view:e,health:m,backendDown:v,sysStatus:b})})]}),x.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[x.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/40 px-4 md:px-6 bg-card/20 backdrop-blur-sm",children:[x.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[x.jsx("button",{onClick:()=>s(!0),className:"md:hidden p-1.5 -ml-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation öffnen",children:x.jsx(wT,{className:"h-5 w-5","aria-hidden":"true"})}),x.jsx("div",{className:"truncate text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:S.hint})]}),x.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[x.jsx(k3,{}),x.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"hidden sm:flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),x.jsxs("button",{onClick:()=>{const k=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(k)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[x.jsx(uT,{className:"h-3.5 w-3.5"}),x.jsx("span",{className:"hidden sm:inline",children:"Suchen"}),x.jsx("kbd",{className:"hidden sm:inline rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:WQ?"⌘K":"Strg+K"})]})]})]}),x.jsx("main",{className:"flex-1 overflow-y-auto p-4 md:p-6 scrollbar-thin",children:x.jsxs(y.Suspense,{fallback:x.jsx(UQ,{}),children:[e==="dashboard"&&x.jsx(OQ,{onNavigate:k=>r(k)}),e==="ideen"&&x.jsx(LQ,{}),e==="auftraege"&&x.jsx($Q,{}),e==="models"&&x.jsx(NQ,{}),e==="connect"&&x.jsx(IQ,{}),e==="memory"&&x.jsx(MQ,{}),e==="wissen"&&x.jsx(BQ,{}),e==="chronik"&&x.jsx(zQ,{}),e==="eigenleben"&&x.jsx(FQ,{}),e==="agent"&&x.jsx(TQ,{}),e==="konsole"&&x.jsx(DQ,{}),e==="guide"&&x.jsx(RQ,{})]})})]})]})}function xP({collapsed:e,onToggleCollapse:t,onClose:r,view:n,health:i,backendDown:o,sysStatus:s}){var u,d,f,h,m;return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:Re("flex items-center py-4 border-b border-border/40 shrink-0",e?"flex-col gap-3 px-2":"justify-between px-5"),children:[x.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[x.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!e&&x.jsxs("div",{className:"leading-tight",children:[x.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),x.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),t&&x.jsx("button",{onClick:t,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":e?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:e?"Maximieren":"Minimieren",children:e?x.jsx(Vo,{className:"h-4 w-4","aria-hidden":"true"}):x.jsx(aT,{className:"h-4 w-4","aria-hidden":"true"})}),r&&x.jsx("button",{onClick:r,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation schließen",children:x.jsx(wu,{className:"h-4 w-4","aria-hidden":"true"})})]}),x.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:(()=>{let v=null;return Go.map(b=>{const S=b.group!==v;return v=b.group,x.jsxs("div",{className:"space-y-1",children:[S&&(e?v!==Go[0].group&&x.jsx("div",{className:"my-3 border-t border-border/30"}):x.jsx("div",{className:"mt-5 mb-1.5 px-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground/40 first:mt-0 select-none",children:b.group})),x.jsxs("a",{href:`#${b.id}`,onClick:r,"aria-current":n===b.id?"page":void 0,className:Re("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",e?"justify-center p-2.5":"gap-3 px-3 py-2",n===b.id?e?"nav-active-collapsed":"nav-active":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:e?b.label:void 0,"aria-label":e?b.label:void 0,children:[x.jsx(b.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!e&&x.jsx("span",{className:"truncate",children:b.label})]})]},b.id)})})()}),x.jsx("div",{className:Re("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",e?"px-2 text-center":"px-5"),children:e?x.jsx("div",{className:"flex justify-center",children:x.jsx("span",{className:Re("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",o||!i?"bg-red-500":i.engine_reachable?i.brain&&!i.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500"),title:o?"Zentrale antwortet nicht — Anzeigen evtl. veraltet":i?i.engine_reachable?i.brain&&!i.brain.ready?`Hirn offline (${i.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):x.jsxs("div",{className:"space-y-2 text-left",children:[o?x.jsxs("span",{className:"flex items-center gap-2 text-red-400",children:[x.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500 animate-pulse"}),x.jsx("span",{className:"truncate",children:"Zentrale antwortet nicht"})]}):i?x.jsxs(x.Fragment,{children:[x.jsxs("span",{className:"flex items-center gap-2",children:[x.jsx("span",{className:Re("h-2 w-2 rounded-full animate-pulse",i.engine_reachable?"bg-emerald-500":"bg-amber-500")}),x.jsxs("span",{className:"truncate",children:["Engine ",i.engine_reachable?"online":"offline"]})]}),i.brain&&!i.brain.ready&&x.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${i.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[x.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),x.jsxs("span",{className:"truncate",children:["Hirn offline",i.brain.model?` (${i.brain.model})`:""]})]})]}):x.jsxs("span",{className:"flex items-center gap-2",children:[x.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",x.jsx("span",{className:"truncate",children:"Backend offline"})]}),(s==null?void 0:s.versions)&&x.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[x.jsxs("div",{className:"truncate",title:s.versions.mc2?`${s.versions.mc2.branch}-${s.versions.mc2.hash}${s.versions.mc2.dirty?"*":""} (${s.versions.mc2.date})`:"nicht gefunden",children:[x.jsx("strong",{children:"MC2:"})," ",s.versions.mc2?`${s.versions.mc2.hash}${s.versions.mc2.dirty?"*":""}`:"—"]}),x.jsxs("div",{className:"truncate",title:((u=s.versions.engine)==null?void 0:u.type)==="git"?`${s.versions.engine.branch}-${s.versions.engine.hash}${s.versions.engine.dirty?"*":""} (${s.versions.engine.date})`:((d=s.versions.engine)==null?void 0:d.version_text)||"unbekannt",children:[x.jsx("strong",{children:"Engine:"})," ",((f=s.versions.engine)==null?void 0:f.type)==="git"?`${s.versions.engine.hash}${s.versions.engine.dirty?"*":""}`:((m=(h=s.versions.engine)==null?void 0:h.version_text)==null?void 0:m.split(" ").pop())||"—"]}),x.jsxs("div",{className:"truncate",title:s.versions.hermes_agent?`${s.versions.hermes_agent.branch}-${s.versions.hermes_agent.hash}${s.versions.hermes_agent.dirty?"*":""} (${s.versions.hermes_agent.date})`:"nicht gefunden",children:[x.jsx("strong",{children:"Hermes Agent:"})," ",s.versions.hermes_agent?`${s.versions.hermes_agent.hash}${s.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]})}class KQ extends Lg.Component{constructor(){super(...arguments);ks(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?x.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:x.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[x.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),x.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),x.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const VQ=new DM({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});uM.createRoot(document.getElementById("root")).render(x.jsx(Lg.StrictMode,{children:x.jsx(KQ,{children:x.jsx(RM,{client:VQ,children:x.jsx(HQ,{})})})}));export{GQ as $,NT as A,Wg as B,KP as C,iT as D,_v as E,iX as F,BA as G,pT as H,oX as I,D3 as J,H1 as K,Nf as L,Vo as M,oT as N,R3 as O,G1 as P,eX as Q,_T as R,AT as S,Ys as T,YP as U,lT as V,Vg as W,wu as X,T3 as Y,cT as Z,un as _,M3 as a,_f as a0,JM as a1,IT as a2,qo as a3,jT as a4,Os as a5,If as a6,HP as a7,Kg as a8,bT as a9,vS as aA,$g as aB,fT as aa,A3 as ab,O3 as ac,cX as ad,Hg as ae,XQ as af,dT as ag,VP as ah,C3 as ai,vT as aj,eT as ak,ST as al,Mf as am,mT as an,j3 as ao,JQ as ap,q1 as aq,ZQ as ar,xT as as,sf as at,Lg as au,uu as av,AS as aw,B8 as ax,Ty as ay,gS as az,Zg as b,Se as c,sX as d,Re as e,Dm as f,Ie as g,rX as h,QQ as i,x as j,tT as k,zA as l,tX as m,zf as n,nX as o,lX as p,De as q,y as r,YQ as s,aX as t,bu as u,Io as v,WR as w,qP as x,ET as y,uX as z}; diff --git a/frontend/dist/assets/layers-Dh094O1c.js b/frontend/dist/assets/layers-BNyHHdLg.js similarity index 91% rename from frontend/dist/assets/layers-Dh094O1c.js rename to frontend/dist/assets/layers-BNyHHdLg.js index dc4776e..4febd76 100644 --- a/frontend/dist/assets/layers-Dh094O1c.js +++ b/frontend/dist/assets/layers-BNyHHdLg.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-CoRdA_gp.js";/** +import{c as a}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/rotate-ccw-BHsRFGD7.js b/frontend/dist/assets/rotate-ccw-D-_Gb8HQ.js similarity index 88% rename from frontend/dist/assets/rotate-ccw-BHsRFGD7.js rename to frontend/dist/assets/rotate-ccw-D-_Gb8HQ.js index e19c86a..e2d72ab 100644 --- a/frontend/dist/assets/rotate-ccw-BHsRFGD7.js +++ b/frontend/dist/assets/rotate-ccw-D-_Gb8HQ.js @@ -1,4 +1,4 @@ -import{c as t}from"./index-CoRdA_gp.js";/** +import{c as t}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/send-Dt2f8lfr.js b/frontend/dist/assets/send-CgygdWYO.js similarity index 90% rename from frontend/dist/assets/send-Dt2f8lfr.js rename to frontend/dist/assets/send-CgygdWYO.js index 7971868..3c32c1b 100644 --- a/frontend/dist/assets/send-Dt2f8lfr.js +++ b/frontend/dist/assets/send-CgygdWYO.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-CoRdA_gp.js";/** +import{c as a}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/zap-TiNENPLo.js b/frontend/dist/assets/zap-BzgvZa8u.js similarity index 96% rename from frontend/dist/assets/zap-TiNENPLo.js rename to frontend/dist/assets/zap-BzgvZa8u.js index bcaabda..9e93e8c 100644 --- a/frontend/dist/assets/zap-TiNENPLo.js +++ b/frontend/dist/assets/zap-BzgvZa8u.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-CoRdA_gp.js";/** +import{c as a}from"./index-DCel3VuW.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 9cd6ae8..7128fa1 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -7,7 +7,7 @@ Mission Control 2.0 - + diff --git a/frontend/src/views/IdeenView.tsx b/frontend/src/views/IdeenView.tsx index 763caa6..c95585f 100644 --- a/frontend/src/views/IdeenView.tsx +++ b/frontend/src/views/IdeenView.tsx @@ -111,6 +111,36 @@ function IdeenSection() { } } + // Sammel-Aufräumen: fertige Karten wegräumen, ohne 18-mal auf das X zu klicken. + // Fragt vorher nach — und sagt dabei ehrlich, dass nichts gelöscht wird, sondern + // ins Kanban-Archiv wandert. Das Backend fasst ausschliesslich `done` an. + function archiveAlle(projekt: string, anzahl: number, was: string) { + showConfirm( + `${anzahl} fertige Karte${anzahl === 1 ? "" : "n"} wegräumen?`, + `${was} verschwindet aus der Liste. Gelöscht wird nichts — die Karten wandern ins ` + + `Archiv der Queue und bleiben dort lesbar. Laufende, hängende und wartende Karten ` + + `bleiben unberührt.`, + async () => { + const key = "arch:" + (projekt || "*") + setBusy((b) => ({ ...b, [key]: true })) + try { + const r = await api<{ archiviert: number; fehlgeschlagen: { titel: string }[] }>( + "/api/ideen/archivieren-alle", { method: "POST", body: JSON.stringify({ projekt }) }) + if (r.fehlgeschlagen?.length) { + showAlert("Teilweise erledigt", + `${r.archiviert} weggeräumt, ${r.fehlgeschlagen.length} nicht: ` + + r.fehlgeschlagen.map((f) => f.titel).join(", ")) + } + reload() + } catch (e: any) { + showAlert("Das hat nicht geklappt", String(e?.message || e)) + } finally { + setBusy((b) => ({ ...b, [key]: false })) + } + }, + ) + } + async function archive(id: string) { setBusy((b) => ({ ...b, [id]: true })) try { @@ -349,7 +379,9 @@ function IdeenSection() { return (
{/* Kopfzeile sagt in einem Blick, was DICH betrifft — vorher stand hier nur eine - Gesamtzahl „offen", die nichts darüber verriet, ob etwas auf dich wartet. */} + Gesamtzahl „offen", die nichts darüber verriet, ob etwas auf dich wartet. + Rechts daneben das Sammel-Aufräumen, das nur erscheint, wenn es etwas zu räumen gibt. */} +
{(() => { if (!data) return "Ideen-Queue" @@ -363,6 +395,21 @@ function IdeenSection() { return `Ideen-Queue${teile.length ? " — " + teile.join(" · ") : ""}` })()} + {(() => { + const fertig = items.filter((i) => i.status === "done").length + if (fertig === 0) return null + return ( + + ) + })()} +
0 && (
{(data?.projekte ?? []).map((p) => ( - i.projekt === p.key)} zeile={zeile} /> + i.projekt === p.key)} + zeile={zeile} onArchivAlle={archiveAlle} raeumt={!!busy["arch:" + p.key]} /> ))} {(() => { // Einzelkarten (keine Kette). Bis 25.07. eine flache Erstellzeit-Liste — bei @@ -542,10 +590,12 @@ function IdeenSection() { // Ersetzt für Ketten die flache Erstellzeit-Liste (User: „Reihenfolge komplett durcheinander"). const AKTIV_RANG: Record = { blocked: 0, running: 1, review: 2, ready: 3, triage: 4 } -function ProjektGruppe({ projekt, karten, zeile }: { +function ProjektGruppe({ projekt, karten, zeile, onArchivAlle, raeumt }: { projekt: IdeenProjekt karten: IdeenItem[] zeile: (it: IdeenItem) => React.ReactNode + onArchivAlle?: (projekt: string, anzahl: number, was: string) => void + raeumt?: boolean }) { const [zeigWartende, setZeigWartende] = useState(false) const [zeigFertige, setZeigFertige] = useState(false) @@ -583,12 +633,26 @@ function ProjektGruppe({ projekt, karten, zeile }: { )} {fertig.length > 0 && (
- +
+ + {/* Ganze abgeschlossene Kette in einem Zug wegräumen — bei fünf fertigen + Projekten waren das sonst ~18 Einzelklicks auf das X. */} + {onArchivAlle && ( + + )} +
{zeigFertige &&
    {fertig.map((it) => zeile(it))}
}
)}