feat(secretaria): roteamento por especialidade, situações, dúvida→humano, imagem, checklist do dono e desligar global

Secretária IA mais segura e contextual:
- Roteamento por especialidade: /contexto (dentistas+especialidades) injetado no
  cérebro; descobrir o motivo e priorizar clínico geral só p/ avaliação/limpeza.
- Situações da clínica: regras editáveis injetadas no prompt (siga à risca).
- Dúvida/caso incerto → tool encaminhar_humano (não agenda; pede p/ aguardar).
- Imagem/áudio: ext:message.transcription religa no fluxo ext:message.new
  (guard hadCaption evita processar 2x); a IA reage à descrição da imagem.
- Checklist do dono × banco → cautelas no /contexto: NÃO assumir clínico geral
  por padrão p/ quem já é paciente; sem certeza de quem/qual dentista → humano.
- Desligar GLOBAL da Secretária: GET/POST /secretaria/power (kill-switch
  auto_reply via config.set, efeito imediato, sem restart; visível a todos).

Inclui a plumbing da sessão (chat.upsert, ownership de conexão, ws-bridge).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Deploy Agent
2026-07-06 15:40:26 +02:00
parent f9e93647bb
commit eca65bf765
16 changed files with 344 additions and 6 deletions
@@ -109,6 +109,9 @@ export function buildWsBridge(
{ hook: 'ext:session.status', wsEvent: 'session.status' },
{ hook: 'ext:message.new', wsEvent: 'message.new' },
{ hook: 'ext:message.update', wsEvent: 'message.update' },
{ hook: 'ext:message.reaction', wsEvent: 'message.reaction' },
{ hook: 'ext:message.media_ready', wsEvent: 'message.media_ready' },
{ hook: 'ext:message.transcription', wsEvent: 'message.transcription' },
{ hook: 'ext:presence', wsEvent: 'presence' },
{ hook: 'ext:handoff', wsEvent: 'conversation.handoff' },
{ hook: 'ext:escalated', wsEvent: 'conversation.escalated' },