Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
817ee23
Harden ACP parity behavior
Finesssee May 8, 2026
9e5b01a
Add ACP harness parity coverage
Finesssee May 8, 2026
6dc3995
Load ACP agents from registry
Finesssee May 8, 2026
e5f5b77
Preserve legacy ACP agents
Finesssee May 9, 2026
6c281b1
Align ACP agent catalog behavior
Finesssee May 9, 2026
15030da
Recognize ACP registry agent icons
Finesssee May 9, 2026
690b67c
Use catalog icons for ACP agents
Finesssee May 9, 2026
42e9771
Enable registry agent installs
Finesssee May 9, 2026
c491000
Format Rust crate files
Finesssee May 9, 2026
0efc2c3
Match CI Rust formatting
Finesssee May 9, 2026
12c59cb
Track ACP registry install receipts
Finesssee May 9, 2026
7debd39
Harden ACP managed install paths
Finesssee May 9, 2026
7c2dd36
Make ACP agent selector scrollable
Finesssee May 9, 2026
31dcf53
Show ACP registry agent logos
Finesssee May 9, 2026
d764da3
Color ACP registry agent logos
Finesssee May 9, 2026
5f544ed
Exclude unsupported ACP registry agents
Finesssee May 9, 2026
c4e05bd
Fix ACP registry command aliases
Finesssee May 9, 2026
023e31c
Fix fast-agent ACP install package
Finesssee May 9, 2026
f0660fd
Fix ACP agent tab chat binding
Finesssee May 9, 2026
3fe9a96
Revert "Fix ACP agent tab chat binding"
Finesssee May 9, 2026
12f40cd
Fix ACP agent tab chat binding
Finesssee May 9, 2026
1e304bc
Polish ACP assistant message identity
Finesssee May 9, 2026
d09832e
Fix ACP registry provider launch metadata
Finesssee May 9, 2026
0479b15
Fix ACP registry refresh in selector
Finesssee May 9, 2026
4bce85a
Clarify ACP provider setup failures
Finesssee May 9, 2026
3b22455
Tag ACP provider setup errors
Finesssee May 9, 2026
bc96313
Remove GoalBuddy state files
Finesssee May 9, 2026
fd0104b
Fix ACP agent catalog duplicates
Finesssee May 10, 2026
c22e4b3
Fix ACP install progress feedback
Finesssee May 10, 2026
9a2056c
Fix agent tab chat rendering
Finesssee May 10, 2026
1d8fa62
Fix ACP agent selector sizing
Finesssee May 10, 2026
b3ea166
Fix agent selector chat routing
Finesssee May 10, 2026
000b3c8
Fix ACP provider runtime handling
Finesssee May 10, 2026
1a4f708
Polish ACP agent selector scrolling
Finesssee May 10, 2026
5af421a
Polish ACP agent selector scrolling
Finesssee May 10, 2026
0d20ca8
Merge remote-tracking branch 'origin/codex/big-feature-prep' into cod…
Finesssee May 10, 2026
8ae9289
Merge remote-tracking branch 'origin/codex/acp-zed-parity-followup' i…
Finesssee May 10, 2026
b07f9e0
Merge remote-tracking branch 'origin/codex/acp-agent-tab-binding' int…
Finesssee May 10, 2026
0b75305
Merge remote-tracking branch 'origin/codex/acp-provider-icons' into c…
Finesssee May 10, 2026
842db8c
Merge remote-tracking branch 'origin/codex/acp-provider-runtime-statu…
Finesssee May 10, 2026
7e8474c
Merge remote-tracking branch 'origin/codex/acp-selector-scroll-ux' in…
Finesssee May 10, 2026
9fe3900
Merge remote-tracking branch 'upstream/master' into codex/acp-registr…
Finesssee May 10, 2026
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
56 changes: 53 additions & 3 deletions crates/ai/src/acp/bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ use super::{
config::AgentRegistry,
process::{stop_child_tree, terminate_process_group},
types::{
AcpAgentCapabilities, AcpAgentStatus, AcpEvent, AcpSessionInfo, AcpSessionList, AgentConfig,
SessionConfigOption,
AcpAgentCapabilities, AcpAgentStatus, AcpErrorKind, AcpEvent, AcpSessionInfo, AcpSessionList,
AgentConfig, SessionConfigOption,
},
};
use crate::runtime::AthasAppHandle as AppHandle;
Expand All @@ -24,6 +24,24 @@ use tokio::{
task::LocalSet,
};

fn classify_acp_error(error: &str) -> Option<AcpErrorKind> {
let lower = error.to_lowercase();

if lower.contains("authentication required") {
return Some(AcpErrorKind::AuthenticationRequired);
}

let requires_provider_setup = lower.contains("no api key found")
|| lower.contains("missing api key")
|| (lower.contains("api key") && lower.contains("required"))
|| lower.contains("environment variable")
|| lower.contains("--setup")
|| lower.contains("not logged in")
|| lower.contains("login required");

requires_provider_setup.then_some(AcpErrorKind::ProviderSetupRequired)
}

/// Worker state running on the LocalSet thread
pub(super) struct AcpWorker {
connection: Option<Arc<acp::ClientSideConnection>>,
Expand Down Expand Up @@ -68,6 +86,7 @@ impl AcpWorker {
AcpEvent::Error {
session_id: session_id.clone(),
error: format!("ACP agent process exited: {}", status),
error_kind: None,
},
);
let _ = app_handle.emit(
Expand Down Expand Up @@ -188,11 +207,13 @@ impl AcpWorker {
.await
{
log::error!("Failed to run ACP prompt: {}", err);
let error = format!("Failed to run prompt: {}", err);
let _ = app_handle.emit(
"acp-event",
AcpEvent::Error {
session_id: Some(session_id.to_string()),
error: format!("Failed to run prompt: {}", err),
error_kind: classify_acp_error(&error),
error,
},
);
}
Expand Down Expand Up @@ -641,3 +662,32 @@ impl AcpAgentBridge {
);
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn classifies_provider_setup_errors() {
let error =
"Failed to run prompt: No API key found. Set Z_AI_API_KEY or run glm-acp-agent --setup";

assert_eq!(
classify_acp_error(error),
Some(AcpErrorKind::ProviderSetupRequired)
);
}

#[test]
fn classifies_authentication_required_errors() {
assert_eq!(
classify_acp_error("Authentication required before sending prompt"),
Some(AcpErrorKind::AuthenticationRequired)
);
}

#[test]
fn leaves_plain_runtime_errors_unclassified() {
assert_eq!(classify_acp_error("ACP agent process exited: 1"), None);
}
}
Loading
Loading