feat(agenten): Runde 4 — «Meine Agenten» mit fünf digitalen Mitarbeitenden

Setzt das Umsetzungsbriefing Runde 4 im bestehenden Frontend um.

Informationsarchitektur
- «Teamübersicht» heisst «Meine Agenten»; ihr bisheriger Inhalt (Kreisgrafik,
  Auswertung, Verbindungszusammenfassung) ist entfallen.
- Personalverwaltung, Bearbeitungsverlauf und Kanäle & Systeme sind jetzt
  Reiter derselben Seite (?section=), gestaltet wie die Auswahl im
  Bearbeitungsverlauf. Es wird nur der gewählte Bereich gerendert.
- Die alten Unterseitenpfade leiten um, damit Lesezeichen nicht brechen.

Agentenbestand
- Reto und Lea vollständig entfernt — aus Navigation, Dossiers, Protokoll,
  Verbindungen, Vorgängen und Porträtbestand.
- Retos Aufgaben liegen bei Bruno: Nachbereitung, WhatsApp-Anruf,
  Protokoll und Kundennotiz, Ablage im CRM.
- Livia ist «Exposé Master»: Lageberichte, Inserate, Angebotsbroschüren.
- Sidebar führt Ferdi, Bruno, Livia, Nora, Sina mit Porträt und Funktion.

Agentenseiten
- Ein gemeinsamer AgentWorkspaceHero auf allen fünf Seiten.
- Ferdi: Auswertungskarten, Priorität und Typfarben entfallen; Fälligkeit nur
  bei fünf Tagen oder weniger rot; Objektlinks nach «Meine Objekte»; neu die
  Terminplanung im verbundenen Kalender mit typgerechtem PDF-Ausschnitt.
- Sina: reduzierte, filter- und sortierbare Objektübersicht; Detailansicht
  direkt editierbar, leere Pflichtfelder rot umrandet.
- Nora: Signale ohne Prozentsätze und Konfidenzstufen, nur belegbare Angaben;
  Mehrfachauswahl leitet Objekte an Livia weiter.
- Livia: aktive und archivierte Leads, Arbeitsbereich gleitet an den oberen
  Rand; dreistufiger Exposé-Prozess Hochladen → Exposé → Export.
- Bruno: neue Seite mit Auftragsliste und Vor-/Nachbereitungs-Drawer;
  Glocke warnt bei Besichtigung unter 24 Stunden ohne Bericht.

Datenschicht
- Neu: Kalender, Exposé-Leads, Exposé-Entwürfe, Besichtigungsaufträge —
  je Domain, Provider, Service und Hook.
- IAIService um generateExposeText erweitert; der Entwurf nutzt ausschliesslich
  erfasste Objektdaten und meldet Lücken, statt sie zu füllen.
- Alle Objektverweise zeigen auf reale Einträge aus «Meine Objekte»; neue
  Detailroute /supply/properties/:propertyId.

Offen: Chat, Kalender, CRM und DMS sind Frontend-Simulation ohne Anbindung.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin SutterandClaude Opus 5 committed 2026-08-05 14:43:16 +02:00
1 parent cc5582b7fd
commit d200d4e930
352 files changed
+8069 -8512

No files matched your search

