pub struct Fs {
pub description_read: ToolDescription,
pub description_write: ToolDescription,
pub description_edit: ToolDescription,
pub description_edit_lines: ToolDescription,
pub description_ast_edit: ToolDescription,
pub description_rollback: ToolDescription,
/* private fields */
}Expand description
Shared-state wrapper for file-system tool operations.
Use the builder methods after new to configure the
project root and scope guards, then call the operation methods
directly.
Fields§
§description_read: ToolDescriptionMCP Tool description for read.
description_write: ToolDescriptionMCP Tool description for write.
description_edit: ToolDescriptionMCP Tool description for edit (content replace).
description_edit_lines: ToolDescriptionMCP Tool description for fs_edit_lines (hashline replace).
description_ast_edit: ToolDescriptionMCP Tool description for fs_ast_edit (AST structural).
description_rollback: ToolDescriptionMCP Tool description for rollback.
Implementations§
Source§impl Fs
impl Fs
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new Fs with no root path set.
All paths are denied until cwd is called.
Sourcepub fn with_lsp(self, lsp: Arc<Lsp>) -> Self
pub fn with_lsp(self, lsp: Arc<Lsp>) -> Self
Attach the language-server engine. Its presence is the toggle: every mutating operation (write/edit/rollback) then reports passive LSP diagnostics on the touched files, and reads warm the servers up.
Sourcepub fn without_lsp(&self) -> FsCall<'_>
pub fn without_lsp(&self) -> FsCall<'_>
Suppress passive LSP feedback for the chained call only — the Fs
keeps its default behavior for later calls.
Sourcepub fn warnings(&self) -> FsCall<'_>
pub fn warnings(&self) -> FsCall<'_>
Include warnings (not just errors) in the chained call’s passive LSP
feedback only — the Fs keeps its default behavior for later calls.
Sourcepub fn cwd(self, path: impl Into<PathBuf>) -> Self
pub fn cwd(self, path: impl Into<PathBuf>) -> Self
Set the project root directory (used for path-validation guards).
Sourcepub fn allowlist(
self,
paths: impl IntoIterator<Item = impl Into<PathBuf>>,
) -> Self
pub fn allowlist( self, paths: impl IntoIterator<Item = impl Into<PathBuf>>, ) -> Self
Set the explicit write-path allowlist.
Sourcepub fn blocklist(
self,
paths: impl IntoIterator<Item = impl Into<PathBuf>>,
) -> Self
pub fn blocklist( self, paths: impl IntoIterator<Item = impl Into<PathBuf>>, ) -> Self
Set the explicit write-path blocklist.
Sourcepub fn read_allowlist(
self,
paths: impl IntoIterator<Item = impl Into<PathBuf>>,
) -> Self
pub fn read_allowlist( self, paths: impl IntoIterator<Item = impl Into<PathBuf>>, ) -> Self
Set the read-only path allowlist (falls back to allowlist when None).
Sourcepub fn read_blocklist(
self,
paths: impl IntoIterator<Item = impl Into<PathBuf>>,
) -> Self
pub fn read_blocklist( self, paths: impl IntoIterator<Item = impl Into<PathBuf>>, ) -> Self
Set the read-only path blocklist (falls back to blocklist when None).
Sourcepub async fn read(&self, targets: Vec<Target>) -> Vec<ReadResult>
pub async fn read(&self, targets: Vec<Target>) -> Vec<ReadResult>
Read one or more files / symbols.
See [read] for details. With Fs::with_lsp configured, each read
warms the file’s language servers up (no diagnostics attached).
Sourcepub async fn write(
&self,
targets: Vec<TargetFile>,
) -> Result<Vec<WriteResult>, String>
pub async fn write( &self, targets: Vec<TargetFile>, ) -> Result<Vec<WriteResult>, String>
Write content to one or more files.
See [write] for details.
§Errors
Returns an error if the allowlist/blocklist configuration is invalid.
Sourcepub async fn edit(&self, args: Value) -> Result<Vec<EditResult>, String>
pub async fn edit(&self, args: Value) -> Result<Vec<EditResult>, String>
Apply content-anchored replacements (the fs_edit wrapper over the
content replace engine). Each edit replaces an exact,
uniquely-matching old_string with new_string, anchored on the
file’s content-hash snapshot tag.
§Errors
Returns an error when a tag is missing/unknown, old_string does not
match exactly or is ambiguous, or the underlying edit fails.
Sourcepub async fn edit_lines(&self, args: Value) -> Result<Vec<EditResult>, String>
pub async fn edit_lines(&self, args: Value) -> Result<Vec<EditResult>, String>
Edit lines from the fs_edit_lines wrapper over the hashline replace
engine (the legacy targets/edit core entry point).
Accepts the advertised flat {path, file_hash, ops} object or the
legacy {targets: [...]} batch form (kept for benchmarks; not
advertised by the schema).
§Errors
Returns an error when the arguments do not match either accepted shape, or when the engine fails.
Sourcepub async fn edit_ast(&self, args: Value) -> Result<Vec<EditResult>, String>
pub async fn edit_ast(&self, args: Value) -> Result<Vec<EditResult>, String>
Structural syntax-tree rewrite from the fs_edit_ast wrapper over the
AST engine. Accepts the advertised flat {path, ops: [{pat, out}]}
object or the legacy {ast: {...}} / {paths: [...]} batch forms
(kept for codemods/benchmarks; not advertised by the schema).
§Errors
Returns an error when the arguments do not match either accepted shape, or when the engine fails.
Sourcepub async fn replace_edits(
&self,
edits: Vec<ReplaceEdit>,
) -> Result<Vec<EditResult>, String>
pub async fn replace_edits( &self, edits: Vec<ReplaceEdit>, ) -> Result<Vec<EditResult>, String>
Apply content-anchored replacements (the typed form of the edits
argument of the legacy batch API). Each edit replaces an exact,
uniquely-matching old_string with new_string, anchored on the
file’s content-hash snapshot tag.
§Errors
Returns an error when a tag is missing/unknown, old_string does not
match exactly or is ambiguous, or the underlying edit fails.
Sourcepub async fn rollback(
&self,
path: &str,
hash: &str,
) -> Result<RollbackResult, String>
pub async fn rollback( &self, path: &str, hash: &str, ) -> Result<RollbackResult, String>
Roll back a file to a previously recorded session version.
See [rollback] for details.
§Errors
Returns an error if write permission is denied or the path has no rollback history.
Sourcepub fn allowlist_ref(&self) -> Option<&[PathBuf]>
pub fn allowlist_ref(&self) -> Option<&[PathBuf]>
Get the write allowlist (read-only reference).
Sourcepub fn blocklist_ref(&self) -> Option<&[PathBuf]>
pub fn blocklist_ref(&self) -> Option<&[PathBuf]>
Get the write blocklist (read-only reference).
Sourcepub fn add_allowlist_path(&mut self, path: PathBuf)
pub fn add_allowlist_path(&mut self, path: PathBuf)
Add a path to the write allowlist.
If the allowlist is None, it is created. Duplicate paths are ignored.
Sourcepub fn remove_allowlist_path(&mut self, path: &Path)
pub fn remove_allowlist_path(&mut self, path: &Path)
Remove a path from the write allowlist (for AllowOnce cleanup).
If the path is not in the allowlist, this is a no-op.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for Fs
impl !UnwindSafe for Fs
impl Freeze for Fs
impl Send for Fs
impl Sync for Fs
impl Unpin for Fs
impl UnsafeUnpin for Fs
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoMaybeUndefined<T> for T
impl<T> IntoMaybeUndefined<T> for T
Source§fn into_maybe_undefined(self) -> MaybeUndefined<T>
fn into_maybe_undefined(self) -> MaybeUndefined<T>
Source§impl<T> IntoOption<T> for T
impl<T> IntoOption<T> for T
Source§fn into_option(self) -> Option<T>
fn into_option(self) -> Option<T>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.