{"record":{"id":"c86d2dbb62ebb361","repo":"github/copilot-sdk","slug":"builtin-plugin-directories-must-contain-only-absol","errorCode":null,"errorMessage":"builtin_plugin_directories must contain only absolute paths: {path}","messagePattern":"builtin_plugin_directories must contain only absolute paths: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/copilot/client.py","lineNumber":1681,"sourceCode":"            telemetry=telemetry,\n            session_fs=session_fs,\n            request_handler=request_handler,\n            session_idle_timeout_seconds=session_idle_timeout_seconds,\n            enable_remote_sessions=enable_remote_sessions,\n            client_info=client_info,\n            on_list_models=on_list_models,\n            on_github_telemetry=on_github_telemetry,\n            mode=mode,\n        )\n        connection = (\n            options.connection\n            if options.connection is not None\n            else _resolve_default_connection(os.environ)\n        )\n        _validate_environment_options(options, connection)\n        for path in options.builtin_plugin_directories:\n            if not os.path.isabs(path):\n                raise ValueError(\n                    f\"builtin_plugin_directories must contain only absolute paths: {path}\"\n                )\n        _require_storage_for_empty_mode(\n            mode=options.mode,\n            base_directory=options.base_directory,\n            session_fs_set=options.session_fs is not None,\n            is_uri_connection=isinstance(connection, UriRuntimeConnection),\n        )\n\n        self._options: _CopilotClientOptions = options\n        self._connection: RuntimeConnection = connection\n        self._on_list_models = options.on_list_models\n        self._on_github_telemetry = options.on_github_telemetry\n\n        # Resolve connection-mode-specific state.\n        self._actual_host: str = \"localhost\"\n        self._is_external_server: bool = isinstance(connection, UriRuntimeConnection)\n        self._cli_path_source: str | None = None","sourceCodeStart":1663,"sourceCodeEnd":1699,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/python/copilot/client.py#L1663-L1699","documentation":"builtin_plugin_directories must contain only absolute paths. During CopilotClient construction each entry is checked with os.path.isabs(); a relative path raises ValueError because the runtime cannot reliably resolve relative plugin directories.","triggerScenarios":"Passing a relative path like 'plugins' or './plugins' in options.builtin_plugin_directories when constructing the client.","commonSituations":"Hardcoded relative paths in config; paths built from user input without resolution; working directory differs between dev and prod so a previously working relative path moved.","solutions":["Convert each entry with os.path.abspath()/Path.resolve() before passing","Store absolute paths in configuration files","Compute plugin directories from a known base at startup"],"exampleFix":"// before\nclient = CopilotClient(builtin_plugin_directories=[\"plugins\"])\n// after\nclient = CopilotClient(builtin_plugin_directories=[os.path.abspath(\"plugins\")])","handlingStrategy":"validation","validationCode":"bad = [p for p in dirs if not os.path.isabs(p)]\nif bad:\n    raise ValueError(f\"relative plugin paths: {bad}\")\nclient = CopilotClient(builtin_plugin_directories=dirs)","typeGuard":"def all_absolute(paths: list[str]) -> bool:\n    return all(os.path.isabs(p) for p in paths)","tryCatchPattern":"try:\n    client = CopilotClient(builtin_plugin_directories=dirs)\nexcept ValueError as e:\n    if \"absolute paths\" in str(e):\n        dirs = [os.path.abspath(p) for p in dirs]\n        client = CopilotClient(builtin_plugin_directories=dirs)","preventionTips":["Always resolve config-supplied paths with Path.resolve() at load time","Store absolute paths in configuration","Check os.path.isabs() in a config validation step at startup"],"tags":["python","paths","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}