1#[derive(Clone, Default)]
2pub struct ToolPolicy {
3 pub allowed_tools: Option<Vec<String>>,
4 pub disallowed_tools: Vec<String>,
5 pub approval: ApprovalPolicy,
6 pub max_concurrency: Option<usize>,
7}
8
9impl ToolPolicy {
10 pub fn allow_only(mut self, tools: impl IntoIterator<Item = impl Into<String>>) -> Self {
11 self.allowed_tools = Some(tools.into_iter().map(Into::into).collect());
12 self
13 }
14
15 pub fn disallow(mut self, tool: impl Into<String>) -> Self {
16 self.disallowed_tools.push(tool.into());
17 self
18 }
19}
20
21#[derive(Debug, Clone, Default, PartialEq, Eq)]
22pub enum ApprovalPolicy {
23 #[default]
24 Never,
25 Always,
26 OnRequest,
27}
28
29#[derive(Debug, Clone, PartialEq, Eq)]
30pub enum ApprovalDecision {
31 Approved,
32 Denied(String),
33 TimedOut(String),
34 NeedsApproval,
35}
36
37impl ApprovalDecision {
38 pub fn allow() -> Self {
39 Self::Approved
40 }
41
42 pub fn deny(reason: impl Into<String>) -> Self {
43 Self::Denied(reason.into())
44 }
45
46 pub fn timeout(reason: impl Into<String>) -> Self {
47 Self::TimedOut(reason.into())
48 }
49}