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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user