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

+6 -5
View File
@@ -2,6 +2,7 @@ import { useState } from 'react'
import { Alert, Box, Button, Collapse, IconButton, Typography } from '@mui/material'
import { AlertTriangle, ChevronDown, ChevronUp, Target } from 'lucide-react'
import type { ReactNode } from 'react'
import { DS_BG, DS_BRAND, DS_SLATE, DS_TEXT } from '../../lib/ds'
export interface DecisionMetric {
label: string
@@ -61,7 +62,7 @@ export function DecisionContextPanel({
return (
<Box
sx={{
bgcolor: '#f9f8f6',
bgcolor: DS_BG.page,
borderBottom: '1px solid #e8e7e4',
px: 2.5,
py: 1.25,
@@ -74,11 +75,11 @@ export function DecisionContextPanel({
<Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1, flex: 1, minWidth: 200 }}>
<Target size={15} color="#152642" style={{ marginTop: 2, flexShrink: 0 }} />
<Box>
<Typography variant="body2" sx={{ fontWeight: 700, fontSize: '0.8125rem', color: '#141414', lineHeight: 1.3 }}>
<Typography variant="body2" sx={{ fontWeight: 700, fontSize: '0.8125rem', color: DS_TEXT.primary, lineHeight: 1.3 }}>
{decision}
</Typography>
{context && (
<Typography variant="caption" sx={{ color: '#64748b', display: 'block', mt: 0.25 }}>
<Typography variant="caption" sx={{ color: DS_SLATE[500], display: 'block', mt: 0.25 }}>
{context}
</Typography>
)}
@@ -111,7 +112,7 @@ export function DecisionContextPanel({
variant={a.primary ? 'contained' : 'outlined'}
onClick={a.onClick}
sx={a.primary
? { bgcolor: '#152642', '&:hover': { bgcolor: '#0e1c30' }, textTransform: 'none', fontSize: '0.75rem', py: 0.375, px: 1.25 }
? { bgcolor: DS_BRAND.main, '&:hover': { bgcolor: DS_BRAND.dark }, textTransform: 'none', fontSize: '0.75rem', py: 0.375, px: 1.25 }
: { textTransform: 'none', fontSize: '0.75rem', py: 0.375, px: 1.25 }
}
>
@@ -122,7 +123,7 @@ export function DecisionContextPanel({
<IconButton
size="small"
onClick={() => setExpanded(v => !v)}
sx={{ color: '#64748b', width: 24, height: 24 }}
sx={{ color: DS_SLATE[500], width: 24, height: 24 }}
>
{expanded ? <ChevronUp size={14} /> : <ChevronDown size={14} />}
</IconButton>