Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 6 additions & 6 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.14.1"
version = "1.14.2"
authors = ["Block <[email protected]>"]
license = "Apache-2.0"
repository = "https://github.com/block/goose"
Expand Down
45 changes: 12 additions & 33 deletions crates/goose-cli/src/commands/acp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -605,8 +605,12 @@ impl acp::Agent for GooseAcpAgent {
) -> Result<acp::NewSessionResponse, acp::Error> {
info!("ACP: Received new session request {:?}", args);

// Generate a unique session ID
let session_id = uuid::Uuid::new_v4().to_string();
let goose_session = SessionManager::create_session(
std::env::current_dir().unwrap_or_default(),
"ACP Session".to_string(), // just an initial name - may be replaced by maybe_update_name
SessionType::User,
)
.await?;

let session = GooseAcpSession {
messages: Conversation::new_unvalidated(Vec::new()),
Expand All @@ -615,15 +619,14 @@ impl acp::Agent for GooseAcpAgent {
cancel_token: None,
};

// Store the session
let mut sessions = self.sessions.lock().await;
sessions.insert(session_id.clone(), session);
sessions.insert(goose_session.id.clone(), session);

info!("Created new session with ID: {}", session_id);
info!("Created new ACP/goose session {}", goose_session.id);

Ok(acp::NewSessionResponse {
session_id: acp::SessionId(session_id.into()),
modes: None, // TODO: Implement session modes if needed
session_id: acp::SessionId(goose_session.id.into()),
modes: None,
meta: None,
})
}
Expand All @@ -649,15 +652,9 @@ impl acp::Agent for GooseAcpAgent {
}

async fn prompt(&self, args: acp::PromptRequest) -> Result<acp::PromptResponse, acp::Error> {
info!("ACP: Received prompt request {:?}", args);

// Get the session
let session_id = args.session_id.0.to_string();

// Create and store cancellation token for this prompt
let cancel_token = CancellationToken::new();

// Store the cancel token in the session BEFORE starting the prompt
{
let mut sessions = self.sessions.lock().await;
let session = sessions
Expand All @@ -668,21 +665,13 @@ impl acp::Agent for GooseAcpAgent {

let user_message = self.convert_acp_prompt_to_message(args.prompt);

let session = SessionManager::create_session(
std::env::current_dir().unwrap_or_default(),
"ACP Session".to_string(),
SessionType::Hidden,
)
.await?;

let session_config = SessionConfig {
id: session.id.clone(),
id: session_id.clone(),
schedule_id: None,
max_turns: None,
retry_config: None,
};

// Get agent's reply through the Goose agent
let mut stream = self
.agent
.reply(user_message, session_config, Some(cancel_token.clone()))
Expand All @@ -694,45 +683,36 @@ impl acp::Agent for GooseAcpAgent {

use futures::StreamExt;

// Track if we were cancelled
let mut was_cancelled = false;

// Process the agent's response stream
while let Some(event) = stream.next().await {
// Check if we've been cancelled
if cancel_token.is_cancelled() {
was_cancelled = true;
break;
}

match event {
Ok(goose::agents::AgentEvent::Message(message)) => {
// Re-acquire the lock to add message to conversation
let mut sessions = self.sessions.lock().await;
let session = sessions
.get_mut(&session_id)
.ok_or_else(acp::Error::invalid_params)?;

// Add to conversation
session.messages.push(message.clone());

// Process message content, including tool calls
for content_item in &message.content {
self.handle_message_content(content_item, &args.session_id, session)
.await?;
}
}
Ok(_) => {
// Ignore other events for now
}
Ok(_) => {}
Err(e) => {
error!("Error in agent response stream: {}", e);
return Err(acp::Error::internal_error());
}
}
}

// Clear the cancel token since we're done
let mut sessions = self.sessions.lock().await;
if let Some(session) = sessions.get_mut(&session_id) {
session.cancel_token = None;
Expand All @@ -751,7 +731,6 @@ impl acp::Agent for GooseAcpAgent {
async fn cancel(&self, args: acp::CancelNotification) -> Result<(), acp::Error> {
info!("ACP: Received cancel request {:?}", args);

// Get the session and cancel its active operation
let session_id = args.session_id.0.to_string();
let mut sessions = self.sessions.lock().await;

Expand Down
2 changes: 1 addition & 1 deletion ui/desktop/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"license": {
"name": "Apache-2.0"
},
"version": "1.14.1"
"version": "1.14.2"
},
"paths": {
"/agent/add_extension": {
Expand Down
4 changes: 2 additions & 2 deletions ui/desktop/package-lock.json

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

2 changes: 1 addition & 1 deletion ui/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "goose-app",
"productName": "Goose",
"version": "1.14.1",
"version": "1.14.2",
"description": "Goose App",
"engines": {
"node": "^22.17.1"
Expand Down