Skip to content

fix(sse): pin the ok variant of the non-streaming leg result in chatCore - #12963

Merged
diegosouzapw merged 2 commits into
release/v3.8.51from
fix/release-v3.8.51-chatcore-legresult-narrowing
Sep 8, 2026
Merged

diegosouzapw merged 2 commits into
release/v3.8.51from
fix/release-v3.8.51-chatcore-legresult-narrowing

Conversation

@diegosouzapw

Copy link
Copy Markdown
Owner

Base-red vivo

API Route Typecheck falha no tip de release/v3.8.51:

apiTypecheckErrors=302
[api-typecheck] FAIL — 1 new/regressed TypeScript error(s) under src/app/api/ not covered by the frozen baseline:
  ✗ open-sse/handlers/chatCore.ts TS2339 (baseline 0, live 13)

Introduzido pelo #12867, que eu mergeei. Erro meu: validei a leva com typecheck:core e dei por coberto. O tsconfig.typecheck-core.json não puxa o chatCore.ts; o tsconfig.typecheck-api.json puxa, através da rota. São dois escopos diferentes e eu só rodei um.

Causa

legResult é declarado como a união NonStreamingProviderLegResult inteira. O guard kind === "error" com return antecipado estreita para a variante ok, mas a reatribuição condicional logo abaixo devolve o tipo declarado — e as 13 leituras de campo seguintes (upstreamResponse, headers, providerRequest, requestUrl, providerBody, response, …) perdem a narrowing.

Correção

loopApply.leg já é tipado NonStreamingProviderLegResult & { kind: "ok" }, então basta fixar a variante num binding próprio. Sem cast, sem as, sem any.

let okLeg: NonStreamingProviderLegResult & { kind: "ok" } = legResult;
if (loopApply.kind === "ok") {
  toolLoopRan = true;
  toolLoopUsage = loopApply.usage;
  okLeg = loopApply.leg;
}

Também caiu o import morto de ChatCoreErrorResult (o no-unused-vars que o pre-commit acusava) e a entrada de supressão do chatCore.ts no eslint-suppressions.json, que declarava 26 violações quando restava 1 — resíduo do split do #12867. Entrada obsoleta suprime defeito futuro, então saiu.

Dois commits, de propósito

O chatCore.ts chegou ao tip fora do padrão do Prettier: 4523 linhas divergem da saída do formatador. Qualquer PR que toque o arquivo carrega essa reformatação, porque o lint-staged formata no commit. Separei:

  1. style(sse) — Prettier puro sobre o arquivo do tip. Verifiquei que o resultado é byte-idêntico a prettier(tip) com a config do projeto: nenhuma edição minha nesse commit.
  2. fix(sse) — a mudança semântica, 39 linhas.

Revise o segundo; o primeiro é mecânico.

Evidência

gate antes depois
check-api-typecheck FAIL — 302 erros, 13 novos OK — 289, todos na baseline
typecheck:core limpo limpo
ESLint em chatCore.ts 1 erro 0

Achado separado

O shard 1/4 de unit tests no tip puro tem 9 falhas; 5 são de tempo sob carga, 4 não são: uma chave Google não estava sendo redigida em corpos de erro. Tratado à parte em fix/release-v3.8.51-google-key-redaction.

@ggiak

ggiak commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Verified locally on the current tip — the gate goes green with this PR.

Node v26.4.0. This is the red every open PR against the branch currently inherits under API Route Typecheck (e.g. #13007, #12987, #13036), so it clears all of them at once.

@ggiak ggiak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@diegosouzapw
diegosouzapw merged commit 99282e1 into release/v3.8.51 Sep 8, 2026
14 of 21 checks passed
diegosouzapw added a commit that referenced this pull request Sep 8, 2026
…sion fixes (#13045)

Cap de arquivo estourado por mim: mergeei o #12963 e o #12990 sem rebaselinar o `chatCore.ts`, que ambos fazem crescer. Cada um passou no próprio gate porque mediu contra o tip de onde saiu — o cap só estoura no conjunto, que é o padrão registrado sete vezes no handoff da campanha anterior.

5984 → 6021, +37 linhas, irredutíveis nos chokepoints existentes: cada edição fica onde o `chatCore` já toma a decisão, e os helpers estão sob o cap. Coberto por `chatcore-translation-paths` (72/74; as 2 abertas são a issue #13043).
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ore (diegosouzapw#12963)

Base-red: `API Route Typecheck` falhava no tip com 13 TS2339 novos em `chatCore.ts`, vindos do diegosouzapw#12867 — que eu mergeei validando só com `typecheck:core`, que não cobre esse arquivo.

Causa: `legResult` é a união `NonStreamingProviderLegResult`; o guard de erro estreita para a variante `ok`, mas a reatribuição condicional do tool loop devolve o tipo declarado e as 13 leituras seguintes perdem a narrowing. Corrigido fixando a variante num binding próprio — `loopApply.leg` já é `& { kind: "ok" }`, então sem cast.

Gate: 302 erros com 13 novos → **289, todos dentro da baseline congelada**. `typecheck:core` limpo, ESLint 0 no arquivo.

Dois commits: o primeiro é Prettier puro sobre o arquivo do tip (que chegou fora do padrão pelo diegosouzapw#12867), verificado byte a byte contra `prettier(tip)`; o segundo é a mudança semântica, 39 linhas.

Os demais vermelhos deste PR são herdados e cobertos por diegosouzapw#12990, diegosouzapw#12964 e diegosouzapw#12970.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…sion fixes (diegosouzapw#13045)

Cap de arquivo estourado por mim: mergeei o diegosouzapw#12963 e o diegosouzapw#12990 sem rebaselinar o `chatCore.ts`, que ambos fazem crescer. Cada um passou no próprio gate porque mediu contra o tip de onde saiu — o cap só estoura no conjunto, que é o padrão registrado sete vezes no handoff da campanha anterior.

5984 → 6021, +37 linhas, irredutíveis nos chokepoints existentes: cada edição fica onde o `chatCore` já toma a decisão, e os helpers estão sob o cap. Coberto por `chatcore-translation-paths` (72/74; as 2 abertas são a issue diegosouzapw#13043).
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.

2 participants