Vapora/assets/web/index.html
Jesús Pérez 765841b18f
Some checks failed
Documentation Lint & Validation / Markdown Linting (push) Has been cancelled
Documentation Lint & Validation / Validate mdBook Configuration (push) Has been cancelled
Documentation Lint & Validation / Content & Structure Validation (push) Has been cancelled
Documentation Lint & Validation / Lint & Validation Summary (push) Has been cancelled
mdBook Build & Deploy / Build mdBook (push) Has been cancelled
mdBook Build & Deploy / Documentation Quality Check (push) Has been cancelled
mdBook Build & Deploy / Deploy to GitHub Pages (push) Has been cancelled
mdBook Build & Deploy / Notification (push) Has been cancelled
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
feat(capabilities): add vapora-capabilities crate with in-process executor dispatch
- New vapora-capabilities crate: CapabilitySpec, Capability trait, CapabilityRegistry
     (parking_lot RwLock), CapabilityLoader (TOML overrides), 3 built-ins
     (code-reviewer, doc-generator, pr-monitor), 22 tests
   - Move AgentDefinition to vapora-shared to break capabilities↔agents circular dep
   - Wire system_prompt into AgentExecutor via LLMRouter.complete_with_budget
   - AgentCoordinator: in-process task dispatch via DashMap<String, Sender<TaskAssignment>>
   - server.rs: bootstrap CapabilityRegistry + LLMRouter from env, spawn executors per capability
   - Landing page: 620 tests, 21 crates, Capability Packages feature box
   - docs: capability-packages feature guide, ADR-0037, CHANGELOG, SUMMARY
   EOF
2026-02-26 16:43:28 +00:00

