feat(core): persist runtime workspace state

This commit is contained in:
Felipe Coury
2026-06-12 00:18:43 -07:00
parent bf667c7003
commit cb72ac4e89
27 changed files with 963 additions and 192 deletions
@@ -7,6 +7,7 @@ use super::NetworkApprovalProtocol;
use super::NetworkPolicyAmendment;
use super::RequestPermissionProfile;
use super::UserInput;
use super::WorkspaceMutationApprovalRequest;
use super::shared::v2_enum_from_core;
use crate::protocol::item_builders::convert_patch_changes;
use codex_experimental_api_macros::ExperimentalApi;
@@ -573,6 +574,7 @@ pub struct GuardianMcpToolCallReviewAction {
pub struct GuardianRequestPermissionsReviewAction {
pub reason: Option<String>,
pub permissions: RequestPermissionProfile,
pub workspace_mutation: Option<WorkspaceMutationApprovalRequest>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
@@ -623,6 +625,7 @@ pub enum GuardianApprovalReviewAction {
RequestPermissions {
reason: Option<String>,
permissions: RequestPermissionProfile,
workspace_mutation: Option<WorkspaceMutationApprovalRequest>,
},
}
@@ -679,9 +682,11 @@ impl From<CoreGuardianAssessmentAction> for GuardianApprovalReviewAction {
CoreGuardianAssessmentAction::RequestPermissions {
reason,
permissions,
workspace_mutation,
} => Self::RequestPermissions {
reason,
permissions: permissions.into(),
workspace_mutation: workspace_mutation.map(Into::into),
},
}
}
@@ -740,9 +745,11 @@ impl From<GuardianApprovalReviewAction> for CoreGuardianAssessmentAction {
GuardianApprovalReviewAction::RequestPermissions {
reason,
permissions,
workspace_mutation,
} => Self::RequestPermissions {
reason,
permissions: permissions.into(),
workspace_mutation: workspace_mutation.map(Into::into),
},
}
}
@@ -15,6 +15,8 @@ use codex_protocol::permissions::FileSystemSpecialPath as CoreFileSystemSpecialP
use codex_protocol::protocol::NetworkAccess as CoreNetworkAccess;
use codex_protocol::request_permissions::PermissionGrantScope as CorePermissionGrantScope;
use codex_protocol::request_permissions::RequestPermissionProfile as CoreRequestPermissionProfile;
use codex_protocol::request_permissions::WorkspaceMutationApprovalRequest as CoreWorkspaceMutationApprovalRequest;
use codex_protocol::request_permissions::WorkspaceMutationOperation as CoreWorkspaceMutationOperation;
use codex_utils_absolute_path::AbsolutePathBuf;
use schemars::JsonSchema;
use serde::Deserialize;
@@ -656,7 +658,7 @@ impl From<CoreNetworkPolicyAmendment> for NetworkPolicyAmendment {
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PermissionsRequestApprovalParams {
@@ -671,6 +673,43 @@ pub struct PermissionsRequestApprovalParams {
pub cwd: AbsolutePathBuf,
pub reason: Option<String>,
pub permissions: RequestPermissionProfile,
pub workspace_mutation: Option<WorkspaceMutationApprovalRequest>,
}
v2_enum_from_core!(
pub enum WorkspaceMutationOperation from CoreWorkspaceMutationOperation {
SetWorkingDirectory,
AddWorkspaceRoot
}
);
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct WorkspaceMutationApprovalRequest {
pub operation: WorkspaceMutationOperation,
pub target: AbsolutePathBuf,
pub resulting_workspace_roots: Vec<AbsolutePathBuf>,
}
impl From<CoreWorkspaceMutationApprovalRequest> for WorkspaceMutationApprovalRequest {
fn from(value: CoreWorkspaceMutationApprovalRequest) -> Self {
Self {
operation: value.operation.into(),
target: value.target,
resulting_workspace_roots: value.resulting_workspace_roots,
}
}
}
impl From<WorkspaceMutationApprovalRequest> for CoreWorkspaceMutationApprovalRequest {
fn from(value: WorkspaceMutationApprovalRequest) -> Self {
Self {
operation: value.operation.to_core(),
target: value.target,
resulting_workspace_roots: value.resulting_workspace_roots,
}
}
}
v2_enum_from_core!(