# Extensao: Carrinho CAIXA (quase 1 clique)

Esta extensao conecta o botao "Criar carrinho CAIXA" do app com a pagina da CAIXA.

## Contexto atual

- O app pode enviar jogos gerados, selecionados manualmente ou reaproveitados do aprendizado.
- A extensao apenas executa o fluxo de carrinho na CAIXA; ela nao decide estrategia nem faz aprendizado.

## O que ela faz

1. Recebe os jogos enviados pelo app.
2. Abre a pagina da loteria correspondente na CAIXA.
3. Marca as dezenas automaticamente.
4. Clica em "Colocar no Carrinho" para cada jogo.
5. Opcionalmente, executa limpeza do carrinho/volante quando acionado pelo app.

## Instalar (Chrome/Edge)

1. Abra `chrome://extensions` (ou `edge://extensions`).
2. Ative o "Modo do desenvolvedor".
3. Clique em "Carregar sem compactacao".
4. Selecione a pasta:
   - `extensions/caixa-quase-1click`

## Uso

1. No app ResultadosLoteria, gere ou selecione jogos.
2. Clique em "Criar carrinho CAIXA".
3. A extensao abre a CAIXA e tenta montar o carrinho automaticamente.

## Atualizacao

Se voce ja instalou a extensao antes, abra `chrome://extensions` e clique em
`Recarregar` apos baixar/atualizar os arquivos.

## Logs de depuracao

Para ver os logs do service worker da extensao:

1. Abra `chrome://extensions`
2. Ative `Modo do desenvolvedor`
3. Na extensao `ResultadosLoteria - Carrinho CAIXA`, clique em `service worker`
4. Veja os logs com prefixo `RL-CAIXA-SW`

## Modo de abertura da aba (a partir da v0.1.28)

Por padrao a CAIXA abre em **janela separada sem foco** (v0.1.29). Tres modos:

| Modo | Comportamento | Risco |
|---|---|---|
| `janela` (padrao) | janela separada, sem foco | so estrangula se a janela ficar TOTALMENTE encoberta |
| `background` | aba oculta, sem roubar foco | **medido: 1 clique/s em vez de 5,5 — inviavel** |
| `foreground` | como era antes | rouba o foco |

O Chrome limita timers de aba OCULTA a ~1/segundo, e a ~1/minuto apos 5 minutos
escondida. Medido na lotomania em 12/08 (`fatorLentidao 1.91`): os cliques
passaram de ~180ms para exatamente 1000ms de intervalo. Com ~500 cliques, os
90s viram 8+ minutos — e aos 5 minutos o throttling severo trava de vez.

Por isso o padrao e `janela`: entrega o mesmo "nao roubar o foco" sem o custo,
porque a janela e VISIVEL para o motor de renderizacao (`visibilityState`
continua "visible") e nenhum clamp se aplica.

A extensao mede isso sozinha: se detectar, registra `aba:throttling-detectado`
com o fator de lentidao. **Se o carrinho travar em background, olhe esse evento
antes de qualquer outra coisa.**

Trocar o modo (console do service worker):

```js
chrome.runtime.sendMessage({ type: "RL_CAIXA_SET_MODO", modo: "janela" })
chrome.runtime.sendMessage({ type: "RL_CAIXA_GET_MODO" }, (r) => console.log(r))
```

## Exportar diagnostico (a partir da v0.1.16)

O console do service worker some quando o Chrome encerra o worker, e obriga a
ter o DevTools aberto no instante da falha. A partir da v0.1.16 a trilha de
eventos fica salva em `chrome.storage.local` e sai em um comando.

**Como capturar uma falha:**

1. Abra o console do service worker (passos acima).
2. Limpe a trilha da rodada anterior:
   ```js
   chrome.runtime.sendMessage({ type: "RL_CAIXA_CLEAR_TRACE" })
   ```
3. No app, clique em `Criar carrinho CAIXA` e deixe o fluxo rodar ate falhar.
4. Volte ao console do service worker e rode:
   ```js
   chrome.runtime.sendMessage({ type: "RL_CAIXA_GET_TRACE" }, (r) => {
     console.log(JSON.stringify(r.resumo, null, 2));
     copy(JSON.stringify(r, null, 2));
   })
   ```

O `resumo` ja aponta a etapa que quebrou (`falhaPrincipal.etapa` e
`falhaPrincipal.significado`), e o `copy()` coloca a trilha completa na area de
transferencia para colar em uma issue ou conversa.

A trilha guarda as ultimas 400 entradas (ring buffer) e nao contem dados de
login nem nada digitado na CAIXA — so nomes de etapa, URLs de rota e contadores.

## Observacoes

- Login/confirmacoes de seguranca da CAIXA continuam sendo do usuario.
- Se a CAIXA alterar o HTML/botoes, o seletor da extensao pode precisar de ajuste.
- Se houver alteracao de codigo, atualize a versao do `manifest.json` antes de publicar o zip.
