Itens 0, 3 e 4 do plano de correção:
ITEM 0 — Preservar dados na atualização (não reconfigurar do zero)
- index.js: loadConfig/saveConfig grava config.backup.json a cada
gravação válida; ao iniciar, restaura do backup se config.json
sumir ou corromper — protege clientId e credenciais.
- client-monitor.js: nova persistConfig() grava config + backup juntos;
aplicada nos 3 pontos que escrevem o config (clientId init, painel
local, wizard CLI).
- package.json: deleteAppDataOnUninstall: false explícito.
ITEM 3 — Duplicatas na lista de apps do Windows
- Mantido perMachine: false consistente; GUID derivado do appId
(não adicionado explícito para não criar 3ª entrada).
- deleteAppDataOnUninstall: false garante AppData intacto.
ITEM 4 — Loop de notificação de nova versão
- Trava anti-loop: conta tentativas por versão em update-state.json;
após 3 falhas da mesma versão, para de auto-instalar e notifica
balão com mensagem para reinstalar manualmente.
- reconcileUpdateState() no boot zera o contador quando a versão
realmente avançou (instalação bem-sucedida).
- autoUpdater.on('error') agora exibe balão com erro real (throttle 60s).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O 1.2.8 enviava os comandos IPC pause/resume pela bandeja, mas o
client-monitor.js não tinha os handlers — pausa não tinha efeito.
- client-monitor: adiciona handlers IPC pause/resume
- Guarda de pausa no início de executarSincronizacaoLocal + break no loop
- index.js: reaplica estado de pausa se o monitor reiniciar
- Bump 1.2.8 → 1.2.9
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Checkbox "Pausar Envio de Imagens" na bandeja (tray)
- Auto-retomada automática após 10 min de pausa (caso usuário esqueça)
- client-monitor: comandos IPC pause/resume; processQueue e executarSincronizacaoLocal
respeitam a pausa, mantendo imagens na fila sem perdê-las
- Estado de pausa reaplicado se o monitor reiniciar
- "Forçar Sincronização" retoma o envio automaticamente se estiver pausado
- Bump 1.2.7 → 1.2.8
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- perMachine: false → instala em %LocalAppData% sem UAC, permitindo silent update
- update-downloaded: chama quitAndInstall(true, true) automaticamente após 15s
- Contagem regressiva visível no tray tooltip e menu
- Botão "Instalar Agora" cancela o countdown e instala imediatamente
- isSilent=true + isForceRunAfter=true: sem janela do instalador, reabre após instalar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- client-monitor.js: adiciona clinicName no client-identify (fallback para auth legada)
- Direct Upload via Presigned URLs (bypass VPS) como caminho principal
- Fallback automático para envio via VPS se Wasabi não disponível
- Thumbnail gerado localmente via IPC com index.js (remove dependência sharp)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>