openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
236 lines (235 loc) • 9.17 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs";
import { l as asNonNegativeFiniteNumber, u as asPositiveFiniteNumber } from "./number-coercion-CkhMiRw8.mjs";
import { c as isRecord, i as asOptionalObjectRecord } from "./record-coerce-TIsquoVR.mjs";
import { t as safeParseJson } from "./json-coercion-pfKbZnCJ.mjs";
import { t as AUTOMATIONS_TOOL_NAME } from "./automations-tool-name-DaxQ5QU2.mjs";
import { c as normalizeToolPolicyName } from "./tool-policy-shared-CNWjndK7.mjs";
import "./tool-policy-BrMCyUgN.mjs";
import { a as readToolResultDetails } from "./tool-result-error-CN2enaAJ.mjs";
import { r as getCoreTtsToolResultMediaUrls } from "./tts-tool-result-provenance-BbSbWcUn.mjs";
import { a as extractToolResultText } from "./embedded-agent-tool-results-D87rtFux.mjs";
//#region src/agents/harness/messaging-media.ts
const MESSAGE_MEDIA_KEYS = [
"media",
"mediaUrl",
"media_url",
"path",
"filePath",
"fileUrl",
"imageUrl",
"image_url"
];
const MESSAGE_MEDIA_ARRAY_KEYS = [
"mediaUrls",
"media_urls",
"imageUrls",
"image_urls"
];
const HARNESS_SCALAR_ALIASES = /* @__PURE__ */ new Set([
"media_url",
"imageUrl",
"image_url"
]);
const ATTACHMENT_MEDIA_KEYS = [
"media",
"mediaUrl",
"path",
"filePath",
"fileUrl",
"url"
];
function mapAgentHarnessMessagingMediaValues(args, mapValue, includeHarnessAliases = true) {
const mapString = (value) => typeof value === "string" ? mapValue(value) : value;
const mapArray = (values, map) => {
if (!Array.isArray(values)) return values;
const mapped = values.map(map);
return mapped.some((value, index) => value !== values[index]) ? mapped : values;
};
const mapRecord = (record, keys, message = false) => {
let mapped = record;
const assign = (key, value) => {
if (value !== record[key]) {
if (mapped === record) mapped = { ...record };
mapped[key] = value;
}
};
for (const key of keys) if (!message || includeHarnessAliases || !HARNESS_SCALAR_ALIASES.has(key)) assign(key, mapString(record[key]));
if (message) {
for (const key of includeHarnessAliases ? MESSAGE_MEDIA_ARRAY_KEYS : ["mediaUrls"]) assign(key, mapArray(record[key], mapString));
assign("attachments", mapArray(record.attachments, (attachment) => isRecord(attachment) ? mapRecord(attachment, ATTACHMENT_MEDIA_KEYS) : attachment));
}
return mapped;
};
return mapRecord(args, MESSAGE_MEDIA_KEYS, true);
}
/** Ordered references for delivery evidence; repeated sources remain distinct entries. */
function collectAgentHarnessMessagingMediaUrls(record) {
const urls = [];
mapAgentHarnessMessagingMediaValues(record, (value) => {
const trimmed = value.trim();
if (trimmed) urls.push(trimmed);
return value;
});
return urls;
}
//#endregion
//#region src/agents/embedded-agent-tool-media.ts
function pushUniqueMessagingMediaUrl(urls, value) {
const normalized = normalizeOptionalString(value);
if (normalized) urls.add(normalized);
}
function collectMessagingMediaUrlsFromRecord(record) {
const urls = /* @__PURE__ */ new Set();
mapAgentHarnessMessagingMediaValues(record, (value) => {
pushUniqueMessagingMediaUrl(urls, value);
return value;
}, false);
return [...urls];
}
function collectMessagingMediaUrlsFromToolResult(result) {
const records = [result, asOptionalObjectRecord(result)?.details];
const outputText = extractToolResultText(result);
if (outputText) records.push(safeParseJson(outputText));
return [...new Set(records.flatMap((value) => {
const record = asOptionalObjectRecord(value);
return record ? collectMessagingMediaUrlsFromRecord(record) : [];
}))];
}
const TRUSTED_TOOL_RESULT_MEDIA = /* @__PURE__ */ new Set([
"agents_list",
"apply_patch",
"browser",
"canvas",
AUTOMATIONS_TOOL_NAME,
"edit",
"exec",
"gateway",
"view_image",
"image_generate",
"memory_get",
"memory_search",
"message",
"music_generate",
"nodes",
"process",
"read",
"session_status",
"sessions_history",
"sessions_list",
"sessions_search",
"sessions_send",
"sessions_spawn",
"subagents",
"tts",
"video_generate",
"web_fetch",
"web_search",
"x_search",
"write"
]);
const HTTP_URL_RE = /^https?:\/\//i;
function isCoreToolResultMediaTrustedName(toolName) {
return Boolean(toolName && TRUSTED_TOOL_RESULT_MEDIA.has(normalizeToolPolicyName(toolName)));
}
function isExternalToolResult(result) {
const details = readToolResultDetails(result);
return typeof details?.mcpServer === "string" || typeof details?.mcpTool === "string";
}
function isToolResultMediaTrusted(toolName, result, trustedLocalMediaToolNames) {
if (!toolName || isExternalToolResult(result)) return false;
const registeredName = toolName.trim();
if (registeredName && trustedLocalMediaToolNames?.has(registeredName) === true) return true;
return isCoreToolResultMediaTrustedName(toolName);
}
function getTrustedOwnedTtsLocalMediaUrls(toolName, result, trustedLocalMediaToolNames) {
if (!toolName || !isToolResultMediaTrusted(toolName, result, trustedLocalMediaToolNames) || normalizeToolPolicyName(toolName) !== "tts") return;
const media = readToolResultDetails(result)?.media;
if (!media || typeof media !== "object" || Array.isArray(media)) return;
return media.trustedLocalMedia === true ? getCoreTtsToolResultMediaUrls(result) : void 0;
}
function filterToolResultMediaUrls(toolName, mediaUrls, result, trustedLocalMediaToolNames) {
if (mediaUrls.length === 0) return mediaUrls;
const trustedOwnedTtsMediaUrls = getTrustedOwnedTtsLocalMediaUrls(toolName, result, trustedLocalMediaToolNames);
if (isToolResultMediaTrusted(toolName, result, trustedLocalMediaToolNames)) {
if (trustedLocalMediaToolNames !== void 0) {
const registeredName = toolName?.trim();
if (!registeredName || !trustedLocalMediaToolNames.has(registeredName)) return mediaUrls.filter((url) => HTTP_URL_RE.test(url.trim()) || trustedOwnedTtsMediaUrls?.includes(url.trim()));
}
return mediaUrls;
}
return mediaUrls.filter((url) => HTTP_URL_RE.test(url.trim()));
}
function readToolResultDetailsMedia(result) {
const details = readToolResultDetails(result);
return details?.media && typeof details.media === "object" && !Array.isArray(details.media) ? details.media : void 0;
}
const REPLY_ATTACHMENT_METADATA_KEYS = /* @__PURE__ */ new Set([
"type",
"path",
"url",
"mediaUrl",
"filePath",
"mimeType",
"name",
"sizeBytes",
"durationMs",
"width",
"height"
]);
const MEDIA_URL_KEYS = [
"media",
"path",
"url",
"mediaUrl",
"filePath",
"fileUrl"
];
function collectStructuredMedia(media) {
const mediaUrls = /* @__PURE__ */ new Set();
const attachmentsByUrl = /* @__PURE__ */ new Map();
const pushString = (value, attachment) => {
pushUniqueMessagingMediaUrl(mediaUrls, value);
const normalized = typeof value === "string" ? value.trim() : "";
if (normalized && attachment && !attachmentsByUrl.has(normalized)) attachmentsByUrl.set(normalized, attachment);
};
const pushAttachment = (value) => {
if (!value || typeof value !== "object" || Array.isArray(value)) return;
const record = value;
const attachment = Object.fromEntries(Object.entries(record).filter(([key, entry]) => {
if (!REPLY_ATTACHMENT_METADATA_KEYS.has(key)) return false;
if (key === "type") return entry === "image" || entry === "audio" || entry === "video" || entry === "file";
if (key === "width" || key === "height") return asPositiveFiniteNumber(entry) !== void 0;
if (key === "sizeBytes" || key === "durationMs") return asNonNegativeFiniteNumber(entry) !== void 0;
return typeof entry === "string";
}));
for (const key of MEDIA_URL_KEYS) pushString(record[key], attachment);
};
for (const key of MEDIA_URL_KEYS) pushString(media[key]);
if (Array.isArray(media.mediaUrls)) for (const value of media.mediaUrls) pushString(value);
if (Array.isArray(media.attachments)) for (const attachment of media.attachments) pushAttachment(attachment);
return {
mediaUrls: [...mediaUrls],
...attachmentsByUrl.size > 0 ? { attachments: [...mediaUrls].map((url) => attachmentsByUrl.get(url) ?? {}) } : {}
};
}
function extractToolResultMediaArtifact(result) {
if (!result || typeof result !== "object") return;
const record = result;
const detailsMedia = readToolResultDetailsMedia(record);
if (detailsMedia) {
if (detailsMedia.outbound === false) return;
const structuredMedia = collectStructuredMedia(detailsMedia);
if (structuredMedia.mediaUrls.length > 0) return {
...structuredMedia,
...detailsMedia.audioAsVoice === true ? { audioAsVoice: true } : {},
...detailsMedia.trustedLocalMedia === true ? { trustedLocalMedia: true } : {}
};
}
if ((Array.isArray(record.content) ? record.content : null)?.some((item) => item && typeof item === "object" && item.type === "image")) {
const details = record.details;
const p = normalizeOptionalString(details?.path) ?? "";
if (p) return { mediaUrls: [p] };
}
}
//#endregion
export { isCoreToolResultMediaTrustedName as a, filterToolResultMediaUrls as i, collectMessagingMediaUrlsFromToolResult as n, collectAgentHarnessMessagingMediaUrls as o, extractToolResultMediaArtifact as r, mapAgentHarnessMessagingMediaValues as s, collectMessagingMediaUrlsFromRecord as t };