UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

99 lines (98 loc) • 4.67 kB
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs"; import { t as formatErrorMessage } from "./errors-O33D01XW.mjs"; import { r as logVerbose } from "./globals-DyT306Z_.mjs"; import { l as normalizeMediaFacts } from "./media-facts-CJdQ4R61.mjs"; import { i as normalizeAttachments, n as isImageAttachment } from "./attachments.normalize-BQ4LOjcC.mjs"; import { t as stripExtractedFileImageMetadata } from "./extracted-file-images-CdmNdoIK.mjs"; import { r as resolveAgentTurnAttachments, t as collectDescribedImageAttachmentIndexes } from "./agent-turn-attachments-YAX9rCDg.mjs"; //#region src/auto-reply/reply/current-turn-images.ts function collectCurrentImageAttachments(ctx) { const hydrationSuppressedIndexes = new Set(normalizeMediaFacts(ctx.media).flatMap((fact, index) => fact.hydrationSuppressed === true ? [index] : [])); return normalizeAttachments(ctx).flatMap((attachment) => { if (hydrationSuppressedIndexes.has(attachment.index)) return []; const mediaPath = normalizeOptionalString(attachment.path); return mediaPath && isImageAttachment(attachment) ? [{ ...attachment, path: mediaPath }] : []; }); } function appendOrderedImages(params) { const images = params.images ?? []; let inlineIndex = 0; for (const imageOrder of params.imageOrder ?? []) params.entries.push({ image: imageOrder === "inline" ? images[inlineIndex++] : void 0, imageOrder, sourceIndex: params.sourceIndex, sequence: params.entries.length }); while (inlineIndex < images.length) params.entries.push({ image: images[inlineIndex++], imageOrder: "inline", sourceIndex: params.sourceIndex, sequence: params.entries.length }); } function resolveMergedTurnImages(entries) { if (entries.length === 0) return {}; const merged = entries.toSorted((left, right) => { if (left.sourceIndex !== void 0 && right.sourceIndex !== void 0) return left.sourceIndex - right.sourceIndex || left.sequence - right.sequence; return left.sequence - right.sequence; }); const images = merged.flatMap((entry) => entry.image ? [entry.image] : []); const result = { ...images.length > 0 ? { images } : {}, imageOrder: merged.map((entry) => entry.imageOrder) }; Object.defineProperty(result, "imageSourceIndexes", { value: merged.map((entry) => entry.sourceIndex) }); return result; } /** Resolves current-turn image attachments that were not already described by media understanding. */ async function resolveCurrentTurnImages(params) { const entries = []; appendOrderedImages({ entries, images: params.images, imageOrder: params.imageOrder }); for (const image of params.extractedFileImages ?? []) appendOrderedImages({ entries, images: [stripExtractedFileImageMetadata(image)], sourceIndex: image.attachmentIndex }); const describedImageIndexes = collectDescribedImageAttachmentIndexes(params.ctx); const undescribedImageAttachments = collectCurrentImageAttachments(params.ctx).filter((attachment) => !describedImageIndexes.has(attachment.index)); if (undescribedImageAttachments.length === 0) return resolveMergedTurnImages(entries); try { const resolved = await resolveAgentTurnAttachments({ ctx: params.ctx, cfg: params.cfg, includeRecentHistoryImages: false }); const images = resolved.attachments.map((attachment) => ({ type: "image", data: attachment.data, mimeType: attachment.mediaType })); const resolvedIndexes = resolved.attachmentIndexes ?? []; if (images.length < undescribedImageAttachments.length) logVerbose(`agent-runner: native OpenClaw media resolution produced ${images.length}/${undescribedImageAttachments.length} current image attachment(s); retaining resolved images`); const imageByResolvedIndex = new Map(resolvedIndexes.map((resolvedIndex, imageIndex) => [resolvedIndex, images[imageIndex]])); const unresolvedSourceIndexes = []; for (const attachment of undescribedImageAttachments) { const image = imageByResolvedIndex.get(attachment.index); if (image) appendOrderedImages({ entries, images: [image], sourceIndex: attachment.index }); else unresolvedSourceIndexes.push(attachment.index); } const merged = resolveMergedTurnImages(entries); return unresolvedSourceIndexes.length > 0 ? Object.assign(merged, { unresolvedSourceIndexes }) : merged; } catch (error) { logVerbose(`agent-runner: media attachment image resolution failed, proceeding without native images: ${formatErrorMessage(error)}`); return Object.assign(resolveMergedTurnImages(entries), { unresolvedSourceIndexes: undescribedImageAttachments.map((attachment) => attachment.index) }); } } //#endregion export { resolveCurrentTurnImages as t };