@danhachuel/leadmaster 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,30 @@ O formato é baseado no [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.
6
6
  A etiqueta visual de versão usa patch de dois dígitos (ex.: `0.1.00`); o registry NPM
7
7
  normaliza para a forma canônica (ex.: `0.1.0`).
8
8
 
9
+ ## [0.1.02] — 2026-10-24
10
+
11
+ ### Corrigido
12
+
13
+ - **Poluição do terminal por logs de polling** (`GET /api/metrics`):
14
+ - Launcher (`scripts/cli.mjs`) e `npm run dev` iniciam o uvicorn com
15
+ `--no-access-log`.
16
+ - Filtro granular de logging no backend silencia o access-log **apenas** de
17
+ `/api/metrics` — erros, exceções e os demais endpoints continuam logados
18
+ normalmente (vale também para execuções manuais do uvicorn).
19
+ - Painel migrado para **TanStack Query** (`@tanstack/react-query`,
20
+ `refetchInterval` de 10s): ciclo de vida e cleanup automáticos, pausa
21
+ quando a aba fica ociosa e retoma ao focar; indicador "atualiza a cada
22
+ 10s" visível nos blocos de gráficos.
23
+ - Polling de campanhas (Disparos) também via TanStack Query: sonda a cada
24
+ 4s apenas enquanto existe campanha em andamento, sem `setInterval` manual.
25
+ - Verificado: nenhum outro endpoint é alvo de polling — `/api/config` e
26
+ demais chamadas são carregamentos pontuais no início da página.
27
+
28
+ ### Alterado
29
+
30
+ - **O sistema nunca abre o navegador.** Removida a abertura automática de janela do
31
+ launcher — o LeadMaster apenas imprime a URL no terminal e quem abre é o usuário.
32
+
9
33
  ## [0.1.01] — 2026-10-23
10
34
 
11
35
  ### Removido
package/README.md CHANGED
@@ -24,8 +24,9 @@ npx --yes @danhachuel/leadmaster@0.1.0
24
24
  ```
25
25
 
26
26
  - `install` prepara a pasta de dados e instala as dependências Python.
27
- - Sem argumentos, o launcher sobe o servidor local (FastAPI na porta **5055**) e abre o
28
- navegador automaticamente. Se a porta 5055 estiver ocupada, o LeadMaster sobe
27
+ - Sem argumentos, o launcher sobe o servidor local (FastAPI na porta **5055**) e
28
+ **imprime a URL no terminal** — o LeadMaster **nunca abre janelas**: quem abre o
29
+ navegador é você. Se a porta 5055 estiver ocupada, o LeadMaster sobe
29
30
  automaticamente na próxima livre (5056, 5057, ...). Pressione `Ctrl+C` para encerrar.
30
31
  - Flags úteis: `--home=<caminho>` (pasta de dados), `--port=<numero>`,
31
32
  `doctor` (diagnóstico), `help`.
@@ -65,7 +66,7 @@ para `http://127.0.0.1:8010` (backend de desenvolvimento).
65
66
 
66
67
  ```
67
68
  npx @danhachuel/leadmaster
68
- └─ scripts/cli.mjs # instala deps Python, sobe uvicorn, abre navegador
69
+ └─ scripts/cli.mjs # instala deps Python, sobe uvicorn, imprime a URL (nunca abre o navegador)
69
70
  └─ backend/main.py # FastAPI: API + serving da UI construída (frontend/dist)
70
71
  ├─ services/storage.py # JSON local (leads, campanhas, config)
71
72
  ├─ services/extractors.py # Maps / Instagram / CNPJ
package/backend/main.py CHANGED
@@ -5,6 +5,7 @@ modo `npx`, onde um único servidor entrega painel e API na mesma porta.
5
5
  """
6
6
 
7
7
  import json
8
+ import logging
8
9
  import os
9
10
  import platform
10
11
  import sys
@@ -37,6 +38,26 @@ def _versao() -> str:
37
38
  VERSION = _versao()
38
39
 
39
40
 
41
+ # ---------------------------------------------------------------------------
42
+ # Logs de acesso
43
+ #
44
+ # O endpoint /api/metrics é consultado por polling do Painel e inundava o
45
+ # terminal. O filtro abaixo silencia APENAS esse endpoint no access-log —
46
+ # erros, exceções e os demais endpoints continuam sendo logados normalmente.
47
+ # (O launcher e o "npm run dev" também passam --no-access-log ao uvicorn.)
48
+ # ---------------------------------------------------------------------------
49
+
50
+ class _FiltroAcessoPolling(logging.Filter):
51
+ def filter(self, record: logging.LogRecord) -> bool:
52
+ try:
53
+ return "/api/metrics" not in record.getMessage()
54
+ except Exception:
55
+ return True
56
+
57
+
58
+ logging.getLogger("uvicorn.access").addFilter(_FiltroAcessoPolling())
59
+
60
+
40
61
  @asynccontextmanager
41
62
  async def lifespan(_app: FastAPI):
42
63
  storage.ensure_seeds()