- Usa Store.load com caminho absoluto em C:\Raven\data quando possível; fallback para AppData
- Remove import de fs (plugin) e opção 'dir' não suportada pelo plugin-store v2
- main.tsx: resolveDataDir usa executableDir/data quando possível; se falhar, cai para appLocalDataDir
- tauri.conf.json: remove bloco windows.nsis inválido no schema v2 para build passar
Objetivo: instalar dados fora do AppData (ex.: C:\Raven\data) quando o diretório de instalação permitir escrita.
- src-tauri: adiciona comando open_devtools que chama window.open_devtools()
- frontend: listeners para F12/Ctrl+Shift+I e botão direito com Ctrl/Shift
Facilita depuração de UI no executável Tauri.
- tauri.conf.json: configura nsis (installMode perMachine, allowToChangeInstallDirectory, installDirName, createDesktopShortcut)
- main.tsx: Store.load agora usa appLocalDataDir (dados do app em AppData do usuário)
- README: documenta instalação Windows, dados em AppData e build leve (--bundles nsis)
- middleware: torna /machines/handshake público para permitir criação de sessão de máquina sem login prévio
- nav-user: oculta botão 'Encerrar sessão' quando a sessão é de máquina (role === 'machine')
Efeito: no app desktop (Tauri), o handshake passa a autenticar corretamente, o cabeçalho exibe nome/e-mail do colaborador/gestor e o portal permite abrir chamados.
Nota: em navegação web comum, 'Sair' permanece visível para usuários humanos.
- /tickets/[id], /tickets/resolved, /views, /play, /reports/*, /settings agora exigem sessão via requireAuthenticatedSession()
- Complementa o middleware e evita casos não-redirecionados em DEV/SSG
- Mantém /settings/templates com requireStaffSession() como já estava.
- Chama requireAuthenticatedSession() no page.tsx para redirecionar anônimos a /login
- Garante comportamento idêntico ao /dashboard quando acessado diretamente.
- Define dynamic="force-dynamic" no layout global para garantir que o middleware rode para todas as páginas
- Evita cache s-maxage de páginas protegidas (ex.: /tickets) que impedia redirect em anônimo.
- Chama requireAuthenticatedSession() em /dashboard para redirecionar anônimos a /login
- Evita página vazia quando aberto diretamente em janela anônima.
- Em /, decidir destino via getServerSession():
- Sem sessão: /login
- Staff: /dashboard
- Colaborador: /portal
- Evita depender do redirect client-side e garante comportamento correto em aba anônima.
- Simplifica AuthGuard para não redirecionar no cliente (gate feito no middleware)
- Adiciona skeleton de carregamento no AppShell enquanto
- Troca anchors por Next Link no sidebar para navegação client-side
Sem mudanças de schema/DB; apenas UX e roteamento no cliente.