| continue where the previous AI agent left off: """ |
| π ARF Ultimate Investor Demo v3.8.0 - ENTERPRISE EDITION |
| ENHANCED VERSION WITH CLEAR BOUNDARIES AND RELIABLE VISUALIZATIONS |
| Fixed to show clear OSS vs Enterprise boundaries with architectural honesty |
| """ |
|
|
| import logging |
| import sys |
| import traceback |
| import json |
| import datetime |
| import asyncio |
| import time |
| import random |
| from pathlib import Path |
| from typing import Dict, List, Any, Optional, Tuple |
|
|
| |
| |
| |
| logging.basicConfig( |
| level=logging.INFO, |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
| handlers=[ |
| logging.StreamHandler(sys.stdout), |
| logging.FileHandler('arf_demo.log') |
| ] |
| ) |
| logger = logging.getLogger(__name__) |
|
|
| |
| sys.path.insert(0, str(Path(__file__).parent)) |
|
|
| |
| |
| |
| class BoundaryManager: |
| """Manages clear boundaries between OSS and Enterprise""" |
| |
| @staticmethod |
| def get_system_boundaries() -> Dict[str, Any]: |
| """Get clear system boundary definitions""" |
| installation = get_installation_status() |
| |
| boundaries = { |
| "oss": { |
| "available": installation["oss_installed"], |
| "version": installation["oss_version"] or "mock", |
| "license": "Apache 2.0", |
| "capabilities": ["advisory", "analysis", "reasoning"], |
| "cannot_do": ["execute", "modify_infrastructure", "autonomous_healing"], |
| "label": "β
REAL ARF OSS" if installation["oss_installed"] else "β οΈ MOCK ARF", |
| "color": "#10b981" if installation["oss_installed"] else "#64748b", |
| "icon": "β
" if installation["oss_installed"] else "β οΈ" |
| }, |
| "enterprise": { |
| "available": installation["enterprise_installed"], |
| "version": installation["enterprise_version"] or "simulated", |
| "license": "Commercial" if installation["enterprise_installed"] else "SIMULATED", |
| "capabilities": ["autonomous_execution", "rollback_guarantees", "novel_protocols"], |
| "requires": ["infrastructure_access", "safety_controls", "enterprise_license"], |
| "label": "π REAL Enterprise" if installation["enterprise_installed"] else "π SIMULATED Enterprise", |
| "color": "#8b5cf6" if installation["enterprise_installed"] else "#f59e0b", |
| "icon": "π" if installation["enterprise_installed"] else "π" |
| }, |
| "demo_mode": { |
| "architecture": "OSS advises β Enterprise executes", |
| "honesty_level": "Architecturally Honest", |
| "transparency": "Clear boundaries between real and simulated" |
| } |
| } |
| |
| return boundaries |
| |
| @staticmethod |
| def get_boundary_badges() -> str: |
| """Get HTML badges showing clear boundaries""" |
| boundaries = BoundaryManager.get_system_boundaries() |
| oss = boundaries["oss"] |
| enterprise = boundaries["enterprise"] |
| |
| return f""" |
| <div style="margin: 20px 0; padding: 15px; background: #f8fafc; border-radius: 12px; |
| border: 2px solid #e2e8f0; text-align: center;"> |
| <div style="font-size: 14px; color: #64748b; margin-bottom: 15px; font-weight: 500;"> |
| ποΈ System Architecture Boundaries |
| </div> |
| |
| <div style="display: flex; justify-content: center; align-items: center; gap: 20px; |
| flex-wrap: wrap; margin-bottom: 15px;"> |
| <div style="display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; |
| background: {oss['color']}; color: white; border-radius: 20px; |
| font-size: 12px; font-weight: bold;"> |
| <span>{oss['icon']}</span> |
| <span>{oss['label']} v{oss['version']}</span> |
| </div> |
| |
| <div style="font-size: 20px; color: #94a3b8;">β</div> |
| |
| <div style="display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; |
| background: {enterprise['color']}; color: white; border-radius: 20px; |
| font-size: 12px; font-weight: bold;"> |
| <span>{enterprise['icon']}</span> |
| <span>{enterprise['label']}</span> |
| </div> |
| </div> |
| |
| <div style="font-size: 13px; color: #475569; line-height: 1.5;"> |
| <strong>OSS advises</strong> ({oss['license']}) β’ <strong>Enterprise executes</strong> ({enterprise['license']})<br> |
| Clear separation ensures production safety and architectural honesty |
| </div> |
| </div> |
| """ |
| |
| @staticmethod |
| def create_agent_with_boundary(agent_name: str, status: str, |
| is_real_arf: bool = True, confidence: float = 0.0) -> str: |
| """Create agent display with clear boundary indicator""" |
| icons = { |
| "Detection": "π΅οΈββοΈ", |
| "Recall": "π§ ", |
| "Decision": "π―" |
| } |
| |
| border_color = "#10b981" if is_real_arf else "#f59e0b" |
| background = "#f0fdf4" if is_real_arf else "#fef3c7" |
| badge_text = "REAL ARF" if is_real_arf else "SIMULATED" |
| |
| |
| confidence_bar = "" |
| if confidence > 0: |
| confidence_color = "#10b981" if confidence >= 0.9 else "#f59e0b" if confidence >= 0.7 else "#ef4444" |
| confidence_bar = f""" |
| <div style="margin: 10px 0;"> |
| <div style="display: flex; justify-content: space-between; font-size: 12px; margin-bottom: 4px;"> |
| <span style="color: #64748b;">Confidence</span> |
| <span style="color: {confidence_color}; font-weight: 600;">{confidence:.1%}</span> |
| </div> |
| <div style="height: 6px; background: #e2e8f0; border-radius: 3px;"> |
| <div style="width: {confidence*100}%; height: 100%; background: {confidence_color}; |
| border-radius: 3px;"></div> |
| </div> |
| </div> |
| """ |
| |
| return f""" |
| <div style="border: 2px solid {border_color}; border-radius: 12px; padding: 20px; |
| background: {background}; text-align: center; position: relative;"> |
| |
| <!-- Boundary badge --> |
| <div style="position: absolute; top: -10px; left: 50%; transform: translateX(-50%); |
| padding: 2px 12px; background: {border_color}; color: white; |
| border-radius: 12px; font-size: 11px; font-weight: bold;"> |
| {badge_text} |
| </div> |
| |
| <!-- Agent icon and name --> |
| <div style="font-size: 32px; margin-bottom: 10px;">{icons.get(agent_name, 'π€')}</div> |
| <div style="font-size: 16px; font-weight: 600; color: #1e293b; margin-bottom: 8px;"> |
| {agent_name} Agent |
| </div> |
| |
| <!-- Status --> |
| <div style="font-size: 14px; color: #475569; margin-bottom: 12px; line-height: 1.4;"> |
| {status} |
| </div> |
| |
| {confidence_bar} |
| |
| <!-- Mode indicator --> |
| <div style="margin-top: 10px; padding: 6px 12px; background: white; |
| border-radius: 8px; display: inline-block;"> |
| <div style="font-size: 12px; color: {border_color}; font-weight: 600;"> |
| {badge_text} MODE |
| </div> |
| </div> |
| </div> |
| """ |
| |
| @staticmethod |
| def create_boundary_indicator(action: str, is_simulated: bool = True) -> str: |
| """Create clear execution boundary indicator""" |
| if is_simulated: |
| return f""" |
| <div style="border: 3px dashed #f59e0b; border-radius: 16px; padding: 25px; |
| background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); |
| text-align: center; margin: 20px 0;"> |
| <div style="font-size: 36px; margin-bottom: 15px;">π</div> |
| <h4 style="margin: 0 0 12px 0; font-size: 20px; color: #92400e; font-weight: 700;"> |
| SIMULATED ENTERPRISE EXECUTION |
| </h4> |
| <p style="font-size: 15px; color: #92400e; margin-bottom: 15px; line-height: 1.6;"> |
| <strong>Action:</strong> {action}<br> |
| <strong>Mode:</strong> Enterprise Simulation (not real execution)<br> |
| <strong>Boundary:</strong> OSS advises β Enterprise would execute |
| </p> |
| <div style="display: inline-block; padding: 10px 24px; background: #92400e; |
| border-radius: 20px; font-size: 14px; font-weight: bold; color: white; |
| text-transform: uppercase; letter-spacing: 1px;"> |
| DEMO BOUNDARY |
| </div> |
| <p style="font-size: 13px; color: #92400e; margin-top: 15px; font-style: italic;"> |
| In production, Enterprise edition would execute against real infrastructure |
| </p> |
| </div> |
| """ |
| else: |
| return f""" |
| <div style="border: 3px solid #10b981; border-radius: 16px; padding: 25px; |
| background: linear-gradient(135deg, #f0fdf4 0%, #bbf7d0 100%); |
| text-align: center; margin: 20px 0;"> |
| <div style="font-size: 36px; margin-bottom: 15px;">β‘</div> |
| <h4 style="margin: 0 0 12px 0; font-size: 20px; color: #065f46; font-weight: 700;"> |
| REAL ENTERPRISE EXECUTION |
| </h4> |
| <p style="font-size: 15px; color: #065f46; margin-bottom: 15px; line-height: 1.6;"> |
| <strong>Action:</strong> {action}<br> |
| <strong>Mode:</strong> Enterprise Autonomous<br> |
| <strong>Boundary:</strong> Real execution with safety guarantees |
| </p> |
| <div style="display: inline-block; padding: 10px 24px; background: #065f46; |
| border-radius: 20px; font-size: 14px; font-weight: bold; color: white; |
| text-transform: uppercase; letter-spacing: 1px;"> |
| ENTERPRISE+ |
| </div> |
| </div> |
| """ |
|
|
| |
| |
| |
| def check_arf_installation(): |
| """ |
| Check if real ARF packages are installed |
| Returns detailed installation status with boundary info |
| """ |
| results = { |
| "oss_installed": False, |
| "enterprise_installed": False, |
| "oss_version": None, |
| "enterprise_version": None, |
| "oss_edition": "unknown", |
| "oss_license": "unknown", |
| "execution_allowed": False, |
| "recommendations": [], |
| "boundaries": { |
| "oss_can": ["advisory_analysis", "rag_search", "healing_intent"], |
| "oss_cannot": ["execute", "modify_infra", "autonomous_healing"], |
| "enterprise_requires": ["license", "infra_access", "safety_controls"] |
| }, |
| "badges": { |
| "oss": {"text": "β οΈ Mock ARF", "color": "#f59e0b", "icon": "β οΈ"}, |
| "enterprise": {"text": "π Enterprise Required", "color": "#64748b", "icon": "π"} |
| }, |
| "timestamp": datetime.datetime.now().isoformat() |
| } |
| |
| |
| try: |
| import agentic_reliability_framework as arf_oss |
| results["oss_installed"] = True |
| results["oss_version"] = getattr(arf_oss, '__version__', '3.3.7') |
| |
| |
| try: |
| results["oss_edition"] = arf_oss.OSS_EDITION |
| results["oss_license"] = arf_oss.OSS_LICENSE |
| results["execution_allowed"] = arf_oss.EXECUTION_ALLOWED |
| except Exception as e: |
| logger.debug(f"Could not get OSS details: {e}") |
| |
| results["badges"]["oss"] = { |
| "text": f"β
ARF OSS v{results['oss_version']}", |
| "color": "#10b981", |
| "icon": "β
" |
| } |
| |
| logger.info(f"β
ARF OSS v{results['oss_version']} detected") |
| |
| except ImportError as e: |
| results["recommendations"].append( |
| "Install real ARF OSS: `pip install agentic-reliability-framework==3.3.7`" |
| ) |
| logger.info("β οΈ ARF OSS not installed - using mock mode") |
| |
| |
| try: |
| import arf_enterprise |
| results["enterprise_installed"] = True |
| results["enterprise_version"] = getattr(arf_enterprise, '__version__', '1.0.2') |
| results["badges"]["enterprise"] = { |
| "text": f"π Enterprise v{results['enterprise_version']}", |
| "color": "#8b5cf6", |
| "icon": "π" |
| } |
| logger.info(f"β
ARF Enterprise v{results['enterprise_version']} detected") |
| except ImportError as e: |
| results["recommendations"].append( |
| "Install ARF Enterprise: `pip install agentic-reliability-enterprise` (requires license)" |
| ) |
| logger.info("β οΈ ARF Enterprise not installed - using simulation") |
| |
| return results |
|
|
| |
| _installation_status = None |
|
|
| def get_installation_status(): |
| """Get cached installation status""" |
| global _installation_status |
| if _installation_status is None: |
| _installation_status = check_arf_installation() |
| return _installation_status |
|
|
| def get_installation_badges(): |
| """Get formatted badge HTML for UI""" |
| installation = get_installation_status() |
| oss_badge = installation["badges"]["oss"] |
| enterprise_badge = installation["badges"]["enterprise"] |
| |
| |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| return f""" |
| <div style="display: flex; justify-content: center; gap: 10px; margin-top: 10px; flex-wrap: wrap;"> |
| <span style="padding: 4px 12px; background: {oss_badge['color']}; |
| color: white; border-radius: 20px; font-size: 12px; font-weight: bold; |
| display: flex; align-items: center; gap: 6px;"> |
| {oss_badge['icon']} {oss_badge['text']} |
| </span> |
| <span style="padding: 4px 12px; background: {enterprise_badge['color']}; |
| color: white; border-radius: 20px; font-size: 12px; font-weight: bold; |
| display: flex; align-items: center; gap: 6px;"> |
| {enterprise_badge['icon']} {enterprise_badge['text']} |
| </span> |
| </div> |
| <div style="text-align: center; margin: 10px 0; font-size: 13px; color: #64748b;"> |
| Architecture: <strong>{boundaries['demo_mode']['architecture']}</strong> β’ |
| Mode: <strong>{boundaries['demo_mode']['honesty_level']}</strong> |
| </div> |
| """ |
|
|
| |
| |
| |
| class AsyncRunner: |
| """Enhanced async runner with better error handling""" |
| |
| @staticmethod |
| def run_async(coro): |
| """Run async coroutine in sync context""" |
| try: |
| loop = asyncio.get_event_loop() |
| except RuntimeError: |
| loop = asyncio.new_event_loop() |
| asyncio.set_event_loop(loop) |
| |
| try: |
| return loop.run_until_complete(coro) |
| except Exception as e: |
| logger.error(f"Async execution failed: {e}") |
| |
| return {"error": str(e), "status": "failed", "boundary_note": "Execution boundary reached"} |
| |
| @staticmethod |
| def async_to_sync(async_func): |
| """Decorator to convert async function to sync""" |
| def wrapper(*args, **kwargs): |
| try: |
| return AsyncRunner.run_async(async_func(*args, **kwargs)) |
| except Exception as e: |
| logger.error(f"Async to sync conversion failed: {e}") |
| |
| return {"error": str(e), "status": "failed", "boundary_context": "OSS advisory only - execution requires Enterprise"} |
| return wrapper |
|
|
| |
| |
| |
| class Settings: |
| """Simple settings class""" |
| def __init__(self): |
| self.arf_mode = "demo" |
| self.use_true_arf = True |
| self.default_scenario = "Cache Miss Storm" |
| self.max_history_items = 100 |
| self.auto_refresh_seconds = 30 |
| self.show_boundaries = True |
| self.architectural_honesty = True |
|
|
| settings = Settings() |
|
|
| |
| |
| |
| def create_simple_telemetry_plot(scenario_name: str, is_real_arf: bool = True): |
| """Simple guaranteed-to-work telemetry plot with boundary indicators""" |
| try: |
| import plotly.graph_objects as go |
| |
| |
| time_points = list(range(0, 60, 5)) |
| normal_values = [100, 105, 98, 102, 101, 99, 103, 100, 105, 102, 100, 101] |
| anomaly_values = [100, 105, 98, 102, 350, 420, 380, 410, 105, 102, 100, 101] |
| |
| fig = go.Figure() |
| |
| |
| fig.add_trace(go.Scatter( |
| x=time_points, |
| y=normal_values, |
| mode='lines', |
| name='Normal', |
| line=dict(color='#3b82f6', width=2, dash='dot') |
| )) |
| |
| |
| fig.add_trace(go.Scatter( |
| x=time_points, |
| y=anomaly_values, |
| mode='lines+markers', |
| name='π¨ Anomaly', |
| line=dict(color='#ef4444', width=3), |
| marker=dict(size=8, color='#ef4444') |
| )) |
| |
| |
| fig.add_vrect( |
| x0=20, x1=35, |
| fillcolor="red", opacity=0.1, |
| layer="below", line_width=0, |
| annotation_text="Anomaly Detected", |
| annotation_position="top left" |
| ) |
| |
| |
| boundary_text = "REAL ARF OSS" if is_real_arf else "DEMO SIMULATION" |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| |
| fig.update_layout( |
| title=dict( |
| text=f'π {scenario_name} - Live Telemetry<br>' |
| f'<span style="font-size: 12px; color: {boundary_color}">' |
| f'π {boundary_text}</span>', |
| font=dict(size=16, color='#1e293b') |
| ), |
| height=300, |
| paper_bgcolor='white', |
| plot_bgcolor='white', |
| xaxis=dict( |
| title='Time (minutes)', |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b' |
| ), |
| yaxis=dict( |
| title='Requests/sec', |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b' |
| ), |
| legend=dict( |
| yanchor="top", |
| y=0.99, |
| xanchor="left", |
| x=0.01, |
| bgcolor='rgba(255, 255, 255, 0.9)', |
| bordercolor='#e2e8f0', |
| borderwidth=1 |
| ), |
| margin=dict(l=50, r=30, t=60, b=50) |
| ) |
| |
| return fig |
| except Exception as e: |
| logger.error(f"Error creating telemetry plot: {e}") |
| |
| return create_html_telemetry_fallback(scenario_name, is_real_arf) |
|
|
| def create_html_telemetry_fallback(scenario_name: str, is_real_arf: bool) -> str: |
| """HTML fallback for telemetry visualization with boundary indicators""" |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| boundary_text = "REAL ARF OSS" if is_real_arf else "DEMO SIMULATION" |
| |
| return f""" |
| <div style="border: 2px solid {boundary_color}; border-radius: 16px; padding: 20px; |
| background: white; box-shadow: 0 4px 12px rgba(0,0,0,0.05);"> |
| |
| <!-- Boundary indicator --> |
| <div style="position: absolute; top: 15px; right: 15px; padding: 4px 10px; |
| background: {boundary_color}; color: white; border-radius: 15px; |
| font-size: 11px; font-weight: bold; display: flex; align-items: center; gap: 5px;"> |
| π {boundary_text} |
| </div> |
| |
| <h4 style="margin: 0 0 15px 0; color: #1e293b; font-size: 16px; font-weight: 600;"> |
| π {scenario_name} - Live Telemetry |
| </h4> |
| |
| <!-- Simplified timeline --> |
| <div style="position: relative; height: 100px; margin: 20px 0;"> |
| <!-- Background line --> |
| <div style="position: absolute; left: 0; right: 0; top: 50%; |
| height: 2px; background: #e2e8f0; transform: translateY(-50%);"></div> |
| |
| <!-- Normal range --> |
| <div style="position: absolute; left: 10%; right: 40%; top: 50%; |
| height: 6px; background: #10b981; transform: translateY(-50%); |
| border-radius: 3px; opacity: 0.3;"></div> |
| |
| <!-- Anomaly point --> |
| <div style="position: absolute; left: 70%; top: 50%; |
| transform: translate(-50%, -50%);"> |
| <div style="width: 20px; height: 20px; border-radius: 50%; |
| background: #ef4444; border: 3px solid white; |
| box-shadow: 0 0 0 2px #ef4444;"> |
| </div> |
| <div style="position: absolute; top: 25px; left: 50%; transform: translateX(-50%); |
| white-space: nowrap; font-size: 11px; color: #64748b;"> |
| 350% spike |
| </div> |
| </div> |
| |
| <!-- Labels --> |
| <div style="position: absolute; left: 10%; top: 70px; font-size: 11px; color: #64748b;"> |
| Normal: 100% |
| </div> |
| <div style="position: absolute; left: 40%; top: 70px; font-size: 11px; color: #64748b;"> |
| Warning: 150% |
| </div> |
| <div style="position: absolute; left: 70%; top: 70px; font-size: 11px; |
| color: #ef4444; font-weight: 500;"> |
| Anomaly: 350% |
| </div> |
| </div> |
| |
| <!-- Status indicator --> |
| <div style="display: flex; justify-content: space-between; align-items: center; |
| margin-top: 15px; padding: 10px; background: #f8fafc; border-radius: 8px;"> |
| <div> |
| <div style="font-size: 12px; color: #64748b;">Status</div> |
| <div style="font-size: 14px; color: #ef4444; font-weight: 600;"> |
| π¨ Anomaly Detected |
| </div> |
| </div> |
| <div style="text-align: right;"> |
| <div style="font-size: 12px; color: #64748b;">ARF Mode</div> |
| <div style="font-size: 14px; color: {boundary_color}; font-weight: 600;"> |
| {boundary_text} |
| </div> |
| </div> |
| </div> |
| </div> |
| """ |
|
|
| def create_simple_impact_plot(scenario_name: str, is_real_arf: bool = True): |
| """Simple guaranteed-to-work impact plot with boundary indicators""" |
| try: |
| import plotly.graph_objects as go |
| |
| |
| categories = ['Revenue Loss', 'Users Affected', 'SLA Violation', 'Recovery Time'] |
| values = [8500, 45000, 4.8, 45] |
| |
| colors = ['#ef4444', '#f59e0b', '#8b5cf6', '#3b82f6'] |
| |
| fig = go.Figure(data=[go.Bar( |
| x=categories, |
| y=values, |
| marker_color=colors, |
| text=[f'${values[0]:,}/hr', f'{values[1]:,}', f'{values[2]}%', f'{values[3]} min'], |
| textposition='auto', |
| )]) |
| |
| |
| boundary_text = "REAL ARF OSS" if is_real_arf else "DEMO SIMULATION" |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| |
| fig.update_layout( |
| title=dict( |
| text=f'π° {scenario_name} - Business Impact<br>' |
| f'<span style="font-size: 12px; color: {boundary_color}">' |
| f'π {boundary_text} Analysis</span>', |
| font=dict(size=16, color='#1e293b') |
| ), |
| height=300, |
| paper_bgcolor='white', |
| plot_bgcolor='white', |
| xaxis=dict( |
| title='Impact Metric', |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b', |
| tickangle=-45 |
| ), |
| yaxis=dict( |
| title='Value', |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b' |
| ), |
| margin=dict(l=50, r=30, t=60, b=80) |
| ) |
| |
| return fig |
| except Exception as e: |
| logger.error(f"Error creating impact plot: {e}") |
| |
| return create_html_impact_fallback(scenario_name, is_real_arf) |
|
|
| def create_html_impact_fallback(scenario_name: str, is_real_arf: bool) -> str: |
| """HTML fallback for impact visualization""" |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| boundary_text = "REAL ARF OSS" if is_real_arf else "DEMO SIMULATION" |
| |
| impact_map = { |
| "Cache Miss Storm": {"revenue": 8500, "users": 45000, "recovery": 45}, |
| "Database Connection Pool Exhaustion": {"revenue": 4200, "users": 25000, "recovery": 35}, |
| "Kubernetes Memory Leak": {"revenue": 5500, "users": 35000, "recovery": 40}, |
| "API Rate Limit Storm": {"revenue": 3800, "users": 20000, "recovery": 25}, |
| "Network Partition": {"revenue": 12000, "users": 75000, "recovery": 60}, |
| "Storage I/O Saturation": {"revenue": 6800, "users": 30000, "recovery": 50} |
| } |
| |
| impact = impact_map.get(scenario_name, {"revenue": 5000, "users": 30000, "recovery": 30}) |
| |
| return f""" |
| <div style="border: 2px solid {boundary_color}; border-radius: 16px; padding: 20px; |
| background: white; box-shadow: 0 4px 12px rgba(0,0,0,0.05);"> |
| |
| <!-- Boundary indicator --> |
| <div style="position: absolute; top: 15px; right: 15px; padding: 4px 10px; |
| background: {boundary_color}; color: white; border-radius: 15px; |
| font-size: 11px; font-weight: bold; display: flex; align-items: center; gap: 5px;"> |
| π {boundary_text} |
| </div> |
| |
| <h4 style="margin: 0 0 15px 0; color: #1e293b; font-size: 16px; font-weight: 600;"> |
| π° {scenario_name} - Business Impact |
| </h4> |
| |
| <!-- Impact metrics --> |
| <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 15px;"> |
| <div style="text-align: center; padding: 12px; background: #fef2f2; border-radius: 10px;"> |
| <div style="font-size: 12px; color: #64748b; margin-bottom: 5px;">Revenue Risk</div> |
| <div style="font-size: 20px; font-weight: 700; color: #ef4444;"> |
| ${impact['revenue']:,}/hr |
| </div> |
| </div> |
| |
| <div style="text-align: center; padding: 12px; background: #fef3c7; border-radius: 10px;"> |
| <div style="font-size: 12px; color: #64748b; margin-bottom: 5px;">Users Affected</div> |
| <div style="font-size: 20px; font-weight: 700; color: #f59e0b;"> |
| {impact['users']:,} |
| </div> |
| </div> |
| |
| <div style="text-align: center; padding: 12px; background: #f1f5f9; border-radius: 10px;"> |
| <div style="font-size: 12px; color: #64748b; margin-bottom: 5px;">Manual Recovery</div> |
| <div style="font-size: 20px; font-weight: 700; color: #64748b;"> |
| {impact['recovery']} min |
| </div> |
| </div> |
| |
| <div style="text-align: center; padding: 12px; background: #f0fdf4; border-radius: 10px;"> |
| <div style="font-size: 12px; color: #64748b; margin-bottom: 5px;">ARF Recovery</div> |
| <div style="font-size: 20px; font-weight: 700; color: #10b981;"> |
| {int(impact['recovery'] * 0.27)} min |
| </div> |
| </div> |
| </div> |
| |
| <!-- Boundary note --> |
| <div style="margin-top: 15px; padding: 10px; background: #f8fafc; border-radius: 8px;"> |
| <div style="font-size: 12px; color: #64748b; line-height: 1.5;"> |
| <strong>Analysis Mode:</strong> {boundary_text}<br> |
| <strong>Confidence:</strong> 94% β’ <strong>ROI Impact:</strong> 5.2Γ |
| </div> |
| </div> |
| </div> |
| """ |
|
|
| def create_empty_plot(title: str, is_real_arf: bool = True): |
| """Create an empty placeholder plot with boundary indicators""" |
| try: |
| import plotly.graph_objects as go |
| |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| boundary_text = "REAL ARF OSS" if is_real_arf else "DEMO SIMULATION" |
| |
| |
| fig = go.Figure() |
| |
| |
| fig.add_trace(go.Scatter( |
| x=[1, 2, 3, 4, 5], |
| y=[2, 3, 1, 4, 3], |
| mode='lines+markers', |
| name='Sample Data', |
| line=dict(color='#3b82f6', width=2) |
| )) |
| |
| fig.update_layout( |
| height=300, |
| title=dict( |
| text=f'{title}<br>' |
| f'<span style="font-size: 12px; color: {boundary_color}">' |
| f'π {boundary_text}</span>', |
| font=dict(size=14, color='#1e293b'), |
| x=0.5, |
| xanchor='center' |
| ), |
| paper_bgcolor='white', |
| plot_bgcolor='white', |
| xaxis=dict( |
| title='Time', |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b' |
| ), |
| yaxis=dict( |
| title='Value', |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b' |
| ), |
| margin=dict(l=50, r=30, t=50, b=50), |
| showlegend=True |
| ) |
| |
| return fig |
| except ImportError: |
| logger.warning("Plotly not available for plots") |
| |
| return f""" |
| <div style="border: 2px solid #e2e8f0; border-radius: 12px; padding: 20px; |
| background: white; text-align: center; height: 300px; |
| display: flex; flex-direction: column; justify-content: center;"> |
| <div style="font-size: 48px; margin-bottom: 15px;">π</div> |
| <h4 style="margin: 0 0 10px 0; color: #1e293b; font-size: 16px;"> |
| {title} |
| </h4> |
| <div style="font-size: 14px; color: #64748b;"> |
| Visualization requires Plotly<br> |
| Install with: <code>pip install plotly</code> |
| </div> |
| </div> |
| """ |
| except Exception as e: |
| logger.error(f"Error creating plot: {e}") |
| return None |
|
|
| def get_inactive_agent_html(agent_name: str, description: str, is_real_arf: bool = False): |
| """Get HTML for inactive agent state with boundary indicators""" |
| icons = { |
| "Detection": "π΅οΈββοΈ", |
| "Recall": "π§ ", |
| "Decision": "π―" |
| } |
| |
| border_color = "#e2e8f0" |
| background = "#f8fafc" |
| badge_text = "INACTIVE" |
| |
| if is_real_arf: |
| border_color = "#10b981" |
| background = "#f0fdf4" |
| badge_text = "REAL ARF (INACTIVE)" |
| |
| return f""" |
| <div style="border: 2px solid {border_color}; border-radius: 14px; padding: 18px; background: {background}; text-align: center; min-height: 180px; display: flex; flex-direction: column; align-items: center; justify-content: center; opacity: 0.7;"> |
| <div style="font-size: 32px; margin-bottom: 10px; opacity: 0.5;">{icons.get(agent_name, 'β³')}</div> |
| <div style="width: 100%;"> |
| <h4 style="margin: 0 0 8px 0; font-size: 16px; color: #94a3b8;">{agent_name} Agent</h4> |
| <p style="font-size: 13px; color: #cbd5e1; margin-bottom: 12px; line-height: 1.4;">{description}</p> |
| <div style="display: flex; justify-content: space-around; margin-bottom: 12px;"> |
| <span style="font-size: 11px; padding: 3px 8px; background: rgba(255, 255, 255, 0.5); border-radius: 6px; color: #cbd5e1; font-weight: 500;">Status: Inactive</span> |
| <span style="font-size: 11px; padding: 3px 8px; background: rgba(255, 255, 255, 0.5); border-radius: 6px; color: #cbd5e1; font-weight: 500;">Mode: {badge_text}</span> |
| </div> |
| <div style="display: inline-block; padding: 5px 14px; background: #e2e8f0; border-radius: 20px; font-size: 12px; font-weight: bold; color: #64748b; text-transform: uppercase; letter-spacing: 0.5px;">WAITING</div> |
| </div> |
| </div> |
| """ |
|
|
| |
| |
| |
| def import_components() -> Dict[str, Any]: |
| """Safely import all components with proper error handling""" |
| components = { |
| "all_available": False, |
| "error": None, |
| "get_styles": lambda: "", |
| "show_boundaries": settings.show_boundaries, |
| } |
| |
| try: |
| logger.info("Starting component import...") |
| |
| |
| try: |
| import gradio as gr |
| components["gr"] = gr |
| logger.info("β
Gradio imported successfully") |
| except ImportError as e: |
| logger.error(f"β Gradio not available: {e}") |
| raise ImportError("Gradio is required but not available") |
| |
| |
| try: |
| from ui.styles import get_styles |
| components["get_styles"] = get_styles |
| logger.info("β
UI styles imported successfully") |
| except ImportError as e: |
| logger.warning(f"β οΈ UI styles not available: {e}") |
| |
| components["get_styles"] = lambda: "" |
| |
| |
| try: |
| from ui.components import ( |
| create_header, create_status_bar, create_tab1_incident_demo, |
| create_tab2_business_roi, create_tab3_enterprise_features, |
| create_tab4_audit_trail, create_tab5_learning_engine, |
| create_footer |
| ) |
| components.update({ |
| "create_header": create_header, |
| "create_status_bar": create_status_bar, |
| "create_tab1_incident_demo": create_tab1_incident_demo, |
| "create_tab2_business_roi": create_tab2_business_roi, |
| "create_tab3_enterprise_features": create_tab3_enterprise_features, |
| "create_tab4_audit_trail": create_tab4_audit_trail, |
| "create_tab5_learning_engine": create_tab5_learning_engine, |
| "create_footer": create_footer, |
| }) |
| logger.info("β
UI components imported successfully") |
| except ImportError as e: |
| logger.error(f"β UI components not available: {e}") |
| |
| gr = components["gr"] |
| components.update({ |
| "create_header": lambda version="3.3.7", mock=False: gr.HTML( |
| f""" |
| <div style="text-align: center; padding: 20px;"> |
| <h2 style="margin: 0 0 10px 0; color: #1e293b;">π ARF v{version} Demo</h2> |
| <p style="color: #64748b; margin: 0;">Clear boundaries: OSS advises β Enterprise executes</p> |
| </div> |
| """ |
| ), |
| "create_status_bar": lambda: gr.HTML(BoundaryManager.get_boundary_badges()), |
| "create_tab1_incident_demo": lambda *args: [gr.Dropdown()] * 24, |
| "create_tab2_business_roi": lambda *args: [gr.Plot()] * 7, |
| "create_tab3_enterprise_features": lambda: [gr.JSON()] * 8, |
| "create_tab4_audit_trail": lambda: [gr.Button()] * 6, |
| "create_tab5_learning_engine": lambda: [gr.Plot()] * 10, |
| "create_footer": lambda: gr.HTML( |
| "<footer style='text-align: center; color: #64748b; padding: 20px;'>" |
| "ARF v3.3.7 β’ Architecture: OSS advises β Enterprise executes" |
| "</footer>" |
| ), |
| }) |
| |
| |
| try: |
| from demo.scenarios import INCIDENT_SCENARIOS |
| components["INCIDENT_SCENARIOS"] = INCIDENT_SCENARIOS |
| logger.info(f"β
Loaded {len(INCIDENT_SCENARIOS)} scenarios from demo module") |
| except ImportError as e: |
| logger.warning(f"β οΈ Demo scenarios not available: {e}") |
| |
| components["INCIDENT_SCENARIOS"] = { |
| "Cache Miss Storm": { |
| "component": "Redis Cache Cluster", |
| "severity": "HIGH", |
| "impact_radius": "85% of users", |
| "business_impact": {"revenue_loss_per_hour": 8500}, |
| "detection_time": "45 seconds", |
| "tags": ["cache", "redis", "latency"], |
| "metrics": {"affected_users": 45000}, |
| "boundary_note": "OSS analysis only - execution requires Enterprise" |
| } |
| } |
| |
| |
| try: |
| from core.true_arf_orchestrator import TrueARF337Orchestrator |
| components["DemoOrchestrator"] = TrueARF337Orchestrator |
| logger.info("β
Using TrueARF337Orchestrator with real v3.3.7 integration") |
| except ImportError as e: |
| logger.warning(f"β οΈ TrueARF337Orchestrator not available: {e}") |
| |
| try: |
| from core.real_arf_integration import RealARFIntegration |
| components["DemoOrchestrator"] = RealARFIntegration |
| logger.info("β
Falling back to RealARFIntegration") |
| except ImportError as e2: |
| logger.warning(f"β οΈ RealARFIntegration also not available: {e2}") |
| |
| class MockOrchestrator: |
| async def analyze_incident(self, scenario_name, scenario_data): |
| return { |
| "status": "mock", |
| "scenario": scenario_name, |
| "message": "Mock analysis (no real ARF available)", |
| "boundary_note": "OSS advisory mode - execution requires Enterprise", |
| "demo_display": { |
| "real_arf_version": "mock", |
| "true_oss_used": False, |
| "enterprise_simulated": True, |
| "architectural_boundary": "OSS advises β Enterprise would execute" |
| } |
| } |
| async def execute_healing(self, scenario_name, mode="autonomous"): |
| return { |
| "status": "mock", |
| "scenario": scenario_name, |
| "message": "Mock execution (no real ARF available)", |
| "boundary_note": "Simulated Enterprise execution - real execution requires infrastructure", |
| "enterprise_features_used": ["simulated_execution", "mock_rollback", "demo_mode"] |
| } |
| components["DemoOrchestrator"] = MockOrchestrator |
| logger.info("β οΈ Using mock orchestrator with boundary awareness") |
| |
| |
| try: |
| import importlib.util |
| spec = importlib.util.find_spec("core.calculators") |
| if spec is not None: |
| from core.calculators import EnhancedROICalculator |
| components["EnhancedROICalculator"] = EnhancedROICalculator() |
| logger.info("β
EnhancedROICalculator imported successfully") |
| else: |
| raise ImportError("core.calculators module not found") |
| except ImportError as e: |
| logger.warning(f"β οΈ EnhancedROICalculator not available: {e}") |
| class MockCalculator: |
| def calculate_comprehensive_roi(self, **kwargs): |
| return { |
| "status": "β
Calculated Successfully", |
| "summary": { |
| "your_annual_impact": "$1,530,000", |
| "potential_savings": "$1,254,600", |
| "enterprise_cost": "$625,000", |
| "roi_multiplier": "5.2Γ", |
| "payback_months": "6.0", |
| "annual_roi_percentage": "420%", |
| "boundary_context": "Based on OSS analysis + simulated Enterprise execution" |
| }, |
| "boundary_note": "ROI calculation includes OSS advisory value and simulated Enterprise execution benefits" |
| } |
| components["EnhancedROICalculator"] = MockCalculator() |
| logger.info("β οΈ Using mock ROI calculator with boundary context") |
| |
| |
| try: |
| spec = importlib.util.find_spec("core.visualizations") |
| if spec is not None: |
| from core.visualizations import EnhancedVisualizationEngine |
| |
| class BoundaryAwareVisualizationEngine(EnhancedVisualizationEngine): |
| def create_executive_dashboard(self, data=None, is_real_arf=True): |
| result = super().create_executive_dashboard(data) |
| |
| if hasattr(result, 'update_layout'): |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| boundary_text = "REAL ARF OSS" if is_real_arf else "SIMULATED" |
| result.update_layout( |
| title=f"{result.layout.title.text}<br>" |
| f"<span style='font-size: 12px; color: {boundary_color}'>" |
| f"π {boundary_text}</span>" |
| ) |
| return result |
| |
| def create_telemetry_plot(self, scenario_name, anomaly_detected=True, is_real_arf=True): |
| return create_simple_telemetry_plot(scenario_name, is_real_arf) |
| |
| def create_impact_gauge(self, scenario_name, is_real_arf=True): |
| return create_simple_impact_plot(scenario_name, is_real_arf) |
| |
| def create_timeline_comparison(self, is_real_arf=True): |
| |
| try: |
| import plotly.graph_objects as go |
| |
| phases = ["Detection", "Analysis", "Decision", "Execution", "Recovery"] |
| manual_times = [300, 1800, 1200, 1800, 3600] |
| arf_times = [45, 30, 60, 720, 0] |
| |
| |
| manual_times_min = [t/60 for t in manual_times] |
| arf_times_min = [t/60 for t in arf_times] |
| |
| fig = go.Figure() |
| |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| boundary_text = "REAL ARF" if is_real_arf else "SIMULATED" |
| |
| fig.add_trace(go.Bar( |
| name='Manual Process', |
| x=phases, |
| y=manual_times_min, |
| marker_color='#ef4444', |
| text=[f"{t:.0f}m" for t in manual_times_min], |
| textposition='auto' |
| )) |
| |
| fig.add_trace(go.Bar( |
| name=f'ARF Autonomous ({boundary_text})', |
| x=phases, |
| y=arf_times_min, |
| marker_color=boundary_color, |
| text=[f"{t:.0f}m" for t in arf_times_min], |
| textposition='auto' |
| )) |
| |
| total_manual = sum(manual_times_min) |
| total_arf = sum(arf_times_min) |
| |
| fig.update_layout( |
| title=f"β° Incident Timeline Comparison<br>" |
| f"<span style='font-size: 14px; color: #6b7280'>" |
| f"Total: {total_manual:.0f}m manual vs {total_arf:.0f}m ARF " |
| f"({((total_manual - total_arf) / total_manual * 100):.0f}% faster)</span>", |
| barmode='group', |
| height=400, |
| plot_bgcolor='rgba(0,0,0,0)', |
| paper_bgcolor='rgba(0,0,0,0)', |
| legend=dict( |
| orientation="h", |
| yanchor="bottom", |
| y=1.02, |
| xanchor="right", |
| x=1 |
| ), |
| yaxis_title="Time (minutes)" |
| ) |
| |
| return fig |
| except Exception as e: |
| logger.error(f"Timeline plot failed: {e}") |
| return create_empty_plot("Timeline Comparison", is_real_arf) |
| |
| components["EnhancedVisualizationEngine"] = BoundaryAwareVisualizationEngine() |
| logger.info("β
EnhancedVisualizationEngine imported successfully with boundary awareness") |
| else: |
| raise ImportError("core.visualizations module not found") |
| except ImportError as e: |
| logger.warning(f"β οΈ EnhancedVisualizationEngine not available: {e}") |
| class MockVisualizationEngine: |
| def create_executive_dashboard(self, data=None, is_real_arf=True): |
| return create_empty_plot("Executive Dashboard", is_real_arf) |
| |
| def create_telemetry_plot(self, scenario_name, anomaly_detected=True, is_real_arf=True): |
| return create_simple_telemetry_plot(scenario_name, is_real_arf) |
| |
| def create_impact_gauge(self, scenario_name, is_real_arf=True): |
| return create_simple_impact_plot(scenario_name, is_real_arf) |
| |
| def create_timeline_comparison(self, is_real_arf=True): |
| return create_empty_plot("Timeline Comparison", is_real_arf) |
| |
| components["EnhancedVisualizationEngine"] = MockVisualizationEngine() |
| logger.info("β οΈ Using mock visualization engine with boundary indicators") |
| |
| components["all_available"] = True |
| components["error"] = None |
| logger.info("β
Successfully imported all modular components with boundary awareness") |
| |
| except Exception as e: |
| logger.error(f"β CRITICAL IMPORT ERROR: {e}") |
| logger.error(traceback.format_exc()) |
| components["error"] = str(e) |
| components["all_available"] = False |
| |
| |
| if "gr" not in components: |
| try: |
| import gradio as gr |
| components["gr"] = gr |
| except: |
| pass |
| |
| |
| if "INCIDENT_SCENARIOS" not in components: |
| components["INCIDENT_SCENARIOS"] = { |
| "Cache Miss Storm": { |
| "component": "Redis Cache Cluster", |
| "severity": "HIGH", |
| "business_impact": {"revenue_loss_per_hour": 8500}, |
| "boundary_note": "OSS analysis only - execution requires Enterprise" |
| } |
| } |
| |
| return components |
|
|
| |
| |
| |
| _components = None |
| _audit_manager = None |
|
|
| def get_components() -> Dict[str, Any]: |
| """Lazy load components singleton""" |
| global _components |
| if _components is None: |
| _components = import_components() |
| return _components |
|
|
| |
| |
| |
| class AuditTrailManager: |
| """Enhanced audit trail manager with boundary tracking""" |
| |
| def __init__(self): |
| self.executions = [] |
| self.incidents = [] |
| self.boundary_crossings = [] |
| logger.info("AuditTrailManager initialized with boundary tracking") |
| |
| def add_execution(self, scenario: str, mode: str, success: bool = True, |
| savings: float = 0, boundary_note: str = "") -> Dict: |
| """Add execution to audit trail with boundary context""" |
| entry = { |
| "time": datetime.datetime.now().strftime("%H:%M"), |
| "scenario": scenario, |
| "mode": mode, |
| "status": "β
Success" if success else "β Failed", |
| "savings": f"${savings:,.0f}", |
| "details": f"{mode} execution at {datetime.datetime.now().isoformat()}", |
| "boundary_note": boundary_note or "OSS advisory β Enterprise execution boundary" |
| } |
| self.executions.insert(0, entry) |
| |
| |
| if "Enterprise" in mode or "Autonomous" in mode: |
| self.boundary_crossings.append({ |
| "time": datetime.datetime.now().isoformat(), |
| "boundary": "OSS β Enterprise", |
| "scenario": scenario, |
| "note": "Crossed from OSS advisory to Enterprise execution" |
| }) |
| |
| return entry |
| |
| def add_incident(self, scenario: str, severity: str = "HIGH", |
| boundary_context: str = "") -> Dict: |
| """Add incident to audit trail with boundary context""" |
| entry = { |
| "time": datetime.datetime.now().strftime("%H:%M"), |
| "scenario": scenario, |
| "severity": severity, |
| "component": get_components()["INCIDENT_SCENARIOS"].get(scenario, {}).get("component", "unknown"), |
| "status": "Analyzed", |
| "boundary_context": boundary_context or "OSS advisory analysis only" |
| } |
| self.incidents.insert(0, entry) |
| return entry |
| |
| def get_execution_table(self) -> List[List]: |
| """Get execution table data with boundary notes""" |
| return [ |
| [e["time"], e["scenario"], e["mode"], e["status"], e["savings"], |
| f"{e['details'][:30]}... {e.get('boundary_note', '')[:20]}..."] |
| for e in self.executions[:10] |
| ] |
| |
| def get_incident_table(self) -> List[List]: |
| """Get incident table data with boundary context""" |
| return [ |
| [e["time"], e["component"], e["scenario"], e["severity"], |
| f"{e['status']} ({e.get('boundary_context', 'OSS')})"] |
| for e in self.incidents[:15] |
| ] |
| |
| def get_boundary_report(self) -> Dict[str, Any]: |
| """Get report on boundary crossings""" |
| return { |
| "total_crossings": len(self.boundary_crossings), |
| "crossings": self.boundary_crossings[-5:], |
| "summary": f"{len(self.boundary_crossings)} OSSβEnterprise boundary crossings tracked" |
| } |
| |
| def clear(self) -> None: |
| """Clear audit trail""" |
| self.executions = [] |
| self.incidents = [] |
| self.boundary_crossings = [] |
|
|
| def get_audit_manager() -> AuditTrailManager: |
| """Lazy load audit manager singleton""" |
| global _audit_manager |
| if _audit_manager is None: |
| _audit_manager = AuditTrailManager() |
| return _audit_manager |
|
|
| |
| |
| |
| def get_scenario_impact(scenario_name: str) -> float: |
| """Get average impact for a given scenario""" |
| impact_map = { |
| "Cache Miss Storm": 8500, |
| "Database Connection Pool Exhaustion": 4200, |
| "Kubernetes Memory Leak": 5500, |
| "API Rate Limit Storm": 3800, |
| "Network Partition": 12000, |
| "Storage I/O Saturation": 6800 |
| } |
| return impact_map.get(scenario_name, 5000) |
|
|
| def extract_roi_multiplier(roi_result: Dict) -> float: |
| """Extract ROI multiplier from EnhancedROICalculator result""" |
| try: |
| |
| if "summary" in roi_result and "roi_multiplier" in roi_result["summary"]: |
| roi_str = roi_result["summary"]["roi_multiplier"] |
| |
| if "Γ" in roi_str: |
| return float(roi_str.replace("Γ", "")) |
| return float(roi_str) |
| |
| |
| if "scenarios" in roi_result and "base_case" in roi_result["scenarios"]: |
| roi_str = roi_result["scenarios"]["base_case"]["roi"] |
| if "Γ" in roi_str: |
| return float(roi_str.replace("Γ", "")) |
| return float(roi_str) |
| |
| |
| if "roi_multiplier" in roi_result: |
| roi_val = roi_result["roi_multiplier"] |
| if isinstance(roi_val, (int, float)): |
| return float(roi_val) |
| |
| return 5.2 |
| except Exception as e: |
| logger.warning(f"Failed to extract ROI multiplier: {e}, using default 5.2") |
| return 5.2 |
|
|
| |
| |
| |
| def create_telemetry_plot(scenario_name: str, is_real_arf: bool = True): |
| """Create a telemetry visualization for the selected scenario""" |
| try: |
| |
| return create_simple_telemetry_plot(scenario_name, is_real_arf) |
| except Exception as e: |
| logger.error(f"Failed to create telemetry plot: {e}") |
| return create_simple_telemetry_plot(scenario_name, is_real_arf) |
|
|
| def create_impact_plot(scenario_name: str, is_real_arf: bool = True): |
| """Create a business impact visualization""" |
| try: |
| |
| return create_simple_impact_plot(scenario_name, is_real_arf) |
| except Exception as e: |
| logger.error(f"Failed to create impact plot: {e}") |
| return create_simple_impact_plot(scenario_name, is_real_arf) |
|
|
| def create_timeline_plot(scenario_name: str, is_real_arf: bool = True): |
| """Create an incident timeline visualization""" |
| try: |
| |
| import plotly.graph_objects as go |
| |
| |
| events = ['Incident Start', 'ARF Detection', 'Analysis', 'Resolution'] |
| times = [0, 0.75, 2.5, 12] |
| colors = ['#ef4444', '#f59e0b', '#3b82f6', '#10b981'] |
| icons = ['π¨', 'π΅οΈββοΈ', 'π§ ', 'β
'] |
| |
| fig = go.Figure() |
| |
| |
| for i, (event, time, color, icon) in enumerate(zip(events, times, colors, icons)): |
| fig.add_trace(go.Scatter( |
| x=[time], |
| y=[1], |
| mode='markers+text', |
| marker=dict(size=20, color=color, symbol='circle'), |
| text=[f'{icon}<br>{event}<br>{time} min'], |
| textposition='top center', |
| name=event, |
| hoverinfo='text', |
| showlegend=False |
| )) |
| |
| |
| fig.add_trace(go.Scatter( |
| x=times, |
| y=[1, 1, 1, 1], |
| mode='lines', |
| line=dict(color='#64748b', width=2, dash='dash'), |
| showlegend=False |
| )) |
| |
| |
| boundary_text = "REAL ARF OSS" if is_real_arf else "DEMO SIMULATION" |
| boundary_color = "#10b981" if is_real_arf else "#f59e0b" |
| |
| fig.update_layout( |
| title=dict( |
| text=f'β° {scenario_name} - Incident Timeline<br>' |
| f'<span style="font-size: 12px; color: {boundary_color}">' |
| f'π {boundary_text}</span>', |
| font=dict(size=16, color='#1e293b') |
| ), |
| height=300, |
| paper_bgcolor='white', |
| plot_bgcolor='white', |
| xaxis=dict( |
| title='Time (minutes)', |
| range=[-1, max(times) + 2], |
| gridcolor='#e2e8f0', |
| showgrid=True, |
| color='#1e293b' |
| ), |
| yaxis=dict( |
| showticklabels=False, |
| range=[0.8, 1.2], |
| color='#1e293b' |
| ), |
| showlegend=False, |
| margin=dict(l=50, r=30, t=60, b=50) |
| ) |
| |
| return fig |
| except Exception as e: |
| logger.error(f"Failed to create timeline plot: {e}") |
| return create_empty_plot(f'Timeline: {scenario_name}', is_real_arf) |
|
|
| |
| |
| |
| def update_scenario_display(scenario_name: str) -> tuple: |
| """Update all scenario-related displays with scenario-specific data""" |
| scenario = get_components()["INCIDENT_SCENARIOS"].get(scenario_name, {}) |
| impact = scenario.get("business_impact", {}) |
| metrics = scenario.get("metrics", {}) |
| |
| |
| boundaries = BoundaryManager.get_system_boundaries() |
| oss_label = boundaries["oss"]["label"] |
| enterprise_label = boundaries["enterprise"]["label"] |
| |
| |
| scenario_html = f""" |
| <div style="border: 1px solid #e2e8f0; border-radius: 14px; padding: 20px; background: white; box-shadow: 0 4px 12px rgba(0,0,0,0.05);"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 12px; border-bottom: 2px solid #f1f5f9;"> |
| <h3 style="margin: 0; font-size: 18px; color: #1e293b;">π¨ {scenario_name}</h3> |
| <span style="padding: 4px 12px; background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); border-radius: 20px; font-size: 12px; font-weight: bold; color: white; text-transform: uppercase; letter-spacing: 0.5px;">{scenario.get('severity', 'HIGH')}</span> |
| </div> |
| <div style="margin-top: 15px;"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; padding: 4px 0;"> |
| <span style="font-size: 13px; color: #64748b; font-weight: 500;">Component:</span> |
| <span style="font-size: 14px; color: #1e293b; font-weight: 600;">{scenario.get('component', 'Unknown').replace('_', ' ').title()}</span> |
| </div> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; padding: 4px 0;"> |
| <span style="font-size: 13px; color: #64748b; font-weight: 500;">Affected Users:</span> |
| <span style="font-size: 14px; color: #1e293b; font-weight: 600;">{metrics.get('affected_users', 'Unknown') if 'affected_users' in metrics else 'Unknown'}</span> |
| </div> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; padding: 4px 0;"> |
| <span style="font-size: 13px; color: #64748b; font-weight: 500;">Revenue Risk:</span> |
| <span style="font-size: 14px; color: #ef4444; font-weight: 700;">${impact.get('revenue_loss_per_hour', 0):,}/hour</span> |
| </div> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; padding: 4px 0;"> |
| <span style="font-size: 13px; color: #64748b; font-weight: 500;">Detection Time:</span> |
| <span style="font-size: 14px; color: #1e293b; font-weight: 600;">45 seconds (ARF AI)</span> |
| </div> |
| <div style="display: flex; flex-wrap: wrap; gap: 6px; margin-top: 15px; padding-top: 12px; border-top: 1px solid #f1f5f9;"> |
| <span style="padding: 3px 8px; background: #f1f5f9; border-radius: 6px; font-size: 11px; color: #475569; font-weight: 500;">{scenario.get('component', 'unknown').split('_')[0] if '_' in scenario.get('component', '') else scenario.get('component', 'unknown')}</span> |
| <span style="padding: 3px 8px; background: #f1f5f9; border-radius: 6px; font-size: 11px; color: #475569; font-weight: 500;">{scenario.get('severity', 'high').lower()}</span> |
| <span style="padding: 3px 8px; background: #10b981; color: white; border-radius: 6px; font-size: 11px; font-weight: 500;">{oss_label.split(' ')[-1]}</span> |
| <span style="padding: 3px 8px; background: #f59e0b; color: white; border-radius: 6px; font-size: 11px; font-weight: 500;">{enterprise_label.split(' ')[-1]}</span> |
| </div> |
| <div style="margin-top: 10px; padding: 8px; background: #f8fafc; border-radius: 8px; border-left: 3px solid #3b82f6;"> |
| <div style="font-size: 11px; color: #64748b; line-height: 1.4;"> |
| <strong>Architecture:</strong> {oss_label} advises β {enterprise_label} would execute |
| </div> |
| </div> |
| </div> |
| </div> |
| """ |
| |
| |
| is_real_arf = boundaries["oss"]["available"] |
| telemetry_plot = create_simple_telemetry_plot(scenario_name, is_real_arf) |
| impact_plot = create_simple_impact_plot(scenario_name, is_real_arf) |
| timeline_plot = create_timeline_plot(scenario_name, is_real_arf) |
| |
| return ( |
| scenario_html, |
| telemetry_plot, |
| impact_plot, |
| timeline_plot |
| ) |
|
|
| |
| |
| |
| @AsyncRunner.async_to_sync |
| async def run_true_arf_analysis(scenario_name: str): |
| """Run true ARF v3.3.7 analysis with OSS + Enterprise simulation""" |
| try: |
| logger.info(f"Running TRUE ARF analysis for: {scenario_name}") |
| |
| scenario = get_components()["INCIDENT_SCENARIOS"].get(scenario_name, {}) |
| |
| if not scenario: |
| raise ValueError(f"Scenario '{scenario_name}' not found") |
| |
| |
| installation = get_installation_status() |
| real_arf_available = installation["oss_installed"] |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| |
| orchestrator = get_components()["DemoOrchestrator"]() |
| analysis = await orchestrator.analyze_incident(scenario_name, scenario) |
| |
| |
| if analysis.get("status") == "error": |
| error_msg = analysis.get("message", "Unknown error") |
| raise ValueError(f"Analysis failed: {error_msg}") |
| |
| |
| get_audit_manager().add_incident( |
| scenario_name, |
| scenario.get("severity", "HIGH"), |
| boundary_context=f"OSS analysis via {boundaries['oss']['label']}" |
| ) |
| |
| |
| incident_table_data = get_audit_manager().get_incident_table() |
| |
| |
| demo_display = analysis.get("demo_display", {}) |
| real_arf_version = demo_display.get("real_arf_version", "mock") |
| true_oss_used = analysis.get("true_oss_used", False) |
| enterprise_simulated = analysis.get("enterprise_simulated", False) |
| |
| |
| if true_oss_used: |
| oss_analysis = analysis.get("oss_analysis", {}) |
| analysis_data = oss_analysis.get("analysis", {}) |
| |
| detection_result = analysis_data.get("detection", {}) |
| detection_confidence = detection_result.get("confidence", 0.987) |
| detection_time_seconds = detection_result.get("detection_time_ms", 45000) / 1000 |
| |
| similar_incidents = analysis_data.get("recall", []) |
| similar_count = len(similar_incidents) |
| |
| decision_data = analysis_data.get("decision", {}) |
| decision_confidence = decision_data.get("confidence", 0.94) |
| success_rate = decision_data.get("historical_success_rate", 0.87) |
| |
| |
| enterprise_enhancements = analysis.get("enterprise_enhancements", {}) |
| novel_execution = enterprise_enhancements is not None and enterprise_enhancements.get("enterprise_available", False) |
| |
| if enterprise_enhancements: |
| enhancements = enterprise_enhancements.get("enhancements", {}) |
| rollback_guarantee = enhancements.get("rollback_guarantees", {}).get("guarantee", "N/A") |
| else: |
| rollback_guarantee = "N/A" |
| |
| oss_results = { |
| "status": "β
TRUE ARF OSS Analysis Complete", |
| "arf_version": "3.3.7", |
| "edition": "OSS (Apache 2.0)", |
| "license": "Apache 2.0", |
| "scenario": scenario_name, |
| "confidence": decision_confidence, |
| "novel_execution": novel_execution, |
| "rollback_guarantee": rollback_guarantee, |
| "agents_executed": ["Detection", "Recall", "Decision"], |
| "boundary_context": f"Analysis via {boundaries['oss']['label']}", |
| "execution_boundary": f"Execution requires {boundaries['enterprise']['label']}", |
| "findings": [ |
| f"Anomaly detected with {detection_confidence:.1%} confidence", |
| f"{similar_count} similar incidents found in RAG memory", |
| f"Historical success rate for similar actions: {success_rate:.1%}", |
| f"True ARF OSS package used: β
Yes", |
| f"Enterprise features available: {'β
Simulated' if enterprise_simulated else 'β Not installed'}", |
| f"Architectural boundary: OSS advises β Enterprise executes" |
| ], |
| "recommendations": [ |
| "Scale resources based on historical patterns", |
| "Implement circuit breaker pattern", |
| "Add enhanced monitoring for key metrics", |
| f"Rollback guarantee: {rollback_guarantee}", |
| "Upgrade to Enterprise for autonomous execution" |
| ], |
| "healing_intent": decision_data, |
| "architectural_note": "This is the OSS advisory boundary. Execution requires Enterprise edition." |
| } |
| else: |
| |
| detection_result = analysis.get("detection", {}) |
| detection_confidence = detection_result.get("confidence", 0.987) |
| detection_time_seconds = detection_result.get("detection_time_seconds", 45) |
| |
| similar_incidents = analysis.get("recall", []) |
| similar_count = len(similar_incidents) |
| |
| decision_confidence = analysis.get("confidence", 0.94) |
| healing_intent = analysis.get("decision", {}) |
| success_rate = healing_intent.get("success_rate", 0.87) |
| |
| oss_results = { |
| "status": "β οΈ Enhanced Mock Analysis", |
| "arf_version": "mock", |
| "scenario": scenario_name, |
| "confidence": decision_confidence, |
| "agents_executed": ["Detection", "Recall", "Decision"], |
| "boundary_context": "Mock analysis - real ARF OSS not installed", |
| "execution_boundary": "Execution requires Enterprise edition", |
| "findings": [ |
| f"Anomaly detected with {detection_confidence:.1%} confidence", |
| f"{similar_count} similar incidents found in RAG memory", |
| f"Historical success rate for similar actions: {success_rate:.1%}", |
| f"Detection time: {detection_time_seconds} seconds", |
| f"Install agentic-reliability-framework==3.3.7 for true OSS analysis", |
| f"Architectural boundary: OSS advises β Enterprise executes" |
| ], |
| "recommendations": [ |
| "Scale resources based on historical patterns", |
| "Implement circuit breaker pattern", |
| "Add enhanced monitoring for key metrics", |
| "Install true ARF OSS package for production use", |
| "Upgrade to Enterprise for autonomous execution" |
| ], |
| "healing_intent": healing_intent, |
| "install_command": "pip install agentic-reliability-framework==3.3.7", |
| "architectural_note": "Mock mode demonstrates the architecture. Real OSS provides advisory intelligence." |
| } |
| |
| |
| detection_html = BoundaryManager.create_agent_with_boundary( |
| agent_name="Detection", |
| status=f"Anomaly detected: <strong>{detection_confidence:.1%} confidence</strong>", |
| is_real_arf=true_oss_used, |
| confidence=detection_confidence |
| ) |
| |
| recall_html = BoundaryManager.create_agent_with_boundary( |
| agent_name="Recall", |
| status=f"<strong>{similar_count} similar incidents</strong> found in RAG memory", |
| is_real_arf=true_oss_used, |
| confidence=0.92 |
| ) |
| |
| decision_html = BoundaryManager.create_agent_with_boundary( |
| agent_name="Decision", |
| status=f"Generating healing intent with <strong>{decision_confidence:.1%} confidence</strong>", |
| is_real_arf=true_oss_used, |
| confidence=decision_confidence |
| ) |
| |
| logger.info(f"Analysis completed successfully for {scenario_name} (True ARF: {real_arf_version})") |
| return ( |
| detection_html, recall_html, decision_html, |
| oss_results, incident_table_data |
| ) |
| |
| except Exception as e: |
| logger.error(f"Analysis failed: {e}", exc_info=True) |
| |
| |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| error_html = BoundaryManager.create_agent_with_boundary( |
| agent_name="Error", |
| status=f"Analysis failed: {str(e)[:80]}...", |
| is_real_arf=False, |
| confidence=0.0 |
| ) |
| |
| error_results = { |
| "status": "β Analysis Failed", |
| "error": str(e), |
| "scenario": scenario_name, |
| "boundary_context": f"OSS advisory via {boundaries['oss']['label']}", |
| "suggestion": "Check logs and try again. Ensure ARF OSS is installed for real analysis." |
| } |
| |
| return ( |
| error_html, error_html, error_html, |
| error_results, [] |
| ) |
|
|
| |
| |
| |
| def execute_enterprise_healing(scenario_name, approval_required, mcp_mode_value): |
| """Execute enterprise healing with clear boundary indicators""" |
| import gradio as gr |
| |
| scenario = get_components()["INCIDENT_SCENARIOS"].get(scenario_name, {}) |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| |
| mode = "Approval" if approval_required else "Autonomous" |
| |
| |
| if "Advisory" in mcp_mode_value or boundaries["oss"]["available"] and not boundaries["enterprise"]["available"]: |
| |
| approval_html = BoundaryManager.create_boundary_indicator( |
| "Scale Redis cluster from 3 to 5 nodes", |
| is_simulated=True |
| ) |
| |
| enterprise_results = { |
| "status": "β OSS Boundary Reached", |
| "error": f"{boundaries['oss']['label']} is advisory-only. Cannot execute in Advisory mode.", |
| "requires_enterprise": True, |
| "enterprise_features_required": [ |
| "autonomous_execution", |
| "novel_execution_protocols", |
| "rollback_guarantees", |
| "deterministic_confidence", |
| "enterprise_mcp_server" |
| ], |
| "boundary_note": f"Architectural boundary: {boundaries['oss']['label']} advises β {boundaries['enterprise']['label']} executes", |
| "contact": "sales@arf.dev" |
| } |
| execution_table_data = get_audit_manager().get_execution_table() |
| return gr.HTML.update(value=approval_html), enterprise_results, execution_table_data |
| |
| |
| impact = scenario.get("business_impact", {}) |
| revenue_loss = impact.get("revenue_loss_per_hour", get_scenario_impact(scenario_name)) |
| savings = int(revenue_loss * 0.85) |
| |
| |
| get_audit_manager().add_execution( |
| scenario_name, mode, savings=savings, |
| boundary_note=f"Crossed OSSβEnterprise boundary via {boundaries['enterprise']['label']}" |
| ) |
| |
| |
| orchestrator = get_components()["DemoOrchestrator"]() |
| |
| |
| if approval_required: |
| approval_html = f""" |
| <div style="border: 2px solid #e2e8f0; border-radius: 14px; padding: 20px; background: white; margin-top: 20px;"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 12px; border-bottom: 2px solid #f1f5f9;"> |
| <h4 style="margin: 0; font-size: 16px; color: #1e293b;">π€ Enterprise Approval Required</h4> |
| <span style="padding: 4px 12px; background: #f59e0b; color: white; border-radius: 8px; font-size: 12px; font-weight: bold; text-transform: uppercase;">ENTERPRISE</span> |
| </div> |
| <div style="margin-top: 15px;"> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Scenario:</strong> {scenario_name}</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Mode:</strong> Enterprise Approval</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Action:</strong> Scale Redis cluster from 3 to 5 nodes</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Estimated Savings:</strong> <span style="color: #10b981; font-weight: 700;">${savings:,}</span></p> |
| |
| <!-- Boundary progression --> |
| <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 20px;"> |
| <div style="padding: 12px; background: #f0fdf4; border-radius: 10px; border-left: 4px solid #10b981; font-size: 14px; color: #475569; font-weight: 500;"> |
| β
1. OSS Analysis Complete ({boundaries['oss']['label']}) |
| </div> |
| <div style="padding: 12px; background: #fef3c7; border-radius: 10px; border-left: 4px solid #f59e0b; font-size: 14px; color: #475569; font-weight: 500;"> |
| β³ 2. Awaiting human review ({boundaries['enterprise']['label']}) |
| </div> |
| <div style="padding: 12px; background: #f1f5f9; border-radius: 10px; border-left: 4px solid #3b82f6; font-size: 14px; color: #475569; font-weight: 500;"> |
| 3. {boundaries['enterprise']['label']} will execute upon approval |
| </div> |
| </div> |
| |
| <div style="margin-top: 15px; padding: 10px; background: #f0fdf4; border-radius: 8px; border-left: 4px solid #10b981;"> |
| <p style="margin: 0; font-size: 13px; color: #475569;"> |
| <strong>Architecture:</strong> {boundaries['oss']['label']} β {boundaries['enterprise']['label']}<br> |
| <strong>Boundary:</strong> Advisory analysis β Approval workflow β Execution |
| </p> |
| </div> |
| </div> |
| </div> |
| """ |
| |
| enterprise_results = { |
| "status": "β³ Awaiting Approval", |
| "execution_mode": mode, |
| "scenario": scenario_name, |
| "timestamp": datetime.datetime.now().isoformat(), |
| "enterprise": True, |
| "boundary_progression": [ |
| f"OSS advisory complete ({boundaries['oss']['label']})", |
| f"Enterprise approval pending ({boundaries['enterprise']['label']})", |
| "Execution queued upon approval" |
| ], |
| "actions_queued": [ |
| "Scale resources based on ML recommendations", |
| "Implement circuit breaker pattern", |
| "Deploy enhanced monitoring", |
| "Update RAG memory with outcome" |
| ], |
| "business_impact": { |
| "estimated_recovery_time": "12 minutes", |
| "manual_comparison": "45 minutes", |
| "estimated_cost_saved": f"${savings:,}", |
| "users_protected": "45,000 β 0", |
| "mttr_reduction": "73% faster" |
| }, |
| "safety_checks": { |
| "blast_radius": "2 services (within limit)", |
| "business_hours": "Compliant", |
| "action_type": "Pending approval", |
| "circuit_breaker": "Will activate" |
| }, |
| "enterprise_features": [ |
| "approval_workflows", |
| "audit_trail", |
| "compliance_reporting", |
| "enhanced_safety" |
| ], |
| "architectural_note": f"Clear boundary: {boundaries['oss']['label']} advises β {boundaries['enterprise']['label']} executes with approval" |
| } |
| else: |
| |
| try: |
| |
| execution_result = AsyncRunner.run_async( |
| orchestrator.execute_healing(scenario_name, "autonomous") |
| ) |
| |
| if execution_result.get("status") in ["executed", "success"]: |
| approval_html = f""" |
| <div style="border: 2px solid #e2e8f0; border-radius: 14px; padding: 20px; background: white; margin-top: 20px;"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 12px; border-bottom: 2px solid #f1f5f9;"> |
| <h4 style="margin: 0; font-size: 16px; color: #1e293b;">β‘ Enterprise Autonomous Execution</h4> |
| <span style="padding: 4px 12px; background: #10b981; color: white; border-radius: 8px; font-size: 12px; font-weight: bold; text-transform: uppercase;">ENTERPRISE+</span> |
| </div> |
| <div style="margin-top: 15px;"> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Scenario:</strong> {scenario_name}</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Mode:</strong> Enterprise Autonomous</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Action Executed:</strong> Scaled Redis cluster from 3 to 5 nodes</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Recovery Time:</strong> 12 minutes (vs 45 min manual)</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Cost Saved:</strong> <span style="color: #10b981; font-weight: 700;">${savings:,}</span></p> |
| |
| <!-- Boundary progression --> |
| <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 20px;"> |
| <div style="padding: 12px; background: #f0fdf4; border-radius: 10px; border-left: 4px solid #10b981; font-size: 14px; color: #475569; font-weight: 500;"> |
| β
1. {boundaries['oss']['label']} generated intent |
| </div> |
| <div style="padding: 12px; background: #f0fdf4; border-radius: 10px; border-left: 4px solid #10b981; font-size: 14px; color: #475569; font-weight: 500;"> |
| β
2. Safety checks passed ({boundaries['enterprise']['label']}) |
| </div> |
| <div style="padding: 12px; background: #f0fdf4; border-radius: 10px; border-left: 4px solid #10b981; font-size: 14px; color: #475569; font-weight: 500;"> |
| β
3. Autonomous execution completed ({boundaries['enterprise']['label']}+) |
| </div> |
| </div> |
| |
| <div style="margin-top: 15px; padding: 10px; background: #f0fdf4; border-radius: 8px; border-left: 4px solid #10b981;"> |
| <p style="margin: 0; font-size: 13px; color: #475569;"> |
| <strong>Architecture Executed:</strong> {boundaries['oss']['label']} β {boundaries['enterprise']['label']}<br> |
| <strong>Boundary Crossed:</strong> Advisory β Autonomous execution |
| </p> |
| </div> |
| </div> |
| </div> |
| """ |
| |
| enterprise_results = { |
| "status": "β
Enterprise Execution Successful", |
| "execution_mode": mode, |
| "scenario": scenario_name, |
| "timestamp": datetime.datetime.now().isoformat(), |
| "enterprise": True, |
| "boundary_crossed": f"OSS β {boundaries['enterprise']['label']}", |
| "actions_executed": [ |
| "β
Scaled resources based on ML recommendations", |
| "β
Implemented circuit breaker pattern", |
| "β
Deployed enhanced monitoring", |
| "β
Updated RAG memory with outcome" |
| ], |
| "business_impact": { |
| "recovery_time": "60 min β 12 min", |
| "cost_saved": f"${savings:,}", |
| "users_impacted": "45,000 β 0", |
| "mttr_reduction": "73% faster" |
| }, |
| "safety_checks": { |
| "blast_radius": "2 services (within limit)", |
| "business_hours": "Compliant", |
| "action_type": "Approved", |
| "circuit_breaker": "Active" |
| }, |
| "enterprise_features_used": execution_result.get("enterprise_features_used", [ |
| "deterministic_confidence", |
| "novel_execution_protocols", |
| "rollback_guarantees", |
| "business_aware_execution" |
| ]), |
| "architectural_result": f"Successfully crossed OSSβEnterprise boundary: {boundaries['oss']['label']} advised β {boundaries['enterprise']['label']} executed" |
| } |
| else: |
| |
| approval_html = f""" |
| <div style="border: 2px solid #ef4444; border-radius: 14px; padding: 20px; background: #fef2f2; margin-top: 20px;"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 12px; border-bottom: 2px solid #fecaca;"> |
| <h4 style="margin: 0; font-size: 16px; color: #1e293b;">β Enterprise Execution Failed</h4> |
| <span style="padding: 4px 12px; background: #ef4444; color: white; border-radius: 8px; font-size: 12px; font-weight: bold; text-transform: uppercase;">FAILED</span> |
| </div> |
| <div style="margin-top: 15px;"> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Scenario:</strong> {scenario_name}</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Error:</strong> {execution_result.get('message', 'Unknown error')}</p> |
| <p style="margin-top: 10px; color: #64748b; font-size: 14px;"> |
| <strong>Boundary Context:</strong> This is a simulation. Real {boundaries['enterprise']['label']} execution requires infrastructure access. |
| </p> |
| </div> |
| </div> |
| """ |
| |
| enterprise_results = { |
| "status": "β Enterprise Execution Failed", |
| "execution_mode": mode, |
| "scenario": scenario_name, |
| "timestamp": datetime.datetime.now().isoformat(), |
| "error": execution_result.get("message", "Unknown error"), |
| "simulation": True, |
| "requires_real_enterprise": True, |
| "boundary_context": f"Simulated execution of {boundaries['enterprise']['label']} - real execution requires production infrastructure", |
| "suggestion": f"Install arf_enterprise package for real {boundaries['enterprise']['label']} execution" |
| } |
| |
| except Exception as e: |
| logger.error(f"Execution failed: {e}") |
| approval_html = f""" |
| <div style="border: 2px solid #ef4444; border-radius: 14px; padding: 20px; background: #fef2f2; margin-top: 20px;"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 12px; border-bottom: 2px solid #fecaca;"> |
| <h4 style="margin: 0; font-size: 16px; color: #1e293b;">β Execution Error</h4> |
| <span style="padding: 4px 12px; background: #ef4444; color: white; border-radius: 8px; font-size: 12px; font-weight: bold; text-transform: uppercase;">ERROR</span> |
| </div> |
| <div style="margin-top: 15px;"> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Scenario:</strong> {scenario_name}</p> |
| <p style="margin: 8px 0; font-size: 14px; color: #475569;"><strong>Error:</strong> {str(e)}</p> |
| <p style="margin-top: 10px; color: #64748b; font-size: 14px;"> |
| <strong>Boundary Context:</strong> Failed at OSSβEnterprise boundary. Real execution requires {boundaries['enterprise']['label']} license. |
| </p> |
| </div> |
| </div> |
| """ |
| |
| enterprise_results = { |
| "status": "β Execution Error", |
| "execution_mode": mode, |
| "scenario": scenario_name, |
| "timestamp": datetime.datetime.now().isoformat(), |
| "error": str(e), |
| "simulation": True, |
| "requires_enterprise": True, |
| "boundary_context": f"Failed crossing OSSβ{boundaries['enterprise']['label']} boundary", |
| "suggestion": f"Contact sales@arf.dev for {boundaries['enterprise']['label']} trial" |
| } |
| |
| |
| execution_table_data = get_audit_manager().get_execution_table() |
| |
| return gr.HTML.update(value=approval_html), enterprise_results, execution_table_data |
|
|
| |
| |
| |
| def calculate_roi(scenario_name, monthly_incidents, team_size): |
| """Calculate ROI with boundary context""" |
| try: |
| logger.info(f"Calculating ROI for {scenario_name}") |
| |
| |
| monthly_incidents = int(monthly_incidents) if monthly_incidents else 15 |
| team_size = int(team_size) if team_size else 5 |
| |
| |
| avg_impact = get_scenario_impact(scenario_name) |
| |
| |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| |
| roi_calculator = get_components()["EnhancedROICalculator"] |
| roi_result = roi_calculator.calculate_comprehensive_roi( |
| monthly_incidents=monthly_incidents, |
| avg_impact=float(avg_impact), |
| team_size=team_size |
| ) |
| |
| |
| roi_multiplier = extract_roi_multiplier(roi_result) |
| |
| |
| if "summary" in roi_result: |
| roi_result["summary"]["boundary_context"] = ( |
| f"Based on {boundaries['oss']['label']} analysis + " |
| f"{boundaries['enterprise']['label']} simulated execution" |
| ) |
| roi_result["summary"]["architecture"] = "OSS advises β Enterprise executes" |
| |
| |
| viz_engine = get_components()["EnhancedVisualizationEngine"] |
| is_real_arf = boundaries["oss"]["available"] |
| chart = viz_engine.create_executive_dashboard( |
| {"roi_multiplier": roi_multiplier}, |
| is_real_arf=is_real_arf |
| ) |
| |
| return roi_result, chart |
| |
| except Exception as e: |
| logger.error(f"ROI calculation error: {e}") |
| |
| |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| |
| fallback_result = { |
| "status": "β
Calculated Successfully", |
| "summary": { |
| "your_annual_impact": "$1,530,000", |
| "potential_savings": "$1,254,600", |
| "enterprise_cost": "$625,000", |
| "roi_multiplier": "5.2Γ", |
| "payback_months": "6.0", |
| "annual_roi_percentage": "420%", |
| "boundary_context": f"Based on {boundaries['oss']['label']} + {boundaries['enterprise']['label']} simulation", |
| "architecture": "OSS advises β Enterprise executes" |
| }, |
| "note": "Using demo calculation - real ROI varies by organization" |
| } |
| |
| |
| viz_engine = get_components()["EnhancedVisualizationEngine"] |
| is_real_arf = boundaries["oss"]["available"] |
| fallback_chart = viz_engine.create_executive_dashboard( |
| {"roi_multiplier": 5.2}, |
| is_real_arf=is_real_arf |
| ) |
| |
| return fallback_result, fallback_chart |
|
|
| |
| |
| |
| def create_demo_interface(): |
| """Create demo interface using modular components with boundary awareness""" |
| |
| import gradio as gr |
| |
| |
| components = get_components() |
| |
| |
| css_styles = components["get_styles"]() |
| |
| |
| global _demo_css |
| _demo_css = css_styles |
| |
| |
| boundary_badges = BoundaryManager.get_boundary_badges() |
| |
| |
| with gr.Blocks( |
| title=f"π ARF Investor Demo v3.8.0 - TRUE ARF v3.3.7" |
| ) as demo: |
| |
| |
| header_html = components["create_header"]("3.3.7", settings.use_true_arf) |
| |
| |
| status_html = components["create_status_bar"]() |
| |
| |
| boundary_display = gr.HTML(value=boundary_badges, visible=settings.show_boundaries) |
| |
| |
| with gr.Tabs(elem_classes="tab-nav"): |
| |
| |
| with gr.TabItem("π₯ Live Incident Demo", id="tab1"): |
| (scenario_dropdown, scenario_card, telemetry_viz, impact_viz, |
| workflow_header, detection_agent, recall_agent, decision_agent, |
| oss_section, enterprise_section, oss_btn, enterprise_btn, |
| approval_toggle, mcp_mode, timeline_viz, |
| detection_time, mttr, auto_heal, savings, |
| oss_results_display, enterprise_results_display, approval_display, demo_btn) = components["create_tab1_incident_demo"]() |
| |
| |
| with gr.TabItem("π° Business Impact & ROI", id="tab2"): |
| (dashboard_output, roi_scenario_dropdown, monthly_slider, team_slider, |
| calculate_btn, roi_output, roi_chart) = components["create_tab2_business_roi"](components["INCIDENT_SCENARIOS"]) |
| |
| |
| with gr.TabItem("π’ Enterprise Features", id="tab3"): |
| (license_display, validate_btn, trial_btn, upgrade_btn, |
| mcp_mode_tab3, mcp_mode_info, features_table, integrations_table) = components["create_tab3_enterprise_features"]() |
| |
| |
| with gr.TabItem("π Audit Trail & History", id="tab4"): |
| (refresh_btn, clear_btn, export_btn, execution_table, |
| incident_table, export_text) = components["create_tab4_audit_trail"]() |
| |
| |
| with gr.TabItem("π§ Learning Engine", id="tab5"): |
| (learning_graph, graph_type, show_labels, search_query, search_btn, |
| clear_btn_search, search_results, stats_display, patterns_display, |
| performance_display) = components["create_tab5_learning_engine"]() |
| |
| |
| footer_html = components["create_footer"]() |
| |
| |
| |
| |
| scenario_dropdown.change( |
| fn=update_scenario_display, |
| inputs=[scenario_dropdown], |
| outputs=[scenario_card, telemetry_viz, impact_viz, timeline_viz] |
| ) |
| |
| |
| oss_btn.click( |
| fn=run_true_arf_analysis, |
| inputs=[scenario_dropdown], |
| outputs=[ |
| detection_agent, recall_agent, decision_agent, |
| oss_results_display, incident_table |
| ] |
| ) |
| |
| |
| enterprise_btn.click( |
| fn=execute_enterprise_healing, |
| inputs=[scenario_dropdown, approval_toggle, mcp_mode], |
| outputs=[approval_display, enterprise_results_display, execution_table] |
| ) |
| |
| |
| @AsyncRunner.async_to_sync |
| async def run_complete_demo_async(scenario_name): |
| """Run a complete demo walkthrough with true ARF and boundary awareness""" |
| |
| update_result = update_scenario_display(scenario_name) |
| |
| |
| oss_result = await run_true_arf_analysis(scenario_name) |
| |
| |
| await asyncio.sleep(1) |
| |
| scenario = components["INCIDENT_SCENARIOS"].get(scenario_name, {}) |
| impact = scenario.get("business_impact", {}) |
| revenue_loss = impact.get("revenue_loss_per_hour", get_scenario_impact(scenario_name)) |
| savings = int(revenue_loss * 0.85) |
| |
| |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| |
| orchestrator = components["DemoOrchestrator"]() |
| execution_result = await orchestrator.execute_healing(scenario_name, "autonomous") |
| |
| enterprise_results = { |
| "demo_mode": "Complete Walkthrough", |
| "scenario": scenario_name, |
| "arf_version": "3.3.7", |
| "true_oss_used": True, |
| "enterprise_simulated": True, |
| "boundary_progression": [ |
| f"1. Incident detected - {boundaries['oss']['label']}", |
| f"2. OSS analysis completed - {boundaries['oss']['label']}", |
| f"3. HealingIntent created - {boundaries['oss']['label']}", |
| f"4. Enterprise license validated ({boundaries['enterprise']['label']})", |
| f"5. Autonomous execution simulated ({boundaries['enterprise']['label']}+)", |
| f"6. Outcome recorded in RAG memory" |
| ], |
| "execution_result": execution_result, |
| "outcome": { |
| "recovery_time": "12 minutes", |
| "manual_comparison": "45 minutes", |
| "cost_saved": f"${savings:,}", |
| "users_protected": "45,000", |
| "learning": "Pattern added to RAG memory" |
| }, |
| "architectural_summary": f"This demonstrates the complete ARF v3.3.7 architecture: {boundaries['oss']['label']} for advisory analysis β {boundaries['enterprise']['label']} for autonomous execution" |
| } |
| |
| |
| demo_message = f""" |
| <div style="border: 1px solid #e2e8f0; border-radius: 14px; padding: 20px; |
| background: linear-gradient(135deg, #f0fdf4 0%, #e9d5ff 100%); margin-top: 20px; |
| box-shadow: 0 8px 32px rgba(16, 185, 129, 0.1);"> |
| |
| <!-- Header with dual-color badge showing boundary --> |
| <div style="display: flex; justify-content: space-between; align-items: center; |
| margin-bottom: 20px; padding-bottom: 12px; border-bottom: 2px solid #e2e8f0;"> |
| <div> |
| <h3 style="margin: 0; font-size: 18px; color: #1e293b; font-weight: 700;"> |
| β
Complete Demo: Architecture Validated |
| </h3> |
| <p style="margin: 5px 0 0 0; font-size: 13px; color: #64748b;"> |
| ARF v3.3.7 β’ OSS advises β Enterprise executes |
| </p> |
| </div> |
| <div style="display: flex; align-items: center; gap: 8px;"> |
| <span style="padding: 6px 14px; background: linear-gradient(90deg, #10b981 0%, #10b981 50%, #8b5cf6 50%, #8b5cf6 100%); |
| color: white; border-radius: 20px; font-size: 12px; font-weight: bold;"> |
| BOUNDARY VALIDATED |
| </span> |
| </div> |
| </div> |
| |
| <!-- Key Results Grid --> |
| <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> |
| <!-- Left Column: OSS Results --> |
| <div style="border-left: 4px solid #10b981; padding: 12px; background: #f8fafc; border-radius: 8px;"> |
| <div style="font-size: 11px; color: #64748b; text-transform: uppercase; font-weight: 600; |
| margin-bottom: 5px; display: flex; align-items: center; gap: 6px;"> |
| <span style="display: inline-block; width: 8px; height: 8px; background: #10b981; border-radius: 50%;"></span> |
| {boundaries['oss']['label']} |
| </div> |
| <div style="font-size: 14px; color: #475569; line-height: 1.5;"> |
| β’ Anomaly detected in 45s<br> |
| β’ 3 similar incidents recalled<br> |
| β’ 94% confidence healing plan<br> |
| β’ Apache 2.0 license validated |
| </div> |
| </div> |
| |
| <!-- Right Column: Enterprise Results --> |
| <div style="border-left: 4px solid #8b5cf6; padding: 12px; background: #f8fafc; border-radius: 8px;"> |
| <div style="font-size: 11px; color: #64748b; text-transform: uppercase; font-weight: 600; |
| margin-bottom: 5px; display: flex; align-items: center; gap: 6px;"> |
| <span style="display: inline-block; width: 8px; height: 8px; background: #8b5cf6; border-radius: 50%;"></span> |
| {boundaries['enterprise']['label']} |
| </div> |
| <div style="font-size: 14px; color: #475569; line-height: 1.5;"> |
| β’ Autonomous execution simulated<br> |
| β’ Rollback guarantee: 100%<br> |
| β’ 12min vs 45min recovery<br> |
| β’ ${savings:,} saved |
| </div> |
| </div> |
| </div> |
| |
| <!-- Boundary Progression Visualization --> |
| <div style="margin-bottom: 20px;"> |
| <div style="font-size: 12px; color: #64748b; text-transform: uppercase; font-weight: 600; |
| margin-bottom: 12px; text-align: center;"> |
| ποΈ Architecture Flow |
| </div> |
| <div style="display: flex; align-items: center; justify-content: center; gap: 0;"> |
| <!-- OSS --> |
| <div style="text-align: center; padding: 12px 16px; background: #f0fdf4; border-radius: 10px 0 0 10px; |
| border: 2px solid #10b981; border-right: none; min-width: 140px;"> |
| <div style="font-size: 14px; color: #065f46; font-weight: 700;">OSS Advisory</div> |
| <div style="font-size: 11px; color: #059669; margin-top: 3px;">Apache 2.0</div> |
| </div> |
| |
| <!-- Arrow --> |
| <div style="padding: 0 5px; background: #f1f5f9; position: relative;"> |
| <div style="width: 0; height: 0; border-top: 15px solid transparent; |
| border-bottom: 15px solid transparent; border-left: 15px solid #10b981;"></div> |
| <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); |
| background: white; padding: 2px 6px; border-radius: 10px; font-size: 11px; |
| color: #64748b; border: 1px solid #e2e8f0; white-space: nowrap;"> |
| advises |
| </div> |
| </div> |
| |
| <!-- Enterprise --> |
| <div style="text-align: center; padding: 12px 16px; background: #f5f3ff; border-radius: 0 10px 10px 0; |
| border: 2px solid #8b5cf6; border-left: none; min-width: 140px;"> |
| <div style="font-size: 14px; color: #5b21b6; font-weight: 700;">Enterprise</div> |
| <div style="font-size: 11px; color: #7c3aed; margin-top: 3px;">Commercial</div> |
| </div> |
| </div> |
| </div> |
| |
| <!-- ROI Summary --> |
| <div style="background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); |
| border-radius: 10px; padding: 15px; margin-bottom: 15px;"> |
| <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; text-align: center;"> |
| <div> |
| <div style="font-size: 11px; color: #64748b; margin-bottom: 5px;">Time Saved</div> |
| <div style="font-size: 18px; font-weight: 700; color: #10b981;">73%</div> |
| </div> |
| <div> |
| <div style="font-size: 11px; color: #64748b; margin-bottom: 5px;">Cost Saved</div> |
| <div style="font-size: 18px; font-weight: 700; color: #10b981;">${savings:,}</div> |
| </div> |
| <div> |
| <div style="font-size: 11px; color: #64748b; margin-bottom: 5px;">ROI Multiplier</div> |
| <div style="font-size: 18px; font-weight: 700; color: #8b5cf6;">5.2Γ</div> |
| </div> |
| </div> |
| </div> |
| |
| <!-- Architecture Validation --> |
| <div style="padding: 12px; background: #f0fdf4; border-radius: 8px; border: 1px solid #d1fae5;"> |
| <div style="display: flex; align-items: center; gap: 10px;"> |
| <div style="font-size: 20px;">β
</div> |
| <div> |
| <div style="font-size: 13px; color: #065f46; font-weight: 600; margin-bottom: 2px;"> |
| Architecture Successfully Validated |
| </div> |
| <div style="font-size: 12px; color: #059669;"> |
| Clear separation maintained: OSS for advisory intelligence, Enterprise for autonomous execution |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <!-- Call to Action --> |
| <div style="margin-top: 15px; padding-top: 15px; border-top: 1px dashed #e2e8f0; |
| text-align: center; font-size: 12px; color: #64748b;"> |
| Ready for production? <a href="#" style="color: #8b5cf6; font-weight: 600; text-decoration: none;"> |
| Install ARF Enterprise β</a> |
| </div> |
| </div> |
| """ |
| |
| |
| return ( |
| *update_result, |
| *oss_result[:3], |
| oss_result[3], |
| enterprise_results, |
| demo_message, |
| incident_table, |
| execution_table |
| ) |
| |
| demo_btn.click( |
| fn=run_complete_demo_async, |
| inputs=[scenario_dropdown], |
| outputs=[ |
| scenario_card, telemetry_viz, impact_viz, timeline_viz, |
| detection_agent, recall_agent, decision_agent, |
| oss_results_display, |
| enterprise_results_display, |
| approval_display, |
| incident_table, |
| execution_table |
| ] |
| ) |
| |
| |
| calculate_btn.click( |
| fn=calculate_roi, |
| inputs=[roi_scenario_dropdown, monthly_slider, team_slider], |
| outputs=[roi_output, roi_chart] |
| ) |
| |
| |
| roi_scenario_dropdown.change( |
| fn=lambda x: get_components()["EnhancedROICalculator"]().calculate_comprehensive_roi(), |
| inputs=[], |
| outputs=[roi_output] |
| ) |
| |
| |
| monthly_slider.change( |
| fn=lambda x, y: calculate_roi(roi_scenario_dropdown.value, x, y)[1], |
| inputs=[monthly_slider, team_slider], |
| outputs=[roi_chart] |
| ) |
| |
| team_slider.change( |
| fn=lambda x, y: calculate_roi(roi_scenario_dropdown.value, x, y)[1], |
| inputs=[monthly_slider, team_slider], |
| outputs=[roi_chart] |
| ) |
| |
| |
| def refresh_audit_trail(): |
| """Refresh audit trail tables""" |
| return ( |
| get_audit_manager().get_execution_table(), |
| get_audit_manager().get_incident_table() |
| ) |
| |
| def clear_audit_trail(): |
| """Clear audit trail""" |
| get_audit_manager().clear() |
| return [], [] |
| |
| def export_audit_trail(): |
| """Export audit trail as JSON""" |
| audit_data = { |
| "executions": get_audit_manager().executions, |
| "incidents": get_audit_manager().incidents, |
| "boundary_crossings": get_audit_manager().boundary_crossings, |
| "export_time": datetime.datetime.now().isoformat(), |
| "arf_version": "3.3.7", |
| "architecture": "OSS advises β Enterprise executes" |
| } |
| return json.dumps(audit_data, indent=2) |
| |
| refresh_btn.click( |
| fn=refresh_audit_trail, |
| inputs=[], |
| outputs=[execution_table, incident_table] |
| ) |
| |
| clear_btn.click( |
| fn=clear_audit_trail, |
| inputs=[], |
| outputs=[execution_table, incident_table] |
| ) |
| |
| export_btn.click( |
| fn=export_audit_trail, |
| inputs=[], |
| outputs=[export_text] |
| ) |
| |
| |
| def validate_license(): |
| """Validate enterprise license with boundary context""" |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| if boundaries["enterprise"]["available"]: |
| return { |
| "status": "β
Valid License", |
| "license_type": "Enterprise", |
| "version": boundaries["enterprise"]["version"], |
| "expires": "2025-12-31", |
| "capabilities": boundaries["enterprise"]["capabilities"], |
| "boundary_context": f"Real {boundaries['enterprise']['label']} detected" |
| } |
| else: |
| return { |
| "status": "β οΈ Demo Mode", |
| "license_type": "Simulated", |
| "version": boundaries["enterprise"]["version"], |
| "expires": "Demo only", |
| "capabilities": boundaries["enterprise"]["capabilities"], |
| "boundary_context": f"Simulating {boundaries['enterprise']['label']} - requires license", |
| "contact": "sales@arf.dev" |
| } |
| |
| validate_btn.click( |
| fn=validate_license, |
| inputs=[], |
| outputs=[license_display] |
| ) |
| |
| |
| demo.load( |
| fn=lambda: boundary_badges, |
| inputs=[], |
| outputs=[boundary_display] |
| ) |
| |
| |
| demo.load( |
| fn=lambda: update_scenario_display(settings.default_scenario), |
| inputs=[], |
| outputs=[scenario_card, telemetry_viz, impact_viz, timeline_viz] |
| ) |
| |
| |
| demo.load( |
| fn=lambda: calculate_roi(settings.default_scenario, 15, 5), |
| inputs=[], |
| outputs=[roi_output, roi_chart] |
| ) |
| |
| logger.info("β
Demo interface created successfully with boundary awareness") |
| |
| return demo |
|
|
| |
| |
| |
| def launch_demo(): |
| """Launch the demo application with proper configuration""" |
| try: |
| logger.info("π Starting ARF Ultimate Investor Demo v3.8.0 - ENTERPRISE EDITION") |
| logger.info(f"π Settings: mode={settings.arf_mode}, use_true_arf={settings.use_true_arf}") |
| |
| |
| installation = get_installation_status() |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| logger.info("=" * 60) |
| logger.info("ποΈ SYSTEM ARCHITECTURE BOUNDARIES:") |
| logger.info(f" OSS: {boundaries['oss']['label']} v{boundaries['oss']['version']}") |
| logger.info(f" Enterprise: {boundaries['enterprise']['label']} v{boundaries['enterprise']['version']}") |
| logger.info(f" Mode: {boundaries['demo_mode']['architecture']}") |
| logger.info(f" Honesty: {boundaries['demo_mode']['honesty_level']}") |
| logger.info("=" * 60) |
| |
| if installation["oss_installed"]: |
| logger.info("β
True ARF OSS detected - using real v3.3.7 integration") |
| else: |
| logger.warning("β οΈ ARF OSS not installed - using enhanced mock mode") |
| logger.info("π‘ Install: pip install agentic-reliability-framework==3.3.7") |
| |
| if installation["enterprise_installed"]: |
| logger.info("π ARF Enterprise detected - real autonomous execution available") |
| else: |
| logger.info("π Enterprise not installed - simulating autonomous execution") |
| logger.info("π‘ Contact sales@arf.dev for Enterprise trial") |
| |
| |
| demo = create_demo_interface() |
| |
| |
| components = get_components() |
| css_styles = components["get_styles"]() |
| |
| |
| launch_config = { |
| "server_name": "0.0.0.0", |
| "server_port": 7860, |
| "share": False, |
| "favicon_path": None, |
| "auth": None, |
| "auth_message": None, |
| "ssl_verify": True, |
| "ssl_keyfile": None, |
| "ssl_certfile": None, |
| "quiet": False, |
| "show_error": True, |
| "debug": False, |
| "enable_queue": True, |
| "max_threads": 40, |
| "theme": "default", |
| "dark": False, |
| "show_api": False, |
| "allowed_paths": None, |
| "blocked_paths": None, |
| "app_kwargs": {}, |
| "root_path": "", |
| } |
| |
| |
| if css_styles: |
| launch_config["css"] = css_styles |
| |
| logger.info("β
Launch configuration ready") |
| logger.info("π Starting web server...") |
| |
| return demo, launch_config |
| |
| except Exception as e: |
| logger.error(f"β Launch failed: {e}", exc_info=True) |
| |
| |
| import gradio as gr |
| |
| with gr.Blocks(title="ARF Demo - Fallback Mode") as fallback_demo: |
| gr.HTML(""" |
| <div style="text-align: center; padding: 50px;"> |
| <h1 style="color: #ef4444;">π¨ ARF Demo Failed to Start</h1> |
| <p style="color: #64748b; font-size: 16px;">Error: """ + str(e) + """</p> |
| <div style="margin-top: 30px; padding: 20px; background: #fef2f2; border-radius: 10px; display: inline-block;"> |
| <p style="color: #dc2626; font-weight: bold;">Troubleshooting Steps:</p> |
| <ol style="text-align: left; color: #475569;"> |
| <li>Check logs for detailed error</li> |
| <li>Ensure all dependencies are installed</li> |
| <li>Try: pip install agentic-reliability-framework==3.3.7</li> |
| <li>Restart the application</li> |
| </ol> |
| </div> |
| </div> |
| """) |
| |
| return fallback_demo, {"server_name": "0.0.0.0", "server_port": 7860} |
|
|
| |
| |
| |
| if __name__ == "__main__": |
| try: |
| logger.info("π ARF Ultimate Investor Demo v3.8.0 - ENTERPRISE EDITION") |
| logger.info("=" * 60) |
| logger.info("Enhanced version with clear boundaries and reliable visualizations") |
| logger.info("Fixed to show clear OSS vs Enterprise boundaries with architectural honesty") |
| logger.info("=" * 60) |
| |
| |
| demo, config = launch_demo() |
| |
| |
| print("\n" + "="*60) |
| print("π ARF Ultimate Investor Demo v3.8.0 - ENTERPRISE EDITION") |
| print("π Architecture: OSS advises β Enterprise executes") |
| print("π Starting on http://localhost:7860") |
| print("="*60 + "\n") |
| |
| |
| try: |
| demo.launch(**config) |
| except Exception as launch_error: |
| logger.error(f"β Launch error: {launch_error}") |
| |
| |
| if "css" in config: |
| logger.info("β οΈ Retrying without CSS...") |
| config.pop("css", None) |
| demo.launch(**config) |
| else: |
| |
| demo.launch(server_name="0.0.0.0", server_port=7860) |
| |
| except KeyboardInterrupt: |
| logger.info("π Demo stopped by user") |
| except Exception as e: |
| logger.error(f"β Fatal error: {e}", exc_info=True) |
| sys.exit(1) |