Pular para conteúdo

Infraestrutura dos Servidores — apiclickup + engine gita-agents

Mapa único dos 2 servidores Node que rodam a operação da Gita: o que cada um faz, onde roda, suas rotas (estilo Swagger), env vars, integrações e armadilhas conhecidas.

Por que esse doc existe: durante o debug da automação reuniao-confirmada descobrimos na marra detalhes de infra que estavam só na cabeça/no código (URL errada de Chatwoot na env global, escopo de token Google, em qual server vivia cada rota). Este arquivo é a fonte única pra não repetir essa caça.

Fontes relacionadas (não duplicar — linkar): - Crons e jobs agendados: docs/automations/CRONS.md - Launchd local: docs/automations/LAUNCHD.md - Bridge Chatwoot ↔ UaZapi: docs/automations/CHATWOOT-UAZAPI-BRIDGE.md


Visão geral

apiclickup engine gita-agents
Nome do serviço (Easypanel) apiclickup engine-gita-agents
Repositório /Users/juniormaia/gita/server/ (este repo) /Users/juniormaia/Projetos/gita-agents/packages/engine/ (repo separado)
Stack Node.js + Express (JS puro) Node.js + Express (TypeScript, ESM)
Papel Automações de negócio + webhooks de produto (ClickUp, vendas, relatórios, LPs, render) Pipeline de agentes IA no WhatsApp (multi-tenant) + bridge Chatwoot
Tem agente IA conversacional? Não (gera conteúdo pontual via API Anthropic/Gemini) Sim — é o motor dos agentes de cliente
DB Supabase (compartilhado) Supabase (compartilhado) + Redis (fila/cache)
Admin panel /dashboard, /operacional/dashboard https://admin.gita.work (incl. /crons, /caixas)

Os dois compartilham o mesmo projeto Supabase e ambos falam com ClickUp, Google e Hotmart, mas com responsabilidades distintas: apiclickup é o backoffice da Gita; engine é a operação de WhatsApp dos clientes.

                         ┌─────────────────────────────────────────┐
   ClickUp webhooks ─────▶│  apiclickup (gita-webhook-server)        │
   Hotmart/Kiwify   ─────▶│  - automações de negócio                 │──▶ Anthropic / Gemini
   DocuSeal         ─────▶│  - relatórios, LPs, render, crons "gi"   │──▶ ClickUp / Drive / Sheets
   Cron (Easypanel) ─────▶│                                          │──▶ UaZapi (grupos)
                         └─────────────────────────────────────────┘
                                          │ Supabase
                                          ▼
                         ┌─────────────────────────────────────────┐
   WhatsApp (UaZapi)─────▶│  engine-gita-agents                      │
   Chatwoot         ─────▶│  - pipeline de agentes IA (multi-tenant) │──▶ Anthropic (via agente)
   automation rule  ─────▶│  - bridge Chatwoot↔UaZapi                │──▶ Google Calendar/Meet
                         │  - automação reuniao-confirmada          │──▶ Chatwoot API
                         └─────────────────────────────────────────┘

1. apiclickup (gita-webhook-server)

Servidor de automações de negócio. Entry: server/index.js. Cada automação é um módulo em server/automations/<nome>.js que registra suas próprias rotas (module.exports = (app) => { ... }).

1.1 Rotas (Swagger-style)

Saúde e debug

Método Rota O que faz
GET /health Healthcheck
POST /webhook/debug Eco de payload pra debug
GET /status Status agregado (router.js)
GET /audit, /audit/stats Auditoria de execuções
POST /crons/invalidate Invalida cache de config de crons
GET /dashboard Painel admin (token DASHBOARD_TOKEN)
GET /operacional/status, /operacional/dashboard Status operacional consolidado

ClickUp (geração de conteúdo + workflow de aprovação)

