FunktionBeta-Programm-Bewerbungs-Backend (öffentliches Formular → Brevo-Mail)
Neuer öffentlicher No-Auth-Endpoint `POST /api/public/beta/apply` akzeptiert das xaio-beta-Landing-Formular (Name, E-Mail, Firma, Rolle, usecase[], Vision, Erfahrung, Stunden, Referral, Consent), speichert IP + User-Agent, schickt eine Brevo-Bestätigungsmail an den Applicant und eine Admin-Notification an BETA_ADMIN_EMAIL (Fallback auf ADMIN_EMAIL). Persistiert alle Submissions für den Beta-Kohorten-Auswahlprozess.
FunktionPer-User Project-Favorites — Kollaborateure favorisieren ohne andere zu beeinflussen
Die globale `projects.is_favorite`-Spalte wurde durch eine `project_favorites`-Join-Tabelle ersetzt, gekeyt auf (user_id, project_id). Jeder Kollaborateur hat jetzt seine eigene Favoriten-Liste auf geteilten Projekten — den Stern toggeln flippt ihn nicht mehr für das ganze Team. Migration V076 zieht bestehende Owner-Favorites um und droppt die Legacy-Spalte. Der update_project-Endpoint akzeptiert Owner ODER Kollaborateur-Rolle für den Toggle.
Infrastrukturcloud-local: Management-Flyway-Migrations laufen jetzt beim Start
Das cloud-local-Startup-Skript hat Management-DB-Migrations bisher übersprungen — Developer hatten lokale Schemas auf veralteten Ständen (der „column resource_size does not exist"-Delete-Error hat das reproduziert). Das Orchestrator-Skript führt Flyway jetzt bei jedem cloud-local-Start gegen `xaio_management` aus.
FunktionPer-Message-Kebab-Popover mit Bearbeitungszeit, AI Tasks und Geänderten Dateien
Jede Assistant-Message hat jetzt rechts einen 3-Punkte-Kebab in der Action-Row. Das Popover zeigt zwei Stat-Pills (Clock + Dauer, Sparkles + verbrauchte AI Tasks mit gedämpftem Einheitenlabel), ein „· N DATEIEN" Eyebrow und bei Code-Änderungen eine Datei-Liste. Pro Datei: neutrales TS/JS/PY/CSS Sprach-Badge, Pfad, 5-Block proportionaler Add/Del-Balken, +N −N Counter; Klick öffnet den Diff inline. Leere Popovers (keine Dauer, keine Tasks, keine Dateien) verstecken den Kebab komplett. Per Portal gerendert um das Chat-Container-Overflow zu umgehen. Backend persistiert duration_ms und ai_tasks_used auf der iter-Row und ein neues commit_sha-Feld verknüpft den Turn mit seinem Auto-Commit, damit Per-File-Diffs über den bestehenden /git/commits/{sha}/diff-Endpoint geholt werden.
FunktionTelegram-Style Datums-Trenner im Chat
Nachrichten aus verschiedenen Tagen sitzen jetzt unter einem zentrierten Locale-Pill („May 1" / „1. Mai", Jahr nur wenn nicht dieses Jahr). Beim Scrollen erscheint ein schwebendes Sticky-Pill oben mit dem Datum der obersten sichtbaren Nachricht; es fadet 1,2s nach Scroll-Ende aus und versteckt sich automatisch wenn ein statisches Separator mit gleichem Datum schon sichtbar ist.
FunktionAuto-Drainende Message-Queue mit Pause + Drag-Reorder
Wird eine neue Message gesendet während ein Turn noch streamt, wird sie in die Queue gestellt statt verworfen. Der Queue-Header sitzt über dem Input als eingeklappter Pill mit [count] [Pause] [Chevron]; aufgeklappt erscheint die Liste mit Drag-Handle pro Item, „als nächstes"-Badge auf Item #0 und per-Item Remove. Wenn der aktive Turn endet, wird das oberste Queue-Item automatisch als nächster Turn dispatched — außer der User hat pausiert. Resume nach Pause draint nachträglich.
FunktionRuhiger Welcome-Screen — Inter 500 + Instrument Serif Akzent, keine gestrichelte Drop-Zone
Neue „Was willst du bauen?"-Hero in Inter 500, das letzte Wort („bauen?" / „build?") in Instrument Serif italic — der Markenmoment. Responsive 52/40/32px mit Letter-Spacing −1,6/−1,2/0px, Line-Height 1,05, Farbe #111. Subtitle 15/1,5 muted #6b7280: „Ein Prompt." (war „1 Prompt"). Die gestrichelte Drop-Zone wurde entfernt; Upload sitzt jetzt als kleiner 32×32-[+]-Button in einem 52px Footer mit Keyboard-Hint und ink-Pill Build-Button. Ein Drag-Overlay über die ganze Card mit „Datei hier loslassen" in Instrument Serif italic erscheint nur beim tatsächlichen Drag. Keyboard-Hint und Model-Picker zeigen sich erst wenn der Prompt genug Inhalt zum Bauen hat.
FunktionEchte Brevo-Friend-Einladungen mit Airbuild-styled E-Mail
Das Invite-Friends-Modal verschickt jetzt echte transaktionale Einladungs-Mails über Brevo statt einen mailto zu öffnen. Neuer POST /api/auth/referral/invite nimmt eine E-Mail-Liste plus Sprach-Hinweis (de/en), validiert + dedupliziert, holt die Referral-URL des Senders und dispatched eine handgestylte HTML-Mail pro Empfänger: warmes Off-White auf subtilem Gradient, +25-Hero mit tabular-nums, „AI Tasks" in Instrument Serif italic blue, ink-CTA, 3-Step-Block, Footer-Disclaimer. Per-Adresse Ergebnis (sent / failed / invalid) im Modal-Feedback. Soft-Cap 20 Einladungen pro Request. Counter umgestellt von completed_referrals auf total_referrals, damit der User echte Anmeldungen sieht (Label: „angemeldet" / „signed up", war irreführend „eingeladen").
FunktionVersion Control Reskin — Airbuild-Branch-Glyph, Timeline-Rail, Light-Mode Diff
Versionsverwaltung-Modal trägt jetzt das volle Airbuild-Vokabular: eigene Branch-Glyph statt GitHub-Icon, „verbunden"-Pill mit grünem Sync-Dot, „REPO"-Eyebrow mit owner/repo-Slug + Sync-Indikator, Section-Header per Spec (Chevron + Icon + Titel + Mono-Count-Pill), „aktiv"-Chip in Accent-Blau für den Current-Branch, 28×24 weiße Icon-Buttons (Pull/Refresh/Merge/Push/PR/Checkout/Delete), 1px-Timeline-Rail mit 10×10 Commit-Knoten (Accent-Blau für HEAD), Commit-Rows mit Mono-Short-Hash + 13,5/500 Titel + Author·Time und HEAD-Pill, File-Diff-Karten mit +N / −N Stats und „· Zeilen N–M"-Hunk-Headers und 4-Spalten Code-Grid (34/34/16/1fr). DiffViewer ist jetzt Light-Mode-aware.
FunktionMediathek-Redesign — 1080×720 Modal mit Suche, Segmented Tabs, neutralen Pillen
Mediathek ist jetzt ein zentriertes 1080×720 Dialog (Radius 16, weicher Airbuild-Schatten). TopBar mit Folder-Icon-Box, Titel „Medienbibliothek" Geist 14/600 plus Mono-Sublabel „· N DATEIEN · 292 KB", 220px-Suchfeld mit ⌘K-Hint-Pill, „Von URL"-Ghost-Button und ink-Primary „Hochladen". Segmented Tabs mit Mono-2-stelligem Counter; leere Tabs dimmen auf muted-soft. Asset-Grid mit repeat(auto-fill, minmax(180,1fr)) bei 14px Gap und translateY(−1px) on Hover. Pills (public / private / generated) umgestellt von satten Solids auf neutrale Mono-Outline. Neuer Footer mit LIMITS-Eyebrow und STRG+V-Kbd-Hint. ⌘K fokussiert die Suche; Filter live.
FunktionTeam-Modal-Redesign — Owner-Mono-Tag, Role-Select, Zwei-Schritt-Entfernen
Team-Panel neu als 680px-Modal per Spec. Header mit Users-Icon-Bubble, Titel „Team" und Mono-Sublabel „· N MITGLIEDER". Inline-Einladungs-Zeile akzeptiert Komma-getrennte Adressen (Split + Dedup + RFC-light Validate + Parallel-POST), zeigt Per-Adresse Erfolg/Fehler. Member-Rows mit 36px Avatar (oder Accent-Blau-Initial), Name/E-Mail/„DU"-Tag; Owner kriegt einen Non-Clickable INHABER-Mono-Tag mit Krone, alle anderen einen 28px-RoleSelect-Popover (Bearbeiten / Nur ansehen mit Beschreibungen, Trenner, rotes „Aus Team entfernen"). Entfernen läuft jetzt über einen Confirm-Dialog mit explicit Pre-Checks (keine projectUuid, fehlende Berechtigung, Owner-Schutz, Self-Schutz) und sichtbaren HTTP-Fehlern. RoleSelect-Popover via Portal damit Modal-Overflow nicht clipped.
FunktionSecrets in Assistant-Messages werden jetzt maskiert + Klick-zum-Kopieren
Wenn das Modell mit einem API-Key, Passwort, Database-URL, Bearer-Token oder anderem erkannten Secret-Pattern antwortet, wird es jetzt inline als das gleiche amber Shield-Icon-Pill wie bei User-Eingaben gerendert — maskiert auf erste6...letzte3 mit Env-Var-Name in Klammern. Klick kopiert den Original-Wert mit 1,2s „Kopiert"-Bestätigung. Hookt sich in jedes Text-Tag (p, li, h1-h6, strong, em, blockquote, td/th, inline code, Link) plus Plain-Text. Block-Code bleibt unangetastet damit Multi-Line-Snippets lesbar bleiben.
FunktionSidebar zeigt den eigenen User im Team-Avatar-Stack
Der Team-Avatar-Stack in der Sidebar hat den eigenen User vorher rausgefiltert. Jetzt bist du dabei — vorne in der Liste, damit dein Avatar im Cascading-Stack rechts oben sitzt (am nächsten zum Team-Button). Fallback-Initialen mit solidem Accent-Blau-BG und weißer Initiale statt der bisherigen nahezu transparenten Variante. Bottom-Divider im Footer matched jetzt das mx-2.5-Inset des oberen Dividers.
FunktionEdit/Copy/Revert-Action-Row bei User-Messages
User-Messages tragen jetzt eine Hover-aufgedeckte Thin-Icon-Row (Edit, Copy, Revert). Standardmäßig nur on Hover sichtbar damit der Chat ruhig bleibt; volle Tastatur-Navigation. Zusammen mit dem Kebab-Popover auf Assistant-Messages hat jeder Turn ein konsistentes Aktionsvokabular auf beiden Seiten.
FunktionLetzte geöffnete Projekte in der Sidebar
Sidebar listet jetzt die letzten 5 geöffneten Projekte unter Ressourcen (im aufgeklappten Zustand) mit eckigen Thumbnails (ohne Rahmen/Padding) und FolderOpen-Fallback. Die Liste kommt aus einer client-side localStorage-Map (xaio:lastOpened, max 50 Einträge, Recency-sortiert) und aktualisiert beim Project-Wechsel. Das aktuell offene Project wird rausgefiltert.
FunktionGenerierte Bilder erscheinen jetzt inline in Chat-Messages
Wenn die KI Bilder via generate_image-Tool generiert, werden sie jetzt in einer kleinen horizontalen Wrap-Liste direkt in der Chat-Message angezeigt — in Projekt- und Entwickler-Ansicht. Entwickler-Modus platziert sie unten in der Message über dem Timestamp, neben der Action-Bar.
FunktionTab-Badges werden nicht mehr von Nachbar-Tabs verdeckt
Die Error-/Info-Badges auf den Workspace-Tabs (Backend, Preview, Inbox, Runs) sind in den Bereich des nächsten Tabs übergelaufen und hinter dessen solidem Background verschwunden. Sie sitzen jetzt auf z-20 mit 2px Halo-Ring (weiß in Light, ink in Dark) damit sie immer lesbar sind. pointer-events: none damit sie keine Tab-Klicks abfangen.
FunktionLocale-bewusste AI-Tasks Zahlen-Formatierung
AI-Task-Zahlen respektieren jetzt die Dokument-Sprache: 1.48 in Englisch, 1,48 in Deutsch. Token-Counts und detaillierte Kosten-Breakdowns sind in Prod- und Stage-Umgebungen ausgeblendet — die sind nur für Dev-Debugging hilfreich.
BugfixReferral pending count fix (Python `not` hat den WHERE-Filter verschluckt)
`not UserReferral.referrer_bonus_granted` wurde von Python beim Query-Bauen ausgewertet, hat das Column-Objekt zu einem literal True/False gecoerced und die WHERE-Klausel still gedroppt. Umgestellt auf `.is_(False)` damit SQLAlchemy korrekt `WHERE referrer_bonus_granted = false` emittiert. Betrifft pending_referrals (kam als 0 oder volles Total zurück, nie die echte Pending-Menge) und grant_referrer_reward (der Lookup, der entscheidet ob ein Referrer +25 AI Tasks kriegt, hat die echte Pending-Row verfehlt).
FunktionWorkspace-Runner — Vite-Config + index.html bei jedem Wake neu gepatched
Wenn der Dev-Server-File-Sync die vite.config.ts des Runners überschreibt (die den Per-Workspace-Base-Path trägt), serviert Vite falsche Asset-URLs und CloudFront returnt HTML für fehlende /src/main.tsx. Der Runner re-patched jetzt vite.config und index.html bei jedem start(), auch wenn „schon läuft". Helpers _ensure_vite_config + _ensure_index_html_patched extrahiert. Plus: Workspaces mit toten Nodes werden als STOPPED markiert statt gelöscht damit beim Runner-Recycle keine Daten verloren gehen.