@@ -13,6 +13,8 @@ import {
13
13
} from "@/types/agent" ;
14
14
import { AgentClient } from "./AgentClient" ;
15
15
import { AgentScreenshotProviderError } from "@/types/stagehandErrors" ;
16
+ import * as fs from "fs" ;
17
+ import * as path from "path" ;
16
18
17
19
export type ResponseInputItem = AnthropicMessage | AnthropicToolResult ;
18
20
@@ -838,25 +840,57 @@ export class AnthropicCUAClient extends AgentClient {
838
840
base64Image ?: string ;
839
841
currentUrl ?: string ;
840
842
} ) : Promise < string > {
843
+ let imageData = "" ;
844
+
841
845
// Use provided options if available
842
846
if ( options ?. base64Image ) {
843
- return `data:image/png;base64,${ options . base64Image } ` ;
847
+ imageData = `data:image/png;base64,${ options . base64Image } ` ;
844
848
}
845
-
846
849
// Use the screenshot provider if available
847
- if ( this . screenshotProvider ) {
850
+ else if ( this . screenshotProvider ) {
848
851
try {
849
852
const base64Image = await this . screenshotProvider ( ) ;
850
- return `data:image/png;base64,${ base64Image } ` ;
853
+ imageData = `data:image/png;base64,${ base64Image } ` ;
851
854
} catch ( error ) {
852
855
console . error ( "Error capturing screenshot:" , error ) ;
853
856
throw error ;
854
857
}
858
+ } else {
859
+ throw new AgentScreenshotProviderError (
860
+ "`screenshotProvider` has not been set. " +
861
+ "Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image" ,
862
+ ) ;
863
+ }
864
+
865
+ // Save the screenshot to file if we have valid image data
866
+ if ( imageData ) {
867
+ try {
868
+ // Create screenshots directory if it doesn't exist
869
+ const screenshotsDir = path . resolve ( "screenshots" ) ;
870
+ if ( ! fs . existsSync ( screenshotsDir ) ) {
871
+ fs . mkdirSync ( screenshotsDir , { recursive : true } ) ;
872
+ }
873
+
874
+ // Generate filename with timestamp
875
+ const timestamp = new Date ( ) . toISOString ( ) . replace ( / [: .] / g, "-" ) ;
876
+ const filename = path . join (
877
+ screenshotsDir ,
878
+ `screenshot-${ timestamp } .png` ,
879
+ ) ;
880
+
881
+ // Extract base64 data without the data URL prefix
882
+ const base64Data = imageData . replace ( / ^ d a t a : i m a g e \/ p n g ; b a s e 6 4 , / , "" ) ;
883
+
884
+ // Write file
885
+ fs . writeFileSync ( filename , base64Data , "base64" ) ;
886
+ console . log ( `Screenshot saved to ${ filename } ` ) ;
887
+ } catch ( saveError ) {
888
+ // Log error but don't affect the function's behavior
889
+ console . error ( "Error saving screenshot to file:" , saveError ) ;
890
+ // Intentionally not re-throwing the error to keep function working
891
+ }
855
892
}
856
893
857
- throw new AgentScreenshotProviderError (
858
- "`screenshotProvider` has not been set. " +
859
- "Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image" ,
860
- ) ;
894
+ return imageData ;
861
895
}
862
896
}
0 commit comments