tinyhumansai/openhuman · error · anyhow::Error

integrations_agent definition missing from registry

Error message

integrations_agent definition missing from registry

What it means

In render_integrations_agent (src/openhuman/agent/debug/mod.rs:341), after building the tool list, the code re-fetches the registry and `reg.get(INTEGRATIONS_AGENT_ID)` returns None. The registry existed moments earlier (tool scope was resolved from a definition_snapshot at 341's caller path), so the built-in integrations_agent has been removed/replaced by workspace overrides, or the global was swapped between reads.

Source

Thrown at src/openhuman/agent/debug/mod.rs:341

            }
        }
        ComposioClientKind::Direct(_) => {
            log::info!(
                "[agent::debug][composio-direct] direct mode active — skipping backend list_tools refresh for `{}`; using cached catalogue ({} actions)",
                integration.toolkit,
                integration.tools.len()
            );
        }
    }

    // Build the tool list that subagent_runner would produce for a
    // real spawn. Tool visibility honours the TOML scope on the
    // `integrations_agent` definition — `named = [...]` narrows, and
    // `wildcard = {}` means "every parent tool". The dynamic
    // ComposioActionTools for the bound toolkit are added after.
    let definition_snapshot = AgentDefinitionRegistry::global()
        .and_then(|reg| reg.get(INTEGRATIONS_AGENT_ID).cloned())
        .ok_or_else(|| anyhow!("integrations_agent definition missing from registry"))?;
    let base_tools: Vec<Box<dyn Tool>> = match &definition_snapshot.tools {
        crate::openhuman::agent::harness::definition::ToolScope::Named(names) => {
            let allow: HashSet<&str> = names.iter().map(|s| s.as_str()).collect();
            agent
                .tools()
                .iter()
                .filter(|t| allow.contains(t.name()))
                .map(|t| clone_tool_as_prompt_proxy(t.as_ref()))
                .collect()
        }
        crate::openhuman::agent::harness::definition::ToolScope::Wildcard => agent
            .tools()
            .iter()
            .map(|t| clone_tool_as_prompt_proxy(t.as_ref()))
            .collect(),
    };
    // `ComposioActionTool` takes `Arc<Config>` rather than a pre-baked
    // `ComposioClient` so the live `composio.mode` toggle is honoured

View on GitHub (pinned to a221052e0d)

Solutions

  1. Inspect the workspace agents override directory for an entry that removed/renamed integrations_agent and restore it.
  2. Retry once to rule out a concurrent registry reload window.
  3. List current ids (registry.list() via the debug dump-all path) to confirm whether integrations_agent is present.
  4. Remove the offending override file entirely to fall back to the bundled builtin set.

Example fix

# before: workspace override file deletes/replaces the builtin
# <workspace>/agents/overrides.toml renames integrations_agent -> integrations_helper
# after: restore the id or delete the override
rm <workspace>/agents/overrides.toml   # builtins (incl. integrations_agent) return
Defensive patterns

Strategy: validation

Validate before calling

let snapshot = AgentDefinitionRegistry::global()
    .and_then(|reg| reg.get("integrations_agent").cloned())
    .ok_or_else(|| {
        anyhow!("integrations_agent absent — check workspace agent overrides for a removal/rename")
    })?;

Type guard

fn registry_has_integrations_agent() -> bool {
    AgentDefinitionRegistry::global()
        .map(|reg| reg.get("integrations_agent").is_some())
        .unwrap_or(false)
}

Try / catch

match AgentDefinitionRegistry::global().and_then(|r| r.get(id).cloned()) {
    Some(def) => def,
    None => {
        // Registry present but id gone: surface which overrides are loaded
        // (workspace agents dir) and suggest removing them; retry once to
        // rule out a concurrent reload window.
    }
}

Prevention

When it happens

Trigger: A workspace agents TOML override that replaces built-ins removed the integrations_agent id (renamed it); registry reloaded between the snapshot read and this lookup; a custom DefinitionSource::Workspace set that shadows then drops the id.

Common situations: Users editing `<workspace>` agent override TOMLs and deleting/renaming the integrations_agent entry; two processes sharing a workspace while one rewrites overrides; stale override files from an older layout.

Related errors


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