Files
mission-control-v2/frontend/dist/assets/Updates-BJL5TrHW.js
T
HitonabiandClaude Opus 5.5 907289d7dc umbau(boxwart): neue Oberflaeche im Cockpit-Stil (Richtung A), Werkzeuge angehoben
Drei Seiten statt zehn: Start, Updates, Modelle — am PC mit Kopfnavigation, am Handy
mit Leiste unten. Umsetzung von Mockup A („Cockpit“), vom User am 23.09. gewaehlt.

- Start: Hauptwarnleuchte + 8 Warnlampen, Rundinstrumente mit Live-Werten aus dem
  Strom (Speicher, Temperatur, Platte) und Laufzeit-Zaehlwerk, Checkliste der
  Waechter-Hinweise mit ihren Knoepfen, Flugplan (heute gelaufen / geplant), Radar-Kasten.
- Updates: Bausteine mit „Laeuft → Neu“ und Zusammenfassung, laufende Auftraege,
  Verlauf der Sonntagslaeufe (neu: GET /api/updates/verlauf), Sicherungen samt
  Zurueckspielen mit Rueckfrage.
- Modelle: Speicherbalken, Rollen Hirn/Coder/Dritte Rolle, wer die Modelle nutzt
  (7 Tage + 24 h je Stunde), Modell-Radar, weitere Eintraege, Modelle selbst suchen.
- Schubladen: Dienste mit Protokoll und Neustart, Einstellungen (HF-Zugang), Hermes-Link.
- Werkzeuge: Vite 8, React 19.3 mit React Compiler 1.0 (Babel), vitest 5, Tailwind 4.3,
  shadcn 4 (Radix) fuer Dialog/Schublade/Knopf, Schriften Barlow/Barlow Condensed/
  JetBrains Mono. Entfernt: recharts, cmdk, Kraftgraph, zustand, Inter, Space Grotesk.
- Startbuendel 115 KB gzip (Budget 140); Updates/Modelle/Schubladen laden bei Bedarf.
- 16 Oberflaechen-Tests (Instrument-Bogen, Hauptleuchte, Zeitformate, Versionen).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 21:39:07 +02:00

