From a91c0159b997c96bc336743ccd538e62cc20f2b3 Mon Sep 17 00:00:00 2001 From: JJ Lee Date: Wed, 16 Sep 2026 11:14:06 -0400 Subject: [PATCH] fix(engine): restore the #1218 empty-content final guard dropped in the wave-2 merge (#1236) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The wave-2 back-merge of main into dev (dfe3fbe1) hand-ported the 568306f8 reasoning->text conversion but dropped the separate #1218 final guard from provider/transform.ts: msgs = msgs.filter((msg) => !Array.isArray(msg.content) || msg.content.length > 0) This is the last line of defense against a message with content: [] reaching a provider SDK/API — the class of Bedrock session-wedge #1218 closed. dev kept main's transform.test.ts (the 'final empty content guard' describe block still asserts empty-content messages are dropped), so the implementation and its tests were out of sync on dev. The overlay's bun tests aren't run by any CI job (build-binary compiles the overlay but doesn't test it; 'fast' is the extension vitest), so the regression was silent — dev is CI-green with the guard gone. Restores the guard verbatim from main: transform.ts is now byte-identical to origin/main except Aaron's wave-2 provenance comment. manifest.json updated surgically (the single transform.ts content hash); drift_gate.mjs PASS. Co-authored-by: amicode-ci --- packages/app-bundle/manifest.json | 2 +- .../overlay/packages/opencode/src/provider/transform.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/app-bundle/manifest.json b/packages/app-bundle/manifest.json index d1395613..1537ac0e 100644 --- a/packages/app-bundle/manifest.json +++ b/packages/app-bundle/manifest.json @@ -401,7 +401,7 @@ "packages/opencode/src/provider/auth.ts": "b0ab1322c1039e27176bf9e3500603eae27506065ac141a69710220f3361f6b8", "packages/opencode/src/provider/error.ts": "7f3c8210c775e2ce98140bf015dc97e61192912af062c75e18ecb09ee2736a0f", "packages/opencode/src/provider/provider.ts": "671f6d8de83f919ddaa69b8240cacd82e2b8202ab505d4334175f2858bbd8c32", - "packages/opencode/src/provider/transform.ts": "e7962253385fb362a494999a96062f00824a190e666ab07be9486c08a3b20030", + "packages/opencode/src/provider/transform.ts": "d35a95a6092b5dd9cc8e37adb4d52f9ad9880d021cb3119c1d4abbc4b4fb0772", "packages/opencode/src/server/amicode/connections.ts": "dcfeeeddb380e11d8653c77e0dffa4ac3acabed4091f07f88b6ce0c7ae5772b3", "packages/opencode/src/server/amicode/credentials.ts": "f3a15c82496f9a3b6e8c1006a6a4ab419a02156e9a93a43c6c2319632c30063f", "packages/opencode/src/server/amicode/dashboard.ts": "031a4f40bfdc847984a1deecfefbe0fd27f42cbd1caf8823dc43c7eb5bcb9af0", diff --git a/packages/app-bundle/overlay/packages/opencode/src/provider/transform.ts b/packages/app-bundle/overlay/packages/opencode/src/provider/transform.ts index d64c349f..61c1c49f 100644 --- a/packages/app-bundle/overlay/packages/opencode/src/provider/transform.ts +++ b/packages/app-bundle/overlay/packages/opencode/src/provider/transform.ts @@ -557,6 +557,13 @@ export function message(msgs: ModelMessage[], model: Provider.Model, options: Re }) } + // Final guard: no provider accepts a message with an empty content array. + // Provider-specific filters above (Anthropic, Bedrock) catch most cases, but + // edge cases slip through — e.g. reasoning-only turns whose parts are all + // stripped, or cross-provider history replay. Drop them here so no downstream + // SDK or API sees content: []. + msgs = msgs.filter((msg) => !Array.isArray(msg.content) || msg.content.length > 0) + return msgs }