Método Rota O que faz
POST /webhook/clickup/gerar-com-ia Gera conteúdo via IA a partir de task (roteia agente por listId)
POST /webhook/clickup/em-alteracao Trata task movida pra "em alteração"
POST /webhook/clickup/pre-auditoria Pré-auditoria automática
POST /pre-auditoria/trigger/:taskId · GET /pre-auditoria/debug Trigger manual / debug
POST /webhook/clickup/aprovado Task aprovada internamente
POST /webhook/clickup/aprovacao-cliente Aprovação do cliente (gera link/contrato)
POST /webhook/clickup/revisao-interna Revisão interna
POST /webhook/clickup/cliente-autofill · GET .../status Autofill de dados de cliente
POST /webhook/clickup/boletim · /webhook/clickup/relatorio-cliente Dispara Boletim de Entregas por task

Vendas (webhooks de plataforma)

Método Rota O que faz
POST /webhook/hotmart/venda Venda Hotmart genérica (valida HOTMART_HOTTOK)
POST /webhook/hotmart/janaina-listboss Venda ListBoss (token próprio)
POST /webhook/kiwify/venda Venda Kiwify (raw body, valida KIWIFY_WEBHOOK_TOKEN)
POST /webhook/chatwoot/venda-realizada Trigger de venda via label no Chatwoot
POST /vendas/reconcile/run · GET /vendas/reconcile/status Reconciliação de vendas
GET /vendas/stats · /vendas/recentes Métricas de vendas

Onboarding e contratos (DocuSeal)

