tinyhumansai/openhuman · error
Failed to fetch repositories
Error message
Failed to fetch repositories
What it means
SmartIssuePicker resolves the GitHub connection via listConnections() (throwing 'NOT_CONNECTED' when none is ACTIVE/CONNECTED), then runs the Composio action GITHUB_LIST_REPOSITORIES_FOR_THE_AUTHENTICATED_USER; when the action returns successful=false with an empty error string, this fallback message is thrown.
Source
Thrown at app/src/components/skills/SmartIssuePicker.tsx:93
// each onRepoSelect captures its own id and bails out of any state
// update once a newer selection has superseded it.
const selectionSeqRef = useRef(0);
// ── Load repos via Composio ─────────────────────────────────────────
const loadRepos = useCallback(async () => {
setReposLoading(true);
setReposError(null);
try {
const connections = await listConnections();
const ghConn = connections.connections?.find(
c =>
c.toolkit.toLowerCase().includes('github') &&
(c.status === 'ACTIVE' || c.status === 'CONNECTED')
);
if (!ghConn) throw new Error('NOT_CONNECTED');
const res = await composioExecute('GITHUB_LIST_REPOSITORIES_FOR_THE_AUTHENTICATED_USER', {});
if (!res.successful) throw new Error(res.error ?? 'Failed to fetch repositories');
const raw = res.data;
let repoList: ComposioGhRepo[] = [];
const items = Array.isArray(raw)
? raw
: ((raw as Record<string, unknown>)?.repositories ?? []);
if (Array.isArray(items)) {
repoList = (items as Record<string, unknown>[]).map(r => ({
owner: String((r.owner as Record<string, unknown>)?.login ?? r.owner ?? ''),
repo: String(r.name ?? ''),
fullName: String(
r.full_name ?? `${(r.owner as Record<string, unknown>)?.login ?? r.owner}/${r.name}`
),
private: r.private as boolean | undefined,
defaultBranch: r.default_branch as string | undefined,
}));
}
View on GitHub (pinned to a221052e0d)
Solutions
- Open Connections and verify the GitHub (Composio) connection is ACTIVE; reconnect if stale
- Retry after a short wait — rate limits are transient
- Run the same action from the Composio dashboard to see the underlying error and check Composio service status
Defensive patterns
Strategy: try-catch
Validate before calling
// Check connection freshness before loading the picker:
const conns = await listConnections();
const gh = conns.connections?.find(c =>
c.toolkit.toLowerCase().includes('github') &&
(c.status === 'ACTIVE' || c.status === 'CONNECTED')
);
if (!gh) { /* show connect-GitHub prompt instead of fetching */ } Type guard
const isActiveGithub = (c: { toolkit: string; status: string }): boolean =>
c.toolkit.toLowerCase().includes('github') &&
(c.status === 'ACTIVE' || c.status === 'CONNECTED'); Try / catch
try {
await loadRepos();
} catch (e) {
const msg = e instanceof Error ? e.message : String(e);
if (msg === 'NOT_CONNECTED') { promptConnectGithub(); return; }
if (msg === 'Failed to fetch repositories') { showRetryWithComposioHint(); return; }
throw e;
} Prevention
- Keep the Composio GitHub connection ACTIVE; re-auth when tokens expire
- Handle 'NOT_CONNECTED' separately from the generic fetch failure
- Retry once after a minute before assuming breakage — rate limits resolve quickly
When it happens
Trigger: Composio executes the action but reports failure with res.error empty: rate limit, expired Composio connection token, or a GitHub API error swallowed upstream.
Common situations: Composio GitHub connection went stale and needs re-auth; Composio outage or throttling; OAuth grant revoked on the GitHub side.
Related errors
- Failed to fetch repositories
- Failed to list branches
- Not running in Tauri
- gh failed (${r.status}): ${r.stderr?.trim() || "unknown erro
- gh api failed (${list.status}): ${list.stderr?.trim() || "un
AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16).
Data as JSON: /api/errors/a63e15358d51cc11.
Report an issue: GitHub.