+99
View File
@@ -119,6 +119,105 @@ export const DS_SURFACE = {
slate: { bg: '#f4f3f0', border: '#e8e7e4' },
} as const
// ── Neutrale Skala ────────────────────────────────────────────────────────────
/**
* Die kühle Graustufe, auf der Tabellen, Trennlinien und Nebentexte liegen.
*
* Sie war über rund 200 Dateien als Hex-Literal verstreut — dieselben zehn
* Werte, immer wieder abgetippt. Die Stufen entsprechen exakt den bisher
* verwendeten Werten; die Zusammenführung ändert kein einziges Pixel, macht
* aber einen späteren Themenwechsel überhaupt erst möglich.
*
* Abgrenzung zu `DS_BG`/`DS_BORDER`: jene tragen den warmen Grundton der
* Anwendung (Papier), diese Skala den kühlen für Datenflächen.
*/
export const DS_SLATE = {
50: '#f8fafc',
100: '#f1f5f9',
200: '#e2e8f0',
300: '#cbd5e1',
400: '#94a3b8',
500: '#64748b',
600: '#475569',
700: '#334155',
800: '#1e293b',
900: '#0f172a',
} as const
/** Weitere neutrale Einzelwerte ohne Platz in der Skala. */
export const DS_NEUTRAL = {
white: '#ffffff',
offWhite: '#fafafa',
paper: '#fbfaf8',
paperTint: '#f0f4f8',
stone: '#b0aead',
graphite: '#374151',
sidebar: '#0f1923',
gold: '#b8975a',
} as const
// ── Markenfarben ──────────────────────────────────────────────────────────────
/**
* Das dunkle Blau der Anwendung samt seinen Hover-Stufen.
*
* `hover` und `hoverAlt` unterscheiden sich um zwei Prozent Helligkeit — sie
* sind historisch gewachsen und stehen beide im Code. Sie bleiben getrennt,
* damit die Zusammenführung nichts sichtbar verschiebt; wer sie vereinheitlichen
* will, tut das ab jetzt an einer Stelle statt an vierzig.
*/
export const DS_BRAND = {
main: '#152642',
hover: '#16304d',
hoverAlt: '#162d4a',
dark: '#0e1c30',
darker: '#1a3050',
muted: '#5a87a3',
light: '#64b5f6',
} as const
// ── Akzentfarben nach Bedeutung ───────────────────────────────────────────────
/**
* Semantische Akzente. Jede Gruppe führt Vorder-, Flächen- und Randfarbe
* derselben Bedeutung, damit ein Zustand nicht auf zwei Bildschirmen zwei
* verschiedene Grüntöne bekommt.
*/
export const DS_ACCENT = {
success: {
main: '#1a7a4a', strong: '#15803d', bright: '#16a34a', emerald: '#10b981',
dark: '#155f3a', darkAlt: '#15643c',
bg: '#f0fdf4', bgAlt: '#dcfce7', border: '#86efac',
},
warning: {
main: '#d97706', strong: '#ea580c', amber: '#f59e0b', burnt: '#c2410c',
dark: '#b45309', darker: '#854d0e', darkest: '#7a4f00', brown: '#7c3d12',
bg: '#fffbeb', bgAlt: '#fff7ed', border: '#fcd34d', borderSoft: '#fef3c7',
},
danger: {
main: '#c0392b', strong: '#dc2626', bright: '#ef4444', dark: '#a93226', darkest: '#7f1d1d',
bg: '#fef2f2', bgAlt: '#fff1f2', border: '#fca5a5',
},
violet: {
main: '#7c3aed', strong: '#6d28d9', light: '#8b5cf6',
dark: '#5b21b6', darkest: '#4c1d95',
bg: '#faf5ff', bgAlt: '#f5f3ff', border: '#c4b5fd', borderSoft: '#ddd6fe', tint: '#ede9fe',
},
indigo: {
main: '#4f46e5', strong: '#4338ca', dark: '#3730a3', light: '#6366f1',
bg: '#eef2ff', border: '#e0e7ff',
},
blue: {
main: '#1d4ed8', strong: '#2563eb', dark: '#1e40af', darkest: '#1e3a8a',
bg: '#eff6ff', bgAlt: '#f0f9ff', border: '#bfdbfe', borderSoft: '#dbeafe',
},
cyan: {
main: '#0891b2', deep: '#0369a1', dark: '#075985',
bg: '#e0f2fe', border: '#bae6fd',
},
} as const
// ── Match tier surface ────────────────────────────────────────────────────────
export const DS_MATCH_TIER = {