diff --git a/projetos/newwhats.clube67.com/integracao-satelites.md b/projetos/newwhats.clube67.com/integracao-satelites.md new file mode 100644 index 0000000..0e28c5d --- /dev/null +++ b/projetos/newwhats.clube67.com/integracao-satelites.md @@ -0,0 +1,50 @@ +# newwhats.clube67.com — Contrato de integração Motor ↔ Satélite + +> O **motor** (newwhats) expõe a plataforma WhatsApp + Secretária IA; cada +> **satélite** (ex.: mercado.clube67.com / "Alemão Conveniências", plugin +> `newwhats` v2.1.0) consome o motor e fornece dados do seu negócio. +> Fonte da verdade do contrato (auditado em 28/jun/2026). + +## Config do satélite (plugin_configs, manifest `newwhats`) +`newwhats_url` (URL do motor) · `integration_key` (x-nw-key, rotas `/nw/*`) · +`api_token` (Bearer, envio de mensagens) · `webhook_secret` (HMAC do webhook). + +## Contrato A — Satélite → Motor (ext-api `/api/ext/v1/*`) +| Satélite chama | Motor (ext-api) | Status | +|---|---|---| +| `inbox`, `inbox/:chatId/messages`, `inbox/:chatId/send` | idem | ✅ | +| `media/:messageId` | `media/:messageId` | ✅ | +| `stream` (WS) | `stream` | ✅ | +| `secretaria/ask` | `secretaria/ask` (routes.ts) | ✅ | +| `secretaria/numbers` | **alias adicionado** → `sec_numbers` | ✅ (corrigido) | +| `secretaria/*` interno (`sync-knowledge`) | `/api/secretaria/*` (plugin) | ✅ | + +> Demais dados da Secretária no ext-api ficam sob `/sec/*` (`sec/agent`, +> `sec/nodes`, `sec/slots`, `sec/conversations`, `sec/keys`, `sec/handoff`). + +## Contrato B — Motor → Satélite +| Mecanismo | Satélite | Auth | +|---|---|---| +| Webhook `POST /api/webhook/newwhats` (`message.new`, `session.status`) | `webhook-receiver.js` | HMAC `webhook_secret` | +| Secretária consulta `/nw/*` (`/cliente`, `/clube`, `/parceiros`, `/promocoes`, `/sorteio`, `/vagas`, `/ping`) | `routes.js` | `integration_key` (timingSafeEqual) | + +## O que o satélite já faz (e poderia migrar ao motor) +- `media-transcribe.js`: transcrição de áudio + descrição de imagem via Gemini + (cache Redis, fallback Whisper). **Hoje só no satélite** → candidato a ir ao motor. +- `sync-knowledge.js`: monta o nó de conhecimento com dados reais e envia ao motor. +- `smart-router.js` (roteamento sem LLM), `personas.js`, `follow-up-detector.js`, + `context-builder.js` (contexto local do negócio). + +## Estado da sincronização (faseado) +1. ✅ **Contrato documentado** (este arquivo). +2. ✅ **Compatibilidade de API**: alias `GET /secretaria/numbers` no ext-api do + motor (retrocompatível) — fecha o gap do `webhook-receiver`. (commit motor) +3. ⏳ **Config/conexão**: validar `newwhats_url`/keys do satélite apontando para o + motor correto (dev/prod) e o HMAC do webhook. *(requer credenciais reais.)* +4. ⏳ **Conhecimento**: rodar `sync-knowledge` end-to-end (satélite → motor). +5. ⏳ **Mover recursos**: transcrição/memória para o motor (genéricos a todos os + satélites); satélite passa a só enviar contexto. Ver `secretaria-ia-evolucao.md`. + +## Inconsistência anotada +A transcrição no satélite usa `process.env.GEMINI_API_KEY`; o RAG/memória do motor +usa `cfg.gemini_key` (config do plugin). Unificar a fonte da chave ao migrar.