feat(secretaria): Secretária IA separada por sessão (agente por número) #20
Reference in New Issue
Block a user
Delete Branch "feat/secretaria-por-sessao"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Separa a Secretária/nós/agenda por número de WhatsApp via
sec_numbers.agent_id(runtime resolve o agente pelo número que recebeu a mensagem; fallback = 1º agente ativo). Migração aditiva (agent_idem sec_numbers,instance_idem sec_calendar) + rotas admin. Testado em dev (newwhats.dev refrescado): agentes resolvidos por instância, fallback e FK ON DELETE SET NULL ok.Obs.: por partilharem o working tree do newwhats.local,
ext-api/routes.tsesecretaria/tools.tstambém trazem trabalho acumulado da integração do satélite.🤖 Generated with Claude Code
Atualização (06/jul) — inteligência da agenda + segurança
encaminhar_humano): não agenda, pede p/ aguardar.ext:message.transcriptionreliga no fluxoext:message.new(guardhadCaptionanti-duplicação).GET/POST /secretaria/power(kill-switchauto_reply, efeito imediato, sem restart).sec_calendar(agenda interna/de teste) no prompt quando há agenda real.Commits novos:
eca65bf,9b4280c.O `update` do `chat.upsert` no MessageHandler passava `contactId: contact.id` escalar, que o Prisma rejeita ("Unknown argument `contactId`. Did you mean `contact`?") → PrismaClientValidationError. Isso derrubava o processMessage ANTES de emitir o hook ext:message.new, quebrando o tempo real (inclusive o auto-trigger da Secretária IA) para qualquer contato cujo chat precisasse revincular o contato. Corrigido nos dois upserts (notify + histórico) para a sintaxe de relação `contact: { connect: { id: contact.id } }`. Verificado em dev: a Secretária respondeu ponta-a-ponta após o fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>Encaixe que quebra o espaçamento de 1h (ex.: 09:45): a IA usa perguntar_dentista → resolve o WhatsApp do dentista (bridge /dentista-contato), registra sec_agenda_approvals (aguardando) e manda a pergunta ao dentista ("consegue encaixar às X? SIM/NÃO", via hook ext:agenda.notify-dentist). Quando o dentista responde, ext:message.new detecta (roda mesmo com auto_reply off), interpreta sim/não; se SIM agenda (/book) e avisa o paciente automaticamente ("o Dr confirmou, agendei às X"); se NÃO oferece outro horário. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>