fix(waha): o nome da sessão nasce num lugar só e cabe no teto de 54 - #745
fix(waha): o nome da sessão nasce num lugar só e cabe no teto de 54#745webtecnica wants to merge 1 commit into
Conversation
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
|
@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 / Security EvidenceCommit: Security scanner evidence required (action_required) Detected 1 security-sensitive predictive risk signal(s) without scanner evidence. Mode: enforce Findings:
Touched security-sensitive paths:
Expected evidence:
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 / PR Risk TaxonomyCommit: 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 EvidenceSecurity-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence. Signals:
Paths:
CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
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 / Reference Set ReadinessCommit: 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
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 / Hosted Promotion ReadinessCommit: 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 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. |
|
Recebido, @webtecnica — obrigado por isto. Duas coisas que vão parecer erro seu e não são:
Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem |
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 o400 name must be shorter than or equal to 54 charactersdo WAHA no meio do fluxo, com a reserva já feita: a sessão nunca era criada do outro lado (oGET /api/sessionsdo WAHA devolvia[]) e o card ficava preso emParado, 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 prefixoorg_é contrato:lib/channels/onboarding-session.tsprocura exatamente essa string para achar a linha legada da organização.app/onboarding/connect-whatsapp/page.tsxelib/channels/onboarding-session.tspassam 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 emFAILED(session_name_too_long) e lançaconnection_session_name_too_long(409) com nome, comprimento e teto emtechnical. O transporte não é tocado (nemstopSession), então nada é criado do outro lado — em vez de um 400 opaco no meio do fluxo.ChannelConnectionError(app/api/v1/channel-sessions/route.tseapp/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): omainjá gera o formato de 45 caracteres (migration0232). 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 focados —
pnpm exec vitest run lib/channels/connect-waha.test.ts tests/unit/nome-da-sessao-do-waha.test.ts→Test 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.ts→Tests 1 failed | 15 passed (16). O vermelho énome acima do teto morre no CRM, com motivo, sem chegar ao transporte, compromise resolved "{ channel: {...}, replay: false }" instead of rejecting— sem a guarda, o nome de 69 caracteres atravessa o fluxo inteiro. Restaurado comgit checkout HEAD -- lib/channels/connect-waha.ts(hash do arquivo = blob do commit;git statuslimpo).Gates (um pesado por vez,
flock+systemd-run --scope -p MemoryMax=5G):pnpm typechecktsc --noEmit -p tsconfig.typecheck.json, sem saídapnpm lint✖ 349 problems (0 errors, 349 warnings); nenhum aviso nos arquivos tocadospnpm lint:channelslint-channels: ok (62 arquivos de dívida conhecida, nenhum novo)pnpm release:conferir.changes/nome-da-sessao-nao-passa-do-teto-do-waha.md→1.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 nemhostgator-setup-kit/.test:e2e) — não há instalação viva/Docker aqui; o clique em Conexões não foi exercitado por mim.POST /api/sessionscontra um WAHA de verdade: o400 ... 54 characterse oGET /api/sessionsvazio estão citados do corpo daConectar novo WhatsAppfalha sempre: nome de sessão tem 69 caracteres e o WAHA aceita 54 #667, não reproduzidos nestas máquinas.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.