enhance
This commit is contained in:
		
							parent
							
								
									3eb1b9d8d7
								
							
						
					
					
						commit
						69aa19642c
					
				@ -66,7 +66,7 @@ const domainAgnosticSoftware = data['domain-agnostic-software'] || [];
 | 
			
		||||
          </div>
 | 
			
		||||
          <div id="suggested-questions" class="suggested-questions" style="display: none;">
 | 
			
		||||
            <p style="margin: 0 0 0.75rem 0; font-size: 0.875rem; color: var(--color-text-secondary); line-height: 1.5;">
 | 
			
		||||
              Zur besseren Analyse Ihres Szenarios könnten diese Informationen hilfreich sein:
 | 
			
		||||
              Zur besseren Analyse könnten diese Zusatzinformationen hilfreich sein:
 | 
			
		||||
            </p>
 | 
			
		||||
            <div id="questions-list"></div>
 | 
			
		||||
            <div style="margin-top: 1rem; text-align: right;">
 | 
			
		||||
@ -200,7 +200,6 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
  // Smart prompting state
 | 
			
		||||
  let enhancementTimeout;
 | 
			
		||||
  let enhancementAbortController;
 | 
			
		||||
  let suggestionsVisible = false;
 | 
			
		||||
 | 
			
		||||
  if (!aiInput || !aiSubmitBtn || !aiLoading || !aiError || !aiResults) {
 | 
			
		||||
    console.error('AI interface elements not found');
 | 
			
		||||
@ -259,7 +258,7 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  // Smart Prompting Functions
 | 
			
		||||
  // Smart Prompting Functions - Simplified
 | 
			
		||||
  function showPromptingStatus(state) {
 | 
			
		||||
    if (!smartPromptingContainer || !promptingStatus || !promptingSpinner) return;
 | 
			
		||||
    
 | 
			
		||||
@ -269,33 +268,26 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
        promptingStatus.textContent = '💡 KI analysiert Ihre Eingabe...';
 | 
			
		||||
        promptingSpinner.style.display = 'inline-block';
 | 
			
		||||
        suggestedQuestions.style.display = 'none';
 | 
			
		||||
        suggestionsVisible = false;
 | 
			
		||||
        break;
 | 
			
		||||
      case 'suggestions':
 | 
			
		||||
        promptingStatus.textContent = '✅ Verbesserungsvorschläge verfügbar';
 | 
			
		||||
        promptingSpinner.style.display = 'none';
 | 
			
		||||
        suggestedQuestions.style.display = 'block';
 | 
			
		||||
        suggestionsVisible = true;
 | 
			
		||||
        break;
 | 
			
		||||
      case 'rate-limited':
 | 
			
		||||
        promptingStatus.textContent = '⏸️ Verbesserungen verfügbar nach Hauptabfrage';
 | 
			
		||||
        promptingStatus.textContent = '⏸️ Verbesserungen nach Hauptabfrage verfügbar';
 | 
			
		||||
        promptingSpinner.style.display = 'none';
 | 
			
		||||
        suggestedQuestions.style.display = 'none';
 | 
			
		||||
        suggestionsVisible = false;
 | 
			
		||||
        break;
 | 
			
		||||
      case 'error':
 | 
			
		||||
        promptingStatus.textContent = '⚠️ Verbesserungen temporär nicht verfügbar';
 | 
			
		||||
        promptingSpinner.style.display = 'none';
 | 
			
		||||
        suggestedQuestions.style.display = 'none';
 | 
			
		||||
        suggestionsVisible = false;
 | 
			
		||||
        smartPromptingContainer.style.display = 'none'; // Just hide on error
 | 
			
		||||
        break;
 | 
			
		||||
      case 'hidden':
 | 
			
		||||
        smartPromptingContainer.style.display = 'none';
 | 
			
		||||
        suggestionsVisible = false;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  function displaySuggestions(suggestions) {
 | 
			
		||||
    if (!questionsList || !suggestions || suggestions.length === 0) return;
 | 
			
		||||
    
 | 
			
		||||
@ -306,37 +298,17 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
      questionElement.className = 'suggestion-item';
 | 
			
		||||
      
 | 
			
		||||
      questionElement.innerHTML = `
 | 
			
		||||
        <div style="display: flex; align-items: start; gap: 0.5rem;">
 | 
			
		||||
          <span class="suggestion-number">${index + 1}.</span>
 | 
			
		||||
          <span class="suggestion-text">${question}</span>
 | 
			
		||||
          <svg class="suggestion-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
 | 
			
		||||
            <line x1="12" y1="5" x2="12" y2="19"/>
 | 
			
		||||
            <line x1="5" y1="12" x2="19" y2="12"/>
 | 
			
		||||
          </svg>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="suggestion-number">${index + 1}.</span>
 | 
			
		||||
        ${question}
 | 
			
		||||
      `;
 | 
			
		||||
      
 | 
			
		||||
      questionElement.addEventListener('click', () => {
 | 
			
		||||
        const currentText = aiInput.value.trim();
 | 
			
		||||
        const newText = currentText ? `${currentText}\n\n${question}` : question;
 | 
			
		||||
        aiInput.value = newText;
 | 
			
		||||
        aiInput.focus();
 | 
			
		||||
        
 | 
			
		||||
        // Trigger input event to update character counter
 | 
			
		||||
        aiInput.dispatchEvent(new Event('input', { bubbles: true }));
 | 
			
		||||
        
 | 
			
		||||
        // Hide suggestions after adding
 | 
			
		||||
        showPromptingStatus('hidden');
 | 
			
		||||
      });
 | 
			
		||||
      
 | 
			
		||||
      questionsList.appendChild(questionElement);
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    showPromptingStatus('suggestions');
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  async function triggerSmartPrompting() {
 | 
			
		||||
    console.log('[DEBUG] triggerSmartPrompting function defined');
 | 
			
		||||
    const inputText = aiInput.value.trim();
 | 
			
		||||
    
 | 
			
		||||
    if (inputText.length < 50) {
 | 
			
		||||
@ -367,7 +339,6 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
      });
 | 
			
		||||
      
 | 
			
		||||
      const data = await response.json();
 | 
			
		||||
      console.log('[DEBUG AIQuery]Enhancement response:', data);
 | 
			
		||||
      
 | 
			
		||||
      if (!response.ok) {
 | 
			
		||||
        if (response.status === 429) {
 | 
			
		||||
@ -391,13 +362,6 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
      
 | 
			
		||||
      console.warn('Smart prompting failed:', error);
 | 
			
		||||
      showPromptingStatus('error');
 | 
			
		||||
      
 | 
			
		||||
      // Auto-hide error after 3 seconds
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
        if (promptingStatus && promptingStatus.textContent.includes('nicht verfügbar')) {
 | 
			
		||||
          showPromptingStatus('hidden');
 | 
			
		||||
        }
 | 
			
		||||
      }, 3000);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -59,23 +59,29 @@ function cleanupExpiredRateLimits() {
 | 
			
		||||
setInterval(cleanupExpiredRateLimits, 5 * 60 * 1000);
 | 
			
		||||
 | 
			
		||||
function createEnhancementPrompt(input: string): string {
 | 
			
		||||
  return `Analysiere diese forensische Szenario-Beschreibung und schlage 2-3 kurze, präzise Fragen vor, die dem Nutzer helfen würden, vollständigere Informationen zu liefern.
 | 
			
		||||
  return `
 | 
			
		||||
Du bist eine KI für digitale Forensik. Der Nutzer beschreibt ein forensisches Szenario. Analysiere die Eingabe.
 | 
			
		||||
 | 
			
		||||
Nutzer-Eingabe: "${input}"
 | 
			
		||||
Wenn die Beschreibung unvollständig oder vage ist, stelle bis zu drei präzise Rückfragen im JSON-Array-Format, um wichtige Details zu klären (z. B. Vorfalltyp, System, Ziel, Datenquellen, Zeit, Beteiligte, rechtlicher Rahmen).
 | 
			
		||||
 | 
			
		||||
Konzentriere dich auf wichtige Details die für eine forensische Untersuchung relevant sind:
 | 
			
		||||
- Betroffene Systeme/Plattformen
 | 
			
		||||
- Zeitrahmen/Timeline
 | 
			
		||||
- Verfügbare Evidenz
 | 
			
		||||
- Verdächtige Aktivitäten
 | 
			
		||||
- Technische Details
 | 
			
		||||
Wenn die Eingabe bereits klar, spezifisch und vollständig ist, gib stattdessen nur eine leere Liste [] zurück.
 | 
			
		||||
 | 
			
		||||
Antworte NUR mit einem JSON-Array von 2-3 kurzen Fragen (max. 60 Zeichen pro Frage):
 | 
			
		||||
["Frage 1?", "Frage 2?", "Frage 3?"]
 | 
			
		||||
Antwortformat strikt:
 | 
			
		||||
 | 
			
		||||
Keine zusätzlichen Erklärungen.`;
 | 
			
		||||
\`\`\`json
 | 
			
		||||
[
 | 
			
		||||
  "Frage 1?",
 | 
			
		||||
  "Frage 2?",
 | 
			
		||||
  "Frage 3?"
 | 
			
		||||
]
 | 
			
		||||
\`\`\`
 | 
			
		||||
 | 
			
		||||
Nutzer-Eingabe:
 | 
			
		||||
${input}
 | 
			
		||||
  `.trim();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const POST: APIRoute = async ({ request }) => {
 | 
			
		||||
  try {
 | 
			
		||||
    const authResult = await withAPIAuth(request, 'ai');
 | 
			
		||||
@ -138,13 +144,10 @@ export const POST: APIRoute = async ({ request }) => {
 | 
			
		||||
 | 
			
		||||
    let questions;
 | 
			
		||||
    try {
 | 
			
		||||
    // Clean up the response and parse JSON
 | 
			
		||||
    console.log('[DEBUG-ENHANCE]Raw AI content:', aiContent);
 | 
			
		||||
    const cleanedContent = aiContent
 | 
			
		||||
        .replace(/^```json\s*/i, '')
 | 
			
		||||
        .replace(/\s*```\s*$/, '')
 | 
			
		||||
        .trim();
 | 
			
		||||
    console.log('[DEBUG-ENHANCE]Cleaned content:', cleanedContent);
 | 
			
		||||
    questions = JSON.parse(cleanedContent);
 | 
			
		||||
      
 | 
			
		||||
      if (!Array.isArray(questions) || questions.length === 0) {
 | 
			
		||||
@ -153,7 +156,7 @@ export const POST: APIRoute = async ({ request }) => {
 | 
			
		||||
      
 | 
			
		||||
      // Validate and clean questions
 | 
			
		||||
      questions = questions
 | 
			
		||||
        .filter(q => typeof q === 'string' && q.length > 5 && q.length < 100)
 | 
			
		||||
        .filter(q => typeof q === 'string' && q.length > 5 && q.length < 120)
 | 
			
		||||
        .slice(0, 3);
 | 
			
		||||
        
 | 
			
		||||
      if (questions.length === 0) {
 | 
			
		||||
 | 
			
		||||
@ -1924,10 +1924,10 @@ footer {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Add to global.css - Smart Prompting Styles */
 | 
			
		||||
/* Smart Prompting Styles - Simplified */
 | 
			
		||||
.smart-prompting-container {
 | 
			
		||||
  margin-top: 1rem;
 | 
			
		||||
  animation: slideDown 0.3s ease-out;
 | 
			
		||||
  animation: smartPromptSlideIn 0.4s cubic-bezier(0.4, 0, 0.2, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.prompting-status {
 | 
			
		||||
@ -1955,33 +1955,34 @@ footer {
 | 
			
		||||
  border: 1px solid var(--color-border);
 | 
			
		||||
  border-radius: 0.375rem;
 | 
			
		||||
  padding: 0.75rem;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  transition: var(--transition-fast);
 | 
			
		||||
  font-size: 0.875rem;
 | 
			
		||||
  line-height: 1.4;
 | 
			
		||||
  line-height: 1.5;
 | 
			
		||||
  color: var(--color-text);
 | 
			
		||||
  border-left: 3px solid var(--color-accent);
 | 
			
		||||
  transition: var(--transition-fast);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.suggestion-item:hover {
 | 
			
		||||
  background-color: var(--color-bg-tertiary);
 | 
			
		||||
  border-color: var(--color-accent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.suggestion-item .suggestion-number {
 | 
			
		||||
.suggestion-number {
 | 
			
		||||
  color: var(--color-accent);
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
  flex-shrink: 0;
 | 
			
		||||
  font-weight: 600;
 | 
			
		||||
  margin-right: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.suggestion-item .suggestion-text {
 | 
			
		||||
  flex: 1;
 | 
			
		||||
/* Improved animation - smoother and simpler */
 | 
			
		||||
@keyframes smartPromptSlideIn {
 | 
			
		||||
  from {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
    transform: translateY(-10px);
 | 
			
		||||
    max-height: 0;
 | 
			
		||||
  }
 | 
			
		||||
  to {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
    transform: translateY(0);
 | 
			
		||||
    max-height: 200px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.suggestion-item .suggestion-icon {
 | 
			
		||||
  flex-shrink: 0;
 | 
			
		||||
  margin-left: 0.5rem;
 | 
			
		||||
  color: var(--color-text-secondary);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Enhanced contextual analysis cards */
 | 
			
		||||
.contextual-analysis-card {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user