Skip to content

fix(waha): o nome da sessão nasce num lugar só e cabe no teto de 54 - #745

Open
webtecnica wants to merge 1 commit into
melgarafael:mainfrom
webtecnica:fix/667-nome-sessao-waha
Open

fix(waha): o nome da sessão nasce num lugar só e cabe no teto de 54#745
webtecnica wants to merge 1 commit into
melgarafael:mainfrom
webtecnica:fix/667-nome-sessao-waha

Conversation

@webtecnica

Copy link
Copy Markdown

O que este PR faz

O nome da sessão que o CRM manda para o WAHA passa a nascer em um único lugar, e o CRM confere o teto de 54 caracteres do WAHA antes de falar com o transporte.

Antes, esse nome saía de dois lugares que ninguém comparava: o onboarding montava org_${orgId.slice(0,8)} à mão, num arquivo, e o botão "Conectar novo WhatsApp" (Central de Conexões) usava o nome vindo do banco — sem que nenhuma superfície conhecesse o limite do WAHA. Um nome acima de 54 caracteres só se revelava como o 400 name must be shorter than or equal to 54 characters do WAHA no meio do fluxo, com a reserva já feita: a sessão nunca era criada do outro lado (o GET /api/sessions do WAHA devolvia []) e o card ficava preso em Parado, dizendo "Não foi possível concluir a conexão. Abra Conexões para tentar novamente ou reparar o número.".

Closes #667

Como resolve

  • lib/channels/nome-da-sessao.ts (novo) — fonte única do formato curto (nomeCurtoDaSessao, 12 caracteres) e da conferência do teto (TETO_NOME_DE_SESSAO_WAHA = 54, nomeDaSessaoCabeNoWaha). O prefixo org_ é contrato: lib/channels/onboarding-session.ts procura exatamente essa string para achar a linha legada da organização.
  • app/onboarding/connect-whatsapp/page.tsx e lib/channels/onboarding-session.ts passam a derivar do helper — o comportamento não muda: o formato é o mesmo de antes, byte a byte.
  • lib/channels/connect-waha.ts — confere o teto antes de qualquer chamada ao transporte. Acima dele: fecha a reserva em FAILED (session_name_too_long) e lança connection_session_name_too_long (409) com nome, comprimento e teto em technical. O transporte não é tocado (nem stopSession), então nada é criado do outro lado — em vez de um 400 opaco no meio do fluxo.
  • As duas rotas que traduzem ChannelConnectionError (app/api/v1/channel-sessions/route.ts e app/api/v1/onboarding/whatsapp/session/route.ts) ganham a mensagem desse caso: o operador lê o limite, e não um erro de comunicação genérico.

Este PR não mexe na função do banco (fn_reserve_channel_connection): o main já gera o formato de 45 caracteres (migration 0232). O que faltava era a superfície de Conexões deixar de depender de duas fontes e o CRM conhecer o teto.

O que medi (comandos e saídas)

Testes focadospnpm exec vitest run lib/channels/connect-waha.test.ts tests/unit/nome-da-sessao-do-waha.test.tsTest Files 2 passed (2) / Tests 16 passed (16), exit 0.

São 3 casos novos no caminho de Conexões (nome de 69 caracteres morre no CRM com motivo e sem tocar no transporte; 54 exatos e 45 do banco seguem pelo caminho normal) e 6 casos novos no invariante: o teto é 54, o limite é inclusivo (54 cabe, 55 não), o formato antigo (69) e o de hoje (45), e uma varredura de fonte que reprova qualquer superfície que volte a montar o nome à mão.

Sabotagem (depois do commit; previsão escrita antes de rodar: 1 vermelho de 16, e era o previsto): git checkout HEAD~1 -- lib/channels/connect-waha.tsTests 1 failed | 15 passed (16). O vermelho é nome acima do teto morre no CRM, com motivo, sem chegar ao transporte, com promise resolved "{ channel: {...}, replay: false }" instead of rejecting — sem a guarda, o nome de 69 caracteres atravessa o fluxo inteiro. Restaurado com git checkout HEAD -- lib/channels/connect-waha.ts (hash do arquivo = blob do commit; git status limpo).

Gates (um pesado por vez, flock + systemd-run --scope -p MemoryMax=5G):

gate resultado
pnpm typecheck rc=0tsc --noEmit -p tsconfig.typecheck.json, sem saída
pnpm lint rc=0✖ 349 problems (0 errors, 349 warnings); nenhum aviso nos arquivos tocados
pnpm lint:channels rc=0lint-channels: ok (62 arquivos de dívida conhecida, nenhum novo)
pnpm release:conferir rc=0.changes/nome-da-sessao-nao-passa-do-teto-do-waha.md1.20.0 + patch = 1.20.1 (1 fragmento(s))

