Skip to content

refactor(chatCore): extrai resolução de target-format para leaf puro (#3501) - #4533

Closed
diegosouzapw wants to merge 6 commits into
refactor/qg-chatcore-bgredirectfrom
refactor/qg-chatcore-targetformat
Closed

diegosouzapw wants to merge 6 commits into
refactor/qg-chatcore-bgredirectfrom
refactor/qg-chatcore-targetformat

Conversation

@diegosouzapw

Copy link
Copy Markdown
Owner

O quê

7º incremento da decomposição do god-file chatCore.ts (QG v2 Fase 9 T5, #3501). Move a resolução de wire target-format do topo de handleChatCore para o novo leaf puro open-sse/handlers/chatCore/targetFormat.ts (resolveChatCoreTargetFormat), ao lado de resolveChatCoreRequestSetup / resolveChatCoreRequestFormat.

Stacked sobre o #4526 (cadeia #4477 → #4491 → #4492 → #4507 → #4511 → #4526 → este). Base aponta para refactor/qg-chatcore-bgredirect; o GitHub re-aponta a cadeia automaticamente conforme os pais mergeiam.

Como (preservação de comportamento)

Gates

  • file-size: chatCore.ts neutro (4974, sem mudança — call+comentário compensam os 2 imports removidos); sem rebaseline.
  • complexity: 1905 = baseline 1905 (neutro).
  • typecheck:core: exit 0 (captura completa, 0 erros).
  • Testes: tests/unit/chatcore-target-format.test.ts — 5 casos asseridos contra a composição inline (responses short-circuit, delegação byte-idêntica, custom override quando não há registry format, fallback ao default do provider, alias de provider não-mapeado). chatcore-imports-cleanly ✓ + 163/163 na suíte chatcore completa (excluído só o translation-paths flaky pré-existente — que aliás passou numa execução isolada nesta sessão).

Nota: shrink de linhas neutro neste leaf — o valor é coesão + a lógica agora unit-testada e co-localizada com os outros resolvers de request-setup.

Extração de god-file sem mudança de comportamento em runtime.

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

diegosouzapw and others added 6 commits June 21, 2026 14:13
…3501)

Move o closure `recordKeyHealthStatus` (~56 ln) do topo de handleChatCore para
o novo leaf open-sse/handlers/chatCore/keyHealth.ts, byte-idêntico: 401 →
recordKeyFailure + persist sempre; 2xx → recordKeySuccess + persist só na
recuperação de warning/invalid; demais status apenas atualizam o set de
extra-keys. O handler mantém um closure fino de binding que repassa `log`, então
os 2 call sites ficam inalterados.

Imports que ficaram órfãos (recordKeyFailure / recordKeySuccess /
trackConnectionExtraKeys / KeyHealth) migram para o leaf; connectionHasExtraKeys
permanece (ainda usado no site de rotação) e updateProviderConnection é
importado em ambos (usado em vários pontos do handler).

chatCore.ts 5110->5055 (shrink -55); baseline file-size ratchetado.
complexity 1905=1905 (neutro). Coberto por
tests/unit/chatcore-key-health.test.ts (6 casos — transições in-memory do
apiKeyRotator: warning/invalid no threshold, recuperação 2xx, escopo por
selectedKeyId, no-op sem connectionId e em status fora de 401/2xx).
Move a construção do payload de persistCodexQuotaState para o novo leaf puro
open-sse/handlers/chatCore/codexQuota.ts (buildCodexQuotaPersistence): parseia
os headers de quota do Codex no snapshot codexQuotaState, faz passthrough do
providerSpecificData existente e, num 429 cuja janela (dual-window) passou do
threshold de exaustão, registra o cooldown por escopo (codexScopeRateLimitedUntil)
+ codexExhaustedWindow, retornando a mensagem de debug-log.

O handler mantém as partes impuras byte-idênticas e na mesma ordem: emitir o
exhaustionLog retornado, invalidateCodexQuotaCache em todo 429 (connectionId é
garantido pelo early-return), depois updateProviderConnection + mutação de
credentials. Imports órfãos (parseCodexQuotaHeaders/getCodexModelScope/
getCodexDualWindowCooldownMs) migram para o leaf; isCompactResponsesEndpoint
permanece (usado no site de passthrough).

chatCore.ts 5055->5019 (shrink -36); baseline file-size ratchetado.
complexity 1905=1905 (neutro). Coberto por
tests/unit/chatcore-codex-quota.test.ts (5 casos: sem-headers null,
snapshot+passthrough, 429 cooldown+janela+log, merge do scope-map, 429
abaixo-do-threshold no-op).
…ro (#3501)

Move o bloco de resolução de formato do topo de handleChatCore (endpointPath /
sourceFormat / isResponsesEndpoint / nativeCodexPassthrough / isDroidCLI /
copilotCompatibleReasoning / clientResponseFormat) para o novo leaf puro
open-sse/handlers/chatCore/requestFormat.ts (resolveChatCoreRequestFormat), ao
lado de resolveChatCoreRequestSetup (fase de request-setup). O handler agora
desestrutura o resultado, então todo uso downstream fica byte-idêntico.

A função local isCopilotClient (usada só por esse bloco) vira helper privado do
leaf; o import órfão detectFormatFromEndpoint migra junto (getTargetFormat
permanece no import de provider). shouldUseNativeCodexPassthrough e FORMATS
seguem importados no handler (re-exportado / usado em vários pontos).

chatCore.ts 5019->4993 (shrink -26, cruza abaixo de 5000); baseline file-size
ratchetado. complexity 1905=1905 (neutro). Coberto por
tests/unit/chatcore-request-format.test.ts (7 casos, incluindo o downgrade
OpenAI-Responses->OpenAI e sua supressão pelo Droid CLI).
…3501)

Move o bloco de effort-variant do Claude/Claude-Code do topo de handleChatCore
(strip de claude-...-{low,medium,high,xhigh,max} de volta ao id base + expõe o
nível como reasoning_effort; effort explícito do cliente vence; passthrough
nativo com sourceFormat==='claude' fica intocado) para o novo leaf
open-sse/handlers/chatCore/claudeEffortVariant.ts (applyClaudeEffortVariant). A
função muta o body in-place e retorna { effectiveModel, log }, que o handler
aplica (reatribuição de effectiveModel + log?.info), byte-idêntico.

Import órfão splitClaudeEffortSuffix migra para o leaf (getModelTargetFormat /
PROVIDER_ID_TO_ALIAS permanecem no import de providerModels);
isClaudeCodeCompatibleProvider e FORMATS seguem no handler (usados em outros
pontos). A detecção de effort explícito foi isolada no helper privado
hasExplicitClaudeEffort para manter applyClaudeEffortVariant abaixo do teto de
complexidade (16->≤15; mesmo padrão de resolveContextCachePin/
markConnectionLevelExhaustion).

chatCore.ts 4993->4978 (shrink -15); baseline file-size ratchetado.
complexity 1905=1905 (neutro). Coberto por
tests/unit/chatcore-claude-effort-variant.test.ts (7 casos).
…3501)

