{"record":{"id":"34f91a9396b085e3","repo":"langchain-ai/deepagents","slug":"plugin-plugin-id-has-an-unusable-source-path-r","errorCode":null,"errorMessage":"Plugin {plugin_id} has an unusable source path ({rejections})","messagePattern":"Plugin (.+?) has an unusable source path \\((.+?)\\)","errorType":"exception","errorClass":"MarketplaceError","httpStatus":null,"severity":"error","filePath":"libs/code/deepagents_code/plugins/discovery.py","lineNumber":422,"sourceCode":"                            (\n                                plugin\n                                for plugin in marketplace.plugins\n                                if plugin.name == plugin_name\n                            ),\n                            None,\n                        )\n                        if entry is None:\n                            msg = (\n                                f\"Plugin {plugin_id!r} not found in marketplace \"\n                                f\"{marketplace_name}\"\n                            )\n                            raise MarketplaceError(msg)\n                        update_rejections: list[str] = []\n                        source_root = materialize_plugin_source(\n                            marketplace, entry, rejections=update_rejections\n                        )\n                        if source_root is None:\n                            raise MarketplaceError(\n                                unresolved_source_message(\n                                    plugin_id, entry, update_rejections\n                                )\n                            )\n                        manifest, _manifest_path, _warnings = load_manifest(\n                            source_root, fallback_name=entry.name\n                        )\n                        if (\n                            manifest is None\n                            or manifest.name != plugin_name\n                            or not manifest.auto_update\n                            or not manifest.version\n                            or manifest.version == installed_entry.version\n                        ):\n                            continue\n\n                        cache_and_register_plugin(\n                            plugin_id,","sourceCodeStart":404,"sourceCodeEnd":440,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/code/deepagents_code/plugins/discovery.py#L404-L440","documentation":"During `auto_update_plugins`, after finding the plugin entry, its source is materialized with `materialize_plugin_source`, which appends reasons to `update_rejections` and returns `None` when the source cannot be used. In that case `unresolved_source_message(plugin_id, entry, update_rejections)` is raised as this `MarketplaceError`, naming the unusable source path and the rejection reasons.","triggerScenarios":"`auto_update_plugins()` runs and the plugin's marketplace entry declares a source that cannot be materialized: unsupported source type, missing directory/file, or a source path rejected by security checks (see the `rejections` list in the message).","commonSituations":"Marketplace entry points at a path that was deleted or renamed upstream; source path lacks the required form (e.g. absolute or Windows-absolute paths rejected); git checkout fails so the source directory doesn't exist; symlink-based sources escaping the marketplace root.","solutions":["Read the `({rejections})` suffix for the exact rejection reasons.","Fix the `source` in the marketplace entry (existing, supported, in-root path).","Verify the referenced path exists after any git materialization; retry the update.","If the upstream source is gone, uninstall the plugin or switch to a marketplace that still hosts it."],"exampleFix":"// before\n{\"name\": \"code-review\", \"source\": \"/abs/path/outside\"}\n// after\n{\"name\": \"code-review\", \"source\": \"./plugins/code-review\"}","handlingStrategy":"validation","validationCode":"from pathlib import Path\nsource = entry[\"source\"]\nassert not Path(source).is_absolute() and not source.startswith(\"..\"), f\"bad source: {source}\"\nassert (marketplace_root / source.lstrip(\"./\")).exists(), \"source path missing\"","typeGuard":null,"tryCatchPattern":"try:\n    auto_update_plugins()\nexcept MarketplaceError as exc:\n    if \"unusable source path\" in str(exc):\n        print(f\"fix marketplace entry source: {exc}\")  # rejections explain why","preventionTips":["Use in-root relative paths for plugin sources in marketplace entries.","Verify referenced directories exist after any git materialization step.","Never declare absolute or Windows-absolute source paths.","Check the `rejections` text in the message before changing configuration."],"tags":["plugins","marketplace","auto-update","source-path"],"backgroundTag":"unresolved-plugin-source","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}