frontend/src/
├── api/ Funções de chamada HTTP (uma por domínio)
├── components/ Componentes Vue reutilizáveis
│ ├── base/ Design system: BaseButton, BaseBadge, BaseModal
│ └── skeletons/ Skeletons de carregamento
├── composables/ Estado e lógica reutilizável (useAuth, useChat, etc.)
├── docs/ Documentação do frontend
├── layout/ Layouts de página (LayoutSistema.vue)
├── router/ Configuração do Vue Router
├── styles/ CSS global e variáveis de tema
├── utils/ Utilitários genéricos
└── views/ Páginas da aplicação
├── auth/ LoginView
├── configuracoes/
├── conversas/ ConversasHistoricoView, ConversasPesquisarView
├── pagina-inicial/
└── usuarios/
O Vue Router está configurado em src/router/index.js. Todas as rotas autenticadas usam o meta requiresAuth: true, e a rota de login usa guestOnly: true.
| Rota | Nome | Componente | Acesso |
|---|---|---|---|
/login |
login |
LoginView |
Apenas não autenticados |
/ |
home |
PaginaInicialView |
Autenticados |
/conversas/historico |
conversas-historico |
ConversasHistoricoView |
Autenticados |
/conversas/pesquisar |
conversas-pesquisar |
ConversasPesquisarView |
Autenticados |
/configuracoes |
configuracoes |
ConfiguracoesView |
Autenticados |
/usuarios |
usuarios |
UsuariosView |
Admin (nivel "3") |
Guard de rota:
/login/login → redirecionado para //usuarios → redirecionado para /configuracoessrc/layout/LayoutSistema.vue é o layout padrão de todas as páginas autenticadas. Ele contém:
useChat para carregar e exibir as conversas na sidebarO frontend não usa Pinia. O estado é gerenciado por composables com padrão singleton:
useAuth — singleton via closure (session é um ref no escopo do módulo)useChat — singleton explícito (variável singleton no escopo do módulo)useSearch, useToast, useUsers — instâncias por componenteConsulte composables.md para detalhes de cada um.
Os arquivos em src/api/ encapsulam as chamadas HTTP. Todos usam o client.js (que faz fetch com injeção de token e refresh automático):
src/api/
├── client.js Cliente HTTP com interceptor de auth e refresh automático
├── auth.js loginRequest, logoutRequest, refreshTokenRequest
├── chat.js sendChat, sendChatStream, search, ingestDocuments,
│ ingestFile, ingestUrl, listDocuments, deleteDocumentsBySource
├── conversations.js listConversations, createConversation, ...
└── users.js listUsers, createUser, updateUser, toggleUserStatus
As funções de chat, busca, ingest e documentos vivem todas em
chat.js— não há arquivosdocuments.jsouingest.jsseparados. A função de ingest de texto éingestDocuments.
1. Ao montar o app, useAuth lê o token salvo em localStorage ou sessionStorage
2. O token é injetado no client.js via setAccessToken()
3. O wrapper de `fetch` em `client.js` captura respostas 401 e tenta refresh automático
4. Se o refresh falha, setAuthErrorCallback() é chamado → sessão limpa → redirect /login
5. O refresh proativo (scheduleProactiveRefresh) renova o token 60s antes de expirar
O tema é controlado pela classe .dark no elemento <html>. O componente BotaoAlterarTema.vue alterna entre os dois modos. Consulte style.md para o sistema de cores.