aboutsummaryrefslogtreecommitdiff
path: root/GEMINI.md
diff options
context:
space:
mode:
Diffstat (limited to 'GEMINI.md')
-rw-r--r--GEMINI.md35
1 files changed, 35 insertions, 0 deletions
diff --git a/GEMINI.md b/GEMINI.md
new file mode 100644
index 0000000..e2b6df7
--- /dev/null
+++ b/GEMINI.md
@@ -0,0 +1,35 @@
+# 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']`.