Spracherkennung für: .ts vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]
import type { MsgContext } from "../auto-reply/templating.js";
import type { OpenClawConfig } from "../config/types.js";
import { loadBundledPluginPublicArtifactModuleSync } from "../plugins/public-surface-loader.js";
import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js";
type ChannelMediaContractApi = {
resolveInboundAttachmentRoots?: (params: {
cfg: OpenClawConfig;
accountId?: string;
}) => readonly string[] | undefined;
resolveRemoteInboundAttachmentRoots?: (params: {
cfg: OpenClawConfig;
accountId?: string;
}) => readonly string[] | undefined;
};
type ChannelMediaRootResolver = keyof ChannelMediaContractApi;
const mediaContractApiByResolver = new Map<string, ChannelMediaContractApi | null>();
function mediaContractCacheKey(channelId: string, resolver: ChannelMediaRootResolver): string {
return `${channelId}:${resolver}`;
}
function loadChannelMediaContractApi(
channelId: string,
resolver: ChannelMediaRootResolver,
): ChannelMediaContractApi | undefined {
const cacheKey = mediaContractCacheKey(channelId, resolver);
if (mediaContractApiByResolver.has(cacheKey)) {
return mediaContractApiByResolver.get(cacheKey) ?? undefined;
}
try {
const loaded = loadBundledPluginPublicArtifactModuleSync<ChannelMediaContractApi>({
dirName: channelId,
artifactBasename: "media-contract-api.js",
});
if (typeof loaded[resolver] === "function") {
mediaContractApiByResolver.set(cacheKey, loaded);
return loaded;
}
} catch (error) {
if (
!(
error instanceof Error &&
error.message.startsWith("Unable to resolve bundled plugin public surface ")
)
) {
throw error;
}
}
mediaContractApiByResolver.set(cacheKey, null);
return undefined;
}
function findChannelMediaContractApi(
channelId: string | null | undefined,
resolver: ChannelMediaRootResolver,
) {
const normalized = normalizeOptionalLowercaseString(channelId);
if (!normalized) {
return undefined;
}
return loadChannelMediaContractApi(normalized, resolver);
}
export function resolveChannelInboundAttachmentRoots(params: {
cfg: OpenClawConfig;
ctx: MsgContext;
}): readonly string[] | undefined {
const contractApi = findChannelMediaContractApi(
params.ctx.Surface ?? params.ctx.Provider,
"resolveInboundAttachmentRoots",
);
if (contractApi?.resolveInboundAttachmentRoots) {
return contractApi.resolveInboundAttachmentRoots({
cfg: params.cfg,
accountId: params.ctx.AccountId,
});
}
return undefined;
}
export function resolveChannelRemoteInboundAttachmentRoots(params: {
cfg: OpenClawConfig;
ctx: MsgContext;
}): readonly string[] | undefined {
const contractApi = findChannelMediaContractApi(
params.ctx.Surface ?? params.ctx.Provider,
"resolveRemoteInboundAttachmentRoots",
);
if (contractApi?.resolveRemoteInboundAttachmentRoots) {
return contractApi.resolveRemoteInboundAttachmentRoots({
cfg: params.cfg,
accountId: params.ctx.AccountId,
});
}
return undefined;
}
¤ Dauer der Verarbeitung: 0.25 Sekunden
(vorverarbeitet am 2026-04-27)
¤
*© Formatika GbR, Deutschland