Skip to main content

agent_workspace_contract/
change.rs

1use super::*;
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4#[serde(tag = "action", rename_all = "snake_case")]
5pub enum WorkspacePatchOperation {
6    Create {
7        path: String,
8        content: String,
9    },
10    Delete {
11        path: String,
12    },
13    Update {
14        path: String,
15        #[serde(default, skip_serializing_if = "Option::is_none")]
16        move_to: Option<String>,
17        #[serde(default)]
18        changes: Vec<WorkspaceTextReplacement>,
19    },
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct WorkspaceTextReplacement {
24    pub old: String,
25    pub new: String,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct WorkspaceChangeSetRequest {
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub conversation_id: Option<String>,
33    #[serde(default, skip_serializing_if = "Option::is_none")]
34    pub idempotency_key: Option<String>,
35    #[serde(default)]
36    pub base_version: u64,
37    pub operations: Vec<WorkspacePatchOperation>,
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
41#[serde(rename_all = "snake_case")]
42pub enum WorkspaceFileChangeKind {
43    Created,
44    Updated,
45    Deleted,
46    Moved,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct WorkspaceFileChange {
52    pub file_id: String,
53    pub path: String,
54    #[serde(default, skip_serializing_if = "Option::is_none")]
55    pub previous_path: Option<String>,
56    pub kind: WorkspaceFileChangeKind,
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub before: Option<String>,
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub after: Option<String>,
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub before_revision: Option<String>,
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub after_revision: Option<String>,
65    pub additions: usize,
66    pub deletions: usize,
67}
68
69#[derive(Debug, Clone, Default, Serialize, Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct WorkspaceChangeSummary {
72    pub files: usize,
73    pub additions: usize,
74    pub deletions: usize,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78#[serde(rename_all = "snake_case")]
79pub enum WorkspaceChangeSetStatus {
80    Applied,
81    Reverted,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(rename_all = "camelCase")]
86pub struct WorkspaceChangeSet {
87    pub schema_version: u32,
88    pub id: String,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub conversation_id: Option<String>,
91    pub status: WorkspaceChangeSetStatus,
92    #[serde(default, skip_serializing_if = "Option::is_none")]
93    pub reverts_change_set_id: Option<String>,
94    pub summary: WorkspaceChangeSummary,
95    pub files: Vec<WorkspaceFileChange>,
96    pub created_at_ms: u64,
97    #[serde(default)]
98    pub workspace_version: u64,
99}