/** Metadados INFRA CODE — API, VM, código-fonte e pasta Spec por serviço (Spec 033). */ window.STACK_SERVICE_META = { 'vm112-onboard-api': { specFolder: 'specs/001-onboarding-webhooks/', apiPath: 'GET /api/onboarding/health', codePaths: ['deploy/vm112-wizard/', 'VM112 onboard API :8090'], probeCode: 'api/app/stack_health.py → vm112-onboard-api', validation: 'HTTP 200 no health do portal onboard', }, 'vm112-onboard-ui': { specFolder: 'specs/025-wizard-ui/', apiPath: 'GET https://onboard.ligbox.com.br/', codePaths: ['deploy/vm112-wizard/frontend/', 'CT114 Traefik router onboard'], probeCode: 'api/app/stack_health.py → vm112-onboard-ui', validation: 'Wizard público responde 200/301/302/403', }, 'vm112-carbonio': { specFolder: 'specs/022-carbonio-mail/', apiPath: 'GET https://10.10.10.112/', codePaths: ['VM112 Carbonio CE', 'deploy/carbonio/'], probeCode: 'api/app/stack_health.py → vm112-carbonio', validation: 'HTTPS Carbonio (TLS interno, verify=false)', }, 'vm112-domain-api': { specFolder: 'specs/017-vm112-domain-orchestration/', apiPath: 'GET /api/onboarding/health (proxy admin)', codePaths: ['deploy/vm112-wizard/', 'api/admin/domains'], probeCode: 'api/app/stack_health.py → vm112-domain-api', validation: 'API VM112 acessível — domínios via Spec 017', }, 'vm114-traefik': { specFolder: 'specs/026-traefik-edge/', apiPath: 'GET :8080/api/overview', codePaths: ['CT114 docker/traefik/', 'dynamic routers YAML'], probeCode: 'api/app/stack_health.py → vm114-traefik', validation: 'Traefik API responde (200/401/403)', }, 'vm114-desk-route': { specFolder: 'specs/026-traefik-edge/', apiPath: 'GET https://desk.ligbox.com.br/', codePaths: ['CT114 router desk.ligbox.com.br', 'VM122 frontend :8091'], probeCode: 'api/app/stack_health.py → vm114-desk-route', validation: 'Rota WAN Desk via Traefik', }, 'vm114-api-route': { specFolder: 'specs/027-desk-api-public/', apiPath: 'GET https://api.ops.ligbox.com.br/health', codePaths: ['CT114 router api.ops', 'VM122 api :8080'], probeCode: 'api/app/stack_health.py → vm114-api-route', validation: 'API pública Ops responde /health', }, 'vm122-desk-api': { specFolder: 'specs/003-desk-auth-rbac/', apiPath: 'GET /health · /api/v1/*', codePaths: ['projects/ops-desk/api/app/', 'docker ligbox-ops-platform_api'], probeCode: 'api/app/stack_health.py → vm122-desk-api', validation: 'FastAPI local :8080/health', }, 'vm122-desk-ui': { specFolder: 'specs/040-desk-design-system-v013/', apiPath: 'GET http://10.10.10.122:8091/', codePaths: ['projects/ops-desk/frontend/', 'assets/ligbox-ds.css', 'assets/user-wizard.js', 'assets/access-control-hub.js'], probeCode: 'api/app/stack_health.py → vm122-desk-ui', validation: 'Nginx frontend · footer v0.13.0 · Spec 040', }, 'vm122-governance-api': { specFolder: 'specs/040-desk-design-system-v013/', apiPath: 'POST /api/v1/governance/users/wizard · GET /governance/audit', codePaths: ['api/app/governance_routes.py', 'api/app/desk_governance_store.py'], probeCode: 'DS-API-002 governance_routes', validation: 'Wizard create user + audit log · Spec 040', }, 'vm122-ops-inbox-api': { specFolder: 'specs/041-desk-operational-feed/', apiPath: 'GET /api/v1/ops-inbox/stats · GET /events · POST /events/{id}/messages', codePaths: ['api/app/ops_inbox_routes.py', 'api/app/ops_inbox_store.py', 'assets/operational-feed.js'], probeCode: 'OF-API-002 ops_inbox_routes', validation: 'Central Operacional mock · Spec 041', }, 'vm122-redis': { specFolder: '—', apiPath: 'redis://redis:6379/0 PING', codePaths: ['docker-compose redis', 'api/app assist_store / cache'], probeCode: 'api/app/stack_health.py → _probe_redis', validation: 'PING OK no Redis do stack', }, 'vm122-webhook-soc': { specFolder: 'specs/001-onboarding-webhooks/', apiPath: 'GET /api/v1/integrations/health', codePaths: ['api/app/integration_health.py', 'api/app/assist_routes.py'], probeCode: 'infra_stack_routes.py enrich + integration_health', validation: 'Gap webhook VM112 + status integração', }, 'vm122-purge-auth': { specFolder: 'specs/032-purge-domain-extra-auth/', apiPath: 'GET/POST /api/v1/infra/purge-auth-*', codePaths: ['api/app/infra_stack_routes.py', 'api/app/purge_auth*'], probeCode: 'Módulo local Desk — sem probe HTTP externo', validation: 'Códigos purge Spec 032 · super_admin', }, 'vm122-email-relay': { specFolder: 'docs/postfix-vm122.md', apiPath: 'GET /api/v1/infra/email-relay/status · POST /test', codePaths: [ '/etc/postfix/main.cf (VM122 host)', '/etc/postfix/transport', 'api/app/email_relay.py', 'api/app/mail_notify.py', 'VM112 mail.ligbox.com.br (Carbonio relay)', ], probeCode: 'api/app/stack_health.py → vm122-email-relay', validation: 'Postfix VM122 · relayhost VM112 · ligbox-ops@ ligbox.com.br · convites Desk', }, 'vm123-foss': { specFolder: 'specs/024-fossbilling-odoo/', apiPath: 'GET http://10.10.10.123:8092/', codePaths: ['VM123 FOSSBilling container'], probeCode: 'api/app/stack_health.py → vm123-foss', validation: 'FOSSBilling UI responde', }, 'vm123-odoo': { specFolder: 'specs/024-fossbilling-odoo/', apiPath: 'GET :8069/web/login', codePaths: ['VM123 Odoo 16'], probeCode: 'api/app/stack_health.py → vm123-odoo', validation: 'Odoo login page responde', }, 'vm123-openpanel-ui': { specFolder: 'specs/028-openpanel-reengineering/', apiPath: 'GET https://openpanel.ligbox.com.br/', codePaths: ['VM123 OpenPanel CE', 'CT114 router'], probeCode: 'api/app/stack_health.py → vm123-openpanel-ui', validation: 'OpenPanel WAN via Traefik', }, 'vm123-openadmin': { specFolder: 'specs/024-fossbilling-odoo/', apiPath: 'GET https://admin.openpanel.ligbox.com.br/', codePaths: ['VM123 OpenAdmin'], probeCode: 'api/app/stack_health.py → vm123-openadmin', validation: 'OpenAdmin UI responde', }, 'vm123-openpanel-bridge': { specFolder: 'specs/028-openpanel-reengineering/', apiPath: 'GET :18087/api (Bearer bridge token)', codePaths: ['VM123 bridge service', 'api/app/vm123_routes.py'], probeCode: 'api/app/stack_health.py → _probe_openpanel_bridge', validation: 'Bridge API com OPENPANEL_BRIDGE_TOKEN', }, 'vm123-ops-console': { specFolder: 'specs/019-ops-console/', apiPath: 'GET :8100/health', codePaths: ['VM123 ops console service'], probeCode: 'api/app/stack_health.py → vm123-ops-console', validation: 'Health endpoint Ops Console', }, 'vm123-phpmyadmin': { specFolder: '—', apiPath: 'GET :8888/', codePaths: ['VM123 phpMyAdmin stack'], probeCode: 'api/app/stack_health.py → vm123-phpmyadmin', validation: 'phpMyAdmin HTTP responde', }, 'vm123-ollama': { specFolder: 'specs/029-agentic-ops/', apiPath: 'GET :11434/api/tags', codePaths: ['VM123 Ollama', 'api/app/agents*'], probeCode: 'api/app/stack_health.py → vm123-ollama', validation: 'Ollama API lista modelos', }, 'vm130-forgejo': { specFolder: 'specs/031-spec-hub-forgejo/', apiPath: 'GET :3000/', codePaths: ['CT130 Forgejo', '/opt/ligbox-spec-hub repos'], probeCode: 'api/app/stack_health.py → vm130-forgejo', validation: 'Forgejo Git UI responde', }, 'vm130-spec-portal': { specFolder: 'specs/031-spec-hub-forgejo/', apiPath: 'GET :8080/', codePaths: ['CT130 spec portal', 'obsidian-vault/'], probeCode: 'api/app/stack_health.py → vm130-spec-portal', validation: 'Spec portal LAN responde', }, 'vm130-spec-public': { specFolder: 'specs/031-spec-hub-forgejo/', apiPath: 'GET https://spec.ligbox.com.br/', codePaths: ['CT130 + Traefik WAN', 'spec.ligbox.com.br'], probeCode: 'api/app/stack_health.py → vm130-spec-public', validation: 'Spec Hub público via WAN', }, 'integrations-json': { specFolder: 'specs/001-onboarding-webhooks/', apiPath: 'GET /api/v1/integrations', codePaths: ['api/app/integration_health.py', 'webhook registry DB'], probeCode: 'renderInfra · integrations snapshot', validation: 'Registry onboard + Wazuh activo', }, };