diff --git a/projetos/newwhats.clube67.com/integracao-satelites.md b/projetos/newwhats.clube67.com/integracao-satelites.md index 3be1b7e..6ca9663 100644 --- a/projetos/newwhats.clube67.com/integracao-satelites.md +++ b/projetos/newwhats.clube67.com/integracao-satelites.md @@ -54,8 +54,26 @@ 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.)* +3. ✅ **Config/conexão** (auditado 28/jun/2026, satélite `mercado`@VPS3 ↔ motor dev + `newwhats_dev`). Resultado: + - **Satélite → Motor (ext-api/proxy/WS)** ✅ — `proxy.js` envia `x-nw-key` = + `integration_key` do satélite; o ext-api valida contra a tabela `apiKey`. A + chave do satélite (`nw_t…_001`, len 34) **é igual** à `apiKey` ativa do motor. + **Teste vivo:** `GET /api/ext/v1/sessions` com a chave → **200**; sem chave / + chave inválida → **401** (correto). + - **Webhook Motor → Satélite (HMAC)** ✅ — `ext_webhooks` do motor: url + `http://127.0.0.1:4001/api/webhook/newwhats`, eventos `[message.new, + session.status]`, ativo, `secret` (len 64) **igual** ao `webhook_secret` do + satélite. Assinatura `x-nw-signature: sha256=HMAC` (`webhook-dispatcher.ts`). + - **Topologia co-locada** (`127.0.0.1`): satélite espera motor em `:8008`; motor + espera satélite em `:4001`. Para teste vivo ponta-a-ponta o **satélite precisa + rodar co-locado com o motor dev** (hoje não está rodando na VPS4). + - ⚠️ **`/nw/*` (Motor → Satélite, Secretária)**: o satélite valida o `x-nw-key` + entrante contra `plugin_configs.integration_key` (`nw_t…_001`); o `PluginPair` + do motor usa outra chave (`nwk_…1039`, `lastSeenAt=null`). Se esse sentido for + usado, **reconciliar a chave** (não afeta a Fase 4, que é Satélite → Motor). + - ⚠️ `api_token` não existe em `plugin_configs` do satélite — não é necessário: o + ext-api autentica por `x-nw-key` (= `integration_key`), não por Bearer separado. 4. ⏳ **Conhecimento**: rodar `sync-knowledge` end-to-end (satélite → motor). 5. **Mover recursos para o motor** (genéricos a todos os satélites): - ✅ **Transcrição** (áudio→texto, imagem→descrição) já no motor via Gemini diff --git a/projetos/newwhats.clube67.com/tarefas.md b/projetos/newwhats.clube67.com/tarefas.md index 060dcee..0ea459f 100644 --- a/projetos/newwhats.clube67.com/tarefas.md +++ b/projetos/newwhats.clube67.com/tarefas.md @@ -17,9 +17,11 @@ ## Integração satélite ↔ motor (faseado) - [x] **Fase 1** — Contrato documentado (`integracao-satelites.md`). - [x] **Fase 2** — Compatibilidade de API: alias `GET /secretaria/numbers` no ext-api. -- [ ] **Fase 3** — Validar config/conexão (`newwhats_url`, `integration_key`, - `api_token`, `webhook_secret`) do satélite → motor (dev/prod) + HMAC do webhook. - _Bloqueado: requer credenciais reais._ +- [x] **Fase 3** — Config/conexão auditada: ext-api `x-nw-key` casa (satélite + `nw_t…_001` = `apiKey` do motor, teste vivo 200); webhook HMAC casa + (`secret` len 64, url `127.0.0.1:4001`, eventos ok). Topologia co-locada; + live ponta-a-ponta exige satélite rodando co-locado. ⚠️ `/nw/*` usa chave + diferente (`nwk_…1039`) — reconciliar se esse sentido for usado. - [ ] **Fase 4** — Rodar `sync-knowledge` end-to-end (satélite → motor) e validar RAG. _Bloqueado: requer satélite rodando + Fase 3._ - [ ] **Fase 5** — Satélite consumir `messages.transcription` do motor e **remover