tinyhumansai/openhuman · error
config load: {e}
Error message
config load: {e} What it means
notify_user rejected its input: the 'message' argument was absent, not a string, or whitespace-only after trimming. This is the argument-validation guard for the outward-facing notification tool; nothing was sent to the user.
Source
Thrown at src/openhuman/subconscious/user_thread.rs:127
PermissionLevel::Write
}
fn scope(&self) -> ToolScope {
ToolScope::AgentOnly
}
async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {
let message = args
.get("message")
.and_then(|v| v.as_str())
.map(str::trim)
.filter(|s| !s.is_empty())
.ok_or_else(|| anyhow::anyhow!("notify_user: `message` is required and non-empty"))?;
let subject = args.get("subject").and_then(|v| v.as_str());
let config = crate::openhuman::config::load_config_with_timeout()
.await
.map_err(|e| anyhow::anyhow!("config load: {e}"))?;
notify_user(config.workspace_dir, message, subject);
Ok(ToolResult::success(
"Message delivered to the user.".to_string(),
))
}
}
/// All user-facing-thread tools, for registration into the tool registry.
pub fn all_user_thread_tools() -> Vec<Box<dyn Tool>> {
vec![Box::new(NotifyUserTool)]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]View on GitHub (pinned to 7491200858)
Solutions
- Pass a non-empty string in the 'message' argument
- Trimmed-only whitespace does not count as a message; provide real content
- Optionally add a 'subject' string as well
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/openhuman/subconscious/user_thread.rs:127 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/fabb3eb1fea9950f.
Report an issue: GitHub.