diff --git a/crates/goose-sdk/src/custom_requests.rs b/crates/goose-sdk/src/custom_requests.rs index 69525bb13b82..5b007574bbd5 100644 --- a/crates/goose-sdk/src/custom_requests.rs +++ b/crates/goose-sdk/src/custom_requests.rs @@ -108,6 +108,37 @@ pub struct UpdateWorkingDirRequest { pub working_dir: String, } +/// How a session system prompt update should be applied. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum SessionSystemPromptMode { + /// Replace Goose's base system prompt with the provided text. + Set, + /// Append the provided text under Goose's "Additional Instructions" section. + #[default] + Append, +} + +/// Set, append, or clear system prompt text for a session. +/// +/// `mode: "set"` replaces Goose's base system prompt. `mode: "append"` adds an +/// instruction under "Additional Instructions". Reusing a key replaces the +/// previous value for that mode/key; sending empty text clears it. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] +#[request( + method = "_goose/unstable/session/system-prompt/set", + response = EmptyResponse +)] +#[serde(rename_all = "camelCase")] +pub struct SetSessionSystemPromptRequest { + pub session_id: String, + #[serde(default)] + pub mode: SessionSystemPromptMode, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub key: Option, + pub text: String, +} + /// Delete a session. #[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] #[request(method = "session/delete", response = EmptyResponse)] @@ -1091,6 +1122,24 @@ pub struct ListProvidersResponse { pub entries: Vec, } +/// List the raw model identifiers returned by a provider's live supported-models API. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] +#[request( + method = "_goose/unstable/providers/supported-models/list", + response = ProviderSupportedModelsListResponse +)] +#[serde(rename_all = "camelCase")] +pub struct ProviderSupportedModelsListRequest { + pub provider_id: String, +} + +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcResponse)] +#[serde(rename_all = "camelCase")] +pub struct ProviderSupportedModelsListResponse { + pub provider_id: String, + pub models: Vec, +} + /// Trigger a background refresh of provider inventories. #[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] #[request( diff --git a/crates/goose/acp-meta.json b/crates/goose/acp-meta.json index 60893f102010..e1d6679ef976 100644 --- a/crates/goose/acp-meta.json +++ b/crates/goose/acp-meta.json @@ -30,6 +30,11 @@ "requestType": "UpdateWorkingDirRequest_unstable", "responseType": "EmptyResponse" }, + { + "method": "_goose/unstable/session/system-prompt/set", + "requestType": "SetSessionSystemPromptRequest_unstable", + "responseType": "EmptyResponse" + }, { "method": "session/delete", "requestType": "DeleteSessionRequest", @@ -65,6 +70,11 @@ "requestType": "ListProvidersRequest_unstable", "responseType": "ListProvidersResponse_unstable" }, + { + "method": "_goose/unstable/providers/supported-models/list", + "requestType": "ProviderSupportedModelsListRequest_unstable", + "responseType": "ProviderSupportedModelsListResponse_unstable" + }, { "method": "_goose/unstable/providers/catalog/list", "requestType": "ProviderCatalogListRequest_unstable", diff --git a/crates/goose/acp-schema.json b/crates/goose/acp-schema.json index 63bf2b76439c..9afa77e6c4a0 100644 --- a/crates/goose/acp-schema.json +++ b/crates/goose/acp-schema.json @@ -167,6 +167,49 @@ "x-side": "agent", "x-method": "_goose/unstable/session/working-dir/update" }, + "SetSessionSystemPromptRequest_unstable": { + "type": "object", + "properties": { + "sessionId": { + "type": "string" + }, + "mode": { + "$ref": "#/$defs/SessionSystemPromptMode", + "default": "append" + }, + "key": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "sessionId", + "text" + ], + "description": "Set, append, or clear system prompt text for a session.\n\n`mode: \"set\"` replaces Goose's base system prompt. `mode: \"append\"` adds an\ninstruction under \"Additional Instructions\". Reusing a key replaces the\nprevious value for that mode/key; sending empty text clears it.", + "x-side": "agent", + "x-method": "_goose/unstable/session/system-prompt/set" + }, + "SessionSystemPromptMode": { + "oneOf": [ + { + "type": "string", + "const": "set", + "description": "Replace Goose's base system prompt with the provided text." + }, + { + "type": "string", + "const": "append", + "description": "Append the provided text under Goose's \"Additional Instructions\" section." + } + ], + "description": "How a session system prompt update should be applied." + }, "DeleteSessionRequest": { "type": "object", "properties": { @@ -525,6 +568,40 @@ ], "description": "A single model in provider inventory." }, + "ProviderSupportedModelsListRequest_unstable": { + "type": "object", + "properties": { + "providerId": { + "type": "string" + } + }, + "required": [ + "providerId" + ], + "description": "List the raw model identifiers returned by a provider's live supported-models API.", + "x-side": "agent", + "x-method": "_goose/unstable/providers/supported-models/list" + }, + "ProviderSupportedModelsListResponse_unstable": { + "type": "object", + "properties": { + "providerId": { + "type": "string" + }, + "models": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "providerId", + "models" + ], + "x-side": "agent", + "x-method": "_goose/unstable/providers/supported-models/list" + }, "ProviderCatalogListRequest_unstable": { "type": "object", "properties": { @@ -2640,6 +2717,15 @@ "description": "Params for _goose/unstable/session/working-dir/update", "title": "UpdateWorkingDirRequest_unstable" }, + { + "allOf": [ + { + "$ref": "#/$defs/SetSessionSystemPromptRequest_unstable" + } + ], + "description": "Params for _goose/unstable/session/system-prompt/set", + "title": "SetSessionSystemPromptRequest_unstable" + }, { "allOf": [ { @@ -2703,6 +2789,15 @@ "description": "Params for _goose/unstable/providers/list", "title": "ListProvidersRequest_unstable" }, + { + "allOf": [ + { + "$ref": "#/$defs/ProviderSupportedModelsListRequest_unstable" + } + ], + "description": "Params for _goose/unstable/providers/supported-models/list", + "title": "ProviderSupportedModelsListRequest_unstable" + }, { "allOf": [ { @@ -3167,6 +3262,14 @@ ], "title": "ListProvidersResponse_unstable" }, + { + "allOf": [ + { + "$ref": "#/$defs/ProviderSupportedModelsListResponse_unstable" + } + ], + "title": "ProviderSupportedModelsListResponse_unstable" + }, { "allOf": [ { diff --git a/crates/goose/src/acp/provider.rs b/crates/goose/src/acp/provider.rs index a2bf2ca45b96..de4c214fd073 100644 --- a/crates/goose/src/acp/provider.rs +++ b/crates/goose/src/acp/provider.rs @@ -20,7 +20,7 @@ use std::future::Future; use std::path::PathBuf; use std::process::Stdio; use std::sync::{ - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicU64, Ordering}, Arc, Mutex, }; use std::thread::JoinHandle; @@ -144,6 +144,11 @@ pub struct AcpProvider { Arc>>>, pending_tool_updates: Arc>>, handoff_context_sent: AtomicBool, + /// Latest `size` reported by the ACP server in a `session/update` → + /// `usage_update` notification. 0 means no real update has arrived yet, + /// in which case `get_model_config()` falls back to the static model + /// configuration's context limit. + context_size: Arc, tx: Option>, loop_thread: Option>, @@ -222,10 +227,12 @@ impl AcpProvider { let goose_mode_shared = Arc::new(Mutex::new(goose_mode)); let pending_tool_updates: Arc>> = Arc::new(Mutex::new(HashMap::new())); + let context_size = Arc::new(AtomicU64::new(0)); let client_loop = AcpClientLoop::new( config, goose_mode_shared.clone(), pending_tool_updates.clone(), + context_size.clone(), ); let loop_thread = spawn_client_loop(run(client_loop, rx, init_tx)); @@ -273,6 +280,7 @@ impl AcpProvider { pending_confirmations: Arc::new(TokioMutex::new(HashMap::new())), pending_tool_updates, handoff_context_sent: AtomicBool::new(false), + context_size, tx: Some(tx), loop_thread: Some(loop_thread), }) @@ -370,7 +378,12 @@ impl Provider for AcpProvider { } fn get_model_config(&self) -> ModelConfig { - self.model.clone() + let mut model = self.model.clone(); + let size = self.context_size.load(Ordering::Relaxed); + if size > 0 { + model.context_limit = Some(size as usize); + } + model } async fn update_mode(&self, session_id: &str, mode: GooseMode) -> Result<(), ProviderError> { @@ -629,6 +642,7 @@ struct AcpClientLoop { goose_mode: Arc>, prompt_response_tx: Arc>>>, pending_tool_updates: Arc>>, + context_size: Arc, } impl AcpClientLoop { @@ -636,12 +650,14 @@ impl AcpClientLoop { config: AcpProviderConfig, goose_mode: Arc>, pending_tool_updates: Arc>>, + context_size: Arc, ) -> Self { Self { config, goose_mode, prompt_response_tx: Arc::new(Mutex::new(None)), pending_tool_updates, + context_size, } } @@ -695,6 +711,7 @@ impl AcpClientLoop { goose_mode, prompt_response_tx, pending_tool_updates, + context_size, } = self; let notification_callback = config.notification_callback.clone(); let reverse_modes = reverse_mode_mapping(&config.mode_mapping); @@ -707,6 +724,7 @@ impl AcpClientLoop { let reverse_modes = reverse_modes.clone(); let goose_mode = goose_mode.clone(); let pending_tool_updates = pending_tool_updates.clone(); + let context_size = context_size.clone(); async move |notification: SessionNotification, _cx| { if let Some(ref cb) = notification_callback { cb(notification.clone()); @@ -740,6 +758,9 @@ impl AcpClientLoop { } } } + SessionUpdate::UsageUpdate(usage) => { + context_size.store(usage.size, Ordering::Relaxed); + } _ => {} } if let Some(tx) = prompt_response_tx @@ -1529,6 +1550,7 @@ mod tests { pending_confirmations: Arc::new(TokioMutex::new(HashMap::new())), pending_tool_updates: Arc::new(Mutex::new(HashMap::new())), handoff_context_sent: AtomicBool::new(false), + context_size: Arc::new(AtomicU64::new(0)), tx, loop_thread: None, } @@ -1633,6 +1655,18 @@ mod tests { assert!(!later_claim.include_context); } + #[test] + fn get_model_config_surfaces_captured_context_size() { + let provider = test_provider(); + assert_eq!( + provider.get_model_config().context_limit(), + crate::model::DEFAULT_CONTEXT_LIMIT + ); + + provider.context_size.store(200_000, Ordering::Relaxed); + assert_eq!(provider.get_model_config().context_limit(), 200_000); + } + #[tokio::test] async fn failed_first_prompt_send_rolls_back_handoff_context_claim() { let (tx, rx) = mpsc::channel(1); diff --git a/crates/goose/src/acp/server/custom_dispatch.rs b/crates/goose/src/acp/server/custom_dispatch.rs index 9415aba2242a..81c6e67107e1 100644 --- a/crates/goose/src/acp/server/custom_dispatch.rs +++ b/crates/goose/src/acp/server/custom_dispatch.rs @@ -59,6 +59,14 @@ impl GooseAcpAgent { self.on_update_working_dir(req).await } + #[custom_method(SetSessionSystemPromptRequest)] + async fn dispatch_set_session_system_prompt( + &self, + req: SetSessionSystemPromptRequest, + ) -> Result { + self.on_set_session_system_prompt(req).await + } + #[custom_method(DeleteSessionRequest)] async fn dispatch_delete_session( &self, @@ -114,6 +122,14 @@ impl GooseAcpAgent { self.on_list_providers(req).await } + #[custom_method(ProviderSupportedModelsListRequest)] + async fn dispatch_list_provider_supported_models( + &self, + req: ProviderSupportedModelsListRequest, + ) -> Result { + self.on_list_provider_supported_models(req).await + } + #[custom_method(ProviderCatalogListRequest)] async fn dispatch_list_provider_catalog( &self, diff --git a/crates/goose/src/acp/server/providers.rs b/crates/goose/src/acp/server/providers.rs index 6a1870be96e4..2916ccf48bb1 100644 --- a/crates/goose/src/acp/server/providers.rs +++ b/crates/goose/src/acp/server/providers.rs @@ -438,6 +438,30 @@ impl GooseAcpAgent { }) } + pub(super) async fn on_list_provider_supported_models( + &self, + req: ProviderSupportedModelsListRequest, + ) -> Result { + let entry = crate::providers::get_from_registry(&req.provider_id) + .await + .invalid_params_err_ctx("Unknown provider")?; + let model_config = crate::model::ModelConfig::new(&entry.metadata().default_model) + .invalid_params_err_ctx("Invalid default model")?; + let provider = self + .create_provider(&req.provider_id, model_config, Vec::new(), None) + .await + .internal_err_ctx("Failed to initialize provider")?; + let models = provider + .fetch_supported_models() + .await + .internal_err_ctx("Failed to fetch provider supported models")?; + + Ok(ProviderSupportedModelsListResponse { + provider_id: req.provider_id, + models, + }) + } + pub(super) async fn on_list_provider_catalog( &self, req: ProviderCatalogListRequest, diff --git a/crates/goose/src/acp/server/sessions.rs b/crates/goose/src/acp/server/sessions.rs index 02cb742edec3..e46a5e75b35d 100644 --- a/crates/goose/src/acp/server/sessions.rs +++ b/crates/goose/src/acp/server/sessions.rs @@ -34,6 +34,47 @@ impl GooseAcpAgent { Ok(EmptyResponse {}) } + pub(super) async fn on_set_session_system_prompt( + &self, + req: SetSessionSystemPromptRequest, + ) -> Result { + let session_id = req.session_id.trim(); + if session_id.is_empty() { + return Err( + agent_client_protocol::Error::invalid_params().data("sessionId cannot be empty") + ); + } + + let agent = self.get_session_agent_provider_ready(session_id).await?; + match req.mode { + SessionSystemPromptMode::Set => { + if req.text.trim().is_empty() { + agent.clear_system_prompt_override().await; + } else { + agent.override_system_prompt(req.text).await; + } + } + SessionSystemPromptMode::Append => { + let key = req + .key + .as_deref() + .map(str::trim) + .filter(|key| !key.is_empty()) + .ok_or_else(|| { + agent_client_protocol::Error::invalid_params() + .data("key cannot be empty for append mode") + })?; + if req.text.trim().is_empty() { + agent.remove_system_prompt_extra(key).await; + } else { + agent.extend_system_prompt(key.to_string(), req.text).await; + } + } + } + + Ok(EmptyResponse {}) + } + pub(super) async fn on_delete_session( &self, req: DeleteSessionRequest, diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index 3ac741e62347..7456ae0afced 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -66,8 +66,7 @@ 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."; +const DEFAULT_FRONTEND_INSTRUCTIONS: &str = "The following tools are provided directly by the frontend and will be executed by the frontend when called."; #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum ToolCategory { @@ -2293,6 +2292,11 @@ impl Agent { prompt_manager.add_system_prompt_extra(key, instruction); } + pub async fn remove_system_prompt_extra(&self, key: &str) { + let mut prompt_manager = self.prompt_manager.lock().await; + prompt_manager.remove_system_prompt_extra(key); + } + pub async fn set_goal(&self, goal: Option) { *self.goal.lock().await = goal; } @@ -2463,6 +2467,11 @@ impl Agent { prompt_manager.set_system_prompt_override(template); } + pub async fn clear_system_prompt_override(&self) { + let mut prompt_manager = self.prompt_manager.lock().await; + prompt_manager.clear_system_prompt_override(); + } + pub async fn list_extension_prompts(&self, session_id: &str) -> HashMap> { self.extension_manager .list_prompts(session_id, CancellationToken::default()) diff --git a/crates/goose/src/agents/prompt_manager.rs b/crates/goose/src/agents/prompt_manager.rs index 6178b1734f9b..09b03212a8fa 100644 --- a/crates/goose/src/agents/prompt_manager.rs +++ b/crates/goose/src/agents/prompt_manager.rs @@ -224,6 +224,10 @@ impl PromptManager { self.system_prompt_extras.insert(key, instruction); } + pub fn remove_system_prompt_extra(&mut self, key: &str) { + self.system_prompt_extras.shift_remove(key); + } + pub fn record_tool_arguments( &mut self, arguments: &Option>, @@ -247,6 +251,10 @@ impl PromptManager { self.system_prompt_override = Some(template); } + pub fn clear_system_prompt_override(&mut self) { + self.system_prompt_override = None; + } + pub fn builder<'a>(&'a self) -> SystemPromptBuilder<'a, Self> { SystemPromptBuilder { manager: self, @@ -326,6 +334,29 @@ mod tests { assert!(result.contains("Thirdinstruction")); } + #[test] + fn test_remove_system_prompt_extra() { + let mut manager = PromptManager::new(); + manager.add_system_prompt_extra("agent".to_string(), "Agent instruction".to_string()); + manager.add_system_prompt_extra("project".to_string(), "Project instruction".to_string()); + + manager.remove_system_prompt_extra("agent"); + let result = manager.builder().build(); + + assert!(!result.contains("Agent instruction")); + assert!(result.contains("Project instruction")); + } + + #[test] + fn test_clear_system_prompt_override() { + let mut manager = PromptManager::new(); + manager.set_system_prompt_override("Replacement prompt".to_string()); + assert!(manager.builder().build().contains("Replacement prompt")); + + manager.clear_system_prompt_override(); + assert!(!manager.builder().build().contains("Replacement prompt")); + } + #[test] fn test_build_system_prompt_preserves_legitimate_unicode_in_extras() { let mut manager = PromptManager::new(); diff --git a/crates/goose/tests/acp_custom_requests_test.rs b/crates/goose/tests/acp_custom_requests_test.rs index 03e25ebc29c4..24e237e49606 100644 --- a/crates/goose/tests/acp_custom_requests_test.rs +++ b/crates/goose/tests/acp_custom_requests_test.rs @@ -21,6 +21,7 @@ struct MockProvider { name: String, model_config: ModelConfig, recommended_models: Vec, + supported_models: Vec, } #[async_trait::async_trait] @@ -47,6 +48,10 @@ impl Provider for MockProvider { async fn fetch_recommended_models(&self) -> Result, ProviderError> { Ok(self.recommended_models.clone()) } + + async fn fetch_supported_models(&self) -> Result, ProviderError> { + Ok(self.supported_models.clone()) + } } fn mock_provider_factory() -> AcpProviderFactory { @@ -62,6 +67,7 @@ fn mock_provider_factory() -> AcpProviderFactory { Ok(Arc::new(MockProvider { name: provider_name, model_config, + supported_models: recommended_models.clone(), recommended_models, }) as Arc) }) @@ -133,6 +139,7 @@ fn test_new_session_passes_cwd_to_provider_factory() { name: provider_name, model_config, recommended_models: Vec::new(), + supported_models: Vec::new(), }) as Arc) }) }, @@ -180,6 +187,7 @@ fn test_load_session_passes_load_cwd_to_provider_factory() { name: provider_name, model_config, recommended_models: Vec::new(), + supported_models: Vec::new(), }) as Arc) }) }, @@ -673,3 +681,52 @@ fn test_developer_fs_requests_use_acp_session_id() { ); }); } + +#[test] +fn test_custom_provider_supported_models_lists_raw_provider_models() { + run_test(async move { + let openai = OpenAiFixture::new(vec![], Arc::new(EnforceSessionId::default())).await; + let provider_factory: AcpProviderFactory = + Arc::new(|provider_name, model_config, _extensions, _working_dir| { + Box::pin(async move { + Ok(Arc::new(MockProvider { + name: provider_name, + model_config, + recommended_models: vec!["canonical-filtered-model".to_string()], + supported_models: vec![ + "goose-claude-opus-4-8".to_string(), + "raw-databricks-endpoint".to_string(), + ], + }) as Arc) + }) + }); + let conn = AcpServerConnection::new( + TestConnectionConfig { + provider_factory: Some(provider_factory), + ..Default::default() + }, + openai, + ) + .await; + + let response = send_custom( + conn.cx(), + "_goose/unstable/providers/supported-models/list", + serde_json::json!({ "providerId": "openai" }), + ) + .await + .expect("provider supported models list should succeed"); + + assert_eq!( + response.get("providerId"), + Some(&serde_json::json!("openai")) + ); + assert_eq!( + response.get("models"), + Some(&serde_json::json!([ + "goose-claude-opus-4-8", + "raw-databricks-endpoint" + ])) + ); + }); +} diff --git a/ui/sdk/src/generated/client.gen.ts b/ui/sdk/src/generated/client.gen.ts index 2bc08d2fea88..22beacb47533 100644 --- a/ui/sdk/src/generated/client.gen.ts +++ b/ui/sdk/src/generated/client.gen.ts @@ -82,6 +82,8 @@ import type { ProviderConfigStatusResponse_unstable, ProviderSetupCatalogListRequest_unstable, ProviderSetupCatalogListResponse_unstable, + ProviderSupportedModelsListRequest_unstable, + ProviderSupportedModelsListResponse_unstable, ReadResourceRequest_unstable, ReadResourceResponse_unstable, RefreshProviderInventoryRequest_unstable, @@ -89,6 +91,7 @@ import type { RemoveConfigExtensionRequest_unstable, RemoveExtensionRequest_unstable, RenameSessionRequest_unstable, + SetSessionSystemPromptRequest_unstable, ToggleConfigExtensionRequest_unstable, UnarchiveSessionRequest_unstable, UpdateSessionProjectRequest_unstable, @@ -126,6 +129,7 @@ import { zProviderConfigReadResponse_unstable, zProviderConfigStatusResponse_unstable, zProviderSetupCatalogListResponse_unstable, + zProviderSupportedModelsListResponse_unstable, zReadResourceResponse_unstable, zRefreshProviderInventoryResponse_unstable, zUpdateSourceResponse_unstable, @@ -186,6 +190,15 @@ export class GooseExtClient { ); } + async sessionSystemPromptSet_unstable( + params: SetSessionSystemPromptRequest_unstable, + ): Promise { + await this.conn.extMethod( + "_goose/unstable/session/system-prompt/set", + params, + ); + } + async sessionDelete(params: DeleteSessionRequest): Promise { await this.conn.extMethod("session/delete", params); } @@ -250,6 +263,18 @@ export class GooseExtClient { ) as ListProvidersResponse_unstable; } + async providersSupportedModelsList_unstable( + params: ProviderSupportedModelsListRequest_unstable, + ): Promise { + const raw = await this.conn.extMethod( + "_goose/unstable/providers/supported-models/list", + params, + ); + return zProviderSupportedModelsListResponse_unstable.parse( + raw, + ) as ProviderSupportedModelsListResponse_unstable; + } + async providersCatalogList_unstable( params: ProviderCatalogListRequest_unstable, ): Promise { diff --git a/ui/sdk/src/generated/index.ts b/ui/sdk/src/generated/index.ts index 701b2dd98bc5..85a63bc04964 100644 --- a/ui/sdk/src/generated/index.ts +++ b/ui/sdk/src/generated/index.ts @@ -1,6 +1,6 @@ // This file is auto-generated by @hey-api/openapi-ts -export type { AddConfigExtensionRequest_unstable, AddExtensionRequest_unstable, ArchiveSessionRequest_unstable, CreateSourceRequest_unstable, CreateSourceResponse_unstable, CustomProviderConfigDto, CustomProviderCreateRequest_unstable, CustomProviderCreateResponse_unstable, CustomProviderDeleteRequest_unstable, CustomProviderDeleteResponse_unstable, CustomProviderReadRequest_unstable, CustomProviderReadResponse_unstable, CustomProviderUpdateRequest_unstable, CustomProviderUpdateResponse_unstable, DefaultsReadRequest_unstable, DefaultsReadResponse_unstable, DefaultsSaveRequest_unstable, DeleteSessionRequest, DeleteSourceRequest_unstable, DictationConfigRequest_unstable, DictationConfigResponse_unstable, DictationDownloadProgress, DictationLocalModelStatus, DictationModelCancelRequest_unstable, DictationModelDeleteRequest_unstable, DictationModelDownloadProgressRequest_unstable, DictationModelDownloadProgressResponse_unstable, DictationModelDownloadRequest_unstable, DictationModelOption, DictationModelSelectRequest_unstable, DictationModelsListRequest_unstable, DictationModelsListResponse_unstable, DictationProviderStatusEntry, DictationSecretDeleteRequest_unstable, DictationSecretSaveRequest_unstable, DictationTranscribeRequest_unstable, DictationTranscribeResponse_unstable, EmptyResponse, ExportSessionRequest_unstable, ExportSessionResponse_unstable, ExportSourceRequest_unstable, ExportSourceResponse_unstable, ExtRequest, ExtResponse, GetExtensionsRequest_unstable, GetExtensionsResponse_unstable, GetSessionExtensionsRequest_unstable, GetSessionExtensionsResponse_unstable, GetToolsRequest_unstable, GetToolsResponse_unstable, GooseToolCallRequest_unstable, GooseToolCallResponse_unstable, ImportSessionRequest_unstable, ImportSessionResponse_unstable, ImportSourcesRequest_unstable, ImportSourcesResponse_unstable, ListProvidersRequest_unstable, ListProvidersResponse_unstable, ListSourcesRequest_unstable, ListSourcesResponse_unstable, OnboardingImportApplyRequest_unstable, OnboardingImportApplyResponse_unstable, OnboardingImportCandidate, OnboardingImportCounts, OnboardingImportScanRequest_unstable, OnboardingImportScanResponse_unstable, OnboardingImportSourceKind, PreferenceKey, PreferencesReadRequest_unstable, PreferencesReadResponse_unstable, PreferencesRemoveRequest_unstable, PreferencesSaveRequest_unstable, PreferenceValue, ProviderCatalogListRequest_unstable, ProviderCatalogListResponse_unstable, ProviderCatalogTemplateRequest_unstable, ProviderCatalogTemplateResponse_unstable, ProviderConfigAuthenticateRequest_unstable, ProviderConfigChangeResponse_unstable, ProviderConfigDeleteRequest_unstable, ProviderConfigFieldUpdate, ProviderConfigFieldValueDto, ProviderConfigKey, ProviderConfigReadRequest_unstable, ProviderConfigReadResponse_unstable, ProviderConfigSaveRequest_unstable, ProviderConfigStatusDto, ProviderConfigStatusRequest_unstable, ProviderConfigStatusResponse_unstable, ProviderInventoryEntryDto, ProviderInventoryModelDto, ProviderSetupCatalogEntryDto, ProviderSetupCatalogListRequest_unstable, ProviderSetupCatalogListResponse_unstable, ProviderSetupCategoryDto, ProviderSetupFieldDto, ProviderSetupGroupDto, ProviderSetupMethodDto, ProviderTemplateCapabilitiesDto, ProviderTemplateCatalogEntryDto, ProviderTemplateDto, ProviderTemplateModelDto, ReadResourceRequest_unstable, ReadResourceResponse_unstable, RefreshProviderInventoryRequest_unstable, RefreshProviderInventoryResponse_unstable, RefreshProviderInventorySkipDto, RefreshProviderInventorySkipReasonDto, RemoveConfigExtensionRequest_unstable, RemoveExtensionRequest_unstable, RenameSessionRequest_unstable, SourceEntry, SourceScope, SourceType, ToggleConfigExtensionRequest_unstable, UnarchiveSessionRequest_unstable, UpdateSessionProjectRequest_unstable, UpdateSourceRequest_unstable, UpdateSourceResponse_unstable, UpdateWorkingDirRequest_unstable } from './types.gen.js'; +export type { AddConfigExtensionRequest_unstable, AddExtensionRequest_unstable, ArchiveSessionRequest_unstable, CreateSourceRequest_unstable, CreateSourceResponse_unstable, CustomProviderConfigDto, CustomProviderCreateRequest_unstable, CustomProviderCreateResponse_unstable, CustomProviderDeleteRequest_unstable, CustomProviderDeleteResponse_unstable, CustomProviderReadRequest_unstable, CustomProviderReadResponse_unstable, CustomProviderUpdateRequest_unstable, CustomProviderUpdateResponse_unstable, DefaultsReadRequest_unstable, DefaultsReadResponse_unstable, DefaultsSaveRequest_unstable, DeleteSessionRequest, DeleteSourceRequest_unstable, DictationConfigRequest_unstable, DictationConfigResponse_unstable, DictationDownloadProgress, DictationLocalModelStatus, DictationModelCancelRequest_unstable, DictationModelDeleteRequest_unstable, DictationModelDownloadProgressRequest_unstable, DictationModelDownloadProgressResponse_unstable, DictationModelDownloadRequest_unstable, DictationModelOption, DictationModelSelectRequest_unstable, DictationModelsListRequest_unstable, DictationModelsListResponse_unstable, DictationProviderStatusEntry, DictationSecretDeleteRequest_unstable, DictationSecretSaveRequest_unstable, DictationTranscribeRequest_unstable, DictationTranscribeResponse_unstable, EmptyResponse, ExportSessionRequest_unstable, ExportSessionResponse_unstable, ExportSourceRequest_unstable, ExportSourceResponse_unstable, ExtRequest, ExtResponse, GetExtensionsRequest_unstable, GetExtensionsResponse_unstable, GetSessionExtensionsRequest_unstable, GetSessionExtensionsResponse_unstable, GetToolsRequest_unstable, GetToolsResponse_unstable, GooseToolCallRequest_unstable, GooseToolCallResponse_unstable, ImportSessionRequest_unstable, ImportSessionResponse_unstable, ImportSourcesRequest_unstable, ImportSourcesResponse_unstable, ListProvidersRequest_unstable, ListProvidersResponse_unstable, ListSourcesRequest_unstable, ListSourcesResponse_unstable, OnboardingImportApplyRequest_unstable, OnboardingImportApplyResponse_unstable, OnboardingImportCandidate, OnboardingImportCounts, OnboardingImportScanRequest_unstable, OnboardingImportScanResponse_unstable, OnboardingImportSourceKind, PreferenceKey, PreferencesReadRequest_unstable, PreferencesReadResponse_unstable, PreferencesRemoveRequest_unstable, PreferencesSaveRequest_unstable, PreferenceValue, ProviderCatalogListRequest_unstable, ProviderCatalogListResponse_unstable, ProviderCatalogTemplateRequest_unstable, ProviderCatalogTemplateResponse_unstable, ProviderConfigAuthenticateRequest_unstable, ProviderConfigChangeResponse_unstable, ProviderConfigDeleteRequest_unstable, ProviderConfigFieldUpdate, ProviderConfigFieldValueDto, ProviderConfigKey, ProviderConfigReadRequest_unstable, ProviderConfigReadResponse_unstable, ProviderConfigSaveRequest_unstable, ProviderConfigStatusDto, ProviderConfigStatusRequest_unstable, ProviderConfigStatusResponse_unstable, ProviderInventoryEntryDto, ProviderInventoryModelDto, ProviderSetupCatalogEntryDto, ProviderSetupCatalogListRequest_unstable, ProviderSetupCatalogListResponse_unstable, ProviderSetupCategoryDto, ProviderSetupFieldDto, ProviderSetupGroupDto, ProviderSetupMethodDto, ProviderSupportedModelsListRequest_unstable, ProviderSupportedModelsListResponse_unstable, ProviderTemplateCapabilitiesDto, ProviderTemplateCatalogEntryDto, ProviderTemplateDto, ProviderTemplateModelDto, ReadResourceRequest_unstable, ReadResourceResponse_unstable, RefreshProviderInventoryRequest_unstable, RefreshProviderInventoryResponse_unstable, RefreshProviderInventorySkipDto, RefreshProviderInventorySkipReasonDto, RemoveConfigExtensionRequest_unstable, RemoveExtensionRequest_unstable, RenameSessionRequest_unstable, SessionSystemPromptMode, SetSessionSystemPromptRequest_unstable, SourceEntry, SourceScope, SourceType, ToggleConfigExtensionRequest_unstable, UnarchiveSessionRequest_unstable, UpdateSessionProjectRequest_unstable, UpdateSourceRequest_unstable, UpdateSourceResponse_unstable, UpdateWorkingDirRequest_unstable } from './types.gen.js'; export const GOOSE_EXT_METHODS = [ { @@ -33,6 +33,11 @@ export const GOOSE_EXT_METHODS = [ requestType: "UpdateWorkingDirRequest_unstable", responseType: "EmptyResponse", }, + { + method: "_goose/unstable/session/system-prompt/set", + requestType: "SetSessionSystemPromptRequest_unstable", + responseType: "EmptyResponse", + }, { method: "session/delete", requestType: "DeleteSessionRequest", @@ -68,6 +73,11 @@ export const GOOSE_EXT_METHODS = [ requestType: "ListProvidersRequest_unstable", responseType: "ListProvidersResponse_unstable", }, + { + method: "_goose/unstable/providers/supported-models/list", + requestType: "ProviderSupportedModelsListRequest_unstable", + responseType: "ProviderSupportedModelsListResponse_unstable", + }, { method: "_goose/unstable/providers/catalog/list", requestType: "ProviderCatalogListRequest_unstable", diff --git a/ui/sdk/src/generated/types.gen.ts b/ui/sdk/src/generated/types.gen.ts index e75ad7919bbb..410f74ada5be 100644 --- a/ui/sdk/src/generated/types.gen.ts +++ b/ui/sdk/src/generated/types.gen.ts @@ -90,6 +90,25 @@ export type UpdateWorkingDirRequest_unstable = { workingDir: string; }; +/** + * Set, append, or clear system prompt text for a session. + * + * `mode: "set"` replaces Goose's base system prompt. `mode: "append"` adds an + * instruction under "Additional Instructions". Reusing a key replaces the + * previous value for that mode/key; sending empty text clears it. + */ +export type SetSessionSystemPromptRequest_unstable = { + sessionId: string; + mode?: SessionSystemPromptMode; + key?: string | null; + text: string; +}; + +/** + * How a session system prompt update should be applied. + */ +export type SessionSystemPromptMode = 'set' | 'append'; + /** * Delete a session. */ @@ -285,6 +304,18 @@ export type ProviderInventoryModelDto = { recommended?: boolean; }; +/** + * List the raw model identifiers returned by a provider's live supported-models API. + */ +export type ProviderSupportedModelsListRequest_unstable = { + providerId: string; +}; + +export type ProviderSupportedModelsListResponse_unstable = { + providerId: string; + models: Array; +}; + /** * List custom-provider catalog entries. Omit `format` to list all formats. */ @@ -1059,14 +1090,14 @@ export type DictationModelSelectRequest_unstable = { export type ExtRequest = { id: string; method: string; - params?: AddExtensionRequest_unstable | RemoveExtensionRequest_unstable | GetToolsRequest_unstable | GooseToolCallRequest_unstable | ReadResourceRequest_unstable | UpdateWorkingDirRequest_unstable | DeleteSessionRequest | GetExtensionsRequest_unstable | AddConfigExtensionRequest_unstable | RemoveConfigExtensionRequest_unstable | ToggleConfigExtensionRequest_unstable | GetSessionExtensionsRequest_unstable | ListProvidersRequest_unstable | ProviderCatalogListRequest_unstable | ProviderSetupCatalogListRequest_unstable | ProviderCatalogTemplateRequest_unstable | CustomProviderCreateRequest_unstable | CustomProviderReadRequest_unstable | CustomProviderUpdateRequest_unstable | CustomProviderDeleteRequest_unstable | RefreshProviderInventoryRequest_unstable | ProviderConfigReadRequest_unstable | ProviderConfigStatusRequest_unstable | ProviderConfigSaveRequest_unstable | ProviderConfigDeleteRequest_unstable | ProviderConfigAuthenticateRequest_unstable | PreferencesReadRequest_unstable | PreferencesSaveRequest_unstable | PreferencesRemoveRequest_unstable | DefaultsReadRequest_unstable | DefaultsSaveRequest_unstable | OnboardingImportScanRequest_unstable | OnboardingImportApplyRequest_unstable | ExportSessionRequest_unstable | ImportSessionRequest_unstable | UpdateSessionProjectRequest_unstable | RenameSessionRequest_unstable | ArchiveSessionRequest_unstable | UnarchiveSessionRequest_unstable | CreateSourceRequest_unstable | ListSourcesRequest_unstable | UpdateSourceRequest_unstable | DeleteSourceRequest_unstable | ExportSourceRequest_unstable | ImportSourcesRequest_unstable | DictationTranscribeRequest_unstable | DictationConfigRequest_unstable | DictationSecretSaveRequest_unstable | DictationSecretDeleteRequest_unstable | DictationModelsListRequest_unstable | DictationModelDownloadRequest_unstable | DictationModelDownloadProgressRequest_unstable | DictationModelCancelRequest_unstable | DictationModelDeleteRequest_unstable | DictationModelSelectRequest_unstable | { + params?: AddExtensionRequest_unstable | RemoveExtensionRequest_unstable | GetToolsRequest_unstable | GooseToolCallRequest_unstable | ReadResourceRequest_unstable | UpdateWorkingDirRequest_unstable | SetSessionSystemPromptRequest_unstable | DeleteSessionRequest | GetExtensionsRequest_unstable | AddConfigExtensionRequest_unstable | RemoveConfigExtensionRequest_unstable | ToggleConfigExtensionRequest_unstable | GetSessionExtensionsRequest_unstable | ListProvidersRequest_unstable | ProviderSupportedModelsListRequest_unstable | ProviderCatalogListRequest_unstable | ProviderSetupCatalogListRequest_unstable | ProviderCatalogTemplateRequest_unstable | CustomProviderCreateRequest_unstable | CustomProviderReadRequest_unstable | CustomProviderUpdateRequest_unstable | CustomProviderDeleteRequest_unstable | RefreshProviderInventoryRequest_unstable | ProviderConfigReadRequest_unstable | ProviderConfigStatusRequest_unstable | ProviderConfigSaveRequest_unstable | ProviderConfigDeleteRequest_unstable | ProviderConfigAuthenticateRequest_unstable | PreferencesReadRequest_unstable | PreferencesSaveRequest_unstable | PreferencesRemoveRequest_unstable | DefaultsReadRequest_unstable | DefaultsSaveRequest_unstable | OnboardingImportScanRequest_unstable | OnboardingImportApplyRequest_unstable | ExportSessionRequest_unstable | ImportSessionRequest_unstable | UpdateSessionProjectRequest_unstable | RenameSessionRequest_unstable | ArchiveSessionRequest_unstable | UnarchiveSessionRequest_unstable | CreateSourceRequest_unstable | ListSourcesRequest_unstable | UpdateSourceRequest_unstable | DeleteSourceRequest_unstable | ExportSourceRequest_unstable | ImportSourcesRequest_unstable | DictationTranscribeRequest_unstable | DictationConfigRequest_unstable | DictationSecretSaveRequest_unstable | DictationSecretDeleteRequest_unstable | DictationModelsListRequest_unstable | DictationModelDownloadRequest_unstable | DictationModelDownloadProgressRequest_unstable | DictationModelCancelRequest_unstable | DictationModelDeleteRequest_unstable | DictationModelSelectRequest_unstable | { [key: string]: unknown; } | null; }; export type ExtResponse = { id: string; - result?: EmptyResponse | GetToolsResponse_unstable | GooseToolCallResponse_unstable | ReadResourceResponse_unstable | GetExtensionsResponse_unstable | GetSessionExtensionsResponse_unstable | ListProvidersResponse_unstable | ProviderCatalogListResponse_unstable | ProviderSetupCatalogListResponse_unstable | ProviderCatalogTemplateResponse_unstable | CustomProviderCreateResponse_unstable | CustomProviderReadResponse_unstable | CustomProviderUpdateResponse_unstable | CustomProviderDeleteResponse_unstable | RefreshProviderInventoryResponse_unstable | ProviderConfigReadResponse_unstable | ProviderConfigStatusResponse_unstable | ProviderConfigChangeResponse_unstable | PreferencesReadResponse_unstable | DefaultsReadResponse_unstable | OnboardingImportScanResponse_unstable | OnboardingImportApplyResponse_unstable | ExportSessionResponse_unstable | ImportSessionResponse_unstable | CreateSourceResponse_unstable | ListSourcesResponse_unstable | UpdateSourceResponse_unstable | ExportSourceResponse_unstable | ImportSourcesResponse_unstable | DictationTranscribeResponse_unstable | DictationConfigResponse_unstable | DictationModelsListResponse_unstable | DictationModelDownloadProgressResponse_unstable | unknown; + result?: EmptyResponse | GetToolsResponse_unstable | GooseToolCallResponse_unstable | ReadResourceResponse_unstable | GetExtensionsResponse_unstable | GetSessionExtensionsResponse_unstable | ListProvidersResponse_unstable | ProviderSupportedModelsListResponse_unstable | ProviderCatalogListResponse_unstable | ProviderSetupCatalogListResponse_unstable | ProviderCatalogTemplateResponse_unstable | CustomProviderCreateResponse_unstable | CustomProviderReadResponse_unstable | CustomProviderUpdateResponse_unstable | CustomProviderDeleteResponse_unstable | RefreshProviderInventoryResponse_unstable | ProviderConfigReadResponse_unstable | ProviderConfigStatusResponse_unstable | ProviderConfigChangeResponse_unstable | PreferencesReadResponse_unstable | DefaultsReadResponse_unstable | OnboardingImportScanResponse_unstable | OnboardingImportApplyResponse_unstable | ExportSessionResponse_unstable | ImportSessionResponse_unstable | CreateSourceResponse_unstable | ListSourcesResponse_unstable | UpdateSourceResponse_unstable | ExportSourceResponse_unstable | ImportSourcesResponse_unstable | DictationTranscribeResponse_unstable | DictationConfigResponse_unstable | DictationModelsListResponse_unstable | DictationModelDownloadProgressResponse_unstable | unknown; } | { error: { code: number; diff --git a/ui/sdk/src/generated/zod.gen.ts b/ui/sdk/src/generated/zod.gen.ts index 300e478d7533..efebe29bc0d9 100644 --- a/ui/sdk/src/generated/zod.gen.ts +++ b/ui/sdk/src/generated/zod.gen.ts @@ -80,6 +80,31 @@ export const zUpdateWorkingDirRequest_unstable = z.object({ workingDir: z.string() }); +/** + * How a session system prompt update should be applied. + */ +export const zSessionSystemPromptMode = z.union([ + z.literal('set'), + z.literal('append') +]); + +/** + * Set, append, or clear system prompt text for a session. + * + * `mode: "set"` replaces Goose's base system prompt. `mode: "append"` adds an + * instruction under "Additional Instructions". Reusing a key replaces the + * previous value for that mode/key; sending empty text clears it. + */ +export const zSetSessionSystemPromptRequest_unstable = z.object({ + sessionId: z.string(), + mode: zSessionSystemPromptMode.optional().default('append'), + key: z.union([ + z.string(), + z.null() + ]).optional(), + text: z.string() +}); + /** * Delete a session. */ @@ -217,6 +242,18 @@ export const zListProvidersResponse_unstable = z.object({ entries: z.array(zProviderInventoryEntryDto) }); +/** + * List the raw model identifiers returned by a provider's live supported-models API. + */ +export const zProviderSupportedModelsListRequest_unstable = z.object({ + providerId: z.string() +}); + +export const zProviderSupportedModelsListResponse_unstable = z.object({ + providerId: z.string(), + models: z.array(z.string()) +}); + /** * List custom-provider catalog entries. Omit `format` to list all formats. */ @@ -1062,6 +1099,7 @@ export const zExtRequest = z.object({ zGooseToolCallRequest_unstable, zReadResourceRequest_unstable, zUpdateWorkingDirRequest_unstable, + zSetSessionSystemPromptRequest_unstable, zDeleteSessionRequest, zGetExtensionsRequest_unstable, zAddConfigExtensionRequest_unstable, @@ -1069,6 +1107,7 @@ export const zExtRequest = z.object({ zToggleConfigExtensionRequest_unstable, zGetSessionExtensionsRequest_unstable, zListProvidersRequest_unstable, + zProviderSupportedModelsListRequest_unstable, zProviderCatalogListRequest_unstable, zProviderSetupCatalogListRequest_unstable, zProviderCatalogTemplateRequest_unstable, @@ -1131,6 +1170,7 @@ export const zExtResponse = z.union([ zGetExtensionsResponse_unstable, zGetSessionExtensionsResponse_unstable, zListProvidersResponse_unstable, + zProviderSupportedModelsListResponse_unstable, zProviderCatalogListResponse_unstable, zProviderSetupCatalogListResponse_unstable, zProviderCatalogTemplateResponse_unstable,