1#![allow(unused_imports, clippy::too_many_arguments)]
6
7use reqwest::Method;
8use serde::{Deserialize, Serialize};
9
10use crate::client::{Client, Request, NO_BODY, NO_QUERY};
11use crate::error::Result;
12use crate::generated::models;
13use crate::multipart::{field_text, FilePart};
14use crate::util::encode_path;
15
16#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
18pub struct DeleteWorkspaceFileParams {
19 pub path: String,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub trash: Option<models::DeleteWorkspaceFileTrash>,
24}
25
26#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
28pub struct DownloadWorkspaceFileParams {
29 pub path: String,
30}
31
32#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
34pub struct GetWorkspaceFileHistoryContentParams {
35 pub path: String,
36 pub version: String,
38}
39
40#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
42pub struct ListAgentWorkspaceFilesParams {
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub path: Option<String>,
45}
46
47#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
49pub struct ListWorkspaceFileHistoryParams {
50 pub path: String,
51}
52
53#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
55pub struct ListWorkspaceFilesParams {
56 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub path: Option<String>,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
63 pub recursive: Option<bool>,
64}
65
66#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
68pub struct SearchWorkspaceFilesParams {
69 pub q: String,
71 #[serde(default, skip_serializing_if = "Option::is_none")]
73 pub glob: Option<String>,
74 #[serde(default, skip_serializing_if = "Option::is_none")]
76 pub regex: Option<models::SearchWorkspaceFilesRegex>,
77}
78
79#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
81pub struct UploadWorkspaceFileParams {
82 pub path: String,
84}
85
86#[derive(Debug, Clone)]
88pub struct WorkspacesApi {
89 pub(crate) client: Client,
90}
91
92impl Client {
93 pub fn workspaces(&self) -> WorkspacesApi {
95 WorkspacesApi { client: self.clone() }
96 }
97}
98
99impl WorkspacesApi {
100 pub async fn assign_workspace(&self, workspace_id: &str, body: &models::AssignWorkspaceRequest) -> Result<models::Workspace> {
106 self.client
107 .request_json(Request {
108 method: Method::POST,
109 path: format!("/api/v1/workspaces/{}/assign", encode_path(workspace_id)),
110 query: NO_QUERY,
111 body: Some(body),
112 headers: Vec::new(),
113 idempotent: true,
114 })
115 .await
116 }
117
118 pub async fn copy_workspace_file(&self, workspace_id: &str, body: &models::CopyWorkspaceFileRequest) -> Result<models::WorkspaceFile> {
124 self.client
125 .request_json(Request {
126 method: Method::POST,
127 path: format!("/api/v1/workspaces/{}/files/copy", encode_path(workspace_id)),
128 query: NO_QUERY,
129 body: Some(body),
130 headers: Vec::new(),
131 idempotent: true,
132 })
133 .await
134 }
135
136 pub async fn create(&self, body: &models::CreateWorkspaceRequest) -> Result<models::Workspace> {
142 self.client
143 .request_json(Request {
144 method: Method::POST,
145 path: "/api/v1/workspaces".to_string(),
146 query: NO_QUERY,
147 body: Some(body),
148 headers: Vec::new(),
149 idempotent: true,
150 })
151 .await
152 }
153
154 pub async fn delete(&self, workspace_id: &str) -> Result<models::DeleteWorkspaceResponse> {
160 self.client
161 .request_json(Request {
162 method: Method::DELETE,
163 path: format!("/api/v1/workspaces/{}", encode_path(workspace_id)),
164 query: NO_QUERY,
165 body: NO_BODY,
166 headers: Vec::new(),
167 idempotent: true,
168 })
169 .await
170 }
171
172 pub async fn delete_workspace_file(&self, workspace_id: &str, params: &DeleteWorkspaceFileParams) -> Result<models::DeleteWorkspaceFileResponse> {
178 self.client
179 .request_json(Request {
180 method: Method::DELETE,
181 path: format!("/api/v1/workspaces/{}/files", encode_path(workspace_id)),
182 query: Some(params),
183 body: NO_BODY,
184 headers: Vec::new(),
185 idempotent: true,
186 })
187 .await
188 }
189
190 pub async fn download_workspace_file(&self, workspace_id: &str, params: &DownloadWorkspaceFileParams) -> Result<bytes::Bytes> {
196 self.client
197 .request_bytes(Request {
198 method: Method::GET,
199 path: format!("/api/v1/workspaces/{}/files/content", encode_path(workspace_id)),
200 query: Some(params),
201 body: NO_BODY,
202 headers: Vec::new(),
203 idempotent: false,
204 })
205 .await
206 }
207
208 pub async fn empty_workspace_trash(&self, workspace_id: &str) -> Result<models::EmptyWorkspaceTrashResponse> {
214 self.client
215 .request_json(Request {
216 method: Method::DELETE,
217 path: format!("/api/v1/workspaces/{}/trash", encode_path(workspace_id)),
218 query: NO_QUERY,
219 body: NO_BODY,
220 headers: Vec::new(),
221 idempotent: true,
222 })
223 .await
224 }
225
226 pub async fn get(&self, workspace_id: &str) -> Result<models::Workspace> {
232 self.client
233 .request_json(Request {
234 method: Method::GET,
235 path: format!("/api/v1/workspaces/{}", encode_path(workspace_id)),
236 query: NO_QUERY,
237 body: NO_BODY,
238 headers: Vec::new(),
239 idempotent: false,
240 })
241 .await
242 }
243
244 pub async fn get_workspace_file_history_content(&self, workspace_id: &str, params: &GetWorkspaceFileHistoryContentParams) -> Result<bytes::Bytes> {
254 self.client
255 .request_bytes(Request {
256 method: Method::GET,
257 path: format!("/api/v1/workspaces/{}/files/history/content", encode_path(workspace_id)),
258 query: Some(params),
259 body: NO_BODY,
260 headers: Vec::new(),
261 idempotent: false,
262 })
263 .await
264 }
265
266 pub async fn get_workspace_terminal(&self, workspace_id: &str) -> Result<serde_json::Value> {
272 self.client
273 .request_json(Request {
274 method: Method::GET,
275 path: format!("/api/v1/workspaces/{}/terminal", encode_path(workspace_id)),
276 query: NO_QUERY,
277 body: NO_BODY,
278 headers: Vec::new(),
279 idempotent: false,
280 })
281 .await
282 }
283
284 pub async fn list(&self) -> Result<models::ListWorkspacesResponse> {
290 self.client
291 .request_json(Request {
292 method: Method::GET,
293 path: "/api/v1/workspaces".to_string(),
294 query: NO_QUERY,
295 body: NO_BODY,
296 headers: Vec::new(),
297 idempotent: false,
298 })
299 .await
300 }
301
302 pub async fn list_agent_workspace_files(&self, agent_id: &str, params: &ListAgentWorkspaceFilesParams) -> Result<models::ListAgentWorkspaceFilesResponse> {
308 self.client
309 .request_json(Request {
310 method: Method::GET,
311 path: format!("/api/v1/agents/{}/workspace/files", encode_path(agent_id)),
312 query: Some(params),
313 body: NO_BODY,
314 headers: Vec::new(),
315 idempotent: false,
316 })
317 .await
318 }
319
320 pub async fn list_workspace_file_history(&self, workspace_id: &str, params: &ListWorkspaceFileHistoryParams) -> Result<models::ListWorkspaceFileHistoryResponse> {
330 self.client
331 .request_json(Request {
332 method: Method::GET,
333 path: format!("/api/v1/workspaces/{}/files/history", encode_path(workspace_id)),
334 query: Some(params),
335 body: NO_BODY,
336 headers: Vec::new(),
337 idempotent: false,
338 })
339 .await
340 }
341
342 pub async fn list_workspace_files(&self, workspace_id: &str, params: &ListWorkspaceFilesParams) -> Result<models::ListWorkspaceFilesResponse> {
348 self.client
349 .request_json(Request {
350 method: Method::GET,
351 path: format!("/api/v1/workspaces/{}/files", encode_path(workspace_id)),
352 query: Some(params),
353 body: NO_BODY,
354 headers: Vec::new(),
355 idempotent: false,
356 })
357 .await
358 }
359
360 pub async fn list_workspace_trash(&self, workspace_id: &str) -> Result<models::ListWorkspaceTrashResponse> {
366 self.client
367 .request_json(Request {
368 method: Method::GET,
369 path: format!("/api/v1/workspaces/{}/trash", encode_path(workspace_id)),
370 query: NO_QUERY,
371 body: NO_BODY,
372 headers: Vec::new(),
373 idempotent: false,
374 })
375 .await
376 }
377
378 pub async fn move_workspace_file(&self, workspace_id: &str, body: &models::MoveWorkspaceFileRequest) -> Result<models::WorkspaceFile> {
384 self.client
385 .request_json(Request {
386 method: Method::POST,
387 path: format!("/api/v1/workspaces/{}/files/move", encode_path(workspace_id)),
388 query: NO_QUERY,
389 body: Some(body),
390 headers: Vec::new(),
391 idempotent: true,
392 })
393 .await
394 }
395
396 pub async fn publish_workspace_snapshot(&self, workspace_id: &str, body: &models::PublishWorkspaceSnapshotRequest) -> Result<models::PublishWorkspaceSnapshotResponse> {
406 self.client
407 .request_json(Request {
408 method: Method::POST,
409 path: format!("/api/v1/workspaces/{}/publish", encode_path(workspace_id)),
410 query: NO_QUERY,
411 body: Some(body),
412 headers: Vec::new(),
413 idempotent: true,
414 })
415 .await
416 }
417
418 pub async fn restore_workspace_trash(&self, workspace_id: &str, body: &models::RestoreWorkspaceTrashRequest) -> Result<models::RestoreWorkspaceTrashResponse> {
424 self.client
425 .request_json(Request {
426 method: Method::POST,
427 path: format!("/api/v1/workspaces/{}/trash/restore", encode_path(workspace_id)),
428 query: NO_QUERY,
429 body: Some(body),
430 headers: Vec::new(),
431 idempotent: true,
432 })
433 .await
434 }
435
436 pub async fn revoke_workspace_share(&self, workspace_id: &str, agent_id: &str) -> Result<models::Workspace> {
442 self.client
443 .request_json(Request {
444 method: Method::DELETE,
445 path: format!("/api/v1/workspaces/{}/share/{}", encode_path(workspace_id), encode_path(agent_id)),
446 query: NO_QUERY,
447 body: NO_BODY,
448 headers: Vec::new(),
449 idempotent: true,
450 })
451 .await
452 }
453
454 pub async fn run_workspace_command(&self, workspace_id: &str, body: &models::RunWorkspaceCommandRequest) -> Result<models::RunWorkspaceCommandResponse> {
460 self.client
461 .request_json(Request {
462 method: Method::POST,
463 path: format!("/api/v1/workspaces/{}/run-command", encode_path(workspace_id)),
464 query: NO_QUERY,
465 body: Some(body),
466 headers: Vec::new(),
467 idempotent: true,
468 })
469 .await
470 }
471
472 pub async fn search_workspace_files(&self, workspace_id: &str, params: &SearchWorkspaceFilesParams) -> Result<models::SearchWorkspaceFilesResponse> {
478 self.client
479 .request_json(Request {
480 method: Method::GET,
481 path: format!("/api/v1/workspaces/{}/search", encode_path(workspace_id)),
482 query: Some(params),
483 body: NO_BODY,
484 headers: Vec::new(),
485 idempotent: false,
486 })
487 .await
488 }
489
490 pub async fn share(&self, workspace_id: &str, body: &models::ShareWorkspaceRequest) -> Result<models::Workspace> {
496 self.client
497 .request_json(Request {
498 method: Method::POST,
499 path: format!("/api/v1/workspaces/{}/share", encode_path(workspace_id)),
500 query: NO_QUERY,
501 body: Some(body),
502 headers: Vec::new(),
503 idempotent: true,
504 })
505 .await
506 }
507
508 pub async fn unassign_workspace(&self, workspace_id: &str, body: &models::UnassignWorkspaceRequest) -> Result<models::Workspace> {
524 self.client
525 .request_json(Request {
526 method: Method::DELETE,
527 path: format!("/api/v1/workspaces/{}/assign", encode_path(workspace_id)),
528 query: NO_QUERY,
529 body: Some(body),
530 headers: Vec::new(),
531 idempotent: true,
532 })
533 .await
534 }
535
536 pub async fn update(&self, workspace_id: &str, body: &models::UpdateWorkspaceRequest) -> Result<models::Workspace> {
542 self.client
543 .request_json(Request {
544 method: Method::PATCH,
545 path: format!("/api/v1/workspaces/{}", encode_path(workspace_id)),
546 query: NO_QUERY,
547 body: Some(body),
548 headers: Vec::new(),
549 idempotent: true,
550 })
551 .await
552 }
553
554 pub async fn upload_workspace_file(&self, workspace_id: &str, body: &models::UploadWorkspaceFileRequest, params: &UploadWorkspaceFileParams) -> Result<serde_json::Value> {
560 self.client
561 .request_multipart(
562 Request {
563 method: Method::PUT,
564 path: format!("/api/v1/workspaces/{}/files", encode_path(workspace_id)),
565 query: Some(params),
566 body: NO_BODY,
567 headers: Vec::new(),
568 idempotent: true,
569 },
570 || {
571 let mut form = reqwest::multipart::Form::new();
572 form = form.part("file", body.file.clone().into_part()?);
573 Ok(form)
574 },
575 )
576 .await
577 }
578}