Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.0 KiB
newwhats.clube67.com — Ativação do WhatsApp (trajeto inteligente)
Estado atual + desenho do "trajeto" desejado. Meta: cada ativação de um WhatsApp cria e configura uma conta no motor de forma inteligente, com o plugin satélite atuando como braço inteligente do motor. Última revisão: 28/jun/2026.
Como funciona hoje (mínimo)
POST /api/instances/{ name }→ cria a instância (repo.create(tenantId, name)).POST /api/instances/:id/connect→manager.connectemite QR via Socket.IO.GET /api/instances/:id/qr→ QR em base64 (Dragonflyinstance:{id}:qr).- Pareamento de plugin (separado):
PairService(OTP por email →PluginPaircomintegration_key), valida o satélite viaverify(integration_key).
Limitação: a instância nasce "crua" (só name). Setor, secretária, webhook,
engine e detecção Business são passos manuais/dispersos.
Trajeto desejado (provisionamento guiado e idempotente)
Ao ativar um WhatsApp, o motor (orquestrado pelo satélite) deve executar, em ordem e idempotente (re-rodar não duplica):
- Conta/tenant — garantir tenant +
PluginPair(se ativação vem de satélite, usaintegration_key; senão cria pelo admin). - Instância — criar com
name,enginedefault (baileys7 = "API estável") e flags (isBusinessserá detectada no connect). - Conexão —
connect→ QR; ao conectar, detectar Conta Business e gravarisBusiness; avisar que trocar de API exige re-escanear QR. - Setor + Secretária default — criar setor padrão e um agente de Secretária base (persona/regras mínimas) já ligado à instância.
- Webhook — registrar o webhook do satélite (
webhook_secret/HMAC) p/message.newesession.status. - Conhecimento inicial — disparar
sync-knowledgedo satélite (Fase 4) para o RAG nascer populado. - Resumo — devolver ao operador o estado final (conectado, Business?, setor, secretária, webhook ok) — "trajeto" visível, não caixa-preta.
Papel do satélite (braço inteligente)
- O satélite não duplica o motor: ele dispara o trajeto, fornece dados do
negócio (
/nw/*,sync-knowledge) e consome inbox/secretária via proxy. - Toda configuração persiste no motor (fonte da verdade). O satélite guarda só
as chaves de conexão (
plugin_configs). - Qualquer passo novo do trajeto deve ser refletido nos dois lados (ver regra de registro bidirecional em integracao-satelites.md).
Implementado (28/jun/2026)
POST /api/instances/provision (auth, escopo tenant). Body:
{ name, engine?, webhookUrl?, sector?, connect? }. Idempotente (re-rodar não
duplica). Devolve { instance, trajeto[] } com cada passo visível:
instancia(criada/existente) — upsert por unique[tenantId, name].engine(definida/mantida) —baileys7(API estável) por padrão ao criar.setor(criado/existente) —ensureSector, default "Atendimento".webhook(configurado/inalterado/omitido).conexao(iniciada/pulada) — seconnect:true, emite QR via Socket.IO.business(pendente) — detectada ao conectar.secretaria/conhecimento(pendentes) — passos de plugin/satélite.
Validado em dev: 1ª chamada → 201 (cria, engine baileys7, setor); 2ª → 200 ("existente", sem duplicar). Artefatos de teste removidos.
Pendência restante
- Detecção Business no
connect(28/jun/2026) — no eventoopen,getBusinessProfile(selfJid)(fire-and-forget) defineInstance.isBusiness(true se o perfil tiver descrição/categoria/horário/etc.) e emiteinstance:business. SettingsPanel já exibe. Verificação ao vivo no próximo connect real (logs[Business] detecção concluída). - Secretária default automática (via plugin
secretaria). - Registro de webhook automatizado a partir do pair (preencher
webhookUrl). - Gatilho de
sync-knowledgeno fim do trajeto (satélite). - UI de onboarding consumindo
/provision+ exibindo o trajeto.