agent-workspace-contract 0.1.0

Transport-neutral contracts for Agent Infra workspace APIs
Documentation
use super::*;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "action", rename_all = "snake_case")]
pub enum WorkspacePatchOperation {
    Create {
        path: String,
        content: String,
    },
    Delete {
        path: String,
    },
    Update {
        path: String,
        #[serde(default, skip_serializing_if = "Option::is_none")]
        move_to: Option<String>,
        #[serde(default)]
        changes: Vec<WorkspaceTextReplacement>,
    },
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceTextReplacement {
    pub old: String,
    pub new: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceChangeSetRequest {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub conversation_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub idempotency_key: Option<String>,
    #[serde(default)]
    pub base_version: u64,
    pub operations: Vec<WorkspacePatchOperation>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkspaceFileChangeKind {
    Created,
    Updated,
    Deleted,
    Moved,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceFileChange {
    pub file_id: String,
    pub path: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub previous_path: Option<String>,
    pub kind: WorkspaceFileChangeKind,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub before: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub after: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub before_revision: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub after_revision: Option<String>,
    pub additions: usize,
    pub deletions: usize,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceChangeSummary {
    pub files: usize,
    pub additions: usize,
    pub deletions: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkspaceChangeSetStatus {
    Applied,
    Reverted,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceChangeSet {
    pub schema_version: u32,
    pub id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub conversation_id: Option<String>,
    pub status: WorkspaceChangeSetStatus,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub reverts_change_set_id: Option<String>,
    pub summary: WorkspaceChangeSummary,
    pub files: Vec<WorkspaceFileChange>,
    pub created_at_ms: u64,
    #[serde(default)]
    pub workspace_version: u64,
}