Skip to content

fix(chat): answer 400 when the JSON body is not an object - #16668

Merged
diegosouzapw merged 2 commits into
cheaper-inference:release/v3.8.52from
pacocartones:fix/chat-non-object-body-400
Oct 15, 2026
Merged

diegosouzapw merged 2 commits into
cheaper-inference:release/v3.8.52from
pacocartones:fix/chat-non-object-body-400

Conversation

@pacocartones

Copy link
Copy Markdown
Contributor

Summary

  • A JSON body that is valid JSON but not an object (null, a string, a number or true) made handleChat throw (Cannot use 'in' operator to search for 'messages' in x, Cannot convert undefined or null to object) and the request ended as a 500. Two measurements, kept apart: calling the real route POST functions, /v1/chat/completions fails for a string, a number and true (3 values; null there was already a 400 Invalid JSON body), and /v1/messages and /v1/completions fail for all four values (8 combinations, 11 with the three from /v1/chat/completions); calling handleChat directly, as the test does, all 12 combinations (4 values on 3 paths) throw.
  • Root cause: handleChat parses the body and goes on to "messages" in msgBody and Object.keys(body) without checking that it is an object. /v1/responses already answers the same input with a 400 Request body must be a JSON object; this adds the same guard, with the same message, right after the body is parsed in src/sse/handlers/chat.ts.
  • Impact: a malformed request now gets an error response to that same request instead of a thrown TypeError; other clients and the process are unaffected either way. This is input validation, not a crash fix.

Related Issues

Target Branch

  • Base is the active release/v3.8.x branch (the highest open release/v*), not main

Proof Of Fix (required)

  • TDD (preferred) — a test that fails before the fix and passes after it.
    • Test file(s): tests/unit/chat-non-object-body.test.ts
    • Failing output before the fix (through handleChat, 12 of 12 combinations): all fail with expected 400, got 500: Cannot use 'in' operator to search for 'messages' in null (the same error naming each value: in x, in 5, in true)

Tests Added Or Updated

  • tests/unit/chat-non-object-body.test.ts: null, a string, a number and true, each posted to /v1/chat/completions, /v1/messages and /v1/completions through createChatPipelineHarness, assert a 400 with Request body must be a JSON object.

Coverage Notes

  • Exercises handleChat (the shared handler of the three routes). The neighbouring chat-messages-entry-objects-12643 test keeps passing.

Scope

  • Only the files the failing test proves need changing are touched (src/sse/handlers/chat.ts, the test and the changelog fragment)
  • No test was weakened or deleted to make the suite pass

Validation

  • Change type: other (chat request validation)
  • Focused tests: the new test (12) and chat-messages-entry-objects-12643 pass; check:ai-attribution and check:changelog-integrity pass; eslint reports the same 8 existing problems in chat.ts as the base and none new.

Reviewer Notes

  • An array body is not changed here: it already gets the existing messages: Expected array 400.

diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…s, settings and providers routes (#16671)

This PR: POST /api/logs/detail, PATCH and PUT /api/settings, DELETE /api/providers answer 400 for a non-object JSON body. Covered by tests/unit/mgmt-null-json-body-400.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…ashboard and management list routes (#16661)

This PR: non-integer limit, offset and page answer 400 on the management list routes via src/lib/api/queryIntegerParam.ts. Covered by tests/unit/mgmt-list-params-validation.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…assthrough (#16614)

This PR: a numeric delta.content stays string text. Covered by tests/unit/openai-numeric-delta-content.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…d DeepInfra builders (#16609)

This PR: a null rerank document becomes an empty passage for NVIDIA and DeepInfra. Covered by tests/unit/rerank-null-document.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…sconnects (#16607)

This PR: devin-cli does not write to a stream after the client disconnects. Covered by tests/unit/devin-cli-client-disconnect.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
… stream end (#16606)

This PR: an unclosed invoke or tool_call tail is released as text when the stream ends. Covered by tests/unit/openai-to-claude-unclosed-invoke-tail.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…etadata (#16556)

This PR: combo metadata honours a member max_output_tokens override. Covered by tests/unit/16515-combo-max-output-override.test.ts. catalog.ts stays under its frozen ceiling.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…reaming path does (#16544)

This PR: non-streaming Claude stop reasons are normalized the same way as the streaming path. Covered by tests/unit/claude-nonstream-stop-reasons.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…es client as incomplete (#16517)

This PR: a truncated non-streaming Chat turn reaches a Responses client as incomplete. Covered by tests/unit/responses-client-incomplete-nonstreaming.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…th length for Chat clients (#16507)

This PR: a truncated non-streaming Responses turn finishes with length for Chat clients. Covered by tests/unit/responses-incomplete-nonstreaming-chat.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…f raw or clean stop reasons (#16501)

This PR: Claude clients receive refusal and max_tokens instead of a raw or clean stop. Covered by tests/unit/claude-client-stop-reasons.test.ts.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
The guard still answers null, string, number, and true with 400. It now lives in admissionRejectionLog, and chat.ts keeps one call so the frozen file stays at 2697 lines.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
This PR: the SambaNova free catalog matches that provider's free-tier table (MiniMax and Llama-4 leave the free catalog, DeepSeek-V3.1 and gemma-4-31B-it join it, curated date 2026-10-10). Covered by tests/unit/sambanova-free-models-2026-10.test.ts. The SVG label change is a screenshot, not an agent-instruction surface.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…#16620)

This PR: real Spanish translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…ish (#16641)

This PR: real Vietnamese translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…#16630)

This PR: real Russian translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
#16633)

This PR: real Japanese translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…16636)

This PR: real Korean translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…t in English (#16639)

This PR: real Traditional Chinese translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…#16647)

This PR: real Turkish translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…16649)

This PR: real Polish translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…16650)

This PR: real Dutch translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…ish (#16651)

This PR: real Indonesian translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
@diegosouzapw
diegosouzapw merged commit 54a15c3 into cheaper-inference:release/v3.8.52 Oct 15, 2026
8 of 9 checks passed
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…sh (#16656)

This PR: real Ukrainian translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…16657)

This PR: real Thai translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…16658)

This PR: real Hindi translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…16659)

This PR: real Arabic translations of UI strings that were still in English. Replacements in that locale file only, no new keys. The inherited my/phi ratio gap on the release tip was left untouched.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…nput[] (#16615)

This PR: a null or non-object entry in tools[], and a null entry in input[], is answered with 400 ("tools: Expected array of objects" / "input: Expected array of objects or strings") instead of a 500. Plain string items in input stay valid. Covered by tests/unit/chat-tools-input-entry-objects.test.ts.

The checks live in admissionRejectionLog.rejectPayload, which chat.ts already calls. chat.ts stays byte-identical to the release tip, at the 2697-line ceiling. The non-object body guard from #16668 is unchanged.

Validated on the contributor branch after that move. tests/unit/chat-tools-input-entry-objects.test.ts (3) and tests/unit/chat-non-object-body.test.ts (12) passed, 15/15. The combined pacocartones board 5a429eab had already passed 82 focused tests; complexity 3038 (baseline 3218) and cognitive 1401 (baseline 1437).

typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 15, 2026
…journal (#16193)

Reconciled onto origin/release/v3.8.52 (a598d20) in `.claude/worktrees/16193-tip`.

Unknown previous-response rejections now land in the request journal. The overlap with #16668's `rejectPayload`, and with #16615's checks for null or non-object `tools[]` and `input[]` entries, was kept on both sides. A non-object JSON body, a bad tools or input entry, and `previous_response_not_found` all still answer 400. `chat.ts` is 2695 lines, under the frozen ceiling of 2697.

Focused tests after that reconciliation: `handler-rejection-call-log.test.ts` and `chat-tools-input-entry-objects.test.ts`, 11 passed, 0 failed.

CI on the previous head matches the inherited release-branch reds. ⚠️ base-red inherited: #15306

Thank you @maxmad64bis.
diegosouzapw pushed a commit that referenced this pull request Oct 16, 2026
This PR: XP numbers use the UI locale. Covered by tests/unit/ui/profile-xp-locale.test.tsx.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed. The isolated vitest rerun of tests/unit/ui/profile-xp-locale.test.tsx timed out under load before any assertion (import 363s, default timeout 5000ms). The operator authorized this squash.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
diegosouzapw pushed a commit that referenced this pull request Oct 16, 2026
This PR: the profile badge detail panel is a modal dialog. Covered by tests/unit/ui/profile-badge-dialog.test.tsx.

Validated on the combined pacocartones board 5a429eab (30 PRs, clean merges, each refs/prs/N ancestor of HEAD) against release/v3.8.52.

Focused node tests on that tree: 82 passed, 0 failed. The isolated vitest rerun of tests/unit/ui/profile-badge-dialog.test.tsx never started: the worker timed out under load. The operator authorized this squash.
typecheck:core is red only on lines that already exist on origin/release/v3.8.52 (open-sse/translator/request/openai-to-claude.ts and open-sse/utils/dsmlToolCalls.ts are byte-identical; the never-typed pushes in response/openai-to-claude.ts sit outside this batch's hunks).
open-sse typecheck reports 3 errors in files byte-identical to origin/release/v3.8.52 (copilotAutoModel.ts TS2339 x2, request/openai-responses.ts TS2345 x1). The baseline was not widened.
Changelog integrity passed. File-size growth is confined to src/sse/handlers/chat.ts and is handled on #16668/#16615, not in this PR.

⚠️ base-red inherited: #15306

Thanks @pacocartones.
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