# Speed Live · importação restrita de revendedores

Funcionalidade ADMIN de leitura paginada de revendedores do Speed Live (`https://speedlivem.painelr.top`), preparada sobre o conector HTTPS nativo já validado, sem VPS.

## Fluxo

1. Autorização individual de uso único (até 5 minutos), criada apenas por operação privilegiada separada — nunca pela aplicação.
2. "Verificar autorização de importação" confirma a autorização no preview hospedado.
3. "Buscar revendedores" + confirmação explícita executa uma única sequência: GET /login → POST /login → GET /api/users paginado (até 10 páginas, sequenciais).
4. A lista sanitizada (id, username, créditos) é exibida para seleção individual ou "Selecionar todos".
5. "Importar selecionados" persiste somente a seleção confirmada, com deduplicação por servidor+ID e sem ativar cobranças.

## Garantias

- Origem fixa, sem URLs arbitrárias; `redirect: 'manual'`; todo 3xx rejeitado; sem repetições.
- Limites: 10 páginas, 5 MB, 10 s por requisição, 45 s de sessão.
- Cookies isolados em jar efêmero; credenciais AES-GCM descriptografadas apenas no servidor.
- Consumo durável e atômico da autorização; tentativa inacabada bloqueia novas execuções.
- `server_resellers` permanece sem escrita pelo navegador; a gravação passa por função privilegiada que revalida ADMIN e o esquema fechado.
- Importação somente leitura no painel; linhas existentes nunca são atualizadas (conflito = ignorado).
- Risco residual de DNS rebinding do fetch nativo permanece documentado e aceito apenas por autorização expressa.

## Extração de username HTML: bloqueada sem contrato comprovado

- O diagnóstico informado para página 1, índice local 0 e ID 92138 confirma uma string de 107 caracteres com marcação HTML e sem entidades; não identifica tags, atributos, o nó do login nem os indicadores visuais.
- `sanitizeResellers` lê ID e username do mesmo objeto e preserva o username literalmente como texto inerte, sem extração HTML. A comparação textual de `SpeedLiveRowError` é somente diagnóstico com referência confiável: não deve ser usada para extrair identidade.
- Não considerar os exemplos HTML fictícios dos testes nem os contratos de status/trial como evidência do HTML real do username.
- Evidência mínima: um fragmento do campo original já disponível ao proprietário, com todos os textos pessoais substituídos por marcadores (`LOGIN`, `INDICADOR`) e valores sensíveis de atributos removidos, preservando tags, hierarquia, classes visuais não pessoais, nomes dos atributos e posição dos nós de texto. URLs devem preservar apenas sua forma estrutural, nunca tokens, domínios privados ou valores pessoais. Confirmar separadamente qual nó representa o login conferido; não enviar o JSON completo, cookies ou credenciais.
- Depois de comprovar o contrato, usar parsing DOM inerte e uma allowlist exata de estrutura/atributos/indicadores; exigir um único nó de login e nenhum texto residual não explicado. Rejeitar scripts, estilos, eventos, atributos ativos, estruturas desconhecidas e nós ambíguos, sem remoção genérica de tags e sem regex para produzir o login.
- O login extraído deve continuar texto inerte, com 1–64 caracteres e sem controles, sem truncamento ou normalização de identidade. Preservar ID, vínculo ao servidor, deduplicação global e validação da árvore separada/inativa nesta etapa.
- Matriz mínima futura, com fixture estrutural comprovada e textos fictícios: username simples, HTML conhecido, HTML desconhecido, atributos perigosos, múltiplos candidatos ao login e conteúdo residual ambíguo. Sem fixture comprovada, nenhum caso pode ser chamado de HTML PainelFoda conhecido e nenhuma extração deve ser instalada.

## O que falta para a primeira importação real

1. Aplicar a migração SQL preparada (`src/lib/speed-live-import.sql.ts`).
2. Conceder uma autorização `speed_live_reseller_import` de 5 minutos por operação privilegiada.
3. No preview hospedado, clicar: Verificar autorização de importação → Buscar revendedores → Confirmar consulta única → selecionar → Importar selecionados.
