@@ -164,11 +164,11 @@ export class AgentFileSystemHandler {
164164 return filepath
165165 }
166166
167- private async validatePath ( requestedPath : string ) : Promise < string > {
167+ private async validatePath ( requestedPath : string , baseDirectory ?: string ) : Promise < string > {
168168 const expandedPath = this . expandHome ( requestedPath )
169169 const absolute = path . isAbsolute ( expandedPath )
170170 ? path . resolve ( expandedPath )
171- : path . resolve ( process . cwd ( ) , expandedPath )
171+ : path . resolve ( baseDirectory ?? this . allowedDirectories [ 0 ] , expandedPath )
172172 const normalizedRequested = this . normalizePath ( absolute )
173173 const isAllowed = this . isPathAllowed ( normalizedRequested )
174174 if ( ! isAllowed ) {
@@ -631,15 +631,15 @@ export class AgentFileSystemHandler {
631631 }
632632 }
633633
634- async readFile ( args : unknown ) : Promise < string > {
634+ async readFile ( args : unknown , baseDirectory ?: string ) : Promise < string > {
635635 const parsed = ReadFileArgsSchema . safeParse ( args )
636636 if ( ! parsed . success ) {
637637 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
638638 }
639639 const results = await Promise . all (
640640 parsed . data . paths . map ( async ( filePath : string ) => {
641641 try {
642- const validPath = await this . validatePath ( filePath )
642+ const validPath = await this . validatePath ( filePath , baseDirectory )
643643 const content = await fs . readFile ( validPath , 'utf-8' )
644644 return `${ filePath } :\n${ content } \n`
645645 } catch ( error ) {
@@ -651,22 +651,22 @@ export class AgentFileSystemHandler {
651651 return results . join ( '\n---\n' )
652652 }
653653
654- async writeFile ( args : unknown ) : Promise < string > {
654+ async writeFile ( args : unknown , baseDirectory ?: string ) : Promise < string > {
655655 const parsed = WriteFileArgsSchema . safeParse ( args )
656656 if ( ! parsed . success ) {
657657 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
658658 }
659- const validPath = await this . validatePath ( parsed . data . path )
659+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
660660 await fs . writeFile ( validPath , parsed . data . content , 'utf-8' )
661661 return `Successfully wrote to ${ parsed . data . path } `
662662 }
663663
664- async listDirectory ( args : unknown ) : Promise < string > {
664+ async listDirectory ( args : unknown , baseDirectory ?: string ) : Promise < string > {
665665 const parsed = ListDirectoryArgsSchema . safeParse ( args )
666666 if ( ! parsed . success ) {
667667 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
668668 }
669- const validPath = await this . validatePath ( parsed . data . path )
669+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
670670 const entries = await fs . readdir ( validPath , { withFileTypes : true } )
671671 const formatted = entries
672672 . map ( ( entry ) => {
@@ -677,26 +677,27 @@ export class AgentFileSystemHandler {
677677 return `Directory listing for ${ parsed . data . path } :\n\n${ formatted } `
678678 }
679679
680- async createDirectory ( args : unknown ) : Promise < string > {
680+ async createDirectory ( args : unknown , baseDirectory ?: string ) : Promise < string > {
681681 const parsed = CreateDirectoryArgsSchema . safeParse ( args )
682682 if ( ! parsed . success ) {
683683 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
684684 }
685- const validPath = await this . validatePath ( parsed . data . path )
685+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
686686 await fs . mkdir ( validPath , { recursive : true } )
687687 return `Successfully created directory ${ parsed . data . path } `
688688 }
689689
690- async moveFiles ( args : unknown ) : Promise < string > {
690+ async moveFiles ( args : unknown , baseDirectory ?: string ) : Promise < string > {
691691 const parsed = MoveFilesArgsSchema . safeParse ( args )
692692 if ( ! parsed . success ) {
693693 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
694694 }
695695 const results = await Promise . all (
696696 parsed . data . sources . map ( async ( source ) => {
697- const validSourcePath = await this . validatePath ( source )
697+ const validSourcePath = await this . validatePath ( source , baseDirectory )
698698 const validDestPath = await this . validatePath (
699- path . join ( parsed . data . destination , path . basename ( source ) )
699+ path . join ( parsed . data . destination , path . basename ( source ) ) ,
700+ baseDirectory
700701 )
701702 try {
702703 await fs . rename ( validSourcePath , validDestPath )
@@ -709,12 +710,12 @@ export class AgentFileSystemHandler {
709710 return results . join ( '\n' )
710711 }
711712
712- async editText ( args : unknown ) : Promise < string > {
713+ async editText ( args : unknown , baseDirectory ?: string ) : Promise < string > {
713714 const parsed = EditTextArgsSchema . safeParse ( args )
714715 if ( ! parsed . success ) {
715716 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
716717 }
717- const validPath = await this . validatePath ( parsed . data . path )
718+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
718719 const content = await fs . readFile ( validPath , 'utf-8' )
719720 let modifiedContent = content
720721
@@ -747,13 +748,13 @@ export class AgentFileSystemHandler {
747748 return diff
748749 }
749750
750- async grepSearch ( args : unknown ) : Promise < string > {
751+ async grepSearch ( args : unknown , baseDirectory ?: string ) : Promise < string > {
751752 const parsed = GrepSearchArgsSchema . safeParse ( args )
752753 if ( ! parsed . success ) {
753754 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
754755 }
755756
756- const validPath = await this . validatePath ( parsed . data . path )
757+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
757758 const result = await this . runGrepSearch ( validPath , parsed . data . pattern , {
758759 filePattern : parsed . data . filePattern ,
759760 recursive : parsed . data . recursive ,
@@ -791,13 +792,13 @@ export class AgentFileSystemHandler {
791792 return `Found ${ result . totalMatches } matches in ${ result . files . length } files:\n\n${ formattedResults } `
792793 }
793794
794- async textReplace ( args : unknown ) : Promise < string > {
795+ async textReplace ( args : unknown , baseDirectory ?: string ) : Promise < string > {
795796 const parsed = TextReplaceArgsSchema . safeParse ( args )
796797 if ( ! parsed . success ) {
797798 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
798799 }
799800
800- const validPath = await this . validatePath ( parsed . data . path )
801+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
801802 const result = await this . replaceTextInFile (
802803 validPath ,
803804 parsed . data . pattern ,
@@ -812,14 +813,14 @@ export class AgentFileSystemHandler {
812813 return result . success ? result . diff || '' : result . error || 'Text replacement failed'
813814 }
814815
815- async directoryTree ( args : unknown ) : Promise < string > {
816+ async directoryTree ( args : unknown , baseDirectory ?: string ) : Promise < string > {
816817 const parsed = DirectoryTreeArgsSchema . safeParse ( args )
817818 if ( ! parsed . success ) {
818819 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
819820 }
820821
821822 const buildTree = async ( currentPath : string ) : Promise < TreeEntry [ ] > => {
822- const validPath = await this . validatePath ( currentPath )
823+ const validPath = await this . validatePath ( currentPath , baseDirectory )
823824 const entries = await fs . readdir ( validPath , { withFileTypes : true } )
824825 const result : TreeEntry [ ] = [ ]
825826
@@ -844,20 +845,20 @@ export class AgentFileSystemHandler {
844845 return JSON . stringify ( treeData , null , 2 )
845846 }
846847
847- async getFileInfo ( args : unknown ) : Promise < string > {
848+ async getFileInfo ( args : unknown , baseDirectory ?: string ) : Promise < string > {
848849 const parsed = GetFileInfoArgsSchema . safeParse ( args )
849850 if ( ! parsed . success ) {
850851 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
851852 }
852853
853- const validPath = await this . validatePath ( parsed . data . path )
854+ const validPath = await this . validatePath ( parsed . data . path , baseDirectory )
854855 const info = await this . getFileStats ( validPath )
855856 return Object . entries ( info )
856857 . map ( ( [ key , value ] ) => `${ key } : ${ value } ` )
857858 . join ( '\n' )
858859 }
859860
860- async globSearch ( args : unknown ) : Promise < string > {
861+ async globSearch ( args : unknown , baseDirectory ?: string ) : Promise < string > {
861862 const parsed = GlobSearchArgsSchema . safeParse ( args )
862863 if ( ! parsed . success ) {
863864 throw new Error ( `Invalid arguments: ${ parsed . error } ` )
@@ -867,7 +868,9 @@ export class AgentFileSystemHandler {
867868 validateGlobPattern ( pattern )
868869
869870 // Determine root directory
870- const searchRoot = root ? await this . validatePath ( root ) : this . allowedDirectories [ 0 ]
871+ const searchRoot = root
872+ ? await this . validatePath ( root , baseDirectory )
873+ : await this . validatePath ( baseDirectory ?? this . allowedDirectories [ 0 ] )
871874
872875 // Default exclusions
873876 const defaultExclusions = [
0 commit comments