Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
This commit is contained in:
Josh Soref
2026-02-11 09:35:24 -05:00
committed by GitHub
parent 544bc1bc4f
commit f636a97faa
81 changed files with 109 additions and 110 deletions
+2 -2
View File
@@ -710,7 +710,7 @@ enum Command {
short,
long,
help = "Resume a previous session (last used or specified by --name/--session-id)",
long_help = "Continue from a previous session. If --name or --session-id is provided, resumes that specific session. Otherwise resumes the most recently used session."
long_help = "Continue from a previous session. If --name or --session-id is provided, resumes that specific session. Otherwise, resumes the most recently used session."
)]
resume: bool,
@@ -719,7 +719,7 @@ enum Command {
long,
requires = "resume",
help = "Fork a previous session (creates new session with copied history)",
long_help = "Create a new session by copying all messages from a previous session. Must be used with --resume. If --name or --session-id is provided, forks that specific session. Otherwise forks the most recently used session."
long_help = "Create a new session by copying all messages from a previous session. Must be used with --resume. If --name or --session-id is provided, forks that specific session. Otherwise, forks the most recently used session."
)]
fork: bool,
+2 -2
View File
@@ -27,7 +27,7 @@ use goose::session::SessionType;
use serde_json::Value;
use std::collections::HashMap;
// useful for light themes where there is no dicernible colour contrast between
// useful for light themes where there is no discernible colour contrast between
// cursor-selected and cursor-unselected items.
const MULTISELECT_VISIBILITY_HINT: &str = "<";
@@ -1587,7 +1587,7 @@ fn configure_recipe_dialog() -> anyhow::Result<()> {
.ok()
.or_else(|| config.get_param(key_name).unwrap_or(None));
let mut recipe_repo_input = cliclack::input(
"Enter your goose recipe Github repo (owner/repo): eg: my_org/goose-recipes",
"Enter your goose recipe GitHub repo (owner/repo): eg: my_org/goose-recipes",
)
.required(false);
if let Some(recipe_repo) = default_recipe_repo {
+3 -3
View File
@@ -198,7 +198,7 @@ pub enum PlannerResponseType {
ClarifyingQuestions,
}
/// Decide if the planner's reponse is a plan or a clarifying question
/// Decide if the planner's response is a plan or a clarifying question
///
/// This function is called after the planner has generated a response
/// to the user's message. The response is either a plan or a clarifying
@@ -1820,7 +1820,7 @@ async fn get_reasoner() -> Result<Arc<dyn Provider>, anyhow::Error> {
let config = Config::global();
// Try planner-specific provider first, fallback to default provider
// Try planner-specific provider first, fall back to default provider
let provider = if let Ok(provider) = config.get_param::<String>("GOOSE_PLANNER_PROVIDER") {
provider
} else {
@@ -1830,7 +1830,7 @@ async fn get_reasoner() -> Result<Arc<dyn Provider>, anyhow::Error> {
.expect("No provider configured. Run 'goose configure' first")
};
// Try planner-specific model first, fallback to default model
// Try planner-specific model first, fall back to default model
let model = if let Ok(model) = config.get_param::<String>("GOOSE_PLANNER_MODEL") {
model
} else {
+1 -1
View File
@@ -107,7 +107,7 @@ const THINKING_MESSAGES: &[&str] = &[
"Visualizing vectors",
"Wrangling widgets",
"Yodeling yaml",
"Aligning artificial awarenesses",
"Aligning artificial awareness",
"Bootstrapping brain bytes",
"Contemplating code conundrums",
"Distilling digital dreams",
+1 -1
View File
@@ -1,6 +1,6 @@
### Test with MCP Inspector
Update examples/mcp.rs to use the appropriate the MCP server (eg. DeveloperRouter)
Update examples/mcp.rs to use the appropriate MCP server (eg. DeveloperRouter)
```bash
npx @modelcontextprotocol/inspector cargo run -p goose-mcp --example mcp
+1 -1
View File
@@ -447,7 +447,7 @@ impl AutoVisualiserRouter {
Use these tools when you are presenting data to the user which could be complemented by a visual expression
Choose the most appropriate chart type based on the data you have and can provide
It is important you match the data format as appropriate with the chart type you have chosen
The user may specify a type of chart or you can pick one of the most appopriate that you can shape the data to
The user may specify a type of chart or you can pick one of the most appropriate that you can shape the data to
## Available Tools:
- **render_sankey**: Creates interactive Sankey diagrams from flow data
@@ -42,7 +42,7 @@ fn test_circular_dependency() {
fn test_empty_graph() {
let graph = CallGraph::new();
// Should return empty results for non-existent symbols
// Should return empty results for nonexistent symbols
let chains = graph.find_incoming_chains("nonexistent", 2);
assert!(chains.is_empty());
@@ -34,7 +34,7 @@ fn test_validate_path() {
let ignore = create_test_gitignore();
let traverser = FileTraverser::new(&ignore);
// Test non-existent path
// Test nonexistent path
assert!(traverser
.validate_path(Path::new("/nonexistent/path"))
.is_err());
@@ -78,7 +78,7 @@ pub struct ReferenceInfo {
pub ref_type: ReferenceType,
pub line: usize,
pub context: String,
/// For method definitions, this stores the type the method belongs to
/// For method definitions, this stores the type to which the method belongs
/// For type usage, this is None
pub associated_type: Option<String>,
}
@@ -206,7 +206,7 @@ new file mode 100644
+new"#;
let history = Arc::new(Mutex::new(HashMap::new()));
// For non-existent files, apply_diff will try to apply the patch
// For nonexistent files, apply_diff will try to apply the patch
// which should fail since the file doesn't exist
let result = apply_diff(&file_path, diff, &history).await;
+1 -1
View File
@@ -186,7 +186,7 @@ mod tests {
let server = TutorialServer::new();
let params = LoadTutorialParams {
name: "non-existent-tutorial".to_string(),
name: "nonexistent-tutorial".to_string(),
};
let result = server.load_tutorial(Parameters(params)).await;
@@ -46,7 +46,7 @@ already have one. This includes any necessary build tools or dependencies.
- Always check the reference SDK for typing and correct usage
- Python: Initialize a project using `uv init $PROJECT NAME`
- Python: Use `uv add` for all python package management, to keep `pyproject.toml` up to date
- Typescript: Initialize a project using `npm init -y`
- TypeScript: Initialize a project using `npm init -y`
- Kotlin: Use the following `gradle init` command to initialize:
```bash
gradle init \
@@ -223,7 +223,7 @@ Help users test their MCP extension using these steps:
Instruct users to start a goose session with their extension.
**Important**: You cannot start the goose session for them, as it is interactive. You will have to let them
know to start it in a terminal. Make sure you include instructions on how to setup the environment
know to start it in a terminal. Make sure you include instructions on how to set up the environment
```bash
# Python example
@@ -388,12 +388,12 @@ When users encounter issues:
3. Always use the reference implementations:
- Always clone the relevant SDK repo before starting with basic steup
- Always clone the relevant SDK repo before starting with basic setup
- After cloning the relevant SDK, find and `cat` the `README.md` for context
- Use ripgrep to find specific examples within the reference
- Reference real implementations rather than making assumptions
4. When building the project, if any compliation or type issues occur, _always_ check the reference SDK before making a fix.
4. When building the project, if any compilation or type issues occur, _always_ check the reference SDK before making a fix.
5. When helping with implementations:
+2 -2
View File
@@ -1,4 +1,4 @@
IMPORTANT: currently GOOSE_ALLOWLIST is used in main.ts in ui/desktop, and not in goose-server. The following is for reference in case it is used on the server side for launch time enforcement.
IMPORTANT: currently GOOSE_ALLOWLIST is used in main.ts in ui/desktop, and not in goose-server. The following is for reference when it is used on the server side for launch time enforcement.
# goose Extension Allowlist
@@ -31,7 +31,7 @@ export GOOSE_ALLOWLIST_WARNING=true
```
When this environment variable is set to `true` (case insensitive), the allowlist check will be bypassed and all commands will be allowed, even if the `GOOSE_ALLOWLIST` environment variable is set.
When this environment variable is set to `true` (case-insensitive), the allowlist check will be bypassed and all commands will be allowed, even if the `GOOSE_ALLOWLIST` environment variable is set.
## Allowlist File Format
+1 -1
View File
@@ -149,7 +149,7 @@ impl AppsManagerClient {
}
fn ensure_default_apps(&self) -> Result<(), String> {
// TODO(Douwe): we have the same check in cache, consider unfiying that
// TODO(Douwe): we have the same check in cache, consider unifying that
const CLOCK_HTML: &str = include_str!("../goose_apps/clock.html");
// Check if clock app exists
+2 -2
View File
@@ -441,7 +441,7 @@ async fn create_streamable_http_client(
let client_res = McpClient::connect(transport, timeout_duration, provider.clone()).await;
if extract_auth_error(&client_res).is_some() {
let am = oauth_flow(&uri.to_string(), &name.to_string())
let auth_manager = oauth_flow(&uri.to_string(), &name.to_string())
.await
.map_err(|_| ExtensionError::SetupError("auth error".to_string()))?;
let mut auth_headers = HeaderMap::new();
@@ -452,7 +452,7 @@ async fn create_streamable_http_client(
.map_err(|_| {
ExtensionError::ConfigError("could not construct http client".to_string())
})?;
let auth_client = AuthClient::new(auth_http_client, am);
let auth_client = AuthClient::new(auth_http_client, auth_manager);
let transport = StreamableHttpClientTransport::with_client(
auth_client,
StreamableHttpClientTransportConfig {
+2 -2
View File
@@ -750,7 +750,7 @@ impl Config {
.and_then(|v| Ok(serde_json::from_value(v.clone())?))
}
/// Get secrets. If primary is in env, use env for all keys. Otherwise use secret storage.
/// Get secrets. If primary is in env, use env for all keys. Otherwise, use secret storage.
pub fn get_secrets(
&self,
primary: &str,
@@ -876,7 +876,7 @@ impl Config {
Paths::config_dir().join("secrets.yaml")
}
/// Perform fallback to file storage when keyring is unavailable
/// Fall back to file storage when keyring is unavailable
fn fallback_to_file_storage(&self) -> Result<HashMap<String, Value>, ConfigError> {
let path = Self::secrets_file_path();
self.read_secrets_from_file(&path)
+1 -1
View File
@@ -159,7 +159,7 @@ impl<'a> IntoIterator for &'a Conversation {
}
}
/// Fix a conversation that we're about to send to an LLM. So the last and first
/// Fix a conversation that we're about to send to an LLM. So the first and last
/// messages should always be from the user.
pub fn fix_conversation(conversation: Conversation) -> (Conversation, Vec<String>) {
let all_messages = conversation.messages();
+1 -1
View File
@@ -339,7 +339,7 @@ mod tests {
#[tokio::test]
async fn test_remove_nonexistent_session_error() {
// Test that removing a non-existent session returns an error
// Test that removing a nonexistent session returns an error
let temp_dir = TempDir::new().unwrap();
let manager = create_test_manager(&temp_dir).await;
let session = String::from("never-created");
+1 -1
View File
@@ -161,7 +161,7 @@ impl CursorAgentProvider {
}
}
// If no valid result line found, fallback to joining all lines
// If no valid result line found, fall back to joining all lines
let response_text = lines.join("\n");
let message_content = vec![MessageContent::text(response_text)];
@@ -143,7 +143,7 @@ pub fn to_bedrock_tool_result_content_block(
bail!("Blob resource content is not supported by Bedrock provider yet")
}
},
RawContent::Audio(..) => bail!("Audio is not not supported by Bedrock provider"),
RawContent::Audio(..) => bail!("Audio is not supported by Bedrock provider"),
})
}
@@ -597,7 +597,7 @@ where
// Skip event type lines
continue;
} else {
// Try to parse as-is in case there's no prefix
// Try to parse as-is when there's no prefix
&response_str
};
+1 -1
View File
@@ -17,7 +17,7 @@ use rmcp::model::{Content, RawContent};
const LEAD_WORKER_PROVIDER_NAME: &str = "lead_worker";
/// A provider that switches between a lead model and a worker model based on turn count
/// and can fallback to lead model on consecutive failures
/// and can fall back to lead model on consecutive failures
pub struct LeadWorkerProvider {
lead_provider: Arc<dyn Provider>,
worker_provider: Arc<dyn Provider>,
+1 -1
View File
@@ -295,7 +295,7 @@ impl OAuthFlow {
// though it will ultimately only get used once
let tx = Arc::new(tokio::sync::Mutex::new(Some(tx)));
// Setup a server that will receive the redirect, capture the code, and display success/failure
// Set up a server that will receive the redirect, capture the code, and display success/failure
let app = Router::new().route(
"/",
get(move |Query(params): Query<HashMap<String, String>>| {
+2 -2
View File
@@ -113,7 +113,7 @@ impl OllamaInterpreter {
Ok(base_url.to_string())
}
fn tool_structured_ouput_format_schema() -> Value {
fn tool_structured_output_format_schema() -> Value {
json!({
"type": "object",
"properties": {
@@ -282,7 +282,7 @@ Otherwise, if no JSON tool requests are provided, use the no-op tool:
let format_instruction = format!("{}\nRequest: {}\n\n", system_prompt, last_assistant_msg);
// Define the JSON schema for tool call format
let format_schema = OllamaInterpreter::tool_structured_ouput_format_schema();
let format_schema = OllamaInterpreter::tool_structured_output_format_schema();
// Determine which model to use for interpretation (from env var or default)
let interpreter_model = std::env::var("GOOSE_TOOLSHIM_OLLAMA_MODEL")
+2 -2
View File
@@ -528,7 +528,7 @@ mod tests {
let text = format!("Here is a fake image {}", fake_png_path.to_str().unwrap());
assert_eq!(detect_image_path(&text), None);
// Test with non-existent file
// Test with nonexistent file
let text = "Here is a fake.png that doesn't exist";
assert_eq!(detect_image_path(text), None);
@@ -573,7 +573,7 @@ mod tests {
.to_string()
.contains("not a valid image"));
// Test non-existent file
// Test nonexistent file
let result = load_image_file("nonexistent.png");
assert!(result.is_err());
+1 -1
View File
@@ -196,7 +196,7 @@ impl ProviderDef for MockCompactionProvider {
}
}
/// Helper: Setup a test session with initial messages and token counts
/// Helper: Set up a test session with initial messages and token counts
async fn setup_test_session(
agent: &Agent,
temp_dir: &TempDir,