diff --git a/Cargo.lock b/Cargo.lock index ed1fdf66dff7..cba6331367b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4503,6 +4503,7 @@ dependencies = [ "http 1.4.0", "once_cell", "rand 0.9.2", + "regex", "reqwest 0.12.28", "rmcp 0.15.0", "rustls 0.23.36", diff --git a/crates/goose-server/Cargo.toml b/crates/goose-server/Cargo.toml index 575d5467f16b..ae163f2e3158 100644 --- a/crates/goose-server/Cargo.toml +++ b/crates/goose-server/Cargo.toml @@ -44,6 +44,7 @@ serde_path_to_error = "0.1.20" tokio-tungstenite = { version = "0.28.0", features = ["rustls-tls-native-roots"] } url = { workspace = true } rand = "0.9.2" +regex = "1.10" hex = "0.4.3" socket2 = "0.6.1" fs2 = { workspace = true } diff --git a/crates/goose-server/src/lib.rs b/crates/goose-server/src/lib.rs index aa5ae94f4114..091cdb31393e 100644 --- a/crates/goose-server/src/lib.rs +++ b/crates/goose-server/src/lib.rs @@ -4,8 +4,10 @@ pub mod error; pub mod openapi; pub mod routes; pub mod state; +pub mod theme_css; pub mod tunnel; // Re-export commonly used items pub use openapi::*; pub use state::*; +pub use theme_css::generate_mcp_theme_variables; diff --git a/crates/goose-server/src/main.rs b/crates/goose-server/src/main.rs index ef4b6bc5d4a8..af8796412731 100644 --- a/crates/goose-server/src/main.rs +++ b/crates/goose-server/src/main.rs @@ -5,6 +5,7 @@ mod logging; mod openapi; mod routes; mod state; +mod theme_css; mod tunnel; use clap::{Parser, Subcommand}; diff --git a/crates/goose-server/src/openapi.rs b/crates/goose-server/src/openapi.rs index 1fa80ab31a0e..1f347bbd8c4f 100644 --- a/crates/goose-server/src/openapi.rs +++ b/crates/goose-server/src/openapi.rs @@ -358,6 +358,8 @@ derive_utoipa!(Icon as IconSchema); super::routes::config_management::set_config_provider, super::routes::config_management::configure_provider_oauth, super::routes::config_management::get_pricing, + super::routes::config_management::get_theme_variables, + super::routes::config_management::save_theme, super::routes::prompts::get_prompts, super::routes::prompts::get_prompt, super::routes::prompts::save_prompt, @@ -446,6 +448,8 @@ derive_utoipa!(Icon as IconSchema); super::routes::config_management::PricingQuery, super::routes::config_management::PricingResponse, super::routes::config_management::PricingData, + super::routes::config_management::ThemeVariablesResponse, + super::routes::config_management::SaveThemeRequest, super::routes::prompts::PromptsListResponse, super::routes::prompts::PromptContentResponse, super::routes::prompts::SavePromptRequest, diff --git a/crates/goose-server/src/routes/config_management.rs b/crates/goose-server/src/routes/config_management.rs index 45562d79791f..8c684736ebbf 100644 --- a/crates/goose-server/src/routes/config_management.rs +++ b/crates/goose-server/src/routes/config_management.rs @@ -836,6 +836,53 @@ pub async fn configure_provider_oauth( Ok(Json("OAuth configuration completed".to_string())) } +#[derive(Serialize, ToSchema)] +pub struct ThemeVariablesResponse { + variables: HashMap, +} + +#[utoipa::path( + get, + path = "/theme/variables", + responses( + (status = 200, description = "MCP theme variables with light-dark() format", body = ThemeVariablesResponse) + ) +)] +pub async fn get_theme_variables() -> Json { + use crate::theme_css; + let variables = theme_css::generate_mcp_theme_variables(); + Json(ThemeVariablesResponse { variables }) +} + +#[derive(Deserialize, ToSchema)] +pub struct SaveThemeRequest { + /// CSS content for theme.css file. If empty, deletes the theme file (reset). + css: String, +} + +#[utoipa::path( + post, + path = "/theme/save", + request_body = SaveThemeRequest, + responses( + (status = 200, description = "Theme saved successfully", body = String), + (status = 500, description = "Failed to save theme") + ) +)] +pub async fn save_theme(Json(request): Json) -> Result, ErrorResponse> { + let theme_path = Paths::in_data_dir("theme.css"); + + if request.css.trim().is_empty() { + if theme_path.exists() { + std::fs::remove_file(&theme_path)?; + } + Ok(Json("Theme reset successfully".to_string())) + } else { + std::fs::write(&theme_path, request.css)?; + Ok(Json("Theme saved successfully".to_string())) + } +} + pub fn routes(state: Arc) -> Router { Router::new() .route("/config", get(read_all_config)) @@ -868,6 +915,8 @@ pub fn routes(state: Arc) -> Router { "/config/providers/{name}/oauth", post(configure_provider_oauth), ) + .route("/theme/variables", get(get_theme_variables)) + .route("/theme/save", post(save_theme)) .with_state(state) } diff --git a/crates/goose-server/src/theme_css.rs b/crates/goose-server/src/theme_css.rs new file mode 100644 index 000000000000..617f3ac64139 --- /dev/null +++ b/crates/goose-server/src/theme_css.rs @@ -0,0 +1,172 @@ +use goose::config::paths::Paths; +use regex::Regex; +use std::collections::HashMap; + +const MAIN_CSS: &str = include_str!("../../../ui/desktop/src/styles/main.css"); + +/// Theme CSS Generation +/// ==================== +/// +/// Both main.css and user's theme.css use MCP-compliant variable names. +/// This module simply: +/// 1. Parses main.css to get default MCP color variables from :root and .dark +/// 2. Parses user's theme.css (if exists) which also uses MCP names +/// 3. Merges them (user overrides defaults) +/// 4. Returns variables in light-dark(light_value, dark_value) format for frontend injection + +fn parse_css_variables(css: &str) -> (HashMap, HashMap) { + let mut root_vars = HashMap::new(); + let mut dark_vars = HashMap::new(); + + let var_regex = Regex::new(r"--([a-z0-9-]+):\s*([^;]+);").unwrap(); + + let mut in_root = false; + let mut in_dark = false; + let mut brace_depth = 0; + + for line in css.lines() { + let trimmed = line.trim(); + + if trimmed.starts_with(":root") { + in_root = true; + in_dark = false; + brace_depth = 0; + } else if trimmed.starts_with(".dark") { + in_dark = true; + in_root = false; + brace_depth = 0; + } + + brace_depth += trimmed.chars().filter(|&c| c == '{').count() as i32; + brace_depth -= trimmed.chars().filter(|&c| c == '}').count() as i32; + + if brace_depth <= 0 { + in_root = false; + in_dark = false; + } + + if let Some(caps) = var_regex.captures(trimmed) { + let name = caps.get(1).unwrap().as_str().to_string(); + let value = caps.get(2).unwrap().as_str().trim().to_string(); + + if in_root { + root_vars.insert(name, value); + } else if in_dark { + dark_vars.insert(name, value); + } + } + } + + (root_vars, dark_vars) +} + +fn resolve_var_reference(value: &str, vars: &HashMap) -> String { + let var_ref_regex = Regex::new(r"var\(--([a-z0-9-]+)\)").unwrap(); + + let mut result = value.to_string(); + let mut iterations = 0; + const MAX_ITERATIONS: usize = 10; + + while iterations < MAX_ITERATIONS { + if let Some(caps) = var_ref_regex.captures(&result.clone()) { + let var_name = caps.get(1).unwrap().as_str(); + if let Some(resolved) = vars.get(var_name) { + let full_match = caps.get(0).unwrap().as_str(); + result = result.replace(full_match, resolved); + iterations += 1; + } else { + break; + } + } else { + break; + } + } + + result +} + +pub fn generate_mcp_theme_variables() -> HashMap { + let (main_root, main_dark) = parse_css_variables(MAIN_CSS); + let mut merged_root = main_root.clone(); + + let mut merged_dark = main_dark.clone(); + + let theme_path = Paths::in_data_dir("theme.css"); + if theme_path.exists() { + if let Ok(theme_css) = std::fs::read_to_string(&theme_path) { + let (theme_root, theme_dark) = parse_css_variables(&theme_css); + merged_root.extend(theme_root); + merged_dark.extend(theme_dark); + } + }; + + + let resolved_root: HashMap = merged_root + .iter() + .map(|(k, v)| (k.clone(), resolve_var_reference(v, &merged_root))) + .collect(); + + let resolved_dark: HashMap = merged_dark + .iter() + .map(|(k, v)| (k.clone(), resolve_var_reference(v, &merged_dark))) + .collect(); + + let mut result = HashMap::new(); + + for (name, light_value) in &resolved_root { + if name.starts_with("color-") { + let dark_value = resolved_dark.get(name).unwrap_or(light_value); + + let formatted = format!("light-dark({}, {})", light_value, dark_value); + result.insert(format!("--{}", name), formatted); + } + } + + for (name, dark_value) in &resolved_dark { + if name.starts_with("color-") && !result.contains_key(&format!("--{}", name)) { + let light_value = resolved_root.get(name).unwrap_or(dark_value); + let formatted = format!("light-dark({}, {})", light_value, dark_value); + result.insert(format!("--{}", name), formatted); + } + } + + result +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_css_variables() { + let css = r#" + :root { + --color-background-primary: #ffffff; + --color-text-primary: var(--color-neutral-800); + } + .dark { + --color-background-primary: #000000; + } + "#; + + let (root, dark) = parse_css_variables(css); + assert_eq!(root.get("color-background-primary"), Some(&"#ffffff".to_string())); + assert_eq!(dark.get("color-background-primary"), Some(&"#000000".to_string())); + } + + #[test] + fn test_resolve_var_reference() { + let mut vars = HashMap::new(); + vars.insert("color-red".to_string(), "#ff0000".to_string()); + vars.insert("color-text-danger".to_string(), "var(--color-red)".to_string()); + + assert_eq!( + resolve_var_reference("var(--color-red)", &vars), + "#ff0000" + ); + assert_eq!( + resolve_var_reference("var(--color-text-danger)", &vars), + "#ff0000" + ); + } +} diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 36f07d7ae446..1340e1b06515 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -3236,6 +3236,59 @@ } } }, + "/theme/save": { + "post": { + "tags": [ + "super::routes::config_management" + ], + "operationId": "save_theme", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SaveThemeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Theme saved successfully", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "500": { + "description": "Failed to save theme" + } + } + } + }, + "/theme/variables": { + "get": { + "tags": [ + "super::routes::config_management" + ], + "operationId": "get_theme_variables", + "responses": { + "200": { + "description": "MCP theme variables with light-dark() format", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ThemeVariablesResponse" + } + } + } + } + } + } + }, "/tunnel/start": { "post": { "tags": [ @@ -6218,6 +6271,18 @@ } } }, + "SaveThemeRequest": { + "type": "object", + "required": [ + "css" + ], + "properties": { + "css": { + "type": "string", + "description": "CSS content for theme.css file. If empty, deletes the theme file (reset)." + } + } + }, "ScanRecipeRequest": { "type": "object", "required": [ @@ -6884,6 +6949,21 @@ } } }, + "ThemeVariablesResponse": { + "type": "object", + "required": [ + "variables" + ], + "properties": { + "variables": { + "type": "object", + "description": "MCP-compatible CSS variables with light-dark() format\nThese variables use MCP standard naming (--color-*) and light-dark() format\nfor seamless integration with both the main app and MCP apps.", + "additionalProperties": { + "type": "string" + } + } + } + }, "ThinkingContent": { "type": "object", "required": [ diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx index ba03ed6dc576..54c8bcf368fe 100644 --- a/ui/desktop/src/App.tsx +++ b/ui/desktop/src/App.tsx @@ -218,7 +218,7 @@ const ConfigureProvidersRoute = () => { const navigate = useNavigate(); return ( -
+
navigate('/settings', { state: { section: 'models' } })} isOnboarding={false} @@ -235,7 +235,7 @@ const WelcomeRoute = ({ onSelectProvider }: WelcomeRouteProps) => { const navigate = useNavigate(); return ( -
+
{ navigate('/', { replace: true }); @@ -612,7 +612,7 @@ export function AppInner() { toastClassName={() => `relative min-h-16 mb-4 p-2 rounded-lg flex justify-between overflow-hidden cursor-pointer - text-text-on-accent bg-background-inverse + text-text-inverse bg-background-inverse ` } style={{ width: '450px' }} @@ -623,7 +623,7 @@ export function AppInner() { pauseOnHover /> -
+
diff --git a/ui/desktop/src/api/index.ts b/ui/desktop/src/api/index.ts index 7089867c1eab..ed0ccf96d59a 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, checkProvider, configureProviderOauth, confirmToolAction, createCustomProvider, createRecipe, createSchedule, decodeRecipe, deleteModel, deleteRecipe, deleteSchedule, deleteSession, detectProvider, diagnostics, downloadModel, encodeRecipe, exportApp, exportSession, forkSession, getCustomProvider, getDictationConfig, getDownloadProgress, getExtensions, getPricing, getPrompt, getPrompts, getProviderModels, getSession, getSessionExtensions, getSessionInsights, getSlashCommands, getTools, getTunnelStatus, importApp, importSession, initConfig, inspectRunningJob, killRunningJob, listApps, 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, searchSessions, sendTelemetryEvent, sessionsHandler, setConfigProvider, setRecipeSlashCommand, startAgent, startOpenrouterSetup, startTetrateSetup, startTunnel, status, stopAgent, stopTunnel, systemInfo, transcribeDictation, unpauseSchedule, updateAgentProvider, updateCustomProvider, updateFromSession, updateSchedule, 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, ChatRequest, CheckProviderData, CheckProviderRequest, ClientOptions, CommandType, ConfigKey, ConfigKeyQuery, ConfigResponse, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionRequest, ConfirmToolActionResponses, Content, Conversation, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponse, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeRequest, CreateRecipeResponse, CreateRecipeResponse2, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleRequest, CreateScheduleResponse, CreateScheduleResponses, CspMetadata, DeclarativeProviderConfig, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeRequest, DecodeRecipeResponse, DecodeRecipeResponse2, DecodeRecipeResponses, 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, DownloadModelData, DownloadModelErrors, DownloadModelResponses, DownloadProgress, DownloadStatus, EmbeddedResource, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeRequest, EncodeRecipeResponse, EncodeRecipeResponse2, EncodeRecipeResponses, Envs, ErrorResponse, ExportAppData, ExportAppError, ExportAppErrors, ExportAppResponse, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponse, ExportSessionResponses, ExtensionConfig, ExtensionData, ExtensionEntry, ExtensionLoadResult, ExtensionQuery, ExtensionResponse, ForkRequest, ForkResponse, ForkSessionData, ForkSessionErrors, ForkSessionResponse, ForkSessionResponses, FrontendToolRequest, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponse, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponse, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponse, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponse, GetExtensionsResponses, GetPricingData, GetPricingResponse, GetPricingResponses, GetPromptData, GetPromptErrors, GetPromptResponse, GetPromptResponses, GetPromptsData, GetPromptsResponse, GetPromptsResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponse, GetProviderModelsResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponse, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponse, GetSessionInsightsResponses, GetSessionResponse, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponse, GetSlashCommandsResponses, GetToolsData, GetToolsErrors, GetToolsQuery, GetToolsResponse, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponse, GetTunnelStatusResponses, GooseApp, 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, ListModelsData, ListModelsResponse, ListModelsResponses, ListRecipeResponse, ListRecipesData, ListRecipesErrors, ListRecipesResponse, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponse, ListSchedulesResponse2, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponse, ListSessionsResponses, LoadedProvider, McpAppResource, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, Message, MessageContent, MessageEvent, MessageMetadata, ModelConfig, ModelInfo, ParseRecipeData, ParseRecipeError, ParseRecipeErrors, ParseRecipeRequest, ParseRecipeResponse, ParseRecipeResponse2, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponse, PauseScheduleResponses, Permission, PermissionLevel, PermissionsMetadata, PricingData, PricingQuery, PricingResponse, PrincipalType, PromptContentResponse, PromptsListResponse, ProviderDetails, ProviderEngine, ProviderMetadata, ProvidersData, ProvidersResponse, ProvidersResponse2, ProvidersResponses, ProviderType, RawAudioContent, RawEmbeddedResource, RawImageContent, RawResource, RawTextContent, ReadAllConfigData, ReadAllConfigResponse, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, ReadResourceData, ReadResourceErrors, ReadResourceRequest, ReadResourceResponse, ReadResourceResponse2, ReadResourceResponses, ReasoningContent, 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, 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, SavePromptData, SavePromptErrors, SavePromptRequest, SavePromptResponse, SavePromptResponses, SaveRecipeData, SaveRecipeError, SaveRecipeErrors, SaveRecipeRequest, SaveRecipeResponse, SaveRecipeResponse2, SaveRecipeResponses, ScanRecipeData, ScanRecipeRequest, ScanRecipeResponse, ScanRecipeResponse2, ScanRecipeResponses, ScheduledJob, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeRequest, ScheduleRecipeResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponse, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, Session, SessionDisplayInfo, SessionExtensionsResponse, SessionInsights, SessionListResponse, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponse, SessionsHandlerResponses, SessionsQuery, SessionType, SetConfigProviderData, SetProviderRequest, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, SetSlashCommandRequest, Settings, SetupResponse, SlashCommand, SlashCommandsResponse, StartAgentData, StartAgentError, StartAgentErrors, StartAgentRequest, StartAgentResponse, StartAgentResponses, 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, UpdateProviderRequest, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleRequest, UpdateScheduleResponse, UpdateScheduleResponses, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameRequest, UpdateSessionNameResponses, 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, checkProvider, configureProviderOauth, confirmToolAction, createCustomProvider, createRecipe, createSchedule, decodeRecipe, deleteModel, deleteRecipe, deleteSchedule, deleteSession, detectProvider, diagnostics, downloadModel, encodeRecipe, exportApp, exportSession, forkSession, getCustomProvider, getDictationConfig, getDownloadProgress, getExtensions, getPricing, getPrompt, getPrompts, getProviderModels, getSession, getSessionExtensions, getSessionInsights, getSlashCommands, getThemeVariables, getTools, getTunnelStatus, importApp, importSession, initConfig, inspectRunningJob, killRunningJob, listApps, 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, saveTheme, scanRecipe, scheduleRecipe, searchSessions, sendTelemetryEvent, sessionsHandler, setConfigProvider, setRecipeSlashCommand, startAgent, startOpenrouterSetup, startTetrateSetup, startTunnel, status, stopAgent, stopTunnel, systemInfo, transcribeDictation, unpauseSchedule, updateAgentProvider, updateCustomProvider, updateFromSession, updateSchedule, 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, ChatRequest, CheckProviderData, CheckProviderRequest, ClientOptions, CommandType, ConfigKey, ConfigKeyQuery, ConfigResponse, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionRequest, ConfirmToolActionResponses, Content, Conversation, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponse, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeRequest, CreateRecipeResponse, CreateRecipeResponse2, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleRequest, CreateScheduleResponse, CreateScheduleResponses, CspMetadata, DeclarativeProviderConfig, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeRequest, DecodeRecipeResponse, DecodeRecipeResponse2, DecodeRecipeResponses, 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, DownloadModelData, DownloadModelErrors, DownloadModelResponses, DownloadProgress, DownloadStatus, EmbeddedResource, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeRequest, EncodeRecipeResponse, EncodeRecipeResponse2, EncodeRecipeResponses, Envs, ErrorResponse, ExportAppData, ExportAppError, ExportAppErrors, ExportAppResponse, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponse, ExportSessionResponses, ExtensionConfig, ExtensionData, ExtensionEntry, ExtensionLoadResult, ExtensionQuery, ExtensionResponse, ForkRequest, ForkResponse, ForkSessionData, ForkSessionErrors, ForkSessionResponse, ForkSessionResponses, FrontendToolRequest, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponse, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponse, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponse, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponse, GetExtensionsResponses, GetPricingData, GetPricingResponse, GetPricingResponses, GetPromptData, GetPromptErrors, GetPromptResponse, GetPromptResponses, GetPromptsData, GetPromptsResponse, GetPromptsResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponse, GetProviderModelsResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponse, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponse, GetSessionInsightsResponses, GetSessionResponse, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponse, GetSlashCommandsResponses, GetThemeVariablesData, GetThemeVariablesResponse, GetThemeVariablesResponses, GetToolsData, GetToolsErrors, GetToolsQuery, GetToolsResponse, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponse, GetTunnelStatusResponses, GooseApp, 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, ListModelsData, ListModelsResponse, ListModelsResponses, ListRecipeResponse, ListRecipesData, ListRecipesErrors, ListRecipesResponse, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponse, ListSchedulesResponse2, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponse, ListSessionsResponses, LoadedProvider, McpAppResource, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, Message, MessageContent, MessageEvent, MessageMetadata, ModelConfig, ModelInfo, ParseRecipeData, ParseRecipeError, ParseRecipeErrors, ParseRecipeRequest, ParseRecipeResponse, ParseRecipeResponse2, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponse, PauseScheduleResponses, Permission, PermissionLevel, PermissionsMetadata, PricingData, PricingQuery, PricingResponse, PrincipalType, PromptContentResponse, PromptsListResponse, ProviderDetails, ProviderEngine, ProviderMetadata, ProvidersData, ProvidersResponse, ProvidersResponse2, ProvidersResponses, ProviderType, RawAudioContent, RawEmbeddedResource, RawImageContent, RawResource, RawTextContent, ReadAllConfigData, ReadAllConfigResponse, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, ReadResourceData, ReadResourceErrors, ReadResourceRequest, ReadResourceResponse, ReadResourceResponse2, ReadResourceResponses, ReasoningContent, 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, 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, SavePromptData, SavePromptErrors, SavePromptRequest, SavePromptResponse, SavePromptResponses, SaveRecipeData, SaveRecipeError, SaveRecipeErrors, SaveRecipeRequest, SaveRecipeResponse, SaveRecipeResponse2, SaveRecipeResponses, SaveThemeData, SaveThemeErrors, SaveThemeRequest, SaveThemeResponse, SaveThemeResponses, ScanRecipeData, ScanRecipeRequest, ScanRecipeResponse, ScanRecipeResponse2, ScanRecipeResponses, ScheduledJob, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeRequest, ScheduleRecipeResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponse, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, Session, SessionDisplayInfo, SessionExtensionsResponse, SessionInsights, SessionListResponse, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponse, SessionsHandlerResponses, SessionsQuery, SessionType, SetConfigProviderData, SetProviderRequest, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, SetSlashCommandRequest, Settings, SetupResponse, SlashCommand, SlashCommandsResponse, StartAgentData, StartAgentError, StartAgentErrors, StartAgentRequest, StartAgentResponse, StartAgentResponses, 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, ThemeVariablesResponse, 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, UpdateProviderRequest, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleRequest, UpdateScheduleResponse, UpdateScheduleResponses, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameRequest, UpdateSessionNameResponses, 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 3192bcd9e8bd..4a4b9c36cc64 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, CheckProviderData, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionResponses, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleResponses, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeResponses, DeleteModelData, DeleteModelErrors, DeleteModelResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DetectProviderData, DetectProviderErrors, DetectProviderResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponses, DownloadModelData, DownloadModelErrors, DownloadModelResponses, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeResponses, ExportAppData, ExportAppErrors, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponses, ForkSessionData, ForkSessionErrors, ForkSessionResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponses, GetPricingData, GetPricingResponses, GetPromptData, GetPromptErrors, GetPromptResponses, GetPromptsData, GetPromptsResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponses, 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, 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, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponses, SetConfigProviderData, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, StartAgentData, StartAgentErrors, StartAgentResponses, 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, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleResponses, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameResponses, 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, CheckProviderData, ConfigureProviderOauthData, ConfigureProviderOauthErrors, ConfigureProviderOauthResponses, ConfirmToolActionData, ConfirmToolActionErrors, ConfirmToolActionResponses, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleResponses, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeResponses, DeleteModelData, DeleteModelErrors, DeleteModelResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DetectProviderData, DetectProviderErrors, DetectProviderResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponses, DownloadModelData, DownloadModelErrors, DownloadModelResponses, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeResponses, ExportAppData, ExportAppErrors, ExportAppResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponses, ForkSessionData, ForkSessionErrors, ForkSessionResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponses, GetDictationConfigData, GetDictationConfigResponses, GetDownloadProgressData, GetDownloadProgressErrors, GetDownloadProgressResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponses, GetPricingData, GetPricingResponses, GetPromptData, GetPromptErrors, GetPromptResponses, GetPromptsData, GetPromptsResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponses, GetSessionData, GetSessionErrors, GetSessionExtensionsData, GetSessionExtensionsErrors, GetSessionExtensionsResponses, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponses, GetSessionResponses, GetSlashCommandsData, GetSlashCommandsResponses, GetThemeVariablesData, GetThemeVariablesResponses, GetToolsData, GetToolsErrors, GetToolsResponses, GetTunnelStatusData, GetTunnelStatusResponses, ImportAppData, ImportAppErrors, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponses, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponses, KillRunningJobData, KillRunningJobResponses, ListAppsData, ListAppsErrors, ListAppsResponses, 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, SaveThemeData, SaveThemeErrors, SaveThemeResponses, ScanRecipeData, ScanRecipeResponses, ScheduleRecipeData, ScheduleRecipeErrors, ScheduleRecipeResponses, SearchSessionsData, SearchSessionsErrors, SearchSessionsResponses, SendTelemetryEventData, SendTelemetryEventResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponses, SetConfigProviderData, SetRecipeSlashCommandData, SetRecipeSlashCommandErrors, SetRecipeSlashCommandResponses, StartAgentData, StartAgentErrors, StartAgentResponses, 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, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleResponses, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesResponses, UpdateWorkingDirData, UpdateWorkingDirErrors, UpdateWorkingDirResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponses } from './types.gen'; export type Options = Options2 & { /** @@ -508,6 +508,17 @@ export const sendTelemetryEvent = (options } }); +export const saveTheme = (options: Options) => (options.client ?? client).post({ + url: '/theme/save', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + +export const getThemeVariables = (options?: Options) => (options?.client ?? client).get({ url: '/theme/variables', ...options }); + /** * Start the tunnel */ diff --git a/ui/desktop/src/api/types.gen.ts b/ui/desktop/src/api/types.gen.ts index 689d4dce6176..8b6f686fdf99 100644 --- a/ui/desktop/src/api/types.gen.ts +++ b/ui/desktop/src/api/types.gen.ts @@ -992,6 +992,13 @@ export type SaveRecipeResponse = { id: string; }; +export type SaveThemeRequest = { + /** + * CSS content for theme.css file. If empty, deletes the theme file (reset). + */ + css: string; +}; + export type ScanRecipeRequest = { recipe: Recipe; }; @@ -1192,6 +1199,17 @@ export type TextContent = { text: string; }; +export type ThemeVariablesResponse = { + /** + * MCP-compatible CSS variables with light-dark() format + * These variables use MCP standard naming (--color-*) and light-dark() format + * for seamless integration with both the main app and MCP apps. + */ + variables: { + [key: string]: string; + }; +}; + export type ThinkingContent = { signature: string; thinking: string; @@ -3907,6 +3925,45 @@ export type SendTelemetryEventResponses = { 202: unknown; }; +export type SaveThemeData = { + body: SaveThemeRequest; + path?: never; + query?: never; + url: '/theme/save'; +}; + +export type SaveThemeErrors = { + /** + * Failed to save theme + */ + 500: unknown; +}; + +export type SaveThemeResponses = { + /** + * Theme saved successfully + */ + 200: string; +}; + +export type SaveThemeResponse = SaveThemeResponses[keyof SaveThemeResponses]; + +export type GetThemeVariablesData = { + body?: never; + path?: never; + query?: never; + url: '/theme/variables'; +}; + +export type GetThemeVariablesResponses = { + /** + * MCP theme variables with light-dark() format + */ + 200: ThemeVariablesResponse; +}; + +export type GetThemeVariablesResponse = GetThemeVariablesResponses[keyof GetThemeVariablesResponses]; + export type StartTunnelData = { body?: never; path?: never; diff --git a/ui/desktop/src/components/AnnouncementModal.tsx b/ui/desktop/src/components/AnnouncementModal.tsx index 33f38122fc18..00681ab0e030 100644 --- a/ui/desktop/src/components/AnnouncementModal.tsx +++ b/ui/desktop/src/components/AnnouncementModal.tsx @@ -139,7 +139,7 @@ export default function AnnouncementModal() { diff --git a/ui/desktop/src/components/ApiKeyTester.tsx b/ui/desktop/src/components/ApiKeyTester.tsx index 7017849b9c75..d3569f0e4aeb 100644 --- a/ui/desktop/src/components/ApiKeyTester.tsx +++ b/ui/desktop/src/components/ApiKeyTester.tsx @@ -73,14 +73,14 @@ export default function ApiKeyTester({ onSuccess, onStartTesting }: ApiKeyTester
-
+
- +
-

+

Quick Setup with API Key

- Auto-detect your provider + Auto-detect your provider
@@ -92,7 +92,7 @@ export default function ApiKeyTester({ onSuccess, onStartTesting }: ApiKeyTester value={apiKey} onChange={(e) => setApiKey(e.target.value)} placeholder="Enter your API key (OpenAI, Anthropic, Google, etc.)" - className="flex-1 px-3 py-2 border rounded-lg bg-background-default text-text-default placeholder-text-muted focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" + className="flex-1 px-3 py-2 border rounded-lg bg-background-primary text-text-primary placeholder-text-secondary focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" disabled={isLoading} onKeyDown={(e) => { if (e.key === 'Enter' && canSubmit) { @@ -116,7 +116,7 @@ export default function ApiKeyTester({ onSuccess, onStartTesting }: ApiKeyTester {/* Loading state */} {isLoading && ( -
+
Detecting provider and validating key...
@@ -148,8 +148,8 @@ export default function ApiKeyTester({ onSuccess, onStartTesting }: ApiKeyTester
-

Suggestions:

-
    +

    Suggestions:

    +
    • diff --git a/ui/desktop/src/components/BaseChat.tsx b/ui/desktop/src/components/BaseChat.tsx index 2278d262cc37..230e2f3cb108 100644 --- a/ui/desktop/src/components/BaseChat.tsx +++ b/ui/desktop/src/components/BaseChat.tsx @@ -346,13 +346,13 @@ export default function BaseChat({ return (
      {renderHeader && renderHeader()}
      -
      +

      Failed to Load Session

      @@ -362,7 +362,7 @@ export default function BaseChat({ onClick={() => { setView('chat'); }} - className="px-4 py-2 text-center cursor-pointer text-text-default border border-border-default hover:bg-background-muted rounded-lg transition-all duration-150" + className="px-4 py-2 text-center cursor-pointer text-text-primary border border-border-primary hover:bg-background-secondary rounded-lg transition-all duration-150" > Go home @@ -377,7 +377,7 @@ export default function BaseChat({ return (
      @@ -394,14 +394,14 @@ export default function BaseChat({ className="no-drag flex flex-row items-center gap-1 hover:opacity-80 transition-opacity" > - goose + goose
      {recipe?.title && ( -
      +
      )} diff --git a/ui/desktop/src/components/ChatInput.tsx b/ui/desktop/src/components/ChatInput.tsx index 1e4cd8e6661e..ec841767a6f0 100644 --- a/ui/desktop/src/components/ChatInput.tsx +++ b/ui/desktop/src/components/ChatInput.tsx @@ -1218,7 +1218,7 @@ export default function ChatInput({ onTriggerQueueProcessing={handleResumeQueue} editingMessageIdRef={editingMessageIdRef} isPaused={queuePausedRef.current} - className="border-b border-border-default" + className="border-b border-border-primary" /> )} {/* Input row with inline action buttons wrapped in form */} @@ -1246,7 +1246,7 @@ export default function ChatInput({ overflowY: 'auto', paddingRight: dictationProvider ? '180px' : '120px', }} - className="w-full outline-none border-none focus:ring-0 bg-transparent px-3 pt-3 pb-1.5 text-sm resize-none text-text-default placeholder:text-text-muted" + className="w-full outline-none border-none focus:ring-0 bg-transparent px-3 pt-3 pb-1.5 text-sm resize-none text-text-primary placeholder:text-text-secondary" /> {/* Inline action buttons - absolutely positioned on the right */} @@ -1371,15 +1371,15 @@ export default function ChatInput({ {/* Recording/transcribing status indicator - positioned above the button row */} {(isRecording || isTranscribing) && ( -
      +
      {isRecording && ( - + Listening )} - {isRecording && isTranscribing && } + {isRecording && isTranscribing && } {isTranscribing && ( @@ -1395,7 +1395,7 @@ export default function ChatInput({ {/* Combined files and images preview */} {(pastedImages.length > 0 || allDroppedFiles.length > 0) && ( -
      +
      {/* Render pasted images first */} {pastedImages.map((img) => (
      @@ -1403,7 +1403,7 @@ export default function ChatInput({ {`Pasted )} {img.isLoading && ( @@ -1444,7 +1444,7 @@ export default function ChatInput({ {file.name} )} {file.isLoading && ( @@ -1462,15 +1462,15 @@ export default function ChatInput({
      ) : ( // File box preview -
      -
      +
      +
      {file.name.split('.').pop()?.toUpperCase() || 'FILE'}
      -

      +

      {file.name}

      -

      {file.type || 'Unknown type'}

      +

      {file.type || 'Unknown type'}

      )} @@ -1507,7 +1507,7 @@ export default function ChatInput({ onRestartStart={() => setChatState?.(ChatState.RestartingAgent)} onRestartEnd={() => setChatState?.(ChatState.Idle)} /> -
      +
      Attach file -
      +
      {/* Model selector, mode selector, alerts, summarize button */}
      {/* Cost Tracker */} @@ -1548,13 +1548,13 @@ export default function ChatInput({ />
      -
      +
      -
      +
      {sessionId && messages.length > 0 && ( <> -
      +
      @@ -1570,7 +1570,7 @@ export default function ChatInput({ }} variant="ghost" size="sm" - className="flex items-center justify-center text-text-default/70 hover:text-text-default text-xs cursor-pointer" + className="flex items-center justify-center text-text-primary/70 hover:text-text-primary text-xs cursor-pointer" > @@ -1593,7 +1593,7 @@ export default function ChatInput({ }} variant="ghost" size="sm" - className="flex items-center justify-center text-text-default/70 hover:text-text-default text-xs cursor-pointer transition-colors" + className="flex items-center justify-center text-text-primary/70 hover:text-text-primary text-xs cursor-pointer transition-colors" > diff --git a/ui/desktop/src/components/ElicitationRequest.tsx b/ui/desktop/src/components/ElicitationRequest.tsx index b1720d3ddf3a..b8b6c3cf7007 100644 --- a/ui/desktop/src/components/ElicitationRequest.tsx +++ b/ui/desktop/src/components/ElicitationRequest.tsx @@ -57,7 +57,7 @@ export default function ElicitationRequest({ if (isCancelledMessage) { return ( -
      +
      Information request was cancelled.
      ); @@ -65,7 +65,7 @@ export default function ElicitationRequest({ if (submitted) { return ( -
      +
      -
      +
      +
      -
      +
      {message || 'Goose needs some information from you.'}
      -
      +
      Honk! {window?.appConfig?.get('GOOSE_VERSION') !== undefined ? ( -

      +

      An error occurred in Goose v{window?.appConfig?.get('GOOSE_VERSION') as string}.

      ) : ( -

      +

      An error occurred.

      )} diff --git a/ui/desktop/src/components/GooseMessage.tsx b/ui/desktop/src/components/GooseMessage.tsx index b6f04f83452e..794ae59fcb44 100644 --- a/ui/desktop/src/components/GooseMessage.tsx +++ b/ui/desktop/src/components/GooseMessage.tsx @@ -143,8 +143,8 @@ export default function GooseMessage({ )} {cotText && ( -
      - +
      + Show thinking
      @@ -172,7 +172,7 @@ export default function GooseMessage({ {toolRequests.length === 0 && (
      {!isStreaming && ( -
      +
      {timestamp}
      )} @@ -213,7 +213,7 @@ export default function GooseMessage({ ); })}
      -
      +
      {!isStreaming && !hideTimestamp && timestamp}
      diff --git a/ui/desktop/src/components/GooseSidebar/AppSidebar.tsx b/ui/desktop/src/components/GooseSidebar/AppSidebar.tsx index b80fd519647e..3342f9dff6aa 100644 --- a/ui/desktop/src/components/GooseSidebar/AppSidebar.tsx +++ b/ui/desktop/src/components/GooseSidebar/AppSidebar.tsx @@ -155,18 +155,18 @@ const SessionList = React.memo<{
      {/* Vertical line segment - full height except last item stops at middle */}
      {/* Horizontal branch line */} -
      +
      @@ -185,10 +185,10 @@ export function OllamaSetup({ onSuccess, onCancel }: OllamaSetupProps) {

      Downloading {getPreferredModel()}...

      {downloadProgress && ( <> -

      {downloadProgress.status}

      +

      {downloadProgress.status}

      {downloadProgress.total && downloadProgress.completed && (
      -
      +
      -

      +

      {Math.round((downloadProgress.completed / downloadProgress.total) * 100)}%

      @@ -209,7 +209,7 @@ export function OllamaSetup({ onSuccess, onCancel }: OllamaSetupProps) { @@ -228,8 +228,8 @@ export function OllamaSetup({ onSuccess, onCancel }: OllamaSetupProps) {
      -

      Waiting for Ollama to start...

      -

      +

      Waiting for Ollama to start...

      +

      Once Ollama is installed and running, we'll automatically detect it.

      @@ -239,7 +239,7 @@ export function OllamaSetup({ onSuccess, onCancel }: OllamaSetupProps) { target="_blank" rel="noopener noreferrer" onClick={handleInstallClick} - className="block w-full px-6 py-3 bg-background-muted text-text-default rounded-lg transition-colors font-medium text-center" + className="block w-full px-6 py-3 bg-background-secondary text-text-primary rounded-lg transition-colors font-medium text-center" > Install Ollama @@ -249,7 +249,7 @@ export function OllamaSetup({ onSuccess, onCancel }: OllamaSetupProps) { diff --git a/ui/desktop/src/components/ParameterInputModal.tsx b/ui/desktop/src/components/ParameterInputModal.tsx index afb7b86e0038..96bba1572719 100644 --- a/ui/desktop/src/components/ParameterInputModal.tsx +++ b/ui/desktop/src/components/ParameterInputModal.tsx @@ -90,9 +90,9 @@ const ParameterInputModal: React.FC = ({
      {showCancelOptions ? ( // Cancel options modal -
      -

      Cancel Recipe Setup

      -

      What would you like to do?

      +
      +

      Cancel Recipe Setup

      +

      What would you like to do?

      ) : ( // Main parameter form -
      +
      -

      Recipe Parameters

      +

      Recipe Parameters

      {parameters.map((param) => (
      -