100 lines
5.7 KiB
Markdown
100 lines
5.7 KiB
Markdown
# 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 dispositivo".
|
||
- Agora: exibe `Falha ao registrar dispositivo (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).
|
||
- Dispositivos 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 2–3 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 "Dispositivo 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 dispositivo.
|
||
- 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.
|