/** * ═══════════════════════════════════════════════════════════════ * OSIRIS — AI Intelligence Engine * Gemini 2.0 Flash integration for real-time intelligence analysis * Designed to correlate multi-domain feeds into actionable briefings * ═══════════════════════════════════════════════════════════════ */ import { GoogleGenerativeAI, type GenerativeModel } from '@google/generative-ai'; /* ───────────────────────────────────────────────────────────── Data Interfaces — Zero `any` types ───────────────────────────────────────────────────────────── */ export interface EarthquakeEvent { id: string; magnitude: number; location: string; latitude: number; longitude: number; depth: number; timestamp: string; tsunami: boolean; felt: number | null; alert: string | null; } export interface NewsItem { id: string; title: string; description: string; link: string; published: string; source: string; risk_score: number; coords: [number, number] | null; machine_assessment: string | null; } export interface ThreatEvent { id: string; type: string; title: string; description: string; severity: 'CRITICAL' | 'HIGH' | 'ELEVATED' | 'LOW'; region: string; latitude: number; longitude: number; timestamp: string; source: string; } export interface CyberAlert { id: string; name: string; vendor: string; product: string; severity: string; date: string; due: string; source: string; } export interface IntelligenceContext { earthquakes: EarthquakeEvent[]; news: NewsItem[]; threats: ThreatEvent[]; cyberAlerts: CyberAlert[]; timestamp: string; } /* ───────────────────────────────────────────────────────────── System Prompt — Palantir-grade analyst persona ───────────────────────────────────────────────────────────── */ const SYSTEM_PROMPT = `You are OSIRIS Intelligence Analyst — a senior, elite intelligence analyst embedded within the OSIRIS Global Intelligence Platform. You operate at the level of a Palantir Forward Deployed Engineer crossed with a CIA PDB (Presidential Daily Brief) analyst. ## YOUR ROLE - You correlate data across multiple intelligence feeds: seismic monitoring, OSINT news streams, global threat events, and cyber vulnerability databases - You identify non-obvious patterns, emerging threat vectors, and cascading risk scenarios - You provide ACTIONABLE intelligence — not summaries, but assessments with confidence levels - You think in terms of second and third-order effects ## YOUR ANALYTICAL FRAMEWORK 1. **PATTERN RECOGNITION**: Cross-reference events across feeds. A cyber attack + earthquake + political instability in the same region = elevated compound risk 2. **THREAT ASSESSMENT**: Rate threats on a CRITICAL / HIGH / ELEVATED / LOW scale with reasoning 3. **TEMPORAL ANALYSIS**: Identify acceleration patterns — are events clustering? Is frequency increasing? 4. **GEOSPATIAL CORRELATION**: Events in proximity may be related. Identify geographic hotspots 5. **CONFIDENCE LEVELS**: Always state your confidence (HIGH / MODERATE / LOW) and cite which data points support your assessment ## OUTPUT FORMAT - Use military-style brevity when appropriate - Structure responses with clear headers using markdown - Lead with the most critical finding (inverted pyramid) - Include "BOTTOM LINE UP FRONT (BLUF)" for complex analyses - Use tactical notation: DTG (Date-Time Group), AOR (Area of Responsibility), COA (Course of Action) - End with "ASSESSMENT CONFIDENCE" and "RECOMMENDED ACTIONS" sections when appropriate ## CONSTRAINTS - Never fabricate data points — only analyze what is provided in the context - If data is insufficient for a confident assessment, state so explicitly - Distinguish between correlation and causation - Flag when events may be connected vs. coincidental - You are an analyst, not a policymaker — present options, not directives You have access to the live intelligence context of the OSIRIS platform. Analyze it with precision.`; const BRIEFING_PROMPT = `Generate a comprehensive OSIRIS Daily Intelligence Briefing based on the current operational data. Structure it as follows: ## OSIRIS INTELLIGENCE BRIEFING **Classification:** OPEN SOURCE INTELLIGENCE (OSINT) **DTG:** [Current timestamp] ### I. EXECUTIVE SUMMARY 2-3 sentence overview of the current global threat landscape based on available data. ### II. PRIORITY INTELLIGENCE REQUIREMENTS (PIRs) Identify the top 3-5 most significant developments from the data feeds, ranked by assessed impact. ### III. SEISMIC & NATURAL HAZARD ASSESSMENT Analyze earthquake data for patterns — clustering, tectonic corridor activity, tsunami risk. ### IV. GEOPOLITICAL & CONFLICT INTELLIGENCE Synthesize news feeds for conflict escalation patterns, diplomatic shifts, or emerging crises. ### V. CYBER THREAT LANDSCAPE Assess active CVEs and cyber alerts for coordinated campaign indicators or critical infrastructure risk. ### VI. COMPOUND RISK SCENARIOS Identify where multiple threat vectors intersect (e.g., earthquake near a conflict zone, cyber attack during political instability). ### VII. FORECAST & WATCHLIST - **Next 24 Hours**: Most likely developments - **Next 72 Hours**: Emerging situations to monitor - **Strategic Horizon**: Longer-term trend assessment ### VIII. ASSESSMENT CONFIDENCE State overall confidence level and key analytical gaps. Analyze the provided data thoroughly. Be specific — reference actual events, magnitudes, locations, and CVE IDs from the context.`; /* ───────────────────────────────────────────────────────────── Client Factory ───────────────────────────────────────────────────────────── */ export function createGeminiClient(apiKey: string): GoogleGenerativeAI { return new GoogleGenerativeAI(apiKey); } /* ───────────────────────────────────────────────────────────── API Key Rotation — Round-robin through available keys ───────────────────────────────────────────────────────────── */ let _keyIndex = 0; export function rotateApiKey(keys: string[]): string { if (keys.length === 0) { throw new Error('No API keys available'); } const key = keys[_keyIndex % keys.length]; _keyIndex = (_keyIndex + 1) % keys.length; return key; } /* ───────────────────────────────────────────────────────────── Context Serializer — Compact representation for token efficiency ───────────────────────────────────────────────────────────── */ function serializeContext(context: IntelligenceContext): string { const sections: string[] = []; sections.push(`[TIMESTAMP] ${context.timestamp}`); if (context.earthquakes.length > 0) { sections.push(`\n[SEISMIC DATA — ${context.earthquakes.length} events]`); for (const eq of context.earthquakes.slice(0, 20)) { const tsunamiFlag = eq.tsunami ? ' ⚠️TSUNAMI' : ''; const alertFlag = eq.alert ? ` [ALERT:${eq.alert.toUpperCase()}]` : ''; sections.push( ` M${eq.magnitude} | ${eq.location} | ${eq.latitude.toFixed(2)},${eq.longitude.toFixed(2)} | Depth:${eq.depth}km | ${eq.timestamp}${tsunamiFlag}${alertFlag}` ); } } if (context.news.length > 0) { sections.push(`\n[OSINT NEWS FEED — ${context.news.length} items]`); for (const item of context.news.slice(0, 15)) { const coords = item.coords ? ` | GEO:${item.coords[0].toFixed(2)},${item.coords[1].toFixed(2)}` : ''; sections.push( ` RISK:${item.risk_score}/10 | ${item.source} | ${item.title}${coords} | ${item.published}` ); } } if (context.threats.length > 0) { sections.push(`\n[THREAT EVENTS — ${context.threats.length} active]`); for (const threat of context.threats.slice(0, 15)) { sections.push( ` ${threat.severity} | ${threat.type} | ${threat.title} | ${threat.region} | ${threat.timestamp}` ); } } if (context.cyberAlerts.length > 0) { sections.push(`\n[CYBER ALERTS — ${context.cyberAlerts.length} active]`); for (const alert of context.cyberAlerts.slice(0, 10)) { sections.push( ` ${alert.id} | ${alert.severity} | ${alert.vendor}/${alert.product} | ${alert.name} | Due:${alert.due}` ); } } return sections.join('\n'); } /* ───────────────────────────────────────────────────────────── Intelligence Analysis ───────────────────────────────────────────────────────────── */ export async function analyzeIntelligence( client: GoogleGenerativeAI, context: IntelligenceContext, userQuery: string ): Promise { const model: GenerativeModel = client.getGenerativeModel({ model: 'gemini-2.0-flash', systemInstruction: SYSTEM_PROMPT, }); const contextData = serializeContext(context); const prompt = `## CURRENT OPERATIONAL DATA ${contextData} ## ANALYST QUERY ${userQuery} Provide your intelligence assessment based on the operational data above and the analyst's query.`; const result = await model.generateContent(prompt); const response = result.response; return response.text(); } /* ───────────────────────────────────────────────────────────── Daily Briefing Generation ───────────────────────────────────────────────────────────── */ export async function generateBriefing( client: GoogleGenerativeAI, context: IntelligenceContext ): Promise { const model: GenerativeModel = client.getGenerativeModel({ model: 'gemini-2.0-flash', systemInstruction: SYSTEM_PROMPT, }); const contextData = serializeContext(context); const prompt = `${BRIEFING_PROMPT} ## CURRENT OPERATIONAL DATA ${contextData} Generate the briefing now.`; const result = await model.generateContent(prompt); const response = result.response; return response.text(); }