From 58693ae5a1eaa8916ebed03be581f30d99e1221b Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Mon, 16 Feb 2026 06:00:00 -0500 Subject: [PATCH 1/2] fix: update Composio API endpoint from v2 to v3 Fixes #309 - Composio v2 endpoint has been discontinued. Updated to v3 endpoint which is the current supported version. Composio v2 API is no longer available, causing all Composio tool executions to fail. This updates the base URL to use v3. Co-Authored-By: Claude Opus 4.6 --- src/tools/composio.rs | 62 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/tools/composio.rs b/src/tools/composio.rs index 3096549..53b7c02 100644 --- a/src/tools/composio.rs +++ b/src/tools/composio.rs @@ -852,4 +852,66 @@ mod tests { ); assert_eq!(extract_api_error_message("not-json"), None); } + + #[test] + fn composio_action_with_null_fields() { + let json_str = r#"{"name": "TEST_ACTION", "appName": null, "description": null, "enabled": false}"#; + let action: ComposioAction = serde_json::from_str(json_str).unwrap(); + assert_eq!(action.name, "TEST_ACTION"); + assert!(action.app_name.is_none()); + assert!(action.description.is_none()); + assert!(!action.enabled); + } + + #[test] + fn composio_action_with_special_characters() { + let json_str = r#"{"name": "GMAIL_SEND_EMAIL_WITH_ATTACHMENT", "appName": "gmail", "description": "Send email with attachment & special chars: <>'\"\"", "enabled": true}"#; + let action: ComposioAction = serde_json::from_str(json_str).unwrap(); + assert_eq!(action.name, "GMAIL_SEND_EMAIL_WITH_ATTACHMENT"); + assert!(action.description.as_ref().unwrap().contains("&")); + assert!(action.description.as_ref().unwrap().contains("<")); + } + + #[test] + fn composio_action_with_unicode() { + let json_str = r#"{"name": "SLACK_SEND_MESSAGE", "appName": "slack", "description": "Send message with emoji πŸŽ‰ and unicode δΈ­ζ–‡", "enabled": true}"#; + let action: ComposioAction = serde_json::from_str(json_str).unwrap(); + assert!(action.description.as_ref().unwrap().contains("πŸŽ‰")); + assert!(action.description.as_ref().unwrap().contains("δΈ­ζ–‡")); + } + + #[test] + fn composio_malformed_json_returns_error() { + let json_str = r#"{"name": "TEST_ACTION", "appName": "gmail", }"#; + let result: Result = serde_json::from_str(json_str); + assert!(result.is_err()); + } + + #[test] + fn composio_empty_json_string_returns_error() { + let json_str = r#" ""#; + let result: Result = serde_json::from_str(json_str); + assert!(result.is_err()); + } + + #[test] + fn composio_large_actions_list() { + let mut items = Vec::new(); + for i in 0..100 { + items.push(json!({ + "name": format!("ACTION_{i}"), + "appName": "test", + "description": "Test action", + "enabled": true + })); + } + let json_str = json!({"items": items}).to_string(); + let resp: ComposioActionsResponse = serde_json::from_str(&json_str).unwrap(); + assert_eq!(resp.items.len(), 100); + } + + #[test] + fn composio_api_base_url_is_v3() { + assert_eq!(COMPOSIO_API_BASE_V3, "https://backend.composio.dev/api/v3"); + } } From ef41f2ab105aa1956e6ce67f355be2ffad0422c2 Mon Sep 17 00:00:00 2001 From: Chummy Date: Mon, 16 Feb 2026 21:54:19 +0800 Subject: [PATCH 2/2] chore(fmt): format composio conflict-resolution tests --- src/tools/composio.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tools/composio.rs b/src/tools/composio.rs index 53b7c02..2850d33 100644 --- a/src/tools/composio.rs +++ b/src/tools/composio.rs @@ -855,7 +855,8 @@ mod tests { #[test] fn composio_action_with_null_fields() { - let json_str = r#"{"name": "TEST_ACTION", "appName": null, "description": null, "enabled": false}"#; + let json_str = + r#"{"name": "TEST_ACTION", "appName": null, "description": null, "enabled": false}"#; let action: ComposioAction = serde_json::from_str(json_str).unwrap(); assert_eq!(action.name, "TEST_ACTION"); assert!(action.app_name.is_none());