[30b88f42] Läuft wieder
Läuft wieder
This commit is contained in:
@@ -1 +1 @@
|
|||||||
{"task_id": "30a88f42-8544-819a-b5fc-c85cd80f43b7", "token": "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", "session_start_time": "2026-02-17T07:16:11.126812"}
|
{"task_id": "30b88f42-8544-80ea-88a7-e7c03e749c30", "token": "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", "session_start_time": "2026-02-18T14:32:47.873998"}
|
||||||
1
.gemini/env_old
Normal file
1
.gemini/env_old
Normal file
@@ -0,0 +1 @@
|
|||||||
|
GEMINI_API_KEY=AIzaSyBNg5yQ-dezfDs6j9DGn8qJ8SImNCGm9Ds
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -68,3 +68,6 @@ Log_from_docker/
|
|||||||
# Node.js specific
|
# Node.js specific
|
||||||
!package.json
|
!package.json
|
||||||
!package-lock.json
|
!package-lock.json
|
||||||
|
|
||||||
|
.gemini/.env
|
||||||
|
gemini_api_key.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useEffect, useState } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { X, ExternalLink, Bot, Briefcase, Globe, Users, DollarSign, MapPin, Tag, RefreshCw as RefreshCwIcon, Search as SearchIcon, Pencil, Check, Download, Clock, Lock, Unlock, Calculator, Ruler, Database, Trash2, Flag, AlertTriangle, Scale, Target, Save } from 'lucide-react'
|
import { X, ExternalLink, Bot, Briefcase, Globe, Users, DollarSign, MapPin, Tag, RefreshCw as RefreshCwIcon, Search as SearchIcon, Pencil, Check, Download, Clock, Lock, Unlock, Calculator, Ruler, Database, Trash2, Flag, AlertTriangle, Scale, Target } from 'lucide-react'
|
||||||
import clsx from 'clsx'
|
import clsx from 'clsx'
|
||||||
import { ContactsManager, Contact } from './ContactsManager'
|
import { ContactsManager, Contact } from './ContactsManager'
|
||||||
|
|
||||||
@@ -453,41 +453,78 @@ export function Inspector({ companyId, initialContactId, onClose, apiBase }: Ins
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CRM Comparison Renderer
|
// CRM Comparison and Data Quality Renderer
|
||||||
const renderCRMComparison = () => {
|
const renderDataQualityCard = () => {
|
||||||
if (!data?.crm_name && !data?.crm_website) return null;
|
if (!data) return null;
|
||||||
|
const hasCrmData = data.crm_name || data.crm_website;
|
||||||
|
const hasQualityScores = data.confidence_score != null || data.data_mismatch_score != null;
|
||||||
|
|
||||||
|
if (!hasCrmData && !hasQualityScores) return null;
|
||||||
|
|
||||||
|
const confidenceScore = data.confidence_score ?? 0;
|
||||||
|
const mismatchScore = data.data_mismatch_score ?? 0;
|
||||||
|
|
||||||
|
const getConfidenceColor = (score: number) => {
|
||||||
|
if (score > 0.8) return { bg: "bg-green-100", text: "text-green-700" };
|
||||||
|
if (score > 0.5) return { bg: "bg-yellow-100", text: "text-yellow-700" };
|
||||||
|
return { bg: "bg-red-100", text: "text-red-700" };
|
||||||
|
}
|
||||||
|
|
||||||
|
const getMismatchColor = (score: number) => {
|
||||||
|
if (score <= 0.3) return { bg: "bg-green-100", text: "text-green-700" };
|
||||||
|
if (score <= 0.5) return { bg: "bg-yellow-100", text: "text-yellow-700" };
|
||||||
|
return { bg: "bg-red-100", text: "text-red-700" };
|
||||||
|
}
|
||||||
|
|
||||||
|
const confidenceColors = getConfidenceColor(confidenceScore);
|
||||||
|
const mismatchColors = getMismatchColor(mismatchScore);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-slate-50 dark:bg-slate-950 rounded-lg p-4 border border-slate-200 dark:border-slate-800 mb-6">
|
<div className="bg-slate-50 dark:bg-slate-950 rounded-lg p-4 border border-slate-200 dark:border-slate-800 mb-6">
|
||||||
<div className="flex justify-between items-center mb-3">
|
<div className="flex justify-between items-center mb-4">
|
||||||
<h3 className="text-sm font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-wider flex items-center gap-2">
|
<h3 className="text-sm font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-wider flex items-center gap-2">
|
||||||
<Scale className="h-4 w-4" /> Data Match (CRM vs. AI)
|
<Scale className="h-4 w-4" /> Data Quality & CRM Sync
|
||||||
</h3>
|
</h3>
|
||||||
{data.data_mismatch_score != null && (
|
|
||||||
<span className={clsx("text-xs font-bold px-2 py-0.5 rounded",
|
|
||||||
data.data_mismatch_score > 0.5 ? "bg-red-100 text-red-700" : "bg-green-100 text-green-700"
|
|
||||||
)}>
|
|
||||||
Match Score: {((1 - data.data_mismatch_score) * 100).toFixed(0)}%
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-2 gap-4 text-xs">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-xs mb-4">
|
||||||
<div className="p-3 bg-slate-100 dark:bg-slate-900 rounded opacity-80">
|
{/* AI Quality Metrics */}
|
||||||
<div className="text-[10px] font-bold text-slate-400 uppercase mb-2">SuperOffice (CRM)</div>
|
<div className="space-y-3 p-3 bg-white dark:bg-slate-900 rounded border border-slate-200 dark:border-slate-800">
|
||||||
<div className="space-y-2">
|
<div className="text-[10px] font-bold text-slate-400 uppercase">AI Quality Scores</div>
|
||||||
<div><span className="text-slate-400">Name:</span> <span className="font-medium">{data.crm_name || "-"}</span></div>
|
{data.confidence_score != null && (
|
||||||
<div><span className="text-slate-400">Web:</span> <span className="font-mono">{data.crm_website || "-"}</span></div>
|
<div className="flex items-center justify-between">
|
||||||
<div><span className="text-slate-400">Addr:</span> <span className="break-words">{data.crm_address || "-"}</span></div>
|
<span className="text-slate-500 dark:text-slate-400">Classification Confidence</span>
|
||||||
<div><span className="text-slate-400">VAT:</span> <span>{data.crm_vat || "-"}</span></div>
|
<span className={clsx("font-bold px-2 py-0.5 rounded text-xs", confidenceColors.bg, confidenceColors.text)}>
|
||||||
</div>
|
{(confidenceScore * 100).toFixed(0)}%
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.data_mismatch_score != null && (
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span className="text-slate-500 dark:text-slate-400">CRM Data Match</span>
|
||||||
|
<span className={clsx("font-bold px-2 py-0.5 rounded text-xs", mismatchColors.bg, mismatchColors.text)}>
|
||||||
|
{((1 - mismatchScore) * 100).toFixed(0)}%
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="p-3 bg-white dark:bg-slate-800 rounded border border-blue-100 dark:border-blue-900">
|
{/* CRM Data Display */}
|
||||||
<div className="text-[10px] font-bold text-blue-500 uppercase mb-2">Company Explorer (AI)</div>
|
<div className="p-3 bg-slate-100 dark:bg-slate-800/50 rounded">
|
||||||
|
<div className="text-[10px] font-bold text-slate-400 uppercase mb-2">SuperOffice (CRM)</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div><span className="text-slate-400">Name:</span> <span className="font-medium break-all">{data.crm_name || "-"}</span></div>
|
||||||
|
<div><span className="text-slate-400">Web:</span> <span className="font-mono break-all">{data.crm_website || "-"}</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="text-xs">
|
||||||
|
<div className="p-3 bg-white dark:bg-slate-900 rounded border border-blue-100 dark:border-blue-900/50">
|
||||||
|
<div className="text-[10px] font-bold text-blue-500 uppercase mb-2">Enriched Data (AI)</div>
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<div><span className="text-slate-400">Name:</span> <span className="font-medium text-slate-900 dark:text-white">{data.name}</span></div>
|
<div><span className="text-slate-400">Name:</span> <span className="font-medium text-slate-900 dark:text-white">{data.name}</span></div>
|
||||||
<div><span className="text-slate-400">Web:</span> <span className="font-mono text-blue-600">{data.website}</span></div>
|
<div><span className="text-slate-400">Web:</span> <span className="font-mono text-blue-600 dark:text-blue-400">{data.website}</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -715,7 +752,7 @@ export function Inspector({ companyId, initialContactId, onClose, apiBase }: Ins
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{renderCRMComparison()}
|
{renderDataQualityCard()}
|
||||||
{renderStrategyCard()}
|
{renderStrategyCard()}
|
||||||
|
|
||||||
<div className="bg-slate-50 dark:bg-slate-950 rounded-lg p-4 border border-slate-200 dark:border-slate-800 flex flex-col gap-2">
|
<div className="bg-slate-50 dark:bg-slate-950 rounded-lg p-4 border border-slate-200 dark:border-slate-800 flex flex-col gap-2">
|
||||||
|
|||||||
@@ -179,7 +179,21 @@ export function RoboticsSettings({ isOpen, onClose, apiBase }: RoboticsSettingsP
|
|||||||
)}
|
)}
|
||||||
<div className="flex gap-4 items-start pr-12">
|
<div className="flex gap-4 items-start pr-12">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<h4 className="font-bold text-slate-900 dark:text-white text-sm">{ind.name}</h4>
|
<div className="flex items-center gap-2 mb-1">
|
||||||
|
<h4 className="font-bold text-slate-900 dark:text-white text-sm">{ind.name}</h4>
|
||||||
|
{ind.priority && (
|
||||||
|
<span className={clsx("text-[9px] font-bold px-1.5 py-0.5 rounded uppercase tracking-wider",
|
||||||
|
ind.priority === "Freigegeben" ? "bg-green-100 text-green-700" : "bg-purple-100 text-purple-700"
|
||||||
|
)}>
|
||||||
|
{ind.priority}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
{ind.ops_focus_secondary && (
|
||||||
|
<span className="text-[9px] font-bold px-1.5 py-0.5 rounded uppercase tracking-wider bg-orange-100 text-orange-700 border border-orange-200">
|
||||||
|
SEC-PRODUCT
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div className="flex flex-wrap gap-2 mt-1">
|
<div className="flex flex-wrap gap-2 mt-1">
|
||||||
{ind.status_notion && <span className="text-[10px] border border-slate-300 dark:border-slate-700 px-1.5 rounded text-slate-500">{ind.status_notion}</span>}
|
{ind.status_notion && <span className="text-[10px] border border-slate-300 dark:border-slate-700 px-1.5 rounded text-slate-500">{ind.status_notion}</span>}
|
||||||
</div>
|
</div>
|
||||||
@@ -191,7 +205,33 @@ export function RoboticsSettings({ isOpen, onClose, apiBase }: RoboticsSettingsP
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-xs text-slate-600 dark:text-slate-300 italic whitespace-pre-wrap">{ind.description || "No definition"}</p>
|
|
||||||
|
<div className="space-y-2">
|
||||||
|
<p className="text-xs text-slate-600 dark:text-slate-300 italic whitespace-pre-wrap">{ind.description || "No definition"}</p>
|
||||||
|
|
||||||
|
{(ind.pains || ind.gains) && (
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-3 mt-2">
|
||||||
|
{ind.pains && (
|
||||||
|
<div className="p-2 bg-red-50/50 dark:bg-red-900/10 rounded border border-red-100 dark:border-red-900/30">
|
||||||
|
<div className="text-[9px] font-bold text-red-600 dark:text-red-400 uppercase mb-1">Pains</div>
|
||||||
|
<div className="text-[10px] text-slate-600 dark:text-slate-400 line-clamp-3 hover:line-clamp-none transition-all">{ind.pains}</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{ind.gains && (
|
||||||
|
<div className="p-2 bg-green-50/50 dark:bg-green-900/10 rounded border border-green-100 dark:border-green-900/30">
|
||||||
|
<div className="text-[9px] font-bold text-green-600 dark:text-green-400 uppercase mb-1">Gains</div>
|
||||||
|
<div className="text-[10px] text-slate-600 dark:text-slate-400 line-clamp-3 hover:line-clamp-none transition-all">{ind.gains}</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{ind.notes && (
|
||||||
|
<div className="text-[10px] text-slate-500 border-l-2 border-slate-200 dark:border-slate-800 pl-2 py-1">
|
||||||
|
<span className="font-bold uppercase mr-1">Notes:</span> {ind.notes}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div className="grid grid-cols-2 sm:grid-cols-4 gap-2 text-[10px] bg-white dark:bg-slate-900 p-2 rounded border border-slate-200 dark:border-slate-800">
|
<div className="grid grid-cols-2 sm:grid-cols-4 gap-2 text-[10px] bg-white dark:bg-slate-900 p-2 rounded border border-slate-200 dark:border-slate-800">
|
||||||
<div><span className="block text-slate-400 font-bold uppercase">Whale ></span><span className="text-slate-700 dark:text-slate-200">{ind.whale_threshold || "-"}</span></div>
|
<div><span className="block text-slate-400 font-bold uppercase">Whale ></span><span className="text-slate-700 dark:text-slate-200">{ind.whale_threshold || "-"}</span></div>
|
||||||
<div><span className="block text-slate-400 font-bold uppercase">Min Req</span><span className="text-slate-700 dark:text-slate-200">{ind.min_requirement || "-"}</span></div>
|
<div><span className="block text-slate-400 font-bold uppercase">Min Req</span><span className="text-slate-700 dark:text-slate-200">{ind.min_requirement || "-"}</span></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user