openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
77 lines (76 loc) • 3.22 kB
JavaScript
import { t as normalizeLowercaseStringOrEmpty } from "./string-utils-BtCofrRx.js";
//#region packages/memory-host-sdk/src/host/multimodal.ts
const MEMORY_MULTIMODAL_SPECS = {
image: {
labelPrefix: "Image file",
extensions: [
".jpg",
".jpeg",
".png",
".webp",
".gif",
".heic",
".heif"
]
},
audio: {
labelPrefix: "Audio file",
extensions: [
".mp3",
".wav",
".ogg",
".opus",
".m4a",
".aac",
".flac"
]
}
};
/** All supported multimodal memory modalities in stable config order. */
const MEMORY_MULTIMODAL_MODALITIES = Object.keys(MEMORY_MULTIMODAL_SPECS);
/** Default max bytes for one multimodal memory file. */
const DEFAULT_MEMORY_MULTIMODAL_MAX_FILE_BYTES = 10 * 1024 * 1024;
/** Normalize user modality selections to supported modalities. */
function normalizeMemoryMultimodalModalities(raw) {
if (raw === void 0 || raw.includes("all")) return [...MEMORY_MULTIMODAL_MODALITIES];
const normalized = /* @__PURE__ */ new Set();
for (const value of raw) if (value === "image" || value === "audio") normalized.add(value);
return Array.from(normalized);
}
/** Normalize user multimodal settings, including disabled-state empty modality list. */
function normalizeMemoryMultimodalSettings(raw) {
const enabled = raw.enabled === true;
const maxFileBytes = typeof raw.maxFileBytes === "number" && Number.isFinite(raw.maxFileBytes) ? Math.max(1, Math.floor(raw.maxFileBytes)) : DEFAULT_MEMORY_MULTIMODAL_MAX_FILE_BYTES;
return {
enabled,
modalities: enabled ? normalizeMemoryMultimodalModalities(raw.modalities) : [],
maxFileBytes
};
}
/** Return true when multimodal memory ingestion has at least one enabled modality. */
function isMemoryMultimodalEnabled(settings) {
return settings.enabled && settings.modalities.length > 0;
}
/** Return accepted file extensions for a modality. */
function getMemoryMultimodalExtensions(modality) {
return MEMORY_MULTIMODAL_SPECS[modality].extensions;
}
/** Build the text label that accompanies embedded multimodal file content. */
function buildMemoryMultimodalLabel(modality, normalizedPath) {
return `${MEMORY_MULTIMODAL_SPECS[modality].labelPrefix}: ${normalizedPath}`;
}
/** Build a glob that matches an extension case-insensitively for QMD sources. */
function buildCaseInsensitiveExtensionGlob(extension) {
const normalized = normalizeLowercaseStringOrEmpty(extension).replace(/^\./, "");
if (!normalized) return "*";
return `*.${Array.from(normalized, (char) => `[${char.toLowerCase()}${char.toUpperCase()}]`).join("")}`;
}
/** Classify a file path into a supported multimodal modality under current settings. */
function classifyMemoryMultimodalPath(filePath, settings) {
if (!isMemoryMultimodalEnabled(settings)) return null;
const lower = normalizeLowercaseStringOrEmpty(filePath);
for (const modality of settings.modalities) for (const extension of getMemoryMultimodalExtensions(modality)) if (lower.endsWith(extension)) return modality;
return null;
}
//#endregion
export { isMemoryMultimodalEnabled as a, getMemoryMultimodalExtensions as i, buildMemoryMultimodalLabel as n, normalizeMemoryMultimodalSettings as o, classifyMemoryMultimodalPath as r, buildCaseInsensitiveExtensionGlob as t };