pub struct ScopedToolExecutor<E: ToolExecutor> { /* private fields */ }Expand description
Wraps any ToolExecutor and enforces a capability scope on both tool listing and dispatch.
§Type parameter
E is the inner executor (e.g., PolicyGateExecutor<TrustGateExecutor<CompositeExecutor>>).
§Examples
use std::collections::HashSet;
use zeph_tools::scope::{ScopedToolExecutor, ToolScope};
use zeph_tools::{ToolExecutor, ToolCall};
use zeph_common::ToolName;
// Build a full (no-op) scope — identity, admits everything.
let scope = ToolScope::full();
// Wrap some inner executor (omitted for brevity).
struct MockExecutor;
impl ToolExecutor for MockExecutor {
async fn execute(&self, _: &str) -> Result<Option<zeph_tools::ToolOutput>, zeph_tools::ToolError> { Ok(None) }
}
let executor = ScopedToolExecutor::new(MockExecutor, scope);Implementations§
Source§impl<E: ToolExecutor> ScopedToolExecutor<E>
impl<E: ToolExecutor> ScopedToolExecutor<E>
Sourcepub fn new(inner: E, initial_scope: ToolScope) -> Self
pub fn new(inner: E, initial_scope: ToolScope) -> Self
Create a new ScopedToolExecutor with the given initial scope.
§Examples
use zeph_tools::scope::{ScopedToolExecutor, ToolScope};
struct Noop;
impl zeph_tools::ToolExecutor for Noop {
async fn execute(&self, _: &str) -> Result<Option<zeph_tools::ToolOutput>, zeph_tools::ToolError> { Ok(None) }
}
let executor = ScopedToolExecutor::new(Noop, ToolScope::full());Sourcepub fn with_audit(self, audit: Arc<AuditLogger>) -> Self
pub fn with_audit(self, audit: Arc<AuditLogger>) -> Self
Attach an audit logger so every OutOfScope rejection writes an audit entry.
Sourcepub fn with_signal_queue(self, queue: RiskSignalQueue) -> Self
pub fn with_signal_queue(self, queue: RiskSignalQueue) -> Self
Attach a shared signal queue so OutOfScope rejections are recorded in the sentinel.
Sourcepub fn register_scope(&mut self, name: impl Into<String>, scope: ToolScope)
pub fn register_scope(&mut self, name: impl Into<String>, scope: ToolScope)
Register a named scope for use with set_scope_for_task.
Sourcepub fn set_scope_for_task(&self, task_type: &str) -> bool
pub fn set_scope_for_task(&self, task_type: &str) -> bool
Switch the active scope by task-type name. Returns false when the name is not found.
Sourcepub fn set_scope(&self, scope: ToolScope)
pub fn set_scope(&self, scope: ToolScope)
Replace the active scope with the given one directly.
Sourcepub fn scope_for_task(&self, task_type: &str) -> Option<Vec<String>>
pub fn scope_for_task(&self, task_type: &str) -> Option<Vec<String>>
Return the list of tool ids admitted by the scope for task_type.
Returns None when task_type is not registered.
§Examples
use zeph_tools::scope::{ScopedToolExecutor, ToolScope};
struct Noop;
impl zeph_tools::ToolExecutor for Noop {
async fn execute(&self, _: &str) -> Result<Option<zeph_tools::ToolOutput>, zeph_tools::ToolError> { Ok(None) }
}
let mut executor = ScopedToolExecutor::new(Noop, ToolScope::full());
// scope_for_task returns None for unregistered task types
assert!(executor.scope_for_task("unknown").is_none());Sourcepub fn scope_at_definition_name(&self) -> Option<String>
pub fn scope_at_definition_name(&self) -> Option<String>
Name of the active scope at the last tool_definitions() call (for audit).
Sourcepub fn active_scope_name(&self) -> Option<String>
pub fn active_scope_name(&self) -> Option<String>
Name of the currently active scope (for audit at dispatch time).
Trait Implementations§
Source§impl<E: ToolExecutor> ToolExecutor for ScopedToolExecutor<E>
impl<E: ToolExecutor> ToolExecutor for ScopedToolExecutor<E>
Source§fn tool_definitions(&self) -> Vec<ToolDef>
fn tool_definitions(&self) -> Vec<ToolDef>
Return the filtered tool definitions visible to the LLM under the active scope.
Captures the active scope name into scope_at_definition for audit use.
Source§async fn execute_tool_call(
&self,
call: &ToolCall,
) -> Result<Option<ToolOutput>, ToolError>
async fn execute_tool_call( &self, call: &ToolCall, ) -> Result<Option<ToolOutput>, ToolError>
Execute a structured tool call, rejecting out-of-scope ids before any side-effect.
Returns ToolError::OutOfScope when the tool id is not in the active scope.
The audit log entry at the call site must carry error_category = "out_of_scope".
Source§async fn execute(&self, response: &str) -> Result<Option<ToolOutput>, ToolError>
async fn execute(&self, response: &str) -> Result<Option<ToolOutput>, ToolError>
response for fenced tool blocks and execute them. Read moreSource§async fn execute_confirmed(
&self,
response: &str,
) -> Result<Option<ToolOutput>, ToolError>
async fn execute_confirmed( &self, response: &str, ) -> Result<Option<ToolOutput>, ToolError>
Source§async fn execute_tool_call_confirmed(
&self,
call: &ToolCall,
) -> Result<Option<ToolOutput>, ToolError>
async fn execute_tool_call_confirmed( &self, call: &ToolCall, ) -> Result<Option<ToolOutput>, ToolError>
Source§fn set_skill_env(&self, env: Option<HashMap<String, String>>)
fn set_skill_env(&self, env: Option<HashMap<String, String>>)
Source§fn set_effective_trust(&self, level: SkillTrustLevel)
fn set_effective_trust(&self, level: SkillTrustLevel)
Source§fn is_tool_retryable(&self, tool_id: &str) -> bool
fn is_tool_retryable(&self, tool_id: &str) -> bool
Auto Trait Implementations§
impl<E> !Freeze for ScopedToolExecutor<E>
impl<E> !RefUnwindSafe for ScopedToolExecutor<E>
impl<E> Send for ScopedToolExecutor<E>
impl<E> Sync for ScopedToolExecutor<E>
impl<E> Unpin for ScopedToolExecutor<E>where
E: Unpin,
impl<E> UnsafeUnpin for ScopedToolExecutor<E>where
E: UnsafeUnpin,
impl<E> !UnwindSafe for ScopedToolExecutor<E>
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
Source§impl<T> ErasedToolExecutor for Twhere
T: ToolExecutor,
impl<T> ErasedToolExecutor for Twhere
T: ToolExecutor,
fn execute_erased<'a>( &'a self, response: &'a str, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
fn execute_confirmed_erased<'a>( &'a self, response: &'a str, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
fn tool_definitions_erased(&self) -> Vec<ToolDef>
fn execute_tool_call_erased<'a>( &'a self, call: &'a ToolCall, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
fn execute_tool_call_confirmed_erased<'a>( &'a self, call: &'a ToolCall, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
Source§fn set_skill_env(&self, env: Option<HashMap<String, String>>)
fn set_skill_env(&self, env: Option<HashMap<String, String>>)
Source§fn set_effective_trust(&self, level: SkillTrustLevel)
fn set_effective_trust(&self, level: SkillTrustLevel)
Source§fn is_tool_retryable_erased(&self, tool_id: &str) -> bool
fn is_tool_retryable_erased(&self, tool_id: &str) -> bool
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 more