/**
 * 消息内容解析工具
 *
 * 负责解析消息中的图片标记，支持两种格式：
 * 1. [图片: url] 标记格式（推荐，与前端兼容）
 * 2. JSON 格式 { text, attachments }（兼容旧消息）
 */
import { logger } from "./logger.js";
/**
 * 解析消息内容
 *
 * @param content 消息内容（可能是纯文本、[图片: url] 格式或 JSON 格式）
 * @returns 解析后的内容
 */
export function parseMessageContent(content) {
    if (!content) {
        return { text: "", attachments: [], hasImages: false };
    }
    // 1. 尝试解析 [图片: url] 标记格式
    const imageTagRegex = /\[图片\s*:\s*([^\]\n]+?)\s*\]/gi;
    const attachments = [];
    const seen = new Set();
    let match = imageTagRegex.exec(content);
    while (match !== null) {
        const url = (match[1] || "").trim();
        if (url && !seen.has(url)) {
            seen.add(url);
            attachments.push({
                type: "image",
                url,
                name: getFileName(url),
                mediaType: getMediaType(url),
                size: 0,
            });
        }
        match = imageTagRegex.exec(content);
    }
    // 移除图片标记，保留纯文本
    const text = content.replace(imageTagRegex, "").replace(/\s+/g, " ").trim();
    if (attachments.length > 0) {
        return {
            text,
            attachments,
            hasImages: true,
        };
    }
    // 2. 尝试解析 JSON 格式（兼容旧消息）
    try {
        const parsed = JSON.parse(content);
        // 检查是否是 JSON 格式（带 attachments）
        if (parsed && typeof parsed === "object" && "text" in parsed) {
            const imageAttachments = (parsed.attachments || []).filter((att) => att.type === "image");
            return {
                text: parsed.text || "",
                attachments: imageAttachments,
                hasImages: imageAttachments.length > 0,
            };
        }
    }
    catch {
        // 不是 JSON
    }
    // 3. 纯文本消息
    return { text: content, attachments: [], hasImages: false };
}
/**
 * 从 URL 提取文件名
 */
function getFileName(url) {
    const normalized = (url || "").replace(/\\/g, "/");
    const parts = normalized.split("/").filter(Boolean);
    const lastPart = parts[parts.length - 1] || url;
    return lastPart.split("?")[0] || url;
}
/**
 * 从 URL 推断媒体类型
 */
function getMediaType(url) {
    const ext = (url || "").split(".").pop()?.toLowerCase()?.split("?")[0] || "";
    switch (ext) {
        case "png": return "image/png";
        case "jpg":
        case "jpeg": return "image/jpeg";
        case "gif": return "image/gif";
        case "webp": return "image/webp";
        default: return "image/png";
    }
}
/**
 * 构造多模态消息内容块
 *
 * 用于 Claude Agent SDK 的流式输入模式。
 * SDK 直接支持 URL 引用图片，无需下载转 Base64。
 *
 * @param parsedContent 解析后的消息内容
 * @param _baseUrl 服务器基础 URL（未使用，SDK 直接处理 URL）
 * @returns 内容块数组
 */
export function buildMultimodalContentBlocks(parsedContent, _baseUrl) {
    const blocks = [];
    // 添加图片内容块 - 使用 URL 引用，SDK 会自动处理
    for (const attachment of parsedContent.attachments) {
        // 构造完整的 URL（如果是相对路径）
        const fullUrl = attachment.url.startsWith("http")
            ? attachment.url
            : `${_baseUrl}${attachment.url}`;
        logger.info(`[MessageContent] 添加图片 URL 引用: ${fullUrl}`);
        blocks.push({
            type: "image",
            source: {
                type: "url",
                url: fullUrl,
            },
        });
    }
    // 添加文本内容块
    if (parsedContent.text.trim()) {
        blocks.push({
            type: "text",
            text: parsedContent.text,
        });
    }
    return blocks;
}
//# sourceMappingURL=messageContent.js.map