# Histórico de Contexto (Sessão Atual) Este arquivo documenta as regras de negócio, correções e funcionalidades implementadas na última sessão, para que futuros agentes saibam exatamente o que foi feito no projeto (Helpdesk). ## 1. Regras de Negócio e UX (Interface) - **Chat em Tempo Real**: - Implementado Server-Sent Events (SSE) para atualização em tempo real de novos chamados, mudança de status e novas mensagens no chat. - O `EventSource` no frontend envia o token de autenticação via *query string* (`?token=...`), e o backend (`auth.plugin.ts`) foi ajustado para validar esse token com o `@fastify/jwt` adequadamente. - **Nomes Reais no Chat**: As mensagens na interface não exibem mais os placeholders "Agente #1". Elas mostram o nome real do autor da mensagem, baseado nos dados do banco (tabela `users`). - **Dashboard e Cache**: - Havia um bug onde o Dashboard não atualizava em tempo real porque o cache nativo do navegador para o `fetch` estava devolvendo respostas oxidadas. - Isso foi resolvido adicionando `cache: 'no-store'` no cliente HTTP base em `web/src/lib/api.ts`. ## 2. Permissões e Visibilidade (Requesters vs Agents/Admins) - **Zona de Perigo e Alteração de Status**: - Solicitantes (`requesters`) NÃO veem a aba para alterar o status do chamado e NÃO veem a "Zona de Perigo" (deletar chamados). - A opção de alterar o status de um chamado só aparece se o chamado já tiver um `assigneeId` (já tiver sido assumido por um agente). - **Bloqueio de Chat**: - Existe uma configuração de sistema (`system_settings.allowRequesterChat`) que pode ser alterada na aba de Configurações por admins. - Se estiver desativada, a caixa de "Adicionar Resposta" fica escondida para os usuários com a role `requester`. - Se o chamado for fechado ou resolvido, também ocorre um bloqueio automático no chat para os solicitantes. ## 3. Notas Internas no Chat - **Segurança Reforçada**: - Agentes podem enviar mensagens como "Notas Internas". - A rota `GET /tickets/:id/comments` (`listCommentsHandler`) filtra comentários onde `isInternal === true` caso quem esteja fazendo a requisição seja um `requester`. Dessa forma, o backend jamais envia dados restritos para quem não deveria ver. - Para que a comunicação funcione da equipe para o solicitante com o chat bloqueado, os agentes devem enviar suas mensagens com a opção "Nota Interna" **desmarcada**. Assim ela será classificada como pública e repassada via SSE ao solicitante. --- **Nota para futuros agentes**: Qualquer alteração na comunicação entre a API e o React Query precisa respeitar as tags de invalidação configuradas no webhook SSE (`useTicketEvents.ts`). Não use cache agressivo no frontend com o React Query, pois o SSE já gerencia a invalidação ativa de chaves como `['tickets']` e `['stats']`.