diff --git a/app/MindWork AI Studio/Tools/RustService.Secrets.cs b/app/MindWork AI Studio/Tools/RustService.Secrets.cs
new file mode 100644
index 00000000..a70a1273
--- /dev/null
+++ b/app/MindWork AI Studio/Tools/RustService.Secrets.cs
@@ -0,0 +1,76 @@
+using AIStudio.Tools.Rust;
+
+namespace AIStudio.Tools;
+
+public sealed partial class RustService
+{
+ ///
+ /// Try to get the secret data for the given secret ID.
+ ///
+ /// The secret ID to get the data for.
+ /// Indicates if we are trying to get the data. In that case, we don't log errors.
+ /// The requested secret.
+ public async Task GetSecret(ISecretId secretId, bool isTrying = false)
+ {
+ var secretRequest = new SelectSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, isTrying);
+ var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions);
+ if (!result.IsSuccessStatusCode)
+ {
+ if(!isTrying)
+ this.logger!.LogError($"Failed to get the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'");
+ return new RequestedSecret(false, new EncryptedText(string.Empty), "Failed to get the secret data due to an API issue.");
+ }
+
+ var secret = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions);
+ if (!secret.Success && !isTrying)
+ this.logger!.LogError($"Failed to get the secret data for secret ID '{secretId.SecretId}': '{secret.Issue}'");
+
+ return secret;
+ }
+
+ ///
+ /// Try to store the secret data for the given secret ID.
+ ///
+ /// The secret ID to store the data for.
+ /// The data to store.
+ /// The store secret response.
+ public async Task SetSecret(ISecretId secretId, string secretData)
+ {
+ var encryptedSecret = await this.encryptor!.Encrypt(secretData);
+ var request = new StoreSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, encryptedSecret);
+ var result = await this.http.PostAsJsonAsync("/secrets/store", request, this.jsonRustSerializerOptions);
+ if (!result.IsSuccessStatusCode)
+ {
+ this.logger!.LogError($"Failed to store the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'");
+ return new StoreSecretResponse(false, "Failed to get the secret data due to an API issue.");
+ }
+
+ var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions);
+ if (!state.Success)
+ this.logger!.LogError($"Failed to store the secret data for secret ID '{secretId.SecretId}': '{state.Issue}'");
+
+ return state;
+ }
+
+ ///
+ /// Tries to delete the secret data for the given secret ID.
+ ///
+ /// The secret ID to delete the data for.
+ /// The delete secret response.
+ public async Task DeleteSecret(ISecretId secretId)
+ {
+ var request = new SelectSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, false);
+ var result = await this.http.PostAsJsonAsync("/secrets/delete", request, this.jsonRustSerializerOptions);
+ if (!result.IsSuccessStatusCode)
+ {
+ this.logger!.LogError($"Failed to delete the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'");
+ return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = "Failed to delete the secret data due to an API issue."};
+ }
+
+ var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions);
+ if (!state.Success)
+ this.logger!.LogError($"Failed to delete the secret data for secret ID '{secretId.SecretId}': '{state.Issue}'");
+
+ return state;
+ }
+}
\ No newline at end of file