Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions crates/goose-server/src/openapi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ use goose::providers::base::ProviderMetadata;
super::routes::config_management::read_config,
super::routes::config_management::add_extension,
super::routes::config_management::remove_extension,
super::routes::config_management::toggle_extension,
super::routes::config_management::get_extensions,
super::routes::config_management::update_extension,
super::routes::config_management::read_all_config,
super::routes::config_management::providers
),
Expand Down
102 changes: 14 additions & 88 deletions crates/goose-server/src/routes/config_management.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::routes::utils::check_provider_configured;
use crate::state::AppState;
use axum::routing::put;
use axum::{
extract::State,
routing::{delete, get, post},
Expand Down Expand Up @@ -188,7 +187,7 @@ pub async fn get_extensions(
path = "/config/extensions",
request_body = ExtensionQuery,
responses(
(status = 200, description = "Extension added successfully", body = String),
(status = 200, description = "Extension added or updated successfully", body = String),
(status = 400, description = "Invalid request"),
(status = 500, description = "Internal server error")
)
Expand All @@ -200,12 +199,24 @@ pub async fn add_extension(
) -> Result<Json<String>, StatusCode> {
verify_secret_key(&headers, &state)?;

// Get existing extensions to check if this is an update
let extensions = ExtensionManager::get_all().map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
let key = name_to_key(&extension_query.name);

let is_update = extensions.iter().any(|e| e.config.key() == key);

// Use ExtensionManager to set the extension
match ExtensionManager::set(ExtensionEntry {
enabled: extension_query.enabled,
config: extension_query.config,
}) {
Ok(_) => Ok(Json(format!("Added extension {}", extension_query.name))),
Ok(_) => {
if is_update {
Ok(Json(format!("Updated extension {}", extension_query.name)))
} else {
Ok(Json(format!("Added extension {}", extension_query.name)))
}
}
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
}
}
Expand Down Expand Up @@ -234,89 +245,6 @@ pub async fn remove_extension(
}
}

#[utoipa::path(
put,
path = "/config/extensions/{name}",
request_body = ExtensionQuery,
responses(
(status = 200, description = "Extension updated successfully", body = String),
(status = 404, description = "Extension not found"),
(status = 500, description = "Internal server error")
)
)]
pub async fn update_extension(
State(state): State<AppState>,
headers: HeaderMap,
axum::extract::Path(name): axum::extract::Path<String>,
Json(extension_query): Json<ExtensionQuery>,
) -> Result<Json<String>, StatusCode> {
verify_secret_key(&headers, &state)?;

let key = name_to_key(&name);

// Check if extension exists
let extensions = ExtensionManager::get_all().map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;

if !extensions.iter().any(|entry| entry.config.key() == key) {
return Err(StatusCode::NOT_FOUND);
}

// Use ExtensionManager to update the extension
match ExtensionManager::set(ExtensionEntry {
enabled: extension_query.enabled,
config: extension_query.config,
}) {
Ok(_) => Ok(Json(format!("Updated extension {}", extension_query.name))),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
}
}

#[utoipa::path(
post,
path = "/extensions/{name}/toggle",
responses(
(status = 200, description = "Extension toggled successfully", body = String),
(status = 404, description = "Extension not found"),
(status = 500, description = "Internal server error")
)
)]
pub async fn toggle_extension(
State(state): State<AppState>,
headers: HeaderMap,
axum::extract::Path(name): axum::extract::Path<String>,
) -> Result<Json<String>, StatusCode> {
verify_secret_key(&headers, &state)?;

let key = name_to_key(&name);

// Get the extension
let extensions = ExtensionManager::get_all().map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;

let extension = extensions
.iter()
.find(|e| e.config.key() == key)
.ok_or(StatusCode::NOT_FOUND)?;

// Create a new entry with toggled enabled state
let updated_entry = ExtensionEntry {
enabled: !extension.enabled,
config: extension.config.clone(),
};

// Update using ExtensionManager
match ExtensionManager::set(updated_entry) {
Ok(_) => {
let status = if !extension.enabled {
"enabled"
} else {
"disabled"
};
Ok(Json(format!("Extension {} {}", name, status)))
}
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
}
}

