Redesenho da UI de dispositivos e correcao de VRAM

- Reorganiza layout da tela de dispositivos admin
- Renomeia secao "Controles do dispositivo" para "Atalhos"
- Adiciona botao de Tickets com badge de quantidade
- Simplifica textos de botoes (Acesso, Resetar)
- Remove email da maquina do cabecalho
- Move empresa e status para mesma linha
- Remove chip de Build do resumo
- Corrige deteccao de VRAM para GPUs >4GB usando nvidia-smi
- Adiciona prefixo "VRAM" na exibicao de memoria da GPU
- Documenta sincronizacao RustDesk

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
esdrasrenan 2025-12-06 17:01:40 -03:00
parent c5150fee8f
commit 23e7cf58ae
11 changed files with 863 additions and 441 deletions

View file

@ -9,6 +9,7 @@ Este índice consolida a documentação viva e move conteúdos históricos para
- Build: `docs/desktop/build.md`
- Updater: `docs/desktop/updater.md`
- Handshake/troubleshooting: `docs/desktop/handshake-troubleshooting.md`
- RustDesk sync: `docs/desktop/rustdesk-sync.md`
- Tickets: `docs/ticket-snapshots.md`
- Administração (UI): `docs/admin/admin-inventory-ui.md`

View file

@ -0,0 +1,151 @@
# Desktop (Tauri) - Sincronizacao RustDesk com Backend
Este documento descreve o mecanismo de sincronizacao automatica do RustDesk com o backend apos o provisionamento no aplicativo desktop.
## Visao Geral
O fluxo de sincronizacao do RustDesk garante que as credenciais de acesso remoto (ID e senha) sejam automaticamente registradas no backend assim que o RustDesk for provisionado na maquina. Isso elimina a necessidade de cadastro manual e permite acesso remoto imediato.
## Arquitetura
### Fluxo de Provisionamento
```
1. Usuario clica "Registrar" no app desktop
2. TypeScript faz POST /api/machines/register
3. TypeScript salva token/config no store local
4. TypeScript inicia RustDesk em background (fire-and-forget)
5. TypeScript redireciona IMEDIATAMENTE para o sistema
6. [Background] Rust provisiona RustDesk (~30s)
7. [Background] Rust faz POST /api/machines/remote-access (SYNC)
8. [Background] Rust atualiza lastSyncedAt no store
```
### Por que o Sync e feito no Rust?
| Problema anterior | Solucao Rust |
|-------------------|--------------|
| CSP do Tauri bloqueava `fetch()` | Rust usa reqwest diretamente, sem CSP |
| Race conditions com React state | Fluxo sincrono no Rust |
| Fire-and-forget nao completava | Sync acontece antes do return |
| Timeout do navegador | Rust tem controle total do HTTP |
## Implementacao
### Arquivo: `apps/desktop/src-tauri/src/rustdesk.rs`
O sync e executado automaticamente apos o provisionamento bem-sucedido:
```rust
// Apos salvar dados do RustDesk no store local
sync_remote_access_with_backend(&result)?;
```
### Payload da API
```json
{
"machineToken": "<token-da-maquina>",
"provider": "RustDesk",
"identifier": "<id-do-rustdesk>",
"password": "<senha-permanente>",
"notes": "Versao: 1.4.4. Provisionado em: 1765045637482"
}
```
### Headers
- `Content-Type: application/json`
- `Idempotency-Key: <machineId>:RustDesk:<rustdeskId>` (previne duplicatas)
### Endpoint
```
POST /api/machines/remote-access
```
## Arquivos de Configuracao
### Store Local
Caminho: `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json`
Estrutura relevante:
```json
{
"config": {
"machineId": "...",
"apiBaseUrl": "https://tickets.esdrasrenan.com.br"
},
"token": "...",
"rustdesk": {
"id": "497869711",
"password": "...",
"installedVersion": "1.4.4",
"lastProvisionedAt": 1765045637482,
"lastSyncedAt": 1765045638173,
"lastError": null
}
}
```
### Logs
Caminho: `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log`
Mensagens de sucesso:
```
[...] Iniciando sincronizacao com backend...
[...] Sync com backend OK: status 200 OK
[...] Acesso remoto sincronizado com backend
```
## Diagnostico
### Verificar se o Sync Funcionou
1. Abrir `machine-agent.json`:
```
%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json
```
2. Verificar campo `rustdesk.lastSyncedAt`:
- Se tem valor numerico: sync OK
- Se `null`: sync falhou
3. Verificar logs:
```
%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log
```
### Possiveis Erros
| Erro | Causa | Solucao |
|------|-------|---------|
| `400 Bad Request` | Payload incorreto | Verificar schema da API |
| `401 Unauthorized` | Token invalido/expirado | Re-registrar maquina |
| `Connection refused` | Backend indisponivel | Verificar URL da API |
| `lastSyncedAt: null` | Sync nao executou | Verificar logs do Rust |
### Fallback Manual
Se o sync automatico falhar, o sistema tenta novamente a cada 30 segundos em background. Tambem e possivel forcar o re-provisionamento via:
1. Aba "Configuracoes" no app desktop
2. Clicar "Reprovisionar RustDesk"
## Historico de Mudancas
### Dezembro 2025 - Migracao do Sync para Rust
**Problema:** O sync feito em TypeScript (`fetch()`) falhava com "Failed to fetch" devido ao CSP do Tauri v2 bloquear requisicoes externas do webview.
**Solucao:** Mover o sync para o Rust, que faz HTTP diretamente via reqwest sem restricoes de CSP.
**Arquivos modificados:**
- `apps/desktop/src-tauri/src/rustdesk.rs` - Adicionado `sync_remote_access_with_backend()`
- `apps/desktop/src/main.tsx` - Simplificado para fire-and-forget
---
Ultima atualizacao: Dezembro 2025 - Sync automatico via Rust apos provisionamento.