diff options
| author | soryu <soryu@soryu.co> | 2026-01-20 16:45:34 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2026-01-20 16:45:34 +0000 |
| commit | c6c69af39b29276920b07e0d220f7016335f1019 (patch) | |
| tree | 13a4b58b00f67076b532933b9f8f208122d54bf9 /makima/src/daemon/api | |
| parent | 36233b7cb834223878aa075bb379846eb6d7bb05 (diff) | |
| parent | a3ecb076a4f83f9c33fc3e4ad64af72c81b3ffd0 (diff) | |
| download | soryu-c6c69af39b29276920b07e0d220f7016335f1019.tar.gz soryu-c6c69af39b29276920b07e0d220f7016335f1019.zip | |
Merge lifecycle improvementsmakima/contract-lifecycle-cleanup
Resolved conflict in supervisor.rs by keeping both:
- supervisor_complete and supervisor_resume_contract methods (lifecycle management)
- delete_task and update_task methods (task management)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'makima/src/daemon/api')
| -rw-r--r-- | makima/src/daemon/api/client.rs | 22 | ||||
| -rw-r--r-- | makima/src/daemon/api/contract.rs | 33 | ||||
| -rw-r--r-- | makima/src/daemon/api/supervisor.rs | 25 |
3 files changed, 80 insertions, 0 deletions
diff --git a/makima/src/daemon/api/client.rs b/makima/src/daemon/api/client.rs index 2318d5a..ca1b2a8 100644 --- a/makima/src/daemon/api/client.rs +++ b/makima/src/daemon/api/client.rs @@ -105,6 +105,28 @@ impl ApiClient { self.handle_response(response).await } + /// Make a DELETE request. + pub async fn delete(&self, path: &str) -> Result<(), ApiError> { + let url = format!("{}{}", self.base_url, path); + let response = self.client + .delete(&url) + .header("X-Makima-Tool-Key", &self.api_key) + .header("X-Makima-API-Key", &self.api_key) + .send() + .await?; + + let status = response.status(); + if !status.is_success() { + let body = response.text().await.unwrap_or_default(); + return Err(ApiError::Api { + status: status.as_u16(), + message: body, + }); + } + + Ok(()) + } + /// Handle API response. async fn handle_response<T: DeserializeOwned>( &self, diff --git a/makima/src/daemon/api/contract.rs b/makima/src/daemon/api/contract.rs index aac6b94..f7fa696 100644 --- a/makima/src/daemon/api/contract.rs +++ b/makima/src/daemon/api/contract.rs @@ -41,7 +41,40 @@ pub struct CreateFileRequest { pub content: String, } +/// Request to update a contract. +#[derive(Serialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct UpdateContractRequest { + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option<String>, +} + impl ApiClient { + /// List all contracts for the authenticated user. + pub async fn list_contracts(&self) -> Result<JsonValue, ApiError> { + self.get("/api/v1/contracts").await + } + + /// Delete a contract. + pub async fn delete_contract(&self, contract_id: Uuid) -> Result<(), ApiError> { + self.delete(&format!("/api/v1/contracts/{}", contract_id)) + .await + } + + /// Update a contract. + pub async fn update_contract( + &self, + contract_id: Uuid, + name: Option<String>, + description: Option<String>, + ) -> Result<JsonValue, ApiError> { + let req = UpdateContractRequest { name, description }; + self.put(&format!("/api/v1/contracts/{}", contract_id), &req) + .await + } + /// Get contract status. pub async fn contract_status(&self, contract_id: Uuid) -> Result<JsonValue, ApiError> { self.get(&format!("/api/v1/contracts/{}/daemon/status", contract_id)) diff --git a/makima/src/daemon/api/supervisor.rs b/makima/src/daemon/api/supervisor.rs index 26d786c..bd3aefd 100644 --- a/makima/src/daemon/api/supervisor.rs +++ b/makima/src/daemon/api/supervisor.rs @@ -283,4 +283,29 @@ impl ApiClient { self.put(&format!("/api/v1/contracts/{}", contract_id), &req) .await } + + /// Delete a task. + pub async fn delete_task(&self, task_id: Uuid) -> Result<(), ApiError> { + self.delete(&format!("/api/v1/mesh/tasks/{}", task_id)).await + } + + /// Update a task. + pub async fn update_task( + &self, + task_id: Uuid, + name: Option<String>, + plan: Option<String>, + ) -> Result<JsonValue, ApiError> { + #[derive(Serialize)] + #[serde(rename_all = "camelCase")] + struct UpdateTaskRequest { + #[serde(skip_serializing_if = "Option::is_none")] + name: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + plan: Option<String>, + } + let req = UpdateTaskRequest { name, plan }; + self.put(&format!("/api/v1/mesh/tasks/{}", task_id), &req) + .await + } } |
