feat(agents): widget de status na topbar (entrar/pausar/retomar/sair)
Achado real reportado pelo usuário: "não achei como deixar o agente
online, tem algum perfil ou tipo de usuario especifico?" — não era
permissão nenhuma. POST /agents/me/login|pause|resume|logout sempre
funcionaram sem exigir permissão (só JwtAuthGuard, resolvem "meu
agente" pelo userId do próprio token). O problema: nenhuma tela chamava
esses endpoints — só existia o CRUD admin de Agentes (criar o vínculo
usuário+ramal), nunca um controle pro próprio usuário logado.
Adicionado GET /agents/me (404 = usuário sem Agent neste tenant, não um
erro — é assim que o widget decide se aparece) e GET /agents/me/pause-
reasons (motivos de pausa sem exigir agents.view, que listaria TODOS os
agentes do tenant — permissão que o role "agent" nunca teve e não devia
ganhar só pra isso).
AgentStatusWidget na topbar (visível em qualquer página do app do
tenant) só aparece pra quem tem Agent vinculado: Offline -> Entrar ->
Disponível -> Pausar (escolhe motivo) -> Em pausa -> Retomar/Sair.
Achado real construindo o widget: as Server Actions de login/logout/
pause/resume exportadas como arrow function que só repassavam
argumentos quebravam em runtime ("Server Actions must be async
functions") — o mesmo bug já documentado antes nesta sessão (wizard de
campanhas). Corrigido declarando como async function de verdade.
Testado ponta a ponta com Playwright, logado como um agente de teste
real (usuário novo, role "agent", Agent vinculado a um ramal real): o
fluxo completo (entrar/pausar/retomar/sair) funciona pela tela, sem
nenhuma chamada de API manual.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -151,3 +151,29 @@ campo real é `CC-Agent-State`. Os `CC-Action` reais observados no teste
|
||||
`CC-Cause`/`CC-Cancel-Reason` e timestamps de entrada/saída — abandono vs.
|
||||
atendida), `members-count` (contagem ao vivo de chamadas esperando por
|
||||
fila). Ver `packages/telephony/src/normalize-event.ts`.
|
||||
|
||||
## Widget de status na topbar (PHASE 62)
|
||||
|
||||
Achado real reportado pelo usuário: "não achei como deixar o agente
|
||||
online, tem algum perfil ou tipo de usuário específico?" — não era
|
||||
permissão nenhuma: `POST /agents/me/login|pause|resume|logout`
|
||||
(`apps/api/src/agents/agents-me.controller.ts`) sempre funcionaram sem
|
||||
exigir permissão nenhuma (só `JwtAuthGuard`, resolvem "meu agente" via
|
||||
`userId` do próprio token — nunca aceitam um `agentId` do client). O
|
||||
problema era que NENHUMA tela chamava esses endpoints — só existia o CRUD
|
||||
admin de Agentes (criar o vínculo usuário+ramal em Call Center >
|
||||
Agentes).
|
||||
|
||||
Adicionado `GET /agents/me` (404 = usuário sem Agent neste tenant, não um
|
||||
erro) e `GET /agents/me/pause-reasons` (motivos de pausa sem exigir
|
||||
`agents.view`, que listaria TODOS os agentes do tenant — permissão que o
|
||||
role "agent" nunca teve e não devia ganhar só pra isso). `AgentStatusWidget`
|
||||
na topbar (visível em qualquer página do app do tenant, `apps/app/layout.tsx`
|
||||
busca `/agents/me` uma vez por request) só aparece pra quem tem Agent
|
||||
vinculado: Offline → "Entrar" → Disponível → "Pausar" (escolhe motivo) →
|
||||
Em pausa → "Retomar"/"Sair".
|
||||
|
||||
Testado ponta a ponta com Playwright, logado como um agente de teste
|
||||
real (usuário novo, role "agent", Agent vinculado a um ramal real): o
|
||||
fluxo completo (entrar/pausar/retomar/sair) funciona pela tela, sem
|
||||
nenhuma chamada de API manual.
|
||||
|
||||
Reference in New Issue
Block a user