feat(adapters): add overriddenBuiltin flag to API and Adapter Manager UI

When an external plugin overrides a built-in adapter type, the
GET /api/adapters response now includes overriddenBuiltin: true. The
Adapter Manager shows an 'Overrides built-in' badge on such adapters.
This commit is contained in:
HenkDz 2026-04-03 22:25:27 +01:00
parent 2a2fa31a03
commit fb3aabb743
3 changed files with 10 additions and 0 deletions

View file

@ -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,

View file

@ -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 {

View file

@ -63,6 +63,11 @@ function AdapterRow({
{adapter.label || getAdapterLabel(adapter.type)}
</span>
<Badge variant="outline">{adapter.source === "external" ? "External" : "Built-in"}</Badge>
{adapter.overriddenBuiltin && (
<Badge variant="secondary" className="text-blue-600 border-blue-400">
Overrides built-in
</Badge>
)}
{adapter.source === "external" && (
adapter.isLocalPath
? <FolderOpen className="h-4 w-4 text-amber-500" title="Installed from local path" />