diff --git a/crates/goose-server/src/routes/agent.rs b/crates/goose-server/src/routes/agent.rs index 09b1d361cf..3576de0f11 100644 --- a/crates/goose-server/src/routes/agent.rs +++ b/crates/goose-server/src/routes/agent.rs @@ -1054,16 +1054,17 @@ async fn read_resource( request_body = CallToolRequest, responses( (status = 200, description = "Resource read successfully", body = CallToolResponse), + (status = 403, description = "Forbidden - tool is not app-visible", body = ErrorResponse), (status = 401, description = "Unauthorized - invalid secret key"), - (status = 424, description = "Agent not initialized"), - (status = 404, description = "Resource not found"), - (status = 500, description = "Internal server error") + (status = 424, description = "Frontend tool execution requires the frontend host", body = ErrorResponse), + (status = 404, description = "Resource not found", body = ErrorResponse), + (status = 500, description = "Internal server error", body = ErrorResponse) ) )] async fn call_tool( State(state): State>, Json(payload): Json, -) -> Result, StatusCode> { +) -> Result, ErrorResponse> { ensure_extensions_loaded(&state, &payload.session_id).await; let agent = state @@ -1078,10 +1079,23 @@ async fn call_tool( tool = %payload.name, "Rejected app call to model-only tool" ); - return Err(StatusCode::FORBIDDEN); + return Err(ErrorResponse { + message: format!("Tool '{}' cannot be called by the app", payload.name), + status: StatusCode::FORBIDDEN, + }); } } + if agent.is_frontend_tool(&payload.name).await { + return Err(ErrorResponse { + message: format!( + "Tool '{}' is provided by the frontend and must be executed by the frontend host", + payload.name + ), + status: StatusCode::FAILED_DEPENDENCY, + }); + } + let arguments = match payload.arguments { Value::Object(map) => Some(map), _ => None, @@ -1100,19 +1114,19 @@ async fn call_tool( .extension_manager .dispatch_tool_call(&ctx, tool_call, CancellationToken::default()) .await - .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + .map_err(ErrorResponse::from)?; - let result = tool_result - .result - .await - .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + let result = tool_result.result.await.map_err(|err| ErrorResponse { + message: err.to_string(), + status: StatusCode::INTERNAL_SERVER_ERROR, + })?; let content = result .content .into_iter() .map(serde_json::to_value) .collect::, _>>() - .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + .map_err(ErrorResponse::from)?; Ok(Json(CallToolResponse { content, @@ -1340,3 +1354,87 @@ pub fn routes(state: Arc) -> Router { .route("/agent/stop", post(stop_agent)) .with_state(state) } + +#[cfg(test)] +mod tests { + use super::*; + use goose::config::GooseMode; + use goose::session::session_manager::SessionType; + use rmcp::model::Tool; + use rmcp::object; + + fn frontend_extension() -> ExtensionConfig { + ExtensionConfig::Frontend { + name: "frontend-e2e".to_string(), + description: "Frontend test extension".to_string(), + tools: vec![Tool::new( + "frontend__echo".to_string(), + "Echo a string from the frontend".to_string(), + object!({ + "type": "object", + "properties": { + "message": { "type": "string" } + }, + "required": ["message"] + }), + )], + instructions: Some("Use the frontend echo tool.".to_string()), + bundled: None, + available_tools: vec![], + } + } + + #[tokio::test] + async fn frontend_extensions_are_listed_and_rejected_cleanly_by_call_tool() { + let state = AppState::new(true).await.unwrap(); + let session = state + .session_manager() + .create_session( + std::env::current_dir().unwrap(), + "frontend-route-test".to_string(), + SessionType::Hidden, + GooseMode::default(), + ) + .await + .unwrap(); + + agent_add_extension( + State(state.clone()), + Json(AddExtensionRequest { + session_id: session.id.clone(), + config: frontend_extension(), + }), + ) + .await + .unwrap(); + + let Json(tools) = get_tools( + State(state.clone()), + Query(GetToolsQuery { + extension_name: None, + session_id: session.id.clone(), + }), + ) + .await + .unwrap(); + + assert!(tools.iter().any(|tool| tool.name == "frontend__echo")); + + let error = match call_tool( + State(state), + Json(CallToolRequest { + session_id: session.id, + name: "frontend__echo".to_string(), + arguments: Value::Object(serde_json::Map::new()), + }), + ) + .await + { + Ok(_) => panic!("frontend tools should not be callable through /agent/call_tool"), + Err(error) => error, + }; + + assert_eq!(error.status, StatusCode::FAILED_DEPENDENCY); + assert!(error.message.contains("frontend host")); + } +} diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index 045a788449..b2fe6d08ce 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -28,6 +28,7 @@ use crate::agents::platform_tools::PLATFORM_MANAGE_SCHEDULE_TOOL_NAME; use crate::agents::prompt_manager::PromptManager; use crate::agents::retry::{RetryManager, RetryResult}; use crate::agents::types::{FrontendTool, SessionConfig, SharedProvider, ToolResultReceiver}; +use crate::config::extensions::name_to_key; use crate::config::permission::PermissionManager; use crate::config::{get_enabled_extensions, Config, GooseMode}; use crate::context_mgmt::{ @@ -66,6 +67,8 @@ use tracing::{debug, error, info, instrument, warn}; const DEFAULT_MAX_TURNS: u32 = 1000; const COMPACTION_THINKING_TEXT: &str = "goose is compacting the conversation..."; +const DEFAULT_FRONTEND_INSTRUCTIONS: &str = + "The following tools are provided directly by the frontend and will be executed by the frontend when called."; /// Context needed for the reply function pub struct ReplyContext { @@ -162,6 +165,7 @@ pub struct Agent { pub extension_manager: Arc, pub(super) final_output_tool: Arc>>, + pub(super) frontend_extensions: Mutex>, pub(super) frontend_tools: Mutex>, pub(super) frontend_instructions: Mutex>, pub(super) prompt_manager: Mutex, @@ -272,6 +276,7 @@ impl Agent { capabilities, )), final_output_tool: Arc::new(Mutex::new(None)), + frontend_extensions: Mutex::new(HashMap::new()), frontend_tools: Mutex::new(HashMap::new()), frontend_instructions: Mutex::new(None), prompt_manager: Mutex::new(PromptManager::new()), @@ -626,6 +631,111 @@ impl Agent { self.frontend_tools.lock().await.get(name).cloned() } + async fn frontend_extension_configs(&self) -> Vec { + let mut configs = self + .frontend_extensions + .lock() + .await + .values() + .cloned() + .collect::>(); + configs.sort_by_key(|config| config.key()); + configs + } + + async fn frontend_tools_for_extension(&self, extension_name: Option<&str>) -> Vec { + let requested_extension = extension_name.map(name_to_key); + + self.frontend_extension_configs() + .await + .into_iter() + .filter_map(|config| { + let include = requested_extension + .as_ref() + .is_none_or(|name| *name == config.key()); + + match config { + ExtensionConfig::Frontend { tools, .. } if include => Some(tools), + _ => None, + } + }) + .flatten() + .collect() + } + + async fn rebuild_frontend_derived_state(&self, extensions: &HashMap) { + let multiple = extensions.len() > 1; + let mut tools = HashMap::new(); + let mut instructions = Vec::new(); + + for config in extensions.values() { + if let ExtensionConfig::Frontend { + name, + tools: ext_tools, + instructions: ext_instructions, + .. + } = config + { + for tool in ext_tools { + let tool_name = tool.name.to_string(); + tools.insert( + tool_name.clone(), + FrontendTool { + name: tool_name, + tool: tool.clone(), + }, + ); + } + + let text = ext_instructions + .clone() + .unwrap_or_else(|| DEFAULT_FRONTEND_INSTRUCTIONS.to_string()); + instructions.push(if multiple { + format!("{name}: {text}") + } else { + text + }); + } + } + + *self.frontend_tools.lock().await = tools; + *self.frontend_instructions.lock().await = if instructions.is_empty() { + None + } else { + Some(instructions.join("\n\n")) + }; + } + + async fn insert_frontend_extension(&self, extension: ExtensionConfig) { + let mut extensions = self.frontend_extensions.lock().await; + extensions.insert(extension.key(), extension); + self.rebuild_frontend_derived_state(&extensions).await; + } + + async fn remove_frontend_extension(&self, name: &str) { + let mut extensions = self.frontend_extensions.lock().await; + extensions.remove(&name_to_key(name)); + self.rebuild_frontend_derived_state(&extensions).await; + } + + async fn extension_configs_for_persistence(&self) -> Vec { + let mut extension_configs = self.extension_manager.get_extension_configs().await; + extension_configs.extend(self.frontend_extension_configs().await); + extension_configs + } + + pub(crate) async fn total_extension_and_tool_counts(&self, session_id: &str) -> (usize, usize) { + let (extension_count, tool_count) = self + .extension_manager + .get_extension_and_tool_counts(session_id) + .await; + + ( + extension_count + self.frontend_extensions.lock().await.len(), + tool_count + self.frontend_tools.lock().await.len(), + ) + } + pub async fn add_final_output_tool(&self, response: Response) { let mut final_output_tool = self.final_output_tool.lock().await; let created_final_output_tool = FinalOutputTool::new(response); @@ -771,9 +881,8 @@ impl Agent { /// Save current extension state to session metadata /// Should be called after any extension add/remove operation pub async fn save_extension_state(&self, session: &SessionConfig) -> Result<()> { - let extension_configs = self.extension_manager.get_extension_configs().await; - - let extensions_state = EnabledExtensionsState::new(extension_configs); + let extensions_state = + EnabledExtensionsState::new(self.extension_configs_for_persistence().await); let session_manager = self.config.session_manager.clone(); let mut session_data = session_manager.get_session(&session.id, false).await?; @@ -794,8 +903,8 @@ impl Agent { /// Save current extension state to session by session_id pub async fn persist_extension_state(&self, session_id: &str) -> Result<()> { - let extension_configs = self.extension_manager.get_extension_configs().await; - let extensions_state = EnabledExtensionsState::new(extension_configs); + let extensions_state = + EnabledExtensionsState::new(self.extension_configs_for_persistence().await); let session_manager = self.config.session_manager.clone(); let session = session_manager.get_session(session_id, false).await?; @@ -999,30 +1108,8 @@ impl Agent { let working_dir = Some(session.working_dir); match &extension { - ExtensionConfig::Frontend { - tools, - instructions, - .. - } => { - // For frontend tools, just store them in the frontend_tools map - let mut frontend_tools = self.frontend_tools.lock().await; - for tool in tools { - let frontend_tool = FrontendTool { - name: tool.name.to_string(), - tool: tool.clone(), - }; - frontend_tools.insert(tool.name.to_string(), frontend_tool); - } - // Store instructions if provided, using "frontend" as the key - let mut frontend_instructions = self.frontend_instructions.lock().await; - if let Some(instructions) = instructions { - *frontend_instructions = Some(instructions.clone()); - } else { - // Default frontend instructions if none provided - *frontend_instructions = Some( - "The following tools are provided directly by the frontend and will be executed by the frontend when called.".to_string(), - ); - } + ExtensionConfig::Frontend { .. } => { + self.insert_frontend_extension(extension.clone()).await; } _ => { let container = self.container.lock().await; @@ -1047,6 +1134,11 @@ impl Agent { .await .unwrap_or_default(); + prefixed_tools.extend( + self.frontend_tools_for_extension(extension_name.as_deref()) + .await, + ); + if (extension_name.is_none() || extension_name.as_deref() == Some("platform")) && self.config.scheduler_service.is_some() { @@ -1064,6 +1156,7 @@ impl Agent { pub async fn remove_extension(&self, name: &str, session_id: &str) -> Result<()> { self.extension_manager.remove_extension(name).await?; + self.remove_frontend_extension(name).await; // Persist extension state after successful removal self.persist_extension_state(session_id) @@ -1077,14 +1170,22 @@ impl Agent { } pub async fn list_extensions(&self) -> Vec { - self.extension_manager + let mut extensions = self + .extension_manager .list_extensions() .await - .expect("Failed to list extensions") + .expect("Failed to list extensions"); + extensions.extend( + self.frontend_extension_configs() + .await + .into_iter() + .map(|config| config.name()), + ); + extensions } pub async fn get_extension_configs(&self) -> Vec { - self.extension_manager.get_extension_configs().await + self.extension_configs_for_persistence().await } /// Handle a confirmation response for a tool request @@ -2243,10 +2344,7 @@ impl Agent { .get_extensions_info(&session.working_dir) .await; tracing::debug!("Retrieved {} extensions info", extensions_info.len()); - let (extension_count, tool_count) = self - .extension_manager - .get_extension_and_tool_counts(session_id) - .await; + let (extension_count, tool_count) = self.total_extension_and_tool_counts(session_id).await; // Get model name from provider let provider = self.provider().await.map_err(|e| { diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 9b39b9d620..07e65e18c7 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -138,15 +138,8 @@ impl Agent { session_id: &str, working_dir: &std::path::Path, ) -> Result<(Vec, Vec, String)> { - // Get tools from extension manager let mut tools = self.list_tools(session_id, None).await; - // Add frontend tools - let frontend_tools = self.frontend_tools.lock().await; - for frontend_tool in frontend_tools.values() { - tools.push(frontend_tool.tool.clone()); - } - #[cfg(feature = "code-mode")] let code_execution_active = self .extension_manager @@ -214,10 +207,7 @@ impl Agent { .extension_manager .get_extensions_info(working_dir) .await; - let (extension_count, tool_count) = self - .extension_manager - .get_extension_and_tool_counts(session_id) - .await; + let (extension_count, tool_count) = self.total_extension_and_tool_counts(session_id).await; // Get model name from provider let provider = self.provider().await?; diff --git a/crates/goose/tests/agent.rs b/crates/goose/tests/agent.rs index 81fbe3ecc8..7d28fe6ac3 100644 --- a/crates/goose/tests/agent.rs +++ b/crates/goose/tests/agent.rs @@ -1118,4 +1118,192 @@ mod tests { Ok(()) } } + + mod frontend_extension_tests { + use super::*; + use goose::agents::{AgentConfig, ExtensionConfig}; + use goose::config::permission::PermissionManager; + use goose::config::GooseMode; + use goose::session::session_manager::SessionType; + use goose::session::{ + EnabledExtensionsState, ExtensionData, ExtensionState, SessionManager, + }; + use rmcp::model::Tool; + use rmcp::object; + use tempfile::TempDir; + + fn frontend_extension_with_tool(name: &str, tool_name: &str) -> ExtensionConfig { + ExtensionConfig::Frontend { + name: name.to_string(), + description: format!("Frontend test extension {name}"), + tools: vec![Tool::new( + tool_name.to_string(), + format!("Run {tool_name} from the frontend"), + object!({ + "type": "object", + "properties": { + "message": { "type": "string" } + }, + "required": ["message"] + }), + )], + instructions: Some(format!("Use the {tool_name} tool.")), + bundled: None, + available_tools: vec![], + } + } + + fn frontend_extension() -> ExtensionConfig { + frontend_extension_with_tool("frontend-e2e", "frontend__echo") + } + + #[tokio::test] + async fn test_frontend_extensions_are_persisted_listed_and_removed() { + let temp_dir = TempDir::new().unwrap(); + let data_dir = temp_dir.path().to_path_buf(); + let session_manager = Arc::new(SessionManager::new(data_dir.clone())); + let permission_manager = Arc::new(PermissionManager::new(data_dir)); + let agent = Agent::with_config(AgentConfig::new( + session_manager.clone(), + permission_manager, + None, + GooseMode::default(), + false, + GoosePlatform::GooseDesktop, + )); + + let session = session_manager + .create_session( + std::env::current_dir().unwrap(), + "frontend-extension-test".to_string(), + SessionType::Hidden, + GooseMode::default(), + ) + .await + .unwrap(); + + agent + .add_extension(frontend_extension(), &session.id) + .await + .unwrap(); + + let listed_tools = agent.list_tools(&session.id, None).await; + assert!(listed_tools + .iter() + .any(|tool| tool.name == "frontend__echo")); + + let filtered_tools = agent + .list_tools(&session.id, Some("frontend-e2e".to_string())) + .await; + assert_eq!(filtered_tools.len(), 1); + assert_eq!(filtered_tools[0].name, "frontend__echo"); + + let extension_names = agent.list_extensions().await; + assert!(extension_names.iter().any(|name| name == "frontend-e2e")); + + let persisted_session = session_manager + .get_session(&session.id, false) + .await + .unwrap(); + let persisted_extensions = + EnabledExtensionsState::from_extension_data(&persisted_session.extension_data) + .unwrap() + .extensions; + assert!(persisted_extensions + .iter() + .any(|extension| extension.name() == "frontend-e2e")); + + agent + .remove_extension("frontend-e2e", &session.id) + .await + .unwrap(); + + let listed_tools = agent.list_tools(&session.id, None).await; + assert!(!listed_tools + .iter() + .any(|tool| tool.name == "frontend__echo")); + + let persisted_session = session_manager + .get_session(&session.id, false) + .await + .unwrap(); + let persisted_extensions = + EnabledExtensionsState::from_extension_data(&persisted_session.extension_data) + .unwrap() + .extensions; + assert!(persisted_extensions + .iter() + .all(|extension| extension.name() != "frontend-e2e")); + } + + #[tokio::test] + async fn test_concurrent_frontend_session_load_keeps_all_tools() { + let temp_dir = TempDir::new().unwrap(); + let data_dir = temp_dir.path().to_path_buf(); + let session_manager = Arc::new(SessionManager::new(data_dir.clone())); + let permission_manager = Arc::new(PermissionManager::new(data_dir)); + let agent = Arc::new(Agent::with_config(AgentConfig::new( + session_manager.clone(), + permission_manager, + None, + GooseMode::default(), + false, + GoosePlatform::GooseDesktop, + ))); + + let session = session_manager + .create_session( + std::env::current_dir().unwrap(), + "frontend-extension-load-test".to_string(), + SessionType::Hidden, + GooseMode::default(), + ) + .await + .unwrap(); + + let expected_tools = (0..12) + .map(|index| format!("frontend__tool_{index}")) + .collect::>(); + let extensions = expected_tools + .iter() + .enumerate() + .map(|(index, tool_name)| { + frontend_extension_with_tool(&format!("frontend-{index}"), tool_name) + }) + .collect::>(); + + let mut extension_data = ExtensionData::new(); + EnabledExtensionsState::new(extensions) + .to_extension_data(&mut extension_data) + .unwrap(); + session_manager + .update(&session.id) + .extension_data(extension_data) + .apply() + .await + .unwrap(); + + let session = session_manager + .get_session(&session.id, false) + .await + .unwrap(); + let load_results = agent.load_extensions_from_session(&session).await; + assert!( + load_results.iter().all(|result| result.success), + "failed to load frontend extensions: {load_results:?}", + ); + + let listed_tools = agent.list_tools(&session.id, None).await; + for tool_name in expected_tools { + assert!( + listed_tools.iter().any(|tool| tool.name == tool_name), + "expected listed frontend tool {tool_name}", + ); + assert!( + agent.is_frontend_tool(&tool_name).await, + "expected frontend dispatch state for {tool_name}", + ); + } + } + } } diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index fc15113a54..574090d508 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -116,14 +116,45 @@ "401": { "description": "Unauthorized - invalid secret key" }, + "403": { + "description": "Forbidden - tool is not app-visible", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { - "description": "Resource not found" + "description": "Resource not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "424": { - "description": "Agent not initialized" + "description": "Frontend tool execution requires the frontend host", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "500": { - "description": "Internal server error" + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } diff --git a/ui/desktop/src/api/index.ts b/ui/desktop/src/api/index.ts index 8850fe0db7..c941a2af88 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, callTool, cancelDownload, cancelLocalModelDownload, checkProvider, cleanupProviderCache, configureProviderOauth, confirmToolAction, createCustomProvider, createRecipe, createSchedule, decodeRecipe, deleteLocalModel, deleteModel, deleteRecipe, deleteSchedule, deleteSession, 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, inspectRunningJob, killRunningJob, listApps, listLocalModels, listModels, listRecipes, listSchedules, listSessions, mcpUiProxy, type Options, parseRecipe, pauseSchedule, providers, readAllConfig, readConfig, readResource, recipeToYaml, 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, syncFeaturedModels, 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, 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, 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, IconTheme, ImageContent, ImportAppData, ImportAppError, ImportAppErrors, ImportAppRequest, ImportAppResponse, ImportAppResponse2, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionRequest, ImportSessionResponse, ImportSessionResponses, 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, 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, SyncFeaturedModelsData, SyncFeaturedModelsResponses, 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 type { ActionRequired, ActionRequiredData, AddExtensionData, AddExtensionErrors, AddExtensionRequest, AddExtensionResponse, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponse, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponse, AgentRemoveExtensionResponses, Annotations, Author, AuthorRequest, CallToolData, CallToolError, 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, 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, IconTheme, ImageContent, ImportAppData, ImportAppError, ImportAppErrors, ImportAppRequest, ImportAppResponse, ImportAppResponse2, ImportAppResponses, ImportSessionData, ImportSessionErrors, ImportSessionRequest, ImportSessionResponse, ImportSessionResponses, 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, 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, SyncFeaturedModelsData, SyncFeaturedModelsResponses, 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/types.gen.ts b/ui/desktop/src/api/types.gen.ts index dee73b4e31..2523090d40 100644 --- a/ui/desktop/src/api/types.gen.ts +++ b/ui/desktop/src/api/types.gen.ts @@ -1755,20 +1755,26 @@ export type CallToolErrors = { * Unauthorized - invalid secret key */ 401: unknown; + /** + * Forbidden - tool is not app-visible + */ + 403: ErrorResponse; /** * Resource not found */ - 404: unknown; + 404: ErrorResponse; /** - * Agent not initialized + * Frontend tool execution requires the frontend host */ - 424: unknown; + 424: ErrorResponse; /** * Internal server error */ - 500: unknown; + 500: ErrorResponse; }; +export type CallToolError = CallToolErrors[keyof CallToolErrors]; + export type CallToolResponses = { /** * Resource read successfully