Move a decisão do Background Task Redirection (T41) do topo de handleChatCore
para o novo leaf open-sse/handlers/chatCore/backgroundRedirect.ts
(resolveBackgroundTaskRedirect). Retorna { backgroundReason, redirect }:
backgroundReason é o sinal de detecção (truthy quando a request parece tarefa de
background), threadado adiante na injeção de memory/skills; redirect é o downgrade
de modelo a aplicar (enabled + background + modelo com mapeamento diferente), ou
null. O handler mantém os efeitos byte-idênticos: log BACKGROUND, mutação de
model + body.model, e o audit routing.background_task_redirect.

Imports órfãos (getBackgroundDegradationConfig / getBackgroundTaskReason /
getDegradedModel) migram para o leaf; logAuditEvent permanece (usado em vários
pontos).

chatCore.ts 4978->4974 (shrink -4); baseline file-size ratchetado.
complexity 1905=1905 (neutro). Coberto por
tests/unit/chatcore-background-redirect.test.ts (5 casos via
setBackgroundDegradationConfig).
…3501)

Move a resolução de wire target-format do topo de handleChatCore para o novo
leaf puro open-sse/handlers/chatCore/targetFormat.ts (resolveChatCoreTargetFormat),
ao lado de resolveChatCoreRequestSetup/resolveChatCoreRequestFormat. Retorna
{ alias, targetFormat }: apiFormat==='responses' força OpenAI Responses; senão o
target-format do modelo no registry, depois o override custom (#2905), depois o
default do provider. O handler desestrutura — `alias` segue reusado downstream
ao remover o prefixo alias/ do model id upstream.

Imports órfãos (getModelTargetFormat / PROVIDER_ID_TO_ALIAS / getTargetFormat)
migram para o leaf; FORMATS permanece no handler (usado em vários pontos).

Tamanho de chatCore.ts neutro (call+comentário compensa os 2 imports removidos),
mas a lógica agora é unit-testada e co-localizada. complexity 1905=1905;
typecheck 0. Coberto por tests/unit/chatcore-target-format.test.ts (5 casos,
asseridos contra a composição inline).
@diegosouzapw

Copy link
Copy Markdown
Owner Author

Fechando: o churn de merge da virada v3.8.32→v3.8.33 desyncou esta cadeia. O conteúdo do target-format (e dos demais leaves perdidos) foi recuperado limpo no #4538, cherry-picado sobre o tip atual de release/v3.8.33.

@diegosouzapw
diegosouzapw deleted the refactor/qg-chatcore-targetformat branch June 23, 2026 13:13
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.

1 participant