@@ -197,7 +197,6 @@ test("initializes with empty state for non-existent chat", async () => {
197197 expect ( state . messages ) . toEqual ( [ ] ) ;
198198 expect ( state . status ) . toBe ( "idle" ) ;
199199 expect ( state . streamingMessage ) . toBeUndefined ( ) ;
200- expect ( state . error ) . toBeUndefined ( ) ;
201200 expect ( state . queuedMessages ) . toEqual ( [ ] ) ;
202201
203202 manager . dispose ( ) ;
@@ -873,126 +872,42 @@ test("watcher onChange does not cause status to flicker during lock release", as
873872 manager . dispose ( ) ;
874873} ) ;
875874
876- test ( "error clearing: errors clear when sending new message" , async ( ) => {
877- const chatsDir = await mkdtemp ( join ( tmpdir ( ) , "chat-test-" ) ) ;
878-
879- try {
880- // Create a manager with an agent that will fail
881- const failingAgent : any = {
882- chat : async ( ) => {
883- throw new Error ( "Test error" ) ;
884- } ,
885- } ;
886-
887- const manager = new ChatManager ( {
888- chatId : crypto . randomUUID ( ) ,
889- chatsDirectory : chatsDir ,
890- } ) ;
891-
892- // Track state changes before sending message
893- let errorSeen = false ;
894- let errorCleared = false ;
895- const unsubscribe = manager . subscribe ( ( state ) => {
896- if ( state . error ) {
897- errorSeen = true ;
898- }
899- if ( errorSeen && ! state . error ) {
900- errorCleared = true ;
901- }
902- } ) ;
903-
904- manager . setAgent ( failingAgent ) ;
905-
906- // Send a message that will fail
907- const message : StoredMessage = {
908- id : crypto . randomUUID ( ) ,
909- created_at : new Date ( ) . toISOString ( ) ,
910- role : "user" ,
911- parts : [ { type : "text" , text : "Hello" } ] ,
912- mode : "run" ,
913- metadata : undefined ,
914- } ;
915-
916- await manager . sendMessages ( [ message ] ) ;
917-
918- // Wait for error state
919- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
920-
921- // Should have seen an error
922- expect ( errorSeen ) . toBe ( true ) ;
923- let state = manager . getState ( ) ;
924- expect ( state . status ) . toBe ( "error" ) ;
925-
926- // Now set a working agent
927- const workingAgent = createMockAgent ( "Success!" ) ;
928- manager . setAgent ( workingAgent ) ;
929-
930- // Send another message
931- const message2 : StoredMessage = {
932- id : crypto . randomUUID ( ) ,
933- created_at : new Date ( ) . toISOString ( ) ,
934- role : "user" ,
935- parts : [ { type : "text" , text : "Try again" } ] ,
936- mode : "run" ,
937- metadata : undefined ,
938- } ;
939-
940- await manager . sendMessages ( [ message2 ] ) ;
941-
942- // Wait for completion
943- await new Promise ( ( resolve ) => setTimeout ( resolve , 300 ) ) ;
875+ test ( "onError callback is called when no agent is available" , async ( ) => {
876+ const chatId = crypto . randomUUID ( ) ;
944877
945- // Error should have been cleared at some point during the lifecycle
946- // This is the key behavior - errors should clear when sending new messages
947- expect ( errorCleared ) . toBe ( true ) ;
878+ // Track errors via onError callback
879+ const errors : string [ ] = [ ] ;
880+ const onError = mock ( ( error : string ) => {
881+ errors . push ( error ) ;
882+ } ) ;
948883
949- // Final state should have no error (watcher may still show error status briefly)
950- state = manager . getState ( ) ;
951- expect ( state . error ) . toBeUndefined ( ) ;
884+ const manager = new ChatManager ( {
885+ chatId,
886+ chatsDirectory : tempDir ,
887+ onError,
888+ } ) ;
952889
953- unsubscribe ( ) ;
954- manager . dispose ( ) ;
955- } finally {
956- await rm ( chatsDir , { recursive : true , force : true } ) ;
957- }
958- } ) ;
890+ // Don't set an agent, so it should fail when we try to send a message
959891
960- test ( "error clearing: persisted errors don't load from disk" , async ( ) => {
961- const chatsDir = await mkdtemp ( join ( tmpdir ( ) , "chat-test-" ) ) ;
962-
963- try {
964- const chatId = crypto . randomUUID ( ) ;
965-
966- // Manually create a chat with an error in the store
967- const store = createDiskStore < StoredChat > ( chatsDir , "id" ) ;
968- const locked = await store . lock ( chatId ) ;
969- try {
970- await locked . set ( {
971- id : chatId ,
972- created_at : new Date ( ) . toISOString ( ) ,
973- updated_at : new Date ( ) . toISOString ( ) ,
974- messages : [ ] ,
975- error : "Old persisted error" ,
976- } ) ;
977- } finally {
978- await locked . release ( ) ;
979- }
892+ // Send a message without an agent
893+ const message : StoredMessage = {
894+ id : crypto . randomUUID ( ) ,
895+ created_at : new Date ( ) . toISOString ( ) ,
896+ role : "user" ,
897+ parts : [ { type : "text" , text : "Hello" } ] ,
898+ mode : "run" ,
899+ metadata : undefined ,
900+ } ;
980901
981- // Create a new manager - it should clear the persisted error
982- const manager = new ChatManager ( {
983- chatId,
984- chatsDirectory : chatsDir ,
985- } ) ;
902+ await manager . sendMessages ( [ message ] ) ;
986903
987- // Wait for initial load
988- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
904+ // Wait a bit for the error to be processed
905+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
989906
990- const state = manager . getState ( ) ;
991- expect ( state . error ) . toBeUndefined ( ) ; // Error should be cleared
992- expect ( state . loading ) . toBe ( false ) ;
907+ // Verify onError was called with the "no agent" error message
908+ expect ( onError ) . toHaveBeenCalled ( ) ;
909+ expect ( errors . length ) . toBeGreaterThan ( 0 ) ;
910+ expect ( errors [ 0 ] ) . toContain ( "agent is not available" ) ;
993911
994- manager . dispose ( ) ;
995- } finally {
996- await rm ( chatsDir , { recursive : true , force : true } ) ;
997- }
912+ manager . dispose ( ) ;
998913} ) ;
0 commit comments