| import { SettingsClient } from "@openhands/typescript-client/clients"; |
| import { isSdkHttpStatusError } from "./agent-server-compatibility"; |
| import { getActiveBackend } from "./backend-registry/active-store"; |
| import { |
| deleteCloudSecret, |
| fetchCloudSecrets, |
| saveCloudSecret, |
| } from "./cloud/secrets-service.api"; |
| import { getAgentServerClientOptions } from "./agent-server-client-options"; |
| import { CustomSecretWithoutValue } from "./secrets-service.types"; |
| import { withRetry } from "./with-retry"; |
|
|
| async function fetchSecrets(): Promise<CustomSecretWithoutValue[]> { |
| if (getActiveBackend().backend.kind === "cloud") { |
| return withRetry(() => fetchCloudSecrets()); |
| } |
| const response = await withRetry(() => |
| new SettingsClient(getAgentServerClientOptions()).listSecrets(), |
| ); |
| return response.secrets.map((s) => ({ |
| name: s.name, |
| description: s.description, |
| })); |
| } |
|
|
| export class SecretsService { |
| |
| |
| |
| |
| |
| |
| |
| static async getSecrets(): Promise<CustomSecretWithoutValue[]> { |
| try { |
| return await fetchSecrets(); |
| } catch (error) { |
| console.error("Failed to fetch secrets after retries:", error); |
| return []; |
| } |
| } |
|
|
| |
| |
| |
| |
| static async getSecretsOrThrow(): Promise<CustomSecretWithoutValue[]> { |
| return fetchSecrets(); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static async createSecret( |
| name: string, |
| value: string, |
| description?: string, |
| ): Promise<void> { |
| if (getActiveBackend().backend.kind === "cloud") { |
| await saveCloudSecret({ name, value, description }); |
| return; |
| } |
| await withRetry(() => |
| new SettingsClient(getAgentServerClientOptions()).upsertSecret({ |
| name, |
| value, |
| description, |
| }), |
| ); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static async updateSecret( |
| secretToEdit: string, |
| name: string, |
| description?: string, |
| value?: string, |
| ): Promise<void> { |
| if (getActiveBackend().backend.kind === "cloud") { |
| await saveCloudSecret({ |
| name, |
| value, |
| description, |
| previousName: secretToEdit, |
| }); |
| return; |
| } |
|
|
| const client = new SettingsClient(getAgentServerClientOptions()); |
| const nextValue = |
| value ?? (await withRetry(() => client.getSecret(secretToEdit))); |
|
|
| await withRetry(() => |
| client.upsertSecret({ |
| name, |
| value: nextValue, |
| description, |
| }), |
| ); |
|
|
| if (name !== secretToEdit) { |
| await this.deleteSecret(secretToEdit); |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| static async deleteSecret(name: string): Promise<void> { |
| try { |
| if (getActiveBackend().backend.kind === "cloud") { |
| await withRetry(() => deleteCloudSecret(name)); |
| return; |
| } |
| await withRetry(() => |
| new SettingsClient(getAgentServerClientOptions()).deleteSecret(name), |
| ); |
| } catch (error) { |
| |
| |
| |
| if ( |
| isSdkHttpStatusError(error, 404) || |
| (error && |
| typeof error === "object" && |
| "response" in error && |
| (error as { response?: { status?: number } }).response?.status === |
| 404) |
| ) { |
| return; |
| } |
| throw error; |
| } |
| } |
| } |
|
|