@@ -37,11 +37,13 @@ interface ConfigureCommand {
3737 maxTurns ?: number ;
3838 cwd ?: string ;
3939 mcpServers ? : Record < string , unknown > ;
40+ resume ?: string ;
4041}
4142
4243interface PromptCommand {
4344 type : "prompt" ;
4445 text : string ;
46+ resume ?: string ;
4547}
4648
4749interface InterruptCommand {
@@ -60,6 +62,8 @@ let config: ConfigureCommand = {
6062} ;
6163
6264let activeQuery : Query | null = null ;
65+ // Track the Claude session ID so we can resume later
66+ let claudeSessionId : string | null = null ;
6367
6468// --- Helpers ---
6569
@@ -109,21 +113,69 @@ async function handlePrompt(cmd: PromptCommand): Promise<void> {
109113 options . mcpServers = config . mcpServers as Options [ "mcpServers" ] ;
110114 }
111115
116+ // Resume from a previous Claude session if requested
117+ // Priority: prompt command resume > config resume > auto-captured session ID
118+ const resumeId = cmd . resume || config . resume || claudeSessionId ;
119+ if ( resumeId ) {
120+ options . resume = resumeId ;
121+ const source = cmd . resume ? "prompt" : config . resume ? "config" : "auto" ;
122+ logError ( `resuming from session: ${ resumeId } (from ${ source } )` ) ;
123+ // Clear config.resume after first use so subsequent prompts don't re-resume from config
124+ if ( config . resume ) {
125+ config . resume = undefined ;
126+ }
127+ }
128+
129+ logError ( `handlePrompt: prompt="${ cmd . text . slice ( 0 , 100 ) } ", resume=${ resumeId || "none" } , model=${ options . model } , cwd=${ options . cwd } ` ) ;
130+
112131 try {
113132 activeQuery = query ( { prompt : cmd . text , options } ) ;
114133
115134 for await ( const message of activeQuery ) {
135+ // Capture the Claude session ID from messages for future resumption
136+ if ( "session_id" in message && typeof message . session_id === "string" ) {
137+ if ( ! claudeSessionId || claudeSessionId !== message . session_id ) {
138+ claudeSessionId = message . session_id ;
139+ logError ( `captured claude session_id: ${ claudeSessionId } ` ) ;
140+ }
141+ }
116142 emitMessage ( message ) ;
117143 }
118144
119- emit ( { type : "turn_complete" } ) ;
145+ logError ( `turn complete, claude_session_id=${ claudeSessionId } ` ) ;
146+ emit ( { type : "turn_complete" , claude_session_id : claudeSessionId } ) ;
120147 } catch ( err : unknown ) {
121- const message = err instanceof Error ? err . message : String ( err ) ;
122- if ( message . includes ( "abort" ) || message . includes ( "interrupt" ) ) {
148+ const errMsg = err instanceof Error ? err . message : String ( err ) ;
149+ const errStack = err instanceof Error ? err . stack : "" ;
150+ logError ( `prompt error: ${ errMsg } \n${ errStack } ` ) ;
151+ if ( errMsg . includes ( "abort" ) || errMsg . includes ( "interrupt" ) ) {
123152 emit ( { type : "interrupted" } ) ;
124153 } else {
125- logError ( `prompt error: ${ message } ` ) ;
126- emit ( { type : "error" , message } ) ;
154+ // If resume failed, try again without resume
155+ if ( resumeId ) {
156+ logError ( `resume failed, retrying without resume...` ) ;
157+ options . resume = undefined ;
158+ try {
159+ activeQuery = query ( { prompt : cmd . text , options } ) ;
160+ for await ( const message of activeQuery ) {
161+ if ( "session_id" in message && typeof message . session_id === "string" ) {
162+ if ( ! claudeSessionId || claudeSessionId !== message . session_id ) {
163+ claudeSessionId = message . session_id ;
164+ logError ( `captured claude session_id (retry): ${ claudeSessionId } ` ) ;
165+ }
166+ }
167+ emitMessage ( message ) ;
168+ }
169+ logError ( `retry turn complete, claude_session_id=${ claudeSessionId } ` ) ;
170+ emit ( { type : "turn_complete" , claude_session_id : claudeSessionId } ) ;
171+ } catch ( retryErr : unknown ) {
172+ const retryMsg = retryErr instanceof Error ? retryErr . message : String ( retryErr ) ;
173+ logError ( `retry also failed: ${ retryMsg } ` ) ;
174+ emit ( { type : "error" , message : retryMsg } ) ;
175+ }
176+ } else {
177+ emit ( { type : "error" , message : errMsg } ) ;
178+ }
127179 }
128180 } finally {
129181 activeQuery = null ;
@@ -200,7 +252,18 @@ async function main(): Promise<void> {
200252 }
201253}
202254
255+ process . on ( "uncaughtException" , ( err ) => {
256+ logError ( `uncaughtException: ${ err . message } \n${ err . stack } ` ) ;
257+ emit ( { type : "error" , message : `uncaughtException: ${ err . message } ` } ) ;
258+ } ) ;
259+
260+ process . on ( "unhandledRejection" , ( reason ) => {
261+ logError ( `unhandledRejection: ${ reason } ` ) ;
262+ emit ( { type : "error" , message : `unhandledRejection: ${ String ( reason ) } ` } ) ;
263+ } ) ;
264+
203265main ( ) . catch ( ( err ) => {
204266 logError ( `fatal: ${ err } ` ) ;
267+ emit ( { type : "error" , message : `fatal: ${ err instanceof Error ? err . message : String ( err ) } ` } ) ;
205268 process . exit ( 1 ) ;
206269} ) ;
0 commit comments