2 lines
14 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{a as e,c as t,f as n,i as r,s as i,t as a,u as o}from"./button-Dd8hfusv.js";import{a as s,i as c,n as l,o as u,r as d,s as f,t as p}from"./dist-CgRgLCFz.js";import{C as m,S as h,T as g,a as _,b as v,d as y,f as b,i as x,o as S,r as C,t as w,w as T,x as E}from"./index-Dd2BxC7X.js";var D=i(),O=n(o(),1),k=t();function A(e){let t=(0,D.c)(4),n;t[0]===e?n=t[1]:({...n}=e,t[0]=e,t[1]=n);let r;return t[2]===n?r=t[3]:(r=(0,k.jsx)(p,{"data-slot":`dialog`,...n}),t[2]=n,t[3]=r),r}function j(e){let t=(0,D.c)(4),n;t[0]===e?n=t[1]:({...n}=e,t[0]=e,t[1]=n);let r;return t[2]===n?r=t[3]:(r=(0,k.jsx)(u,{"data-slot":`dialog-portal`,...n}),t[2]=n,t[3]=r),r}function M(e){let t=(0,D.c)(8),n,i;t[0]===e?(n=t[1],i=t[2]):({className:n,...i}=e,t[0]=e,t[1]=n,t[2]=i);let a;t[3]===n?a=t[4]:(a=r(`fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,n),t[3]=n,t[4]=a);let o;return t[5]!==i||t[6]!==a?(o=(0,k.jsx)(s,{"data-slot":`dialog-overlay`,className:a,...i}),t[5]=i,t[6]=a,t[7]=o):o=t[7],o}function N(t){let n=(0,D.c)(15),i,o,s,c;n[0]===t?(i=n[1],o=n[2],s=n[3],c=n[4]):({className:o,children:i,showCloseButton:c,...s}=t,n[0]=t,n[1]=i,n[2]=o,n[3]=s,n[4]=c);let u=c===void 0||c,f;n[5]===Symbol.for(`react.memo_cache_sentinel`)?(f=(0,k.jsx)(M,{}),n[5]=f):f=n[5];let p;n[6]===o?p=n[7]:(p=r(`fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,o),n[6]=o,n[7]=p);let m;n[8]===u?m=n[9]:(m=u&&(0,k.jsx)(l,{"data-slot":`dialog-close`,asChild:!0,children:(0,k.jsxs)(a,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`,children:[(0,k.jsx)(e,{}),(0,k.jsx)(`span`,{className:`sr-only`,children:`Schließen`})]})}),n[8]=u,n[9]=m);let h;return n[10]!==i||n[11]!==s||n[12]!==p||n[13]!==m?(h=(0,k.jsxs)(j,{children:[f,(0,k.jsxs)(d,{"data-slot":`dialog-content`,className:p,...s,children:[i,m]})]}),n[10]=i,n[11]=s,n[12]=p,n[13]=m,n[14]=h):h=n[14],h}function P(e){let t=(0,D.c)(8),n,i;t[0]===e?(n=t[1],i=t[2]):({className:n,...i}=e,t[0]=e,t[1]=n,t[2]=i);let a;t[3]===n?a=t[4]:(a=r(`flex flex-col gap-2`,n),t[3]=n,t[4]=a);let o;return t[5]!==i||t[6]!==a?(o=(0,k.jsx)(`div`,{"data-slot":`dialog-header`,className:a,...i}),t[5]=i,t[6]=a,t[7]=o):o=t[7],o}function F(e){let t=(0,D.c)(14),n,i,o,s;t[0]===e?(n=t[1],i=t[2],o=t[3],s=t[4]):({className:i,showCloseButton:s,children:n,...o}=e,t[0]=e,t[1]=n,t[2]=i,t[3]=o,t[4]=s);let c=s!==void 0&&s,u;t[5]===i?u=t[6]:(u=r(`-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end`,i),t[5]=i,t[6]=u);let d;t[7]===c?d=t[8]:(d=c&&(0,k.jsx)(l,{asChild:!0,children:(0,k.jsx)(a,{variant:`outline`,children:`Schließen`})}),t[7]=c,t[8]=d);let f;return t[9]!==n||t[10]!==o||t[11]!==u||t[12]!==d?(f=(0,k.jsxs)(`div`,{"data-slot":`dialog-footer`,className:u,...o,children:[n,d]}),t[9]=n,t[10]=o,t[11]=u,t[12]=d,t[13]=f):f=t[13],f}function I(e){let t=(0,D.c)(8),n,i;t[0]===e?(n=t[1],i=t[2]):({className:n,...i}=e,t[0]=e,t[1]=n,t[2]=i);let a;t[3]===n?a=t[4]:(a=r(`font-heading text-base leading-none font-medium`,n),t[3]=n,t[4]=a);let o;return t[5]!==i||t[6]!==a?(o=(0,k.jsx)(f,{"data-slot":`dialog-title`,className:a,...i}),t[5]=i,t[6]=a,t[7]=o):o=t[7],o}function L(e){let t=(0,D.c)(8),n,i;t[0]===e?(n=t[1],i=t[2]):({className:n,...i}=e,t[0]=e,t[1]=n,t[2]=i);let a;t[3]===n?a=t[4]:(a=r(`text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,n),t[3]=n,t[4]=a);let o;return t[5]!==i||t[6]!==a?(o=(0,k.jsx)(c,{"data-slot":`dialog-description`,className:a,...i}),t[5]=i,t[6]=a,t[7]=o):o=t[7],o}function R(e){let t=(0,D.c)(26),{offen:n,titel:r,text:i,knopf:o,gefahr:s,onJa:c,onNein:l,children:u}=e,d;t[0]===l?d=t[1]:(d=e=>!e&&l(),t[0]=l,t[1]=d);let f;t[2]===r?f=t[3]:(f=(0,k.jsx)(I,{className:`schild text-xl`,children:r}),t[2]=r,t[3]=f);let p;t[4]===i?p=t[5]:(p=(0,k.jsx)(L,{className:`text-[15px] leading-relaxed text-text-2`,children:i}),t[4]=i,t[5]=p);let m;t[6]!==f||t[7]!==p?(m=(0,k.jsxs)(P,{children:[f,p]}),t[6]=f,t[7]=p,t[8]=m):m=t[8];let h;t[9]===l?h=t[10]:(h=(0,k.jsx)(a,{variant:`outline`,onClick:l,children:`Abbrechen`}),t[9]=l,t[10]=h);let g=s?`gefahr`:`default`,_;t[11]!==o||t[12]!==c||t[13]!==g?(_=(0,k.jsx)(a,{variant:g,onClick:c,children:o}),t[11]=o,t[12]=c,t[13]=g,t[14]=_):_=t[14];let v;t[15]!==h||t[16]!==_?(v=(0,k.jsxs)(F,{className:`gap-2 sm:gap-2`,children:[h,_]}),t[15]=h,t[16]=_,t[17]=v):v=t[17];let y;t[18]!==u||t[19]!==m||t[20]!==v?(y=(0,k.jsxs)(N,{className:`border-linie bg-panel sm:max-w-lg`,children:[m,u,v]}),t[18]=u,t[19]=m,t[20]=v,t[21]=y):y=t[21];let b;return t[22]!==n||t[23]!==d||t[24]!==y?(b=(0,k.jsx)(A,{open:n,onOpenChange:d,children:y}),t[22]=n,t[23]=d,t[24]=y,t[25]=b):b=t[25],b}var z=[{id:`os`,name:`Betriebssystem`},{id:`engine`,name:`Motor (llama.cpp)`},{id:`swap`,name:`llama-swap`},{id:`hermes`,name:`Hermes`}];function B(e){let t=(0,D.c)(29),{id:n,name:r,hatUpdate:i,onStart:o,laeuftGerade:s}=e,{data:c,isPending:l}=h(n),u;t[0]!==c||t[1]!==n?(u=C(n,c),t[0]=c,t[1]=n,t[2]=u):u=t[2];let d=u,f=i?d.neu??`neu`:null,p;t[3]!==c?.count||t[4]!==c?.summary||t[5]!==i||t[6]!==n||t[7]!==l?(p=i?c?.summary?.trim()||(n===`os`&&c?.count?`Paketliste unten in den Details.`:l?`Wird gelesen …`:``):`Aktuell.`,t[3]=c?.count,t[4]=c?.summary,t[5]=i,t[6]=n,t[7]=l,t[8]=p):p=t[8];let m=p,g;t[9]===r?g=t[10]:(g=(0,k.jsx)(`th`,{scope:`row`,className:`py-3.5 pr-4 text-left font-sans text-[15px] font-semibold`,children:r}),t[9]=r,t[10]=g);let _;t[11]===d.laeuft?_=t[12]:(_=(0,k.jsx)(`td`,{className:`ziffern py-3.5 pr-4 text-sm text-text-2`,children:d.laeuft}),t[11]=d.laeuft,t[12]=_);let v;t[13]===f?v=t[14]:(v=(0,k.jsx)(`td`,{className:`ziffern py-3.5 pr-4 text-sm`,children:f?(0,k.jsx)(`span`,{className:`text-cyan`,children:f}):(0,k.jsx)(`span`,{className:`text-text-3`,children:``})}),t[13]=f,t[14]=v);let y;t[15]===m?y=t[16]:(y=(0,k.jsx)(`td`,{className:`py-3.5 pr-4 text-sm leading-relaxed text-text-2`,children:(0,k.jsx)(`span`,{className:`line-clamp-3 whitespace-pre-line`,children:m})}),t[15]=m,t[16]=y);let b;t[17]!==i||t[18]!==s||t[19]!==o?(b=i&&(0,k.jsx)(a,{variant:`outline`,size:`sm`,onClick:o,disabled:s,children:`Aktualisieren`}),t[17]=i,t[18]=s,t[19]=o,t[20]=b):b=t[20];let x;t[21]===b?x=t[22]:(x=(0,k.jsx)(`td`,{className:`py-2.5 text-right`,children:b}),t[21]=b,t[22]=x);let S;return t[23]!==g||t[24]!==_||t[25]!==v||t[26]!==y||t[27]!==x?(S=(0,k.jsxs)(`tr`,{className:`border-t border-linie align-top`,children:[g,_,v,y,x]}),t[23]=g,t[24]=_,t[25]=v,t[26]=y,t[27]=x,t[28]=S):S=t[28],S}function V(e){let t=(0,D.c)(13),{job:n}=e,r=n.state===`done`?`gruen`:n.state===`failed`?`rot`:`cyan`,i=n.state===`done`?`Fertig`:n.state===`failed`?`Fehler`:n.state===`queued`?`Wartet`:`Läuft`,a;t[0]===n.label?a=t[1]:(a=(0,k.jsx)(`span`,{className:`text-[15px] font-semibold`,children:n.label}),t[0]=n.label,t[1]=a);let o;t[2]!==r||t[3]!==i?(o=(0,k.jsx)(x,{art:r,children:i}),t[2]=r,t[3]=i,t[4]=o):o=t[4];let s;t[5]!==a||t[6]!==o?(s=(0,k.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[a,o]}),t[5]=a,t[6]=o,t[7]=s):s=t[7];let c;t[8]===n.log?c=t[9]:(c=n.log&&n.log.length>0&&(0,k.jsx)(`pre`,{className:`ziffern max-h-40 overflow-auto rounded-md bg-[#0b0d0f] p-2 text-xs whitespace-pre-wrap text-text-2`,children:n.log.slice(-8).join(`
`)}),t[8]=n.log,t[9]=c);let l;return t[10]!==s||t[11]!==c?(l=(0,k.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-xl border border-linie bg-erhaben/50 p-3`,children:[s,c]}),t[10]=s,t[11]=c,t[12]=l):l=t[12],l}function H(e){return e.mtime?S(new Date(e.mtime*1e3).toISOString()):e.snapshot}function U(){let e=(0,D.c)(55),t=E(),n=b(),r=T(),i=v(),o=m(),s=y(),c=g(),[l,u]=(0,O.useState)(null),d;e[0]===t.data?.updates.bausteine?d=e[1]:(d=new Set(t.data?.updates.bausteine.map(J)??[]),e[0]=t.data?.updates.bausteine,e[1]=d);let f=d,p;if(e[2]!==n.data?.jobs||e[3]!==f||e[4]!==t.isPending||e[5]!==o){let r=(n.data?.jobs??[]).filter(q),i=r.some(K),s;e[7]===o?s=e[8]:(s=()=>o.mutate(`pruefen`),e[7]=o,e[8]=s);let c;e[9]!==s||e[10]!==o.isPending?(c=(0,k.jsx)(a,{variant:`outline`,onClick:s,disabled:o.isPending,children:`Nach Neuem suchen`}),e[9]=s,e[10]=o.isPending,e[11]=c):c=e[11];let l;e[12]===Symbol.for(`react.memo_cache_sentinel`)?(l=()=>u({art:`alle`}),e[12]=l):l=e[12];let d;e[13]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,k.jsx)(`p`,{className:`-mt-2 text-[15px] text-text-2`,children:`Jeden Sonntag um 04:30 automatisch. Vorher wird gesichert, danach geprüft.`}),e[13]=d):d=e[13],p=(0,k.jsxs)(w,{titel:`Updates`,rechts:(0,k.jsxs)(`div`,{className:`flex flex-wrap gap-2.5`,children:[c,(0,k.jsx)(a,{onClick:l,disabled:i||f.size===0,children:`Alles jetzt aktualisieren`})]}),children:[d,t.isPending?(0,k.jsx)(_,{text:`Updates werden gelesen …`}):(0,k.jsx)(`div`,{className:`overflow-x-auto`,children:(0,k.jsxs)(`table`,{className:`w-full min-w-[680px] border-collapse`,children:[(0,k.jsx)(`thead`,{children:(0,k.jsxs)(`tr`,{className:`schild text-left text-xs text-text-3`,children:[(0,k.jsx)(`th`,{scope:`col`,className:`pb-2 font-semibold`,children:`Baustein`}),(0,k.jsx)(`th`,{scope:`col`,className:`pb-2 font-semibold`,children:`Läuft`}),(0,k.jsx)(`th`,{scope:`col`,className:`pb-2 font-semibold`,children:`Neu`}),(0,k.jsx)(`th`,{scope:`col`,className:`pb-2 font-semibold`,children:`Was sich ändert`}),(0,k.jsx)(`th`,{scope:`col`,className:`pb-2 text-right font-semibold`,children:(0,k.jsx)(`span`,{className:`sr-only`,children:`Aktion`})})]})}),(0,k.jsx)(`tbody`,{children:z.map(e=>(0,k.jsx)(B,{id:e.id,name:e.name,hatUpdate:f.has(e.id),laeuftGerade:i,onStart:()=>o.mutate(e.id)},e.id))})]})}),r.length>0&&(0,k.jsxs)(`div`,{className:`flex flex-col gap-2.5`,children:[(0,k.jsx)(`h3`,{className:`schild text-sm text-text-3`,children:`Laufende und letzte Aufträge`}),r.slice(-3).reverse().map(G)]})]}),e[2]=n.data?.jobs,e[3]=f,e[4]=t.isPending,e[5]=o,e[6]=p}else p=e[6];let h;e[14]!==r.data||e[15]!==r.isPending?(h=(0,k.jsx)(w,{titel:`Verlauf`,children:r.data?.laeufe.length?(0,k.jsx)(`ol`,{className:`m-0 flex list-none flex-col p-0`,children:r.data.laeufe.map(W)}):(0,k.jsx)(`p`,{className:`text-[15px] text-text-2`,children:r.isPending?`Wird gelesen …`:`Noch keine Update-Läufe aufgezeichnet.`})}),e[14]=r.data,e[15]=r.isPending,e[16]=h):h=e[16];let x;e[17]===s?x=e[18]:(x=()=>s.mutate(void 0),e[17]=s,e[18]=x);let S;e[19]!==s.isPending||e[20]!==x?(S=(0,k.jsx)(a,{variant:`outline`,size:`sm`,onClick:x,disabled:s.isPending,children:`Jetzt sichern`}),e[19]=s.isPending,e[20]=x,e[21]=S):S=e[21];let C;e[22]===Symbol.for(`react.memo_cache_sentinel`)?(C=(0,k.jsx)(`p`,{className:`-mt-2 text-[15px] text-text-2`,children:`Täglich um 03:35, mit Kopie auf einem zweiten Gerät.`}),e[22]=C):C=e[22];let A;if(e[23]!==i.data?.available||e[24]!==i.data?.backups){let t;e[26]===i.data?.available?t=e[27]:(t=e=>(0,k.jsxs)(`li`,{className:`flex items-center justify-between gap-3 border-t border-linie py-2.5`,children:[(0,k.jsx)(`span`,{className:`ziffern text-sm`,children:H(e)}),(0,k.jsxs)(`span`,{className:`flex items-center gap-3`,children:[(0,k.jsxs)(`span`,{className:`ziffern text-xs text-text-3`,children:[e.size_mb.toLocaleString(`de-DE`),` MB`]}),(0,k.jsx)(a,{variant:`ghost`,size:`sm`,disabled:!i.data?.available,onClick:()=>u({art:`zurueck`,datei:e.file,zeit:H(e)}),children:`Zurückspielen`})]})]},e.file),e[26]=i.data?.available,e[27]=t),A=(i.data?.backups??[]).slice(0,5).map(t),e[23]=i.data?.available,e[24]=i.data?.backups,e[25]=A}else A=e[25];let j;e[28]===A?j=e[29]:(j=(0,k.jsx)(`ul`,{className:`m-0 flex list-none flex-col p-0`,children:A}),e[28]=A,e[29]=j);let M;e[30]!==S||e[31]!==j?(M=(0,k.jsxs)(w,{titel:`Sicherungen`,rechts:S,children:[C,j]}),e[30]=S,e[31]=j,e[32]=M):M=e[32];let N;e[33]!==h||e[34]!==M?(N=(0,k.jsxs)(`div`,{className:`grid gap-5 md:gap-6 lg:grid-cols-[minmax(0,1.4fr)_minmax(0,1fr)]`,children:[h,M]}),e[33]=h,e[34]=M,e[35]=N):N=e[35];let P=l?.art===`alle`,F;e[36]===Symbol.for(`react.memo_cache_sentinel`)?(F=()=>u(null),e[36]=F):F=e[36];let I;e[37]===o?I=e[38]:(I=()=>{o.mutate(`alle`),u(null)},e[37]=o,e[38]=I);let L;e[39]!==P||e[40]!==I?(L=(0,k.jsx)(R,{offen:P,titel:`Alles jetzt aktualisieren?`,text:`Betriebssystem, Motor, llama-swap und Hermes werden nacheinander aktualisiert. Vorher wird gesichert, danach geprüft. Lucy ist dabei ein paar Minuten nicht erreichbar.`,knopf:`Aktualisieren`,onNein:F,onJa:I}),e[39]=P,e[40]=I,e[41]=L):L=e[41];let V=l?.art===`zurueck`,U=`Die Einstellungen von Hermes und llama-swap werden auf den Stand von ${l?.art===`zurueck`?l.zeit:``} gesetzt. Vorher wird der jetzige Stand gesichert. Die Dienste starten danach neu.`,Y;e[42]===Symbol.for(`react.memo_cache_sentinel`)?(Y=()=>u(null),e[42]=Y):Y=e[42];let X;e[43]!==l||e[44]!==c?(X=()=>{l?.art===`zurueck`&&c.mutate(l.datei),u(null)},e[43]=l,e[44]=c,e[45]=X):X=e[45];let Z;e[46]!==V||e[47]!==U||e[48]!==X?(Z=(0,k.jsx)(R,{offen:V,gefahr:!0,titel:`Sicherung zurückspielen?`,text:U,knopf:`Zurückspielen`,onNein:Y,onJa:X}),e[46]=V,e[47]=U,e[48]=X,e[49]=Z):Z=e[49];let Q;return e[50]!==p||e[51]!==L||e[52]!==Z||e[53]!==N?(Q=(0,k.jsxs)(k.Fragment,{children:[p,N,L,Z]}),e[50]=p,e[51]=L,e[52]=Z,e[53]=N,e[54]=Q):Q=e[54],Q}function W(e){let t=e.status===`completed`,n=t?`gruen`:e.status===`failed`?`rot`:`cyan`;return(0,k.jsxs)(`li`,{className:`grid grid-cols-[112px_minmax(0,1fr)_auto] items-start gap-3 border-t border-linie py-3`,children:[(0,k.jsx)(`span`,{className:`ziffern text-sm text-text-3`,children:e.start?S(e.start):``}),(0,k.jsxs)(`span`,{className:`min-w-0 text-[15px]`,children:[e.job,e.fehler&&(0,k.jsx)(`span`,{className:`block text-sm text-rot-text`,children:e.fehler})]}),(0,k.jsx)(x,{art:n,children:t?`Durchgelaufen`:e.status===`failed`?`Fehlgeschlagen`:`Läuft`})]},`${e.start}-${e.job}`)}function G(e){return(0,k.jsx)(V,{job:e},e.id)}function K(e){return e.state===`running`||e.state===`queued`}function q(e){return e.group===`maintenance`}function J(e){return e.id}export{U as UpdatesSeite};