Método Rota O que faz
GET /onboarding/:taskId · POST /onboarding/:taskId Formulário de onboarding (submit → status "formulário recebido" + aviso #BackOffice)
GET /assinar/:taskId · /contrato/:taskId Fluxo de assinatura de contrato
POST /webhook/clickup/gerar-contrato · GET .../status Status "gerar contrato" → cria submissão DocuSeal
POST /webhook/clickup/enviar-contrato · GET .../status Status "enviar contrato" → envia link+PIX ao cliente (gated)
POST /webhook/clickup/cliente-ativo · GET .../status Status "ativos" → grupo + Drive + projeto PED (gated)
POST /webhook/docuseal/assinado Contrato assinado → posta contrato completo + auditoria (sem criar grupo/Drive)

Fluxo completo e setup: docs/pops/onboarding/fluxo-fechamento-cliente.md.

Janaina (produtos)

Método Rota O que faz
POST /webhook/janaina-ls-pro-pre Pré-cadastro LS Pro
POST /webhook/janaina-ls-pro-pesquisa Pesquisa LS Pro
POST /webhook/janaina-programa-aceleracao Programa de Aceleração

Base10 (área de membros)

Método Rota O que faz
POST /membros/base10/login Login membro
GET /membros/base10/verificar Verifica sessão (BASE10_SESSION_SECRET)
GET /membros/base10/download/:arquivo Download de material

Diagnóstico de cliente

Método Rota O que faz
POST /webhook/diagnostico Recebe diagnóstico
POST /webhook/diagnostico/resposta Resposta do diagnóstico
POST /diagnostico/sequencia/processar · GET .../status Sequência de follow-up

Instagram

Método Rota O que faz
GET /instagram/admin Painel de agendamento
GET/POST /instagram/posts Listar / criar posts
POST /instagram/publish-pending Publica pendentes
GET /instagram/scheduler/status Status do scheduler

Meta Ads

Método Rota O que faz
GET /meta-ads/relatorio · /meta-ads/relatorio/:accountId Relatório de performance
GET /meta-ads/contas Lista contas de anúncio

WhatsApp / grupos (UaZapi)

Método Rota O que faz
POST /webhook/whatsapp/grupos-clientes Curadoria de grupos de clientes
POST /grupos-clientes/curar · /grupos-clientes/curar-range Curadoria manual / por range
GET /grupos-clientes/health Health dos grupos
POST /webhook/whatsapp/claude-code-news · /claude-code-news/curar News Claude Code
POST /webhook/whatsapp/boletim · /webhook/whatsapp/relatorio-cliente Boletim via WhatsApp

Relatórios e crons "gi"

Método Rota O que faz
POST /reports/send-daily · GET /reports/cron-status Relatório diário
POST /cron/gi-apresentacao · GET .../status Cron Gi: apresentação
POST /cron/gi-resolved-watcher · GET .../status Cron Gi: watcher de resolvidas
POST /cron/gi-followup-revisao · GET .../status Cron Gi: follow-up de revisão
POST /cron/gi-briefing-matinal · GET .../status Cron Gi: briefing matinal
POST /cron/gi-alteracao-watcher · GET .../status Cron Gi: watcher de alterações
POST /cron/gi-backoffice-watcher · GET .../status Cron Gi: watcher de backoffice

Detalhe de agendamento e flags ENABLE_* de cada cron em CRONS.md.

Landing pages, render, Drive, diversos

Método Rota O que faz
GET /lp · /lp/:slug · static /lp/static Serve landing pages de cliente
POST /render · /render/carousel · /render/attach Render de criativos via Remotion (Puppeteer)
POST /drive/upload · /drive/upload-batch Upload pro Google Drive
GET/POST /vaga-domestica Form de vaga (RH)
POST /boletim/preview · /boletim/gerar (+ /relatorio-cliente/*) Boletim de Entregas (preview/gerar manual)

1.2 Env vars (nomes — sem valores)

Grupo Vars
Núcleo PORT, NODE_ENV, DEPLOY_COMMIT, BASE_URL, SERVER_URL
IA ANTHROPIC_API_KEY, GEMINI_API_KEY, OPENAI_API_KEY
ClickUp CLICKUP_TOKEN, CLICKUP_WORKSPACE_ID, RH_VAGAS_LIST_ID, PRE_AUDITORIA_CHANNEL_ID
Supabase SUPABASE_URL, SUPABASE_SERVICE_KEY, SUPABASE_SERVICE_ROLE_KEY
Google GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN, GOOGLE_DRIVE_PASTA_CLIENTES, GOOGLE_DRIVE_PASTA_RELATORIOS
Hotmart HOTMART_CLIENT_ID, HOTMART_CLIENT_SECRET, HOTMART_BASIC_TOKEN, HOTMART_HOTTOK, HOTMART_HOTTOK_JANAINA_LISTBOSS, HOTMART_HOTTOK_LS_JAN
Kiwify KIWIFY_WEBHOOK_TOKEN, KIWIFY_BASE10_PRODUCT_ID
DocuSeal DOCUSEAL_URL, DOCUSEAL_API_KEY, DOCUSEAL_TEMPLATE_ID
UaZapi UAZAPI_URL, UAZAPI_TOKEN, UAZAPI_TOKEN_GRUPOS, LISTBOSS_UAZAPI_TOKEN, WHATSAPP_TEST_GROUP_JID
Meta META_ACCESS_TOKEN, META_IG_TOKEN_GITA, META_IG_TOKEN_JUNIOR, META_IG_USER_ID_GITA, META_IG_USER_ID_JUNIOR
ManyChat MANYCHAT_BEARER, MANYCHAT_TAG_LS_JAN
Sheets (IDs) SHEET_ID, SHEET_NAME, INSTAGRAM_SHEET_ID, JANAINA_LEADS_SHEET_ID, JANAINA_LISTBOSS_SHEET_ID, JANAINA_PA_SHEET_ID, JANAINA_PA_SHEET_RANGE, JANAINA_PESQUISA_SHEET_ID
Acesso/segredos DASHBOARD_TOKEN, BASE10_SESSION_SECRET, BOLETIM_WHITELIST_PHONES, RELATORIO_WHITELIST_PHONES
Flags ENABLE_* ENABLE_SCHEDULED_REPORTS, ENABLE_GRUPOS_CURADORIA, ENABLE_INSTAGRAM_PUBLISHER, ENABLE_PRE_AUDITORIA, ENABLE_VENDAS_RECONCILE, ENABLE_DIAGNOSTICO_SEQUENCIA, ENABLE_GI_ALTERACAO_WATCHER, ENABLE_GI_BACKOFFICE_WATCHER, ENABLE_GI_BRIEFING_MATINAL, ENABLE_GI_FOLLOWUP_REVISAO, ENABLE_GI_RESOLVED_WATCHER
Render PUPPETEER_EXECUTABLE_PATH, DRY_RUN_APROVACAO_CLIENTE

1.3 Integrações (deps)

@anthropic-ai/sdk · @google/generative-ai · @supabase/supabase-js · puppeteer (render) · ws (WebSocket) · Google APIs (Drive/Sheets/Calendar via OAuth2) · ClickUp REST · Hotmart/Kiwify REST · DocuSeal · UaZapi · Meta Graph API.


2. engine gita-agents

Motor multi-tenant dos agentes IA de WhatsApp. Entry: packages/engine/src/index.ts. Config centralizada em src/config.ts (vars obrigatórias lançam erro no boot via required()).

⚠️ Repo separado — não está em /gita. Vive em /Users/juniormaia/Projetos/gita-agents/. PRs em github.com/administrador-ai-gita/gita-agents. Ver [[project_gita_agents_engine_location]].

2.1 Rotas (Swagger-style)

Saúde e operação

Método Rota O que faz
GET /health Healthcheck
GET /version Commit + build time + uptime (⚠️ ver armadilha DEPLOY_COMMIT)
GET /metrics Prometheus — agrega agent_logs + leads em tempo real
GET /status Status agregado
POST /crons/invalidate Invalida cache de config de crons
POST /test/followup-trigger Dispara follow-up manualmente (GITA_TEST_SECRET)

Pipeline de agentes (multi-tenant — :agentSlug)

Método Rota O que faz
POST /webhook/:channel/:agentSlug Rota principal — recebe msg do canal, roda o agente
POST /webhook/seed-lead/:agentSlug Injeta lead inicial pro agente
POST /webhook/clickup-task-comment/:agentSlug Comentário de task vira mensagem pro agente
POST /webhook/gita-sales/provisioning Provisiona nova instância de agente (GITA_SALES_WEBHOOK_SECRET)
POST /webhook/groups Mensagens de grupo

Chatwoot

Método Rota O que faz
POST /webhook/chatwoot/inbound-message Mensagem inbound do Chatwoot pro pipeline
POST /webhook/bridge/chatwoot/:accountId/:inboxId Bridge: Chatwoot → UaZapi (account 3 / inbox 75)
POST /webhook/bridge/uazapi/:bridgeId Bridge: UaZapi → Chatwoot
POST /webhook/reuniao-confirmada Automação reunião (tag → Google Meet → mensagem). Ver §2.4

2.2 Env vars (nomes — sem valores)

Grupo Vars
Núcleo PORT, REDIS_URL, DEPLOY_COMMIT, DEPLOY_BUILT_AT, ENGINE_INTERNAL_URL
Supabase SUPABASE_URL, SUPABASE_SERVICE_KEY (obrigatórias)
Chatwoot CHATWOOT_URL, CHATWOOT_PLATFORM_TOKEN (obrigatórias), CHATWOOT_ACCOUNT_TOKEN, CHATWOOT_ACCOUNT_URL
ClickUp CLICKUP_TOKEN, CLICKUP_WORKSPACE_ID, CLICKUP_CHANNEL_ID, CLICKUP_ALERTS_CHANNEL_ID, CLICKUP_ONBOARDING_LIST_ID
Google GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN
Reunião REUNIAO_AGENT_SLUG (default gita-conversao), REUNIAO_CALENDAR_ID (default [email protected])
IA OPENAI_API_KEY
Hotmart HOTMART_CLIENT_ID, HOTMART_CLIENT_SECRET, HOTMART_BASIC
UaZapi (Gita) GITA_UAZAPI_URL, GITA_UAZAPI_TOKEN
Segredos GITA_SALES_WEBHOOK_SECRET, GITA_TEST_SECRET
Flags ENABLE_* ENABLE_CHATWOOT_UAZAPI_BRIDGE, ENABLE_CLICKUP_CHAT_POLLER, ENABLE_FOLLOWUP_LOOP

2.3 Integrações (src/integrations/)

chatwoot/ (bridge + API de conta) · clickup/ · crm/ · gemini/ · google/ (calendar, OAuth2 e service_account) · openai/ · whatsapp/ (UaZapi) · hotmart.ts · redis.ts. Credencial Google de cada agente vive no provider_config da tabela ai_agents (Supabase), não nas envs.

2.4 Automação reuniao-confirmada (manual, sem IA)

Fluxo: a Tay preenche 2 custom attributes (data + hora) numa conversa do Chatwoot e marca a tag reuniao-confirmada → uma Automation Rule do Chatwoot chama POST /webhook/reuniao-confirmada → a engine cria evento no Google Calendar com Meet (30 min), convida o lead por e-mail e posta a copy+link na conversa.

  • Handler: packages/engine/src/webhooks/reuniao-confirmada.ts
  • Credencial Google: reusa o provider_config do agente gita-conversao (o global GOOGLE_REFRESH_TOKEN não tem escopo Calendar).
  • Posta via API de conta do Chatwoot (a conversa é WhatsApp nativo, account 1/inbox 78 — não passa pela bridge).
  • Detalhes completos, config real e histórico de PRs em [[project_automacao_reuniao_chatwoot]].

3. Armadilhas conhecidas (gotchas)

  1. CHATWOOT_URL global está com domínio errado (chatwoot.gita.work). O correto é atendimento.gita.work. A automação reuniao-confirmada usa env própria (CHATWOOT_ACCOUNT_URL) pra não depender da errada. Não confie na env global pra montar URL de API.
  2. /version mostra DEPLOY_COMMIT desatualizado na engine — a env não atualiza no build do Easypanel. Confie no comportamento em runtime, não no /version.
  3. Token Google global sem escopo Calendar → 403 ACCESS_TOKEN_SCOPE_INSUFFICIENT. Por isso a automação reusa a credencial de um agente que já agenda em prod.
  4. Bridge só existe pra account 3 / inbox 75. Conversas de account 1 (WhatsApp nativo) postam direto pela API do Chatwoot.
  5. Merge de PR antes do 2º push chegar deixa commit órfão (já aconteceu 3x). Confirmar "sem push pendente" antes de mergear.
  6. Crons têm 2 camadas de controle: flag ENABLE_<ID> na env (liga/desliga no deploy) + toggle em runtime no Supabase crons_config. Ambas precisam estar ligadas. Ver CRONS.md.
  7. @google/generative-ai está deprecado em favor de @google/genai — apiclickup ainda usa o antigo.

4. Como descobrir/atualizar este mapa

Pra regenerar as listas de rotas e envs quando algo mudar:

# apiclickup — rotas
cd server && grep -rEn "app\.(get|post|put|delete|patch)\(" --include="*.js" . | grep -v node_modules

# apiclickup — envs
cd server && grep -rohE "process\.env\.[A-Z_0-9]+" --include="*.js" . | grep -v node_modules | sort -u

# engine — rotas
cd ~/Projetos/gita-agents/packages/engine && grep -nE "app\.(get|post|put|delete|patch)\(" src/index.ts

# engine — envs
cd ~/Projetos/gita-agents/packages/engine && grep -rohE "process\.env\.[A-Z_0-9]+" src | sort -u

Mantenha este doc como fonte única da topologia dos 2 servers. Crons → CRONS.md. Bridge → CHATWOOT-UAZAPI-BRIDGE.md.


Atualizado em 2026-05-26. Atualizar quando rotas, envs ou serviços mudarem.