openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
151 lines (150 loc) • 7.7 kB
JavaScript
import { c as normalizeOptionalLowercaseString } from "./string-coerce-CIXf7egm.js";
import { t as compileSafeRegex } from "./safe-regex-BQnlv3bA.js";
import { s as normalizePluginId } from "./config-state-BkU1frVq.js";
import "./installed-plugin-index-config-path-scope-BAeCI-f_.js";
//#region src/plugins/installed-plugin-index-scope-lookup.ts
const PROVIDER_CONTRIBUTION_CONTRACTS = [
"externalAuthProviders",
"embeddingProviders",
"speechProviders",
"realtimeTranscriptionProviders",
"realtimeVoiceProviders",
"mediaUnderstandingProviders",
"meetingNotesSourceProviders",
"imageGenerationProviders",
"videoGenerationProviders",
"musicGenerationProviders",
"webFetchProviders",
"webSearchProviders",
"workerProviders",
"usageProviders"
];
function appendOwner(owners, rawKey, pluginId) {
const key = normalizeOptionalLowercaseString(rawKey);
if (!key) return;
const existing = owners.get(key);
if (existing) {
existing.push(pluginId);
return;
}
owners.set(key, [pluginId]);
}
function freezeOwnerMap(owners) {
return new Map([...owners.entries()].map(([key, pluginIds]) => [key, Object.freeze([...new Set(pluginIds)])]));
}
function addOwners(target, owners, ids) {
for (const id of ids) {
const normalized = normalizeOptionalLowercaseString(id);
if (!normalized) continue;
for (const pluginId of owners.get(normalized) ?? []) target.add(pluginId);
}
}
function hasOwners(owners, ids) {
return ids.every((id) => {
const normalized = normalizeOptionalLowercaseString(id);
return Boolean(normalized && owners.has(normalized));
});
}
function listContributionValues(plugin, key) {
const value = plugin.contributions?.[key];
return Array.isArray(value) ? value : [];
}
function listContractContributionValues(plugin, key) {
const value = plugin.contributions?.contracts?.[key];
return Array.isArray(value) ? value : [];
}
function compileModelSupportPatterns(patterns) {
const compiled = [];
for (const pattern of patterns) {
const regex = compileSafeRegex(pattern, "u");
if (regex) compiled.push(regex);
}
return compiled;
}
function modelSupportOwnerMatches(owner, modelId) {
const trimmed = modelId.trim();
if (!trimmed) return false;
if (owner.prefixes.some((prefix) => trimmed.startsWith(prefix))) return true;
return owner.patterns.some((pattern) => pattern.test(trimmed));
}
function buildLookupMaps(index) {
const agentHarnessOwners = /* @__PURE__ */ new Map();
const channelContributionOwners = /* @__PURE__ */ new Map();
const directChannelOwners = /* @__PURE__ */ new Map();
const directProviderOwners = /* @__PURE__ */ new Map();
const pluginIdsByLowercase = /* @__PURE__ */ new Map();
const providerContributionOwners = /* @__PURE__ */ new Map();
const modelSupportOwners = [];
for (const plugin of index.plugins) {
const normalizedPluginId = normalizeOptionalLowercaseString(plugin.pluginId);
if (normalizedPluginId) {
pluginIdsByLowercase.set(normalizedPluginId, plugin.pluginId);
appendOwner(directChannelOwners, plugin.pluginId, plugin.pluginId);
appendOwner(directProviderOwners, plugin.pluginId, plugin.pluginId);
appendOwner(channelContributionOwners, plugin.pluginId, plugin.pluginId);
appendOwner(providerContributionOwners, plugin.pluginId, plugin.pluginId);
}
for (const runtimeId of plugin.startup.agentHarnesses) appendOwner(agentHarnessOwners, runtimeId, plugin.pluginId);
appendOwner(directChannelOwners, plugin.packageChannel?.id, plugin.pluginId);
appendOwner(channelContributionOwners, plugin.packageChannel?.id, plugin.pluginId);
for (const channelId of listContributionValues(plugin, "channels")) appendOwner(channelContributionOwners, channelId, plugin.pluginId);
for (const channelId of listContributionValues(plugin, "channelConfigs")) appendOwner(channelContributionOwners, channelId, plugin.pluginId);
for (const providerId of listContributionValues(plugin, "providers")) appendOwner(providerContributionOwners, providerId, plugin.pluginId);
for (const providerId of listContributionValues(plugin, "modelCatalogProviders")) appendOwner(providerContributionOwners, providerId, plugin.pluginId);
for (const providerId of listContributionValues(plugin, "autoEnableProviderIds")) appendOwner(providerContributionOwners, providerId, plugin.pluginId);
for (const contract of PROVIDER_CONTRIBUTION_CONTRACTS) for (const providerId of listContractContributionValues(plugin, contract)) appendOwner(providerContributionOwners, providerId, plugin.pluginId);
modelSupportOwners.push({
pluginId: plugin.pluginId,
prefixes: listContributionValues(plugin, "modelSupportPrefixes"),
patterns: compileModelSupportPatterns(listContributionValues(plugin, "modelSupportPatterns"))
});
}
return {
agentHarnessOwners: freezeOwnerMap(agentHarnessOwners),
channelContributionOwners: freezeOwnerMap(channelContributionOwners),
directChannelOwners: freezeOwnerMap(directChannelOwners),
directProviderOwners: freezeOwnerMap(directProviderOwners),
installedPluginIds: new Set(pluginIdsByLowercase.keys()),
modelSupportOwners,
pluginIdsByLowercase,
providerContributionOwners: freezeOwnerMap(providerContributionOwners)
};
}
function createInstalledPluginIndexScopeLookup(index) {
const maps = buildLookupMaps(index);
const normalizeInstalledPluginId = (pluginId) => {
const normalized = normalizePluginId(pluginId);
const lowercase = normalizeOptionalLowercaseString(normalized);
return lowercase ? maps.pluginIdsByLowercase.get(lowercase) ?? normalized : normalized;
};
return {
addAgentHarnessOwners: (target, ids) => addOwners(target, maps.agentHarnessOwners, ids),
addChannelContributionOwners: (target, ids) => addOwners(target, maps.channelContributionOwners, ids),
addDirectChannelOwners: (target, ids) => addOwners(target, maps.directChannelOwners, ids),
addDirectProviderOwners: (target, ids) => addOwners(target, maps.directProviderOwners, ids),
addProviderContributionOwners: (target, ids) => addOwners(target, maps.providerContributionOwners, ids),
addShorthandModelOwners: (target, modelIds) => {
for (const modelId of modelIds) for (const owner of maps.modelSupportOwners) if (modelSupportOwnerMatches(owner, modelId)) target.add(owner.pluginId);
},
canResolveDirectProviderIds: (providerIds, scopePluginIds) => {
const normalizedScope = new Set([...scopePluginIds].map((pluginId) => normalizeOptionalLowercaseString(pluginId)).filter((pluginId) => Boolean(pluginId)));
return providerIds.every((providerId) => {
const normalized = normalizeOptionalLowercaseString(providerId);
return Boolean(normalized && (maps.directProviderOwners.has(normalized) || normalizedScope.has(normalized)));
});
},
hasChannelContributionOwners: (ids) => hasOwners(maps.channelContributionOwners, ids),
hasAgentHarnessOwners: (ids) => hasOwners(maps.agentHarnessOwners, ids),
hasCompleteConfigPathActivationMetadata: () => index.plugins.every((plugin) => !plugin.compat.includes("activation-config-path-hint") || plugin.startup.configPaths !== void 0),
hasDirectChannelOwners: (ids) => hasOwners(maps.directChannelOwners, ids),
hasInstalledPluginIds: (ids) => [...ids].every((pluginId) => {
const normalized = normalizeOptionalLowercaseString(pluginId);
return Boolean(normalized && maps.installedPluginIds.has(normalized));
}),
hasProviderContributionOwners: (ids) => hasOwners(maps.providerContributionOwners, ids),
hasShorthandModelOwners: (modelIds) => modelIds.every((modelId) => maps.modelSupportOwners.some((owner) => modelSupportOwnerMatches(owner, modelId))),
normalizePluginId: normalizeInstalledPluginId
};
}
//#endregion
export { createInstalledPluginIndexScopeLookup as t };