@@ -32,8 +32,9 @@ import {
3232const OPAQUE_SECRET = "opaque credential with spaces?!" ;
3333const RAW_DIAGNOSTIC = `\u001b[31mPOST https://provider.invalid returned\n credential ${ OPAQUE_SECRET } in response body\u001b[0m` ;
3434const NORMALIZED_DIAGNOSTIC = `POST https://provider.invalid returned credential ${ OPAQUE_SECRET } in response body` ;
35- const SAFE_MESSAGE =
36- 'test-provider Provider failed (fatal). Try again or switch models with "/model".' ;
35+ const SCRUBBED_DIAGNOSTIC =
36+ "POST https://provider.invalid returned credential [redacted: configured credential] in response body" ;
37+ const SAFE_MESSAGE = `test-provider Provider failed (fatal): ${ SCRUBBED_DIAGNOSTIC } . Try again or switch models with "/model".` ;
3738const provider = {
3839 providerName : "test-provider" ,
3940 baseURL : "http://localhost" ,
@@ -282,6 +283,35 @@ describe("resolved sub-agent provider failures", () => {
282283 expect ( JSON . stringify ( observed ) ) . not . toContain ( RAW_DIAGNOSTIC ) ;
283284 } ) ;
284285
286+ test ( "xAI 400 mailbox line lifts the nested diagnostic from raw" , async ( ) => {
287+ const caught = await withResolvedProviderRun (
288+ async ( run , cwd ) => {
289+ try {
290+ await run ( {
291+ ...runParams ( cwd ) ,
292+ provider : { ...provider , providerName : "xai/default-2" } ,
293+ } ) ;
294+ } catch ( error ) {
295+ return error ;
296+ }
297+ throw new Error ( "expected runSubAgent to reject" ) ;
298+ } ,
299+ {
300+ category : "fatal" ,
301+ message : "Bad Request" ,
302+ statusCode : 400 ,
303+ raw : { error : { message : "Invalid request: recursive JSON schema" } } ,
304+ } ,
305+ ) ;
306+ expect ( isResolvedProviderFailureError ( caught ) ) . toBe ( true ) ;
307+ expect ( ( caught as ResolvedProviderFailureError ) . message ) . toContain (
308+ "Invalid request: recursive JSON schema" ,
309+ ) ;
310+ expect ( ( caught as ResolvedProviderFailureError ) . message ) . not . toContain (
311+ "Bad Request" ,
312+ ) ;
313+ } ) ;
314+
285315 test ( "split spawn_agent and wait_agents return only the safe message" , async ( ) => {
286316 await withResolvedProviderRun ( async ( run , cwd ) => {
287317 const { sessions, agentId, waitResult } = await spawnAndWait (
@@ -326,8 +356,7 @@ describe("resolved sub-agent provider failures", () => {
326356 cwd ,
327357 "rejected provider failure" ,
328358 ) ;
329- const safeFailure =
330- "test-provider Provider failed (retryable). Try again." ;
359+ const safeFailure = `test-provider Provider failed (retryable): ${ SCRUBBED_DIAGNOSTIC } . Try again.` ;
331360
332361 const serialized = JSON . stringify ( waitResult ) ;
333362 expect ( serialized ) . toContain ( safeFailure ) ;
@@ -351,15 +380,14 @@ describe("resolved sub-agent provider failures", () => {
351380 message : RAW_DIAGNOSTIC ,
352381 statusCode : 500 ,
353382 } ,
354- expected : " test-provider Provider failed (retryable). Try again." ,
383+ expected : ` test-provider Provider failed (retryable): ${ SCRUBBED_DIAGNOSTIC } . Try again.` ,
355384 } ,
356385 {
357386 error : { category : "protocol_mismatch" , message : RAW_DIAGNOSTIC } ,
358- expected :
359- 'test-provider Provider failed (protocol_mismatch). Switch models with "/model".' ,
387+ expected : `test-provider Provider failed (protocol_mismatch): ${ SCRUBBED_DIAGNOSTIC } . Switch models with "/model".` ,
360388 } ,
361389 ] satisfies { error : InferenceErrorLike ; expected : string } [ ] ) (
362- "preserves $error.category guidance without exposing its diagnostic" ,
390+ "preserves $error.category guidance and the scrubbed diagnostic" ,
363391 async ( { error, expected } ) => {
364392 const caught = await withResolvedProviderRun ( async ( run , cwd ) => {
365393 try {
@@ -434,7 +462,7 @@ describe("resolved sub-agent provider failures", () => {
434462 expect ( resolved . category ) . toBe ( "retryable" ) ;
435463 expect ( resolved . statusCode ) . toBe ( 503 ) ;
436464 expect ( resolved . message ) . toBe (
437- " test-provider Provider failed (retryable). Try again." ,
465+ ` test-provider Provider failed (retryable): still failing . Try again.` ,
438466 ) ;
439467 } ) ;
440468
0 commit comments