feat(livia)!: Exposé-Funktion vollständig entfernt
Runde 8 hat Livia zur Research- & Market-Intelligence-Agentin gemacht. Die Exposé-Erstellung war der Kern ihrer alten Rolle und fällt mit ihr weg — sie wird nicht nachgeordnet weitergeführt. Ein zweiter Reiter hätte die Funktion sichtbar gelassen und die neue Positionierung damit halbiert. Entfernt: 23 Dateien (Arbeitsbereich, dreistufiger Assistent, Dossier mit elf Bereichen, Provider, Services, Hooks, Feldkatalog, Mockdaten, deterministischer Textbaustein) sowie `generateExposeText` aus `IAIService` und beiden Implementierungen. Livias Arbeitsplatz zeigt jetzt nur noch die Recherche-Leads — ohne Reiterbalken, weil eine Leiste mit einem Eintrag eine Alternative behauptet, die es nicht gibt. Ihr Personalblatt, die Bearbeitungsverlaufs-Einträge und die Teamdokumentation sind auf die neue Rolle nachgezogen; die beiden Beispielvorgänge zeigen jetzt eine Leaderzeugung und ein Review mit widersprüchlichen Quellen statt Lagebeschrieb und Exposétext. Bei Nora entfällt die Mehrfachauswahl in der Objektliste: sie diente allein der Weiterleitung an die Exposé-Erstellung. Eine Auswahl ohne Ziel wäre ein Bedienelement, das nichts auslöst. Die Matching-Darstellung selbst bleibt unverändert. Der Wiederaufbau ist in `archive/livia/` beschrieben; das Manifest hält jetzt fest, welche seiner Annahmen eingetreten sind und welche nicht — Livia bleibt im Team, nur die Funktion ist weg. Geprüft: tsc 0 Fehler, eslint 0 Fehler/0 Warnungen, 423/423 Tests grün, Produktionsbuild erfolgreich, Smoke-Test über sieben Seiten ohne Laufzeitfehler, 12/12 Abnahmekriterien erfüllt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
f5451f649f
commit
a219d3f2ec
33 files changed
+178
-2474
No files matched your search
@@ -1,60 +0,0 @@
|
||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
|
||||
import { exposeService } from '../services/exposeService'
|
||||
import { aiService } from '../services/aiService'
|
||||
import type { ExposeDraft } from '../domain/expose'
|
||||
import type { Property } from '../domain/property'
|
||||
import type { ExposeTextInput } from '../services/ai/IAIService'
|
||||
import { STALE_EXPOSE_LEADS } from '../lib/constants'
|
||||
import { useToastStore } from '../stores/toastStore'
|
||||
|
||||
export function useExposeDraft(leadId: string, property: Property | undefined) {
|
||||
return useQuery({
|
||||
queryKey: ['expose-draft', leadId, property?.id],
|
||||
queryFn: async () => (await exposeService.getOrCreateDraft(leadId, property!)).data,
|
||||
enabled: !!leadId && !!property,
|
||||
staleTime: STALE_EXPOSE_LEADS,
|
||||
})
|
||||
}
|
||||
|
||||
export function useSaveExposeDraft() {
|
||||
const queryClient = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: async (draft: ExposeDraft) => (await exposeService.save(draft)).data,
|
||||
onSuccess: (draft) => {
|
||||
queryClient.setQueryData(['expose-draft', draft.leadId, draft.propertyId], draft)
|
||||
},
|
||||
onError: () => {
|
||||
useToastStore.getState().showToast('Exposé konnte nicht gespeichert werden.', 'error')
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useGenerateExpose() {
|
||||
const queryClient = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: async (draft: ExposeDraft) => (await exposeService.generate(draft)).data,
|
||||
onSuccess: (draft) => {
|
||||
queryClient.setQueryData(['expose-draft', draft.leadId, draft.propertyId], draft)
|
||||
useToastStore.getState().showToast('Exposé erstellt — bereit für den Export.', 'success')
|
||||
},
|
||||
onError: (err: Error) => {
|
||||
useToastStore.getState().showToast(err.message || 'Exposé konnte nicht erstellt werden.', 'error')
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* KI-Textentwurf für einen Abschnitt.
|
||||
*
|
||||
* Fehlen belegte Angaben, liefert der Dienst keinen Text, sondern die Liste der
|
||||
* Lücken — die Oberfläche sagt das dann so, statt einen Text zu zeigen, der
|
||||
* Angaben behauptet, die niemand geprüft hat (§8.5.2, §9.6).
|
||||
*/
|
||||
export function useGenerateExposeText() {
|
||||
return useMutation({
|
||||
mutationFn: async (input: ExposeTextInput) => (await aiService.generateExposeText(input)).data,
|
||||
onError: () => {
|
||||
useToastStore.getState().showToast('Textentwurf konnte nicht erzeugt werden — bitte manuell erfassen.', 'error')
|
||||
},
|
||||
})
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
|
||||
import { exposeLeadService } from '../services/exposeLeadService'
|
||||
import type { CreateExposeLeadInput } from '../domain/exposeLead'
|
||||
import { STALE_EXPOSE_LEADS } from '../lib/constants'
|
||||
import { useToastStore } from '../stores/toastStore'
|
||||
|
||||
export function useExposeLeads() {
|
||||
return useQuery({
|
||||
queryKey: ['expose-leads'],
|
||||
queryFn: async () => (await exposeLeadService.getAll()).data,
|
||||
staleTime: STALE_EXPOSE_LEADS,
|
||||
})
|
||||
}
|
||||
|
||||
export function useCreateExposeLead() {
|
||||
const queryClient = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: async (input: CreateExposeLeadInput) => (await exposeLeadService.create(input)).data,
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['expose-leads'] })
|
||||
},
|
||||
onError: (err: Error) => {
|
||||
useToastStore.getState().showToast(err.message || 'Lead konnte nicht weitergeleitet werden.', 'error')
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useArchiveExposeLead() {
|
||||
const queryClient = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: async (id: string) => (await exposeLeadService.archive(id)).data,
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['expose-leads'] })
|
||||
},
|
||||
onError: () => {
|
||||
useToastStore.getState().showToast('Lead konnte nicht archiviert werden.', 'error')
|
||||
},
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user