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

  1. Open Connections and verify the GitHub (Composio) connection is ACTIVE; reconnect if stale
  2. Retry after a short wait — rate limits are transient
  3. 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

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


AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16). Data as JSON: /api/errors/a63e15358d51cc11. Report an issue: GitHub.