Commit Graph

12 Commits

Author SHA1 Message Date
VPS 4 Deploy Agent 9bbfe498e2 feat(secretaria): assina as respostas da IA com "*Nome:*" em negrito
A Secretária passa a prefixar cada resposta enviada com o PRIMEIRO nome do
agente em negrito (ex.: "Ana — Atendente Virtual" → "*Ana:*\n<resposta>"),
igual à assinatura do operador humano — identifica a IA na caixa compartilhada
e é por-sessão (número com agente "Ana Clínica A" assina "*Ana:*"). Aplicado no
envio e no corpo persistido, nos dois caminhos (auto-reply e painel /ask).

Testado em dev: a Ana respondeu no WhatsApp com "*Ana:*" em negrito.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 00:19:30 +02:00
VPS 4 Deploy Agent 213990d51f feat(secretaria): Secretária IA separada por sessão (agente por número)
Núcleo desta mudança (separação por sessão):
- migrate.ts: sec_numbers.agent_id (FK→sec_agents, ON DELETE SET NULL) e
  sec_calendar.instance_id, com índices (aditivo/idempotente).
- ext-api routes.ts: runtime resolve o agente pelo NÚMERO que recebeu a
  mensagem (sec_numbers[instanceId].agent_id, fallback: 1º ativo); rotas
  admin /secretaria/numbers e /secretaria/calendar aceitam os novos campos.
- brain.ts/tools.ts: instanceId no contexto; sec_calendar interno filtrado
  por sessão; parse de jid robusto (.pop(), suporta 2 e 3 partes).
- secretaria/routes.ts: paridade (agent_id em numbers, instance_id no calendar).

Testado em dev (newwhats.dev refrescado): agentes resolvidos por instância;
fallback e FK ON DELETE SET NULL verificados via ext-api.

Obs.: por estarem no mesmo working tree não-commitado do newwhats.local,
ext-api/routes.ts e secretaria/tools.ts também trazem o trabalho acumulado
da integração do satélite (ações de inbox: delete/react/typing/labels/forward
e admin /secretaria/*; tools identificar_numero/cadastrar_paciente do odonto).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 19:51:25 +02:00
VPS 4 Deploy Agent 2c8eb41b7d feat(ext-api): storage Wasabi de mídia — thumbnails + flag de recuperabilidade
- re-download persiste a mídia no Wasabi e gera thumbnail <url>.thumb.webp (sharp)
- GET /inbox/:chatId/messages expõe mediaRecoverable = url|path|payload presente
- ws-bridge: encaminha hook ext:presence

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 19:05:50 +02:00
VPS 4 Deploy Agent 1702235c59 feat(ext-api): auto-provisionamento de conta + reconexão de sessão
- POST /satellites/accounts (ensureAccount): cria/reativa User por email, idempotente;
  gate aceita chave MESTRA ou chave de satélite (nwk_) válida — o satélite espelha
  suas próprias contas (scoreodonto)
- POST /sessions/:id/connect (reconectar/re-scan) e /sessions/:id/disconnect
  (encerrar sem remover) — antes o satélite recebia 404 no botão Conectar
- inclui proxy/re-download de mídia (/media/:id/download) da integração satélite

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 23:27:35 +02:00
VPS 4 Deploy Agent 6d9850d8d3 feat(secretaria): monitor de cota dos providers + notificação ao admin
- brain: detecta 429/cota (quota/billing/insufficient/exceeded/limite da api/
  rate limit — inclui a msg PT do Gemini) e emite ext:provider.exhausted por
  provider da chain (throttle de 6h por provider), com fallback informado.
- routes: handler ext:provider.exhausted monta notificação profissional e envia
  por WhatsApp ao admin (admin_notify_phone da config secretaria), resolvendo o
  JID canônico via onWhatsApp (trata 9º dígito BR; pula se número não existe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 07:49:00 +02:00
VPS 4 Deploy Agent b4d43fc3d6 feat(secretaria): modelo de canal (clinica_id) + auto-reply 1:1 com nome legível
- sec_numbers ganha clinica_id (mapa canal→clínica); migrate idempotente.
- clinica_id resolvido por CANAL no auto-reply (sec_numbers pela instância que
  recebeu) e por-REQUISIÇÃO no chat manual (header x-nw-clinica); brain.chat
  aceita opts.clinicaId e escopa a ponte de agenda (fallback: config global).
- /secretaria/numbers CRUD inclui clinica_id.
- auto-reply só cria conversa para 1:1 (@s.whatsapp.net) — exclui grupos/
  broadcast/newsletter/lid; contact_name legível (Contact → +telefone → jid).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 05:20:28 +02:00
VPS 4 Deploy Agent 9dbdd359ce feat(ext-api): API REST /secretaria/* (agents/nodes/calendar/numbers/conversations)
Expõe o contrato de administração esperado pelo painel da Secretária no satélite
(antes só havia /secretaria/ask|numbers + /sec/* parcial → 404 em agents/calendar):
- agents: GET/POST/PUT/DELETE
- brain nodes: GET/POST por agente (/agents/:agentId/nodes) + PUT/DELETE (/nodes/:id)
- calendar: GET/POST/PUT/DELETE
- numbers: POST/PUT/DELETE (GET já existia)
- conversations (teste): list/create/patch/delete, /messages, /chat (brain.chat),
  /finalize (brain.finalizeProtocol)
Backed pelas tabelas sec_* (globais/single-tenant no motor).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 04:59:43 +02:00
VPS 4 Deploy Agent 28b9ba899c feat(secretaria): kill-switch do auto-reply (secretaria.auto_reply=false)
Bloqueia SÓ o disparo automático da Secretária (envios manuais seguem normais).
Só desliga quando a config é explicitamente false — sem a flag, inalterado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 00:51:47 +02:00
VPS 4 Deploy Agent a1eec8dac2 feat(ext-api): inbox ordenado, avatar self-heal, /sec/keys e guard de grupo
- GET /inbox: orderBy lastMessageAt DESC NULLS LAST (Postgres põe NULLS FIRST
  em DESC → chats-stub sem mensagem tomavam o topo; parecia lista de contatos).
- GET /contacts/:jid/avatar/refresh: re-busca a foto pela conexão Baileys viva
  (URLs do CDN expiram/404), com timeout de 5s e limpeza da URL obsoleta.
- GET/PUT /sec/keys: passam a ler/gravar na config do plugin 'secretaria'
  (config é por-plugin: set(pluginName, obj)); antes gravava em plugin errado
  e o brain nunca via as chaves. Corrige TS2345.
- auto-reply da Secretária: nunca responde em grupos (@g.us).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 20:55:22 +02:00
VPS 4 Deploy Agent 62ba985ebe fix(ext-api): /secretaria/ask usa chat.jid (não remoteJid inexistente)
prisma.chat.findFirst filtrava por remoteJid, que não existe no model Chat (é jid)
→ 500 em todo /secretaria/ask. Corrigido; endpoint retorna o reply normalmente.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 16:53:13 +02:00
VPS 4 Deploy Agent 734b250238 feat(ext-api): alias GET /secretaria/numbers (sincroniza contrato com satélite)
O satélite (mercado, webhook-receiver) chama /api/ext/v1/secretaria/numbers, mas
o ext-api só tinha /sec/*. Adiciona o alias que espelha a rota interna
/api/secretaria/numbers (lista sec_numbers) — retrocompatível, não altera o satélite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:27:41 +02:00
VPS 4 Deploy Agent 2f8c04a0a7 chore(ops): restore all source files in newwhats.clube67.com
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
2026-05-18 03:28:29 +02:00