Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
59ddfcb
chore(release): release version 1.1.0
zanesq Jul 16, 2025
18b9334
Fix a few ui edge cases - refresh occasionally crashing, chat loader …
zanesq Jul 17, 2025
c2aef56
Don't default to main for build-cli (#3467)
jamadeo Jul 17, 2025
4c640f0
chore(release): release version 1.1.1
zanesq Jul 17, 2025
992340d
Fix tool call allow still showing initial state in chat after navigat…
zanesq Jul 18, 2025
e2dde6b
Fix launching session in new window (#3497)
zanesq Jul 18, 2025
a10521c
fix token alert indicator/popovers hiding and showing (#3492)
zanesq Jul 17, 2025
0f85c89
fix the output not being visible issue (#3491)
Kvadratni Jul 17, 2025
5228909
Fix llm errors not propagating to the ui and auto summarize not start…
zanesq Jul 17, 2025
687633c
fix issue with generating a share url and add missing url verificatio…
zanesq Jul 17, 2025
bd670d3
fix: working dir was not being set correctly (#3477)
michaelneale Jul 18, 2025
788aedb
chore(release): release version 1.1.2
zanesq Jul 18, 2025
3615d2a
fix: Load and Use recipes in new window (#3501)
jsibbison-square Jul 18, 2025
34900ab
Revert "fix the output not being visible issue (#3491)" (#3511)
alexhancock Jul 18, 2025
6f2f903
chore(release): release version 1.1.3
zanesq Jul 18, 2025
c20b845
chore(release): release version 1.1.4
zanesq Jul 23, 2025
170aa46
Alexhancock/reapply 3491 (#3515)
Kvadratni Jul 18, 2025
38937d3
feat: Enhanced loading states with thinking icons and flying bird ani…
spencrmartin Jul 22, 2025
c9c9420
Added option to summarize the chat when an error is triggered (#3598)
zanesq Jul 23, 2025
8a4cb6b
Fix model display name not being updated immediately after leaving se…
zanesq Jul 23, 2025
52e0915
fix: add fallback id to messages if none provided (#3584)
zanesq Jul 22, 2025
006c1df
fix: show token alert popover during agent responses and agent failur…
zanesq Jul 23, 2025
2231f53
fix: loading shared sessions (#3607)
zanesq Jul 23, 2025
5ae697d
Added logging and changed default route case to not redirect to home …
zanesq Jul 23, 2025
7aa2e89
fix: chat sidebar layout overlapping content occasionally (#3590)
zanesq Jul 23, 2025
640f82f
Improve session history loading resiliency (#3588)
zanesq Jul 23, 2025
cc34ce2
fix: multi-tool calls in streamed openai-compatible responses (#3609)
jamadeo Jul 23, 2025
939da1e
feat: add task_timeout support for sub-recipes and text instructions
tadasant Jul 28, 2025
36f4a58
test: add comprehensive test coverage for task_timeout functionality
tadasant Jul 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ on:
ref:
type: string
required: false
default: 'refs/heads/main'
default: ""

name: "Reusable workflow to build CLI"

Expand Down
14 changes: 7 additions & 7 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ resolver = "2"

[workspace.package]
edition = "2021"
version = "1.0.36"
version = "1.1.4"
authors = ["Block <ai-oss-tools@block.xyz>"]
license = "Apache-2.0"
repository = "https://github.com/block/goose"
Expand Down
17 changes: 15 additions & 2 deletions crates/goose-cli/src/commands/web.rs
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,14 @@ async fn process_message_streaming(
}

let provider = provider.unwrap();
session::persist_messages(&session_file, &messages, Some(provider.clone())).await?;
let working_dir = Some(std::env::current_dir()?);
session::persist_messages(
&session_file,
&messages,
Some(provider.clone()),
working_dir.clone(),
)
.await?;

// Create a session config
let session_config = SessionConfig {
Expand Down Expand Up @@ -503,7 +510,13 @@ async fn process_message_streaming(
let session_msgs = session_messages.lock().await;
session_msgs.clone()
};
session::persist_messages(&session_file, &current_messages, None).await?;
session::persist_messages(
&session_file,
&current_messages,
None,
working_dir.clone(),
)
.await?;
// Handle different message content types
for content in &message.content {
match content {
Expand Down
23 changes: 23 additions & 0 deletions crates/goose-cli/src/session/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,11 +364,16 @@ impl Session {

// Persist messages with provider for automatic description generation
if let Some(session_file) = &self.session_file {
let working_dir = Some(
std::env::current_dir().expect("failed to get current session working directory"),
);

session::persist_messages_with_schedule_id(
session_file,
&self.messages,
Some(provider),
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand Down Expand Up @@ -486,11 +491,17 @@ impl Session {

// Persist messages with provider for automatic description generation
if let Some(session_file) = &self.session_file {
let working_dir = Some(
std::env::current_dir()
.expect("failed to get current session working directory"),
);

session::persist_messages_with_schedule_id(
session_file,
&self.messages,
Some(provider),
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand Down Expand Up @@ -702,11 +713,13 @@ impl Session {

// Persist the summarized messages
if let Some(session_file) = &self.session_file {
let working_dir = std::env::current_dir().ok();
session::persist_messages_with_schedule_id(
session_file,
&self.messages,
Some(provider),
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand Down Expand Up @@ -886,11 +899,13 @@ impl Session {
));
push_message(&mut self.messages, response_message);
if let Some(session_file) = &self.session_file {
let working_dir = std::env::current_dir().ok();
session::persist_messages_with_schedule_id(
session_file,
&self.messages,
None,
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand Down Expand Up @@ -985,11 +1000,13 @@ impl Session {

// No need to update description on assistant messages
if let Some(session_file) = &self.session_file {
let working_dir = std::env::current_dir().ok();
session::persist_messages_with_schedule_id(
session_file,
&self.messages,
None,
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand Down Expand Up @@ -1188,11 +1205,13 @@ impl Session {

// No need for description update here
if let Some(session_file) = &self.session_file {
let working_dir = std::env::current_dir().ok();
session::persist_messages_with_schedule_id(
session_file,
&self.messages,
None,
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand All @@ -1205,11 +1224,13 @@ impl Session {

// No need for description update here
if let Some(session_file) = &self.session_file {
let working_dir = std::env::current_dir().ok();
session::persist_messages_with_schedule_id(
session_file,
&self.messages,
None,
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand All @@ -1227,11 +1248,13 @@ impl Session {

// No need for description update here
if let Some(session_file) = &self.session_file {
let working_dir = std::env::current_dir().ok();
session::persist_messages_with_schedule_id(
session_file,
&self.messages,
None,
self.scheduled_job_id.clone(),
working_dir,
)
.await?;
}
Expand Down
27 changes: 19 additions & 8 deletions crates/goose-server/src/routes/reply.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ async fn handler(
let stream = ReceiverStream::new(rx);

let messages = request.messages;
let session_working_dir = request.session_working_dir;
let session_working_dir = request.session_working_dir.clone();

let session_id = request
.session_id
Expand Down Expand Up @@ -181,7 +181,7 @@ async fn handler(
&messages,
Some(SessionConfig {
id: session::Identifier::Name(session_id.clone()),
working_dir: PathBuf::from(session_working_dir),
working_dir: PathBuf::from(&session_working_dir),
schedule_id: request.scheduled_job_id.clone(),
execution_mode: None,
max_turns: None,
Expand Down Expand Up @@ -297,8 +297,13 @@ async fn handler(
if all_messages.len() > saved_message_count {
let provider = Arc::clone(provider.as_ref().unwrap());
tokio::spawn(async move {
if let Err(e) =
session::persist_messages(&session_path, &all_messages, Some(provider)).await
if let Err(e) = session::persist_messages(
&session_path,
&all_messages,
Some(provider),
Some(PathBuf::from(&session_working_dir)),
)
.await
{
tracing::error!("Failed to store session history: {:?}", e);
}
Expand Down Expand Up @@ -337,7 +342,7 @@ async fn ask_handler(
) -> Result<Json<AskResponse>, StatusCode> {
verify_secret_key(&headers, &state)?;

let session_working_dir = request.session_working_dir;
let session_working_dir = request.session_working_dir.clone();

let session_id = request
.session_id
Expand All @@ -358,7 +363,7 @@ async fn ask_handler(
&messages,
Some(SessionConfig {
id: session::Identifier::Name(session_id.clone()),
working_dir: PathBuf::from(session_working_dir),
working_dir: PathBuf::from(&session_working_dir),
schedule_id: request.scheduled_job_id.clone(),
execution_mode: None,
max_turns: None,
Expand Down Expand Up @@ -420,9 +425,15 @@ async fn ask_handler(
let session_path_clone = session_path.clone();
let messages = all_messages.clone();
let provider = Arc::clone(provider.as_ref().unwrap());
let session_working_dir_clone = session_working_dir.clone();
tokio::spawn(async move {
if let Err(e) =
session::persist_messages(&session_path_clone, &messages, Some(provider)).await
if let Err(e) = session::persist_messages(
&session_path_clone,
&messages,
Some(provider),
Some(PathBuf::from(session_working_dir_clone)),
)
.await
{
tracing::error!("Failed to store session history: {:?}", e);
}
Expand Down
22 changes: 14 additions & 8 deletions crates/goose-server/src/routes/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,14 +187,20 @@ async fn get_session_insights(

// Track tokens - only add positive values to prevent negative totals
if let Some(tokens) = session.metadata.accumulated_total_tokens {
if tokens > 0 {
total_tokens += tokens as i64;
} else if tokens < 0 {
// Log negative token values for debugging
info!(
"Warning: Session {} has negative accumulated_total_tokens: {}",
session.id, tokens
);
match tokens.cmp(&0) {
std::cmp::Ordering::Greater => {
total_tokens += tokens as i64;
}
std::cmp::Ordering::Less => {
// Log negative token values for debugging
info!(
"Warning: Session {} has negative accumulated_total_tokens: {}",
session.id, tokens
);
}
std::cmp::Ordering::Equal => {
// Zero tokens, no action needed
}
}
}

Expand Down
29 changes: 24 additions & 5 deletions crates/goose/src/agents/recipe_tools/sub_recipe_tools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,32 @@ fn prepare_command_params(

pub async fn create_sub_recipe_task(sub_recipe: &SubRecipe, params: Value) -> Result<String> {
let command_params = prepare_command_params(sub_recipe, params)?;

// Extract task_timeout from sub_recipe values if present
let task_timeout = sub_recipe
.values
.as_ref()
.and_then(|values| values.get("task_timeout"))
.and_then(|timeout_str| timeout_str.parse::<u64>().ok());

let mut sub_recipe_data = json!({
"name": sub_recipe.name.clone(),
"command_parameters": command_params,
"recipe_path": sub_recipe.path.clone(),
});

// Add task_timeout to the payload if present
if let Some(timeout_seconds) = task_timeout {
sub_recipe_data.as_object_mut().unwrap().insert(
"task_timeout".to_string(),
json!(timeout_seconds)
);
}

let payload = json!({
"sub_recipe": {
"name": sub_recipe.name.clone(),
"command_parameters": command_params,
"recipe_path": sub_recipe.path.clone(),
}
"sub_recipe": sub_recipe_data
});

let task = Task {
id: uuid::Uuid::new_v4().to_string(),
task_type: "sub_recipe".to_string(),
Expand Down
Loading