use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; use std::collections::BTreeMap; #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "lowercase")] pub enum AllowDenyRequirementToml { Allow, Deny, } #[derive(Deserialize, Debug, Clone, Default, PartialEq, Eq)] pub struct BrowserUseOriginPolicyToml { pub access: Option, pub downloads: Option, pub uploads: Option, pub full_cdp_access: Option, pub auto_review: Option, pub persistent_approval: Option, pub access_approval_lifetime: Option, } impl BrowserUseOriginPolicyToml { fn is_empty(&self) -> bool { self.access.is_none() && self.downloads.is_none() && self.uploads.is_none() && self.full_cdp_access.is_none() && self.auto_review.is_none() && self.persistent_approval.is_none() && self.access_approval_lifetime.is_none() } } #[derive(Deserialize, Debug, Clone, Copy, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum BrowserUseAccessApprovalLifetimeToml { Turn, Thread, } #[derive(Deserialize, Debug, Clone, Default, PartialEq, Eq)] pub struct BrowserUseRequirementsToml { pub allow_webmcp: Option, pub allow_history_access: Option, pub disable_auto_review: Option, pub allow_global_persistent_approval: Option, pub default_origin_policy: Option, pub origins: Option>, } impl BrowserUseRequirementsToml { pub fn is_empty(&self) -> bool { self.allow_webmcp.is_none() && self.allow_history_access.is_none() && self.disable_auto_review.is_none() && self.allow_global_persistent_approval.is_none() && self .default_origin_policy .as_ref() .is_none_or(BrowserUseOriginPolicyToml::is_empty) && self .origins .as_ref() .is_none_or(|origins| origins.values().all(BrowserUseOriginPolicyToml::is_empty)) } } #[derive(Deserialize, Debug, Clone, Default, PartialEq, Eq)] pub struct ComputerUseMacosRequirementsToml { pub bundle_ids: Option>, } #[derive(Deserialize, Debug, Clone, Default, PartialEq, Eq)] pub struct ComputerUseWindowsRequirementsToml { pub aumids: Option>, pub exes: Option>, } #[derive(Deserialize, Debug, Clone, PartialEq, Eq)] pub struct ComputerUseWindowsExeRequirementToml { pub publisher_name: String, pub product_name: String, pub binary_name: Option, pub access: AllowDenyRequirementToml, } #[derive(Deserialize, Debug, Clone, Default, PartialEq, Eq)] pub struct ComputerUseRequirementsToml { pub allow_locked_computer_use: Option, pub allow_persistent_approval: Option, pub default_app_access: Option, pub macos: Option, pub windows: Option, } impl ComputerUseRequirementsToml { pub fn is_empty(&self) -> bool { self.allow_locked_computer_use.is_none() && self.allow_persistent_approval.is_none() && self.default_app_access.is_none() && self .macos .as_ref() .is_none_or(|macos| macos.bundle_ids.as_ref().is_none_or(BTreeMap::is_empty)) && self.windows.as_ref().is_none_or(|windows| { windows.aumids.as_ref().is_none_or(BTreeMap::is_empty) && windows.exes.as_ref().is_none_or(Vec::is_empty) }) } } #[cfg(test)] #[path = "browser_computer_use_requirements_tests.rs"] mod tests;