{"record":{"id":"6562b91b94e91bf5","repo":"tinyhumansai/openhuman","slug":"composio-direct-composio-list-connections-direc","errorCode":null,"errorMessage":"[composio-direct] composio_list_connections (direct) failed: {e:#}","messagePattern":"\\[composio-direct\\] composio_list_connections \\(direct\\) failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/integrations/composio/tools.rs","lineNumber":525,"sourceCode":"                })?\n            }\n            Ok(ComposioClientKind::Direct(direct)) => {\n                tracing::debug!(\"[composio-direct] list_connections.execute: direct variant\");\n                direct_list_connections(&direct).await.map_err(|e| {\n                    // [#1166 / Sentry TAURI-RUST-X9] Symmetric error\n                    // routing with `ops.rs::composio_list_connections`.\n                    // The agent-tool path can also fire 401s when a\n                    // direct-mode user has a bad API key — without this\n                    // hook the failure escapes the classifier and lands\n                    // as an unclassified Sentry event. Render WITH the\n                    // `[composio-direct]` anchor BEFORE reporting so the\n                    // classifier arm in `is_provider_user_state_message`\n                    // (gated on that prefix) actually fires.\n                    let rendered = format!(\n                        \"[composio-direct] composio_list_connections (direct) failed: {e:#}\"\n                    );\n                    super::ops::report_composio_op_error(\"list_connections\", &rendered);\n                    anyhow::anyhow!(\"{rendered}\")\n                })?\n            }\n            Err(e) => {\n                return Ok(ToolResult::error(format!(\n                    \"composio_list_connections failed: {e}\"\n                )));\n            }\n        };\n        // Filter server-side-indistinguishable states — callers should only\n        // see integrations the user can actually act on. Matches the same\n        // ACTIVE/CONNECTED allowlist used by `fetch_connected_integrations_uncached`\n        // so the tool output and the prompt's Delegation Guide agree on what\n        // counts as \"connected\".\n        resp.connections.retain(|c| c.is_active());\n        tracing::debug!(\n            count = resp.connections.len(),\n            \"[composio] list_connections.execute: returning active connections\"\n        );","sourceCodeStart":507,"sourceCodeEnd":543,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/integrations/composio/tools.rs#L507-L543","documentation":"The direct-variant composio_list_connections tool failed; the error is routed symmetrically with ops.rs so 401s from a bad direct-mode API key fire the session/credential classifier (Sentry TAURI-RUST-X9) instead of escaping unclassified. {e:#} renders the full error chain.","triggerScenarios":"Thrown at src/openhuman/integrations/composio/tools.rs:525 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Verify the Composio API key is valid (re-set it via composio.set_api_key)","Retry — direct API calls can fail transiently","Read the chained error for the specific Composio API refusal"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}