Files
mission-control-v2/frontend/dist/assets/Auftraege-C5bKfsD1.js
T
HitonabiandClaude Opus 5.5 22bb8c672b phase2c: Oberflaeche heisst Homelab Orchestrator, Bereich Homelab, Anfragen gehen an die richtige Instanz
- /api/instanz: Rolle der ausliefernden Instanz, ohne Netzabfragen
- lib/instanz.ts: /api/homelab/... an die Homelab-Instanz, alles andere an die Box,
  ueber /api/partner/..., wenn die andere Instanz die Seite ausliefert
- neue Seite Homelab: Stand der zweiten Instanz (noch nicht eingerichtet / verbunden /
  antwortet nicht) und was dazukommt
- Kopfzeile, Titel und Web-Manifest mit neuem Namen; fuenfter Menuepunkt, 320 px geprueft

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 17:59:23 +02:00

2 lines
9.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{i as e,n as t,o as n,r,t as i}from"./dist-BaE5-hhJ.js";import{D as a,N as o,d as s,f as c,k as l,n as u,t as d,z as f}from"./index-DSxwfDVg.js";import{Bestaetigen as p}from"./Bestaetigen-kFure1oW.js";var m=t();function h(e,t){if(e===`os`)return{laeuft:`Ubuntu`,neu:t.count?`${t.count} ${t.count===1?`Paket`:`Pakete`}`:null};if(e===`hermes`)return{laeuft:t.installed_version?`v${t.installed_version}`:`–`,neu:t.behind?`+${t.behind.toLocaleString(`de-DE`)} Änderungen`:null};let n=e===`engine`?`b`:`v`;return{laeuft:t.installed_build==null?`–`:`${n}${t.installed_build}`,neu:t.latest_build!=null&&t.installed_build!=null&&t.latest_build>t.installed_build?`${n}${t.latest_build}`:null}}function g(e,t){return!t||t.error?null:e===`os`?typeof t.count==`number`?t.count>0:null:e===`hermes`?typeof t.behind==`number`?t.behind>0:null:t.latest_build==null||t.installed_build==null?null:t.latest_build>t.installed_build}function _(e){let t=e.trim();return/timed out|timeout|zeitüberschreitung/i.test(t)?`Konnte nicht prüfen: Die Gegenstelle hat nicht rechtzeitig geantwortet. Später klappt es meist wieder.`:/name resolution|name or service not known|network is unreachable|connection (refused|reset)|nicht erreichbar/i.test(t)?`Konnte nicht prüfen: Die Box kommt gerade nicht ins Internet.`:`Konnte nicht prüfen: ${t.length>160?`${t.slice(0,157)}…`:t}`}var v=e=>e.group===`download`||/^download\s/i.test(e.label),y=e=>e.group===`pruefen`||e.label===`Nach Updates suchen`,b=e=>o(e)&&v(e),x=[[/^download\s+(.+)$/i,`Download $1`],[/^OS-Update \(apt\)$/,`Update Betriebssystem`],[/^Engine-Update \(llama\.cpp Vulkan\)$/,`Update Motor (llama.cpp)`],[/^Router-Update \(llama-swap\)$/,`Update llama-swap`],[/^Hermes-Agent-Update$/,`Update Hermes`]],S=[[`Engine (llama.cpp)`,`Motor`],[`Router (llama-swap)`,`llama-swap`],[`Hermes-Agent`,`Hermes`],[`OS (apt)`,`Betriebssystem`]];function C(e){for(let[t,n]of x)if(t.test(e.label))return e.label.replace(t,n);return e.label.startsWith(`Alle aktualisieren`)?S.reduce((e,[t,n])=>e.split(t).join(n),e.label):e.label}function w(e){if(e<60)return`noch unter einer Minute`;let t=Math.round(e/60);if(t<60)return`noch etwa ${t} min`;let n=Math.floor(t/60),r=t%60;return r?`noch etwa ${n} h ${r} min`:`noch etwa ${n} h`}function T(e,t=Date.now()/1e3){let n=Math.max(0,t-e.started_at),r=Math.floor(n/60),i=n<60?`ein paar Sekunden`:r<60?`${r} min`:`${Math.floor(r/60)} h ${r%60} min`;return`${e.state===`queued`?`Wartet`:`Läuft`} seit ${i}`}function E(e){if(e.progress==null)return null;let t=[`${Math.round(e.progress)} %`];return e.total_bytes&&t.push(`${l(e.done_bytes??0,1)} von ${l(e.total_bytes,1)}`),e.eta_s!=null&&o(e)&&t.push(w(e.eta_s)),t.join(` · `)}function D(e){for(let t=(e.log?.length??0)-1;t>=0;t--){let n=e.log[t].trim();if(n&&!n.startsWith(`$ `))return n}return null}function O(e,t=Date.now()/1e3){let n=e.filter(o).sort((e,t)=>e.started_at-t.started_at),r=e.filter(e=>!o(e)&&t-(e.finished_at??e.started_at)<86400).sort((e,t)=>(t.finished_at??t.started_at)-(e.finished_at??e.started_at)).slice(0,3);return[...n,...r]}function k(e,t,n){if(!n)return`Nach dem Download übernimmt ${e} die Rolle „${t}“.`;let r=n.weitere.length?` Die Rolle${n.weitere.length===1?``:`n`} „${n.weitere.join(`“, „`)}“ behält es.`:``;return`Achtung: Nach dem Download übernimmt ${e} die Rolle „${t}“ und ersetzt damit ${n.name}. Das bisherige Modell bleibt auf der Platte.${r}`+(n.zwilling?` Bilder liest vorerst weiter sein Bild-Zwilling, also noch das bisherige Modell.`:``)}function A(e){return`Kurze Unterbrechung: Beim Eintragen lädt llama-swap sofort neu. Was Lucy oder OpenChamber gerade schreiben, bricht ab, und die Modelle werden neu geladen.`+(e?` Mit Rolle passiert das nach dem Download noch einmal.`:``)}var j=n(e(),1),M=r(),N={queued:{text:`Wartet`,art:`cyan`},running:{text:`Läuft`,art:`cyan`},done:{text:`Fertig`,art:`gruen`},failed:{text:`Fehler`,art:`rot`},canceled:{text:`Abgebrochen`,art:`grau`}},P={queued:`bg-cyan`,running:`bg-cyan`,done:`bg-gruen`,failed:`bg-rot`,canceled:`bg-text-3`},F=e=>a(new Date(e*1e3).toISOString());function I(e){let t=(0,m.c)(3),[n,r]=(0,j.useState)(L),i,a;return t[0]===e?(i=t[1],a=t[2]):(i=()=>{if(!e)return;let t=window.setInterval(()=>r(Date.now()/1e3),3e4);return()=>window.clearInterval(t)},a=[e],t[0]=e,t[1]=i,t[2]=a),(0,j.useEffect)(i,a),n}function L(){return Date.now()/1e3}function R(e){let t=(0,m.c)(75),{job:n,onAbbrechen:r,abbrechenGesperrt:a,ebene:s}=e,c=s===void 0?4:s,[l,d]=(0,j.useState)(!1),[h,g]=(0,j.useState)(!1),_;t[0]===n.state?_=t[1]:(_=N[n.state]??{text:n.state,art:`grau`},t[0]=n.state,t[1]=_);let y=_,x;t[2]===n?x=t[3]:(x=C(n),t[2]=n,t[3]=x);let S=x,w;t[4]===n?w=t[5]:(w=E(n),t[4]=n,t[5]=w);let O=w,k;t[6]===n?k=t[7]:(k=D(n),t[6]=n,t[7]=k);let A=k,L;t[8]===n?L=t[9]:(L=o(n),t[8]=n,t[9]=L);let R=L,z=I(R),B;t[10]!==n||t[11]!==r?(B=!!r&&b(n),t[10]=n,t[11]=r,t[12]=B):B=t[12];let V=B,H,U,W,G,K,q,J,Y;if(t[13]!==a||t[14]!==V||t[15]!==c||t[16]!==O||t[17]!==z||t[18]!==n||t[19]!==R||t[20]!==A||t[21]!==h||t[22]!==S||t[23]!==y.art||t[24]!==y.text){let e=(n.log??[]).slice(-12),r=c===3?`h3`:`h4`;J=`Auftrag: ${S}`,Y=`flex flex-col gap-2.5 rounded-xl border border-linie bg-erhaben/50 p-3.5`;let o;t[33]!==r||t[34]!==S?(o=(0,M.jsx)(r,{className:`m-0 min-w-0 text-[15px] leading-snug font-semibold break-words`,children:S}),t[33]=r,t[34]=S,t[35]=o):o=t[35];let s;t[36]!==y.art||t[37]!==y.text?(s=(0,M.jsx)(u,{art:y.art,children:y.text}),t[36]=y.art,t[37]=y.text,t[38]=s):s=t[38],t[39]!==o||t[40]!==s?(H=(0,M.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[o,s]}),t[39]=o,t[40]=s,t[41]=H):H=t[41],t[42]!==n.progress||t[43]!==n.state||t[44]!==S?(U=n.progress!=null&&(0,M.jsx)(`div`,{role:`progressbar`,"aria-label":`Fortschritt: ${S}`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(n.progress),className:`h-2 overflow-hidden rounded-full bg-linie`,children:(0,M.jsx)(`div`,{className:i(`h-full`,P[n.state]??`bg-cyan`),style:{width:`${Math.max(2,Math.min(100,n.progress))}%`}})}),t[42]=n.progress,t[43]=n.state,t[44]=S,t[45]=U):U=t[45];let l;t[46]!==O||t[47]!==z||t[48]!==n||t[49]!==R||t[50]!==y.text?(l=R?O??T(n,z):`${y.text} · ${F(n.finished_at??n.started_at)}`,t[46]=O,t[47]=z,t[48]=n,t[49]=R,t[50]=y.text,t[51]=l):l=t[51],t[52]===l?W=t[53]:(W=(0,M.jsx)(`p`,{className:`ziffern m-0 text-sm text-text-2`,children:l}),t[52]=l,t[53]=W),t[54]!==n.progress||t[55]!==n.state||t[56]!==R||t[57]!==A?(G=A&&(n.state===`failed`||R&&n.progress==null)&&(0,M.jsx)(`p`,{className:n.state===`failed`?`m-0 text-sm break-words text-rot-text`:`ziffern m-0 line-clamp-2 text-xs break-all text-text-3`,children:n.state===`failed`?`Letzte Meldung: ${A}`:A}),t[54]=n.progress,t[55]=n.state,t[56]=R,t[57]=A,t[58]=G):G=t[58],K=(V||e.length>1)&&(0,M.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[V&&(0,M.jsx)(f,{variant:`outline`,size:`sm`,disabled:a,onClick:()=>d(!0),children:`Abbrechen`}),e.length>1&&(0,M.jsx)(f,{variant:`ghost`,size:`sm`,"aria-expanded":h,onClick:()=>g(!h),children:h?`Protokoll zu`:`Protokoll`})]}),q=h&&(0,M.jsx)(`pre`,{className:`ziffern m-0 max-h-56 overflow-auto rounded-md bg-[#0b0d0f] p-2 text-xs whitespace-pre-wrap break-all text-text-2`,children:e.join(`
`)}),t[13]=a,t[14]=V,t[15]=c,t[16]=O,t[17]=z,t[18]=n,t[19]=R,t[20]=A,t[21]=h,t[22]=S,t[23]=y.art,t[24]=y.text,t[25]=H,t[26]=U,t[27]=W,t[28]=G,t[29]=K,t[30]=q,t[31]=J,t[32]=Y}else H=t[25],U=t[26],W=t[27],G=t[28],K=t[29],q=t[30],J=t[31],Y=t[32];let X;t[59]!==V||t[60]!==l||t[61]!==n||t[62]!==r||t[63]!==S?(X=V&&(0,M.jsx)(p,{offen:l,gefahr:!0,titel:`Auftrag abbrechen?`,text:v(n)?`Der ${S} stoppt. Du kannst ihn später über „Modelle selbst suchen“ neu starten.`:`„${S}“ wird abgebrochen.`,knopf:`Ja, abbrechen`,neinKnopf:`Weiterlaufen lassen`,onNein:()=>d(!1),onJa:()=>{l&&(d(!1),r?.(n))}}),t[59]=V,t[60]=l,t[61]=n,t[62]=r,t[63]=S,t[64]=X):X=t[64];let Z;return t[65]!==H||t[66]!==U||t[67]!==W||t[68]!==G||t[69]!==K||t[70]!==q||t[71]!==X||t[72]!==J||t[73]!==Y?(Z=(0,M.jsxs)(`article`,{"aria-label":J,className:Y,children:[H,U,W,G,K,q,X]}),t[65]=H,t[66]=U,t[67]=W,t[68]=G,t[69]=K,t[70]=q,t[71]=X,t[72]=J,t[73]=Y,t[74]=Z):Z=t[74],Z}function z(e){let t=(0,m.c)(17),{alsPanel:n}=e,r=n!==void 0&&n,i=c(),a=s(),o,l;if(t[0]!==a||t[1]!==r||t[2]!==i.data||t[3]!==i.error||t[4]!==i.isError){l=Symbol.for(`react.early_return_sentinel`);bb0:{let e=O(i.data?.jobs??[]);if(e.length>0){let n;t[7]!==a||t[8]!==r?(n=e=>(0,M.jsx)(R,{job:e,ebene:r?3:4,abbrechenGesperrt:a.isPending,onAbbrechen:e=>a.mutate({id:e.id,titel:C(e)})},e.id),t[7]=a,t[8]=r,t[9]=n):n=t[9],o=(0,M.jsx)(`div`,{className:`grid items-start gap-2.5 lg:grid-cols-2`,children:e.map(n)})}else if(i.isError&&!i.data){let e;t[10]===i.error.message?e=t[11]:(e=(0,M.jsxs)(`p`,{role:`alert`,className:`text-sm text-rot-text`,children:[`Die Aufträge lassen sich gerade nicht lesen: `,i.error.message]}),t[10]=i.error.message,t[11]=e),o=e}else{l=null;break bb0}}t[0]=a,t[1]=r,t[2]=i.data,t[3]=i.error,t[4]=i.isError,t[5]=o,t[6]=l}else o=t[5],l=t[6];if(l!==Symbol.for(`react.early_return_sentinel`))return l;if(r){let e;return t[12]===o?e=t[13]:(e=(0,M.jsx)(d,{titel:`Aufträge`,children:o}),t[12]=o,t[13]=e),e}let u;t[14]===Symbol.for(`react.memo_cache_sentinel`)?(u=(0,M.jsx)(`h3`,{className:`schild m-0 text-sm text-text-3`,children:`Aufträge`}),t[14]=u):u=t[14];let f;return t[15]===o?f=t[16]:(f=(0,M.jsxs)(`section`,{"aria-label":`Aufträge`,className:`flex flex-col gap-2.5`,children:[u,o]}),t[15]=o,t[16]=f),f}export{_ as a,y as i,g as n,k as o,A as r,h as s,z as t};