// ============================================================================= // TOM Generator AI Prompts // Prompts for document analysis and TOM description generation // ============================================================================= import { CompanyProfile, DataProfile, ArchitectureProfile, RiskProfile, DocumentType, ControlLibraryEntry, } from '../types' // ============================================================================= // DOCUMENT ANALYSIS PROMPT // ============================================================================= export interface DocumentAnalysisPromptContext { documentType: DocumentType documentText: string controlIds?: string[] language?: 'de' | 'en' } export function getDocumentAnalysisPrompt( context: DocumentAnalysisPromptContext ): string { const { documentType, documentText, controlIds, language = 'de' } = context const controlContext = controlIds?.length ? `\nRELEVANT CONTROL IDS: ${controlIds.join(', ')}` : '' if (language === 'de') { return `Du bist ein Experte für Datenschutz-Compliance und analysierst ein Dokument für die TOM-Dokumentation nach DSGVO Art. 32. DOKUMENTTYP: ${documentType} ${controlContext} DOKUMENTTEXT: ${documentText} AUFGABE: Analysiere das Dokument und extrahiere die folgenden Informationen: 1. SUMMARY: Eine Zusammenfassung in 2-3 Sätzen, die die Relevanz für den Datenschutz beschreibt. 2. EXTRACTED_CLAUSES: Alle Klauseln, die sich auf technische und organisatorische Sicherheitsmaßnahmen beziehen. Für jede Klausel: - id: Eindeutige ID (z.B. "clause-1") - text: Der extrahierte Text - type: Art der Maßnahme (z.B. "encryption", "access-control", "backup", "training") - relatedControlId: Falls zutreffend, die TOM-Control-ID (z.B. "TOM-ENC-01") 3. APPLICABLE_CONTROLS: Liste der TOM-Control-IDs, die durch dieses Dokument belegt werden könnten. 4. GAPS: Identifizierte Lücken oder fehlende Maßnahmen, die im Dokument nicht adressiert werden. 5. CONFIDENCE: Dein Vertrauenswert für die Analyse (0.0 bis 1.0). Antworte im JSON-Format: { "summary": "...", "extractedClauses": [ { "id": "...", "text": "...", "type": "...", "relatedControlId": "..." } ], "applicableControls": ["TOM-..."], "gaps": ["..."], "confidence": 0.85 }` } return `You are a data protection compliance expert analyzing a document for TOM documentation according to GDPR Art. 32. DOCUMENT TYPE: ${documentType} ${controlContext} DOCUMENT TEXT: ${documentText} TASK: Analyze the document and extract the following information: 1. SUMMARY: A 2-3 sentence summary describing the relevance for data protection. 2. EXTRACTED_CLAUSES: All clauses related to technical and organizational security measures. For each clause: - id: Unique ID (e.g., "clause-1") - text: The extracted text - type: Type of measure (e.g., "encryption", "access-control", "backup", "training") - relatedControlId: If applicable, the TOM control ID (e.g., "TOM-ENC-01") 3. APPLICABLE_CONTROLS: List of TOM control IDs that could be evidenced by this document. 4. GAPS: Identified gaps or missing measures not addressed in the document. 5. CONFIDENCE: Your confidence score for the analysis (0.0 to 1.0). Respond in JSON format: { "summary": "...", "extractedClauses": [ { "id": "...", "text": "...", "type": "...", "relatedControlId": "..." } ], "applicableControls": ["TOM-..."], "gaps": ["..."], "confidence": 0.85 }` } // ============================================================================= // TOM DESCRIPTION GENERATION PROMPT // ============================================================================= export interface TOMDescriptionPromptContext { control: ControlLibraryEntry companyProfile: CompanyProfile dataProfile: DataProfile architectureProfile: ArchitectureProfile riskProfile: RiskProfile language?: 'de' | 'en' } export function getTOMDescriptionPrompt( context: TOMDescriptionPromptContext ): string { const { control, companyProfile, dataProfile, architectureProfile, riskProfile, language = 'de', } = context if (language === 'de') { return `Du bist ein Experte für Datenschutz-Compliance und erstellst eine unternehmensspezifische TOM-Beschreibung. KONTROLLE: - Name: ${control.name.de} - Beschreibung: ${control.description.de} - Kategorie: ${control.category} - Typ: ${control.type} UNTERNEHMENSPROFIL: - Branche: ${Array.isArray(companyProfile.industry) ? companyProfile.industry.join(', ') : companyProfile.industry} - Größe: ${companyProfile.size} - Rolle: ${companyProfile.role} - Produkte/Services: ${companyProfile.products.join(', ')} DATENPROFIL: - Datenkategorien: ${dataProfile.categories.join(', ')} - Besondere Kategorien: ${dataProfile.hasSpecialCategories ? 'Ja' : 'Nein'} - Betroffene: ${dataProfile.subjects.join(', ')} - Datenvolumen: ${dataProfile.dataVolume} ARCHITEKTUR: - Hosting-Modell: ${architectureProfile.hostingModel} - Standort: ${architectureProfile.hostingLocation} - Mandantentrennung: ${architectureProfile.multiTenancy} SCHUTZBEDARF: ${riskProfile.protectionLevel} AUFGABE: Erstelle eine unternehmensspezifische Beschreibung dieser TOM in 3-5 Sätzen. Die Beschreibung soll: - Auf das spezifische Unternehmensprofil zugeschnitten sein - Konkrete Maßnahmen beschreiben, die für dieses Unternehmen relevant sind - In formeller Geschäftssprache verfasst sein - Keine Platzhalter oder generischen Formulierungen enthalten Antworte nur mit der Beschreibung, ohne zusätzliche Erklärungen.` } return `You are a data protection compliance expert creating a company-specific TOM description. CONTROL: - Name: ${control.name.en} - Description: ${control.description.en} - Category: ${control.category} - Type: ${control.type} COMPANY PROFILE: - Industry: ${Array.isArray(companyProfile.industry) ? companyProfile.industry.join(', ') : companyProfile.industry} - Size: ${companyProfile.size} - Role: ${companyProfile.role} - Products/Services: ${companyProfile.products.join(', ')} DATA PROFILE: - Data Categories: ${dataProfile.categories.join(', ')} - Special Categories: ${dataProfile.hasSpecialCategories ? 'Yes' : 'No'} - Data Subjects: ${dataProfile.subjects.join(', ')} - Data Volume: ${dataProfile.dataVolume} ARCHITECTURE: - Hosting Model: ${architectureProfile.hostingModel} - Location: ${architectureProfile.hostingLocation} - Multi-tenancy: ${architectureProfile.multiTenancy} PROTECTION LEVEL: ${riskProfile.protectionLevel} TASK: Create a company-specific description of this TOM in 3-5 sentences. The description should: - Be tailored to the specific company profile - Describe concrete measures relevant to this company - Be written in formal business language - Contain no placeholders or generic formulations Respond only with the description, without additional explanations.` } // ============================================================================= // GAP RECOMMENDATIONS PROMPT // ============================================================================= export interface GapRecommendationsPromptContext { missingControls: Array<{ controlId: string; name: string; priority: string }> partialControls: Array<{ controlId: string; name: string; missingAspects: string[] }> companyProfile: CompanyProfile riskProfile: RiskProfile language?: 'de' | 'en' } export function getGapRecommendationsPrompt( context: GapRecommendationsPromptContext ): string { const { missingControls, partialControls, companyProfile, riskProfile, language = 'de', } = context const missingList = missingControls .map((c) => `- ${c.name} (${c.controlId}, Priorität: ${c.priority})`) .join('\n') const partialList = partialControls .map((c) => `- ${c.name} (${c.controlId}): Fehlend: ${c.missingAspects.join(', ')}`) .join('\n') if (language === 'de') { return `Du bist ein Experte für Datenschutz-Compliance und erstellst Handlungsempfehlungen für TOM-Lücken. UNTERNEHMEN: - Branche: ${Array.isArray(companyProfile.industry) ? companyProfile.industry.join(', ') : companyProfile.industry} - Größe: ${companyProfile.size} - Rolle: ${companyProfile.role} SCHUTZBEDARF: ${riskProfile.protectionLevel} FEHLENDE KONTROLLEN: ${missingList || 'Keine'} TEILWEISE IMPLEMENTIERTE KONTROLLEN: ${partialList || 'Keine'} AUFGABE: Erstelle konkrete Handlungsempfehlungen, um die Lücken zu schließen. Für jede Empfehlung: 1. Priorisiere nach Schutzbedarf und DSGVO-Relevanz 2. Berücksichtige die Unternehmensgröße und Branche 3. Gib konkrete, umsetzbare Schritte an 4. Schätze den Aufwand ein (niedrig/mittel/hoch) Antworte im JSON-Format: { "recommendations": [ { "priority": "HIGH", "title": "...", "description": "...", "steps": ["..."], "effort": "MEDIUM", "relatedControls": ["TOM-..."] } ], "summary": "Kurze Zusammenfassung der wichtigsten Maßnahmen" }` } return `You are a data protection compliance expert creating recommendations for TOM gaps. COMPANY: - Industry: ${Array.isArray(companyProfile.industry) ? companyProfile.industry.join(', ') : companyProfile.industry} - Size: ${companyProfile.size} - Role: ${companyProfile.role} PROTECTION LEVEL: ${riskProfile.protectionLevel} MISSING CONTROLS: ${missingList || 'None'} PARTIALLY IMPLEMENTED CONTROLS: ${partialList || 'None'} TASK: Create concrete recommendations to close the gaps. For each recommendation: 1. Prioritize by protection level and GDPR relevance 2. Consider company size and industry 3. Provide concrete, actionable steps 4. Estimate effort (low/medium/high) Respond in JSON format: { "recommendations": [ { "priority": "HIGH", "title": "...", "description": "...", "steps": ["..."], "effort": "MEDIUM", "relatedControls": ["TOM-..."] } ], "summary": "Brief summary of the most important measures" }` } // ============================================================================= // DOCUMENT TYPE DETECTION PROMPT // ============================================================================= export function getDocumentTypeDetectionPrompt( documentText: string, filename: string ): string { return `Du bist ein Experte für Datenschutz-Dokumente und sollst den Dokumenttyp erkennen. DATEINAME: ${filename} DOKUMENTTEXT (Auszug): ${documentText.substring(0, 2000)} MÖGLICHE DOKUMENTTYPEN: - AVV: Auftragsverarbeitungsvertrag - DPA: Data Processing Agreement (englisch) - SLA: Service Level Agreement - NDA: Geheimhaltungsvereinbarung - POLICY: Interne Richtlinie (z.B. Passwortrichtlinie, IT-Sicherheitsrichtlinie) - CERTIFICATE: Zertifikat (z.B. ISO 27001, SOC 2) - AUDIT_REPORT: Audit-Bericht oder Prüfbericht - OTHER: Sonstiges Dokument Antworte im JSON-Format: { "documentType": "...", "confidence": 0.85, "reasoning": "Kurze Begründung" }` } // ============================================================================= // CLAUSE EXTRACTION PROMPT // ============================================================================= export function getClauseExtractionPrompt( documentText: string, controlCategory: string ): string { return `Du bist ein Experte für Datenschutz-Compliance und extrahierst Klauseln aus einem Dokument. GESUCHTE KATEGORIE: ${controlCategory} DOKUMENTTEXT: ${documentText} AUFGABE: Extrahiere alle Klauseln, die sich auf die Kategorie "${controlCategory}" beziehen. Antworte im JSON-Format: { "clauses": [ { "id": "clause-1", "text": "Der extrahierte Text der Klausel", "section": "Abschnittsnummer oder -name falls vorhanden", "relevance": "Kurze Erklärung der Relevanz", "matchScore": 0.9 } ], "totalFound": 3 }` } // ============================================================================= // COMPLIANCE ASSESSMENT PROMPT // ============================================================================= export function getComplianceAssessmentPrompt( tomDescription: string, evidenceDescriptions: string[], controlRequirements: string[] ): string { return `Du bist ein Experte für Datenschutz-Compliance und bewertest die Umsetzung einer TOM. TOM-BESCHREIBUNG: ${tomDescription} ANFORDERUNGEN AN NACHWEISE: ${controlRequirements.map((r, i) => `${i + 1}. ${r}`).join('\n')} VORHANDENE NACHWEISE: ${evidenceDescriptions.map((e, i) => `${i + 1}. ${e}`).join('\n') || 'Keine Nachweise vorhanden'} AUFGABE: Bewerte den Umsetzungsgrad dieser TOM. Antworte im JSON-Format: { "implementationStatus": "NOT_IMPLEMENTED" | "PARTIAL" | "IMPLEMENTED", "score": 0-100, "coveredRequirements": ["..."], "missingRequirements": ["..."], "recommendations": ["..."], "reasoning": "Begründung der Bewertung" }` } // ============================================================================= // EXPORT FUNCTIONS // ============================================================================= export const AI_PROMPTS = { documentAnalysis: getDocumentAnalysisPrompt, tomDescription: getTOMDescriptionPrompt, gapRecommendations: getGapRecommendationsPrompt, documentTypeDetection: getDocumentTypeDetectionPrompt, clauseExtraction: getClauseExtractionPrompt, complianceAssessment: getComplianceAssessmentPrompt, }