# Changelog

## [1.1.1] - nao publicada

### Correcao

- A lista de dominios do canal (menu Seguranca do painel, `allowOrigins` do `sdk-info`) passa a aceitar curinga e entrada sem esquema, como a tela orienta. `https://*.cliente.com` libera qualquer subdominio de `cliente.com`, de qualquer profundidade, com o mesmo esquema e porta; nao libera o proprio `cliente.com`, `evilcliente.com` nem `cliente.com.evil.com`. Entrada sem esquema (`cliente.com`, `*.cliente.com`) vale como `https`. Na 1.1.0 a comparacao era por origem exata: entrada com `*` virava uma origem literal que nunca casava, entrada sem esquema era descartada, e a tentativa terminava em `origin_not_allowed`.
- O `*` so vale como primeiro rotulo inteiro, seguido de pelo menos dois rotulos: `*`, `*.com`, `a*.cliente.com` e `app.*.cliente.com` nao liberam nada. Hosts comparam sem diferenciar maiusculas.

### Novidade

- O `state` do OAuth do Messenger e do Instagram passa a levar `pk`, a chave publica do cliente: `{ currentUrl, attemptId, channelId, pk }`. A pagina de retorno do painel usa a `pk` para ler as origens liberadas do canal e so responde ao `currentUrl` que casa com elas; no Messenger, tambem para listar as paginas quando a sua origem nao e a do painel. A `pk` e publica (ja vai na query das janelas `/connect/*` e `/oauth/proxy-cloud-api`), mas passa a aparecer tambem na URL do dialogo da Meta.

### Compatibilidade

- **Instagram e Messenger pelo site do integrador exigem a 1.1.1.** Com a 1.1.0 ou anterior o `state` nao traz `pk`, e a pagina de retorno nao responde para fora do painel: a tentativa termina em `popup_closed` ou `TIMEOUT`. Dentro do proprio painel nada muda.
- Entradas exatas com esquema continuam liberando a mesma origem, com uma excecao: entrada com usuario ou senha na autoridade (`https://user@app.cliente.com`, `https://@app.cliente.com`) deixa de liberar qualquer origem. Na 1.1.0 o `new URL` descartava o usuario e a entrada valia como `https://app.cliente.com`. Cadastre a origem sem `@`.
- `*` no caminho, na query ou no fragmento de uma entrada exata (`https://app.cliente.com/*`) continua ignorado, como na 1.1.0: so o `*` na autoridade e interpretado.
- Quem fica na 1.1.0, inclusive por unpkg ou jsdelivr com versao fixa, continua recebendo `origin_not_allowed` quando a sua origem so esta coberta por curinga ou por entrada sem esquema. A alternativa sem atualizar e cadastrar a origem exata com `https://`.

## [1.1.0] - 2026-10-08

### Mudanca de comportamento

- `connect` com canal `Z_API_WHATSAPP` passa a exigir `getQRCode`. Sem ele, rejeita com `OmnizapiError` de codigo `INVALID_OPTIONS` depois de ler a configuracao do canal e antes de navegar a janela reservada, que e fechada. Na 1.0.4 a janela abria e a tentativa terminava em `not_completed`. Origem nao liberada continua resolvendo `origin_not_allowed`, porque e conferida antes.

### Novidade

- A janela `/connect/whatsapp-web` passa a receber `qr=message` e a pedir o QR por `postMessage` (`qr-code-request`). O SDK confere origem, janela, `attemptId`, `channelId` e `requestId` (ate 64 caracteres), chama o `getQRCode` e responde (`qr-code-response`) so para a origem exata do frontend. Funciona com a aplicacao em qualquer origem liberada para o canal; na 1.0.4 so funcionava na mesma origem da janela.
- No maximo uma chamada ao `getQRCode` por vez em cada tentativa: um pedido que chega com uma chamada em andamento recebe o resultado dela.
- A recusa do `getQRCode` chega a janela com `status` e `message`, lidos do corpo da resposta quando existe. O texto tecnico do axios ("Request failed with status code 422") nao e usado. Retorno sem `value` e sem `connected: true` significa QR ainda nao pronto.

### Compatibilidade

- Os globais `__omnizapiPublicKey`, `__omnizapiCurrentChannel` e `__omnizapiGetQrCode` continuam publicados durante a tentativa, para a pagina de conexao anterior a `qr=message`, que so os le na mesma origem.
- Quem fica na 1.0.4, inclusive por unpkg ou jsdelivr com versao fixa, continua sem conseguir conectar `Z_API_WHATSAPP` fora do painel da plataforma: a tentativa termina em `not_completed`.

## [1.0.4] - 2026-09-11

### Correcao

- Eventos do Embedded Signup passam a ser aceitos de qualquer origem HTTPS em `facebook.com` ou subdominio (www, web, business). A allowlist exata de duas origens deixava a conexao nativa sem resposta quando o dialogo da Meta era servido de outro host, e a tentativa ficava aberta ate o timeout.
- `FINISH_ONLY_WABA` conclui a conexao sem numero de telefone, em vez de ser ignorado.

## [1.0.3] - 2026-09-11

### Correcao

- O login nativo do Meta WhatsApp so acontece com `direct: true`, e nesse caso o SDK nao reserva a janela `about:blank` no clique. Na 1.0.2 a reserva consumia o unico popup que o navegador concede por clique, o dialogo da Meta era bloqueado e a tentativa ficava ativa ate o timeout (`CONNECTION_IN_PROGRESS` no clique seguinte). Sem `direct`, todo Meta WhatsApp usa a janela reservada e navega para `/oauth/proxy-cloud-api` da plataforma, inclusive na origem do frontend de conexao e em canais com `appCustom`; o proxy faz o login nativo com um clique novo. `appCustom` e a origem da pagina deixam de selecionar o nativo.
- Com `direct` em canal que nao e Meta WhatsApp, ou quando a pagina nao pode rodar o nativo, a janela do proxy e aberta na navegacao, apos a configuracao do canal, e pode ser bloqueada pelo navegador; documentado.