O que NÃO medi

  • pnpm test:unit (suíte completa), pnpm build, pnpm test:db, pnpm test:shell — não rodei localmente; o CI (verify, build-and-size, invariants, e2e, imagens-ok) é a medição delas neste PR. Não toquei schema/RLS nem hostgator-setup-kit/.
  • Prova em tela (test:e2e) — não há instalação viva/Docker aqui; o clique em Conexões não foi exercitado por mim.
  • WAHA real — não repeti o POST /api/sessions contra um WAHA de verdade: o 400 ... 54 characters e o GET /api/sessions vazio estão citados do corpo da Conectar novo WhatsApp falha sempre: nome de sessão tem 69 caracteres e o WAHA aceita 54 #667, não reproduzidos nestas máquinas.
  • Rota de voz (app/api/v1/voice/sessions/pair/route.ts) monta o mesmo formato curto à mão para o WaCalls (não WAHA) e fica declarada como exceção da varredura, com o motivo escrito no teste: 12 caracteres desde sempre, sem o defeito desta issue.

O botão "Conectar novo WhatsApp", na Central de Conexões, falhava sempre com
"Falha na comunicação com o WhatsApp (WAHA)": o identificador da sessão saía com
69 caracteres e o WAHA recusa acima de 54, então a sessão nunca era criada do
outro lado e o card ficava preso em "Parado". O onboarding escapava porque
montava o formato curto por conta própria, num segundo lugar do código.

- lib/channels/nome-da-sessao.ts: o formato curto (12 caracteres) e a
  conferência do teto, fonte única das duas telas.
- lib/channels/connect-waha.ts: confere o teto antes de tocar no transporte;
  acima dele a conexão morre aqui, com motivo próprio e sem criar nada do outro
  lado, no lugar de um 400 opaco do WAHA no meio do fluxo.
- onboarding e Conexões passam a derivar do mesmo helper.

Testes: a regressão do caminho de Conexões (nome de 69 caracteres) em
lib/channels/connect-waha.test.ts e o invariante de fonte única em
tests/unit/nome-da-sessao-do-waha.test.ts.

Refs melgarafael#667
@vercel

vercel Bot commented Sep 12, 2026

Copy link
Copy Markdown

@webtecnica is attempting to deploy a commit to the rafael-maudibrasil's projects Team on Vercel.

A member of the Team first needs to authorize it.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Security Evidence

Commit: a84303f74aa1dc657e32289b46d41523191f97cc

Security scanner evidence required (action_required)

Detected 1 security-sensitive predictive risk signal(s) without scanner evidence.

Mode: enforce

Findings:

  • Security-sensitive changes may ship without scanner evidence: The PR touches billing, secrets, auth, webhooks, agent, or CI-sensitive surfaces without adding obvious security scanner, code scanning, or security-focused validation evidence. (1 security-sensitive paths changed; 0 security scanner or security-focused validation artifacts changed)

Touched security-sensitive paths:

  • app/api/v1/onboarding/whatsapp/session/route.ts

Expected evidence:

  • Security scanner, code scanning, secret scanning, dependency/security review, or focused security regression output.
  • SARIF/code-scanning upload or equivalent pass/fail gate for the changed surface.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / PR Risk Taxonomy

Commit: a84303f74aa1dc657e32289b46d41523191f97cc

PR taxonomy review recommended (neutral)

Detected 2 PR taxonomy bucket(s): Security Evidence, CI/CD Recommendation.

Scanned 9 changed file(s).

Roadmap taxonomy buckets:

Security Evidence

Security-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence.

Signals:

  • Auth or permission changes may ship without security regression coverage
  • Security-sensitive changes may ship without scanner evidence
  • 1 security-sensitive path(s) changed

Paths:

  • app/api/v1/onboarding/whatsapp/session/route.ts

CI/CD Recommendation

CI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work.

Signals:

  • API contract changes may ship without integration coverage
  • API implementation changes may ship without contract artifact updates
  • User-facing UI changes may ship without browser coverage
  • 2 CI or workflow path(s) changed

Paths:

  • lib/channels/connect-waha.test.ts
  • tests/unit/nome-da-sessao-do-waha.test.ts
  • app/api/v1/channel-sessions/route.ts
  • app/api/v1/onboarding/whatsapp/session/route.ts
  • app/onboarding/connect-whatsapp/page.tsx
  • lib/channels/connect-waha.ts
  • lib/channels/nome-da-sessao.ts
  • lib/channels/onboarding-session.ts

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Reference Set Readiness

Commit: a84303f74aa1dc657e32289b46d41523191f97cc

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 9 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: a84303f74aa1dc657e32289b46d41523191f97cc

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 9 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@github-actions

Copy link
Copy Markdown

Recebido, @webtecnica — obrigado por isto.

Duas coisas que vão parecer erro seu e não são:

  • O check Vercel vermelho ("Authorization required to deploy") é esperado em PR de fork. A
    main faz deploy de produção e a Vercel se recusa a construir código de fora, o que está
    certo. Ele não entra no gate de merge.
  • No primeiro PR de quem nunca contribuiu aqui, os workflows ficam parados esperando
    liberação
    — política do GitHub, não sua. Enquanto isso o PR parece não ter check nenhum
    (nem o gh pr checks mostra os que estão nesse estado). Quem tria libera; você não precisa
    fazer nada.

Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só
lendo o diff — e responde aqui em até um dia útil, com a medição junto, nunca com um "acho
que".

Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem
depois é pessoa.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Conectar novo WhatsApp falha sempre: nome de sessão tem 69 caracteres e o WAHA aceita 54

1 participant