feat(scanner): Funde mit Akquise und Opportunities abgleichen

Neu gefundene Projekte mit Treffer werden einmalig per gpt-5.6-luna mit den
Akquise-Eintraegen und Opportunities der letzten N Tage (Vorgabe 14)
verglichen. Passt ein Eintrag, zeigt der Scanner "bereits beworben!" samt
Begruendung. Schalter und Zeitraum (Tage/Wochen) in Einstellungen -> Scanner,
Neupruefung von Hand im Detail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-17 17:12:17 +02:00
co-authored by Claude Opus 5
parent 87ca52a34b
commit af3ca33743
15 changed files with 549 additions and 10 deletions
+10 -1
View File
@@ -12,6 +12,7 @@ import {
primaryButtonClass,
secondaryButtonClass,
projectTimestamp,
AlreadyAppliedBadge,
} from './scannerUi';
import {
SCANNER_SETTINGS_DEFAULTS,
@@ -629,7 +630,10 @@ export const ScannerDashboard: React.FC = () => {
{match.Agent?.name ?? '—'}
</td>
<td className="max-w-md px-3 py-2.5">
<p className="truncate font-bold text-ink-900">{match.Project?.title}</p>
<div className="flex min-w-0 items-center gap-2">
<p className="truncate font-bold text-ink-900">{match.Project?.title}</p>
{match.Project?.alreadyApplied && <AlreadyAppliedBadge />}
</div>
<p className="truncate text-xs text-ink-400">
{match.Project?.location || 'Remote'}
</p>
@@ -663,6 +667,11 @@ export const ScannerDashboard: React.FC = () => {
onClose={() => setSelectedMatch(null)}
onStatusChange={(status) => changeStatus(selectedMatch, status)}
onDelete={() => setMatchToDelete(selectedMatch)}
onProjectChange={(project) =>
setMatches((prev) =>
prev.map((m) => (m.projectId === project.id ? { ...m, Project: project } : m))
)
}
/>
)}