#[utoipa::path(
get,
path = "/config",
Expand Down Expand Up @@ -382,9 +310,7 @@ pub fn routes(state: AppState) -> Router {
.route("/config/read", post(read_config))
.route("/config/extensions", get(get_extensions))
.route("/config/extensions", post(add_extension))
.route("/config/extensions/:name", put(update_extension))
.route("/config/extensions/:name", delete(remove_extension))
.route("/extensions/:name/toggle", post(toggle_extension))
.route("/config/providers", get(providers))
.with_state(state)
}
82 changes: 1 addition & 81 deletions ui/desktop/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
},
"responses": {
"200": {
"description": "Extension added successfully",
"description": "Extension added or updated successfully",
"content": {
"text/plain": {
"schema": {
Expand All @@ -91,50 +91,6 @@
}
},
"/config/extensions/{name}": {
"put": {
"tags": [
"super::routes::config_management"
],
"operationId": "update_extension",
"parameters": [
{
"name": "name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ExtensionQuery"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Extension updated successfully",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"404": {
"description": "Extension not found"
},
"500": {
"description": "Internal server error"
}
}
},
"delete": {
"tags": [
"super::routes::config_management"
Expand Down Expand Up @@ -292,42 +248,6 @@
}
}
}
},
"/extensions/{name}/toggle": {
"post": {
"tags": [
"super::routes::config_management"
],
"operationId": "toggle_extension",
"parameters": [
{
"name": "name",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Extension toggled successfully",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"404": {
"description": "Extension not found"
},
"500": {
"description": "Internal server error"
}
}
}
}
},
"components": {
Expand Down
20 changes: 1 addition & 19 deletions ui/desktop/src/api/sdk.gen.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// This file is auto-generated by @hey-api/openapi-ts

import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch';
import type { ReadAllConfigData, ReadAllConfigResponse, GetExtensionsData, GetExtensionsResponse, AddExtensionData, AddExtensionResponse, RemoveExtensionData, RemoveExtensionResponse, UpdateExtensionData, UpdateExtensionResponse, ProvidersData, ProvidersResponse2, ReadConfigData, RemoveConfigData, RemoveConfigResponse, UpsertConfigData, UpsertConfigResponse, ToggleExtensionData, ToggleExtensionResponse } from './types.gen';
import type { ReadAllConfigData, ReadAllConfigResponse, GetExtensionsData, GetExtensionsResponse, AddExtensionData, AddExtensionResponse, RemoveExtensionData, RemoveExtensionResponse, ProvidersData, ProvidersResponse2, ReadConfigData, RemoveConfigData, RemoveConfigResponse, UpsertConfigData, UpsertConfigResponse } from './types.gen';
import { client as _heyApiClient } from './client.gen';

export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = ClientOptions<TData, ThrowOnError> & {
Expand Down Expand Up @@ -50,17 +50,6 @@ export const removeExtension = <ThrowOnError extends boolean = false>(options: O
});
};

export const updateExtension = <ThrowOnError extends boolean = false>(options: Options<UpdateExtensionData, ThrowOnError>) => {
return (options.client ?? _heyApiClient).put<UpdateExtensionResponse, unknown, ThrowOnError>({
url: '/config/extensions/{name}',
...options,
headers: {
'Content-Type': 'application/json',
...options?.headers
}
});
};

export const providers = <ThrowOnError extends boolean = false>(options?: Options<ProvidersData, ThrowOnError>) => {
return (options?.client ?? _heyApiClient).get<ProvidersResponse2, unknown, ThrowOnError>({
url: '/config/providers',
Expand Down Expand Up @@ -99,11 +88,4 @@ export const upsertConfig = <ThrowOnError extends boolean = false>(options: Opti
...options?.headers
}
});
};

export const toggleExtension = <ThrowOnError extends boolean = false>(options: Options<ToggleExtensionData, ThrowOnError>) => {
return (options.client ?? _heyApiClient).post<ToggleExtensionResponse, unknown, ThrowOnError>({
url: '/extensions/{name}/toggle',
...options
});
};
60 changes: 1 addition & 59 deletions ui/desktop/src/api/types.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ export type AddExtensionErrors = {

export type AddExtensionResponses = {
/**
* Extension added successfully
* Extension added or updated successfully
*/
200: string;
};
Expand Down Expand Up @@ -219,35 +219,6 @@ export type RemoveExtensionResponses = {

export type RemoveExtensionResponse = RemoveExtensionResponses[keyof RemoveExtensionResponses];

export type UpdateExtensionData = {
body: ExtensionQuery;
path: {
name: string;
};
query?: never;
url: '/config/extensions/{name}';
};

export type UpdateExtensionErrors = {
/**
* Extension not found
*/
404: unknown;
/**
* Internal server error
*/
500: unknown;
};

export type UpdateExtensionResponses = {
/**
* Extension updated successfully
*/
200: string;
};

export type UpdateExtensionResponse = UpdateExtensionResponses[keyof UpdateExtensionResponses];

export type ProvidersData = {
body?: never;
path?: never;
Expand Down Expand Up @@ -335,35 +306,6 @@ export type UpsertConfigResponses = {

export type UpsertConfigResponse = UpsertConfigResponses[keyof UpsertConfigResponses];

export type ToggleExtensionData = {
body?: never;
path: {
name: string;
};
query?: never;
url: '/extensions/{name}/toggle';
};

export type ToggleExtensionErrors = {
/**
* Extension not found
*/
404: unknown;
/**
* Internal server error
*/
500: unknown;
};

export type ToggleExtensionResponses = {
/**
* Extension toggled successfully
*/
200: string;
};

export type ToggleExtensionResponse = ToggleExtensionResponses[keyof ToggleExtensionResponses];

export type ClientOptions = {
baseUrl: `${string}://${string}` | (string & {});
};
Loading
Loading