Commit graph

1127 commits

Author SHA1 Message Date
esdrasrenan
e0530299b1 ui: padroniza altura e filtros em automações/checklists
- Usa size=sm nos botões (Nova automação/Novo template) para bater com Empréstimos\n- Ajusta altura do input e selects na listagem de automações e deixa filtros autoexplicativos
2025-12-13 21:22:15 -03:00
esdrasrenan
51c9cab79c fix: criação de template de checklist
- Permite isArchived na mutation checklistTemplates.create\n- Troca Select por SearchableCombobox no campo Empresa
2025-12-13 21:14:51 -03:00
esdrasrenan
8a045c0131 chore: atualiza Next.js para 16.0.10 2025-12-13 21:08:57 -03:00
esdrasrenan
548c2e44d4 fix: estabiliza templates de e-mail no CI
- Usa @react-email/components nos templates para evitar módulos ausentes no Bun 1.3.1\n- Ajusta preload do bun test para expor global Element (evita crash do PrismJS)
2025-12-13 21:06:06 -03:00
esdrasrenan
88a9ef454e feat: checklists em tickets + automações
- Adiciona checklist no ticket (itens obrigatórios/opcionais) e bloqueia encerramento com pendências\n- Cria templates de checklist (globais/por empresa) + tela em /settings/checklists\n- Nova ação de automação: aplicar template de checklist\n- Corrige crash do Select (value vazio), warnings de Dialog e dimensionamento de charts\n- Ajusta SMTP (STARTTLS) e melhora teste de integração
2025-12-13 20:51:47 -03:00
esdrasrenan
b3da53805f
Merge pull request #22 from esdrasrenan/feat/checklists-e-automacoes
feat: checklists em tickets + automações
2025-12-13 20:46:44 -03:00
esdrasrenan
4306b0504d feat(email): adota React Email em notificações e automações 2025-12-13 13:11:41 -03:00
esdrasrenan
58a1ed6b36 feat: automações com envio de e-mail 2025-12-13 12:38:08 -03:00
esdrasrenan
469608a10b ui: ajustar tabelas de automações e sidebar 2025-12-13 11:59:34 -03:00
esdrasrenan
e4d0c95791 fix: automações (gatilhos, histórico) e chat desktop 2025-12-13 11:26:42 -03:00
esdrasrenan
8ab510bfe9 feat: automações de tickets e testes de regressão 2025-12-13 10:30:29 -03:00
esdrasrenan
9f1a6a7401 web: ajustar espaçamento botões do chat 2025-12-12 23:44:37 -03:00
esdrasrenan
5df68c3917 desktop: fechar chat ao encerrar sessao 2025-12-12 23:41:52 -03:00
esdrasrenan
ce5ea5dad5 chat: remover placeholder [Anexo] 2025-12-12 23:31:35 -03:00
esdrasrenan
119ada60a6 chore(desktop): remover branding do NSIS no instalador 2025-12-12 23:03:49 -03:00
esdrasrenan
bf94dd9f7a fix(desktop): foco de scroll e contagem de não lidas no chat 2025-12-12 22:36:43 -03:00
esdrasrenan
b5b51b638b fix(desktop): permitir dialog de anexo no chat 2025-12-12 22:13:55 -03:00
esdrasrenan
09c212da6e fix(desktop): ajusta opener no chat 2025-12-12 21:51:19 -03:00
esdrasrenan
2f9cd56153 fix(desktop): corrige autostart do Raven no Windows 2025-12-12 21:36:49 -03:00
esdrasrenan
8cf13c43de fix(chat): melhora realtime e anexos no desktop 2025-12-12 21:36:32 -03:00
rever-tecnologia
3d45fe3b04 Ajusta auto-minimização do chat web e unifica realtime no desktop 2025-12-11 17:46:33 -03:00
rever-tecnologia
c65e37e232 fix: scroll para ultima mensagem apos enviar no chat web
Adiciona scroll explicito apos enviar mensagem com sucesso para
garantir que a mensagem mais recente fique visivel.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 16:43:54 -03:00
rever-tecnologia
8798566b7f fix: corrige query listChatMessages para mostrar mensagens recentes
A query estava usando .take(50) sem .order("desc"), retornando as 50
mensagens mais antigas ao inves das mais recentes. Isso fazia com que
novas mensagens do desktop nao aparecessem na web quando o ticket
tinha mais de 50 mensagens.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 16:34:48 -03:00
rever-tecnologia
efc3af3fde fix: corrige contador de mensagens nao lidas e chat desktop abrindo expandido
- Web: adiciona ref hasMarkedReadRef para evitar chamadas duplicadas ao
  markChatRead e garante que mensagens sejam marcadas como lidas mesmo
  quando o chat carrega apos isOpen se tornar true
