@@ -732,6 +732,10 @@ export function formatAssistantErrorText(
732732 ) ;
733733 }
734734
735+ if ( isToolUseResultMismatchError ( raw ) ) {
736+ return "Conversation history corruption detected. Please use /new to start a fresh session." ;
737+ }
738+
735739 const invalidRequest = raw . match ( / " t y p e " : " i n v a l i d _ r e q u e s t _ e r r o r " .* ?" m e s s a g e " : " ( [ ^ " ] + ) " / ) ;
736740 if ( invalidRequest ?. [ 1 ] ) {
737741 return `LLM request rejected: ${ invalidRequest [ 1 ] } ` ;
@@ -782,6 +786,10 @@ export function sanitizeUserFacingText(text: string, opts?: { errorContext?: boo
782786 ) ;
783787 }
784788
789+ if ( isToolUseResultMismatchError ( trimmed ) ) {
790+ return "Conversation history corruption detected. Please use /new to start a fresh session." ;
791+ }
792+
785793 if ( shouldRewriteContextOverflowText ( trimmed ) ) {
786794 return (
787795 "Context overflow: prompt too large for the model. " +
@@ -827,6 +835,9 @@ const TOOL_CALL_INPUT_MISSING_RE =
827835const TOOL_CALL_INPUT_PATH_RE =
828836 / m e s s a g e s \. \d + \. c o n t e n t \. \d + \. t o o l _ (?: u s e | c a l l ) \. (?: i n p u t | a r g u m e n t s ) / i;
829837
838+ const TOOL_USE_RESULT_MISMATCH_RE =
839+ / t o o l _ u s e _ i d | t o o l _ r e s u l t .* c o r r e s p o n d i n g .* t o o l _ u s e | u n e x p e c t e d .* t o o l .* b l o c k / i;
840+
830841const IMAGE_DIMENSION_ERROR_RE =
831842 / i m a g e d i m e n s i o n s e x c e e d m a x a l l o w e d s i z e f o r m a n y - i m a g e r e q u e s t s : \s * ( \d + ) \s * p i x e l s / i;
832843const IMAGE_DIMENSION_PATH_RE = / m e s s a g e s \. ( \d + ) \. c o n t e n t \. ( \d + ) \. i m a g e / i;
@@ -839,6 +850,13 @@ export function isMissingToolCallInputError(raw: string): boolean {
839850 return TOOL_CALL_INPUT_MISSING_RE . test ( raw ) || TOOL_CALL_INPUT_PATH_RE . test ( raw ) ;
840851}
841852
853+ export function isToolUseResultMismatchError ( raw : string ) : boolean {
854+ if ( ! raw ) {
855+ return false ;
856+ }
857+ return TOOL_USE_RESULT_MISMATCH_RE . test ( raw ) ;
858+ }
859+
842860export function isBillingAssistantError ( msg : AssistantMessage | undefined ) : boolean {
843861 if ( ! msg || msg . stopReason !== "error" ) {
844862 return false ;
0 commit comments