2 lines
31 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title data-en="Vapora - Intelligent Development Orchestration" data-es="Vapora - Orquestación Inteligente de Desarrollo" > Vapora </title><link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700;800&display=swap" rel="stylesheet" /><style>:root{--bg-primary:#0a0118;--bg-gradient-1:rgba(168,85,247,0.15);--bg-gradient-2:rgba(34,211,238,0.15);--bg-gradient-3:rgba(236,72,153,0.1);--text-primary:#ffffff;--text-secondary:#cbd5e1;--text-muted:#94a3b8;--text-dark:#64748b;--border-light:rgba(255,255,255,0.1);}html.light-mode{--bg-primary:#f9fafb;--bg-gradient-1:rgba(168,85,247,0.08);--bg-gradient-2:rgba(34,211,238,0.08);--bg-gradient-3:rgba(236,72,153,0.05);--text-primary:#1a1a1a;--text-secondary:#374151;--text-muted:#6b7280;--text-dark:#9ca3af;--border-light:rgba(0,0,0,0.1);}*{margin:0;padding:0;box-sizing:border-box;}body{font-family:"JetBrains Mono",monospace;background:var(--bg-primary);color:var(--text-primary);overflow-x:hidden;transition:background-color 0.3s ease,color 0.3s ease;}.gradient-bg{position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;background:radial-gradient( circle at 20% 50%,var(--bg-gradient-1) 0%,transparent 50% ),radial-gradient( circle at 80% 80%,var(--bg-gradient-2) 0%,transparent 50% ),radial-gradient( circle at 40% 90%,var(--bg-gradient-3) 0%,transparent 50% );transition:background 0.3s ease;}.language-toggle{position:fixed;top:2rem;right:2rem;z-index:100;display:flex;gap:0.5rem;background:rgba(255,255,255,0.05);border:1px solid rgba(34,211,238,0.3);border-radius:20px;padding:0.3rem 0.3rem;}.lang-btn{background:transparent;border:none;color:#94a3b8;padding:0.5rem 1rem;border-radius:18px;cursor:pointer;font-weight:700;font-size:0.85rem;text-transform:uppercase;transition:all 0.3s ease;font-family:"JetBrains Mono",monospace;}.lang-btn.active{background:linear-gradient(135deg,#22d3ee 0%,#a855f7 100%);color:#fff;}.lang-btn:hover{color:#22d3ee;}.theme-toggle{background:transparent;border:none;color:var(--text-primary);padding:0.5rem 1rem;border-radius:18px;cursor:pointer;font-weight:700;font-size:1.2rem;transition:all 0.3s ease;font-family:"JetBrains Mono",monospace;}.theme-toggle:hover{color:#22d3ee;}.container{max-width:1200px;margin:0 auto;padding:2rem;position:relative;}header{text-align:center;padding:5rem 0 4rem;animation:fadeInUp 0.8s ease-out;}@keyframes fadeInUp{from{opacity:0;transform:translateY(30px);}to{opacity:1;transform:translateY(0);}}.status-badge{display:inline-block;background:rgba(34,211,238,0.2);border:1px solid #22d3ee;color:#22d3ee;padding:0.5rem 1.5rem;border-radius:50px;font-size:0.85rem;font-weight:700;margin-bottom:1.5rem;}.logo-container{margin-bottom:2rem;text-align:center;}.logo-container img{max-width:440px;width:100%;height:auto;filter:drop-shadow(0 0 30px rgba(34,211,238,0.4));margin:0 auto;}.tagline{font-size:0.95rem;color:#22d3ee;font-weight:400;letter-spacing:0.1em;text-transform:uppercase;margin-bottom:1rem;}h1{font-size:2.8rem;font-weight:800;line-height:1.2;margin-bottom:1.5rem;background:linear-gradient( 135deg,#22d3ee 0%,#a855f7 50%,#ec4899 100% );-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.hero-subtitle{font-size:1.15rem;color:var(--text-secondary);max-width:800px;margin:0 auto 2rem;line-height:1.8;}.highlight{color:#22d3ee;font-weight:700;}.section{margin:4rem 0;animation:fadeInUp 0.8s ease-out;}.section-title{font-size:2rem;font-weight:800;margin-bottom:2rem;color:#22d3ee;text-align:center;}.section-title span{background:linear-gradient(135deg,#ec4899 0%,#a855f7 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.problems-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem;margin-top:2rem;}.problem-card{background:rgba(255,255,255,0.03);border:1px solid rgba(168,85,247,0.3);border-radius:12px;padding:2rem;transition:all 0.3s ease;position:relative;overflow:hidden;}.problem-card:hover{transform:translateY(-5px);background:rgba(255,255,255,0.05);border-color:rgba(34,211,238,0.5);}.problem-number{font-size:2rem;font-weight:800;background:linear-gradient(135deg,#22d3ee 0%,#a855f7 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;line-height:1;margin-bottom:0.5rem;}.problem-card h3{color:#ec4899;font-size:1.05rem;margin-bottom:0.7rem;font-weight:700;}.problem-card p{color:var(--text-secondary);font-size:0.9rem;line-height:1.6;}.tech-stack{display:flex;flex-wrap:wrap;gap:1rem;margin-top:2rem;justify-content:center;}.tech-badge{background:rgba(34,211,238,0.15);border:1px solid #22d3ee;padding:0.5rem 1rem;border-radius:20px;font-size:0.8rem;color:#22d3ee;font-weight:700;}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:2rem;margin-top:2rem;}.feature-box{background:linear-gradient( 135deg,rgba(34,211,238,0.1) 0%,rgba(168,85,247,0.1) 100% );border-radius:12px;padding:2rem;border-left:4px solid #22d3ee;transition:all 0.3s ease;}.feature-box:hover{background:linear-gradient( 135deg,rgba(34,211,238,0.15) 0%,rgba(168,85,247,0.15) 100% );transform:translateY(-3px);}.feature-icon{font-size:2.5rem;margin-bottom:1rem;}.feature-title{font-size:1.15rem;font-weight:700;color:#22d3ee;margin-bottom:0.7rem;}.feature-text{color:var(--text-secondary);font-size:0.95rem;line-height:1.7;}.agents-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:1rem;margin-top:2rem;}.agent-item{background:rgba(236,72,153,0.1);padding:1.2rem;border-radius:8px;font-size:0.9rem;border:1px solid rgba(236,72,153,0.3);transition:all 0.2s ease;text-align:center;}.agent-item:hover{background:rgba(236,72,153,0.15);transform:translateY(-2px);}.agent-name{color:#ec4899;font-weight:700;display:block;margin-bottom:0.3rem;}.agent-role{color:var(--text-muted);font-size:0.85rem;}.cta-section{text-align:center;margin:5rem 0 3rem;padding:4rem 2rem;background:linear-gradient( 135deg,rgba(34,211,238,0.1) 0%,rgba(236,72,153,0.1) 100% );border-radius:20px;border:1px solid rgba(168,85,247,0.3);}.cta-title{font-size:2rem;font-weight:800;margin-bottom:1rem;background:linear-gradient(135deg,#22d3ee 0%,#ec4899 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.cta-button{display:inline-block;background:linear-gradient( 135deg,#22d3ee 0%,#a855f7 50%,#ec4899 100% );color:#fff;padding:1.1rem 2.8rem;border-radius:50px;text-decoration:none;font-weight:800;font-size:1rem;transition:all 0.3s ease;box-shadow:0 10px 30px rgba(34,211,238,0.3);text-transform:uppercase;letter-spacing:0.05em;border:none;cursor:pointer;}.cta-button:hover{transform:translateY(-3px) scale(1.05);box-shadow:0 20px 50px rgba(34,211,238,0.5);}footer{text-align:center;padding:3rem 0 2rem;color:var(--text-dark);border-top:1px solid var(--border-light);margin-top:4rem;font-size:0.9rem;}footer p:first-child{font-weight:700;color:var(--text-muted);}footer p:last-child{margin-top:0.5rem;font-size:0.85rem;}.hidden{display:none;}@media (max-width:768px){h1{font-size:2rem;}.hero-subtitle{font-size:1rem;}.logo-container img{max-width:352px;}.section-title{font-size:1.6rem;}.cta-title{font-size:1.6rem;}.language-toggle{top:1rem;right:1rem;}}</style></head><body><div class="gradient-bg"></div><div class="language-toggle"><button class="lang-btn active" data-lang="en" onclick="switchLanguage('en')" > EN </button><button class="lang-btn" data-lang="es" onclick="switchLanguage('es')"> ES </button><button class="theme-toggle" onclick="toggleTheme()" title="Toggle light/dark mode" ><span id="theme-icon">🌙</span></button><a href="architecture-diagram.html" class="lang-btn" style=" background: rgba(34, 211, 238, 0.2); border: 1px solid rgba(34, 211, 238, 0.5); text-decoration: none; " data-en="🏗️ ARCHITECTURE" data-es="🏗️ ARQUITECTURA" >🏗️ ARCHITECTURE</a ></div><div class="container"><header><span class="status-badge" data-en="✅ v1.2.0 | 620 Tests | 100% Pass Rate" data-es="✅ v1.2.0 | 620 Tests | 100% Éxito" >✅ v1.2.0 | 620 Tests | 100% Pass Rate</span ><div class="logo-container"><img id="logo-dark" src="/vapora.svg" alt="Vapora - Development Orchestration" style="display: block;" /><img id="logo-light" src="/vapora_white.svg" alt="Vapora - Development Orchestration" style="display: none;" /></div><p class="tagline">Evaporate complexity</p><h1 data-en="Development Flows<br>When Teams and AI Orchestrate" data-es="El Desarrollo Fluye<br>Cuando los Equipos y la IA Orquestan" > Development Flows </h1><p class="hero-subtitle"><span class="highlight" data-en="Specialized agents" data-es="Agentes especializados" >Specialized agents </span ><span data-en=" orchestrate pipelines for design, implementation, testing, documentation and deployment. Agents learn from history and optimize costs automatically." data-es=" que orquestan pipelines para diseño, implementación, testing, documentación y deployment. Los agentes aprenden del historial y optimizan costos automáticamente." >orchestrate pipelines for design, implementation, testing, documentation and deployment. Agents learn from history and optimize costs automatically. </span><br><span><strong data-en="100% self-hosted." data-es="100% self-hosted." >100% self-hosted.</strong ></span></p></header><section class="section"><h2 class="section-title"><span data-en="The 4 Problems It Solves" data-es="Los 4 Problemas que Resuelve" >The 4 Problems It Solves</span ></h2><div class="problems-grid"><div class="problem-card"><div class="problem-number">01</div><h3 data-en="Context Switching" data-es="Cambio de Contexto"> Context Switching </h3><p data-en="Developers jump between tools constantly. Vapora unifies everything in one intelligent system where context flows." data-es="Los developers saltan constantemente entre herramientas. Vapora unifica todo en un sistema inteligente donde el contexto fluye." > Developers jump between tools constantly. Vapora unifies everything in one intelligent system where context flows. </p></div><div class="problem-card"><div class="problem-number">02</div><h3 data-en="Knowledge Fragmentation" data-es="Fragmentación de Conocimiento" > Knowledge Fragmentation </h3><p data-en="Decisions lost in threads, code scattered, docs unmaintained. RLM (Recursive Language Models) with hybrid search (BM25 + semantic) and chunking makes knowledge discoverable even in 100k+ token documents." data-es="Decisiones perdidas en threads, código disperso, docs desactualizadas. RLM (Recursive Language Models) con búsqueda híbrida (BM25 + semántica) y chunking hace el conocimiento visible incluso en documentos de 100k+ tokens." > Decisions lost in threads, code scattered, docs unmaintained. RLM (Recursive Language Models) with hybrid search (BM25 + semantic) and chunking makes knowledge discoverable even in 100k+ token documents. </p></div><div class="problem-card"><div class="problem-number">03</div><h3 data-en="Manual Coordination" data-es="Coordinación Manual"> Manual Coordination </h3><p data-en="Orchestrating code review, testing, documentation and deployment manually creates bottlenecks. Multi-agent workflows solve this." data-es="Orquestar manualmente code review, testing, documentación y deployment crea cuellos. Los workflows multi-agente lo resuelven." > Orchestrating code review, testing, documentation and deployment manually creates bottlenecks. Multi-agent workflows solve this. </p></div><div class="problem-card"><div class="problem-number">04</div><h3 data-en="Dev-Ops Friction" data-es="Fricción Dev-Ops"> Dev-Ops Friction </h3><p data-en="Handoffs between developers and operations lack visibility and context. Vapora maintains unified deployment readiness." data-es="Los handoffs entre developers y operaciones carecen de visibilidad y contexto. Vapora mantiene unificada la deployment readiness." > Handoffs between developers and operations lack visibility and context. Vapora maintains unified deployment readiness. </p></div></div></section><section class="section"><h2 class="section-title"><span data-en="How It Works" data-es="Cómo Funciona" >How It Works</span ></h2><div class="features-grid"><div class="feature-box"><div class="feature-icon">🤖</div><h3 class="feature-title" data-en="Specialized Agents" data-es="Agentes Especializados" > Specialized Agents </h3><p class="feature-text" data-en="71 tests verify agent orchestration, learning profiles, and task assignment. Agents track expertise per task type with 7-day recency bias (3× weight). Real SurrealDB persistence + NATS coordination." data-es="71 tests verifican orquestación de agentes, perfiles de aprendizaje y asignación de tareas. Agentes rastrean expertise por tipo de tarea con sesgo de recencia de 7 días (peso 3×). Persistencia real SurrealDB + coordinación NATS." > 71 tests verify agent orchestration, learning profiles, and task assignment. Agents track expertise per task type with 7-day recency bias (3× weight). Real SurrealDB persistence + NATS coordination. </p></div><div class="feature-box" style="border-left-color: #a855f7"><div class="feature-icon">🧠</div><h3 class="feature-title" style="color: #a855f7" data-en="Intelligent Orchestration" data-es="Orquestación Inteligente" > Intelligent Orchestration </h3><p class="feature-text" data-en="53 tests verify multi-provider routing (Claude, OpenAI, Gemini, Ollama), per-role budget limits, cost tracking, and automatic fallback chains. Swarm coordination with load-balanced assignment using success_rate / (1 + load) formula." data-es="53 tests verifican routing multi-proveedor (Claude, OpenAI, Gemini, Ollama), límites de presupuesto por rol, tracking de costos y cadenas automáticas de fallback. Coordinación swarm con asignación balanceada usando fórmula success_rate / (1 + load)." > 53 tests verify multi-provider routing (Claude, OpenAI, Gemini, Ollama), per-role budget limits, cost tracking, and automatic fallback chains. Swarm coordination with load-balanced assignment using success_rate / (1 + load) formula. </p></div><div class="feature-box" style="border-left-color: #ec4899"><div class="feature-icon">📚</div><h3 class="feature-title" style="color: #ec4899" data-en="Recursive Language Models (RLM)" data-es="Recursive Language Models (RLM)" > Recursive Language Models (RLM) </h3><p class="feature-text" data-en="Process 100k+ token documents without context limits. Hybrid search combines BM25 (keywords) + semantic embeddings via RRF fusion. Intelligent chunking (Fixed/Semantic/Code) with SurrealDB persistence. Perfect for large codebases and documentation." data-es="Procesa documentos de 100k+ tokens sin límites de contexto. Búsqueda híbrida combina BM25 (keywords) + embeddings semánticos via fusión RRF. Chunking inteligente (Fixed/Semantic/Code) con persistencia SurrealDB. Perfecto para grandes codebases y documentación." > Process 100k+ token documents without context limits. Hybrid search combines BM25 (keywords) + semantic embeddings via RRF fusion. Intelligent chunking (Fixed/Semantic/Code) with SurrealDB persistence. Perfect for large codebases and documentation. </p></div><div class="feature-box" style="border-left-color: #f59e0b"><div class="feature-icon">🔗</div><h3 class="feature-title" style="color: #f59e0b" data-en="Agent-to-Agent (A2A) Protocol" data-es="Protocolo Agent-to-Agent (A2A)" > Agent-to-Agent (A2A) Protocol </h3><p class="feature-text" data-en="Distributed agent coordination with task dispatch, status tracking, and result collection. Real SurrealDB persistence (no in-memory HashMap). NATS messaging for async completion. Exponential backoff retry with circuit breaker. 12 integration tests verify real behavior." data-es="Coordinación distribuida de agentes con despacho de tareas, seguimiento de estado y recolección de resultados. Persistencia real SurrealDB (sin HashMap en memoria). Mensajería NATS para completado asíncrono. Reintento con backoff exponencial y circuit breaker. 12 tests de integración verifican comportamiento real." > Distributed agent coordination with task dispatch, status tracking, and result collection. Real SurrealDB persistence (no in-memory HashMap). NATS messaging for async completion. Exponential backoff retry with circuit breaker. 12 integration tests verify real behavior. </p></div><div class="feature-box" style="border-left-color: #10b981"><div class="feature-icon">🕸️</div><h3 class="feature-title" style="color: #10b981" data-en="Knowledge Graph" data-es="Knowledge Graph" > Knowledge Graph </h3><p class="feature-text" data-en="Temporal execution history with causal relationships. Learning curves from daily windowed aggregations. Similarity search recommends solutions from past tasks. 20 tests verify graph persistence, learning profiles, and execution tracking." data-es="Historial de ejecución temporal con relaciones causales. Curvas de aprendizaje desde agregaciones diarias con ventana. Búsqueda de similitud recomienda soluciones de tareas pasadas. 20 tests verifican persistencia de grafo, perfiles de aprendizaje y tracking de ejecuciones." > Temporal execution history with causal relationships. Learning curves from daily windowed aggregations. Similarity search recommends solutions from past tasks. 20 tests verify graph persistence, learning profiles, and execution tracking. </p></div><div class="feature-box" style="border-left-color: #8b5cf6"><div class="feature-icon"></div><h3 class="feature-title" style="color: #8b5cf6" data-en="NATS JetStream" data-es="NATS JetStream" > NATS JetStream </h3><p class="feature-text" data-en="Reliable message delivery for agent coordination. JetStream streams for workflow events, task completion, and status updates. Graceful fallback when NATS unavailable. Background subscribers with DashMap for async result delivery." data-es="Entrega confiable de mensajes para coordinación de agentes. Streams JetStream para eventos de workflow, completado de tareas y actualizaciones de estado. Fallback graceful cuando NATS no disponible. Suscriptores en background con DashMap para entrega asíncrona de resultados." > Reliable message delivery for agent coordination. JetStream streams for workflow events, task completion, and status updates. Graceful fallback when NATS unavailable. Background subscribers with DashMap for async result delivery. </p></div><div class="feature-box" style="border-left-color: #06b6d4"><div class="feature-icon">🗄️</div><h3 class="feature-title" style="color: #06b6d4" data-en="SurrealDB" data-es="SurrealDB" > SurrealDB </h3><p class="feature-text" data-en="Multi-model database with graph capabilities. Multi-tenant scopes for workspace isolation. Native graph relations for Knowledge Graph. All queries use parameterized bindings for security. SCHEMAFULL tables with explicit indexes." data-es="Base de datos multi-modelo con capacidades de grafo. Scopes multi-tenant para aislamiento de workspace. Relaciones de grafo nativas para Knowledge Graph. Todas las queries usan bindings parametrizados por seguridad. Tablas SCHEMAFULL con índices explícitos." > Multi-model database with graph capabilities. Multi-tenant scopes for workspace isolation. Native graph relations for Knowledge Graph. All queries use parameterized bindings for security. SCHEMAFULL tables with explicit indexes. </p></div><div class="feature-box" style="border-left-color: #14b8a6"><div class="feature-icon">🔌</div><h3 class="feature-title" style="color: #14b8a6" data-en="Backend API & MCP Connectors" data-es="Backend API y Conectores MCP" > Backend API & MCP Connectors </h3><p class="feature-text" data-en="40+ REST endpoints (projects, tasks, agents, workflows, swarm). WebSocket real-time updates. MCP gateway for external tool integration and plugin system. Multi-tenant SurrealDB scopes. Prometheus metrics at /metrics. 161 tests verify API correctness." data-es="40+ endpoints REST (proyectos, tareas, agentes, workflows, swarm). Actualizaciones en tiempo real vía WebSocket. Gateway MCP para integración de herramientas externas y sistema de plugins. Scopes multi-tenant de SurrealDB. Métricas Prometheus en /metrics. 161 tests verifican corrección de API." > 40+ REST endpoints (projects, tasks, agents, workflows, swarm). WebSocket real-time updates. MCP gateway for external tool integration and plugin system. Multi-tenant SurrealDB scopes. Prometheus metrics at /metrics. 161 tests verify API correctness. </p></div><div class="feature-box" style="border-left-color: #22d3ee"><div class="feature-icon">☸️</div><h3 class="feature-title" style="color: #22d3ee" data-en="Cloud-Native & Self-Hosted" data-es="Cloud-Native y Self-Hosted" > Cloud-Native & Self-Hosted </h3><p class="feature-text" data-en="161 backend tests + K8s manifests with Kustomize overlays. Health checks, Prometheus metrics (/metrics endpoint), StatefulSets with anti-affinity. Local Docker Compose for development. Zero vendor lock-in." data-es="161 tests de backend + manifests K8s con overlays Kustomize. Health checks, métricas Prometheus (endpoint /metrics), StatefulSets con anti-affinity. Docker Compose local para desarrollo. Sin vendor lock-in." > 161 backend tests + K8s manifests with Kustomize overlays. Health checks, Prometheus metrics (/metrics endpoint), StatefulSets with anti-affinity. Local Docker Compose for development. Zero vendor lock-in. </p></div><div class="feature-box" style="border-left-color: #f97316"><div class="feature-icon"></div><h3 class="feature-title" style="color: #f97316" data-en="Autonomous Scheduling" data-es="Scheduling Autónomo" > Autonomous Scheduling </h3><p class="feature-text" data-en="Cron-triggered workflow execution with IANA timezone support via chrono-tz. Distributed fire-lock using SurrealDB conditional UPDATE prevents double-fires across multi-instance deployments — no external lock service required. 48 tests." data-es="Ejecución de workflows disparada por cron con soporte de timezone IANA via chrono-tz. Fire-lock distribuido usando UPDATE condicional de SurrealDB previene doble disparo en despliegues multi-instancia — sin servicio de lock externo. 48 tests." > Cron-triggered workflow execution with IANA timezone support via chrono-tz. Distributed fire-lock using SurrealDB conditional UPDATE prevents double-fires across multi-instance deployments — no external lock service required. 48 tests. </p></div><div class="feature-box" style="border-left-color: #d946ef"><div class="feature-icon">🔔</div><h3 class="feature-title" style="color: #d946ef" data-en="Webhook Notifications" data-es="Notificaciones Webhook" > Webhook Notifications </h3><p class="feature-text" data-en="Real-time alerts to Slack, Discord, and Telegram — no vendor SDKs. ${VAR} secret resolution is built into ChannelRegistry construction; tokens never reach the HTTP layer unresolved. Fire-and-forget hooks on task completion, proposal approval/rejection, and workflow lifecycle events." data-es="Alertas en tiempo real a Slack, Discord y Telegram — sin SDKs de vendor. Resolución de secretos ${VAR} integrada en la construcción de ChannelRegistry; los tokens nunca llegan sin resolver a la capa HTTP. Hooks fire-and-forget en completado de tareas, aprobación/rechazo de propuestas y eventos del ciclo de vida de workflows." > Real-time alerts to Slack, Discord, and Telegram — no vendor SDKs. ${VAR} secret resolution is built into ChannelRegistry construction; tokens never reach the HTTP layer unresolved. Fire-and-forget hooks on task completion, proposal approval/rejection, and workflow lifecycle events. </p></div><div class="feature-box" style="border-left-color: #6366f1"><div class="feature-icon">🧩</div><h3 class="feature-title" style="color: #6366f1" data-en="Capability Packages" data-es="Paquetes de Capacidades" > Capability Packages </h3><p class="feature-text" data-en="Domain-optimized agent bundles — system prompt, preferred LLM model, task types, and MCP tools pre-configured per role. Three built-ins (code-reviewer, doc-generator, pr-monitor) loaded at startup via CapabilityRegistry. TOML overrides let you swap model or prompt without code changes. In-process executor dispatch via DashMap channels — no NATS required for standalone mode. 22 tests." data-es="Bundles de agentes optimizados por dominio — system prompt, modelo LLM preferido, tipos de tarea y herramientas MCP preconfigurados por rol. Tres built-ins (code-reviewer, doc-generator, pr-monitor) cargados en startup via CapabilityRegistry. Overrides TOML permiten cambiar modelo o prompt sin cambios de código. Dispatch de executor en proceso via canales DashMap — sin NATS requerido en modo standalone. 22 tests." > Domain-optimized agent bundles — system prompt, preferred LLM model, task types, and MCP tools pre-configured per role. Three built-ins (code-reviewer, doc-generator, pr-monitor) loaded at startup via CapabilityRegistry. TOML overrides let you swap model or prompt without code changes. In-process executor dispatch via DashMap channels — no NATS required for standalone mode. 22 tests. </p></div></div></section><section class="section"><h2 class="section-title"><span data-en="Technology Stack" data-es="Stack Tecnológico" >Technology Stack</span ></h2><div class="tech-stack"><span class="tech-badge">Rust (21 crates)</span><span class="tech-badge">Axum REST API</span><span class="tech-badge">SurrealDB</span><span class="tech-badge">NATS JetStream</span><span class="tech-badge">Leptos WASM</span><span class="tech-badge">Kubernetes</span><span class="tech-badge">Prometheus</span><span class="tech-badge">Knowledge Graph</span><span class="tech-badge">RLM (Hybrid Search)</span><span class="tech-badge">A2A Protocol</span><span class="tech-badge">MCP Server</span><span class="tech-badge">chrono-tz (Cron)</span><span class="tech-badge">Webhook Channels</span><span class="tech-badge">Capability Packages</span></div></section><section class="section"><h2 class="section-title"><span data-en="Available Agents" data-es="Agentes Disponibles" >Available Agents</span ></h2><div class="agents-grid"><div class="agent-item"><span class="agent-name" data-en="Architect" data-es="Architect" >Architect</span ><span class="agent-role" data-en="System design" data-es="Diseño de sistemas" >System design</span ></div><div class="agent-item"><span class="agent-name" data-en="Developer" data-es="Developer" >Developer</span ><span class="agent-role" data-en="Code implementation" data-es="Implementación de código" >Code implementation</span ></div><div class="agent-item"><span class="agent-name" data-en="CodeReviewer" data-es="CodeReviewer" >CodeReviewer</span ><span class="agent-role" data-en="Quality assurance" data-es="Aseguramiento de calidad" >Quality assurance</span ></div><div class="agent-item"><span class="agent-name" data-en="Tester" data-es="Tester" >Tester</span ><span class="agent-role" data-en="Tests & benchmarks" data-es="Tests y benchmarks" >Tests & benchmarks</span ></div><div class="agent-item"><span class="agent-name" data-en="Documenter" data-es="Documenter" >Documenter</span ><span class="agent-role" data-en="Documentation" data-es="Documentación" >Documentation</span ></div><div class="agent-item"><span class="agent-name" data-en="Marketer" data-es="Marketer" >Marketer</span ><span class="agent-role" data-en="Marketing content" data-es="Contenido marketing" >Marketing content</span ></div><div class="agent-item"><span class="agent-name" data-en="Presenter" data-es="Presenter" >Presenter</span ><span class="agent-role" data-en="Presentations" data-es="Presentaciones" >Presentations</span ></div><div class="agent-item"><span class="agent-name" data-en="DevOps" data-es="DevOps" >DevOps</span ><span class="agent-role" data-en="CI/CD deployment" data-es="Despliegue CI/CD" >CI/CD deployment</span ></div><div class="agent-item"><span class="agent-name" data-en="Monitor" data-es="Monitor" >Monitor</span ><span class="agent-role" data-en="Health & alerting" data-es="Salud y alerting" >Health & alerting</span ></div><div class="agent-item"><span class="agent-name" data-en="Security" data-es="Security" >Security</span ><span class="agent-role" data-en="Audit & compliance" data-es="Auditoría y compliance" >Audit & compliance</span ></div><div class="agent-item"><span class="agent-name" data-en="ProjectManager" data-es="ProjectManager" >ProjectManager</span ><span class="agent-role" data-en="Roadmap tracking" data-es="Tracking de roadmap" >Roadmap tracking</span ></div><div class="agent-item"><span class="agent-name" data-en="DecisionMaker" data-es="DecisionMaker" >DecisionMaker</span ><span class="agent-role" data-en="Conflict resolution" data-es="Resolución de conflictos" >Conflict resolution</span ></div></div></section><div class="cta-section"><h2 class="cta-title" data-en="Ready for intelligent orchestration?" data-es="¿Listo para la orquestación inteligente?" > Ready for intelligent orchestration? </h2><p style="color: #94a3b8; margin-bottom: 2rem; font-size: 1.05rem" data-en="Built with Rust 🦀 | Open Source | Self-Hosted" data-es="Construido con Rust 🦀 | Open Source | Self-Hosted" > Built with Rust 🦀 | Open Source | Self-Hosted </p><a href="https://github.com/vapora-platform/vapora" class="cta-button" data-en="Explore on GitHub →" data-es="Explorar en GitHub →" >Explore on GitHub →</a ></div><footer><p data-en="Vapora v1.2.0" data-es="Vapora v1.2.0">Vapora v1.2.0</p><p data-en="Made with Vapora dreams and Rust reality ✨" data-es="Hecho con sueños Vapora y realidad Rust ✨" > Made with Vapora dreams and Rust reality ✨ </p><p style="margin-top: 1rem; font-size: 0.8rem" data-en="Intelligent Development Orchestration | Multi-Agent Multi-IA Platform" data-es="Orquestación Inteligente de Desarrollo | Plataforma Multi-Agente Multi-IA" > Intelligent Development Orchestration | Multi-Agent Multi-IA Platform </p></footer></div><script> const LANG_KEY = "vapora-lang";function getCurrentLanguage(){return localStorage.getItem(LANG_KEY)|| "en";}function switchLanguage(lang){localStorage.setItem(LANG_KEY,lang);document.querySelectorAll(".lang-btn").forEach((btn)=>{btn.classList.remove("active");if(btn.dataset.lang === lang){btn.classList.add("active");}});document.querySelectorAll("[data-en][data-es]").forEach((el)=>{const content = el.dataset[lang];if(el.tagName === "H1" || el.tagName === "H2" || el.tagName === "H3"){el.innerHTML = content;}else{el.textContent = content;}});document.documentElement.lang = lang;}document.addEventListener("DOMContentLoaded",()=>{const currentLang = getCurrentLanguage();switchLanguage(currentLang);const currentTheme = getTheme();setTheme(currentTheme);});const THEME_KEY = "vapora-theme";function getTheme(){return localStorage.getItem(THEME_KEY)|| "dark";}function setTheme(theme){localStorage.setItem(THEME_KEY,theme);const html = document.documentElement;const icon = document.getElementById("theme-icon");const logoDark = document.getElementById("logo-dark");const logoLight = document.getElementById("logo-light");if(theme === "light"){html.classList.add("light-mode");icon.textContent = "🌙";if(logoDark)logoDark.style.display = "none";if(logoLight)logoLight.style.display = "block";}else{html.classList.remove("light-mode");icon.textContent = "☀️";if(logoDark)logoDark.style.display = "block";if(logoLight)logoLight.style.display = "none";}}function toggleTheme(){const currentTheme = getTheme();const newTheme = currentTheme === "dark" ? "light" : "dark";setTheme(newTheme);}</script></body></html>