- Desktop: aumenta periodo de estabilizacao do resize handler para 500ms,
  evitando que eventos transitórios alterem o estado isMinimized

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 16:16:23 -03:00
rever-tecnologia
082f2d67f1 fix: corrige sincronizacao de estado do chat entre abas
O BroadcastChannel nao estava funcionando corretamente porque
cada aba restaurava do localStorage independentemente na montagem.

Mudanca:
- Substituido BroadcastChannel pelo evento 'storage' do localStorage
- O evento storage dispara automaticamente em TODAS as outras abas
  quando o localStorage e alterado (mais confiavel)
- Removido broadcastChannelRef e CHAT_WIDGET_CHANNEL nao mais usados

Comportamento:
- Abrir/fechar/minimizar chat em uma aba sincroniza com todas as outras
- Estado persiste entre reloads via localStorage

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 15:48:33 -03:00
rever-tecnologia
366bc4bf12 fix: corrige chat desktop abrindo expandido ao inves de minimizado
O problema era que o resize handler executava imediatamente na
montagem do componente, potencialmente lendo window.innerHeight
incorreto antes do Tauri aplicar o tamanho da janela.

Isso fazia o isMinimized ser setado como false (expandido) mesmo
quando a janela foi criada minimizada pelo Rust.

Correcao:
- Ignorar a primeira execucao do resize handler
- Preservar o estado inicial isMinimized=true definido no useState
- Sincronizar apenas em resizes reais (interacao do usuario)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 15:42:33 -03:00
rever-tecnologia
9a13e9c6fb fix: corrige chat abrindo automaticamente e zerando contador
O bug era causado pelo useEffect de auto-open que executava
na montagem inicial do componente, sobrescrevendo o estado
do localStorage (isMinimized) e fazendo o chat abrir expandido.

Isso causava o useEffect de markChatRead executar e zerar
o contador de mensagens nao lidas.

Correcao:
- prevSessionCountRef agora inicia como -1 (nao inicializado)
- Primeira execucao apenas inicializa o ref, sem abrir o chat
- Auto-open so acontece para sessoes NOVAS criadas APOS montagem
- Estado do localStorage (minimizado/expandido) e preservado

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 15:39:03 -03:00
rever-tecnologia
f4880f32d2 Corrige comportamentos do chat e melhora UX
- Corrige contador de mensagens resetando sozinho (web)
  - Adiciona verificacao de visibilidade antes de marcar como lido
  - Verifica se aba esta ativa antes de marcar como lido

- Adiciona sincronizacao de estado do chat entre abas (web)
  - Usa BroadcastChannel para sincronizar aberto/fechado/minimizado
  - Persiste estado no localStorage

- Corrige chat minimizando sozinho no desktop (Rust)
  - Verifica se chat esta expandido antes de minimizar
  - Mantem chat aberto quando usuario esta usando

- Melhora encerramento automatico de sessoes de chat
  - Muda criterio de inatividade de chat para maquina offline
  - Sessao permanece ativa enquanto Raven estiver aberto
  - Encerra apenas quando maquina fica offline por 5+ min

- Corrige tabela de tickets em /devices
  - Adiciona acentuacao correta (Ultima atualizacao, Responsavel)
  - Torna linha inteira clicavel para abrir ticket

- Ajusta sidebar
  - Menu Tickets agora expande ao clicar (igual Cadastros)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 15:21:24 -03:00
