docs(fase3): config/conexão satélite↔motor auditada (ext-api ok, webhook HMAC ok)

ext-api x-nw-key casa (satélite=apiKey motor, teste vivo 200); webhook secret/url/
eventos casam. Topologia co-locada (127.0.0.1); live e2e exige satélite rodando.
/nw/* usa chave diferente (PluginPair nwk_) — reconciliar se usado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-06-28 15:40:45 +02:00
parent 471a9d1259
commit 3aca8ac25e
2 changed files with 25 additions and 5 deletions
@@ -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
+5 -3
View File
@@ -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