openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
205 lines (204 loc) • 8.66 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js";
import { i as normalizeProviderId } from "./provider-id-Dq06Bcx6.js";
import { r as buildModelCatalogMergeKey } from "./model-catalog-normalize-CkJjoy4K.js";
import { p as resolvePluginControlPlaneFingerprint } from "./current-plugin-metadata-snapshot-CfA_n2Nc.js";
import { i as getCurrentPluginMetadataSnapshotState, n as registerPluginMetadataProcessMemoLifecycleClear } from "./plugin-metadata-lifecycle-C3dWg4tn.js";
import { o as resolvePluginMetadataSnapshotMemoEnvFingerprint } from "./plugin-metadata-snapshot-Ctk9Oarq.js";
import { n as planManifestModelCatalogSuppressions } from "./manifest-planner-BRQyTcMi.js";
import "./model-catalog-DfA8Fq9U.js";
import { n as isManifestPluginAvailableForControlPlane, s as loadManifestMetadataSnapshot } from "./manifest-contract-eligibility-DEeoLRlM.js";
//#region src/plugins/manifest-model-suppression.ts
function listManifestModelCatalogSuppressions(params) {
const snapshot = loadManifestMetadataSnapshot({
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env
});
return planManifestModelCatalogSuppressions({ registry: {
diagnostics: snapshot.diagnostics,
plugins: snapshot.plugins.filter((plugin) => isManifestPluginAvailableForControlPlane({
snapshot,
plugin,
config: params.config
}))
} }).suppressions;
}
function buildManifestSuppressionError(params) {
const ref = `${params.provider}/${params.modelId}`;
return params.reason ? `Unknown model: ${ref}. ${params.reason}` : `Unknown model: ${ref}.`;
}
function normalizeBaseUrlHost(baseUrl) {
const trimmed = baseUrl?.trim();
if (!trimmed) return "";
try {
return normalizeSuppressionHost(new URL(trimmed).hostname);
} catch {
return "";
}
}
function normalizeSuppressionHost(host) {
return normalizeLowercaseStringOrEmpty(host).replace(/\.+$/, "");
}
function resolveConfiguredProviderValue(params) {
const providers = params.config?.models?.providers;
if (!providers) return;
for (const [providerId, entry] of Object.entries(providers)) {
if (normalizeLowercaseStringOrEmpty(providerId) !== params.provider) continue;
return {
api: normalizeLowercaseStringOrEmpty(entry?.api),
baseUrl: typeof entry?.baseUrl === "string" ? entry.baseUrl : void 0
};
}
}
function manifestSuppressionMatchesConditions(params) {
const when = params.suppression.when;
if (!when) return true;
const configuredProvider = resolveConfiguredProviderValue({
provider: params.provider,
config: params.config
});
if (when.providerConfigApiIn?.length) {
const allowedApis = new Set(when.providerConfigApiIn.map(normalizeLowercaseStringOrEmpty));
const effectiveApi = configuredProvider ? normalizeLowercaseStringOrEmpty(configuredProvider.api) : params.provider;
if (!effectiveApi || !allowedApis.has(effectiveApi)) return false;
}
if (when.baseUrlHosts?.length) {
const baseUrlHost = normalizeBaseUrlHost(params.baseUrl ?? configuredProvider?.baseUrl);
if (!baseUrlHost) return false;
if (!new Set(when.baseUrlHosts.map(normalizeSuppressionHost)).has(baseUrlHost)) return false;
}
return true;
}
function buildManifestBuiltInModelSuppressionResolver(params) {
const suppressions = listManifestModelCatalogSuppressions({
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env ?? process.env
});
return (input) => {
const provider = normalizeLowercaseStringOrEmpty(input.provider);
const modelId = normalizeLowercaseStringOrEmpty(input.id);
if (!provider || !modelId) return;
const mergeKey = buildModelCatalogMergeKey(provider, modelId);
const suppression = suppressions.find((entry) => entry.mergeKey === mergeKey && (!input.unconditionalOnly || !entry.when) && manifestSuppressionMatchesConditions({
suppression: entry,
provider,
baseUrl: input.baseUrl,
config: params.config
}));
if (!suppression) return;
return {
suppress: true,
errorMessage: buildManifestSuppressionError({
provider,
modelId,
reason: suppression.reason
})
};
};
}
//#endregion
//#region src/agents/model-suppression.ts
/**
* Built-in model suppression helpers.
* Resolves plugin manifest suppression rules with process-local caching so
* built-in catalog entries can be hidden or blocked consistently.
*/
let cachedManifestSuppressionResolver;
/** Clear cached manifest suppression resolver state for tests and metadata lifecycle resets. */
function clearModelSuppressionResolverCacheForTest() {
cachedManifestSuppressionResolver = void 0;
}
registerPluginMetadataProcessMemoLifecycleClear(clearModelSuppressionResolverCacheForTest);
function resolveCachedManifestSuppressionResolver(params) {
const cached = cachedManifestSuppressionResolver;
const controlPlaneFingerprint = resolvePluginControlPlaneFingerprint({
...params.config ? { config: params.config } : {},
env: params.env,
...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {}
});
const cwd = process.cwd();
const envFingerprint = resolvePluginMetadataSnapshotMemoEnvFingerprint(params.env);
const metadataSnapshot = getCurrentPluginMetadataSnapshotState().snapshot;
if (cached !== void 0 && cached.config === params.config && cached.controlPlaneFingerprint === controlPlaneFingerprint && cached.cwd === cwd && cached.envFingerprint === envFingerprint && cached.metadataSnapshot === metadataSnapshot && cached.workspaceDir === params.workspaceDir) return cached.resolver;
const resolver = buildManifestBuiltInModelSuppressionResolver({
env: params.env,
...params.config ? { config: params.config } : {},
...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {}
});
cachedManifestSuppressionResolver = {
config: params.config,
controlPlaneFingerprint,
cwd,
envFingerprint,
metadataSnapshot,
resolver,
workspaceDir: params.workspaceDir
};
return resolver;
}
function resolveBuiltInModelSuppressionFromManifest(params) {
const provider = normalizeProviderId(params.provider ?? "");
const modelId = normalizeLowercaseStringOrEmpty(params.id);
if (!provider || !modelId) return;
return resolveCachedManifestSuppressionResolver({
env: process.env,
...params.config ? { config: params.config } : {},
...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {}
})({
provider,
id: modelId,
...params.baseUrl ? { baseUrl: params.baseUrl } : {},
...params.unconditionalOnly !== void 0 ? { unconditionalOnly: params.unconditionalOnly } : {}
});
}
function resolveBuiltInModelSuppression(params) {
const manifestResult = resolveBuiltInModelSuppressionFromManifest(params);
if (manifestResult?.suppress) return manifestResult;
const provider = normalizeProviderId(params.provider ?? "");
const modelId = normalizeLowercaseStringOrEmpty(params.id);
if (!provider || !modelId) return;
}
/** Return true when plugin manifest metadata suppresses a built-in model entry. */
function shouldSuppressBuiltInModelFromManifest(params) {
return resolveBuiltInModelSuppressionFromManifest(params)?.suppress ?? false;
}
/** Return true when any built-in suppression rule applies to a model entry. */
function shouldSuppressBuiltInModel(params) {
return resolveBuiltInModelSuppression(params)?.suppress ?? false;
}
/**
* Return true only for unconditional manifest suppressions.
* Inline model entries may override conditional suppressions, but not absolute
* provider capability blocks.
*/
function shouldUnconditionallySuppress(params) {
return resolveBuiltInModelSuppressionFromManifest({
...params,
unconditionalOnly: true
})?.suppress ?? false;
}
/** Resolve the user-facing suppression error message for a built-in model. */
function buildSuppressedBuiltInModelError(params) {
return resolveBuiltInModelSuppression(params)?.errorMessage;
}
/** Build a reusable suppression predicate for repeated catalog filtering. */
function buildShouldSuppressBuiltInModel(params) {
const resolver = buildManifestBuiltInModelSuppressionResolver({
env: process.env,
...params.config ? { config: params.config } : {},
...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {}
});
return (input) => {
const provider = normalizeProviderId(input.provider ?? "");
const id = normalizeLowercaseStringOrEmpty(input.id);
if (!provider || !id) return false;
return resolver({
provider,
id,
...input.baseUrl ? { baseUrl: input.baseUrl } : {}
})?.suppress ?? false;
};
}
//#endregion
export { shouldUnconditionallySuppress as a, shouldSuppressBuiltInModelFromManifest as i, buildSuppressedBuiltInModelError as n, shouldSuppressBuiltInModel as r, buildShouldSuppressBuiltInModel as t };