fix(web): gate staff-only Convex queries to avoid RBAC errors on dashboard and tickets; docs: add desktop agent history and troubleshooting

This commit is contained in:
Esdras Renan 2025-10-10 01:11:03 -03:00
parent 7685370c05
commit ab820ddeca
11 changed files with 144 additions and 33 deletions

View file

@ -0,0 +1,100 @@
# Histórico — Agente Desktop (Tauri) — 2025-10-10
> Registro consolidado do que foi feito no app desktop, problemas encontrados, diagnósticos e próximos passos. Complementa `docs/plano-app-desktop-maquinas.md` e `apps/desktop/README.md`.
## Resumo do que mudou
- UI mais "shadcn-like" sem Tailwind (apenas CSS): tema claro forçado, card com sombras suaves, labels fortes, helper text opcional e estados de foco com ring.
- Campo "Código de provisionamento" com botão de visibilidade (olhinho) sem dependências extras.
- Cards de inventário na visão inicial (CPU, Memória, Sistema e Discos) e grid simplificada.
- Feedback de erro aprimorado no registro: exibe status HTTP e detalhes retornados pelo servidor.
- Botão "Abrir sistema" passou a abrir o navegador padrão (plugin opener) em vez de navegar dentro da WebView.
- Corrigidas permissões do plugin Store no Tauri v2 (antes: `store.load not allowed`).
## Arquivos alterados
- `apps/desktop/index.html:1`
- Força tema claro com `<meta name="color-scheme" content="light">` e estrutura do card.
- `apps/desktop/src/styles.css:1`
- Estilos do card, inputs, input-group, ícones, tabs e summary cards (visual shadcn-like sem Tailwind). Remove dark overrides.
- `apps/desktop/src/main.ts:3`
- Importa `openUrl` do plugin opener e usa para abrir o handshake no navegador padrão.
- `apps/desktop/src/main.ts:640`
- Tratamento de erros no registro com exibição de `status` e `details` quando o servidor retorna JSON/texto.
- `apps/desktop/src/main.ts:694`
- Função `redirectToApp` para abrir `APP_URL/machines/handshake?token=...` via `openUrl`, com fallback para `window.location.replace`.
- `apps/desktop/src-tauri/capabilities/default.json:1`
- Adicionadas permissões: `store:default`, `store:allow-load`, `store:allow-get`, `store:allow-set`, `store:allow-save`, `store:allow-delete` e `opener:default`.
## Como rodar (Windows, dev)
1) Garantir `.env` do desktop em `apps/desktop/.env`:
```
VITE_APP_URL=https://tickets.esdrasrenan.com.br
VITE_API_BASE_URL=https://tickets.esdrasrenan.com.br
```
2) Rodar dev:
```
cd apps\desktop
pnpm tauri dev
```
3) Provisionar:
- Usar o botão de olho para conferir o segredo, sem espaços.
- Deixar `Tenant` e `Empresa (slug)` vazios para o primeiro teste.
- Ao concluir, o app abre o navegador em `/machines/handshake?token=...`.
Referências úteis:
- Defaults/URLs do app: `apps/desktop/src/main.ts:75`
- Handshake na web: `src/app/machines/handshake/route.ts:1`
- Endpoint de registro: `src/app/api/machines/register/route.ts:1`
## Diagnósticos e soluções aplicadas
- Erro na Store (Tauri v2):
- Sintoma: `store.load not allowed` nos logs do DevTools.
- Causa: permissões do plugin Store ausentes.
- Ação: adicionar permissões em `apps/desktop/src-tauri/capabilities/default.json:1`.
- Erro 500 durante registro com empresa:
- Mensagem: `ConvexError: Empresa não encontrada para o tenant informado`.
- Causa: slug inválido em `Empresa (slug)`.
- Ação: validar com slug correto (Admin > Empresas & Clientes) ou registrar sem empresa.
- Observação: hoje o endpoint mapeia como 500 genérico; ver "Pendências" para remapear para 400/404.
- Redirecionando para `localhost` após registro:
- Causa: configuração antiga salva no Store (primeira tentativa em dev) ou navegação dentro da WebView.
- Ações:
- Abrir no navegador padrão com `openUrl` (`apps/desktop/src/main.ts:694`).
- Se necessário, limpar Store via botão "Reprovisionar" (Configurações) ou removendo o arquivo `machine-agent.json` no diretório de dados do app.
- Mensagem de erro genérica no desktop:
- Antes: "Erro desconhecido ao registrar a máquina".
- Agora: exibe `Falha ao registrar máquina (STATUS): mensagem — detalhes` (quando disponíveis), facilitando diagnóstico.
## Provisionamento — segredo e boas práticas
- Variável: `MACHINE_PROVISIONING_SECRET` (VPS/Convex backend).
- Rotina de giro (secret exposto foi mostrado no chat):
1. Gerar novo segredo (ex.: `openssl rand -hex 32`).
2. Aplicar no serviço Convex (Swarm) e forçar redeploy:
```
docker service update --env-add MACHINE_PROVISIONING_SECRET='NOVO_HEX' sistema_convex_backend
docker service update --force sistema_convex_backend
```
3. Validar com `POST /api/machines/register` (esperado 201).
- Máquinas já registradas não são afetadas (token delas continua válido).
## Pendências e próximos passos
- Mapear erros "esperados" para HTTP adequado no web (Next):
- Em `src/app/api/machines/register/route.ts:1`, detectar `ConvexError` conhecidos (empresa inválida, token inválido, etc.) e responder `400`/`404` em vez de `500`.
- Validar UX do botão "Abrir sistema":
- Confirmar que sempre abre no navegador padrão em produção (capability `opener:default` já presente).
- Polimento visual adicional (opcional):
- Botões com variações de cor/hover mais fiéis ao `/login`.
- Trocar ícones emoji por SVGs minimalistas.
- Métricas de CPU no agente (suavização):
- Avaliar média de 23 amostras no lado Rust antes de reportar a primeira leitura (Task Manager-like).
- Documentar re-provisionamento manual do Store por SO (paths exatos) no `apps/desktop/README.md`.
## Checklist rápido de verificação (QA)
- `.env` do desktop contém apenas `VITE_APP_URL` e `VITE_API_BASE_URL` apontando para produção.
- Primeiro registro sem empresa retorna 201 e aparece "Máquina provisionada" nas abas.
- "Ambiente" e "API" em Configurações exibem `https://tickets.esdrasrenan.com.br`.
- "Abrir sistema" abre o navegador com `/machines/handshake?token=...` e loga a máquina.
- Reprovisionar limpa a Store e volta ao formulário inicial.
---
Dúvidas/sugestões: ver `agents.md` para diretrizes gerais e `docs/desktop-build.md` para build de binários.