use crate::models::AdditionalPermissionProfile;use crate::models::FileSystemPermissions;use crate::models::NetworkPermissions;use codex_utils_absolute_path::AbsolutePathBuf;use schemars::JsonSchema;use serde::Deserialize;use serde::Serialize;use ts_rs::TS;#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]#[serde(rename_all = "snake_case")]pub enum PermissionGrantScope { #[default] Turn, Session,}#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]#[serde(deny_unknown_fields)]pub struct RequestPermissionProfile { pub network: Option<NetworkPermissions>, pub file_system: Option<FileSystemPermissions>,}impl RequestPermissionProfile { pub fn is_empty(&self) -> bool { self.network.is_none() && self.file_system.is_none() }}impl From<RequestPermissionProfile> for AdditionalPermissionProfile { fn from(value: RequestPermissionProfile) -> Self { Self { network: value.network, file_system: value.file_system, } }}impl From<AdditionalPermissionProfile> for RequestPermissionProfile { fn from(value: AdditionalPermissionProfile) -> Self { Self { network: value.network, file_system: value.file_system, } }}#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]pub struct RequestPermissionsArgs { #[serde( default, rename = "environment_id", alias = "environmentId", skip_serializing_if = "Option::is_none" )] #[ts(optional)] pub environment_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] pub reason: Option<String>, pub permissions: RequestPermissionProfile,}#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]pub struct RequestPermissionsResponse { pub permissions: RequestPermissionProfile, #[serde(default)] pub scope: PermissionGrantScope, /// Review every subsequent command in this turn before normal sandboxed execution. #[serde(default, skip_serializing_if = "std::ops::Not::not")] pub strict_auto_review: bool,}#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]pub struct RequestPermissionsEvent { /// Responses API call id for the associated tool call, if available. pub call_id: String, /// Turn ID that this request belongs to. /// Uses `#[serde(default)]` for backwards compatibility. #[serde(default)] pub turn_id: String, #[serde( default, rename = "environmentId", alias = "environment_id", skip_serializing_if = "Option::is_none" )] #[ts(optional)] #[ts(rename = "environmentId")] pub environment_id: Option<String>, #[ts(type = "number")] pub started_at_ms: i64, #[serde(skip_serializing_if = "Option::is_none")] pub reason: Option<String>, pub permissions: RequestPermissionProfile, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub cwd: Option<AbsolutePathBuf>,}