# 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 `` 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.