{"record":{"id":"3a2c6801b99a3d23","repo":"unionlabs/union","slug":"plugin-not-found","errorCode":null,"errorMessage":"plugin not found","messagePattern":"plugin not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"voyager/src/main.rs","lineNumber":190,"sourceCode":"                .build()\n                .await?;\n\n            info!(\"starting relay service\");\n\n            voyager.run().await;\n        }\n        Command::Plugin(cmd) => match cmd {\n            PluginCmd::Interest {\n                plugin_name,\n                message,\n            } => {\n                let plugin_config = get_voyager_config()?\n                    .plugins\n                    .into_iter()\n                    .try_find(|plugin_config| {\n                        <anyhow::Result<_>>::Ok(plugin_name == get_plugin_info(plugin_config)?.name)\n                    })?\n                    .ok_or(anyhow!(\"plugin not found\"))?;\n\n                let (filter, plugin_name) = make_filter(get_plugin_info(&plugin_config)?)?;\n\n                let result = run_filter(\n                    &filter,\n                    plugin_name,\n                    serde_json::from_str::<serde_json::Value>(&message)?.into(),\n                );\n\n                match result {\n                    Ok(JaqFilterResult::Take(tag)) => {\n                        println!(\"interest (take, {tag})\");\n                    }\n                    Ok(JaqFilterResult::Copy(tag)) => {\n                        println!(\"interest (copy, {tag})\");\n                    }\n                    Ok(JaqFilterResult::NoInterest) => println!(\"no interest\"),\n                    Err(()) => println!(\"failed\"),","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/voyager/src/main.rs#L172-L208","documentation":"Under 'voyager plugin interest', voyager loads the config, resolves each plugin entry's name via get_plugin_info (spawning/inspecting the plugin binary), and linearly searches for the user-supplied plugin_name. If no configured plugin's resolved name equals the argument, it errors 'plugin not found'. The comparison uses the plugin's self-reported name, not the config key or file name, which is why mismatches are common.","triggerScenarios":"Running 'voyager plugin interest --plugin-name <name> --message <json>' where <name> does not match get_plugin_info(plugin_config)?.name for any entry in config.plugins — e.g. using the binary filename, the config key, or a renamed plugin.","commonSituations":"Plugin renamed between versions while scripts keep the old name; using the plugin's crate/binary name instead of its registered name; a plugin binary missing on disk so its info resolution fails differently; typos.","solutions":["List the actual plugin names first (e.g. 'voyager plugin list' / the list subcommand) and use the exact resolved name.","Open your config file and check the plugins array; ensure the plugin you meant is present and its name matches what you pass.","If the plugin is missing, add its entry (path + config) to the config's plugins list.","Re-run with the corrected name; note the match is exact and case-sensitive."],"exampleFix":"# before\nvoyager --config cfg.json plugin interest --plugin-name voyager-client-eth --message '{...}'\n\n# after — use the resolved plugin name shown by `plugin list`\nvoyager --config cfg.json plugin list\nvoyager --config cfg.json plugin interest --plugin-name client-eth --message '{...}'","handlingStrategy":"validation","validationCode":"# validate the name against the config before invoking\njq -e --arg n \"$PLUGIN\" '.plugins[] | select(.name == $n)' voyager-config.json >/dev/null \\\n  || { echo \"plugin $PLUGIN not in config\"; exit 1; }\nvoyager --config voyager-config.json plugin interest --plugin-name \"$PLUGIN\" --message \"$MSG\"","typeGuard":"fn plugin_configured(config: &serde_json::Value, name: &str) -> bool {\n    config[\"plugins\"].as_array().map(|ps| ps.iter().any(|p| p[\"name\"] == name)).unwrap_or(false)\n}","tryCatchPattern":"let plugin = get_voyager_config()?.plugins.into_iter().find(|p| resolved_name(p)? == plugin_name)\n    .with_context(|| format!(\"plugin {plugin_name:?} not found — check `plugin list` for exact names\"))?;","preventionTips":["Call plugin list once per environment and source names from it in scripts.","Note the lookup uses the plugin's self-reported name — not the binary filename."],"tags":["voyager","plugin","configuration","cli","rust"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}