{"version":3,"file":"agent/run-markdown.mjs","sources":["../../../src/agent/run-markdown.ts"],"sourcesContent":["import { dirname, isAbsolute, resolve } from 'node:path';\nimport type { TUserPrompt } from '@/common';\n\nconst MAX_MARKDOWN_IMAGES = 20;\nconst REFERENCE_IMAGE_PREFIX = '参考图片';\n\ntype MdastNode = {\n  type: string;\n  children?: MdastNode[];\n  url?: string;\n  identifier?: string;\n  label?: string;\n};\n\ntype MdastRoot = MdastNode & {\n  children: MdastNode[];\n};\n\ntype MdastFromMarkdownModule = {\n  fromMarkdown: (value: string) => MdastRoot;\n};\n\ntype MdastToMarkdownModule = {\n  toMarkdown: (tree: MdastRoot) => string;\n};\n\nexport type RunMarkdownTransformResult = {\n  prompt: TUserPrompt;\n  imageCount: number;\n};\n\nconst imageNameForIndex = (index: number) =>\n  `${REFERENCE_IMAGE_PREFIX}-${String(index + 1).padStart(3, '0')}`;\n\nconst formatSource = (sourcePath?: string) =>\n  sourcePath ? ` in ${sourcePath}` : '';\n\nconst hasUrlScheme = (url: string) => /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(url);\n\nconst resolveMarkdownImageUrl = (url: string, sourcePath?: string) => {\n  if (!sourcePath || hasUrlScheme(url) || isAbsolute(url)) {\n    return url;\n  }\n  return resolve(dirname(sourcePath), url);\n};\n\nconst replaceMarkdownImages = (tree: MdastRoot, sourcePath?: string) => {\n  const images: Array<{ name: string; url: string }> = [];\n\n  const visitChildren = (node: MdastNode) => {\n    if (!Array.isArray(node.children)) {\n      return;\n    }\n\n    node.children = node.children.map((child) => {\n      if (child.type === 'imageReference') {\n        const identifier = child.identifier || child.label || 'unknown';\n        throw new Error(\n          `runMarkdown does not support reference-style image \"${identifier}\"${formatSource(sourcePath)}. Use direct image syntax instead.`,\n        );\n      }\n\n      if (child.type === 'image') {\n        const name = imageNameForIndex(images.length);\n        if (!child.url) {\n          throw new Error(\n            `Markdown image ${name}${formatSource(sourcePath)} is missing a URL.`,\n          );\n        }\n\n        images.push({\n          name,\n          url: resolveMarkdownImageUrl(child.url, sourcePath),\n        });\n        if (images.length > MAX_MARKDOWN_IMAGES) {\n          throw new Error(\n            `runMarkdown supports at most ${MAX_MARKDOWN_IMAGES} images, but found ${images.length} images${formatSource(sourcePath)}.`,\n          );\n        }\n\n        return {\n          type: 'text',\n          value: name,\n        } as MdastNode;\n      }\n\n      visitChildren(child);\n      return child;\n    });\n  };\n\n  visitChildren(tree);\n  return images;\n};\n\nexport const markdownToAiActPrompt = async (\n  markdown: string,\n  sourcePath?: string,\n): Promise<RunMarkdownTransformResult> => {\n  const fromMarkdownModuleName = 'mdast-util-from-markdown';\n  const toMarkdownModuleName = 'mdast-util-to-markdown';\n  const { fromMarkdown } = (await import(\n    fromMarkdownModuleName\n  )) as MdastFromMarkdownModule;\n  const { toMarkdown } = (await import(\n    toMarkdownModuleName\n  )) as MdastToMarkdownModule;\n\n  const tree = fromMarkdown(markdown);\n  const images = replaceMarkdownImages(tree, sourcePath);\n\n  if (images.length === 0) {\n    return {\n      prompt: markdown,\n      imageCount: 0,\n    };\n  }\n\n  return {\n    prompt: {\n      prompt: toMarkdown(tree),\n      images,\n      convertHttpImage2Base64: true,\n    },\n    imageCount: images.length,\n  };\n};\n"],"names":["MAX_MARKDOWN_IMAGES","REFERENCE_IMAGE_PREFIX","imageNameForIndex","index","String","formatSource","sourcePath","hasUrlScheme","url","resolveMarkdownImageUrl","isAbsolute","resolve","dirname","replaceMarkdownImages","tree","images","visitChildren","node","Array","child","identifier","Error","name","markdownToAiActPrompt","markdown","fromMarkdownModuleName","toMarkdownModuleName","fromMarkdown","toMarkdown"],"mappings":";AAGA,MAAMA,sBAAsB;AAC5B,MAAMC,yBAAyB;AA2B/B,MAAMC,oBAAoB,CAACC,QACzB,GAAGF,uBAAuB,CAAC,EAAEG,OAAOD,QAAQ,GAAG,QAAQ,CAAC,GAAG,MAAM;AAEnE,MAAME,eAAe,CAACC,aACpBA,aAAa,CAAC,IAAI,EAAEA,YAAY,GAAG;AAErC,MAAMC,eAAe,CAACC,MAAgB,2BAA2B,IAAI,CAACA;AAEtE,MAAMC,0BAA0B,CAACD,KAAaF;IAC5C,IAAI,CAACA,cAAcC,aAAaC,QAAQE,WAAWF,MACjD,OAAOA;IAET,OAAOG,QAAQC,QAAQN,aAAaE;AACtC;AAEA,MAAMK,wBAAwB,CAACC,MAAiBR;IAC9C,MAAMS,SAA+C,EAAE;IAEvD,MAAMC,gBAAgB,CAACC;QACrB,IAAI,CAACC,MAAM,OAAO,CAACD,KAAK,QAAQ,GAC9B;QAGFA,KAAK,QAAQ,GAAGA,KAAK,QAAQ,CAAC,GAAG,CAAC,CAACE;YACjC,IAAIA,AAAe,qBAAfA,MAAM,IAAI,EAAuB;gBACnC,MAAMC,aAAaD,MAAM,UAAU,IAAIA,MAAM,KAAK,IAAI;gBACtD,MAAM,IAAIE,MACR,CAAC,oDAAoD,EAAED,WAAW,CAAC,EAAEf,aAAaC,YAAY,kCAAkC,CAAC;YAErI;YAEA,IAAIa,AAAe,YAAfA,MAAM,IAAI,EAAc;gBAC1B,MAAMG,OAAOpB,kBAAkBa,OAAO,MAAM;gBAC5C,IAAI,CAACI,MAAM,GAAG,EACZ,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEC,OAAOjB,aAAaC,YAAY,kBAAkB,CAAC;gBAIzES,OAAO,IAAI,CAAC;oBACVO;oBACA,KAAKb,wBAAwBU,MAAM,GAAG,EAAEb;gBAC1C;gBACA,IAAIS,OAAO,MAAM,GAAGf,qBAClB,MAAM,IAAIqB,MACR,CAAC,6BAA6B,EAAErB,oBAAoB,mBAAmB,EAAEe,OAAO,MAAM,CAAC,OAAO,EAAEV,aAAaC,YAAY,CAAC,CAAC;gBAI/H,OAAO;oBACL,MAAM;oBACN,OAAOgB;gBACT;YACF;YAEAN,cAAcG;YACd,OAAOA;QACT;IACF;IAEAH,cAAcF;IACd,OAAOC;AACT;AAEO,MAAMQ,wBAAwB,OACnCC,UACAlB;IAEA,MAAMmB,yBAAyB;IAC/B,MAAMC,uBAAuB;IAC7B,MAAM,EAAEC,YAAY,EAAE,GAAI,MAAM,MAAM,CACpCF;IAEF,MAAM,EAAEG,UAAU,EAAE,GAAI,MAAM,MAAM,CAClCF;IAGF,MAAMZ,OAAOa,aAAaH;IAC1B,MAAMT,SAASF,sBAAsBC,MAAMR;IAE3C,IAAIS,AAAkB,MAAlBA,OAAO,MAAM,EACf,OAAO;QACL,QAAQS;QACR,YAAY;IACd;IAGF,OAAO;QACL,QAAQ;YACN,QAAQI,WAAWd;YACnBC;YACA,yBAAyB;QAC3B;QACA,YAAYA,OAAO,MAAM;IAC3B;AACF"}