diff --git a/crates/goose-cli/Cargo.toml b/crates/goose-cli/Cargo.toml index a69c702cbb1f..b4262268e2f1 100644 --- a/crates/goose-cli/Cargo.toml +++ b/crates/goose-cli/Cargo.toml @@ -68,9 +68,10 @@ sigstore-verification = { version = "0.1", default-features = false, features = winapi = { version = "0.3", features = ["wincred"] } [features] -default = ["code-mode"] +default = ["code-mode", "local-inference"] code-mode = ["goose/code-mode", "goose-acp/code-mode"] -cuda = ["goose/cuda"] +local-inference = ["goose/local-inference"] +cuda = ["goose/cuda", "local-inference"] # disables the update command disable-update = [] diff --git a/crates/goose-cli/src/cli.rs b/crates/goose-cli/src/cli.rs index 063e73b8f207..143e3db27e00 100644 --- a/crates/goose-cli/src/cli.rs +++ b/crates/goose-cli/src/cli.rs @@ -865,6 +865,7 @@ enum Command { command: TermCommand, }, /// Manage local inference models + #[cfg(feature = "local-inference")] #[command(about = "Manage local inference models", visible_alias = "lm")] LocalModels { #[command(subcommand)] @@ -892,6 +893,7 @@ enum Command { }, } +#[cfg(feature = "local-inference")] #[derive(Subcommand)] enum LocalModelsCommand { /// Search HuggingFace for GGUF models @@ -1013,6 +1015,7 @@ fn get_command_name(command: &Option) -> &'static str { Some(Command::Update { .. }) => "update", Some(Command::Recipe { .. }) => "recipe", Some(Command::Term { .. }) => "term", + #[cfg(feature = "local-inference")] Some(Command::LocalModels { .. }) => "local-models", Some(Command::Completion { .. }) => "completion", Some(Command::ValidateExtensions { .. }) => "validate-extensions", @@ -1473,6 +1476,7 @@ async fn handle_term_subcommand(command: TermCommand) -> Result<()> { } } +#[cfg(feature = "local-inference")] async fn handle_local_models_command(command: LocalModelsCommand) -> Result<()> { use goose::providers::local_inference::hf_models; use goose::providers::local_inference::local_model_registry::{ @@ -1759,6 +1763,7 @@ pub async fn cli() -> anyhow::Result<()> { } Some(Command::Recipe { command }) => handle_recipe_subcommand(command), Some(Command::Term { command }) => handle_term_subcommand(command).await, + #[cfg(feature = "local-inference")] Some(Command::LocalModels { command }) => handle_local_models_command(command).await, Some(Command::ValidateExtensions { file }) => { use goose::agents::validate_extensions::validate_bundled_extensions; diff --git a/crates/goose-server/Cargo.toml b/crates/goose-server/Cargo.toml index c8902014b017..f8774920ac9d 100644 --- a/crates/goose-server/Cargo.toml +++ b/crates/goose-server/Cargo.toml @@ -11,9 +11,10 @@ description.workspace = true workspace = true [features] -default = ["code-mode"] +default = ["code-mode", "local-inference"] code-mode = ["goose/code-mode"] -cuda = ["goose/cuda"] +local-inference = ["goose/local-inference"] +cuda = ["goose/cuda", "local-inference"] [dependencies] goose = { path = "../goose", default-features = false } diff --git a/crates/goose-server/src/auth.rs b/crates/goose-server/src/auth.rs index 66a2d2a1eef7..d174306e6f25 100644 --- a/crates/goose-server/src/auth.rs +++ b/crates/goose-server/src/auth.rs @@ -12,6 +12,7 @@ pub async fn check_token( next: Next, ) -> Result { if request.uri().path() == "/status" + || request.uri().path() == "/features" || request.uri().path() == "/mcp-ui-proxy" || request.uri().path() == "/mcp-app-proxy" || request.uri().path() == "/mcp-app-guest" diff --git a/crates/goose-server/src/openapi.rs b/crates/goose-server/src/openapi.rs index eec8aeefe2ac..6eaaa1bc6140 100644 --- a/crates/goose-server/src/openapi.rs +++ b/crates/goose-server/src/openapi.rs @@ -479,20 +479,7 @@ derive_utoipa!(Icon as IconSchema); super::routes::telemetry::send_telemetry_event, super::routes::dictation::transcribe_dictation, super::routes::dictation::get_dictation_config, - super::routes::dictation::list_models, - super::routes::dictation::download_model, - super::routes::dictation::get_download_progress, - super::routes::dictation::cancel_download, - super::routes::dictation::delete_model, - super::routes::local_inference::list_local_models, - super::routes::local_inference::search_hf_models, - super::routes::local_inference::get_repo_files, - super::routes::local_inference::download_hf_model, - super::routes::local_inference::get_local_model_download_progress, - super::routes::local_inference::cancel_local_model_download, - super::routes::local_inference::delete_local_model, - super::routes::local_inference::get_model_settings, - super::routes::local_inference::update_model_settings, + super::routes::features::get_features, ), components(schemas( super::routes::config_management::UpsertConfigQuery, @@ -671,6 +658,33 @@ derive_utoipa!(Icon as IconSchema); super::routes::dictation::TranscribeResponse, goose::dictation::providers::DictationProvider, super::routes::dictation::DictationProviderStatus, + super::routes::features::FeaturesResponse, + DownloadProgress, + DownloadStatus, + )) +)] +pub struct ApiDoc; + +#[cfg(feature = "local-inference")] +#[derive(OpenApi)] +#[openapi( + paths( + super::routes::dictation::list_models, + super::routes::dictation::download_model, + super::routes::dictation::get_download_progress, + super::routes::dictation::cancel_download, + super::routes::dictation::delete_model, + super::routes::local_inference::list_local_models, + super::routes::local_inference::search_hf_models, + super::routes::local_inference::get_repo_files, + super::routes::local_inference::download_hf_model, + super::routes::local_inference::get_local_model_download_progress, + super::routes::local_inference::cancel_local_model_download, + super::routes::local_inference::delete_local_model, + super::routes::local_inference::get_model_settings, + super::routes::local_inference::update_model_settings, + ), + components(schemas( super::routes::dictation::WhisperModelResponse, super::routes::local_inference::LocalModelResponse, super::routes::local_inference::ModelDownloadStatus, @@ -681,14 +695,17 @@ derive_utoipa!(Icon as IconSchema); super::routes::local_inference::RepoVariantsResponse, goose::providers::local_inference::local_model_registry::ModelSettings, goose::providers::local_inference::local_model_registry::SamplingConfig, - DownloadProgress, - DownloadStatus, )) )] -pub struct ApiDoc; +pub struct LocalInferenceApiDoc; #[allow(dead_code)] // Used by generate_schema binary pub fn generate_schema() -> String { - let api_doc = ApiDoc::openapi(); + #[allow(unused_mut)] + let mut api_doc = ApiDoc::openapi(); + + #[cfg(feature = "local-inference")] + api_doc.merge(LocalInferenceApiDoc::openapi()); + serde_json::to_string_pretty(&api_doc).unwrap() } diff --git a/crates/goose-server/src/routes/dictation.rs b/crates/goose-server/src/routes/dictation.rs index b4aaf8b71b46..e7c8111451c5 100644 --- a/crates/goose-server/src/routes/dictation.rs +++ b/crates/goose-server/src/routes/dictation.rs @@ -1,16 +1,22 @@ use crate::routes::errors::ErrorResponse; use crate::state::AppState; use axum::{ - extract::{DefaultBodyLimit, Path}, + extract::DefaultBodyLimit, http::StatusCode, - routing::{delete, get, post}, + routing::{get, post}, Json, Router, }; +#[cfg(feature = "local-inference")] +use axum::{extract::Path, routing::delete}; use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +#[cfg(feature = "local-inference")] +use goose::dictation::providers::transcribe_local; use goose::dictation::providers::{ - is_configured, transcribe_local, transcribe_with_provider, DictationProvider, PROVIDERS, + all_providers, is_configured, transcribe_with_provider, DictationProvider, }; +#[cfg(feature = "local-inference")] use goose::dictation::whisper; +#[cfg(feature = "local-inference")] use goose::download_manager::{get_download_manager, DownloadProgress}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -19,6 +25,7 @@ use utoipa::ToSchema; const MAX_AUDIO_SIZE_BYTES: usize = 50 * 1024 * 1024; +#[cfg(feature = "local-inference")] #[derive(Debug, Serialize, ToSchema)] pub struct WhisperModelResponse { #[serde(flatten)] @@ -171,6 +178,7 @@ pub async fn transcribe_dictation( ) .await .map_err(convert_error)?, + #[cfg(feature = "local-inference")] DictationProvider::Local => transcribe_local(audio_bytes).await.map_err(convert_error)?, }; @@ -189,7 +197,7 @@ pub async fn get_dictation_config( let config = goose::config::Config::global(); let mut providers = HashMap::new(); - for def in PROVIDERS { + for def in all_providers() { let provider = def.provider; let configured = is_configured(provider); @@ -222,6 +230,7 @@ pub async fn get_dictation_config( Ok(Json(providers)) } +#[cfg(feature = "local-inference")] #[utoipa::path( get, path = "/dictation/models", @@ -243,6 +252,7 @@ pub async fn list_models() -> Result>, ErrorRespo Ok(Json(models)) } +#[cfg(feature = "local-inference")] #[utoipa::path( post, path = "/dictation/models/{model_id}/download", @@ -274,6 +284,7 @@ pub async fn download_model(Path(model_id): Path) -> Result) -> Result) -> Result) -> Router { - Router::new() + let router = Router::new() .route("/dictation/transcribe", post(transcribe_dictation)) - .route("/dictation/config", get(get_dictation_config)) + .route("/dictation/config", get(get_dictation_config)); + + #[cfg(feature = "local-inference")] + let router = router .route("/dictation/models", get(list_models)) .route( "/dictation/models/{model_id}/download", @@ -350,7 +366,9 @@ pub fn routes(state: Arc) -> Router { "/dictation/models/{model_id}/download", delete(cancel_download), ) - .route("/dictation/models/{model_id}", delete(delete_model)) + .route("/dictation/models/{model_id}", delete(delete_model)); + + router .layer(DefaultBodyLimit::max(MAX_AUDIO_SIZE_BYTES)) .with_state(state) } diff --git a/crates/goose-server/src/routes/features.rs b/crates/goose-server/src/routes/features.rs new file mode 100644 index 000000000000..f974df9fa9ca --- /dev/null +++ b/crates/goose-server/src/routes/features.rs @@ -0,0 +1,33 @@ +use axum::{routing::get, Json, Router}; +use serde::Serialize; +use std::collections::HashMap; +use utoipa::ToSchema; + +#[derive(Serialize, ToSchema)] +pub struct FeaturesResponse { + /// Map of feature name to enabled status + pub features: HashMap, +} + +#[utoipa::path( + get, + path = "/features", + responses( + (status = 200, description = "Compile-time feature flags", body = FeaturesResponse), + ) +)] +pub async fn get_features() -> Json { + let mut features = HashMap::new(); + + features.insert( + "local-inference".to_string(), + cfg!(feature = "local-inference"), + ); + features.insert("code-mode".to_string(), cfg!(feature = "code-mode")); + + Json(FeaturesResponse { features }) +} + +pub fn routes() -> Router { + Router::new().route("/features", get(get_features)) +} diff --git a/crates/goose-server/src/routes/mod.rs b/crates/goose-server/src/routes/mod.rs index c440a0d99157..00777d80acc4 100644 --- a/crates/goose-server/src/routes/mod.rs +++ b/crates/goose-server/src/routes/mod.rs @@ -3,7 +3,9 @@ pub mod agent; pub mod config_management; pub mod dictation; pub mod errors; +pub mod features; pub mod gateway; +#[cfg(feature = "local-inference")] pub mod local_inference; pub mod mcp_app_proxy; pub mod mcp_ui_proxy; @@ -27,13 +29,11 @@ use axum::Router; // Function to configure all routes pub fn configure(state: Arc, secret_key: String) -> Router { - Router::new() + let router = Router::new() .merge(status::routes(state.clone())) .merge(reply::routes(state.clone())) .merge(action_required::routes(state.clone())) .merge(agent::routes(state.clone())) - .merge(dictation::routes(state.clone())) - .merge(local_inference::routes(state.clone())) .merge(config_management::routes(state.clone())) .merge(prompts::routes()) .merge(recipe::routes(state.clone())) @@ -46,5 +46,12 @@ pub fn configure(state: Arc, secret_key: String) -> Rout .merge(mcp_ui_proxy::routes(secret_key.clone())) .merge(mcp_app_proxy::routes(secret_key)) .merge(session_events::routes(state.clone())) - .merge(sampling::routes(state)) + .merge(sampling::routes(state.clone())) + .merge(dictation::routes(state.clone())) + .merge(features::routes()); + + #[cfg(feature = "local-inference")] + let router = router.merge(local_inference::routes(state)); + + router } diff --git a/crates/goose-server/src/state.rs b/crates/goose-server/src/state.rs index 09d903c9521d..73bb1726acad 100644 --- a/crates/goose-server/src/state.rs +++ b/crates/goose-server/src/state.rs @@ -13,6 +13,7 @@ use crate::session_event_bus::SessionEventBus; use crate::tunnel::TunnelManager; use goose::agents::ExtensionLoadResult; use goose::gateway::manager::GatewayManager; +#[cfg(feature = "local-inference")] use goose::providers::local_inference::InferenceRuntime; type ExtensionLoadingTasks = @@ -26,6 +27,7 @@ pub struct AppState { pub tunnel_manager: Arc, pub gateway_manager: Arc, pub extension_loading_tasks: ExtensionLoadingTasks, + #[cfg(feature = "local-inference")] pub inference_runtime: Arc, session_buses: Arc>>>, } @@ -45,6 +47,7 @@ impl AppState { tunnel_manager, gateway_manager, extension_loading_tasks: Arc::new(Mutex::new(HashMap::new())), + #[cfg(feature = "local-inference")] inference_runtime: InferenceRuntime::get_or_init(), session_buses: Arc::new(Mutex::new(HashMap::new())), })) diff --git a/crates/goose/Cargo.toml b/crates/goose/Cargo.toml index ca94fe8d8b04..01eaf708dc71 100644 --- a/crates/goose/Cargo.toml +++ b/crates/goose/Cargo.toml @@ -8,9 +8,19 @@ repository.workspace = true description.workspace = true [features] -default = ["code-mode"] +default = ["code-mode", "local-inference"] code-mode = ["dep:pctx_code_mode"] -cuda = ["candle-core/cuda", "candle-nn/cuda", "llama-cpp-2/cuda"] +local-inference = [ + "dep:candle-core", + "dep:candle-nn", + "dep:candle-transformers", + "dep:llama-cpp-2", + "dep:tokenizers", + "dep:symphonia", + "dep:rubato", + "dep:byteorder", +] +cuda = ["local-inference", "candle-core/cuda", "candle-nn/cuda", "llama-cpp-2/cuda"] [lints] workspace = true @@ -107,14 +117,14 @@ sacp = { workspace = true } agent-client-protocol-schema = { version = "0.10", features = ["unstable"] } unicode-normalization = "0.1" -# For local Whisper transcription -candle-core = { version = "0.9", default-features = false } -candle-nn = { version = "0.9", default-features = false } -candle-transformers = { version = "0.9", default-features = false } -byteorder = "1.5.0" -tokenizers = { version = "0.21.0", default-features = false, features = ["onig"] } -symphonia = { version = "0.5", features = ["all"] } -rubato = "0.16" +# For local Whisper transcription (optional, behind "local-inference" feature) +candle-core = { version = "0.9", default-features = false, optional = true } +candle-nn = { version = "0.9", default-features = false, optional = true } +candle-transformers = { version = "0.9", default-features = false, optional = true } +byteorder = { version = "1.5.0", optional = true } +tokenizers = { version = "0.21.0", default-features = false, features = ["onig"], optional = true } +symphonia = { version = "0.5", features = ["all"], optional = true } +rubato = { version = "0.16", optional = true } zip = "0.6" sys-info = "0.9" @@ -139,7 +149,7 @@ tree-sitter-typescript = { workspace = true } which = { workspace = true } pctx_code_mode = { version = "^0.3.0", optional = true } pulldown-cmark = "0.13.0" -llama-cpp-2 = { version = "0.1.137", features = ["sampler"] } +llama-cpp-2 = { version = "0.1.137", features = ["sampler"], optional = true } encoding_rs = "0.8.35" pastey = "0.2.1" shell-words = "1.1.1" @@ -149,9 +159,9 @@ winapi = { version = "0.3", features = ["wincred"] } # Platform-specific GPU acceleration for Whisper and local inference [target.'cfg(target_os = "macos")'.dependencies] -candle-core = { version = "0.9", default-features = false, features = ["metal"] } -candle-nn = { version = "0.9", default-features = false, features = ["metal"] } -llama-cpp-2 = { version = "0.1.137", features = ["sampler", "metal"] } +candle-core = { version = "0.9", default-features = false, features = ["metal"], optional = true } +candle-nn = { version = "0.9", default-features = false, features = ["metal"], optional = true } +llama-cpp-2 = { version = "0.1.137", features = ["sampler", "metal"], optional = true } [dev-dependencies] serial_test = { workspace = true } @@ -175,6 +185,10 @@ path = "examples/agent.rs" name = "databricks_oauth" path = "examples/databricks_oauth.rs" +[[example]] +name = "test_whisper" +path = "examples/test_whisper.rs" +required-features = ["local-inference"] [[bin]] name = "analyze_cli" diff --git a/crates/goose/src/dictation/mod.rs b/crates/goose/src/dictation/mod.rs index d14fb2164201..8e70c8204578 100644 --- a/crates/goose/src/dictation/mod.rs +++ b/crates/goose/src/dictation/mod.rs @@ -1,2 +1,3 @@ pub mod providers; +#[cfg(feature = "local-inference")] pub mod whisper; diff --git a/crates/goose/src/dictation/providers.rs b/crates/goose/src/dictation/providers.rs index d1d88202dcd6..a23d971f946b 100644 --- a/crates/goose/src/dictation/providers.rs +++ b/crates/goose/src/dictation/providers.rs @@ -1,18 +1,22 @@ use crate::config::Config; +#[cfg(feature = "local-inference")] use crate::dictation::whisper::LOCAL_WHISPER_MODEL_CONFIG_KEY; use crate::providers::api_client::{ApiClient, AuthMethod}; use anyhow::Result; use serde::{Deserialize, Serialize}; +#[cfg(feature = "local-inference")] use std::sync::Mutex; use std::time::Duration; use utoipa::ToSchema; const REQUEST_TIMEOUT: Duration = Duration::from_secs(30); +#[cfg(feature = "local-inference")] static LOCAL_TRANSCRIBER: once_cell::sync::Lazy< Mutex>, > = once_cell::sync::Lazy::new(|| Mutex::new(None)); +#[cfg(feature = "local-inference")] const WHISPER_TOKENIZER_JSON: &str = include_str!("whisper_data/tokens.json"); #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, ToSchema)] @@ -21,6 +25,7 @@ pub enum DictationProvider { OpenAI, ElevenLabs, Groq, + #[cfg(feature = "local-inference")] Local, } @@ -66,19 +71,39 @@ pub const PROVIDERS: &[DictationProviderDef] = &[ uses_provider_config: false, settings_path: None, }, - DictationProviderDef { - provider: DictationProvider::Local, - config_key: LOCAL_WHISPER_MODEL_CONFIG_KEY, - default_base_url: "", - endpoint_path: "", - host_key: None, - description: "Uses local Whisper model for transcription. No API key needed.", - uses_provider_config: false, - settings_path: None, - }, ]; +#[cfg(feature = "local-inference")] +pub const LOCAL_PROVIDER_DEF: DictationProviderDef = DictationProviderDef { + provider: DictationProvider::Local, + config_key: LOCAL_WHISPER_MODEL_CONFIG_KEY, + default_base_url: "", + endpoint_path: "", + host_key: None, + description: "Uses local Whisper model for transcription. No API key needed.", + uses_provider_config: false, + settings_path: None, +}; + +/// Returns all provider definitions, including Local when the `local-inference` feature is enabled. +pub fn all_providers() -> Vec<&'static DictationProviderDef> { + #[cfg(not(feature = "local-inference"))] + { + PROVIDERS.iter().collect() + } + #[cfg(feature = "local-inference")] + { + let mut all: Vec<&DictationProviderDef> = PROVIDERS.iter().collect(); + all.push(&LOCAL_PROVIDER_DEF); + all + } +} + pub fn get_provider_def(provider: DictationProvider) -> &'static DictationProviderDef { + #[cfg(feature = "local-inference")] + if provider == DictationProvider::Local { + return &LOCAL_PROVIDER_DEF; + } PROVIDERS .iter() .find(|def| def.provider == provider) @@ -89,6 +114,7 @@ pub fn is_configured(provider: DictationProvider) -> bool { let config = Config::global(); match provider { + #[cfg(feature = "local-inference")] DictationProvider::Local => config .get(LOCAL_WHISPER_MODEL_CONFIG_KEY, false) .ok() @@ -102,6 +128,7 @@ pub fn is_configured(provider: DictationProvider) -> bool { } } +#[cfg(feature = "local-inference")] pub async fn transcribe_local(audio_bytes: Vec) -> Result { tokio::task::spawn_blocking(move || { let config = Config::global(); @@ -178,6 +205,7 @@ fn build_api_client(provider: DictationProvider) -> Result { header_name: "xi-api-key".to_string(), key: api_key, }, + #[cfg(feature = "local-inference")] DictationProvider::Local => anyhow::bail!("Local provider should not use API client"), }; diff --git a/crates/goose/src/providers/init.rs b/crates/goose/src/providers/init.rs index 930112986a11..89081d6961e5 100644 --- a/crates/goose/src/providers/init.rs +++ b/crates/goose/src/providers/init.rs @@ -1,5 +1,7 @@ use std::sync::{Arc, RwLock}; +#[cfg(feature = "local-inference")] +use super::local_inference::LocalInferenceProvider; use super::{ anthropic::AnthropicProvider, avian::AvianProvider, @@ -19,7 +21,6 @@ use super::{ githubcopilot::GithubCopilotProvider, google::GoogleProvider, litellm::LiteLLMProvider, - local_inference::LocalInferenceProvider, nanogpt::NanoGptProvider, ollama::OllamaProvider, openai::OpenAiProvider, @@ -49,6 +50,7 @@ async fn init_registry() -> RwLock { registry.register::(false); registry.register::(false); registry.register::(false); + #[cfg(feature = "local-inference")] registry.register::(false); registry.register::(true); registry.register::(false); diff --git a/crates/goose/src/providers/mod.rs b/crates/goose/src/providers/mod.rs index e9e4b44db252..73944655b0bf 100644 --- a/crates/goose/src/providers/mod.rs +++ b/crates/goose/src/providers/mod.rs @@ -27,6 +27,7 @@ pub mod githubcopilot; pub mod google; mod init; pub mod litellm; +#[cfg(feature = "local-inference")] pub mod local_inference; pub mod nanogpt; pub mod oauth; diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 2e3671b272bb..695731006df8 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -1922,6 +1922,26 @@ } } }, + "/features": { + "get": { + "tags": [ + "super::routes::features" + ], + "operationId": "get_features", + "responses": { + "200": { + "description": "Compile-time feature flags", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeaturesResponse" + } + } + } + } + } + } + }, "/handle_nanogpt": { "post": { "tags": [ @@ -5333,6 +5353,21 @@ } } }, + "FeaturesResponse": { + "type": "object", + "required": [ + "features" + ], + "properties": { + "features": { + "type": "object", + "description": "Map of feature name to enabled status", + "additionalProperties": { + "type": "boolean" + } + } + } + }, "ForkRequest": { "type": "object", "required": [ diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx index 75d492a1b0af..15f614185837 100644 --- a/ui/desktop/src/App.tsx +++ b/ui/desktop/src/App.tsx @@ -41,6 +41,7 @@ import 'react-toastify/dist/ReactToastify.css'; import { useConfig } from './components/ConfigContext'; import { ModelAndProviderProvider } from './components/ModelAndProviderContext'; import { ThemeProvider } from './contexts/ThemeContext'; +import { FeaturesProvider } from './contexts/FeaturesContext'; import PermissionSettingsView from './components/settings/permission/PermissionSetting'; import ExtensionsView, { ExtensionsViewOptions } from './components/extensions/ExtensionsView'; @@ -725,13 +726,15 @@ export function AppInner() { export default function App() { return ( - - - - - - - + + + + + + + + + ); } diff --git a/ui/desktop/src/api/index.ts b/ui/desktop/src/api/index.ts index dbe9fb8e9b31..05482b7a425b 100644 --- a/ui/desktop/src/api/index.ts +++ b/ui/desktop/src/api/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { addExtension, agentAddExtension, agentRemoveExtension, backupConfig, callTool, cancelDownload, cancelLocalModelDownload, checkProvider, cleanupProviderCache, configureProviderOauth, confirmToolAction, createCustomProvider, createRecipe, createSchedule, decodeRecipe, deleteLocalModel, deleteModel, deleteRecipe, deleteSchedule, deleteSession, detectProvider, diagnostics, downloadHfModel, downloadModel, encodeRecipe, exportApp, exportSession, forkSession, getCanonicalModelInfo, getCustomProvider, getDictationConfig, getDownloadProgress, getExtensions, getLocalModelDownloadProgress, getModelSettings, getPrompt, getPrompts, getProviderCatalog, getProviderCatalogTemplate, getProviderModels, getRepoFiles, getSession, getSessionExtensions, getSessionInsights, getSlashCommands, getTools, getTunnelStatus, importApp, importSession, initConfig, inspectRunningJob, killRunningJob, listApps, listLocalModels, listModels, listRecipes, listSchedules, listSessions, mcpUiProxy, type Options, parseRecipe, pauseSchedule, providers, readAllConfig, readConfig, readResource, recipeToYaml, recoverConfig, removeConfig, removeCustomProvider, removeExtension, reply, resetPrompt, restartAgent, resumeAgent, runNowHandler, savePrompt, saveRecipe, scanRecipe, scheduleRecipe, searchHfModels, searchSessions, sendTelemetryEvent, sessionCancel, sessionEvents, sessionReply, sessionsHandler, setConfigProvider, setRecipeSlashCommand, startAgent, startNanogptSetup, startOpenrouterSetup, startTetrateSetup, startTunnel, status, stopAgent, stopTunnel, systemInfo, transcribeDictation, unpauseSchedule, updateAgentProvider, updateCustomProvider, updateFromSession, updateModelSettings, updateSchedule, updateSession, updateSessionName, updateSessionUserRecipeValues, updateWorkingDir, upsertConfig, upsertPermissions, validateConfig } from './sdk.gen'; -export type { ActionRequired, ActionRequiredData, AddExtensionData, AddExtensionErrors, AddExtensionRequest, AddExtensionResponse, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponse, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponse, AgentRemoveExtensionResponses, Annotations, Author, AuthorRequest, BackupConfigData, BackupConfigErrors, BackupConfigResponse, BackupConfigResponses, CallToolData, CallToolErrors, CallToolRequest, CallToolResponse, CallToolResponse2, CallToolResponses, CancelDownloadData, CancelDownloadErrors, CancelDownloadResponses, CancelLocalModelDownloadData, CancelLocalModelDownloadErrors, CancelLocalModelDownloadResponses, CancelRequest, ChatRequest, CheckProviderData, CheckProviderRequest, CleanupProviderCacheData, CleanupProviderCacheErrors, CleanupProviderCacheResponse, CleanupProviderCacheResponses, ClientOptions, CommandType, ConfigKey, ConfigKeyQuery, ConfigResponse, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionRequest, ConfirmToolActionResponses, Content, ContentBlock, Conversation, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponse, CreateCustomProviderResponse2, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeRequest, CreateRecipeResponse, CreateRecipeResponse2, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleRequest, CreateScheduleResponse, CreateScheduleResponses, CspMetadata, DeclarativeProviderConfig, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeRequest, DecodeRecipeResponse, DecodeRecipeResponse2, DecodeRecipeResponses, DeleteLocalModelData, DeleteLocalModelErrors, DeleteLocalModelResponses, DeleteModelData, DeleteModelErrors, DeleteModelResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeRequest, DeleteRecipeResponse, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponse, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DetectProviderData, DetectProviderErrors, DetectProviderRequest, DetectProviderResponse, DetectProviderResponse2, DetectProviderResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponse, DiagnosticsResponses, DictationProvider, DictationProviderStatus, DownloadHfModelData, DownloadHfModelErrors, DownloadHfModelResponse, DownloadHfModelResponses, DownloadModelData, DownloadModelErrors, DownloadModelRequest, DownloadModelResponses, DownloadProgress, DownloadStatus, EmbeddedResource, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeRequest, EncodeRecipeResponse, EncodeRecipeResponse2, EncodeRecipeResponses, Envs, EnvVarConfig, ErrorResponse, ExportAppData, ExportAppError, ExportAppErrors, ExportAppResponse, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponse, ExportSessionResponses, ExtensionConfig, ExtensionData, ExtensionEntry, ExtensionLoadResult, ExtensionQuery, ExtensionResponse, ForkRequest, ForkResponse, ForkSessionData, ForkSessionErrors, ForkSessionResponse, ForkSessionResponses, FrontendToolRequest, GetCanonicalModelInfoData, GetCanonicalModelInfoResponse, GetCanonicalModelInfoResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponse, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponse, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponse, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponse, GetExtensionsResponses, GetLocalModelDownloadProgressData, GetLocalModelDownloadProgressErrors, GetLocalModelDownloadProgressResponse, GetLocalModelDownloadProgressResponses, GetModelSettingsData, GetModelSettingsErrors, GetModelSettingsResponse, GetModelSettingsResponses, GetPromptData, GetPromptErrors, GetPromptResponse, GetPromptResponses, GetPromptsData, GetPromptsResponse, GetPromptsResponses, GetProviderCatalogData, GetProviderCatalogErrors, GetProviderCatalogResponse, GetProviderCatalogResponses, GetProviderCatalogTemplateData, GetProviderCatalogTemplateErrors, GetProviderCatalogTemplateResponse, GetProviderCatalogTemplateResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponse, GetProviderModelsResponses, GetRepoFilesData, GetRepoFilesResponse, GetRepoFilesResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponse, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponse, GetSessionInsightsResponses, GetSessionResponse, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponse, GetSlashCommandsResponses, GetToolsData, GetToolsErrors, GetToolsQuery, GetToolsResponse, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponse, GetTunnelStatusResponses, GooseApp, GooseMode, HfGgufFile, HfModelInfo, HfQuantVariant, Icon, ImageContent, ImportAppData, ImportAppError, ImportAppErrors, ImportAppRequest, ImportAppResponse, ImportAppResponse2, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionRequest, ImportSessionResponse, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponse, InitConfigResponses, InspectJobResponse, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponse, InspectRunningJobResponses, JsonObject, KillJobResponse, KillRunningJobData, KillRunningJobResponses, ListAppsData, ListAppsError, ListAppsErrors, ListAppsRequest, ListAppsResponse, ListAppsResponse2, ListAppsResponses, ListLocalModelsData, ListLocalModelsResponse, ListLocalModelsResponses, ListModelsData, ListModelsResponse, ListModelsResponses, ListRecipeResponse, ListRecipesData, ListRecipesErrors, ListRecipesResponse, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponse, ListSchedulesResponse2, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponse, ListSessionsResponses, LoadedProvider, LocalModelResponse, McpAppResource, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, Message, MessageContent, MessageEvent, MessageMetadata, ModelCapabilities, ModelConfig, ModelDownloadStatus, ModelInfo, ModelInfoData, ModelInfoQuery, ModelInfoResponse, ModelSettings, ModelTemplate, ParseRecipeData, ParseRecipeError, ParseRecipeErrors, ParseRecipeRequest, ParseRecipeResponse, ParseRecipeResponse2, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponse, PauseScheduleResponses, Permission, PermissionLevel, PermissionsMetadata, PrincipalType, PromptContentResponse, PromptsListResponse, ProviderCatalogEntry, ProviderDetails, ProviderEngine, ProviderMetadata, ProvidersData, ProvidersResponse, ProvidersResponse2, ProvidersResponses, ProviderTemplate, ProviderType, RawAudioContent, RawEmbeddedResource, RawImageContent, RawResource, RawTextContent, ReadAllConfigData, ReadAllConfigResponse, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, ReadResourceData, ReadResourceErrors, ReadResourceRequest, ReadResourceResponse, ReadResourceResponse2, ReadResourceResponses, Recipe, RecipeManifest, RecipeParameter, RecipeParameterInputType, RecipeParameterRequirement, RecipeToYamlData, RecipeToYamlError, RecipeToYamlErrors, RecipeToYamlRequest, RecipeToYamlResponse, RecipeToYamlResponse2, RecipeToYamlResponses, RecoverConfigData, RecoverConfigErrors, RecoverConfigResponse, RecoverConfigResponses, RedactedThinkingContent, RemoveConfigData, RemoveConfigErrors, RemoveConfigResponse, RemoveConfigResponses, RemoveCustomProviderData, RemoveCustomProviderErrors, RemoveCustomProviderResponse, RemoveCustomProviderResponses, RemoveExtensionData, RemoveExtensionErrors, RemoveExtensionRequest, RemoveExtensionResponse, RemoveExtensionResponses, ReplyData, ReplyErrors, ReplyResponse, ReplyResponses, RepoVariantsResponse, ResetPromptData, ResetPromptErrors, ResetPromptResponse, ResetPromptResponses, ResourceContents, ResourceMetadata, Response, RestartAgentData, RestartAgentErrors, RestartAgentRequest, RestartAgentResponse, RestartAgentResponse2, RestartAgentResponses, ResumeAgentData, ResumeAgentErrors, ResumeAgentRequest, ResumeAgentResponse, ResumeAgentResponse2, ResumeAgentResponses, RetryConfig, Role, RunNowHandlerData, RunNowHandlerErrors, RunNowHandlerResponse, RunNowHandlerResponses, RunNowResponse, SamplingConfig, SavePromptData, SavePromptErrors, SavePromptRequest, SavePromptResponse, SavePromptResponses, SaveRecipeData, SaveRecipeError, SaveRecipeErrors, SaveRecipeRequest, SaveRecipeResponse, SaveRecipeResponse2, SaveRecipeResponses, ScanRecipeData, ScanRecipeRequest, ScanRecipeResponse, ScanRecipeResponse2, ScanRecipeResponses, ScheduledJob, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeRequest, ScheduleRecipeResponses, SearchHfModelsData, SearchHfModelsErrors, SearchHfModelsResponse, SearchHfModelsResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponse, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, Session, SessionCancelData, SessionCancelResponses, SessionDisplayInfo, SessionEventsData, SessionEventsErrors, SessionEventsResponse, SessionEventsResponses, SessionExtensionsResponse, SessionInsights, SessionListResponse, SessionReplyData, SessionReplyErrors, SessionReplyRequest, SessionReplyResponse, SessionReplyResponse2, SessionReplyResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponse, SessionsHandlerResponses, SessionsQuery, SessionType, SetConfigProviderData, SetProviderRequest, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, SetSlashCommandRequest, Settings, SetupResponse, SlashCommand, SlashCommandsResponse, StartAgentData, StartAgentError, StartAgentErrors, StartAgentRequest, StartAgentResponse, StartAgentResponses, StartNanogptSetupData, StartNanogptSetupResponse, StartNanogptSetupResponses, StartOpenrouterSetupData, StartOpenrouterSetupResponse, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponse, StartTetrateSetupResponses, StartTunnelData, StartTunnelError, StartTunnelErrors, StartTunnelResponse, StartTunnelResponses, StatusData, StatusResponse, StatusResponses, StopAgentData, StopAgentErrors, StopAgentRequest, StopAgentResponse, StopAgentResponses, StopTunnelData, StopTunnelError, StopTunnelErrors, StopTunnelResponses, SubRecipe, SuccessCheck, SystemInfo, SystemInfoData, SystemInfoResponse, SystemInfoResponses, SystemNotificationContent, SystemNotificationType, TaskSupport, TelemetryEventRequest, Template, TextContent, ThinkingContent, TokenState, Tool, ToolAnnotations, ToolConfirmationRequest, ToolExecution, ToolInfo, ToolPermission, ToolRequest, ToolResponse, TranscribeDictationData, TranscribeDictationErrors, TranscribeDictationResponse, TranscribeDictationResponses, TranscribeRequest, TranscribeResponse, TunnelInfo, TunnelState, UiMetadata, UnpauseScheduleData, UnpauseScheduleErrors, UnpauseScheduleResponse, UnpauseScheduleResponses, UpdateAgentProviderData, UpdateAgentProviderErrors, UpdateAgentProviderResponses, UpdateCustomProviderData, UpdateCustomProviderErrors, UpdateCustomProviderRequest, UpdateCustomProviderResponse, UpdateCustomProviderResponses, UpdateFromSessionData, UpdateFromSessionErrors, UpdateFromSessionRequest, UpdateFromSessionResponses, UpdateModelSettingsData, UpdateModelSettingsErrors, UpdateModelSettingsResponse, UpdateModelSettingsResponses, UpdateProviderRequest, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleRequest, UpdateScheduleResponse, UpdateScheduleResponses, UpdateSessionData, UpdateSessionErrors, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameRequest, UpdateSessionNameResponses, UpdateSessionRequest, UpdateSessionResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesError, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesRequest, UpdateSessionUserRecipeValuesResponse, UpdateSessionUserRecipeValuesResponse2, UpdateSessionUserRecipeValuesResponses, UpdateWorkingDirData, UpdateWorkingDirErrors, UpdateWorkingDirRequest, UpdateWorkingDirResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigQuery, UpsertConfigResponse, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsQuery, UpsertPermissionsResponse, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponse, ValidateConfigResponses, WhisperModelResponse, WindowProps } from './types.gen'; +export { addExtension, agentAddExtension, agentRemoveExtension, backupConfig, callTool, cancelDownload, cancelLocalModelDownload, checkProvider, cleanupProviderCache, configureProviderOauth, confirmToolAction, createCustomProvider, createRecipe, createSchedule, decodeRecipe, deleteLocalModel, deleteModel, deleteRecipe, deleteSchedule, deleteSession, detectProvider, diagnostics, downloadHfModel, downloadModel, encodeRecipe, exportApp, exportSession, forkSession, getCanonicalModelInfo, getCustomProvider, getDictationConfig, getDownloadProgress, getExtensions, getFeatures, getLocalModelDownloadProgress, getModelSettings, getPrompt, getPrompts, getProviderCatalog, getProviderCatalogTemplate, getProviderModels, getRepoFiles, getSession, getSessionExtensions, getSessionInsights, getSlashCommands, getTools, getTunnelStatus, importApp, importSession, initConfig, inspectRunningJob, killRunningJob, listApps, listLocalModels, listModels, listRecipes, listSchedules, listSessions, mcpUiProxy, type Options, parseRecipe, pauseSchedule, providers, readAllConfig, readConfig, readResource, recipeToYaml, recoverConfig, removeConfig, removeCustomProvider, removeExtension, reply, resetPrompt, restartAgent, resumeAgent, runNowHandler, savePrompt, saveRecipe, scanRecipe, scheduleRecipe, searchHfModels, searchSessions, sendTelemetryEvent, sessionCancel, sessionEvents, sessionReply, sessionsHandler, setConfigProvider, setRecipeSlashCommand, startAgent, startNanogptSetup, startOpenrouterSetup, startTetrateSetup, startTunnel, status, stopAgent, stopTunnel, systemInfo, transcribeDictation, unpauseSchedule, updateAgentProvider, updateCustomProvider, updateFromSession, updateModelSettings, updateSchedule, updateSession, updateSessionName, updateSessionUserRecipeValues, updateWorkingDir, upsertConfig, upsertPermissions, validateConfig } from './sdk.gen'; +export type { ActionRequired, ActionRequiredData, AddExtensionData, AddExtensionErrors, AddExtensionRequest, AddExtensionResponse, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponse, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponse, AgentRemoveExtensionResponses, Annotations, Author, AuthorRequest, BackupConfigData, BackupConfigErrors, BackupConfigResponse, BackupConfigResponses, CallToolData, CallToolErrors, CallToolRequest, CallToolResponse, CallToolResponse2, CallToolResponses, CancelDownloadData, CancelDownloadErrors, CancelDownloadResponses, CancelLocalModelDownloadData, CancelLocalModelDownloadErrors, CancelLocalModelDownloadResponses, CancelRequest, ChatRequest, CheckProviderData, CheckProviderRequest, CleanupProviderCacheData, CleanupProviderCacheErrors, CleanupProviderCacheResponse, CleanupProviderCacheResponses, ClientOptions, CommandType, ConfigKey, ConfigKeyQuery, ConfigResponse, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionRequest, ConfirmToolActionResponses, Content, ContentBlock, Conversation, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponse, CreateCustomProviderResponse2, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeRequest, CreateRecipeResponse, CreateRecipeResponse2, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleRequest, CreateScheduleResponse, CreateScheduleResponses, CspMetadata, DeclarativeProviderConfig, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeRequest, DecodeRecipeResponse, DecodeRecipeResponse2, DecodeRecipeResponses, DeleteLocalModelData, DeleteLocalModelErrors, DeleteLocalModelResponses, DeleteModelData, DeleteModelErrors, DeleteModelResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeRequest, DeleteRecipeResponse, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponse, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DetectProviderData, DetectProviderErrors, DetectProviderRequest, DetectProviderResponse, DetectProviderResponse2, DetectProviderResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponse, DiagnosticsResponses, DictationProvider, DictationProviderStatus, DownloadHfModelData, DownloadHfModelErrors, DownloadHfModelResponse, DownloadHfModelResponses, DownloadModelData, DownloadModelErrors, DownloadModelRequest, DownloadModelResponses, DownloadProgress, DownloadStatus, EmbeddedResource, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeRequest, EncodeRecipeResponse, EncodeRecipeResponse2, EncodeRecipeResponses, Envs, EnvVarConfig, ErrorResponse, ExportAppData, ExportAppError, ExportAppErrors, ExportAppResponse, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponse, ExportSessionResponses, ExtensionConfig, ExtensionData, ExtensionEntry, ExtensionLoadResult, ExtensionQuery, ExtensionResponse, FeaturesResponse, ForkRequest, ForkResponse, ForkSessionData, ForkSessionErrors, ForkSessionResponse, ForkSessionResponses, FrontendToolRequest, GetCanonicalModelInfoData, GetCanonicalModelInfoResponse, GetCanonicalModelInfoResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponse, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponse, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponse, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponse, GetExtensionsResponses, GetFeaturesData, GetFeaturesResponse, GetFeaturesResponses, GetLocalModelDownloadProgressData, GetLocalModelDownloadProgressErrors, GetLocalModelDownloadProgressResponse, GetLocalModelDownloadProgressResponses, GetModelSettingsData, GetModelSettingsErrors, GetModelSettingsResponse, GetModelSettingsResponses, GetPromptData, GetPromptErrors, GetPromptResponse, GetPromptResponses, GetPromptsData, GetPromptsResponse, GetPromptsResponses, GetProviderCatalogData, GetProviderCatalogErrors, GetProviderCatalogResponse, GetProviderCatalogResponses, GetProviderCatalogTemplateData, GetProviderCatalogTemplateErrors, GetProviderCatalogTemplateResponse, GetProviderCatalogTemplateResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponse, GetProviderModelsResponses, GetRepoFilesData, GetRepoFilesResponse, GetRepoFilesResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponse, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponse, GetSessionInsightsResponses, GetSessionResponse, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponse, GetSlashCommandsResponses, GetToolsData, GetToolsErrors, GetToolsQuery, GetToolsResponse, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponse, GetTunnelStatusResponses, GooseApp, GooseMode, HfGgufFile, HfModelInfo, HfQuantVariant, Icon, ImageContent, ImportAppData, ImportAppError, ImportAppErrors, ImportAppRequest, ImportAppResponse, ImportAppResponse2, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionRequest, ImportSessionResponse, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponse, InitConfigResponses, InspectJobResponse, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponse, InspectRunningJobResponses, JsonObject, KillJobResponse, KillRunningJobData, KillRunningJobResponses, ListAppsData, ListAppsError, ListAppsErrors, ListAppsRequest, ListAppsResponse, ListAppsResponse2, ListAppsResponses, ListLocalModelsData, ListLocalModelsResponse, ListLocalModelsResponses, ListModelsData, ListModelsResponse, ListModelsResponses, ListRecipeResponse, ListRecipesData, ListRecipesErrors, ListRecipesResponse, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponse, ListSchedulesResponse2, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponse, ListSessionsResponses, LoadedProvider, LocalModelResponse, McpAppResource, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, Message, MessageContent, MessageEvent, MessageMetadata, ModelCapabilities, ModelConfig, ModelDownloadStatus, ModelInfo, ModelInfoData, ModelInfoQuery, ModelInfoResponse, ModelSettings, ModelTemplate, ParseRecipeData, ParseRecipeError, ParseRecipeErrors, ParseRecipeRequest, ParseRecipeResponse, ParseRecipeResponse2, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponse, PauseScheduleResponses, Permission, PermissionLevel, PermissionsMetadata, PrincipalType, PromptContentResponse, PromptsListResponse, ProviderCatalogEntry, ProviderDetails, ProviderEngine, ProviderMetadata, ProvidersData, ProvidersResponse, ProvidersResponse2, ProvidersResponses, ProviderTemplate, ProviderType, RawAudioContent, RawEmbeddedResource, RawImageContent, RawResource, RawTextContent, ReadAllConfigData, ReadAllConfigResponse, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, ReadResourceData, ReadResourceErrors, ReadResourceRequest, ReadResourceResponse, ReadResourceResponse2, ReadResourceResponses, Recipe, RecipeManifest, RecipeParameter, RecipeParameterInputType, RecipeParameterRequirement, RecipeToYamlData, RecipeToYamlError, RecipeToYamlErrors, RecipeToYamlRequest, RecipeToYamlResponse, RecipeToYamlResponse2, RecipeToYamlResponses, RecoverConfigData, RecoverConfigErrors, RecoverConfigResponse, RecoverConfigResponses, RedactedThinkingContent, RemoveConfigData, RemoveConfigErrors, RemoveConfigResponse, RemoveConfigResponses, RemoveCustomProviderData, RemoveCustomProviderErrors, RemoveCustomProviderResponse, RemoveCustomProviderResponses, RemoveExtensionData, RemoveExtensionErrors, RemoveExtensionRequest, RemoveExtensionResponse, RemoveExtensionResponses, ReplyData, ReplyErrors, ReplyResponse, ReplyResponses, RepoVariantsResponse, ResetPromptData, ResetPromptErrors, ResetPromptResponse, ResetPromptResponses, ResourceContents, ResourceMetadata, Response, RestartAgentData, RestartAgentErrors, RestartAgentRequest, RestartAgentResponse, RestartAgentResponse2, RestartAgentResponses, ResumeAgentData, ResumeAgentErrors, ResumeAgentRequest, ResumeAgentResponse, ResumeAgentResponse2, ResumeAgentResponses, RetryConfig, Role, RunNowHandlerData, RunNowHandlerErrors, RunNowHandlerResponse, RunNowHandlerResponses, RunNowResponse, SamplingConfig, SavePromptData, SavePromptErrors, SavePromptRequest, SavePromptResponse, SavePromptResponses, SaveRecipeData, SaveRecipeError, SaveRecipeErrors, SaveRecipeRequest, SaveRecipeResponse, SaveRecipeResponse2, SaveRecipeResponses, ScanRecipeData, ScanRecipeRequest, ScanRecipeResponse, ScanRecipeResponse2, ScanRecipeResponses, ScheduledJob, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeRequest, ScheduleRecipeResponses, SearchHfModelsData, SearchHfModelsErrors, SearchHfModelsResponse, SearchHfModelsResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponse, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, Session, SessionCancelData, SessionCancelResponses, SessionDisplayInfo, SessionEventsData, SessionEventsErrors, SessionEventsResponse, SessionEventsResponses, SessionExtensionsResponse, SessionInsights, SessionListResponse, SessionReplyData, SessionReplyErrors, SessionReplyRequest, SessionReplyResponse, SessionReplyResponse2, SessionReplyResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponse, SessionsHandlerResponses, SessionsQuery, SessionType, SetConfigProviderData, SetProviderRequest, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, SetSlashCommandRequest, Settings, SetupResponse, SlashCommand, SlashCommandsResponse, StartAgentData, StartAgentError, StartAgentErrors, StartAgentRequest, StartAgentResponse, StartAgentResponses, StartNanogptSetupData, StartNanogptSetupResponse, StartNanogptSetupResponses, StartOpenrouterSetupData, StartOpenrouterSetupResponse, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponse, StartTetrateSetupResponses, StartTunnelData, StartTunnelError, StartTunnelErrors, StartTunnelResponse, StartTunnelResponses, StatusData, StatusResponse, StatusResponses, StopAgentData, StopAgentErrors, StopAgentRequest, StopAgentResponse, StopAgentResponses, StopTunnelData, StopTunnelError, StopTunnelErrors, StopTunnelResponses, SubRecipe, SuccessCheck, SystemInfo, SystemInfoData, SystemInfoResponse, SystemInfoResponses, SystemNotificationContent, SystemNotificationType, TaskSupport, TelemetryEventRequest, Template, TextContent, ThinkingContent, TokenState, Tool, ToolAnnotations, ToolConfirmationRequest, ToolExecution, ToolInfo, ToolPermission, ToolRequest, ToolResponse, TranscribeDictationData, TranscribeDictationErrors, TranscribeDictationResponse, TranscribeDictationResponses, TranscribeRequest, TranscribeResponse, TunnelInfo, TunnelState, UiMetadata, UnpauseScheduleData, UnpauseScheduleErrors, UnpauseScheduleResponse, UnpauseScheduleResponses, UpdateAgentProviderData, UpdateAgentProviderErrors, UpdateAgentProviderResponses, UpdateCustomProviderData, UpdateCustomProviderErrors, UpdateCustomProviderRequest, UpdateCustomProviderResponse, UpdateCustomProviderResponses, UpdateFromSessionData, UpdateFromSessionErrors, UpdateFromSessionRequest, UpdateFromSessionResponses, UpdateModelSettingsData, UpdateModelSettingsErrors, UpdateModelSettingsResponse, UpdateModelSettingsResponses, UpdateProviderRequest, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleRequest, UpdateScheduleResponse, UpdateScheduleResponses, UpdateSessionData, UpdateSessionErrors, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameRequest, UpdateSessionNameResponses, UpdateSessionRequest, UpdateSessionResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesError, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesRequest, UpdateSessionUserRecipeValuesResponse, UpdateSessionUserRecipeValuesResponse2, UpdateSessionUserRecipeValuesResponses, UpdateWorkingDirData, UpdateWorkingDirErrors, UpdateWorkingDirRequest, UpdateWorkingDirResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigQuery, UpsertConfigResponse, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsQuery, UpsertPermissionsResponse, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponse, ValidateConfigResponses, WhisperModelResponse, WindowProps } from './types.gen'; diff --git a/ui/desktop/src/api/sdk.gen.ts b/ui/desktop/src/api/sdk.gen.ts index 3d12b5b57429..dfd96fb432d1 100644 --- a/ui/desktop/src/api/sdk.gen.ts +++ b/ui/desktop/src/api/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddExtensionData, AddExtensionErrors, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponses, BackupConfigData, BackupConfigErrors, BackupConfigResponses, CallToolData, CallToolErrors, CallToolResponses, CancelDownloadData, CancelDownloadErrors, CancelDownloadResponses, CancelLocalModelDownloadData, CancelLocalModelDownloadErrors, CancelLocalModelDownloadResponses, CheckProviderData, CleanupProviderCacheData, CleanupProviderCacheErrors, CleanupProviderCacheResponses, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionResponses, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleResponses, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeResponses, DeleteLocalModelData, DeleteLocalModelErrors, DeleteLocalModelResponses, DeleteModelData, DeleteModelErrors, DeleteModelResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DetectProviderData, DetectProviderErrors, DetectProviderResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponses, DownloadHfModelData, DownloadHfModelErrors, DownloadHfModelResponses, DownloadModelData, DownloadModelErrors, DownloadModelResponses, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeResponses, ExportAppData, ExportAppErrors, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponses, ForkSessionData, ForkSessionErrors, ForkSessionResponses, GetCanonicalModelInfoData, GetCanonicalModelInfoResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponses, GetLocalModelDownloadProgressData, GetLocalModelDownloadProgressErrors, GetLocalModelDownloadProgressResponses, GetModelSettingsData, GetModelSettingsErrors, GetModelSettingsResponses, GetPromptData, GetPromptErrors, GetPromptResponses, GetPromptsData, GetPromptsResponses, GetProviderCatalogData, GetProviderCatalogErrors, GetProviderCatalogResponses, GetProviderCatalogTemplateData, GetProviderCatalogTemplateErrors, GetProviderCatalogTemplateResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponses, GetRepoFilesData, GetRepoFilesResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponses, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponses, GetToolsData, GetToolsErrors, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponses, ImportAppData, ImportAppErrors, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponses, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponses, KillRunningJobData, KillRunningJobResponses, ListAppsData, ListAppsErrors, ListAppsResponses, ListLocalModelsData, ListLocalModelsResponses, ListModelsData, ListModelsResponses, ListRecipesData, ListRecipesErrors, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponses, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, ParseRecipeData, ParseRecipeErrors, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponses, ProvidersData, ProvidersResponses, ReadAllConfigData, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, ReadResourceData, ReadResourceErrors, ReadResourceResponses, RecipeToYamlData, RecipeToYamlErrors, RecipeToYamlResponses, RecoverConfigData, RecoverConfigErrors, RecoverConfigResponses, RemoveConfigData, RemoveConfigErrors, RemoveConfigResponses, RemoveCustomProviderData, RemoveCustomProviderErrors, RemoveCustomProviderResponses, RemoveExtensionData, RemoveExtensionErrors, RemoveExtensionResponses, ReplyData, ReplyErrors, ReplyResponses, ResetPromptData, ResetPromptErrors, ResetPromptResponses, RestartAgentData, RestartAgentErrors, RestartAgentResponses, ResumeAgentData, ResumeAgentErrors, ResumeAgentResponses, RunNowHandlerData, RunNowHandlerErrors, RunNowHandlerResponses, SavePromptData, SavePromptErrors, SavePromptResponses, SaveRecipeData, SaveRecipeErrors, SaveRecipeResponses, ScanRecipeData, ScanRecipeResponses, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeResponses, SearchHfModelsData, SearchHfModelsErrors, SearchHfModelsResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, SessionCancelData, SessionCancelResponses, SessionEventsData, SessionEventsErrors, SessionEventsResponses, SessionReplyData, SessionReplyErrors, SessionReplyResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponses, SetConfigProviderData, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, StartAgentData, StartAgentErrors, StartAgentResponses, StartNanogptSetupData, StartNanogptSetupResponses, StartOpenrouterSetupData, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponses, StartTunnelData, StartTunnelErrors, StartTunnelResponses, StatusData, StatusResponses, StopAgentData, StopAgentErrors, StopAgentResponses, StopTunnelData, StopTunnelErrors, StopTunnelResponses, SystemInfoData, SystemInfoResponses, TranscribeDictationData, TranscribeDictationErrors, TranscribeDictationResponses, UnpauseScheduleData, UnpauseScheduleErrors, UnpauseScheduleResponses, UpdateAgentProviderData, UpdateAgentProviderErrors, UpdateAgentProviderResponses, UpdateCustomProviderData, UpdateCustomProviderErrors, UpdateCustomProviderResponses, UpdateFromSessionData, UpdateFromSessionErrors, UpdateFromSessionResponses, UpdateModelSettingsData, UpdateModelSettingsErrors, UpdateModelSettingsResponses, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleResponses, UpdateSessionData, UpdateSessionErrors, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameResponses, UpdateSessionResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesResponses, UpdateWorkingDirData, UpdateWorkingDirErrors, UpdateWorkingDirResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponses } from './types.gen'; +import type { AddExtensionData, AddExtensionErrors, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponses, BackupConfigData, BackupConfigErrors, BackupConfigResponses, CallToolData, CallToolErrors, CallToolResponses, CancelDownloadData, CancelDownloadErrors, CancelDownloadResponses, CancelLocalModelDownloadData, CancelLocalModelDownloadErrors, CancelLocalModelDownloadResponses, CheckProviderData, CleanupProviderCacheData, CleanupProviderCacheErrors, CleanupProviderCacheResponses, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionResponses, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleResponses, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeResponses, DeleteLocalModelData, DeleteLocalModelErrors, DeleteLocalModelResponses, DeleteModelData, DeleteModelErrors, DeleteModelResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DetectProviderData, DetectProviderErrors, DetectProviderResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponses, DownloadHfModelData, DownloadHfModelErrors, DownloadHfModelResponses, DownloadModelData, DownloadModelErrors, DownloadModelResponses, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeResponses, ExportAppData, ExportAppErrors, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponses, ForkSessionData, ForkSessionErrors, ForkSessionResponses, GetCanonicalModelInfoData, GetCanonicalModelInfoResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponses, GetFeaturesData, GetFeaturesResponses, GetLocalModelDownloadProgressData, GetLocalModelDownloadProgressErrors, GetLocalModelDownloadProgressResponses, GetModelSettingsData, GetModelSettingsErrors, GetModelSettingsResponses, GetPromptData, GetPromptErrors, GetPromptResponses, GetPromptsData, GetPromptsResponses, GetProviderCatalogData, GetProviderCatalogErrors, GetProviderCatalogResponses, GetProviderCatalogTemplateData, GetProviderCatalogTemplateErrors, GetProviderCatalogTemplateResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponses, GetRepoFilesData, GetRepoFilesResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponses, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponses, GetToolsData, GetToolsErrors, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponses, ImportAppData, ImportAppErrors, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponses, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponses, KillRunningJobData, KillRunningJobResponses, ListAppsData, ListAppsErrors, ListAppsResponses, ListLocalModelsData, ListLocalModelsResponses, ListModelsData, ListModelsResponses, ListRecipesData, ListRecipesErrors, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponses, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, ParseRecipeData, ParseRecipeErrors, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponses, ProvidersData, ProvidersResponses, ReadAllConfigData, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, ReadResourceData, ReadResourceErrors, ReadResourceResponses, RecipeToYamlData, RecipeToYamlErrors, RecipeToYamlResponses, RecoverConfigData, RecoverConfigErrors, RecoverConfigResponses, RemoveConfigData, RemoveConfigErrors, RemoveConfigResponses, RemoveCustomProviderData, RemoveCustomProviderErrors, RemoveCustomProviderResponses, RemoveExtensionData, RemoveExtensionErrors, RemoveExtensionResponses, ReplyData, ReplyErrors, ReplyResponses, ResetPromptData, ResetPromptErrors, ResetPromptResponses, RestartAgentData, RestartAgentErrors, RestartAgentResponses, ResumeAgentData, ResumeAgentErrors, ResumeAgentResponses, RunNowHandlerData, RunNowHandlerErrors, RunNowHandlerResponses, SavePromptData, SavePromptErrors, SavePromptResponses, SaveRecipeData, SaveRecipeErrors, SaveRecipeResponses, ScanRecipeData, ScanRecipeResponses, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeResponses, SearchHfModelsData, SearchHfModelsErrors, SearchHfModelsResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, SessionCancelData, SessionCancelResponses, SessionEventsData, SessionEventsErrors, SessionEventsResponses, SessionReplyData, SessionReplyErrors, SessionReplyResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponses, SetConfigProviderData, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, StartAgentData, StartAgentErrors, StartAgentResponses, StartNanogptSetupData, StartNanogptSetupResponses, StartOpenrouterSetupData, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponses, StartTunnelData, StartTunnelErrors, StartTunnelResponses, StatusData, StatusResponses, StopAgentData, StopAgentErrors, StopAgentResponses, StopTunnelData, StopTunnelErrors, StopTunnelResponses, SystemInfoData, SystemInfoResponses, TranscribeDictationData, TranscribeDictationErrors, TranscribeDictationResponses, UnpauseScheduleData, UnpauseScheduleErrors, UnpauseScheduleResponses, UpdateAgentProviderData, UpdateAgentProviderErrors, UpdateAgentProviderResponses, UpdateCustomProviderData, UpdateCustomProviderErrors, UpdateCustomProviderResponses, UpdateFromSessionData, UpdateFromSessionErrors, UpdateFromSessionResponses, UpdateModelSettingsData, UpdateModelSettingsErrors, UpdateModelSettingsResponses, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleResponses, UpdateSessionData, UpdateSessionErrors, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameResponses, UpdateSessionResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesResponses, UpdateWorkingDirData, UpdateWorkingDirErrors, UpdateWorkingDirResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponses } from './types.gen'; export type Options = Options2 & { /** @@ -319,6 +319,8 @@ export const transcribeDictation = (option } }); +export const getFeatures = (options?: Options) => (options?.client ?? client).get({ url: '/features', ...options }); + export const startNanogptSetup = (options?: Options) => (options?.client ?? client).post({ url: '/handle_nanogpt', ...options }); export const startOpenrouterSetup = (options?: Options) => (options?.client ?? client).post({ url: '/handle_openrouter', ...options }); diff --git a/ui/desktop/src/api/types.gen.ts b/ui/desktop/src/api/types.gen.ts index 6add7592e84e..e84661635372 100644 --- a/ui/desktop/src/api/types.gen.ts +++ b/ui/desktop/src/api/types.gen.ts @@ -473,6 +473,15 @@ export type ExtensionResponse = { warnings?: Array; }; +export type FeaturesResponse = { + /** + * Map of feature name to enabled status + */ + features: { + [key: string]: boolean; + }; +}; + export type ForkRequest = { copy: boolean; timestamp?: number | null; @@ -3119,6 +3128,22 @@ export type TranscribeDictationResponses = { export type TranscribeDictationResponse = TranscribeDictationResponses[keyof TranscribeDictationResponses]; +export type GetFeaturesData = { + body?: never; + path?: never; + query?: never; + url: '/features'; +}; + +export type GetFeaturesResponses = { + /** + * Compile-time feature flags + */ + 200: FeaturesResponse; +}; + +export type GetFeaturesResponse = GetFeaturesResponses[keyof GetFeaturesResponses]; + export type StartNanogptSetupData = { body?: never; path?: never; diff --git a/ui/desktop/src/components/onboarding/FreeOptionCards.tsx b/ui/desktop/src/components/onboarding/FreeOptionCards.tsx index a199b23a7f32..2851a8b6457f 100644 --- a/ui/desktop/src/components/onboarding/FreeOptionCards.tsx +++ b/ui/desktop/src/components/onboarding/FreeOptionCards.tsx @@ -4,6 +4,7 @@ import { startTetrateSetup } from '../../utils/tetrateSetup'; import { Tetrate } from '../icons'; import LocalModelPicker from './LocalModelPicker'; import { HardDrive } from 'lucide-react'; +import { useFeatures } from '../../contexts/FeaturesContext'; const TETRATE = 'tetrate' as const; const NANOGPT = 'nano-gpt' as const; @@ -26,6 +27,7 @@ const cardClass = (isSelected: boolean) => }`; export default function FreeOptionCards({ onConfigured }: FreeOptionCardsProps) { + const { localInference } = useFeatures(); const [error, setError] = useState<{ message: string; type: typeof TETRATE | typeof NANOGPT; @@ -109,23 +111,25 @@ export default function FreeOptionCards({ onConfigured }: FreeOptionCardsProps)

-
-
-
- - Use a Local Model - - Free & Private - -
-
- + {localInference && ( +
+
+
+ + Use a Local Model + + Free & Private + +
+
+ +
+

+ Download a model and run entirely on your machine. No API keys, no accounts. +

-

- Download a model and run entirely on your machine. No API keys, no accounts. -

-
+ )}
{error && ( diff --git a/ui/desktop/src/components/settings/SettingsView.tsx b/ui/desktop/src/components/settings/SettingsView.tsx index ed655af406f0..181b3d4015dd 100644 --- a/ui/desktop/src/components/settings/SettingsView.tsx +++ b/ui/desktop/src/components/settings/SettingsView.tsx @@ -19,6 +19,7 @@ import KeyboardShortcutsSection from './keyboard/KeyboardShortcutsSection'; import LocalInferenceSection from './localInference/LocalInferenceSection'; import { CONFIGURATION_ENABLED } from '../../updates'; import { trackSettingsTabViewed } from '../../utils/analytics'; +import { useFeatures } from '../../contexts/FeaturesContext'; export type SettingsViewOptions = { deepLinkConfig?: ExtensionConfig; @@ -39,6 +40,7 @@ export default function SettingsView({ const [activeTab, setActiveTab] = useState('models'); const [tunnelDisabled, setTunnelDisabled] = useState(false); const hasTrackedInitialTab = useRef(false); + const { localInference } = useFeatures(); const handleTabChange = (tab: string) => { setActiveTab(tab); @@ -65,11 +67,18 @@ export default function SettingsView({ }; const targetTab = sectionToTab[viewOptions.section]; - if (targetTab) { + if (targetTab && (targetTab !== 'local-inference' || localInference)) { setActiveTab(targetTab); } } - }, [viewOptions.section]); + }, [viewOptions.section, localInference]); + + // Reset active tab if local-inference becomes unavailable + useEffect(() => { + if (!localInference && activeTab === 'local-inference') { + setActiveTab('models'); + } + }, [localInference, activeTab]); useEffect(() => { if (!hasTrackedInitialTab.current) { @@ -130,14 +139,16 @@ export default function SettingsView({ Models - - - Local Inference - + {localInference && ( + + + Local Inference + + )} Chat @@ -181,12 +192,14 @@ export default function SettingsView({ - - - + {localInference && ( + + + + )} { + const { localInference, isLoading: isFeaturesLoading } = useFeatures(); const [provider, setProvider] = useState(null); const [providerStatuses, setProviderStatuses] = useState>( {} @@ -32,6 +34,8 @@ export const DictationSettings = () => { }; useEffect(() => { + if (isFeaturesLoading) return; + const loadSettings = async () => { const providerValue = await read('voice_dictation_provider', false); let loadedProvider: DictationProvider | null = (providerValue as DictationProvider) || null; @@ -45,6 +49,11 @@ export const DictationSettings = () => { await upsert('voice_dictation_provider', '', false); } + if (!localInference && loadedProvider === 'local') { + loadedProvider = null; + await upsert('voice_dictation_provider', '', false); + } + setProvider(loadedProvider); const micValue = await read('voice_dictation_preferred_mic', false); @@ -54,7 +63,7 @@ export const DictationSettings = () => { }; loadSettings(); - }, [read, upsert]); + }, [read, upsert, localInference, isFeaturesLoading]); const handleProviderChange = (value: string) => { const newProvider = value === 'disabled' ? null : (value as DictationProvider); diff --git a/ui/desktop/src/contexts/FeaturesContext.tsx b/ui/desktop/src/contexts/FeaturesContext.tsx new file mode 100644 index 000000000000..c0467cab52e9 --- /dev/null +++ b/ui/desktop/src/contexts/FeaturesContext.tsx @@ -0,0 +1,49 @@ +import { createContext, useContext, useEffect, useState, useMemo } from 'react'; +import { getFeatures } from '../api'; + +interface FeaturesContextValue { + localInference: boolean; + codeMode: boolean; + isLoading: boolean; +} + +const FeaturesContext = createContext(null); + +export function FeaturesProvider({ children }: { children: React.ReactNode }) { + const [features, setFeatures] = useState>({}); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + (async () => { + try { + const response = await getFeatures({ throwOnError: false }); + if (response.data) { + setFeatures(response.data.features); + } + } catch (error) { + console.warn('[FeaturesContext] Failed to fetch features:', error); + } finally { + setIsLoading(false); + } + })(); + }, []); + + const value = useMemo( + () => ({ + localInference: features['local-inference'] ?? false, + codeMode: features['code-mode'] ?? true, + isLoading, + }), + [features, isLoading] + ); + + return {children}; +} + +export function useFeatures(): FeaturesContextValue { + const context = useContext(FeaturesContext); + if (!context) { + throw new Error('useFeatures must be used within a FeaturesProvider'); + } + return context; +}