@@ -723,6 +723,100 @@ test("replySession reports a new prompt with the machineId token", async () => {
723723 assert . equal ( ( fetchCalls [ 0 ] . init ?. headers as Record < string , string > ) . Token , "machine-id-456" ) ;
724724} ) ;
725725
726+ test ( "replySession continues without appending /continue as a user message" , async ( ) => {
727+ const workspace = createTempDir ( "deepcode-continue-workspace-" ) ;
728+ const home = createTempDir ( "deepcode-continue-home-" ) ;
729+ setHomeDir ( home ) ;
730+
731+ const fetchCalls : Array < { input : string | URL ; init ?: RequestInit } > = [ ] ;
732+ globalThis . fetch = ( async ( input : string | URL , init ?: RequestInit ) => {
733+ fetchCalls . push ( { input, init } ) ;
734+ return {
735+ ok : true ,
736+ text : async ( ) => "" ,
737+ } as Response ;
738+ } ) as typeof fetch ;
739+
740+ const manager = createSessionManager ( workspace , "machine-id-continue" ) ;
741+ const activatedSessionIds : string [ ] = [ ] ;
742+ ( manager as any ) . activateSession = async ( sessionId : string ) => {
743+ activatedSessionIds . push ( sessionId ) ;
744+ } ;
745+
746+ const sessionId = await manager . createSession ( { text : "first prompt" } ) ;
747+ await flushPromises ( ) ;
748+ const messagesBefore = manager . listSessionMessages ( sessionId ) ;
749+ fetchCalls . length = 0 ;
750+ activatedSessionIds . length = 0 ;
751+
752+ await manager . replySession ( sessionId , { text : "/continue" } ) ;
753+ await flushPromises ( ) ;
754+
755+ const messagesAfter = manager . listSessionMessages ( sessionId ) ;
756+ const userMessages = messagesAfter . filter ( ( message ) => message . role === "user" ) ;
757+
758+ assert . equal ( activatedSessionIds . length , 1 ) ;
759+ assert . equal ( activatedSessionIds [ 0 ] , sessionId ) ;
760+ assert . equal ( messagesAfter . length , messagesBefore . length ) ;
761+ assert . equal (
762+ userMessages . some ( ( message ) => message . content === "/continue" ) ,
763+ false
764+ ) ;
765+ assert . equal ( fetchCalls . length , 0 ) ;
766+ } ) ;
767+
768+ test ( "replySession /continue runs trailing pending tool calls before requesting another response" , async ( ) => {
769+ const workspace = createTempDir ( "deepcode-continue-tool-workspace-" ) ;
770+ const home = createTempDir ( "deepcode-continue-tool-home-" ) ;
771+ setHomeDir ( home ) ;
772+
773+ const responses = [
774+ createChatResponse ( "continued after tool" , {
775+ prompt_tokens : 9 ,
776+ completion_tokens : 2 ,
777+ total_tokens : 11 ,
778+ } ) ,
779+ ] ;
780+ const manager = createMockedClientSessionManager ( workspace , responses ) ;
781+ const originalActivateSession = manager . activateSession . bind ( manager ) ;
782+ ( manager as any ) . activateSession = async ( ) => { } ;
783+
784+ const sessionId = await manager . createSession ( { text : "first prompt" } ) ;
785+ const pendingAssistant = ( manager as any ) . buildAssistantMessage (
786+ sessionId ,
787+ "Need to read a file" ,
788+ [
789+ {
790+ id : "call-pending-read" ,
791+ type : "function" ,
792+ function : { name : "read" , arguments : JSON . stringify ( { file_path : path . join ( workspace , "note.txt" ) } ) } ,
793+ } ,
794+ ] ,
795+ null
796+ ) as SessionMessage ;
797+ fs . writeFileSync ( path . join ( workspace , "note.txt" ) , "hello from pending tool\n" , "utf8" ) ;
798+ ( manager as any ) . appendSessionMessage ( sessionId , pendingAssistant ) ;
799+ ( manager as any ) . activateSession = originalActivateSession ;
800+
801+ await manager . replySession ( sessionId , { text : "/continue" } ) ;
802+
803+ const messages = manager . listSessionMessages ( sessionId ) ;
804+ const toolMessage = messages . find ( ( message ) => {
805+ const params = message . messageParams as { tool_call_id ?: string } | null ;
806+ return message . role === "tool" && params ?. tool_call_id === "call-pending-read" ;
807+ } ) ;
808+ const assistantMessages = messages . filter ( ( message ) => message . role === "assistant" ) ;
809+ const userMessages = messages . filter ( ( message ) => message . role === "user" ) ;
810+
811+ assert . ok ( toolMessage ) ;
812+ assert . match ( toolMessage . content ?? "" , / h e l l o f r o m p e n d i n g t o o l / ) ;
813+ assert . equal ( assistantMessages [ assistantMessages . length - 1 ] ?. content , "continued after tool" ) ;
814+ assert . equal (
815+ userMessages . some ( ( message ) => message . content === "/continue" ) ,
816+ false
817+ ) ;
818+ } ) ;
819+
726820test ( "replySession preserves raw session messages when a previous tool call is pending" , async ( ) => {
727821 const workspace = createTempDir ( "deepcode-pending-tool-workspace-" ) ;
728822 const home = createTempDir ( "deepcode-pending-tool-home-" ) ;
0 commit comments