Files
openclaw/src/plugins/embedding-providers.ts
Peter Steinberger e4d1b7e0d3 refactor(plugins): move plugin contributions into the registry bundle (#117372)
* refactor(plugins): move plugin contributions into the registry bundle

* fix(plugins): guard embedding owner union and drop unused test-util imports

* fix(plugins): break registry facade import cycles

* fix(plugins): remove obsolete registry snapshot seams

* test(gateway): preserve plugin runtime mock exports

* test(auto-reply): install builder registry in diagnostics fixture

* test(plugins): activate registry-backed capability fixtures
2026-08-01 06:57:01 -07:00

101 lines
3.5 KiB
TypeScript

import { CORE_EMBEDDING_PROVIDERS, getCoreEmbeddingProvider } from "./core-embedding-providers.js";
/** Registry for plugin-contributed embedding providers. */
import type {
EmbeddingProviderAdapter,
RegisteredEmbeddingProvider,
} from "./embedding-provider-types.js";
import {
assertDirectPluginRegistrationReplacement,
requireActivePluginRegistry,
resolveDirectPluginRegistrationOwner,
} from "./runtime.js";
export type {
EmbeddingInput,
EmbeddingProvider,
EmbeddingProviderAdapter,
EmbeddingProviderCallOptions,
EmbeddingProviderCreateOptions,
EmbeddingProviderCreateResult,
EmbeddingProviderIndexIdentity,
EmbeddingProviderRuntime,
RegisteredEmbeddingProvider,
} from "./embedding-provider-types.js";
function getEmbeddingProviders(): RegisteredEmbeddingProvider[] {
return requireActivePluginRegistry().embeddingProviders.map((entry) => ({
adapter: entry.provider,
ownerPluginId: entry.pluginId || undefined,
}));
}
/** Registers an embedding provider adapter for plugin and built-in memory callers. */
export function registerEmbeddingProvider(
adapter: EmbeddingProviderAdapter,
options?: { ownerPluginId?: string },
): void {
const coreEntry = getCoreEmbeddingProvider(adapter.id);
if (coreEntry) {
if (adapter !== coreEntry.adapter) {
throw new Error(`embedding provider already registered: ${adapter.id} (owner: core)`);
}
const registry = requireActivePluginRegistry();
registry.embeddingProviders = registry.embeddingProviders.filter(
(entry) => entry.provider.id !== adapter.id,
);
return;
}
const registry = requireActivePluginRegistry();
const pluginId = resolveDirectPluginRegistrationOwner(options?.ownerPluginId) ?? "";
const existingIndex = registry.embeddingProviders.findIndex(
(entry) => entry.provider.id === adapter.id,
);
if (existingIndex !== -1) {
assertDirectPluginRegistrationReplacement(
registry.embeddingProviders[existingIndex]?.pluginId || undefined,
`embedding provider ${adapter.id}`,
);
}
const entry = { pluginId, provider: adapter, source: "runtime" };
if (existingIndex === -1) {
registry.embeddingProviders.push(entry);
} else {
registry.embeddingProviders.splice(existingIndex, 1, entry);
}
}
/** Looks up the registered embedding provider entry, including owner metadata. */
export function getRegisteredEmbeddingProvider(
id: string,
): RegisteredEmbeddingProvider | undefined {
return (
getCoreEmbeddingProvider(id) ?? getEmbeddingProviders().find((entry) => entry.adapter.id === id)
);
}
/** Lists registered embedding providers with core defaults merged first. */
export function listRegisteredEmbeddingProviders(): RegisteredEmbeddingProvider[] {
const merged = new Map<string, RegisteredEmbeddingProvider>(
CORE_EMBEDDING_PROVIDERS.map((entry) => [entry.adapter.id, entry]),
);
for (const entry of getEmbeddingProviders()) {
if (!merged.has(entry.adapter.id)) {
merged.set(entry.adapter.id, entry);
}
}
return Array.from(merged.values());
} /** Replaces non-core embedding providers while preserving registration metadata. */
export function restoreRegisteredEmbeddingProviders(entries: RegisteredEmbeddingProvider[]): void {
clearEmbeddingProviders();
for (const entry of entries) {
registerEmbeddingProvider(entry.adapter, {
ownerPluginId: entry.ownerPluginId,
});
}
}
/** Clears non-core embedding providers from the process registry. */
export function clearEmbeddingProviders(): void {
requireActivePluginRegistry().embeddingProviders.length = 0;
}