rever-tecnologia
2682b6e8ac Adiciona endpoint de arquivamento e ajustes de infra
- Adiciona rota API para arquivar tickets por ID
- Atualiza configuracao do Prisma para PostgreSQL
- Simplifica workflow CI/CD
- Adiciona src/generated ao gitignore
- Atualiza documentacao e dependencias

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 13:25:36 -03:00
esdrasrenan
33a59634e7 Migra banco de dados de SQLite para PostgreSQL
- Muda provider Prisma de sqlite para postgresql
- Remove dependencias SQLite (better-sqlite3, adapter)
- Atualiza Better Auth para provider postgresql
- Simplifica prisma.ts removendo adapter SQLite
- Atualiza stack.yml para usar PostgreSQL existente com 2 replicas
- Remove logica de rebuild better-sqlite3 do start-web.sh
- Adiciona script de migracao de dados SQLite -> PostgreSQL
- Atualiza healthcheck para testar PostgreSQL via Prisma
- Habilita start-first deploy para zero-downtime

Melhoria: permite multiplas replicas e deploys sem downtime.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 00:35:27 -03:00
esdrasrenan
fb97d9bec8 fix: corrige multiplos problemas de chat e infra
- stack.yml: reduz replicas web para 1 (SQLite nao suporta escrita concorrente)
- chat.rs: janela de chat ja abre minimizada para evitar marcar mensagens como lidas prematuramente
- rustdesk.rs: preserva ID existente do RustDesk ao reprovisionar (evita criar novo ID a cada reinstalacao do Raven)
- ChatWidget.tsx: remove isMinimized das dependencias do useEffect para evitar memory leak de resubscriptions

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 23:28:31 -03:00
esdrasrenan
695a44781a Corrige badge de mensagens nao lidas no chat web e desktop
- Web: markChatRead agora zera unreadByAgent na sessao ativa
- Desktop: usa unreadCount do backend ao inves de calcular localmente
- Backend: listMachineMessages retorna unreadCount da sessao
- Centraliza colunas da tabela de tickets do dispositivo

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 22:48:18 -03:00
esdrasrenan
2f766af902 Centraliza colunas e ajusta padding na lista de tickets do dispositivo 2025-12-10 22:19:40 -03:00
esdrasrenan
afd24452cf Marca mensagens como lidas ao abrir chat web e zera badge 2025-12-10 22:17:45 -03:00
esdrasrenan
06b09f3da8 Sincroniza minimização pelo tamanho da janela e zera badge ao ler 2025-12-10 21:58:28 -03:00
esdrasrenan
15a6b5ca87 Mantém badge de novas mensagens enquanto chat está minimizado 2025-12-10 21:44:35 -03:00
esdrasrenan
6ab1789c0f Reabre chat minimizado quando chegam novas mensagens 2025-12-10 21:33:50 -03:00
esdrasrenan
b663268791 Evita múltiplos acessos remotos por provider ao reaproveitar entrada existente 2025-12-10 21:19:10 -03:00
esdrasrenan
81d1a7c7f7 Usa heartbeats reais para marcar máquina online no chat 2025-12-10 20:37:02 -03:00
esdrasrenan
da5a8f8380 Corrige verificação de heartbeat no chat ao vivo 2025-12-10 20:23:25 -03:00
rever-tecnologia
821cb7faa7 chore: upgrade next 16.0.8 and tidy local archive 2025-12-10 17:10:52 -03:00
rever-tecnologia
0df1e87f61 docs: note cron for local ticket archive 2025-12-10 15:17:55 -03:00
rever-tecnologia
0a6b808d99 feat: add health dashboard and local ticket archive 2025-12-10 14:43:13 -03:00
rever-tecnologia
0d78abbb6f docs(operations): documentar solucao definitiva do problema de OOM (10/12/2025)
Reescrita completa das secoes 10-13 do OPERATIONS.md:

- Secao 10: Historico completo do problema de memoria OOM
  - Cronologia do problema (Nov/2025 ate 10/12/2025)
  - Causa raiz identificada (versoes de documentos em memoria)
  - Solucao em 3 partes: crons, limpeza, codigo do heartbeat
  - Resultados: 450MB -> 17MB banco, 19GB -> 395MB memoria

- Secao 11: Erros shape_inference marcados como RESOLVIDOS
  - Problema eliminado pela limpeza do banco
  - Crons movidos = nenhum novo registro problematico

