| """ |
| Installation helper utilities for ARF Demo - FIXED VERSION |
| Updated to v3.3.9 (actual PyPI version) - SURGICAL FIX |
| """ |
| import subprocess |
| import sys |
| import logging |
| from typing import Dict, Any, List, Optional |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| class InstallationHelper: |
| """Helper class for ARF package installation - FIXED: No attempt to import non-existent packages""" |
| |
| @staticmethod |
| def install_arf_oss() -> Dict[str, Any]: |
| """Install ARF OSS package - FIXED: Updated to v3.3.9""" |
| try: |
| logger.info("Installing ARF OSS v3.3.9...") |
| result = subprocess.run( |
| [sys.executable, "-m", "pip", "install", "agentic-reliability-framework==3.3.9"], |
| capture_output=True, |
| text=True, |
| check=True |
| ) |
| |
| return { |
| "success": True, |
| "message": "β
ARF OSS v3.3.9 installed successfully", |
| "output": result.stdout |
| } |
| |
| except subprocess.CalledProcessError as e: |
| return { |
| "success": False, |
| "message": "β Failed to install ARF OSS", |
| "error": e.stderr |
| } |
| except Exception as e: |
| return { |
| "success": False, |
| "message": f"β Installation error: {str(e)}", |
| "error": str(e) |
| } |
| |
| @staticmethod |
| def check_installation() -> Dict[str, Any]: |
| """ |
| FIXED: Check ARF package installation - no attempt to import non-existent arf_enterprise |
| Enterprise is always simulated in this demo |
| """ |
| try: |
| import agentic_reliability_framework as arf_oss |
| oss_version = getattr(arf_oss, '__version__', 'unknown') |
| oss_installed = True |
| logger.info(f"β
ARF OSS v{oss_version} detected") |
| except ImportError: |
| oss_installed = False |
| oss_version = None |
| logger.info("β οΈ ARF OSS not installed - using mock mode") |
| |
| |
| enterprise_installed = False |
| enterprise_version = "simulated" |
| logger.info("β οΈ ARF Enterprise not installed - using simulation") |
| |
| return { |
| "oss_installed": oss_installed, |
| "oss_version": oss_version, |
| "enterprise_installed": enterprise_installed, |
| "enterprise_version": enterprise_version, |
| "recommendations": InstallationHelper.get_recommendations(oss_installed, enterprise_installed), |
| "boundaries": { |
| "oss_can": ["advisory_analysis", "rag_search", "healing_intent"], |
| "oss_cannot": ["execute", "modify_infra", "autonomous_healing"], |
| "enterprise_simulated": True, |
| "enterprise_requires_license": True, |
| "architecture": "OSS advises β Enterprise simulates" |
| } |
| } |
| |
| @staticmethod |
| def get_recommendations(oss_installed: bool, enterprise_installed: bool) -> List[str]: |
| """ |
| FIXED: Get realistic installation recommendations |
| Enterprise package doesn't exist publicly |
| """ |
| recommendations = [] |
| |
| if not oss_installed: |
| recommendations.append( |
| "Install ARF OSS: `pip install agentic-reliability-framework==3.3.9`" |
| ) |
| recommendations.append( |
| "π‘ Without OSS, demo runs in mock mode with simulated analysis" |
| ) |
| |
| |
| recommendations.append( |
| "π ARF Enterprise requires commercial license - simulated in this demo" |
| ) |
| recommendations.append( |
| "π’ Contact sales@arf.dev for Enterprise trial access" |
| ) |
| |
| return recommendations |
| |
| @staticmethod |
| def get_installation_html() -> str: |
| """Get HTML for installation status display - FIXED to show clear boundaries""" |
| status = InstallationHelper.check_installation() |
| |
| if status["oss_installed"]: |
| oss_html = f""" |
| <div style="padding: 10px; background: linear-gradient(135deg, #10b981 0%, #0ca678 100%); |
| color: white; border-radius: 8px; margin: 5px 0; border: 1px solid #0da271;"> |
| <div style="display: flex; align-items: center; gap: 8px;"> |
| <span style="font-size: 16px;">β
</span> |
| <div> |
| <div style="font-weight: 600;">ARF OSS v{status['oss_version']}</div> |
| <div style="font-size: 12px; opacity: 0.9;">Apache 2.0 β’ Advisory Intelligence</div> |
| </div> |
| </div> |
| </div> |
| """ |
| else: |
| oss_html = """ |
| <div style="padding: 10px; background: linear-gradient(135deg, #f59e0b 0%, #e0950a 100%); |
| color: white; border-radius: 8px; margin: 5px 0; border: 1px solid #d98a09;"> |
| <div style="display: flex; align-items: center; gap: 8px;"> |
| <span style="font-size: 16px;">β οΈ</span> |
| <div> |
| <div style="font-weight: 600;">Mock ARF</div> |
| <div style="font-size: 12px; opacity: 0.9;">Simulated analysis only</div> |
| </div> |
| </div> |
| </div> |
| """ |
| |
| |
| enterprise_html = f""" |
| <div style="padding: 10px; background: linear-gradient(135deg, #64748b 0%, #4b5563 100%); |
| color: white; border-radius: 8px; margin: 5px 0; border: 1px dashed #9ca3af;"> |
| <div style="display: flex; align-items: center; gap: 8px;"> |
| <span style="font-size: 16px;">π</span> |
| <div> |
| <div style="font-weight: 600;">Enterprise Simulation</div> |
| <div style="font-size: 12px; opacity: 0.9;">v{status['enterprise_version']} β’ Commercial License Required</div> |
| </div> |
| </div> |
| </div> |
| """ |
| |
| |
| recommendations_html = "" |
| if status["recommendations"]: |
| rec_list = "\n".join([f"<li style='margin-bottom: 5px;'>{rec}</li>" for rec in status["recommendations"][:3]]) |
| recommendations_html = f""" |
| <div style="margin-top: 15px; padding: 12px; background: #f8fafc; border-radius: 8px; border: 1px solid #e2e8f0;"> |
| <div style="font-weight: 600; color: #475569; margin-bottom: 8px; display: flex; align-items: center; gap: 6px;"> |
| <span>π‘</span> <span>Architecture & Recommendations</span> |
| </div> |
| <ul style="margin: 5px 0 0 0; padding-left: 20px; color: #64748b; font-size: 13px;"> |
| {rec_list} |
| </ul> |
| </div> |
| """ |
| |
| |
| boundary_html = """ |
| <div style="margin-top: 10px; padding: 8px; background: #f0fdf4; border-radius: 6px; border: 1px solid #d1fae5;"> |
| <div style="font-size: 12px; color: #059669; display: flex; align-items: center; gap: 6px;"> |
| <span style="display: inline-block; width: 8px; height: 8px; background: #10b981; border-radius: 50%;"></span> |
| <span>Boundary: OSS advises β Enterprise simulates</span> |
| </div> |
| </div> |
| """ |
| |
| return f""" |
| <div style="border: 2px solid #e2e8f0; border-radius: 12px; padding: 15px; background: white; |
| box-shadow: 0 1px 3px rgba(0,0,0,0.05);"> |
| <h4 style="margin: 0 0 12px 0; color: #1e293b; font-size: 16px; font-weight: 600;"> |
| π¦ ARF Installation & Boundaries |
| </h4> |
| {oss_html} |
| {enterprise_html} |
| {boundary_html} |
| {recommendations_html} |
| </div> |
| """ |
|
|
|
|
| |
| installation_helper = InstallationHelper() |