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};