diff --git a/server/src/routes/adapters.ts b/server/src/routes/adapters.ts
index fdeb64d2..09761412 100644
--- a/server/src/routes/adapters.ts
+++ b/server/src/routes/adapters.ts
@@ -63,6 +63,8 @@ interface AdapterInfo {
modelsCount: number;
loaded: boolean;
disabled: boolean;
+ /** True when an external plugin has replaced a built-in adapter of the same type. */
+ overriddenBuiltin?: boolean;
version?: string;
packageName?: string;
isLocalPath?: boolean;
@@ -105,6 +107,7 @@ function buildAdapterInfo(adapter: ServerAdapterModule, externalRecord: AdapterP
modelsCount: (adapter.models ?? []).length,
loaded: true, // If it's in the registry, it's loaded
disabled: disabledSet.has(adapter.type),
+ overriddenBuiltin: externalRecord ? BUILTIN_ADAPTER_TYPES.has(adapter.type) : undefined,
// Prefer on-disk package.json so the UI reflects bumps without relying on store-only fields.
version: fromDisk ?? externalRecord?.version,
packageName: externalRecord?.packageName,
diff --git a/ui/src/api/adapters.ts b/ui/src/api/adapters.ts
index dea60394..201c5bee 100644
--- a/ui/src/api/adapters.ts
+++ b/ui/src/api/adapters.ts
@@ -17,6 +17,8 @@ export interface AdapterInfo {
packageName?: string;
/** Whether the adapter was installed from a local path (vs npm). */
isLocalPath?: boolean;
+ /** True when an external plugin has replaced a built-in adapter of the same type. */
+ overriddenBuiltin?: boolean;
}
export interface AdapterInstallResult {
diff --git a/ui/src/pages/AdapterManager.tsx b/ui/src/pages/AdapterManager.tsx
index e41b9ca3..f7f4577d 100644
--- a/ui/src/pages/AdapterManager.tsx
+++ b/ui/src/pages/AdapterManager.tsx
@@ -63,6 +63,11 @@ function AdapterRow({
{adapter.label || getAdapterLabel(adapter.type)}
{adapter.source === "external" ? "External" : "Built-in"}
+ {adapter.overriddenBuiltin && (
+
+ Overrides built-in
+
+ )}
{adapter.source === "external" && (
adapter.isLocalPath
?