{"record":{"id":"dedd6c5817af9bcf","repo":"tinyhumansai/openhuman","slug":"skills-composio-failed-to-load-composio-mode-st","errorCode":null,"errorMessage":"[skills][composio] failed to load composio mode status:","messagePattern":"\\[skills\\]\\[composio\\] failed to load composio mode status:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/pages/Skills.tsx","lineNumber":621,"sourceCode":"  const [selectedCategory, setSelectedCategory] = useState<SkillCategory>('All');\n  const [hasComposioApiKey, setHasComposioApiKey] = useState<boolean | null>(null);\n  const showLocalComposioApiKeyBanner = isLocalSession && hasComposioApiKey === false;\n\n  useEffect(() => {\n    if (!isLocalSession) {\n      setHasComposioApiKey(null);\n      return;\n    }\n    let cancelled = false;\n    void openhumanComposioGetMode()\n      .then(res => {\n        if (!cancelled) {\n          setHasComposioApiKey(Boolean(res.result?.api_key_set));\n        }\n      })\n      .catch(err => {\n        if (!cancelled) {\n          console.warn('[skills][composio] failed to load composio mode status:', err);\n          setHasComposioApiKey(false);\n        }\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, [isLocalSession]);\n\n  const bestChannelStatus = (channelId: ChannelType): ChannelConnectionStatus => {\n    const conns = channelConnections.connections[channelId];\n    if (!conns) return 'disconnected';\n    const statuses = Object.values(conns).map(c => c?.status ?? 'disconnected');\n    if (statuses.includes('connected')) return 'connected';\n    if (statuses.includes('connecting')) return 'connecting';\n    if (statuses.includes('error')) return 'error';\n    return 'disconnected';\n  };\n","sourceCodeStart":603,"sourceCodeEnd":639,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/pages/Skills.tsx#L603-L639","documentation":"Fetching the Composio mode status (openhumanComposioGetMode) failed for a local session on the Skills page. The effect leaves hasComposioApiKey unset (null), which suppresses the local-API-key banner — the page renders without knowing whether a Composio key is configured rather than assuming it is absent. Common causes: core RPC unreachable or the Composio integration check erroring core-side.","triggerScenarios":"Thrown at app/src/pages/Skills.tsx:621 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the warned error for transport vs controller failure","Confirm the core process is running and the integrations surface is compiled in/enabled","Re-navigate to the Skills page to re-trigger the status fetch once healthy","If it persistently fails, inspect the core log for the composio mode check"],"exampleFix":null,"handlingStrategy":"try-catch","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"}