@@ -385,14 +385,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
385385 const result = handleResultMessage ( message ) ;
386386 if ( result . error ) throw result . error ;
387387
388- switch ( message . subtype ) {
389- case "error_max_budget_usd" :
390- case "error_max_turns" :
391- case "error_max_structured_output_retries" :
392- return { stopReason : "max_turn_requests" , usage } ;
393- default :
394- return { stopReason : "end_turn" , usage } ;
395- }
388+ return { stopReason : result . stopReason ?? "end_turn" , usage } ;
396389 }
397390
398391 case "stream_event" :
@@ -420,6 +413,14 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
420413 }
421414 }
422415
416+ // Skip replayed user messages that aren't pending prompts
417+ if (
418+ "isReplay" in message &&
419+ ( message as Record < string , unknown > ) . isReplay
420+ ) {
421+ break ;
422+ }
423+
423424 // Store latest assistant usage (excluding subagents)
424425 if (
425426 "usage" in message . message &&
@@ -451,6 +452,8 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
451452 case "tool_progress" :
452453 case "auth_status" :
453454 case "tool_use_summary" :
455+ case "prompt_suggestion" :
456+ case "rate_limit_event" :
454457 break ;
455458
456459 default :
@@ -459,6 +462,28 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
459462 }
460463 }
461464 throw new Error ( "Session did not end in result" ) ;
465+ } catch ( error ) {
466+ if ( error instanceof RequestError || ! ( error instanceof Error ) ) {
467+ throw error ;
468+ }
469+ const msg = error . message ;
470+ if (
471+ msg . includes ( "ProcessTransport" ) ||
472+ msg . includes ( "terminated process" ) ||
473+ msg . includes ( "process exited with" ) ||
474+ msg . includes ( "process terminated by signal" ) ||
475+ msg . includes ( "Failed to write to process stdin" )
476+ ) {
477+ this . logger . error ( `Process died: ${ msg } ` , {
478+ sessionId : this . sessionId ,
479+ } ) ;
480+ this . session . input . end ( ) ;
481+ throw RequestError . internalError (
482+ undefined ,
483+ "The Claude Agent process exited unexpectedly. Please start a new session." ,
484+ ) ;
485+ }
486+ throw error ;
462487 } finally {
463488 if ( ! handedOff ) {
464489 this . session . promptRunning = false ;
@@ -704,6 +729,13 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
704729 }
705730 } catch ( err ) {
706731 settingsManager . dispose ( ) ;
732+ if (
733+ isResume &&
734+ err instanceof Error &&
735+ err . message === "Query closed before response received"
736+ ) {
737+ throw RequestError . resourceNotFound ( sessionId ) ;
738+ }
707739 this . logger . error (
708740 isResume
709741 ? forkSession
0 commit comments