- connectToServer: log explícito do modo de auth:
'Machine Token (Clínica cadastrada)' ou
'⚠️ API Key genérica — Clínica NÃO identificada'
- server-identified: log mostra PC + Clínica identificada. Se clínica
não for reconhecida, avisa para configurar o Token no painel.
Facilita diagnóstico de por que arquivos vão para 'desconhecido'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Quando o servidor não encontra nem thumb nem original no Wasabi, emite
'reupload-files' com a lista de original_filenames para o cliente.
O cliente (client-monitor.js):
- Ouve 'reupload-files' e para cada filename busca localmente em monitorPath
- Remove do uploadedCache (força reenvio mesmo que já conste como enviado)
- Chama sendImageToServer com bypassCache=true
- Respeita isSendingPaused
- Loga resultado (reenviados / não encontrados localmente)
O processo Electron (index.js) exibe balão informativo quando o reenvio
é solicitado, para o usuário saber que algo está acontecendo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Item 2 — Notificação de erro do Wasabi:
- client-monitor.js: notifyWasabiError() envia evento IPC 'wasabi-error'
ao processo Electron em dois cenários: falha no Direct Upload e Wasabi
indisponível no servidor. Throttle de 60s para não inundar o usuário.
- index.js: trata 'wasabi-error' no handler IPC do monitorProcess e exibe
tray.displayBalloon com iconType 'error'.
Item 5 — Ordem de envio (mais novas primeiro):
- executarSincronizacaoLocal: após filtrar imagens, ordena por mtime DESC
antes de enfileirar — dentista recebe primeiro as imagens do atendimento
atual em vez de receber em ordem arbitrária do filesystem.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>