import gradio as gr from agent.pipeline import ( analyze_change, oob_troubleshoot, perform_recovery, load_synapse_log, reset_state, ) from agent import topology VINE_CSS = """ @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@600;700&family=Inter:wght@400;500;600&display=swap'); :root { --og-green: #0f4d3f; --og-mint: #38c49d; --og-fern: #1c6b53; --og-cream: #f5f3ec; --og-shadow: 0 18px 40px rgba(10,48,38,0.18); } html, body { overflow-x: hidden; } body, .gradio-container { font-family: 'Inter', system-ui, -apple-system, sans-serif; background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNDAnIGhlaWdodD0nMjQwJyB2aWV3Qm94PScwIDAgMjQwIDI0MCc+CjxwYXRoIGQ9J00xMCAyMDAgQyA2MCAxNTAsIDEyMCAxMjAsIDE0MCA3MCBDIDE1NSA0MCwgMTg1IDMwLCAyMjAgMjAnIHN0cm9rZT0nIzFjNmI1Mycgc3Ryb2tlLXdpZHRoPSc0JyBmaWxsPSdub25lJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1vcGFjaXR5PScuMTYnLz4KPHBhdGggZD0nTTUwIDIyMCBDIDkwIDE5MCwgMTMwIDE0MCwgMTcwIDEwMCcgc3Ryb2tlPScjM2NiZjlhJyBzdHJva2Utd2lkdGg9JzMnIGZpbGw9J25vbmUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLW9wYWNpdHk9Jy4yMCcvPgo8Y2lyY2xlIGN4PSc5MCcgY3k9JzE1MCcgcj0nMTAnIGZpbGw9JyMzY2JmOWEnIGZpbGwtb3BhY2l0eT0nLjI1Jy8+CjxjaXJjbGUgY3g9JzE1MCcgY3k9JzkwJyByPSc5JyBmaWxsPScjMGY0ZDNmJyBmaWxsLW9wYWNpdHk9Jy4xOCcvPgo8Y2lyY2xlIGN4PScyMDAnIGN5PSc1MCcgcj0nNycgZmlsbD0nIzhiZDdiMScgZmlsbC1vcGFjaXR5PScuMjInLz4KPC9zdmc+") repeat, radial-gradient(circle at 12% 20%, rgba(60,191,154,0.10), transparent 32%), radial-gradient(circle at 82% 16%, rgba(15,77,63,0.10), transparent 30%), linear-gradient(135deg, #f8f7f2 0%, #ecf2e9 100%); color: #0f1b1a; position: relative; } .gradio-container > * { position: relative; z-index: 1; } .og-hero { background: linear-gradient(120deg, rgba(15,77,63,0.32), rgba(56,196,157,0.18)), linear-gradient(160deg, rgba(140,215,177,0.20), rgba(15,77,63,0.14)), url("assets/trellis.jpg?v=1"); background-size: cover; background-position: center; background-repeat: no-repeat; border: 1px solid rgba(15,77,63,0.16); box-shadow: var(--og-shadow); border-radius: 18px; padding: 22px; position: relative; overflow: hidden; } .og-hero::before, .og-hero::after { content: ""; position: absolute; inset: -80px -20px auto auto; width: 240px; height: 240px; background: radial-gradient(circle at 40% 40%, rgba(60,191,154,0.4), transparent 60%), radial-gradient(circle at 70% 70%, rgba(15,77,63,0.45), transparent 62%); filter: blur(6px); opacity: 0.35; } .og-hero::after { inset: auto auto -120px -20px; transform: rotate(8deg); } .og-hero h2 { font-family: 'Playfair Display', serif; font-size: 28px; color: var(--og-green); letter-spacing: 0.02em; } .og-hero p { margin: 0; font-size: 15px; color: #0f4d3f; max-width: 720px; } .og-pill { display: inline-block; padding: 7px 12px; border-radius: 999px; background: rgba(60,191,154,0.22); color: var(--og-green); font-weight: 700; margin: 0 10px 8px 0; letter-spacing: 0.01em; box-shadow: 0 8px 18px rgba(0,0,0,0.06); } .og-panel { border: 1px solid rgba(15,77,63,0.16); border-radius: 16px; background: rgba(255,255,255,0.9); box-shadow: 0 12px 28px rgba(0,0,0,0.07); padding: 16px; position: relative; overflow: hidden; } .og-panel::before { content: ""; position: absolute; inset: -30px auto auto -20px; width: 160px; height: 160px; background: radial-gradient(circle at 60% 40%, rgba(60,191,154,0.22), transparent 60%); opacity: 0.55; pointer-events: none; } .og-panel::after { content: ""; position: absolute; inset: auto -20px -40px auto; width: 150px; height: 150px; background: radial-gradient(circle at 30% 30%, rgba(15,77,63,0.14), transparent 65%); opacity: 0.55; pointer-events: none; } .og-tab-title { font-family: 'Playfair Display', serif; color: var(--og-green); } .og-tabs .tab-nav button { font-family: 'Playfair Display', serif; color: var(--og-fern); } .og-tabs .tab-nav button.selected { background: rgba(60,191,154,0.16); border-color: rgba(60,191,154,0.4); color: var(--og-green); } .og-divider { border-bottom: 1px solid rgba(15,77,63,0.12); margin: 10px 0 14px 0; } .og-label { color: var(--og-green); font-weight: 700; letter-spacing: 0.02em; } textarea, input, select { border-radius: 12px !important; border: 1px solid rgba(15,77,63,0.16) !important; background: rgba(255,255,255,0.95) !important; } .gr-button { border-radius: 12px !important; box-shadow: 0 12px 22px rgba(15,77,63,0.18) !important; background: linear-gradient(120deg, var(--og-green), #128162) !important; color: #f5f3ec !important; border: none !important; } .gr-button.secondary { background: rgba(15,77,63,0.08) !important; color: var(--og-green) !important; box-shadow: none !important; } """ def build_ui(): with gr.Blocks( title="Overgrowth – a living digital environment", css=VINE_CSS, theme=gr.themes.Soft(primary_hue="green", neutral_hue="slate"), ) as demo: gr.HTML( """
Autonomous network reliability agent — parses changes, simulates risk, diagnoses drift, and self-heals with MCP.