- Secao 12: Arquitetura final dos crons
  - Diagrama da nova arquitetura (Linux crontab -> Next.js -> Convex)
  - Mapeamento completo dos crons migrados
  - Configuracao atual do crontab na VPS

- Secao 13 (NOVA): Guia de monitoramento pos-correcao
  - Metricas esperadas para sistema saudavel
  - Comandos de verificacao
  - Procedimento de limpeza (se necessario)
  - Resumo de commits e backups disponiveis

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 10:51:58 -03:00
rever-tecnologia
b6f69d7046 fix(heartbeat): evitar versoes desnecessarias comparando dados antes de atualizar
- Compara inventory/metrics com valores atuais antes de incluir no patch
- Usa JSON.stringify para comparacao eficiente de objetos
- Filtra campos de metadata que realmente mudaram
- Evita criacao de versoes quando heartbeat envia dados identicos

Isso previne o acumulo de versoes no Convex que causava OOM.

Reducao de memoria apos limpeza manual:
- DB: 450MB -> 16MB (96%)
- RAM: 7GB -> 189MB (97%)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 10:21:35 -03:00
rever-tecnologia
178c7d7341 fix(convex): mover cron jobs para API HTTP + crontab do Linux
Problema:
- Cron jobs do Convex criam registros em _scheduled_job_logs
- Convex self-hosted carrega TODAS as versoes em memoria
- 1488 execucoes/dia = ~45k registros/mes acumulando
- Uso de memoria chegando a 19GB, causando 12 OOM kills/dia

Solucao:
- Criar endpoints HTTP em /api/cron/* para substituir crons
- Desabilitar crons no Convex (comentados em crons.ts)
- Chamar endpoints via crontab do Linux

Novos arquivos:
- src/app/api/cron/chat-cleanup/route.ts
- src/app/api/cron/usb-cleanup/route.ts
- scripts-static/* (copiado da VPS para versionamento)

Documentacao:
- docs/OPERATIONS.md secao 12 com instrucoes do crontab

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 08:51:32 -03:00
esdrasrenan
e2dde8510a fix(convex): adicionar logs obrigatorios em cron jobs para evitar shape_inference errors
- Adicionar console.log no inicio de autoEndInactiveSessions (liveChat.ts)
- Adicionar console.log no inicio de cleanupStalePendingPolicies (usbPolicy.ts)
- Documentar problema de shape_inference e solucao em OPERATIONS.md (Secao 11)
- Atualizar .env.example com BETTER_AUTH_SECRET de 32+ caracteres

O shape_inference do Convex self-hosted falha ao unificar arrays vazios
(logLines: []) com arrays de strings (logLines: ["msg"]). Garantindo que
todo cron job produza ao menos um log, evitamos o conflito de tipos.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 00:01:49 -03:00
esdrasrenan
48d9de8dd1 test(machines): atualizar mock para suportar tabela machineHeartbeats
Adicionar mock da nova tabela machineHeartbeats com metodo first()
para corrigir teste getById apos refatoracao do heartbeat.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 23:30:25 -03:00
esdrasrenan
4fbd521fa8 refactor(convex): separar heartbeat em tabela dedicada para evitar OOM
- Criar tabela machineHeartbeats para armazenar lastHeartbeatAt separadamente
- Modificar heartbeat para so atualizar machines quando ha mudancas reais
- Atualizar queries listByTenant e getById para usar nova tabela
- Reducao drastica de versoes de documentos criadas a cada heartbeat

Antes: ~54 versoes por maquina (3524 linhas para 65 maquinas)
Agora: heartbeat atualiza documento leve, machines so muda com dados novos

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 23:26:30 -03:00
esdrasrenan
cf28ad2ee4 fix(convex): prevent OOM by filtering large inventory fields
- Add INVENTORY_BLOCKLIST to filter 'software' and 'extended' fields
  from machine metadata (these fields can be 100KB+ each)
- Add compactMachineMetadata migration to clean existing large documents
- Preserve essential fields: metrics, postureAlerts, collaborator,
  inventory.os, cpu, memory, disks, network, services

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 22:36:03 -03:00