| |
| π 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 |
| |
| # =========================================== |
| # CONFIGURE LOGGING FIRST |
| # =========================================== |
| 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__) |
| |
| # Add parent directory to path |
| sys.path.insert(0, str(Path(__file__).parent)) |
| |
| # =========================================== |
| # IMPORT UTILITY CLASSES FIRST |
| # =========================================== |
| from utils.installation import InstallationHelper |
| from demo.guidance import DemoPsychologyController, get_demo_controller |
| |
| # =========================================== |
| # BOUNDARY MANAGEMENT SYSTEM |
| # =========================================== |
| class BoundaryManager: |
| """Manages clear boundaries between OSS and Enterprise""" |
| # ... (keep existing BoundaryManager code, it's correct) |
| |
| @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> |
| """ |
| |
| # =========================================== |
| # ASYNC UTILITIES |
| # =========================================== |
| 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 |
| |
| # =========================================== |
| # SIMPLE SETTINGS |
| # =========================================== |
| 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() |
| |
| # =========================================== |
| # ARF INSTALLATION CHECK - FIXED VERSION |
| # =========================================== |
| def check_arf_installation(): |
| """Check if real ARF packages are installed - Fixed version""" |
| 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() |
| } |
| |
| # Check OSS package using InstallationHelper |
| installation_helper = InstallationHelper() |
| status = installation_helper.check_installation() |
| |
| results["oss_installed"] = status["oss_installed"] |
| results["oss_version"] = status["oss_version"] |
| results["enterprise_installed"] = status["enterprise_installed"] |
| results["enterprise_version"] = status["enterprise_version"] |
| results["recommendations"] = status["recommendations"] |
| |
| if results["oss_installed"]: |
| results["badges"]["oss"] = { |
| "text": f"β
ARF OSS v{results['oss_version']}", |
| "color": "#10b981", |
| "icon": "β
" |
| } |
| logger.info(f"β
ARF OSS v{results['oss_version']} detected") |
| else: |
| logger.info("β οΈ ARF OSS not installed - using mock mode") |
| |
| if results["enterprise_installed"]: |
| results["badges"]["enterprise"] = { |
| "text": f"π Enterprise v{results['enterprise_version']}", |
| "color": "#8b5cf6", |
| "icon": "π" |
| } |
| logger.info(f"β
ARF Enterprise v{results['enterprise_version']} detected") |
| else: |
| 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 |
| |
| # =========================================== |
| # RELIABLE VISUALIZATION HELPERS |
| # =========================================== |
| def create_simple_telemetry_plot(scenario_name: str, is_real_arf: bool = True): |
| """Simple guaranteed-to-work telemetry plot with boundary indicators""" |
| # ... (keep existing visualization functions, they're correct) |
| pass |
| |
| def create_html_telemetry_fallback(scenario_name: str, is_real_arf: bool) -> str: |
| """HTML fallback for telemetry visualization""" |
| pass |
| |
| def create_simple_impact_plot(scenario_name: str, is_real_arf: bool = True): |
| """Simple guaranteed-to-work impact plot with boundary indicators""" |
| pass |
| |
| def create_html_impact_fallback(scenario_name: str, is_real_arf: bool) -> str: |
| """HTML fallback for impact visualization""" |
| pass |
| |
| def create_empty_plot(title: str, is_real_arf: bool = True): |
| """Create an empty placeholder plot with boundary indicators""" |
| pass |
| |
| def get_inactive_agent_html(agent_name: str, description: str, is_real_arf: bool = False): |
| """Get HTML for inactive agent state with boundary indicators""" |
| pass |
| |
| # =========================================== |
| # IMPORT MODULAR COMPONENTS |
| # =========================================== |
| 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...") |
| |
| # First, import gradio |
| import gradio as gr |
| components["gr"] = gr |
| |
| # Import UI styles |
| from ui.styles import get_styles |
| components["get_styles"] = get_styles |
| |
| # Import UI components |
| 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, |
| }) |
| |
| # Import scenarios |
| from demo.scenarios import INCIDENT_SCENARIOS |
| components["INCIDENT_SCENARIOS"] = INCIDENT_SCENARIOS |
| |
| # Try to import TrueARF337Orchestrator |
| try: |
| from core.true_arf_orchestrator import TrueARF337Orchestrator |
| components["DemoOrchestrator"] = TrueARF337Orchestrator |
| except ImportError: |
| # Fallback to real ARF integration |
| try: |
| from core.real_arf_integration import RealARFIntegration |
| components["DemoOrchestrator"] = RealARFIntegration |
| except ImportError: |
| # Create a minimal mock orchestrator |
| 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 |
| |
| # Try to import ROI calculator |
| try: |
| from core.calculators import EnhancedROICalculator |
| components["EnhancedROICalculator"] = EnhancedROICalculator() |
| except ImportError: |
| 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() |
| |
| # Try to import visualization engine |
| try: |
| from core.visualizations import EnhancedVisualizationEngine |
| components["EnhancedVisualizationEngine"] = EnhancedVisualizationEngine() |
| except ImportError: |
| 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() |
| |
| components["all_available"] = True |
| components["error"] = None |
| logger.info("β
Successfully imported all modular components") |
| |
| except Exception as e: |
| logger.error(f"β IMPORT ERROR: {e}") |
| components["error"] = str(e) |
| components["all_available"] = False |
| |
| # Ensure we have minimal components |
| if "gr" not in components: |
| import gradio as gr |
| components["gr"] = gr |
| |
| 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 |
| |
| # =========================================== |
| # AUDIT TRAIL MANAGER |
| # =========================================== |
| class AuditTrailManager: |
| """Enhanced audit trail manager with boundary tracking""" |
| # ... (keep existing AuditTrailManager code) |
| pass |
| |
| def get_audit_manager() -> AuditTrailManager: |
| """Lazy load audit manager singleton""" |
| global _audit_manager |
| if _audit_manager is None: |
| _audit_manager = AuditTrailManager() |
| return _audit_manager |
| |
| # =========================================== |
| # HELPER FUNCTIONS |
| # =========================================== |
| 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) |
| return 5.2 |
| except Exception as e: |
| logger.warning(f"Failed to extract ROI multiplier: {e}") |
| return 5.2 |
| |
| # =========================================== |
| # SCENARIO UPDATE HANDLER |
| # =========================================== |
| def update_scenario_display(scenario_name: str) -> tuple: |
| """Update all scenario-related displays with scenario-specific data""" |
| # ... (keep existing update_scenario_display code) |
| pass |
| |
| # =========================================== |
| # TRUE ARF ANALYSIS HANDLER |
| # =========================================== |
| @AsyncRunner.async_to_sync |
| async def run_true_arf_analysis(scenario_name: str): |
| """Run true ARF v3.3.7 analysis with OSS + Enterprise simulation""" |
| # ... (keep existing run_true_arf_analysis code) |
| pass |
| |
| # =========================================== |
| # ENTERPRISE EXECUTION HANDLER |
| # =========================================== |
| def execute_enterprise_healing(scenario_name, approval_required, mcp_mode_value): |
| """Execute enterprise healing with clear boundary indicators""" |
| import gradio as gr |
| |
| # ... (keep existing execute_enterprise_healing code) |
| pass |
| |
| # =========================================== |
| # ROI CALCULATION FUNCTION |
| # =========================================== |
| def calculate_roi(scenario_name, monthly_incidents, team_size): |
| """Calculate ROI with boundary context""" |
| # ... (keep existing calculate_roi code) |
| pass |
| |
| # =========================================== |
| # CREATE DEMO INTERFACE - FIXED VERSION |
| # =========================================== |
| def create_demo_interface(): |
| """Create demo interface using modular components with boundary awareness""" |
| |
| import gradio as gr |
| |
| # Get components |
| components = get_components() |
| |
| # Get CSS styles |
| css_styles = components["get_styles"]() |
| |
| # Store CSS for later use in launch() |
| global _demo_css |
| _demo_css = css_styles |
| |
| # Get boundary badges for the interface |
| boundary_badges = BoundaryManager.get_boundary_badges() |
| |
| # Create interface without css parameter (will be added in launch) |
| with gr.Blocks( |
| title=f"π ARF Investor Demo v3.8.0 - TRUE ARF v3.3.7" |
| ) as demo: |
| |
| # Header |
| header_html = components["create_header"]("3.3.7", settings.use_true_arf) |
| |
| # Status bar with boundary badges |
| status_html = components["create_status_bar"]() |
| |
| # Add boundary badges as a separate element |
| boundary_display = gr.HTML(value=boundary_badges, visible=settings.show_boundaries) |
| |
| # ============ 5 TABS ============ |
| with gr.Tabs(elem_classes="tab-nav"): |
| |
| # TAB 1: Live Incident Demo |
| 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"]() |
| |
| # TAB 2: Business ROI |
| 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"]) |
| |
| # TAB 3: Enterprise Features |
| 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"]() |
| |
| # TAB 4: Audit Trail |
| 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"]() |
| |
| # TAB 5: Learning Engine |
| 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 |
| footer_html = components["create_footer"]() |
| |
| # ============ EVENT HANDLERS ============ |
| |
| # Update scenario display when dropdown changes |
| scenario_dropdown.change( |
| fn=update_scenario_display, |
| inputs=[scenario_dropdown], |
| outputs=[scenario_card, telemetry_viz, impact_viz, timeline_viz] |
| ) |
| |
| # Run OSS Analysis |
| oss_btn.click( |
| fn=run_true_arf_analysis, |
| inputs=[scenario_dropdown], |
| outputs=[ |
| detection_agent, recall_agent, decision_agent, |
| oss_results_display, incident_table |
| ] |
| ) |
| |
| # Execute Enterprise Healing |
| enterprise_btn.click( |
| fn=execute_enterprise_healing, |
| inputs=[scenario_dropdown, approval_toggle, mcp_mode], |
| outputs=[approval_display, enterprise_results_display, execution_table] |
| ) |
| |
| # Run Complete Demo with boundary progression |
| @AsyncRunner.async_to_sync |
| async def run_complete_demo_async(scenario_name): |
| """Run a complete demo walkthrough with true ARF and boundary awareness""" |
| # Step 1: Update scenario |
| update_result = update_scenario_display(scenario_name) |
| |
| # Step 2: Run true ARF analysis |
| oss_result = await run_true_arf_analysis(scenario_name) |
| |
| # Step 3: Execute Enterprise (simulation) with boundary context |
| 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) |
| |
| # Get boundary context |
| boundaries = BoundaryManager.get_system_boundaries() |
| |
| # Get orchestrator for execution simulation |
| 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" |
| } |
| |
| # Create demo completion message with enhanced boundary context |
| 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> |
| """ |
| |
| # IMPORTANT FIX: The demo_message should update approval_display, not create a new output |
| # Update the enterprise_results_display to include demo completion info |
| enterprise_results["demo_completion_message"] = demo_message |
| |
| # Get updated tables |
| incident_table_data = get_audit_manager().get_incident_table() |
| execution_table_data = get_audit_manager().get_execution_table() |
| |
| # Combine all results - FIXED OUTPUT COUNT |
| return ( |
| *update_result, # 4 outputs: scenario_card, telemetry_viz, impact_viz, timeline_viz |
| *oss_result[:3], # 3 outputs: detection_agent, recall_agent, decision_agent |
| oss_result[3], # 1 output: oss_results_display |
| enterprise_results, # 1 output: enterprise_results_display |
| demo_message, # 1 output: approval_display |
| incident_table_data, # 1 output: incident_table |
| execution_table_data # 1 output: execution_table |
| ) # TOTAL: 4 + 3 + 1 + 1 + 1 + 1 + 1 = 12 outputs (matches expectations) |
| |
| # FIXED: demo_btn.click with correct output count |
| demo_btn.click( |
| fn=run_complete_demo_async, |
| inputs=[scenario_dropdown], |
| outputs=[ |
| scenario_card, telemetry_viz, impact_viz, timeline_viz, # 4 |
| detection_agent, recall_agent, decision_agent, # 3 |
| oss_results_display, # 1 |
| enterprise_results_display, # 1 |
| approval_display, # 1 |
| incident_table, # 1 |
| execution_table # 1 |
| ] # TOTAL: 12 outputs |
| ) |
| |
| # ROI Calculation |
| calculate_btn.click( |
| fn=calculate_roi, |
| inputs=[roi_scenario_dropdown, monthly_slider, team_slider], |
| outputs=[roi_output, roi_chart] |
| ) |
| |
| # Update ROI scenario |
| roi_scenario_dropdown.change( |
| fn=lambda x: get_components()["EnhancedROICalculator"]().calculate_comprehensive_roi(), |
| inputs=[], |
| outputs=[roi_output] |
| ) |
| |
| # Update ROI chart |
| 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] |
| ) |
| |
| # Audit Trail Functions |
| 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] |
| ) |
| |
| # Enterprise Features |
| 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] |
| ) |
| |
| # Initialize with boundary badges |
| demo.load( |
| fn=lambda: boundary_badges, |
| inputs=[], |
| outputs=[boundary_display] |
| ) |
| |
| # Load default scenario |
| demo.load( |
| fn=lambda: update_scenario_display(settings.default_scenario), |
| inputs=[], |
| outputs=[scenario_card, telemetry_viz, impact_viz, timeline_viz] |
| ) |
| |
| # Load ROI data |
| 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 |
| |
| # =========================================== |
| # LAUNCH FUNCTION |
| # =========================================== |
| def launch_demo(): |
| """Launch the demo application with proper configuration""" |
| try: |
| logger.info("π Starting ARF Ultimate Investor Demo v3.8.0 - ENTERPRISE EDITION") |
| |
| # Check installation |
| 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("=" * 60) |
| |
| # Create interface |
| demo = create_demo_interface() |
| |
| # Get CSS styles |
| components = get_components() |
| css_styles = components["get_styles"]() |
| |
| # Configure for Hugging Face Spaces |
| launch_config = { |
| "server_name": "0.0.0.0", |
| "server_port": 7860, |
| "share": False, |
| "favicon_path": None, |
| "quiet": False, |
| "show_error": True, |
| "debug": False, |
| "enable_queue": True, |
| "max_threads": 40, |
| } |
| |
| # Add CSS if available |
| if css_styles: |
| launch_config["css"] = css_styles |
| |
| logger.info("β
Launch configuration ready") |
| |
| return demo, launch_config |
| |
| except Exception as e: |
| logger.error(f"β Launch failed: {e}", exc_info=True) |
| |
| # Create minimal fallback interface |
| import gradio as gr |
| |
| with gr.Blocks(title="ARF Demo - Fallback Mode") as fallback_demo: |
| gr.HTML(f""" |
| <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} |
| |
| # =========================================== |
| # MAIN EXECUTION |
| # =========================================== |
| 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) |
| |
| # Launch the demo |
| 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") |
| |
| # Launch with error handling |
| try: |
| demo.launch(**config) |
| except Exception as launch_error: |
| logger.error(f"β Launch error: {launch_error}") |
| |
| # Try alternative launch without CSS |
| if "css" in config: |
| logger.info("β οΈ Retrying without CSS...") |
| config.pop("css", None) |
| demo.launch(**config) |
| else: |
| # Last resort: simple launch |
| 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) |