## [1.0.2] - 2026-09-10

Primeira versao documentada neste changelog; nao reconstitui o historico de releases anteriores.

### API e ciclo de vida

- `ConnectionOptions.signal?: AbortSignal` permite interromper `connect` com `OmnizapiError.code === "ABORTED"` e limpeza dos recursos da tentativa, sem expor `signal.reason`. Nao desfaz autorizacoes no provedor nem operacoes ja recebidas pelo backend.
- Uma tentativa ativa por pagina, inclusive entre clientes; reserva de popup `about:blank` no gesto e navegacao da mesma janela apos validar a configuracao. A selecao de fluxo nativo por `appCustom` fecha a janela provisoria; o gesto exigido pelo SDK Meta ainda depende de homologacao externa.
- Quarentena nativa preservada quando o login termina sem callback Meta, inclusive por timeout ou abort. Callback de cancelamento ou tardio libera somente a tentativa dona, sem exigir reload para todo cancelamento.
- Inicializacao rastreada pelo SDK Facebook reutilizada para o mesmo `appId` numerico, sem reinicializar silenciosamente o SDK do host; conflitos de app e inicializacao preexistente desconhecida degradam para o fluxo proxy na janela reservada (abaixo).
- Chamadas externas ao `FB.init` observado invalidam o app conhecido, inclusive entre versoes da biblioteca. Timeouts inconclusivos de scripts externos impedem atribuir proveniencia propria a um carregamento tardio; recursos do host nao sao removidos.
- `getListMessengerPages` permanece `Promise<unknown>`: o schema do servico externo nao foi confirmado. Os tipos publicos continuam importados da raiz de `@omnizapi/connect`. A chamada agora aceita um `AbortSignal` opcional como terceiro argumento; aborts rejeitam com `ABORTED` (antes `NETWORK_ERROR`) e sinais invalidos com `INVALID_OPTIONS`.
- Conflito de app Meta ou SDK Meta do host com inicializacao desconhecida nao rejeita mais com `INVALID_CONFIGURATION`: a tentativa degrada para o fluxo proxy na janela reservada. A quarentena de login nativo (`CONNECTION_IN_PROGRESS`) nao degrada. Para canais `appCustom`, o fallback exige o dominio/redirects da plataforma cadastrados no app do cliente.
- Um `FB.login` que lanca excecao sincrona libera imediatamente a quarentena nativa (nenhum dialogo abriu, nenhum callback chegara), permitindo nova tentativa sem recarregar a pagina.
- A janela `about:blank` passa a ser reservada no clique para todos os canais, inclusive com `direct: true`: `direct` deixa de impedir a reserva e apenas solicita o fluxo nativo no WhatsApp Meta, corrigindo o `POPUP_BLOCKED` de `direct` em outros canais. Fechar a janela reservada antes da navegacao nao cancela a tentativa; `popup_closed` so ocorre quando o fluxo ja depende da janela.
- A comparacao de `allowOrigins` normaliza cada entrada com `new URL(origin).origin`, aceitando entradas com barra final, path ou porta padrao.
- As URLs de `/connect/telegram` e `/connect/whatsapp-web` incluem `pk` (a chave publica), permitindo ao frontend de conexao restringir o `targetOrigin` da resposta as origens autorizadas do canal em vez de `*`.

### Exemplos e documentacao

- Criacao/cache de clientes movidos para o `try` do clique nos exemplos TypeScript, React, Angular e Vue, permitindo exibir erros de configuracao sem falhar na importacao/renderizacao.
- Exemplo de erros com mensagens tipadas exaustivas, inclusive `ABORTED`, e cancelamento controlado apenas durante a autorizacao. React usa `useRef` e cleanup com `AbortController`, sem atualizacoes apos desmontagem nem memoizacao desnecessaria.
- Mensagens de retry ajustadas para nao exigir reload indiscriminado nem recomendar repetir uma finalizacao cujo estado no backend e desconhecido. Nenhum exemplo registra tokens ou erros brutos.
- Scripts CDN e links UNPKG do README e do exemplo vanilla fixados na versao do manifesto; os exemplos locais sao os mesmos incluidos no pacote.
- Documentacao de `appCustom` preservada e ampliada com limites de inicializacao compartilhada e de gesto nativo; `PROVIDER_ERROR` nao e prometido para toda recusa de dominio pela Meta.
- Nota explicita de privacidade: `state.currentUrl` permanece a URL completa, inclusive query e fragmento, com risco de exposicao de tokens/dados sensiveis. Reduzir a origem depende de verificacao dos proxies e nao foi implementado nesta rodada.
- Licenca MIT completa adicionada com copyright 2026 FourPixel IT, preservando a autoria.

### Verificacao e release

- Fluxo de desenvolvimento documentado com Node.js 22 via `.nvmrc`, `npm ci` e `npm run check` para lint, unitarios, build limpo e smoke tests.
- Protecao de `pack`/`publish` via `prepack` e verificacao de defaults de producao Omnizapi, sem URLs customizadas embutidas no artefato de release. `npm run build` continua aceitando variaveis customizadas explicitas.
- Testes de navegador documentados para Chromium, Firefox e WebKit, com preparacao previa dos binarios Playwright; CI de verificacoes sem publicacao automatica. Testes simulados nao substituem integracao com Meta/proxies reais.
- Sincronizacao dos links versionados por `scripts/sync-version.mjs` em futuras alteracoes aprovadas com `npm version <nova-versao> --no-git-tag-version`.
