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 honouredView on GitHub (pinned to a221052e0d)
Solutions
- Inspect the workspace agents override directory for an entry that removed/renamed integrations_agent and restore it.
- Retry once to rule out a concurrent registry reload window.
- List current ids (registry.list() via the debug dump-all path) to confirm whether integrations_agent is present.
- 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
- Never delete or rename built-in agent ids in workspace overrides — extend them instead.
- After editing override TOMLs, verify with a dump-all that builtins still resolve.
- Keep the override directory out of concurrent multi-process writes.
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
- integrations_agent definition not in registry
- integrations_agent must use PromptSource::Dynamic; got {:?}
- agent registry rejected after merging workspace overrides fr
- agent definition '{}' not found in registry
- AgentDefinitionRegistry missing after init
AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16).
Data as JSON: /api/errors/5f2bab7061436b5f.
Report an issue: GitHub.