openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
64 lines (63 loc) • 3.27 kB
JavaScript
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-1VuiLaaR.mjs";
import { r as projectChatWorkContextForDisplay } from "./work-context-Cn4SLmAO.mjs";
import { n as extractInboundSenderLabel } from "./strip-inbound-meta-_xsoQtSF.mjs";
import { t as stripInternalMetadataForDisplay } from "./display-text-sanitize-BuJdluwh.mjs";
import { t as mapChatDisplayMessages } from "./chat-display-projection.map-DhKwEqLE.mjs";
import { t as stripUserEnvelopeForDisplay } from "./user-envelope-display-c4XHAD7a.mjs";
//#region src/gateway/chat-sanitize.ts
function extractMessageSenderLabel(entry) {
if (typeof entry.senderLabel === "string" && entry.senderLabel.trim()) return entry.senderLabel.trim();
if (typeof entry.content === "string") return extractInboundSenderLabel(entry.content);
if (Array.isArray(entry.content)) for (const item of entry.content) {
if (!item || typeof item !== "object") continue;
const text = item.text;
if (typeof text !== "string") continue;
const senderLabel = extractInboundSenderLabel(text);
if (senderLabel) return senderLabel;
}
if (typeof entry.text === "string") return extractInboundSenderLabel(entry.text);
return null;
}
function stripEnvelopeFromContentWithRole(content, role) {
const stripUserEnvelope = role === "user";
return mapChatDisplayMessages(content, (item) => {
if (!item || typeof item !== "object") return item;
const entry = item;
if (!(entry.type === "text" || role === "user" && entry.type === "input_text" || role === "assistant" && (entry.type === "input_text" || entry.type === "output_text")) || typeof entry.text !== "string") return item;
const stripped = stripUserEnvelope ? stripUserEnvelopeForDisplay(entry.text) : stripInternalMetadataForDisplay(entry.text);
return stripped === entry.text ? item : {
...entry,
text: stripped
};
});
}
/** Strips OpenClaw envelope metadata from one display message without mutating it. */
function stripEnvelopeFromMessage(message) {
if (!message || typeof message !== "object") return message;
const projected = projectChatWorkContextForDisplay(message);
const entry = projected;
const role = typeof entry.role === "string" ? normalizeLowercaseStringOrEmpty(entry.role) : "";
const stripUserEnvelope = role === "user";
let next;
const senderLabel = stripUserEnvelope ? extractMessageSenderLabel(entry) : null;
if (senderLabel && entry.senderLabel !== senderLabel) next = {
...entry,
senderLabel
};
const field = typeof entry.content === "string" || Array.isArray(entry.content) ? "content" : "text";
const content = entry[field];
if (typeof content === "string" || field === "content" && Array.isArray(content)) {
const stripped = Array.isArray(content) ? stripEnvelopeFromContentWithRole(content, role) : stripUserEnvelope ? stripUserEnvelopeForDisplay(content) : stripInternalMetadataForDisplay(content);
if (stripped !== content) {
next ??= { ...entry };
next[field] = stripped;
}
}
return next ?? projected;
}
/** Strips envelope metadata from a message array, preserving the original array when unchanged. */
function stripEnvelopeFromMessages(messages) {
return mapChatDisplayMessages(messages, stripEnvelopeFromMessage);
}
//#endregion
export { stripEnvelopeFromMessages as t };