fix(providers): stop an unrelated-provider tiktoken bundling failure from crashing /api/providers - #12355
Merged
diegosouzapw merged 1 commit intoSep 3, 2026
Conversation
…from crashing /api/providers /api/providers statically imported chatgptWebCodexAdmin.ts at module scope even though it's only used inside the one provider === "chatgpt-web-codex" branch. That module's transitive chain (the vendor ChatGPT-Web browser adapter -> token-estimate.ts -> tiktoken's WASM tokenizer) fails to bundle under Turbopack dev mode even with tiktoken listed in serverExternalPackages (the standalone Node require works fine; only Turbopack's bundling of this specific import graph doesn't). A static import evaluated that whole chain on every request regardless of which provider was actually being managed, turning an unrelated provider's bundling bug into a route-wide 500 for everyone. Found the same pattern one layer deeper: validation/chatgptWebCodex.ts (a per-provider validator re-exported through the shared @/lib/providers/validation barrel every provider validator's callers pull in) also statically imported detectChromeExecutable from the same executors/chatgpt-web-codex.ts module, crashing anyone who merely imported the barrel -- including code with nothing to do with chatgpt-web-codex. Made both imports lazy, loaded only when the chatgpt-web-codex branch actually runs. Observed live: this crash cascaded into the combos dashboard page appearing to have zero combos. The page's fetchData() awaits four parallel requests sequentially and calls .json() on each before ever calling setCombos() -- an unrelated /api/providers 500 (Next.js dev mode returns an HTML error page, not JSON, for an uncaught exception) threw inside that sequence and aborted the whole function before the combos fetch's own successful response was ever applied to state, even though combos itself returned 200 with the correct data every time. Also fixes a related SSR/hydration bug found investigating the same symptom: the combos page's showUsageGuide state used a useState lazy initializer that read localStorage directly. SSR has no localStorage, so the server always computed "not dismissed" while the client could compute a different real value -- a hydration mismatch that forces React to discard and remount the client tree in dev mode, which could interrupt the fetch effect's in-flight state update. Moved the localStorage read into a mount effect instead, matching the SSR-safe default on both passes.
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 1, 2026
…er tiktoken bundling failure from crashing /api/providers) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
…er tiktoken bundling failure from crashing /api/providers) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
…er tiktoken bundling failure from crashing /api/providers) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
…er tiktoken bundling failure from crashing /api/providers) into dev/omniroute-dev-combined
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 2, 2026
…er tiktoken bundling failure from crashing /api/providers) into dev/omniroute-dev-combined
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
… faster (#12293) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…o the client (#12447) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…e output_index (#12445) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…2446) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…pty output array (#12460) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…t scoping, silent-failure logging (#12338) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…erf fixes (#12448) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 4, 2026
…g conversation (#12646) Validado sobre o tip de `release/v3.8.51`, com duas coisas resolvidas antes do merge. **A falha de CI era stale.** O job `No new ESLint warnings` deste PR apontava `react-hooks/set-state-in-effect` em `src/app/(dashboard)/dashboard/combos/page.tsx:774` — arquivo que este PR não toca, e o mesmo erro aparecia em #12668 e #12672, que também não o tocam. A linha do tempo: o #12355 introduziu a violação de manhã, os CIs rodaram nessa janela, e o #12607 acrescentou a entrada de supressão à tarde. Medido no tip atual com o comando exato do job: **0 ocorrências não suprimidas**. A supressão sobrevivente é "unpruned", e o script passa `--pass-on-unpruned-suppressions` justamente para isso não bloquear. **Faltava o teste que a regra do projeto exige** para mudanças em `src/`. Acrescentei `tests/unit/ui/log-detail-conversation-link-12646.test.tsx`, verificado **RED-then-GREEN** em vez de escrito contra o código pronto: revertendo `RequestLoggerDetail.sections.tsx` para o tip, 2 dos 3 casos falham; com a mudança deste PR, 3/3 passam. Detalhe que valeu a pena descobrir: a seção curto-circuita em `allTurns.length === 0`, então o fixture precisa de um `requestBody` que normalize em pelo menos um turno — sem isso o cabeçalho inteiro nunca monta e as asserções passariam pelo motivo errado. O teste fixa três coisas: o href para um `sessionTag` simples, o percent-encoding para um que não é URL-safe, e a ausência de link quando não há `sessionTag`. Obrigado, @hartmark.
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Sep 15, 2026
…pi/providers/[id] diegosouzapw#12355 fixed a static top-level import of chatgptWebCodexAdmin.ts in src/app/api/providers/route.ts (the collection route): that module's transitive chain (the vendor ChatGPT-Web browser adapter -> token-estimate.ts -> tiktoken's WASM tokenizer) fails to bundle under Turbopack dev mode even with tiktoken listed in serverExternalPackages (the standalone Node require works fine; only Turbopack's bundling of this specific import graph doesn't). A static import evaluated that whole chain on every request regardless of provider, turning an unrelated provider's bundling bug into a route-wide 500 for everyone. diegosouzapw#12355 only touched the collection route and missed the identical pattern in the by-id route (PUT /api/providers/[id]) -- observed live: renaming a plain openai-compatible connection's name failed with "Missing tiktoken_bg.wasm" after 17-50s, having never touched chatgpt-web-codex at all. diegosouzapw#12355 also shipped with no regression test, which is exactly how this sibling instance went unnoticed for a week. Fix: same pattern as diegosouzapw#12355 -- move the import into a lazy `await import(...)` inside the one `provider === "chatgpt-web-codex"` branch that actually needs it. New regression test (tests/unit/providers-chatgpt-web-codex-lazy-import-12355.test.ts) source-inspects both general provider routes (route.ts and [id]/route.ts) to assert neither statically imports chatgptWebCodexAdmin.ts, and confirms the one legitimately-static import (the chatgpt-web-codex-only "doctor" diagnostic route, where every request already is that provider) is left alone. Matches the existing tests/unit/instrumentation-import-graph-12074.test.ts pattern for import-graph invariants that can't be exercised by actually bundling under Turbopack from this harness. Confirmed it fails against the pre-fix route.ts (static import present) and passes after the fix. Evidence: - node --test tests/unit/providers-chatgpt-web-codex-lazy-import-12355.test.ts: 3/3 pass - node --test tests/unit/providers-route-patch-method.test.ts tests/unit/codex-connection-edit-6562.test.ts tests/unit/chatgpt-web-management-retirement.test.ts tests/unit/provider-patch-ratelimit-protection-11278.test.ts: 11/11 pass (unaffected) - eslint on both touched files: clean - Live-verified against the exact failing request: PUT /api/providers/{id} renaming a llama-cpp connection, previously 500 after 17-50s with "Missing tiktoken_bg.wasm", now 200 in 0.83s. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bl0ck154
pushed a commit
to Bl0ck154/OmniRoute
that referenced
this pull request
Sep 19, 2026
… faster (diegosouzapw#12293) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
… faster (diegosouzapw#12293) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…from crashing /api/providers (diegosouzapw#12355) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…o the client (diegosouzapw#12447) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…e output_index (diegosouzapw#12445) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…egosouzapw#12446) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…pty output array (diegosouzapw#12460) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…zapw#12461) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…t scoping, silent-failure logging (diegosouzapw#12338) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…erf fixes (diegosouzapw#12448) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51` (já com a leva anterior dentro): os nove boardaram **sem um único conflito**, `typecheck:core` limpo e **80/80** nos 6 arquivos de teste que os PRs trazem. O crescimento de arquivo próprio da leva foi rebaselinado num registro datado (`_rebaseline_2026_09_03_hartmark_batch`): `combos/page.tsx` 5012→5018 (diegosouzapw#12355, tratar o estado degradado quando o bundling de tiktoken de um provider sem relação falha) e `open-sse/services/combo.ts` 4023→4036 (diegosouzapw#12338, os fixes do universal-handoff). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva. Obrigado, @hartmark.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…g conversation (diegosouzapw#12646) Validado sobre o tip de `release/v3.8.51`, com duas coisas resolvidas antes do merge. **A falha de CI era stale.** O job `No new ESLint warnings` deste PR apontava `react-hooks/set-state-in-effect` em `src/app/(dashboard)/dashboard/combos/page.tsx:774` — arquivo que este PR não toca, e o mesmo erro aparecia em diegosouzapw#12668 e diegosouzapw#12672, que também não o tocam. A linha do tempo: o diegosouzapw#12355 introduziu a violação de manhã, os CIs rodaram nessa janela, e o diegosouzapw#12607 acrescentou a entrada de supressão à tarde. Medido no tip atual com o comando exato do job: **0 ocorrências não suprimidas**. A supressão sobrevivente é "unpruned", e o script passa `--pass-on-unpruned-suppressions` justamente para isso não bloquear. **Faltava o teste que a regra do projeto exige** para mudanças em `src/`. Acrescentei `tests/unit/ui/log-detail-conversation-link-12646.test.tsx`, verificado **RED-then-GREEN** em vez de escrito contra o código pronto: revertendo `RequestLoggerDetail.sections.tsx` para o tip, 2 dos 3 casos falham; com a mudança deste PR, 3/3 passam. Detalhe que valeu a pena descobrir: a seção curto-circuita em `allTurns.length === 0`, então o fixture precisa de um `requestBody` que normalize em pelo menos um turno — sem isso o cabeçalho inteiro nunca monta e as asserções passariam pelo motivo errado. O teste fixa três coisas: o href para um `sessionTag` simples, o percent-encoding para um que não é URL-safe, e a ausência de link quando não há `sessionTag`. Obrigado, @hartmark.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/api/providers(and every barrel importer of@/lib/providers/validation) 500'd on every single request, caused by an unrelated provider's WASM tokenizer failing to bundle under Turbopack dev mode. Traced live: this cascaded into the combos dashboard appearing to have zero combos despitecontext_handoffs... er,/api/combosgenuinely returning the right data every time.What was actually happening
src/app/api/providers/route.tsstatically importsfinalizeValidatedChatGptWebCodexSecretsfromchatgptWebCodexAdmin.tsat module scope, even though it's only used inside the oneprovider === "chatgpt-web-codex"branch.token-estimate.ts→tiktoken's WASM tokenizer) fails to bundle under Turbopack dev mode -- even withtiktokenalready listed inserverExternalPackages(confirmed: the standalone Noderequire()works fine; only Turbopack's bundling of this specific import graph doesn't).validation/chatgptWebCodex.ts(a per-provider validator re-exported through the shared@/lib/providers/validationbarrel that every provider validator's callers pull in) also statically importsdetectChromeExecutablefrom the sameexecutors/chatgpt-web-codex.tsmodule -- crashing anyone who merely imports the barrel, including code with nothing to do with chatgpt-web-codex.Observed cascading effect: the combos dashboard page's
fetchData()awaits four parallel requests (combos,providers,combos/metrics,provider-nodes) sequentially and calls.json()on each before ever callingsetCombos(). Next.js dev mode returns an HTML error page (not JSON) for an uncaught exception, so/api/providers's 500 threw inside that sequence and aborted the whole function before the combos fetch's own successful response was ever applied to state -- even though/api/combositself returned200with the correct single combo every single time it was called standalone.Also fixes a related, independently-discovered SSR/hydration bug in the same page:
showUsageGuide'suseStatelazy initializer readlocalStoragedirectly. SSR has nolocalStorage, so the server always computed "not dismissed" while the client could compute a different real value -- a hydration mismatch that forces React to discard and remount the client tree in dev mode, which could interrupt the fetch effect's in-flight state update. Moved the read into a mount effect instead.Fix
Made both
chatgptWebCodexAdmin.tsandexecutors/chatgpt-web-codex.tsimports dynamic (await import(...)), loaded only when thechatgpt-web-codexbranch actually runs, at both call sites. No behavior change to the validation logic itself.User Impact
/api/providers(and anything importing the shared validation barrel) no longer crashes because of an unrelated provider's bundling issue.showUsageGuideSSR/hydration mismatch is gone.Validation
call_logs/server logs, applied the fix, confirmed/api/providersreturns200and the combos page shows the existing combo again after a full restart.tests/unit/chatgpt-web-codex.test.ts,tests/unit/providers-route-codex-account-pool.test.ts,tests/unit/providers-route-managed-catalog.test.ts,tests/unit/providers-route-model-autofetch-optin.test.ts,tests/unit/providers-route-patch-method.test.ts,tests/unit/provider-journey.contract.test.ts-- 50/50 pass.upstream/release/v3.8.51tip at branch time.