audit trail detail, dupes detector
This commit is contained in:
@@ -378,65 +378,105 @@ class AuditService {
|
||||
private createSpecificSummary(data: any, action: string, type: 'input' | 'output'): string {
|
||||
if (!data) return 'Leer';
|
||||
|
||||
// Action-specific summaries
|
||||
// Action-specific summaries that show actual meaningful data
|
||||
switch (action) {
|
||||
case 'selection-decision':
|
||||
if (type === 'input') {
|
||||
if (data.availableTools && Array.isArray(data.availableTools)) {
|
||||
const preview = data.availableTools.slice(0, 5).join(', ');
|
||||
return `${data.totalAvailable || data.availableTools.length} Tools verfügbar: ${preview}${data.availableTools.length > 5 ? '...' : ''}`;
|
||||
const preview = data.availableTools.slice(0, 3).join(', ');
|
||||
return `${data.totalAvailable || data.availableTools.length} Tools: ${preview}${data.availableTools.length > 3 ? '...' : ''}`;
|
||||
} else if (data.totalAvailable) {
|
||||
return `${data.totalAvailable} Tools verfügbar, Methode: ${data.selectionMethod}`;
|
||||
}
|
||||
return `${data.totalAvailable || 0} Tools verfügbar`;
|
||||
return `${data.candidateCount || 0} Kandidaten für Auswahl`;
|
||||
} else {
|
||||
return `Ausgewählt: ${Array.isArray(data.selectedTools) ? data.selectedTools.join(', ') : 'keine'}`;
|
||||
if (Array.isArray(data.selectedTools)) {
|
||||
return `${data.selectedTools.length} ausgewählt: ${data.selectedTools.slice(0, 3).join(', ')}${data.selectedTools.length > 3 ? '...' : ''}`;
|
||||
}
|
||||
return `Auswahl: ${data.selectionRatio ? Math.round(data.selectionRatio * 100) + '%' : 'unbekannt'}`;
|
||||
}
|
||||
|
||||
case 'phase-tool-selection':
|
||||
if (type === 'input') {
|
||||
if (data.availableTools && Array.isArray(data.availableTools)) {
|
||||
return `${data.availableTools.length} Tools für Phase: ${data.availableTools.slice(0, 3).join(', ')}${data.availableTools.length > 3 ? '...' : ''}`;
|
||||
if (Array.isArray(data.availableTools)) {
|
||||
const toolPreview = data.availableTools.slice(0, 3).join(', ');
|
||||
return `${data.availableTools.length} Tools für ${data.phaseName || data.phaseId}: ${toolPreview}${data.availableTools.length > 3 ? '...' : ''}`;
|
||||
}
|
||||
return `Phase: ${data.phaseName || data.phaseId || 'unbekannt'}`;
|
||||
return `Phase: ${data.phaseName || data.phaseId} (${data.toolCount || 0} Tools)`;
|
||||
} else {
|
||||
if (data.selectedTools && Array.isArray(data.selectedTools)) {
|
||||
return `Ausgewählt: ${data.selectedTools.join(', ')}`;
|
||||
if (Array.isArray(data.selectedTools)) {
|
||||
return `${data.selectedTools.length} ausgewählt: ${data.selectedTools.join(', ')}`;
|
||||
}
|
||||
return `${data.selectionCount || 0} Tools ausgewählt`;
|
||||
return `${data.selectionCount || 0} Tools, Ø ${data.avgTaskRelevance || 0}% Relevanz`;
|
||||
}
|
||||
|
||||
case 'similarity-search':
|
||||
if (type === 'input') {
|
||||
return `Suche: "${data.query}" (Schwelle: ${data.threshold})`;
|
||||
return `Suche: "${data.query}" (Min. ${data.threshold} Ähnlichkeit)`;
|
||||
} else {
|
||||
if (data.topMatches && Array.isArray(data.topMatches)) {
|
||||
return `${data.resultsCount} Treffer: ${data.topMatches.slice(0, 3).join(', ')}`;
|
||||
if (Array.isArray(data.topMatches)) {
|
||||
return `${data.resultsCount} Treffer: ${data.topMatches.slice(0, 2).join(', ')}${data.topMatches.length > 2 ? '...' : ''}`;
|
||||
}
|
||||
return `${data.resultsCount || 0} Treffer gefunden`;
|
||||
return `${data.resultsCount || 0} semantische Treffer gefunden`;
|
||||
}
|
||||
|
||||
case 'phase-enhancement':
|
||||
if (type === 'input') {
|
||||
return `Phase: ${data.phaseName || data.phaseId} (${data.searchStrategy || 'Standard'})`;
|
||||
return `Vervollständige Phase: ${data.phaseName || data.phaseId}`;
|
||||
} else {
|
||||
return `${data.toolsAddedCount} Tools hinzugefügt: ${Array.isArray(data.addedTools) ? data.addedTools.join(', ') : 'keine'}`;
|
||||
if (Array.isArray(data.addedTools) && data.addedTools.length > 0) {
|
||||
return `${data.addedTools.length} hinzugefügt: ${data.addedTools.join(', ')}`;
|
||||
}
|
||||
return `${data.toolsAddedCount || 0} Tools für Phase hinzugefügt`;
|
||||
}
|
||||
|
||||
case 'ai-decision':
|
||||
if (type === 'input') {
|
||||
return data.prompt ? `KI-Prompt: ${data.prompt.slice(0, 100)}...` : 'KI-Analyse durchgeführt';
|
||||
if (data.prompt) {
|
||||
const promptPreview = data.prompt.slice(0, 80).replace(/\n/g, ' ');
|
||||
return `KI-Prompt: ${promptPreview}...`;
|
||||
}
|
||||
return 'KI-Analyse angefordert';
|
||||
} else {
|
||||
return data.response ? `KI-Antwort: ${data.response.slice(0, 100)}...` : 'Antwort erhalten';
|
||||
if (data.response) {
|
||||
const responsePreview = data.response.slice(0, 80).replace(/\n/g, ' ');
|
||||
return `KI-Antwort: ${responsePreview}...`;
|
||||
}
|
||||
return 'KI-Analyse abgeschlossen';
|
||||
}
|
||||
|
||||
case 'tool-confidence':
|
||||
if (type === 'input') {
|
||||
return `Tool: ${data.toolName} (Semantik: ${data.semanticSimilarity}%, Aufgabe: ${data.taskRelevance}%)`;
|
||||
return `Tool: ${data.toolName} (Sem: ${data.semanticSimilarity}%, Task: ${data.taskRelevance}%)`;
|
||||
} else {
|
||||
return `Vertrauen: ${data.overallConfidence}% (Stärken: ${data.strengthIndicators?.length || 0}, Unsicherheiten: ${data.uncertaintyFactors?.length || 0})`;
|
||||
const strengthCount = data.strengthIndicators?.length || 0;
|
||||
const uncertaintyCount = data.uncertaintyFactors?.length || 0;
|
||||
return `${data.overallConfidence}% Vertrauen (${strengthCount} Stärken, ${uncertaintyCount} Unsicherheiten)`;
|
||||
}
|
||||
|
||||
case 'tool-added-to-phase':
|
||||
if (type === 'input') {
|
||||
return `${data.toolName} → ${data.phaseId} (${data.taskRelevance}% Relevanz, ${data.priority})`;
|
||||
} else {
|
||||
const justificationPreview = data.justification ?
|
||||
data.justification.slice(0, 60).replace(/\n/g, ' ') + '...' : 'Hinzugefügt';
|
||||
return `Begründung: ${justificationPreview}`;
|
||||
}
|
||||
|
||||
case 'concept-selection':
|
||||
if (type === 'input') {
|
||||
const conceptCount = Array.isArray(data.availableConcepts) ? data.availableConcepts.length : 0;
|
||||
const toolContext = Array.isArray(data.selectedToolsContext) ? data.selectedToolsContext.length : 0;
|
||||
return `${conceptCount} Konzepte verfügbar, ${toolContext} Tools als Kontext`;
|
||||
} else {
|
||||
if (Array.isArray(data.selectedConcepts)) {
|
||||
return `${data.selectedConcepts.length} ausgewählt: ${data.selectedConcepts.slice(0, 2).join(', ')}${data.selectedConcepts.length > 2 ? '...' : ''}`;
|
||||
}
|
||||
return `Konzeptauswahl abgeschlossen`;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback to generic handling
|
||||
// Enhanced fallback that shows actual key-value content instead of just "X Eigenschaften"
|
||||
if (typeof data === 'string') {
|
||||
return data.length > 100 ? data.slice(0, 100) + '...' : data;
|
||||
}
|
||||
@@ -444,10 +484,44 @@ class AuditService {
|
||||
if (Array.isArray(data)) {
|
||||
if (data.length === 0) return 'Leeres Array';
|
||||
if (data.length <= 3) return data.join(', ');
|
||||
return `${data.slice(0, 3).join(', ')} und ${data.length - 3} weitere`;
|
||||
return `${data.slice(0, 3).join(', ')} + ${data.length - 3} weitere`;
|
||||
}
|
||||
|
||||
return `${Object.keys(data).length} Eigenschaften`;
|
||||
if (typeof data === 'object') {
|
||||
const keys = Object.keys(data);
|
||||
if (keys.length === 0) return 'Leeres Objekt';
|
||||
|
||||
// Show actual key-value pairs for small objects instead of just counting properties
|
||||
if (keys.length <= 2) {
|
||||
const pairs = keys.map(key => {
|
||||
const value = data[key];
|
||||
if (typeof value === 'string' && value.length > 30) {
|
||||
return `${key}: ${value.slice(0, 30)}...`;
|
||||
} else if (Array.isArray(value)) {
|
||||
return `${key}: [${value.length} Items]`;
|
||||
} else {
|
||||
return `${key}: ${value}`;
|
||||
}
|
||||
});
|
||||
return pairs.join(', ');
|
||||
} else {
|
||||
// For larger objects, show key names and some sample values
|
||||
const sampleKeys = keys.slice(0, 3);
|
||||
const sampleValues = sampleKeys.map(key => {
|
||||
const value = data[key];
|
||||
if (typeof value === 'string' && value.length > 20) {
|
||||
return `${key}: ${value.slice(0, 20)}...`;
|
||||
} else if (Array.isArray(value)) {
|
||||
return `${key}: [${value.length}]`;
|
||||
} else {
|
||||
return `${key}: ${value}`;
|
||||
}
|
||||
});
|
||||
return `${sampleValues.join(', ')}${keys.length > 3 ? ` + ${keys.length - 3} weitere` : ''}`;
|
||||
}
|
||||
}
|
||||
|
||||
return String(data);
|
||||
}
|
||||
|
||||
private generateSpecificReasoning(
|
||||
|
||||
Reference in New Issue
Block a user