{
  "version": 3,
  "sources": ["/cdn/shop/t/55/assets/blog-builder-v2.js?ct_v=20260804_clickfix"],
  "sourcesContent": ["(function() {\r\n  if (window.__ctBlogBuilderV2Initialized) return;\r\n  window.__ctBlogBuilderV2Initialized = true;\r\n\r\nconst WORKER_BASE_STORAGE_KEY = \"ct_blog_builder_v2_worker_base\";\r\n      const ADMIN_KEY_STORAGE_KEY = \"ct_blog_builder_v2_admin_key\";\r\n      // Analytics remains on the legacy Worker so V2 can show existing history\r\n      // and keep using the tracking script already installed on article pages.\r\n      const LEGACY_ANALYTICS_WORKER_BASE = \"https://blog.lostjzsky.workers.dev\";\r\n      const LEGACY_ANALYTICS_ADMIN_KEY = \"ct_blog_admin_2026_demo_key_123456\";\r\n  \r\n      const IMAGE_MODEL_CONFIGS = {\r\n        \"openai/gpt-image-2\": {\r\n          label: \"ChatGPT Images 2.0\uFF08\u65E0\u56FE\u9ED8\u8BA4\uFF09\",\r\n          supportsTextToImage: true,\r\n          supportsReference: false,\r\n          supportsRatios: [\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\"],\r\n          defaultImageSize: \"16:9\",\r\n          defaultResolution: \"1K\",\r\n          defaultQuality: \"high\",\r\n          defaultOutputFormat: \"png\",\r\n          extraParams: {\r\n            num_images: 1\r\n          }\r\n        },\r\n  \r\n        \"openai/gpt-image-2/edit\": {\r\n          label: \"ChatGPT Images 2.0 Edit\uFF08\u6709\u53C2\u8003\u56FE\u9ED8\u8BA4\uFF09\",\r\n          supportsTextToImage: false,\r\n          supportsReference: true,\r\n          supportsRatios: [\"auto\", \"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\"],\r\n          defaultImageSize: \"16:9\",\r\n          defaultResolution: \"1K\",\r\n          defaultQuality: \"high\",\r\n          defaultOutputFormat: \"png\",\r\n          extraParams: {\r\n            num_images: 1\r\n          }\r\n        },\r\n  \r\n        \"fal-ai/nano-banana-pro\": {\r\n          label: \"Nano Banana Pro\uFF08\u8D28\u91CF\u4F18\u5148\uFF09\",\r\n          supportsTextToImage: true,\r\n          supportsReference: true,\r\n          supportsRatios: [\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"4:5\"],\r\n          defaultAspectRatio: \"16:9\",\r\n          defaultResolution: \"1K\",\r\n          defaultOutputFormat: \"png\",\r\n          extraParams: {\r\n            num_images: 1\r\n          }\r\n        },\r\n  \r\n        \"fal-ai/nano-banana-2\": {\r\n          label: \"Nano Banana 2\uFF08\u5747\u8861\u63A8\u8350\uFF09\",\r\n          supportsTextToImage: true,\r\n          supportsReference: true,\r\n          supportsRatios: [\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"4:5\", \"auto\"],\r\n          defaultAspectRatio: \"16:9\",\r\n          defaultResolution: \"1K\",\r\n          defaultOutputFormat: \"png\",\r\n          extraParams: {\r\n            num_images: 1,\r\n            safety_tolerance: \"4\",\r\n            limit_generations: true\r\n          }\r\n        },\r\n  \r\n        \"fal-ai/flux-2/flash\": {\r\n          label: \"Flux 2 Flash\uFF08\u5FEB\u901F\u9884\u89C8\uFF09\",\r\n          supportsTextToImage: true,\r\n          supportsReference: true,\r\n          supportsRatios: [\"1:1\", \"4:3\", \"16:9\", \"4:5\"],\r\n          defaultImageSize: \"landscape_16_9\",\r\n          extraParams: {\r\n            guidance_scale: 2.5,\r\n            output_format: \"png\",\r\n            enable_safety_checker: true\r\n          }\r\n        }\r\n      };\r\n  \r\n      const BLOG_TYPE_CONFIG = {\r\n        \"nutrition-benefits\": {\r\n          label: \"Nutrition & Benefits\",\r\n          shopifyBlogTitle: \"Nutrition & Benefits\",\r\n          defaultGoal: \"Educate and explain ingredient benefits\",\r\n          defaultTone: \"Professional, educational, premium, clean\"\r\n        },\r\n        \"feeding-guides\": {\r\n          label: \"Feeding Guides & Tips\",\r\n          shopifyBlogTitle: \"Feeding Guides & Tips\",\r\n          defaultGoal: \"Help users understand feeding usage and daily routines\",\r\n          defaultTone: \"Warm, educational, premium, practical\"\r\n        },\r\n        \"recipes-diy\": {\r\n          label: \"Recipes & DIY\",\r\n          shopifyBlogTitle: \"Recipes & DIY\",\r\n          defaultGoal: \"Encourage practical recipe and usage inspiration\",\r\n          defaultTone: \"Warm, creative, premium, useful\"\r\n        },\r\n        \"brand-news-events\": {\r\n          label: \"Brand News & Events\",\r\n          shopifyBlogTitle: \"Brand News & Events\",\r\n          defaultGoal: \"Share brand updates, campaigns, and timely content\",\r\n          defaultTone: \"Warm, friendly, premium, trustworthy\"\r\n        }\r\n      };\r\n  \r\n      const DOG_BREEDS = [\r\n        { value: \"\", label: \"\u672A\u6307\u5B9A\" },\r\n        { value: \"Shiba Inu\", label: \"Shiba Inu\uFF5C\u67F4\u72AC\" },\r\n        { value: \"Corgi\", label: \"Corgi\uFF5C\u67EF\u57FA\" },\r\n        { value: \"Poodle\", label: \"Poodle\uFF5C\u8D35\u5BBE\u72AC\" },\r\n        { value: \"Toy Poodle\", label: \"Toy Poodle\uFF5C\u73A9\u5177\u8D35\u5BBE\" },\r\n        { value: \"Golden Retriever\", label: \"Golden Retriever\uFF5C\u91D1\u6BDB\" },\r\n        { value: \"Labrador Retriever\", label: \"Labrador Retriever\uFF5C\u62C9\u5E03\u62C9\u591A\" },\r\n        { value: \"French Bulldog\", label: \"French Bulldog\uFF5C\u6CD5\u6597\" },\r\n        { value: \"Pomeranian\", label: \"Pomeranian\uFF5C\u535A\u7F8E\" },\r\n        { value: \"Chihuahua\", label: \"Chihuahua\uFF5C\u5409\u5A03\u5A03\" },\r\n        { value: \"Maltese\", label: \"Maltese\uFF5C\u9A6C\u5C14\u6D4E\u65AF\" },\r\n        { value: \"Miniature Schnauzer\", label: \"Miniature Schnauzer\uFF5C\u8FF7\u4F60\u96EA\u7EB3\u745E\" },\r\n        { value: \"Dachshund\", label: \"Dachshund\uFF5C\u814A\u80A0\u72AC\" },\r\n        { value: \"Border Collie\", label: \"Border Collie\uFF5C\u8FB9\u7267\" },\r\n        { value: \"Samoyed\", label: \"Samoyed\uFF5C\u8428\u6469\u8036\" },\r\n        { value: \"Pug\", label: \"Pug\uFF5C\u5DF4\u54E5\" },\r\n        { value: \"Beagle\", label: \"Beagle\uFF5C\u6BD4\u683C\u72AC\" },\r\n        { value: \"Yorkshire Terrier\", label: \"Yorkshire Terrier\uFF5C\u7EA6\u514B\u590F\" }\r\n      ];\r\n  \r\n      const CAT_BREEDS = [\r\n        { value: \"\", label: \"\u672A\u6307\u5B9A\" },\r\n        { value: \"British Shorthair\", label: \"British Shorthair\uFF5C\u82F1\u56FD\u77ED\u6BDB\u732B\" },\r\n        { value: \"Ragdoll\", label: \"Ragdoll\uFF5C\u5E03\u5076\u732B\" },\r\n        { value: \"Maine Coon\", label: \"Maine Coon\uFF5C\u7F05\u56E0\u732B\" },\r\n        { value: \"Orange Tabby\", label: \"Orange Tabby\uFF5C\u6A58\u732B\" },\r\n        { value: \"American Shorthair\", label: \"American Shorthair\uFF5C\u7F8E\u56FD\u77ED\u6BDB\u732B\" },\r\n        { value: \"Persian\", label: \"Persian\uFF5C\u6CE2\u65AF\u732B\" },\r\n        { value: \"Siamese\", label: \"Siamese\uFF5C\u66B9\u7F57\u732B\" },\r\n        { value: \"Scottish Fold\", label: \"Scottish Fold\uFF5C\u82CF\u683C\u5170\u6298\u8033\u732B\" },\r\n        { value: \"Russian Blue\", label: \"Russian Blue\uFF5C\u4FC4\u7F57\u65AF\u84DD\u732B\" },\r\n        { value: \"Bengal\", label: \"Bengal\uFF5C\u5B5F\u52A0\u62C9\u732B\" },\r\n        { value: \"Norwegian Forest Cat\", label: \"Norwegian Forest Cat\uFF5C\u632A\u5A01\u68EE\u6797\u732B\" },\r\n        { value: \"Sphynx\", label: \"Sphynx\uFF5C\u65AF\u82AC\u514B\u65AF\u732B\" },\r\n        { value: \"Exotic Shorthair\", label: \"Exotic Shorthair\uFF5C\u5F02\u56FD\u77ED\u6BDB\u732B\" },\r\n        { value: \"Domestic Shorthair\", label: \"Domestic Shorthair\uFF5C\u5BB6\u732B\u77ED\u6BDB\" },\r\n        { value: \"Domestic Longhair\", label: \"Domestic Longhair\uFF5C\u5BB6\u732B\u957F\u6BDB\" }\r\n      ];    \r\n  \r\n      const PUBLISH_BLOG_OPTIONS = [\r\n        \"Nutrition & Benefits\",\r\n        \"Feeding Guides & Tips\",\r\n        \"Recipes & DIY\",\r\n        \"Brand News & Events\"\r\n      ];\r\n\r\n      const AUTO_BLOG_CONTENT_TYPE_MAP = Object.fromEntries(\r\n        Object.entries(BLOG_TYPE_CONFIG).map(([contentType, config]) => [\r\n          config.shopifyBlogTitle,\r\n          contentType\r\n        ])\r\n      );\r\n  \r\n      let currentStep = 1;\r\n      let autoPollTimer = null;\r\n      let autoPollCount = 0;\r\n      const maxAutoPollCount = 30;\r\n      let currentTaskId = \"\";\r\n      let currentPlannedTasks = [];\r\n      let currentSlotLabels = [];\r\n      let currentResults = [];\r\n      let currentPollingContext = null;\r\n      let currentLinkAnalysis = null;\r\n      let selectedLinkSuggestionIds = new Set();\r\n      let linkBaseArticleHtml = \"\";\r\n      let linkedArticleHtml = \"\";\r\n      let builderMode = \"\";\r\n      let autoArticleJobs = [];\r\n      let activeAutoEditId = \"\";\r\n      let autoWorkflowRunning = false;\r\n      let currentAutoTaskId = \"\";\r\n      let autoAutomationConfig = null;\r\n      let autoAutomationState = null;\r\n      let autoStatusPollTimer = null;\r\n      let analyticsDashboard = null;\r\n      let analyticsLoading = false;\r\n      let currentContentSources = [];\r\n      let selectedContentSource = null;\r\n      let currentSourceExtract = null;\r\n      let currentRewriteResult = null;\r\n  \r\n      let selectedProduct = {\r\n        title: \"\",\r\n        image: \"\",\r\n        images: [],\r\n        tags: [],\r\n        url: \"\",\r\n        handle: \"\"\r\n      };\r\n  \r\n      function $(id) {\r\n        return document.getElementById(id);\r\n      }\r\n  \r\n      function setStatus(id, text) {\r\n        $(id).textContent = text || \"\";\r\n      }\r\n  \r\n      function startElapsedStatus(statusId, buildMessage) {\r\n        const startedAt = Date.now();\r\n        const update = () => {\r\n          const elapsed = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\r\n          setStatus(statusId, buildMessage(elapsed));\r\n        };\r\n        update();\r\n        const timer = setInterval(update, 5000);\r\n        return () => clearInterval(timer);\r\n      }\r\n  \r\n      function setPublishNotice(type, title, message = \"\", articleUrl = \"\") {\r\n        const el = $(\"publishStatus\");\r\n        if (!el) return;\r\n  \r\n        el.className = \"ct-status ct-status--card\";\r\n  \r\n        if (type === \"success\") {\r\n          el.classList.add(\"ct-status--success\");\r\n        } else if (type === \"error\") {\r\n          el.classList.add(\"ct-status--error\");\r\n        } else if (type === \"loading\") {\r\n          el.classList.add(\"ct-status--loading\");\r\n        } else {\r\n          el.classList.add(\"ct-status--info\");\r\n        }\r\n  \r\n        el.innerHTML = `\r\n          <span class=\"ct-status__title\">${escapeHtml(title || \"\")}</span>\r\n          ${message ? `<div>${escapeHtml(message)}</div>` : \"\"}\r\n          ${articleUrl ? `<a class=\"ct-status__link\" href=\"${articleUrl}\" target=\"_blank\" rel=\"noopener\">\u6253\u5F00\u6587\u7AE0\u94FE\u63A5</a>` : \"\"}\r\n        `;\r\n  \r\n        el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n      }\r\n  \r\n      function setPublishButtonsDisabled(disabled) {\r\n        [\"btnSaveDraft\", \"btnPublishNow\", \"btnRefreshPublish\"].forEach(id => {\r\n          const el = $(id);\r\n          if (el) {\r\n            el.disabled = !!disabled;\r\n            el.style.opacity = disabled ? \"0.65\" : \"\";\r\n            el.style.cursor = disabled ? \"not-allowed\" : \"\";\r\n          }\r\n        });\r\n      }\r\n  \r\n      function readLocalSetting(key) {\r\n        try {\r\n          return localStorage.getItem(key) || \"\";\r\n        } catch (error) {\r\n          return \"\";\r\n        }\r\n      }\r\n  \r\n      function writeLocalSetting(key, value) {\r\n        try {\r\n          if (value) {\r\n            localStorage.setItem(key, value);\r\n          } else {\r\n            localStorage.removeItem(key);\r\n          }\r\n        } catch (error) {}\r\n      }\r\n  \r\n      function getWorkerBase() {\r\n        return $(\"workerBase\").value.trim().replace(/\\/$/, \"\");\r\n      }\r\n\r\n      function getAnalyticsWorkerBase() {\r\n        return LEGACY_ANALYTICS_WORKER_BASE;\r\n      }\r\n\r\n      function getAnalyticsAdminKey() {\r\n        return LEGACY_ANALYTICS_ADMIN_KEY;\r\n      }\r\n  \r\n      function getAdminKey() {\r\n        const input = $(\"adminKeyInput\");\r\n        return input ? input.value.trim() : \"\";\r\n      }\r\n  \r\n      function requireAdminKey() {\r\n        const adminKey = getAdminKey();\r\n        if (!adminKey) {\r\n          throw new Error(\"\u8BF7\u5148\u5728\u9876\u90E8\u586B\u5199 Admin Key\uFF0C\u5E76\u70B9\u51FB\u201C\u4FDD\u5B58\u8BBE\u7F6E\u201D\u3002\");\r\n        }\r\n        return adminKey;\r\n      }\r\n  \r\n      function loadWorkerSettings() {\r\n        const workerBase = readLocalSetting(WORKER_BASE_STORAGE_KEY);\r\n        const adminKey = readLocalSetting(ADMIN_KEY_STORAGE_KEY);\r\n  \r\n        if (workerBase) {\r\n          $(\"workerBase\").value = workerBase;\r\n        }\r\n        if (adminKey) {\r\n          $(\"adminKeyInput\").value = adminKey;\r\n          setStatus(\"workerStatus\", \"\u5DF2\u8BFB\u53D6\u672C\u6D4F\u89C8\u5668\u4FDD\u5B58\u7684 Worker \u8BBE\u7F6E\u3002\");\r\n        } else {\r\n          setStatus(\"workerStatus\", \"\u8BF7\u586B\u5199 Admin Key \u5E76\u4FDD\u5B58\u8BBE\u7F6E\uFF1B\u5426\u5219\u7D20\u6750\u91C7\u96C6\u3001\u91CD\u5199\u3001\u914D\u56FE\u548C\u53D1\u5E03\u4F1A\u88AB Worker \u62D2\u7EDD\u3002\");\r\n        }\r\n      }\r\n  \r\n      function saveWorkerSettings() {\r\n        const workerBase = getWorkerBase();\r\n        const adminKey = getAdminKey();\r\n  \r\n        if (!workerBase) {\r\n          setStatus(\"workerStatus\", \"\u8BF7\u5148\u586B\u5199 Worker \u5730\u5740\u3002\");\r\n          return;\r\n        }\r\n        if (!adminKey) {\r\n          setStatus(\"workerStatus\", \"\u8BF7\u5148\u586B\u5199 Admin Key\u3002\");\r\n          return;\r\n        }\r\n  \r\n        writeLocalSetting(WORKER_BASE_STORAGE_KEY, workerBase);\r\n        writeLocalSetting(ADMIN_KEY_STORAGE_KEY, adminKey);\r\n        setStatus(\"workerStatus\", \"\u8BBE\u7F6E\u5DF2\u4FDD\u5B58\u5230\u5F53\u524D\u6D4F\u89C8\u5668\u3002\u73B0\u5728\u53EF\u4EE5\u91CD\u65B0\u91C7\u96C6\u7D20\u6750\u3002\");\r\n      }\r\n  \r\n      function clearAdminKey() {\r\n        $(\"adminKeyInput\").value = \"\";\r\n        writeLocalSetting(ADMIN_KEY_STORAGE_KEY, \"\");\r\n        setStatus(\"workerStatus\", \"\u5DF2\u6E05\u9664\u5F53\u524D\u6D4F\u89C8\u5668\u4FDD\u5B58\u7684 Admin Key\u3002\");\r\n      }\r\n  \r\n      function getHeaders() {\r\n        return {\r\n          \"Content-Type\": \"application/json\",\r\n          \"X-Blog-Admin-Key\": requireAdminKey()\r\n        };\r\n      }\r\n  \r\n      function setStep(step) {\r\n        currentStep = step;\r\n        document.querySelectorAll(\".ct-step-page\").forEach(el => el.classList.remove(\"is-active\"));\r\n        document.querySelectorAll(\".ct-step-tab\").forEach(el => el.classList.remove(\"is-active\"));\r\n  \r\n        const page = document.getElementById(`step-page-${step}`);\r\n        if (page) page.classList.add(\"is-active\");\r\n  \r\n        const tab = document.querySelector(`.ct-step-tab[data-step=\"${step}\"]`);\r\n        if (tab) tab.classList.add(\"is-active\");\r\n  \r\n        window.scrollTo({ top: 0, behavior: \"smooth\" });\r\n      }\r\n  \r\n      function unlockStep(step) {\r\n        const tab = document.querySelector(`.ct-step-tab[data-step=\"${step}\"]`);\r\n        if (tab) tab.classList.remove(\"is-disabled\");\r\n      }\r\n  \r\n      function syncTonePreset(force = false) {\r\n        const preset = $(\"brandTonePreset\").value;\r\n        const current = $(\"brandTone\").value.trim();\r\n  \r\n        if (preset !== \"custom\" && (force || !current)) {\r\n          $(\"brandTone\").value = preset;\r\n        }\r\n      }\r\n  \r\n      function syncContentTypeConfig(force = false) {\r\n        const type = $(\"contentType\").value;\r\n        const cfg = BLOG_TYPE_CONFIG[type];\r\n        if (!cfg) return;\r\n  \r\n        if ($(\"promotionGoalPreset\").value !== \"custom\") {\r\n          const currentGoal = $(\"promotionGoal\").value.trim();\r\n          if (force || !currentGoal) {\r\n            $(\"promotionGoal\").value = cfg.defaultGoal || \"\";\r\n          }\r\n        }\r\n  \r\n        if ($(\"brandTonePreset\").value !== \"custom\") {\r\n          const currentTone = $(\"brandTone\").value.trim();\r\n          if (force || !currentTone) {\r\n            $(\"brandTone\").value = cfg.defaultTone || \"\";\r\n          }\r\n        }\r\n      }\r\n  \r\n      function syncGoalPreset(force = false) {\r\n        const preset = $(\"promotionGoalPreset\").value;\r\n        const current = $(\"promotionGoal\").value.trim();\r\n  \r\n        if (preset !== \"custom\" && (force || !current)) {\r\n          $(\"promotionGoal\").value = preset;\r\n        }\r\n      }\r\n  \r\n      function slugify(value) {\r\n        return String(value || \"\")\r\n          .toLowerCase()\r\n          .trim()\r\n          .replace(/&/g, \" and \")\r\n          .replace(/[^a-z0-9\\s-]/g, \"\")\r\n          .replace(/\\s+/g, \"-\")\r\n          .replace(/-+/g, \"-\")\r\n          .replace(/^-|-$/g, \"\");\r\n      }\r\n  \r\n      function getMappedBlogTitle() {\r\n        const type = $(\"contentType\").value;\r\n        const cfg = BLOG_TYPE_CONFIG[type];\r\n        return cfg?.shopifyBlogTitle || \"Nutrition & Benefits\";\r\n      }\r\n  \r\n      function buildDefaultPublishTags() {\r\n        const tags = [];\r\n        const type = $(\"contentType\").value;\r\n        const petType = ($(\"petType\").value || \"\").trim().toLowerCase();\r\n        const productHandle = (selectedProduct.handle || \"\").trim().toLowerCase();\r\n  \r\n        if (type) tags.push(type);\r\n        if (petType) tags.push(petType);\r\n        if (productHandle) tags.push(productHandle);\r\n  \r\n        const keywordSource = $(\"targetKeywords\").value.trim();\r\n        if (keywordSource) {\r\n          const firstKeyword = keywordSource\r\n            .split(\",\")[0]\r\n            .trim()\r\n            .toLowerCase()\r\n            .replace(/[^a-z0-9\\s-]/g, \"\")\r\n            .replace(/\\s+/g, \"-\");\r\n          if (firstKeyword) tags.push(firstKeyword);\r\n        }\r\n  \r\n        return Array.from(new Set(tags.filter(Boolean))).join(\", \");\r\n      }\r\n  \r\n      function getCoverChoices() {\r\n        const fallbackLabels = getImageSlotLabels($(\"imageCount\").value || 3);\r\n        const source = (currentResults && currentResults.length)\r\n          ? currentResults\r\n          : fallbackLabels.map(label => ({ label, imageUrl: \"\", status: \"\u6682\u65E0\u56FE\u7247\" }));\r\n  \r\n        return source.map((item, index) => ({\r\n          value: String(index),\r\n          label: item.label || fallbackLabels[index] || `\u56FE\u7247 ${index + 1}`,\r\n          imageUrl: item.imageUrl || \"\"\r\n        }));\r\n      }\r\n  \r\n      function renderPublishCoverOptions() {\r\n        const select = $(\"publishCoverSource\");\r\n        if (!select) return;\r\n  \r\n        const choices = getCoverChoices();\r\n        const current = select.value;\r\n        select.innerHTML = \"\";\r\n  \r\n        choices.forEach((item) => {\r\n          const opt = document.createElement(\"option\");\r\n          opt.value = item.value;\r\n          opt.textContent = `${item.label}${item.imageUrl ? \"\" : \"\uFF08\u6682\u65E0\u56FE\u7247\uFF09\"}`;\r\n          select.appendChild(opt);\r\n        });\r\n  \r\n        if (choices.some(item => item.value === current)) {\r\n          select.value = current;\r\n        } else {\r\n          select.value = \"0\";\r\n        }\r\n  \r\n        updatePublishCoverPreview();\r\n      }\r\n  \r\n      function getSelectedPublishCoverChoice() {\r\n        const choices = getCoverChoices();\r\n        return choices.find(item => item.value === $(\"publishCoverSource\").value) || choices[0] || null;\r\n      }\r\n  \r\n      function getInlineArticleImages() {\r\n        const choices = getCoverChoices();\r\n        const selectedCover = getSelectedPublishCoverChoice();\r\n        const selectedValue = selectedCover ? selectedCover.value : \"\";\r\n  \r\n        return choices.filter(item => item.imageUrl && item.value !== selectedValue);\r\n      }\r\n  \r\n      function buildInlineImageFigure(item) {\r\n        return `\r\n          <figure class=\"ct-inline-article-image\">\r\n            <img src=\"${item.imageUrl}\" alt=\"${escapeHtml(item.label || \"article image\")}\">\r\n          </figure>\r\n        `;\r\n      }\r\n  \r\n      function injectInlineImagesIntoHtml(html, inlineImages) {\r\n        if (!html) return \"\";\r\n        if (!inlineImages || !inlineImages.length) return html;\r\n  \r\n        const parser = new DOMParser();\r\n        const doc = parser.parseFromString(`<div id=\"ct-root\">${html}</div>`, \"text/html\");\r\n        const root = doc.getElementById(\"ct-root\");\r\n        if (!root) return html;\r\n  \r\n        const images = inlineImages.filter(item => item && item.imageUrl);\r\n        if (!images.length) return root.innerHTML;\r\n  \r\n        // \u79FB\u9664\u65E7\u7684\u6B63\u6587\u63D2\u56FE\uFF0C\u907F\u514D\u5237\u65B0\u53D1\u5E03\u4FE1\u606F\u65F6\u91CD\u590D\u63D2\u5165\r\n        root.querySelectorAll(\".ct-inline-article-image\").forEach(node => node.remove());\r\n  \r\n        function isTextBlock(node) {\r\n          if (!node || !node.tagName) return false;\r\n          if (node.classList && node.classList.contains(\"ct-inline-article-image\")) return false;\r\n  \r\n          const tag = node.tagName.toUpperCase();\r\n          return tag === \"P\" || tag === \"UL\" || tag === \"OL\" || tag === \"BLOCKQUOTE\";\r\n        }\r\n  \r\n        let anchors = Array.from(root.children).filter(isTextBlock);\r\n  \r\n        if (!anchors.length) {\r\n          anchors = Array.from(root.querySelectorAll(\"p, ul, ol, blockquote\"));\r\n        }\r\n  \r\n        if (!anchors.length) {\r\n          images.forEach(item => {\r\n            root.insertAdjacentHTML(\"beforeend\", buildInlineImageFigure(item));\r\n          });\r\n          return root.innerHTML;\r\n        }\r\n  \r\n        function getPlacementRatios(count) {\r\n          if (count <= 1) return [0.38];\r\n          if (count === 2) return [0.38, 0.78];\r\n          if (count === 3) return [0.28, 0.58, 0.84];\r\n  \r\n          const ratios = [];\r\n          for (let i = 1; i <= count; i++) {\r\n            ratios.push(i / (count + 1));\r\n          }\r\n          return ratios;\r\n        }\r\n  \r\n        const placeCount = Math.min(images.length, anchors.length);\r\n        const usingImages = images.slice(0, placeCount);\r\n        const ratios = getPlacementRatios(placeCount);\r\n  \r\n        const rawIndexes = ratios.map(ratio => {\r\n          return Math.round((anchors.length - 1) * ratio);\r\n        });\r\n  \r\n        const finalIndexes = [];\r\n        for (let i = 0; i < rawIndexes.length; i++) {\r\n          let idx = rawIndexes[i];\r\n          const min = i === 0 ? 0 : finalIndexes[i - 1] + 1;\r\n          const max = anchors.length - (rawIndexes.length - i);\r\n  \r\n          if (idx < min) idx = min;\r\n          if (idx > max) idx = max;\r\n  \r\n          finalIndexes.push(idx);\r\n        }\r\n  \r\n        for (let i = 0; i < usingImages.length; i++) {\r\n          const anchor = anchors[finalIndexes[i]];\r\n          if (anchor) {\r\n            anchor.insertAdjacentHTML(\"afterend\", buildInlineImageFigure(usingImages[i]));\r\n          }\r\n        }\r\n  \r\n        for (let i = placeCount; i < images.length; i++) {\r\n          root.insertAdjacentHTML(\"beforeend\", buildInlineImageFigure(images[i]));\r\n        }\r\n  \r\n        return root.innerHTML;\r\n      }\r\n  \r\n      function buildPublishedArticleHtml() {\r\n        const originalHtml = $(\"textRaw\").value.trim() || $(\"articleEditor\").innerHTML.trim();\r\n        const inlineImages = getInlineArticleImages();\r\n        return injectInlineImagesIntoHtml(originalHtml, inlineImages);\r\n      }\r\n  \r\n      function updatePublishCoverPreview() {\r\n        const wrap = $(\"publishCoverPreview\");\r\n        if (!wrap) return;\r\n  \r\n        const choices = getCoverChoices();\r\n        const selected = choices.find(item => item.value === $(\"publishCoverSource\").value) || choices[0];\r\n  \r\n        if (selected && selected.imageUrl) {\r\n          wrap.innerHTML = `<img src=\"${selected.imageUrl}\" alt=\"${escapeHtml(selected.label)}\">`;\r\n        } else {\r\n          wrap.innerHTML = `<div class=\"ct-result-placeholder\">\u5F53\u524D\u56FE\u4F4D\u8FD8\u6CA1\u6709\u53EF\u7528\u56FE\u7247</div>`;\r\n        }\r\n  \r\n        renderArticlePreview();\r\n      }\r\n  \r\n        function renderArticlePreview() {\r\n          const wrap = $(\"articlePreview\");\r\n          if (!wrap) return;\r\n  \r\n          const title = $(\"publishTitle\").value.trim() || \"\u672A\u547D\u540D\u6587\u7AE0\";\r\n          const excerpt = $(\"publishExcerpt\").value.trim();\r\n          const bodyHtml = buildPublishedArticleHtml();\r\n  \r\n          wrap.innerHTML = `\r\n            <h1>${escapeHtml(title)}</h1>\r\n            ${excerpt ? `<p class=\"ct-preview-excerpt\">${escapeHtml(excerpt)}</p>` : \"\"}\r\n            <div class=\"ct-preview-body\">${bodyHtml || \"<p>\u6B63\u6587\u9884\u89C8\u4E3A\u7A7A\u3002</p>\"}</div>\r\n          `;\r\n        }\r\n  \r\n        function buildPublishPayload() {\r\n          const selected = getSelectedPublishCoverChoice();\r\n          const processedBodyHtml = buildPublishedArticleHtml();\r\n          const sourceInfo = getSelectedSourcePublishInfo();\r\n  \r\n          return {\r\n            blog_title: $(\"publishBlog\").value,\r\n            title: $(\"publishTitle\").value.trim(),\r\n            handle: $(\"publishHandle\").value.trim(),\r\n            excerpt: $(\"publishExcerpt\").value.trim(),\r\n            seo_title: $(\"publishSeoTitle\").value.trim(),\r\n            meta_description: $(\"publishMetaDescription\").value.trim(),\r\n            tags: $(\"publishTags\").value.split(\",\").map(v => v.trim()).filter(Boolean),\r\n            cover_image_url: selected?.imageUrl || \"\",\r\n            body_html: processedBodyHtml,\r\n            ...sourceInfo\r\n          };\r\n        }\r\n  \r\n        function buildPublishPayloadFromDraft(draft) {\r\n          const publish = draft?.publish || {};\r\n          const text = draft?.text || {};\r\n          const images = draft?.images || {};\r\n          const source = draft?.sources?.selected || {};\r\n          const sourceExtract = draft?.sources?.extract || source?.source_extract || {};\r\n          const results = Array.isArray(images.results) ? images.results : [];\r\n          const coverIndex = Number(publish.cover_source || 0);\r\n          const selectedCover = results[coverIndex] || results[0] || null;\r\n          const sourceUrl = source.url || sourceExtract.url || publish.source_url || \"\";\r\n  \r\n          return {\r\n            blog_title: publish.blog || \"\",\r\n            title: publish.title || \"\",\r\n            handle: publish.handle || \"\",\r\n            excerpt: publish.excerpt || \"\",\r\n            seo_title: publish.seo_title || \"\",\r\n            meta_description: publish.meta_description || \"\",\r\n            tags: publish.tags || \"\",\r\n            cover_image_url: selectedCover?.imageUrl || publish.cover_image_url || \"\",\r\n            body_html: text.article_html || draft?.links?.linked_article_html || \"\",\r\n            source_url: sourceUrl,\r\n            source_title: source.original_title || source.title || sourceExtract.title || publish.source_title || \"\",\r\n            source_domain: source.domain || sourceExtract.domain || publish.source_domain || \"\"\r\n          };\r\n        }\r\n  \r\n        async function submitDraftPayloadToShopify(draft, mode = \"draft\", publishDate = \"\") {\r\n          const payload = buildPublishPayloadFromDraft(draft);\r\n          payload.publish_mode = mode;\r\n          payload.publish_date = publishDate || \"\";\r\n  \r\n          if (!payload.blog_title) throw new Error(\"\u8BF7\u9009\u62E9\u535A\u5BA2\u680F\u76EE\u3002\");\r\n          if (!payload.title) throw new Error(\"\u6587\u7AE0\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n          if (!payload.handle) throw new Error(\"URL Handle \u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n          if (!payload.body_html || !payload.body_html.trim()) throw new Error(\"\u6B63\u6587\u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n  \r\n          return apiPost(\"/shopify/create-article\", { payload });\r\n        }\r\n  \r\n        async function submitArticleToShopify(mode) {\r\n          syncPublishStep(false);\r\n  \r\n          if (!$(\"publishBlog\").value.trim()) {\r\n            setPublishNotice(\"error\", \"\u53D1\u5E03\u4FE1\u606F\u4E0D\u5B8C\u6574\", \"\u8BF7\u9009\u62E9\u535A\u5BA2\u680F\u76EE\u3002\");\r\n            return;\r\n          }\r\n  \r\n          if (!$(\"publishTitle\").value.trim()) {\r\n            setPublishNotice(\"error\", \"\u53D1\u5E03\u4FE1\u606F\u4E0D\u5B8C\u6574\", \"\u6587\u7AE0\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n            return;\r\n          }\r\n  \r\n          if (!$(\"publishHandle\").value.trim()) {\r\n            setPublishNotice(\"error\", \"\u53D1\u5E03\u4FE1\u606F\u4E0D\u5B8C\u6574\", \"URL Handle \u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n            return;\r\n          }\r\n  \r\n          const bodyHtml = buildPublishedArticleHtml();\r\n          if (!bodyHtml.trim()) {\r\n            setPublishNotice(\"error\", \"\u53D1\u5E03\u4FE1\u606F\u4E0D\u5B8C\u6574\", \"\u6B63\u6587\u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n            return;\r\n          }\r\n  \r\n          const payload = buildPublishPayload();\r\n          payload.publish_mode = mode;\r\n  \r\n          updatePublishPayloadPreview();\r\n          setPublishButtonsDisabled(true);\r\n  \r\n          setPublishNotice(\r\n            \"loading\",\r\n            mode === \"publish\" ? \"\u6B63\u5728\u53D1\u5E03\u6587\u7AE0\" : \"\u6B63\u5728\u4FDD\u5B58\u8349\u7A3F\",\r\n            \"\u8BF7\u7A0D\u5019\uFF0C\u7CFB\u7EDF\u6B63\u5728\u5C06\u6587\u7AE0\u63D0\u4EA4\u5230 Shopify\u3002\"\r\n          );\r\n  \r\n          try {\r\n            const data = await apiPost(\"/shopify/create-article\", { payload });\r\n            applySourceUsageStatus(data?.source_usage || null);\r\n  \r\n            const articleTitle = data?.article?.title || payload.title;\r\n            const articleUrl = data?.article_url || \"\";\r\n  \r\n            setPublishNotice(\r\n              \"success\",\r\n              mode === \"publish\" ? \"\u53D1\u5E03\u6210\u529F\" : \"\u8349\u7A3F\u4FDD\u5B58\u6210\u529F\",\r\n              articleTitle,\r\n              articleUrl\r\n            );\r\n          } catch (err) {\r\n            setPublishNotice(\r\n              \"error\",\r\n              mode === \"publish\" ? \"\u53D1\u5E03\u5931\u8D25\" : \"\u4FDD\u5B58\u8349\u7A3F\u5931\u8D25\",\r\n              err.message\r\n            );\r\n          } finally {\r\n            setPublishButtonsDisabled(false);\r\n          }\r\n        }\r\n  \r\n      function updatePublishPayloadPreview() {\r\n        const area = $(\"publishPayloadPreview\");\r\n        if (!area) return;\r\n        area.value = JSON.stringify(buildPublishPayload(), null, 2);\r\n      }\r\n  \r\n      function syncPublishStep(force = true) {\r\n        const mappedBlog = getMappedBlogTitle();\r\n        const publishTitle = $(\"finalTitle\").value.trim();\r\n        const seoTitle = $(\"seoTitle\").value.trim() || publishTitle;\r\n        const excerpt = $(\"excerpt\").value.trim();\r\n        const metaDescription = $(\"metaDescription\").value.trim();\r\n        const tags = buildDefaultPublishTags();\r\n  \r\n        if (force || !$(\"publishBlog\").value) $(\"publishBlog\").value = mappedBlog;\r\n        if (force || !$(\"publishTitle\").value.trim()) $(\"publishTitle\").value = publishTitle;\r\n  \r\n        if (force || !$(\"publishHandle\").value.trim()) {\r\n          const autoHandle = slugify(publishTitle);\r\n          $(\"publishHandle\").value = autoHandle;\r\n          $(\"publishHandle\").dataset.lastAutoValue = autoHandle;\r\n        }\r\n  \r\n        if (force || !$(\"publishExcerpt\").value.trim()) $(\"publishExcerpt\").value = excerpt;\r\n        if (force || !$(\"publishSeoTitle\").value.trim()) $(\"publishSeoTitle\").value = seoTitle;\r\n        if (force || !$(\"publishMetaDescription\").value.trim()) $(\"publishMetaDescription\").value = metaDescription;\r\n        if (force || !$(\"publishTags\").value.trim()) $(\"publishTags\").value = tags;\r\n  \r\n        renderPublishCoverOptions();\r\n        renderArticlePreview();\r\n        updatePublishPayloadPreview();\r\n      }\r\n  \r\n      function getFieldValue(id) {\r\n        const el = $(id);\r\n        return el ? el.value : \"\";\r\n      }\r\n  \r\n      function setFieldValue(id, value) {\r\n        const el = $(id);\r\n        if (!el || value == null) return;\r\n        el.value = value;\r\n      }\r\n  \r\n      function setCheckboxValue(id, checked) {\r\n        const el = $(id);\r\n        if (!el) return;\r\n        el.checked = !!checked;\r\n        el.dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n      }\r\n  \r\n      function setBuilderMode(mode) {\r\n        builderMode = mode === \"auto\" || mode === \"manual\" ? mode : \"\";\r\n        const isAuto = builderMode === \"auto\";\r\n        const isManual = builderMode === \"manual\";\r\n  \r\n        const manualBtn = $(\"btnManualMode\");\r\n        const autoBtn = $(\"btnAutoMode\");\r\n        if (manualBtn) {\r\n          manualBtn.classList.toggle(\"is-active\", isManual);\r\n        }\r\n        if (autoBtn) {\r\n          autoBtn.classList.toggle(\"is-active\", isAuto);\r\n        }\r\n  \r\n        const manualFlow = $(\"manualFlow\");\r\n        const autoWorkspace = $(\"autoWorkspace\");\r\n        if (manualFlow) manualFlow.hidden = !isManual;\r\n        if (autoWorkspace) autoWorkspace.hidden = !isAuto;\r\n  \r\n        if (isManual) {\r\n          setStep(currentStep || 1);\r\n        }\r\n  \r\n        const desc = $(\"builderModeDesc\");\r\n        if (desc) {\r\n          desc.textContent = isAuto\r\n            ? \"\u5F53\u524D\u4E3A\u81EA\u52A8\u6A21\u5F0F\u3002\u8BBE\u7F6E\u6279\u91CF\u53C2\u6570\u540E\uFF0C\u7CFB\u7EDF\u4F1A\u751F\u6210\u6587\u7AE0\u961F\u5217\u5E76\u652F\u6301\u5B9A\u65F6\u53D1\u5E03\u3002\"\r\n            : isManual\r\n              ? \"\u5F53\u524D\u4E3A\u624B\u52A8\u6A21\u5F0F\u3002\u6309 5 \u6B65\u751F\u6210\u5E76\u68C0\u67E5\u5355\u7BC7\u535A\u5BA2\u3002\"\r\n              : \"\u8BF7\u9009\u62E9\u751F\u6210\u6A21\u5F0F\u3002\u624B\u52A8\u6A21\u5F0F\u9002\u5408\u5355\u7BC7\u7CBE\u4FEE\uFF0C\u81EA\u52A8\u6A21\u5F0F\u9002\u5408\u6279\u91CF\u751F\u6210\u5E76\u5B9A\u65F6\u53D1\u5E03\u3002\";\r\n        }\r\n        setStatus(\"builderModeStatus\", isAuto\r\n          ? \"\u81EA\u52A8\u5DE5\u4F5C\u53F0\u5DF2\u6253\u5F00\u3002\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u53EF\u542F\u52A8\u5F53\u524D\u6279\u6B21\uFF1B\u5F00\u542F\u81EA\u52A8\u8FD0\u884C\u540E\uFF0CWorker \u4F1A\u6309\u5468\u671F\u521B\u5EFA\u540E\u7EED\u6279\u6B21\u3002\"\r\n          : isManual\r\n            ? \"\u624B\u52A8 5 \u6B65\u6D41\u7A0B\u5DF2\u6253\u5F00\u3002\"\r\n            : \"\"\r\n        );\r\n        syncReferenceOptionState();\r\n      }\r\n  \r\n      function buildBlogDraft() {\r\n        const articleHtml = getCurrentArticleHtml();\r\n        const referenceImages = {\r\n          product: !!($(\"refProductImage\") && $(\"refProductImage\").checked),\r\n          package: !!($(\"refPackageImage\") && $(\"refPackageImage\").checked)\r\n        };\r\n  \r\n        return {\r\n          version: \"blog-draft-v1\",\r\n          source: builderMode,\r\n          updated_at: new Date().toISOString(),\r\n          step: currentStep,\r\n          inputs: {\r\n            content_type: getFieldValue(\"contentType\"),\r\n            image_count: getFieldValue(\"titleImageCount\"),\r\n            pet_type: getFieldValue(\"petType\"),\r\n            pet_breed: getFieldValue(\"petBreedSelect\"),\r\n            pet_feature_note: getFieldValue(\"petFeatureNote\"),\r\n            product_name: getFieldValue(\"productName\"),\r\n            target_keywords: getFieldValue(\"targetKeywords\"),\r\n            source_query: getFieldValue(\"sourceQuery\"),\r\n            source_focus: getFieldValue(\"sourceFocus\"),\r\n            source_limit: getFieldValue(\"sourceLimit\"),\r\n            source_urls: getFieldValue(\"sourceUrls\"),\r\n            rewrite_intensity: getFieldValue(\"rewriteIntensity\"),\r\n            article_style_variant: getFieldValue(\"articleStyleVariant\"),\r\n            brand_tone_preset: getFieldValue(\"brandTonePreset\"),\r\n            brand_tone: getFieldValue(\"brandTone\"),\r\n            promotion_goal_preset: getFieldValue(\"promotionGoalPreset\"),\r\n            promotion_goal: getFieldValue(\"promotionGoal\"),\r\n            notes: getFieldValue(\"notes\"),\r\n            reference_images: referenceImages\r\n          },\r\n          selected_product: { ...selectedProduct },\r\n          sources: {\r\n            candidates: currentContentSources,\r\n            selected: selectedContentSource,\r\n            extract: currentSourceExtract,\r\n            rewrite_result: currentRewriteResult\r\n          },\r\n          title: {\r\n            final_title: getFieldValue(\"finalTitle\"),\r\n            article_angle: getFieldValue(\"articleAngle\"),\r\n            article_outline: getFieldValue(\"articleOutline\"),\r\n            seo_title: getFieldValue(\"seoTitle\"),\r\n            meta_description: getFieldValue(\"metaDescription\")\r\n          },\r\n          text: {\r\n            article_html: articleHtml,\r\n            excerpt: getFieldValue(\"excerpt\"),\r\n            section_summaries: getFieldValue(\"sectionSummaries\"),\r\n            notes: getFieldValue(\"textNotes\")\r\n          },\r\n          links: {\r\n            base_article_html: linkBaseArticleHtml,\r\n            linked_article_html: linkedArticleHtml,\r\n            raw: getFieldValue(\"linkRaw\"),\r\n            analysis: currentLinkAnalysis,\r\n            selected_ids: Array.from(selectedLinkSuggestionIds)\r\n          },\r\n          images: {\r\n            image_count: getFieldValue(\"imageCount\"),\r\n            image_mode: getFieldValue(\"imageMode\"),\r\n            image_ratio: getFieldValue(\"imageRatio\"),\r\n            image_model: getFieldValue(\"imageModel\"),\r\n            product_visual_mode: getFieldValue(\"productVisualMode\"),\r\n            pet_character_anchor: getFieldValue(\"petCharacterAnchor\"),\r\n            global_negative_prompt: getFieldValue(\"globalNePrompt\"),\r\n            task_id: currentTaskId,\r\n            tasks_json: getFieldValue(\"imageTasksJson\"),\r\n            planned_tasks: currentPlannedTasks,\r\n            slot_labels: currentSlotLabels,\r\n            results: currentResults\r\n          },\r\n          publish: {\r\n            blog: getFieldValue(\"publishBlog\"),\r\n            title: getFieldValue(\"publishTitle\"),\r\n            handle: getFieldValue(\"publishHandle\"),\r\n            excerpt: getFieldValue(\"publishExcerpt\"),\r\n            seo_title: getFieldValue(\"publishSeoTitle\"),\r\n            meta_description: getFieldValue(\"publishMetaDescription\"),\r\n            tags: getFieldValue(\"publishTags\"),\r\n            cover_source: getFieldValue(\"publishCoverSource\")\r\n          }\r\n        };\r\n      }\r\n  \r\n      function restoreSelectedProduct(product) {\r\n        if (!product || !product.title) {\r\n          clearSelectedProduct();\r\n          return;\r\n        }\r\n        selectedProduct = {\r\n          title: product.title || \"\",\r\n          image: product.image || \"\",\r\n          images: Array.isArray(product.images) ? product.images : [],\r\n          tags: Array.isArray(product.tags) ? product.tags : [],\r\n          url: product.url || \"\",\r\n          handle: product.handle || \"\"\r\n        };\r\n        setFieldValue(\"productName\", selectedProduct.title);\r\n        setFieldValue(\"textProductName\", selectedProduct.title);\r\n        updateProductUI();\r\n      }\r\n  \r\n      function loadBlogDraft(draft) {\r\n        if (!draft || typeof draft !== \"object\") throw new Error(\"\u8349\u7A3F JSON \u683C\u5F0F\u4E0D\u6B63\u786E\u3002\");\r\n  \r\n        setBuilderMode(draft.source === \"auto\" ? \"auto\" : \"manual\");\r\n  \r\n        const inputs = draft.inputs || {};\r\n        setFieldValue(\"contentType\", inputs.content_type);\r\n        syncContentTypeConfig();\r\n        setFieldValue(\"titleImageCount\", inputs.image_count);\r\n        setFieldValue(\"petType\", inputs.pet_type);\r\n        populatePetBreedOptions();\r\n        setFieldValue(\"petBreedSelect\", inputs.pet_breed);\r\n        setFieldValue(\"petFeatureNote\", inputs.pet_feature_note);\r\n        setFieldValue(\"targetKeywords\", inputs.target_keywords);\r\n        setFieldValue(\"sourceQuery\", inputs.source_query);\r\n        setFieldValue(\"sourceFocus\", inputs.source_focus);\r\n        setFieldValue(\"sourceLimit\", inputs.source_limit || \"3\");\r\n        setFieldValue(\"sourceUrls\", inputs.source_urls);\r\n        setFieldValue(\"rewriteIntensity\", inputs.rewrite_intensity);\r\n        setFieldValue(\"brandTonePreset\", inputs.brand_tone_preset);\r\n        setFieldValue(\"brandTone\", inputs.brand_tone);\r\n        setFieldValue(\"promotionGoalPreset\", inputs.promotion_goal_preset);\r\n        setFieldValue(\"promotionGoal\", inputs.promotion_goal);\r\n        setFieldValue(\"articleStyleVariant\", inputs.article_style_variant);\r\n        setFieldValue(\"notes\", inputs.notes);\r\n  \r\n        restoreSelectedProduct(draft.selected_product);\r\n        const sources = draft.sources || {};\r\n        currentContentSources = Array.isArray(sources.candidates) ? sources.candidates : [];\r\n        selectedContentSource = sources.selected || null;\r\n        currentSourceExtract = sources.extract || null;\r\n        currentRewriteResult = sources.rewrite_result || null;\r\n        renderSourceMaterials(currentContentSources);\r\n        renderSelectedSourceSummary();\r\n        renderOriginalSourceViewer();\r\n        renderRewriteCompareList();\r\n        syncReferenceOptionState();\r\n        const refs = inputs.reference_images || {};\r\n        setCheckboxValue(\"refProductImage\", refs.product);\r\n        setCheckboxValue(\"refPackageImage\", refs.package);\r\n  \r\n        const title = draft.title || {};\r\n        setFieldValue(\"finalTitle\", title.final_title);\r\n        setFieldValue(\"articleAngle\", title.article_angle);\r\n        setFieldValue(\"articleOutline\", title.article_outline);\r\n        setFieldValue(\"seoTitle\", title.seo_title);\r\n        setFieldValue(\"metaDescription\", title.meta_description);\r\n  \r\n        const text = draft.text || {};\r\n        const articleHtml = text.article_html || draft.links?.linked_article_html || \"\";\r\n        if (articleHtml) {\r\n          setFieldValue(\"textRaw\", articleHtml);\r\n          $(\"articleEditor\").innerHTML = articleHtml;\r\n        }\r\n        setFieldValue(\"excerpt\", text.excerpt);\r\n        setFieldValue(\"sectionSummaries\", text.section_summaries);\r\n        setFieldValue(\"textNotes\", text.notes);\r\n  \r\n        const links = draft.links || {};\r\n        linkBaseArticleHtml = links.base_article_html || articleHtml || \"\";\r\n        linkedArticleHtml = links.linked_article_html || \"\";\r\n        currentLinkAnalysis = links.analysis || null;\r\n        selectedLinkSuggestionIds = new Set(Array.isArray(links.selected_ids) ? links.selected_ids : []);\r\n        setFieldValue(\"linkRaw\", links.raw);\r\n        if (linkedArticleHtml) {\r\n          setFieldValue(\"textRaw\", linkedArticleHtml);\r\n          $(\"articleEditor\").innerHTML = linkedArticleHtml;\r\n          $(\"linkPreview\").innerHTML = linkedArticleHtml;\r\n        } else if (articleHtml) {\r\n          $(\"linkPreview\").innerHTML = articleHtml;\r\n        }\r\n        renderLinkArticleSummary();\r\n        if (currentLinkAnalysis) renderLinkSuggestions(currentLinkAnalysis);\r\n  \r\n        const images = draft.images || {};\r\n        setFieldValue(\"imageCount\", images.image_count);\r\n        setFieldValue(\"imageMode\", images.image_mode);\r\n        setFieldValue(\"imageRatio\", images.image_ratio);\r\n        updateAvailableModels();\r\n        setFieldValue(\"imageModel\", images.image_model);\r\n        setFieldValue(\"productVisualMode\", images.product_visual_mode);\r\n        setFieldValue(\"petCharacterAnchor\", images.pet_character_anchor);\r\n        setFieldValue(\"globalNePrompt\", images.global_negative_prompt);\r\n        currentTaskId = images.task_id || \"\";\r\n        currentPlannedTasks = Array.isArray(images.planned_tasks) ? images.planned_tasks : [];\r\n        currentSlotLabels = Array.isArray(images.slot_labels) ? images.slot_labels : [];\r\n        currentResults = Array.isArray(images.results) ? images.results : [];\r\n        setFieldValue(\"imageTasksJson\", images.tasks_json);\r\n        if (currentResults.length) renderResultCards();\r\n  \r\n        const publish = draft.publish || {};\r\n        syncPublishStep(false);\r\n        setFieldValue(\"publishBlog\", publish.blog);\r\n        setFieldValue(\"publishTitle\", publish.title);\r\n        setFieldValue(\"publishHandle\", publish.handle);\r\n        setFieldValue(\"publishExcerpt\", publish.excerpt);\r\n        setFieldValue(\"publishSeoTitle\", publish.seo_title);\r\n        setFieldValue(\"publishMetaDescription\", publish.meta_description);\r\n        setFieldValue(\"publishTags\", publish.tags);\r\n        renderPublishCoverOptions();\r\n        setFieldValue(\"publishCoverSource\", publish.cover_source);\r\n        updatePublishCoverPreview();\r\n        updatePublishPayloadPreview();\r\n  \r\n        if (title.final_title) unlockStep(2);\r\n        if (articleHtml) unlockStep(3);\r\n        if (articleHtml || linkedArticleHtml) unlockStep(4);\r\n        if (currentResults.length || draft.step >= 5) unlockStep(5);\r\n  \r\n        setStep(Math.max(1, Math.min(Number(draft.step || 1), 5)));\r\n        setStatus(\"builderModeStatus\", \"\u8349\u7A3F\u5DF2\u8F7D\u5165\uFF0C\u53EF\u7EE7\u7EED\u5728\u5F53\u524D\u6D41\u7A0B\u4E2D\u5FAE\u8C03\u3002\");\r\n      }\r\n  \r\n      function handleExportDraft() {\r\n        const draft = buildBlogDraft();\r\n        const text = JSON.stringify(draft, null, 2);\r\n        setFieldValue(\"blogDraftJson\", text);\r\n        if (navigator.clipboard && navigator.clipboard.writeText) {\r\n          navigator.clipboard.writeText(text).catch(() => {});\r\n        }\r\n        setStatus(\"builderModeStatus\", \"\u8349\u7A3F JSON \u5DF2\u751F\u6210\uFF0C\u53EF\u7528\u4E8E\u81EA\u52A8\u6D41\u56DE\u586B\u6216\u624B\u52A8\u5907\u4EFD\u3002\");\r\n      }\r\n  \r\n      function handleImportDraft() {\r\n        const raw = getFieldValue(\"blogDraftJson\").trim();\r\n        if (!raw) {\r\n          setStatus(\"builderModeStatus\", \"\u8BF7\u5148\u7C98\u8D34\u8349\u7A3F JSON\u3002\");\r\n          return;\r\n        }\r\n        try {\r\n          loadBlogDraft(JSON.parse(raw));\r\n        } catch (err) {\r\n          setStatus(\"builderModeStatus\", `\u8F7D\u5165\u8349\u7A3F\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      function toWorkerIso(value) {\r\n        const raw = String(value || \"\").trim();\r\n        if (!raw) return \"\";\r\n        const date = new Date(raw);\r\n        return Number.isNaN(date.getTime()) ? raw : date.toISOString();\r\n      }\r\n  \r\n      function toDatetimeLocalInputValue(value) {\r\n        const raw = String(value || \"\").trim();\r\n        if (!raw) return \"\";\r\n        const date = new Date(raw);\r\n        return Number.isNaN(date.getTime()) ? raw.slice(0, 16) : toDatetimeLocalValue(date);\r\n      }\r\n  \r\n      function getNextWorkerRunAt() {\r\n        const now = new Date();\r\n        const frequency = getFieldValue(\"autoWorkerFrequency\") === \"daily\" ? \"daily\" : \"weekly\";\r\n        const weekday = Math.max(0, Math.min(6, Number(getFieldValue(\"autoWorkerWeekday\") || 1)));\r\n        const time = getFieldValue(\"autoWorkerTime\") || \"01:00\";\r\n        const [hours, minutes] = time.split(\":\").map(value => Number(value));\r\n        const next = new Date(now);\r\n        next.setSeconds(0, 0);\r\n        next.setHours(Number.isFinite(hours) ? hours : 1, Number.isFinite(minutes) ? minutes : 0, 0, 0);\r\n  \r\n        if (frequency === \"daily\") {\r\n          if (next.getTime() <= now.getTime()) next.setDate(next.getDate() + 1);\r\n        } else {\r\n          const offset = (weekday - next.getDay() + 7) % 7;\r\n          next.setDate(next.getDate() + offset);\r\n          if (next.getTime() <= now.getTime()) next.setDate(next.getDate() + 7);\r\n        }\r\n  \r\n        return next.toISOString();\r\n      }\r\n\r\n      function getAutoContentTypeForBlog(blog) {\r\n        return AUTO_BLOG_CONTENT_TYPE_MAP[blog] || \"random\";\r\n      }\r\n\r\n      function getAutoConfig() {\r\n        const fullAutoEnabled = !!($(\"autoFullEnabled\") && $(\"autoFullEnabled\").checked);\r\n        const blog = getFieldValue(\"autoBlog\") || \"random\";\r\n        return {\r\n          blog,\r\n          content_type: getAutoContentTypeForBlog(blog),\r\n          pet_type: getFieldValue(\"autoPetType\"),\r\n          image_count: getFieldValue(\"autoImageCount\"),\r\n          image_mode: getFieldValue(\"imageMode\") || \"realistic lifestyle\",\r\n          image_ratio: getFieldValue(\"imageRatio\") || \"16:9\",\r\n          image_model: getFieldValue(\"imageModel\") || \"fal-ai/nano-banana-2\",\r\n          article_count: Math.max(1, Math.min(Number(getFieldValue(\"autoArticleCount\") || 1), 30)),\r\n          product_frequency: getFieldValue(\"autoProductFrequency\"),\r\n          publish_mode: \"scheduled\",\r\n          schedule_mode: getFieldValue(\"autoScheduleMode\") === \"weekly\" ? \"weekly\" : \"daily\",\r\n          schedule_interval_hours: 24,\r\n          product_scope: \"all\",\r\n          article_style: \"\",\r\n          brand_tone: \"\",\r\n          promotion_goal: \"\",\r\n          reference_history: false,\r\n          article_retry: Math.max(0, Number(getFieldValue(\"autoArticleRetry\") || 0)),\r\n          image_retry: Math.max(0, Number(getFieldValue(\"autoImageRetry\") || 0)),\r\n          notes: \"\",\r\n          execution_mode: \"full\",\r\n          full_auto_enabled: fullAutoEnabled,\r\n          worker_frequency: getFieldValue(\"autoWorkerFrequency\") || \"weekly\",\r\n          worker_weekday: Math.max(0, Math.min(6, Number(getFieldValue(\"autoWorkerWeekday\") || 1))),\r\n          worker_time: getFieldValue(\"autoWorkerTime\") || \"01:00\",\r\n          next_run_at: fullAutoEnabled\r\n            ? getNextWorkerRunAt()\r\n            : \"\"\r\n        };\r\n      }\r\n  \r\n      function syncAutoRunControls() {\r\n        const enabled = !!($(\"autoFullEnabled\") && $(\"autoFullEnabled\").checked);\r\n        if ($(\"autoRuntimeMode\")) $(\"autoRuntimeMode\").textContent = enabled ? \"\u5DF2\u5F00\u542F\" : \"\u5DF2\u5173\u95ED\";\r\n      }\r\n  \r\n      function formatAutoRuntimeDate(value) {\r\n        if (!value) return \"\u672A\u8BBE\u7F6E\";\r\n        const date = new Date(value);\r\n        if (Number.isNaN(date.getTime())) return String(value);\r\n        return date.toLocaleString(\"zh-CN\", {\r\n          year: \"numeric\",\r\n          month: \"2-digit\",\r\n          day: \"2-digit\",\r\n          hour: \"2-digit\",\r\n          minute: \"2-digit\"\r\n        });\r\n      }\r\n\r\n      function formatAutoPublishDate(value) {\r\n        if (!value) return \"\u672A\u8BBE\u7F6E\";\r\n        const date = new Date(value);\r\n        if (Number.isNaN(date.getTime())) return String(value);\r\n        return `${date.toLocaleString(\"zh-CN\", {\r\n          timeZone: \"America/New_York\",\r\n          year: \"numeric\",\r\n          month: \"2-digit\",\r\n          day: \"2-digit\",\r\n          hour: \"2-digit\",\r\n          minute: \"2-digit\"\r\n        })} ET`;\r\n      }\r\n  \r\n      function normalizeWorkerAutoTask(task) {\r\n        if (!task || typeof task !== \"object\") return null;\r\n        const jobs = Array.isArray(task.jobs) ? task.jobs.map((job, index) => ({\r\n          ...job,\r\n          id: job.id || job.job_id || \"\",\r\n          schedule_time: job.schedule_time || job.scheduled_at || \"\",\r\n          title: job.title || job.draft?.publish?.title || job.draft?.title?.final_title || `\u81EA\u52A8\u6587\u7AE0 ${job.index || index + 1}`\r\n        })) : [];\r\n        return { ...task, jobs };\r\n      }\r\n  \r\n      function renderAutoRuntime() {\r\n        const config = autoAutomationConfig || getAutoConfig();\r\n        const state = autoAutomationState || {};\r\n        const currentTask = currentAutoTaskId || state.active_task_id || state.latest_task_id || \"\";\r\n        const autoRunEnabled = $(\"autoFullEnabled\")\r\n          ? $(\"autoFullEnabled\").checked\r\n          : config.full_auto_enabled === true;\r\n  \r\n        if ($(\"autoRuntimeMode\")) $(\"autoRuntimeMode\").textContent = autoRunEnabled ? \"\u5DF2\u5F00\u542F\" : \"\u5DF2\u5173\u95ED\";\r\n        if ($(\"autoRuntimeTask\")) $(\"autoRuntimeTask\").textContent = currentTask ? currentTask.slice(0, 8) : \"\u6682\u65E0\";\r\n        if ($(\"autoRuntimeNextRun\")) $(\"autoRuntimeNextRun\").textContent = formatAutoRuntimeDate(state.next_run_at || config.next_run_at || \"\");\r\n        if ($(\"autoRuntimeLastRun\")) $(\"autoRuntimeLastRun\").textContent = state.last_run_status || state.last_tick_status || \"\u6682\u65E0\";\r\n      }\r\n  \r\n      function applyAutoAutomationStatus(data) {\r\n        const automation = data?.automation || data || {};\r\n        const config = automation.config || data?.config || null;\r\n        const state = automation.state || data?.state || null;\r\n        const task = normalizeWorkerAutoTask(data?.task || automation.task || null);\r\n  \r\n        if (config) {\r\n          autoAutomationConfig = config;\r\n          if ($(\"autoFullEnabled\")) $(\"autoFullEnabled\").checked = !!config.full_auto_enabled;\r\n          if ($(\"autoWorkerFrequency\")) $(\"autoWorkerFrequency\").value = config.worker_frequency || \"weekly\";\r\n          if ($(\"autoWorkerWeekday\")) $(\"autoWorkerWeekday\").value = String(config.worker_weekday ?? 1);\r\n          if ($(\"autoWorkerTime\")) $(\"autoWorkerTime\").value = config.worker_time || \"01:00\";\r\n          syncAutoRunControls();\r\n        }\r\n        if (state) autoAutomationState = state;\r\n        if (task) {\r\n          currentAutoTaskId = task.task_id || currentAutoTaskId;\r\n          autoArticleJobs = task.jobs || [];\r\n          renderAutoQueue();\r\n        }\r\n        renderAutoRuntime();\r\n      }\r\n  \r\n      function stopAutoStatusPolling() {\r\n        if (autoStatusPollTimer) {\r\n          clearTimeout(autoStatusPollTimer);\r\n          autoStatusPollTimer = null;\r\n        }\r\n      }\r\n  \r\n      function shouldContinueAutoPolling() {\r\n        const task = autoArticleJobs.length ? true : false;\r\n        if (!task) return false;\r\n        return autoArticleJobs.some(job => ![\"scheduled\", \"published\", \"draft\", \"failed\", \"ready\"].includes(String(job.status || \"\").toLowerCase()));\r\n      }\r\n  \r\n      function scheduleAutoStatusPolling(delay = 6000) {\r\n        stopAutoStatusPolling();\r\n        if (!shouldContinueAutoPolling()) return;\r\n        autoStatusPollTimer = setTimeout(async () => {\r\n          await refreshAutoAutomationStatus(true);\r\n          scheduleAutoStatusPolling();\r\n        }, delay);\r\n      }\r\n  \r\n      async function refreshAutoAutomationStatus(silent = false) {\r\n        try {\r\n          const data = await apiGet(\"/auto/status\", currentAutoTaskId ? { task_id: currentAutoTaskId } : {});\r\n          applyAutoAutomationStatus(data);\r\n          if (!silent) {\r\n            setStatus(\"autoRuntimeStatus\", \"\u5DF2\u5237\u65B0 Worker \u81EA\u52A8\u4EFB\u52A1\u72B6\u6001\u3002\");\r\n          }\r\n        } catch (err) {\r\n          if (!silent) {\r\n            setStatus(\"autoRuntimeStatus\", `\u8BFB\u53D6\u81EA\u52A8\u4EFB\u52A1\u72B6\u6001\u5931\u8D25\uFF1A${err.message}`);\r\n          }\r\n        }\r\n      }\r\n  \r\n      async function saveAutoAutomationSettings() {\r\n        const config = getAutoConfig();\r\n        setStatus(\"autoRuntimeStatus\", \"\u6B63\u5728\u4FDD\u5B58\u81EA\u52A8\u8BBE\u7F6E...\");\r\n        try {\r\n          const data = await apiPost(\"/auto/config\", {\r\n            config,\r\n            next_run_at: config.next_run_at\r\n          });\r\n          applyAutoAutomationStatus(data);\r\n          setStatus(\r\n            \"autoRuntimeStatus\",\r\n            config.full_auto_enabled\r\n              ? \"\u81EA\u52A8\u8FD0\u884C\u5DF2\u5F00\u542F\uFF0CWorker \u4F1A\u5728\u4E0B\u4E00\u6B21\u8BA1\u5212\u65F6\u95F4\u521B\u5EFA\u5E76\u7EE7\u7EED\u6267\u884C\u6279\u6B21\u3002\"\r\n              : \"\u81EA\u52A8\u8BBE\u7F6E\u5DF2\u4FDD\u5B58\u3002\u81EA\u52A8\u8FD0\u884C\u5173\u95ED\u65F6\uFF0C\u53EF\u70B9\u51FB\u201C\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u201D\u542F\u52A8\u6279\u6B21\u3002\"\r\n          );\r\n        } catch (err) {\r\n          setStatus(\"autoRuntimeStatus\", `\u4FDD\u5B58\u81EA\u52A8\u8BBE\u7F6E\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      function shouldCreateNewWorkerBatch() {\r\n        if (!currentAutoTaskId || !autoArticleJobs.length) return true;\r\n        return autoArticleJobs.every(job =>\r\n          [\"scheduled\", \"published\", \"draft\", \"failed\", \"ready\"].includes(String(job.status || \"\").toLowerCase())\r\n        );\r\n      }\r\n  \r\n      async function runWorkerAutoBatch() {\r\n        if (autoWorkflowRunning) return;\r\n        const config = getAutoConfig();\r\n        const newBatch = shouldCreateNewWorkerBatch();\r\n        autoWorkflowRunning = true;\r\n        [\"btnRunAutoNow\"].forEach(id => {\r\n          const button = $(id);\r\n          if (button) button.disabled = true;\r\n        });\r\n        setStatus(\"autoRuntimeStatus\", \"\u6B63\u5728\u521B\u5EFA\u6216\u7EE7\u7EED Worker \u81EA\u52A8\u4EFB\u52A1...\");\r\n  \r\n        try {\r\n          const data = await apiPost(\"/auto/run\", {\r\n            config,\r\n            new_batch: newBatch,\r\n            task_id: newBatch ? \"\" : currentAutoTaskId,\r\n            trigger: \"manual\"\r\n          });\r\n          currentAutoTaskId = data?.task_id || data?.task?.task_id || currentAutoTaskId;\r\n          if (data?.task) {\r\n            applyAutoAutomationStatus({\r\n              task: data.task,\r\n              automation: {\r\n                config: data?.automation?.config || config,\r\n                state: data?.automation?.state || autoAutomationState || {}\r\n              }\r\n            });\r\n          }\r\n          setStatus(\r\n            \"autoRuntimeStatus\",\r\n            data?.message || \"\u6279\u6B21\u5DF2\u521B\u5EFA\uFF0CWorker \u5DF2\u5F00\u59CB\u540E\u53F0\u5904\u7406\u7B2C\u4E00\u6B65\uFF1B\u9875\u9762\u4F1A\u81EA\u52A8\u5237\u65B0\u540E\u7EED\u72B6\u6001\u3002\"\r\n          );\r\n          await refreshAutoAutomationStatus(true);\r\n          scheduleAutoStatusPolling(1500);\r\n        } catch (err) {\r\n          setStatus(\"autoRuntimeStatus\", `\u542F\u52A8\u81EA\u52A8\u4EFB\u52A1\u5931\u8D25\uFF1A${err.message}`);\r\n        } finally {\r\n          autoWorkflowRunning = false;\r\n          [\"btnRunAutoNow\"].forEach(id => {\r\n            const button = $(id);\r\n            if (button) button.disabled = false;\r\n          });\r\n        }\r\n      }\r\n  \r\n      function pickFrom(values, fallback = \"\") {\r\n        const list = values.filter(Boolean);\r\n        if (!list.length) return fallback;\r\n        return list[Math.floor(Math.random() * list.length)] || fallback;\r\n      }\r\n  \r\n      function resolveAutoValue(value, choices, fallback = \"\") {\r\n        if (!value || value === \"random\") return pickFrom(choices, fallback);\r\n        return value;\r\n      }\r\n  \r\n      function formatAnalyticsDate(value) {\r\n        if (!value) return \"\u672A\u77E5\u65F6\u95F4\";\r\n        const date = new Date(value);\r\n        if (Number.isNaN(date.getTime())) return String(value);\r\n        return date.toLocaleString(\"zh-CN\", {\r\n          year: \"numeric\",\r\n          month: \"2-digit\",\r\n          day: \"2-digit\",\r\n          hour: \"2-digit\",\r\n          minute: \"2-digit\"\r\n        });\r\n      }\r\n  \r\n      function getAnalyticsRows() {\r\n        return Array.isArray(analyticsDashboard?.articles) ? analyticsDashboard.articles : [];\r\n      }\r\n  \r\n      function summarizeAnalyticsRows(rows, limit = 5) {\r\n        const list = Array.isArray(rows) ? rows : [];\r\n        if (!list.length) return \"\";\r\n  \r\n        const ranked = [...list].sort((a, b) => {\r\n          const aScore = (Number(a.views || 0) * 1) + (Number(a.link_clicks || 0) * 3) + (Number(a.product_clicks || 0) * 4) + (Number(a.revenue || 0) * 0.1);\r\n          const bScore = (Number(b.views || 0) * 1) + (Number(b.link_clicks || 0) * 3) + (Number(b.product_clicks || 0) * 4) + (Number(b.revenue || 0) * 0.1);\r\n          return bScore - aScore;\r\n        }).slice(0, limit);\r\n  \r\n        const items = ranked.map((article, index) => {\r\n          const title = String(article?.title || \"\").trim();\r\n          const blogTitle = String(article?.blog?.title || article?.blog?.handle || \"\").trim();\r\n          const publishedAt = formatAnalyticsDate(article?.published_at || article?.publishedAt || \"\");\r\n          const bits = [\r\n            `#${index + 1}`,\r\n            title ? `\u6807\u9898\uFF1A${title}` : \"\",\r\n            blogTitle ? `\u680F\u76EE\uFF1A${blogTitle}` : \"\",\r\n            publishedAt ? `\u65F6\u95F4\uFF1A${publishedAt}` : \"\",\r\n            `\u6D4F\u89C8\uFF1A${Number(article?.views || 0)}`,\r\n            `\u70B9\u51FB\uFF1A${Number(article?.link_clicks || 0)}`,\r\n            `\u4EA7\u54C1\u70B9\u51FB\uFF1A${Number(article?.product_clicks || 0)}`,\r\n            `\u9500\u552E\uFF1A${Number(article?.sales || 0)}`,\r\n            `\u91D1\u989D\uFF1A${Number(article?.revenue || 0)}`\r\n          ].filter(Boolean);\r\n          return bits.join(\"\uFF0C\");\r\n        });\r\n  \r\n        return [\"\u4F18\u5148\u53C2\u8003\u7684\u5386\u53F2\u8868\u73B0\u6587\u7AE0\uFF1A\", ...items].join(\"\\n\");\r\n      }\r\n  \r\n      function shouldAutoJobIncludeProduct(index, frequency) {\r\n        if (frequency === \"none\") return false;\r\n        if (frequency === \"all\") return true;\r\n        if (frequency === \"random\") return Math.random() < 0.35;\r\n        const parts = String(frequency || \"\").split(\"/\").map(Number);\r\n        if (parts.length !== 2 || !parts[0] || !parts[1]) return false;\r\n        return (index % parts[1]) < parts[0];\r\n      }\r\n  \r\n      function addHours(date, hours) {\r\n        const next = new Date(date.getTime());\r\n        next.setHours(next.getHours() + hours);\r\n        return next;\r\n      }\r\n  \r\n      function toDatetimeLocalValue(date) {\r\n        const pad = value => String(value).padStart(2, \"0\");\r\n        return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\r\n      }\r\n  \r\n      function getAutoScheduleTime(config, index) {\r\n        const start = config.start_time ? new Date(config.start_time) : new Date();\r\n        if (config.publish_mode !== \"scheduled\") return \"\";\r\n        if (config.schedule_mode === \"weekly\") return toDatetimeLocalValue(addHours(start, index * 24 * 7));\r\n        if (config.schedule_mode === \"custom\") return toDatetimeLocalValue(addHours(start, index * config.schedule_interval_hours));\r\n        return toDatetimeLocalValue(addHours(start, index * 24));\r\n      }\r\n  \r\n      function buildAutoJobDraft(job, config) {\r\n        const contentType = resolveAutoValue(config.content_type, [\"nutrition-benefits\", \"feeding-guides\", \"recipes-diy\", \"brand-news-events\"], \"nutrition-benefits\");\r\n        const petType = resolveAutoValue(config.pet_type, [\"dog\", \"cat\"], \"dog\");\r\n        const imageCount = resolveAutoValue(config.image_count, [\"2\", \"3\", \"4\"], \"3\");\r\n        const blog = resolveAutoValue(config.blog, PUBLISH_BLOG_OPTIONS, \"Nutrition & Benefits\");\r\n        const style = String(config.article_style || \"\").trim();\r\n        const productNote = job.include_product\r\n          ? `Use one relevant product from ${config.product_scope || \"all\"} product scope.`\r\n          : \"Do not force a specific product mention unless naturally relevant.\";\r\n        const historyNote = config.reference_history\r\n          ? buildHistoryReferenceSummary(getAnalyticsRows())\r\n          : \"\";\r\n  \r\n        return {\r\n          version: \"blog-draft-v1\",\r\n          source: \"auto\",\r\n          updated_at: new Date().toISOString(),\r\n          step: 1,\r\n          auto_job_id: job.id,\r\n          inputs: {\r\n            content_type: contentType,\r\n            image_count: imageCount,\r\n            pet_type: petType,\r\n            pet_breed: \"\",\r\n            pet_feature_note: \"\",\r\n            product_name: \"\",\r\n            target_keywords: `${petType} treats, natural pet treats, premium pet treats`,\r\n            source_query: `${petType} treats, natural pet treats, premium pet treats`,\r\n            source_focus: \"authority_brand\",\r\n            source_limit: \"3\",\r\n            source_urls: \"\",\r\n            rewrite_intensity: \"limited\",\r\n            article_style_variant: style,\r\n            brand_tone_preset: config.brand_tone,\r\n            brand_tone: config.brand_tone,\r\n            promotion_goal_preset: config.promotion_goal,\r\n            promotion_goal: config.promotion_goal,\r\n            notes: [config.notes, historyNote, productNote].filter(Boolean).join(\"\\n\"),\r\n            reference_images: { product: false, package: false }\r\n          },\r\n          selected_product: {},\r\n          title: {},\r\n          text: {},\r\n          links: {},\r\n          images: {\r\n            image_count: imageCount\r\n          },\r\n          publish: {\r\n            blog,\r\n            title: \"\",\r\n            handle: \"\",\r\n            excerpt: \"\",\r\n            seo_title: \"\",\r\n            meta_description: \"\",\r\n            tags: \"\",\r\n            cover_source: \"0\"\r\n          }\r\n        };\r\n      }\r\n  \r\n      function renderAnalyticsDashboard() {\r\n        const summaryWrap = $(\"analyticsSummary\");\r\n        const listWrap = $(\"analyticsArticleList\");\r\n        if (!summaryWrap || !listWrap) return;\r\n  \r\n        if (analyticsLoading) {\r\n          summaryWrap.innerHTML = `\r\n            <div class=\"ct-analytics-summary-item\"><div class=\"ct-analytics-summary-label\">\u72B6\u6001</div><div class=\"ct-analytics-summary-value\">\u52A0\u8F7D\u4E2D</div></div>\r\n          `;\r\n          listWrap.innerHTML = `<div class=\"ct-history-empty\">\u6B63\u5728\u52A0\u8F7D\u535A\u5BA2\u6570\u636E\u2026\u2026</div>`;\r\n          return;\r\n        }\r\n  \r\n        const data = analyticsDashboard || { totals: {}, articles: [] };\r\n        const totals = data.totals || {};\r\n        const rows = getAnalyticsRows();\r\n  \r\n        summaryWrap.innerHTML = `\r\n          <div class=\"ct-analytics-summary-item\"><div class=\"ct-analytics-summary-label\">\u6587\u7AE0\u6570</div><div class=\"ct-analytics-summary-value\">${escapeHtml(String(rows.length || 0))}</div></div>\r\n          <div class=\"ct-analytics-summary-item\"><div class=\"ct-analytics-summary-label\">\u6D4F\u89C8</div><div class=\"ct-analytics-summary-value\">${escapeHtml(String(Number(totals.views || 0)))}</div></div>\r\n          <div class=\"ct-analytics-summary-item\"><div class=\"ct-analytics-summary-label\">\u94FE\u63A5\u70B9\u51FB</div><div class=\"ct-analytics-summary-value\">${escapeHtml(String(Number(totals.link_clicks || 0)))}</div></div>\r\n          <div class=\"ct-analytics-summary-item\"><div class=\"ct-analytics-summary-label\">\u4EA7\u54C1\u70B9\u51FB</div><div class=\"ct-analytics-summary-value\">${escapeHtml(String(Number(totals.product_clicks || 0)))}</div></div>\r\n          <div class=\"ct-analytics-summary-item\"><div class=\"ct-analytics-summary-label\">\u9500\u552E\u989D</div><div class=\"ct-analytics-summary-value\">${escapeHtml(String(Number(totals.revenue || 0)))}</div></div>\r\n        `;\r\n  \r\n        if (!rows.length) {\r\n          const debug = analyticsDashboard?.debug ? `<div class=\"ct-history-empty\">\u8C03\u8BD5\u4FE1\u606F\uFF1A${escapeHtml(JSON.stringify(analyticsDashboard.debug))}</div>` : \"\";\r\n          listWrap.innerHTML = `<div class=\"ct-history-empty\">\u6682\u65E0\u53EF\u7528\u7684\u535A\u5BA2\u6570\u636E\u3002\u5148\u53D1\u5E03\u4E00\u4E9B\u6587\u7AE0\u540E\u518D\u6765\u67E5\u770B\u3002</div>${debug}`;\r\n          return;\r\n        }\r\n  \r\n        listWrap.innerHTML = rows.map((article) => {\r\n          const title = article?.title || \"\";\r\n          const blogTitle = article?.blog?.title || article?.blog?.handle || \"\";\r\n          const published = article?.published_at || article?.publishedAt || \"\";\r\n          return `\r\n            <div class=\"ct-analytics-item\">\r\n              <div class=\"ct-analytics-item-title\">${escapeHtml(title)}</div>\r\n              <div class=\"ct-analytics-item-meta\">${escapeHtml(blogTitle)} \u00B7 ${escapeHtml(formatAnalyticsDate(published))}</div>\r\n              <div class=\"ct-analytics-item-meta\">\r\n                \u6D4F\u89C8 ${escapeHtml(String(Number(article.views || 0)))} \u00B7\r\n                \u94FE\u63A5\u70B9\u51FB ${escapeHtml(String(Number(article.link_clicks || 0)))} \u00B7\r\n                \u4EA7\u54C1\u70B9\u51FB ${escapeHtml(String(Number(article.product_clicks || 0)))} \u00B7\r\n                \u9500\u552E ${escapeHtml(String(Number(article.sales || 0)))} \u00B7\r\n                \u91D1\u989D ${escapeHtml(String(Number(article.revenue || 0)))}\r\n              </div>\r\n            </div>\r\n          `;\r\n        }).join(\"\");\r\n        if (analyticsDashboard?.debug) {\r\n          listWrap.insertAdjacentHTML(\"afterbegin\", `<div class=\"ct-history-empty\">\u8C03\u8BD5\u4FE1\u606F\uFF1A${escapeHtml(JSON.stringify(analyticsDashboard.debug))}</div>`);\r\n        }\r\n      }\r\n  \r\n      async function loadAnalyticsDashboard() {\r\n        analyticsLoading = true;\r\n        renderAnalyticsDashboard();\r\n        try {\r\n          const url = new URL(`${getAnalyticsWorkerBase()}/analytics/dashboard`);\r\n          url.searchParams.set(\"limit\", \"20\");\r\n          url.searchParams.set(\"key\", getAnalyticsAdminKey());\r\n          const resp = await fetch(url.toString(), { method: \"GET\" });\r\n          const data = await resp.json();\r\n          if (!resp.ok) {\r\n            throw new Error([data.error, data.message, `HTTP ${resp.status}`].filter(Boolean).join(\" | \"));\r\n          }\r\n          analyticsDashboard = data;\r\n          renderAnalyticsDashboard();\r\n        } catch (err) {\r\n          analyticsDashboard = { totals: {}, articles: [] };\r\n          renderAnalyticsDashboard();\r\n          setStatus(\"builderModeStatus\", `\u535A\u5BA2\u6570\u636E\u52A0\u8F7D\u5931\u8D25\uFF1A${err.message}`);\r\n        } finally {\r\n          analyticsLoading = false;\r\n          renderAnalyticsDashboard();\r\n        }\r\n      }\r\n  \r\n      function createAutoJobs(config) {\r\n        const total = config.article_count;\r\n        return Array.from({ length: total }, (_, index) => {\r\n          const id = `auto-${Date.now()}-${index + 1}`;\r\n          const includeProduct = shouldAutoJobIncludeProduct(index, config.product_frequency);\r\n          const job = {\r\n            id,\r\n            index: index + 1,\r\n            title: `\u81EA\u52A8\u6587\u7AE0 ${index + 1}`,\r\n            status: \"pending\",\r\n            status_label: \"\u5F85\u751F\u6210\",\r\n            include_product: includeProduct,\r\n            schedule_time: getAutoScheduleTime(config, index),\r\n            draft: null,\r\n            error: \"\"\r\n          };\r\n          job.draft = buildAutoJobDraft(job, config);\r\n          return job;\r\n        });\r\n      }\r\n  \r\n      function setAutoJobStatus(job, status, label, error = \"\") {\r\n        job.status = status;\r\n        job.status_label = label;\r\n        job.error = error;\r\n        renderAutoQueue();\r\n      }\r\n  \r\n      function startAutoJobElapsedStatus(job, label) {\r\n        const startedAt = Date.now();\r\n        const update = () => {\r\n          const elapsed = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\r\n          setAutoJobStatus(job, \"running\", `${label}\uFF0C\u5DF2\u7B49\u5F85 ${elapsed} \u79D2`);\r\n        };\r\n        update();\r\n        const timer = setInterval(update, 5000);\r\n        return () => clearInterval(timer);\r\n      }\r\n  \r\n      function saveAutoJobDraftSnapshot(job, step) {\r\n        if (!job) return;\r\n        const draft = buildBlogDraft();\r\n        draft.source = \"auto\";\r\n        draft.auto_job_id = job.id;\r\n        draft.step = step || currentStep || draft.step || 1;\r\n        job.draft = draft;\r\n        job.title = draft.publish?.title || draft.title?.final_title || job.title;\r\n      }\r\n  \r\n      function autoCollectionHandleFromScope(scope) {\r\n        if (!scope || scope === \"all\") return \"all-chewtrue-treats\";\r\n        return scope;\r\n      }\r\n  \r\n      async function fetchProductsFromCollection(handle) {\r\n        const cleanHandle = String(handle || \"\").trim().replace(/^\\/+|\\/+$/g, \"\");\r\n        if (!cleanHandle) return [];\r\n        const resp = await fetch(`/collections/${cleanHandle}/products.json?limit=50`, {\r\n          headers: { \"Accept\": \"application/json\" }\r\n        });\r\n        if (!resp.ok) throw new Error(`\u4EA7\u54C1\u6C60\u8BFB\u53D6\u5931\u8D25\uFF1AHTTP ${resp.status}`);\r\n        const data = await resp.json();\r\n        return Array.isArray(data?.products) ? data.products : [];\r\n      }\r\n  \r\n      async function pickAutoProduct(config, petType) {\r\n        const handle = autoCollectionHandleFromScope(config.product_scope);\r\n        const products = await fetchProductsFromCollection(handle);\r\n        const compatible = products.filter(product => isProductCompatibleWithPetType(product, petType));\r\n        const pool = compatible.length ? compatible : products;\r\n        if (!pool.length) return null;\r\n        const picked = pool[Math.floor(Math.random() * pool.length)];\r\n        const full = picked?.handle ? await fetchProductJsonByHandle(picked.handle) : picked;\r\n        const imageUrl = getProductImageUrl(full || picked);\r\n        const images = normalizeImageUrlList((full?.images || picked?.images || []), 4);\r\n        return {\r\n          title: full?.title || picked?.title || \"\",\r\n          handle: full?.handle || picked?.handle || \"\",\r\n          url: full?.handle || picked?.handle ? `/products/${full?.handle || picked?.handle}` : \"\",\r\n          featured_image: imageUrl || images[0] || \"\",\r\n          image: imageUrl || images[0] || \"\",\r\n          images: images.length ? images : normalizeImageUrlList([imageUrl], 4),\r\n          tags: Array.isArray(full?.tags) ? full.tags : (Array.isArray(picked?.tags) ? picked.tags : [])\r\n        };\r\n      }\r\n  \r\n      function applyAutoDraftInputs(draft) {\r\n        const inputs = draft.inputs || {};\r\n        setFieldValue(\"contentType\", inputs.content_type);\r\n        syncContentTypeConfig();\r\n        setFieldValue(\"titleImageCount\", inputs.image_count);\r\n        setFieldValue(\"imageCount\", inputs.image_count);\r\n        setFieldValue(\"petType\", inputs.pet_type);\r\n        populatePetBreedOptions();\r\n        setFieldValue(\"targetKeywords\", inputs.target_keywords);\r\n        setFieldValue(\"sourceQuery\", inputs.source_query || inputs.target_keywords);\r\n        setFieldValue(\"sourceFocus\", inputs.source_focus || \"authority_brand\");\r\n        setFieldValue(\"sourceLimit\", inputs.source_limit || \"3\");\r\n        setFieldValue(\"sourceUrls\", inputs.source_urls || \"\");\r\n        setFieldValue(\"rewriteIntensity\", inputs.rewrite_intensity || \"limited\");\r\n        setFieldValue(\"articleStyleVariant\", inputs.article_style_variant);\r\n        setFieldValue(\"brandTonePreset\", inputs.brand_tone_preset);\r\n        setFieldValue(\"brandTone\", inputs.brand_tone);\r\n        setFieldValue(\"promotionGoalPreset\", inputs.promotion_goal_preset);\r\n        setFieldValue(\"promotionGoal\", inputs.promotion_goal);\r\n        setFieldValue(\"notes\", inputs.notes);\r\n        setFieldValue(\"textTargetKeywords\", inputs.target_keywords);\r\n        setFieldValue(\"textBrandTone\", inputs.brand_tone);\r\n        setFieldValue(\"textPromotionGoal\", inputs.promotion_goal);\r\n        setFieldValue(\"textNotes\", inputs.notes);\r\n        updateAvailableModels();\r\n      }\r\n  \r\n      function chooseAutoTitleOption(titleList) {\r\n        if (!Array.isArray(titleList) || !titleList.length) return null;\r\n        return titleList[Math.floor(Math.random() * titleList.length)] || titleList[0];\r\n      }\r\n  \r\n      async function runAutoTitleStep(job) {\r\n        const discovery = await apiPost(\"/content/discover\", buildContentDiscoveryPayload());\r\n        currentContentSources = normalizeContentSources(discovery);\r\n        if (!currentContentSources.length) {\r\n          throw new Error(\"\u6CA1\u6709\u53EF\u7528\u7684\u672A\u4F7F\u7528\u6765\u6E90\u6587\u7AE0\u3002\u5DF2\u4F7F\u7528\u7684\u539F\u6587 URL \u4F1A\u88AB\u81EA\u52A8\u6392\u9664\uFF0C\u8BF7\u66F4\u6362\u4E3B\u9898\u6216\u6269\u5927\u9009\u6750\u8303\u56F4\u3002\");\r\n        }\r\n        const data = await apiPost(\"/content/title-rewrite\", buildContentTitleRewritePayload(currentContentSources));\r\n        const titleList = extractTitleOptions(data);\r\n        const item = chooseAutoTitleOption(titleList);\r\n        if (!item || !item.title) throw new Error(\"\u6807\u9898\u5DE5\u4F5C\u6D41\u6CA1\u6709\u8FD4\u56DE\u53EF\u7528\u6807\u9898\u3002\");\r\n  \r\n        selectedContentSource = resolveContentSourceFromTitleOption(item, 0);\r\n        currentSourceExtract = null;\r\n        currentRewriteResult = null;\r\n        setFieldValue(\"finalTitle\", item.title || \"\");\r\n        setFieldValue(\"seoTitle\", item.seo_title || item.title || \"\");\r\n        setFieldValue(\"articleAngle\", item.article_angle || \"\");\r\n        setFieldValue(\"articleOutline\", item.article_outline || \"\");\r\n        setFieldValue(\"metaDescription\", item.meta_description || \"\");\r\n  \r\n        job.title = item.title || job.title;\r\n      }\r\n  \r\n      async function runAutoTextStep() {\r\n        const data = await apiPost(\"/content/rewrite\", buildContentRewritePayload());\r\n  \r\n        const raw = extractWorkflowOutput(data);\r\n        const articleHtml = extractArticleHtml(raw);\r\n        if (!articleHtml) throw new Error(\"\u6B63\u6587\u5DE5\u4F5C\u6D41\u6CA1\u6709\u8FD4\u56DE article_html\u3002\");\r\n  \r\n        currentRewriteResult = raw;\r\n        setFieldValue(\"textRaw\", articleHtml);\r\n        $(\"articleEditor\").innerHTML = articleHtml;\r\n        if (raw?.excerpt) setFieldValue(\"excerpt\", raw.excerpt);\r\n        if (raw?.section_summaries) {\r\n          setFieldValue(\r\n            \"sectionSummaries\",\r\n            Array.isArray(raw.section_summaries) ? raw.section_summaries.join(\"\\n\") : String(raw.section_summaries)\r\n          );\r\n        }\r\n      }\r\n  \r\n      async function runAutoLinkStep() {\r\n        linkBaseArticleHtml = getCurrentArticleHtml();\r\n        linkedArticleHtml = \"\";\r\n        const payload = buildLinkAnalyzePayload();\r\n        if (!payload.article.body_html) throw new Error(\"\u6B63\u6587\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u5206\u6790\u5185\u94FE\u3002\");\r\n  \r\n        const data = await apiPost(\"/link/analyze\", payload);\r\n        currentLinkAnalysis = data;\r\n        setFieldValue(\"linkRaw\", JSON.stringify(data, null, 2));\r\n        const suggestions = normalizeLinkSuggestions(data);\r\n        selectedLinkSuggestionIds = new Set(\r\n          suggestions\r\n            .filter(item => (\r\n              (item.insert_mode === \"auto_eligible\" && item.target_status !== \"needs_live_check\") ||\r\n              item.insert_strategy === \"paragraph_end_recommendation\"\r\n            ))\r\n            .map(item => item.id)\r\n        );\r\n        const result = buildLinkedHtmlFromSuggestions(getSelectedLinkSuggestions());\r\n        linkedArticleHtml = result.html || linkBaseArticleHtml;\r\n        setFieldValue(\"textRaw\", linkedArticleHtml);\r\n        $(\"articleEditor\").innerHTML = linkedArticleHtml;\r\n      }\r\n  \r\n      function getAutoImageModelFallbacks() {\r\n        const selected = getFieldValue(\"imageModel\") || \"fal-ai/nano-banana-2\";\r\n        const includeProduct = getProductReferenceUrls().length > 0;\r\n        const ordered = includeProduct\r\n          ? [\r\n              selected,\r\n              \"fal-ai/nano-banana-2\",\r\n              \"fal-ai/nano-banana-pro\",\r\n              \"openai/gpt-image-2/edit\",\r\n              \"fal-ai/flux-2/flash\"\r\n            ]\r\n          : [\r\n              selected,\r\n              \"fal-ai/nano-banana-2\",\r\n              \"fal-ai/flux-2/flash\",\r\n              \"openai/gpt-image-2\",\r\n              \"fal-ai/nano-banana-pro\"\r\n            ];\r\n  \r\n        return Array.from(new Set(ordered)).filter(model => {\r\n          const cfg = IMAGE_MODEL_CONFIGS[model];\r\n          if (!cfg) return false;\r\n          if (!includeProduct && cfg.supportsTextToImage === false) return false;\r\n          if (includeProduct && cfg.supportsReference === false) return false;\r\n          return true;\r\n        });\r\n      }\r\n  \r\n      async function generateSlotWithModel(slotIndex, model) {\r\n        const previousModel = getFieldValue(\"imageModel\");\r\n        updateAvailableModels();\r\n        setFieldValue(\"imageModel\", model);\r\n        try {\r\n          await generateSlot(slotIndex);\r\n        } finally {\r\n          updateAvailableModels();\r\n          setFieldValue(\"imageModel\", previousModel);\r\n        }\r\n      }\r\n  \r\n      function normalizePartialImageResults() {\r\n        const successful = currentResults.filter(item => item && item.imageUrl);\r\n        const missing = currentResults.filter(item => item && !item.imageUrl);\r\n        if (!successful.length) return { ok: false, successful, missing };\r\n  \r\n        const normalized = [\r\n          ...successful,\r\n          ...missing.map(item => ({\r\n            ...item,\r\n            status: item.status || \"\u672A\u751F\u6210\"\r\n          }))\r\n        ];\r\n  \r\n        currentResults = normalized;\r\n        renderResultCards();\r\n        renderPublishCoverOptions();\r\n        updatePublishPayloadPreview();\r\n        return { ok: true, successful, missing };\r\n      }\r\n  \r\n      async function runAutoImageStep(config) {\r\n        await generateImagePlanInternally();\r\n        const retries = Math.max(0, Number(config.image_retry || 0));\r\n        const fallbackModels = getAutoImageModelFallbacks();\r\n  \r\n        for (let i = 0; i < currentResults.length; i++) {\r\n          let lastError = null;\r\n          for (let attempt = 0; attempt <= retries; attempt++) {\r\n            try {\r\n              const model = fallbackModels[attempt % fallbackModels.length] || getFieldValue(\"imageModel\");\r\n              setStatus(\"autoWorkflowStatus\", `\u6B63\u5728\u751F\u6210\u7B2C ${i + 1}/${currentResults.length} \u5F20\u914D\u56FE\uFF0C\u6A21\u578B\uFF1A${model}${attempt ? `\uFF08\u91CD\u8BD5 ${attempt}/${retries}\uFF09` : \"\"}\u3002`);\r\n              await generateSlotWithModel(i, model);\r\n              if (!currentResults[i]?.imageUrl) {\r\n                throw new Error(`${currentResults[i]?.label || `\u56FE\u4F4D ${i + 1}`} \u6682\u672A\u8FD4\u56DE\u56FE\u7247\u7ED3\u679C`);\r\n              }\r\n              lastError = null;\r\n              break;\r\n            } catch (err) {\r\n              lastError = err;\r\n              currentResults[i].status = attempt < retries\r\n                ? `\u751F\u6210\u5931\u8D25\uFF0C\u51C6\u5907\u91CD\u8BD5 ${attempt + 1}/${retries}`\r\n                : \"\u751F\u6210\u5931\u8D25\uFF0C\u53EF\u624B\u52A8\u67E5\u8BE2\u6216\u91CD\u65B0\u751F\u6210\";\r\n              renderResultCards();\r\n            }\r\n          }\r\n          if (lastError) {\r\n            currentResults[i].status = \"\u672A\u751F\u6210\uFF0C\u5DF2\u8DF3\u8FC7\";\r\n            renderResultCards();\r\n          }\r\n        }\r\n  \r\n        const summary = normalizePartialImageResults();\r\n        if (!summary.ok) {\r\n          throw new Error(\"\u6240\u6709\u914D\u56FE\u90FD\u751F\u6210\u5931\u8D25\uFF0C\u6B63\u6587\u5DF2\u4FDD\u7559\uFF0C\u53EF\u8FDB\u5165\u624B\u52A8\u6D41\u7A0B\u8865\u56FE\u3002\");\r\n        }\r\n  \r\n        if (summary.missing.length) {\r\n          setStatus(\r\n            \"autoWorkflowStatus\",\r\n            `\u914D\u56FE\u4E0D\u5B8C\u6574\uFF1A\u6210\u529F ${summary.successful.length} \u5F20\uFF0C\u7F3A\u5C11 ${summary.missing.length} \u5F20\u3002\u7CFB\u7EDF\u5C06\u4F7F\u7528\u7B2C\u4E00\u5F20\u6210\u529F\u56FE\u7247\u4F5C\u4E3A\u5C01\u9762\u7EE7\u7EED\u3002`\r\n          );\r\n          return {\r\n            complete: false,\r\n            successCount: summary.successful.length,\r\n            missingCount: summary.missing.length\r\n          };\r\n        }\r\n  \r\n        return {\r\n          complete: true,\r\n          successCount: summary.successful.length,\r\n          missingCount: 0\r\n        };\r\n      }\r\n  \r\n      async function prepareAutoJobForm(job, config) {\r\n        clearSelectedProduct();\r\n        currentContentSources = [];\r\n        selectedContentSource = null;\r\n        currentSourceExtract = null;\r\n        currentRewriteResult = null;\r\n        applyAutoDraftInputs(job.draft || {});\r\n  \r\n        if (job.include_product) {\r\n          const petType = getFieldValue(\"petType\") || \"dog\";\r\n          const product = await pickAutoProduct(config, petType);\r\n          if (product && product.title) {\r\n            applySelectedProduct(product);\r\n          }\r\n        }\r\n  \r\n        setCheckboxValue(\"refProductImage\", false);\r\n        setCheckboxValue(\"refPackageImage\", false);\r\n      }\r\n  \r\n  async function runAutoJob(job, config) {\r\n        const maxAttempts = Math.max(1, Number(config.article_retry || 0) + 1);\r\n        let lastError = null;\r\n  \r\n        for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n          try {\r\n            currentTaskId = \"\";\r\n            currentPlannedTasks = [];\r\n            currentSlotLabels = [];\r\n            currentResults = [];\r\n            linkedArticleHtml = \"\";\r\n            currentLinkAnalysis = null;\r\n            selectedLinkSuggestionIds = new Set();\r\n            $(\"linkSuggestions\").innerHTML = \"\";\r\n            $(\"linkPreview\").innerHTML = \"\";\r\n            $(\"imageResultsGrouped\").innerHTML = \"\";\r\n            setStatus(\"linkStatus\", \"\");\r\n            setStatus(\"imagePlanStatus\", \"\");\r\n            setStatus(\"imageGenStatus\", \"\");\r\n            setStatus(\"imageQueryStatus\", \"\");\r\n  \r\n            setAutoJobStatus(job, \"running\", `\u751F\u6210\u4E2D ${attempt}/${maxAttempts}`);\r\n            await prepareAutoJobForm(job, config);\r\n            await runAutoTitleStep(job);\r\n            saveAutoJobDraftSnapshot(job, 2);\r\n            const stopTextStatus = startAutoJobElapsedStatus(job, \"\u6B63\u6587\u91CD\u5199\u4E2D\");\r\n            try {\r\n              await runAutoTextStep();\r\n            } catch (error) {\r\n              throw new Error(`\u6B63\u6587\u91CD\u5199\u5931\u8D25\uFF1A${error.message || \"\u672A\u77E5\u9519\u8BEF\"}`);\r\n            } finally {\r\n              stopTextStatus();\r\n            }\r\n            saveAutoJobDraftSnapshot(job, 3);\r\n            setAutoJobStatus(job, \"running\", \"\u5185\u94FE\u5206\u6790\u4E2D\");\r\n            await runAutoLinkStep();\r\n            saveAutoJobDraftSnapshot(job, 4);\r\n            setAutoJobStatus(job, \"running\", \"\u914D\u56FE\u751F\u6210\u4E2D\");\r\n            const imageSummary = await runAutoImageStep(config);\r\n            saveAutoJobDraftSnapshot(job, 5);\r\n            syncPublishStep(true);\r\n  \r\n            const draft = buildBlogDraft();\r\n            draft.source = \"auto\";\r\n            draft.auto_job_id = job.id;\r\n            job.draft = draft;\r\n            job.title = draft.publish?.title || draft.title?.final_title || job.title;\r\n            job.status = \"ready\";\r\n            job.status_label = imageSummary?.complete\r\n              ? (config.publish_mode === \"scheduled\" ? \"\u5F85\u786E\u8BA4\u5B9A\u65F6\" : \"\u8349\u7A3F\u5C31\u7EEA\")\r\n              : \"\u914D\u56FE\u4E0D\u5B8C\u6574\uFF0C\u53EF\u7EE7\u7EED\";\r\n            job.error = imageSummary?.complete\r\n              ? \"\"\r\n              : `\u6210\u529F ${imageSummary.successCount} \u5F20\uFF0C\u7F3A\u5C11 ${imageSummary.missingCount} \u5F20`;\r\n            renderAutoQueue();\r\n            return;\r\n          } catch (err) {\r\n            lastError = err;\r\n            if (getCurrentArticleHtml()) {\r\n              saveAutoJobDraftSnapshot(job, currentLinkAnalysis ? 4 : 3);\r\n            }\r\n            setAutoJobStatus(job, \"running\", `\u91CD\u8BD5\u51C6\u5907 ${attempt}/${maxAttempts}`, err.message);\r\n          }\r\n        }\r\n  \r\n        setAutoJobStatus(job, \"failed\", \"\u5931\u8D25\uFF0C\u53EF\u7F16\u8F91\", lastError?.message || \"\u672A\u77E5\u9519\u8BEF\");\r\n      }\r\n  \r\n      function getAutoProgress() {\r\n        if (!autoArticleJobs.length) return 0;\r\n        const done = autoArticleJobs.filter(job => [\"ready\", \"edited\", \"scheduled\", \"published\", \"failed\"].includes(job.status)).length;\r\n        return Math.round((done / autoArticleJobs.length) * 100);\r\n      }\r\n  \r\n        function renderAutoQueue() {\r\n          const wrap = $(\"autoArticleQueue\");\r\n          if (!wrap) return;\r\n  \r\n        if (!autoArticleJobs.length) {\r\n          wrap.innerHTML = `<div class=\"ct-link-summary\">\u6682\u65E0\u81EA\u52A8\u6587\u7AE0\u4EFB\u52A1\u3002\u8BBE\u7F6E\u53C2\u6570\u540E\u70B9\u51FB\u201C\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u201D\u3002</div>`;\r\n          $(\"autoProgressBar\").style.width = \"0%\";\r\n          return;\r\n        }\r\n  \r\n        $(\"autoProgressBar\").style.width = `${getAutoProgress()}%`;\r\n        wrap.innerHTML = autoArticleJobs.map(job => {\r\n          const badgeClass = job.status === \"failed\" ? \"is-error\" : [\"ready\", \"edited\", \"scheduled\", \"published\"].includes(job.status) ? \"is-success\" : \"\";\r\n          const title = job.title || job.draft?.publish?.title || job.draft?.title?.final_title || `\u81EA\u52A8\u6587\u7AE0 ${job.index || \"\"}`;\r\n          const productText = job.include_product ? \"\u5E26\u4EA7\u54C1\" : \"\u4E0D\u5E26\u4EA7\u54C1\";\r\n          const articleLink = job.article?.url ? `<a href=\"${escapeHtml(job.article.url)}\" target=\"_blank\" rel=\"noopener\">Shopify \u540E\u53F0\u6587\u7AE0\u94FE\u63A5</a>` : \"\";\r\n          return `\r\n            <div class=\"ct-auto-row\" data-auto-job-id=\"${escapeHtml(job.id)}\">\r\n              <div>\r\n                <div class=\"ct-auto-row-title\">${escapeHtml(title)}</div>\r\n                <div class=\"ct-auto-row-meta\">\u7B2C ${job.index} \u7BC7 \u00B7 ${productText}${job.error ? ` \u00B7 ${escapeHtml(job.error)}` : \"\"}</div>\r\n                ${job.schedule_time ? `<div class=\"ct-auto-row-meta\">\u5DF2\u9884\u7EA6\u53D1\u5E03\u65F6\u95F4\uFF1A${escapeHtml(formatAutoPublishDate(job.schedule_time))}</div>` : \"\"}\r\n                ${articleLink ? `<div class=\"ct-auto-row-meta\">${articleLink}</div>` : \"\"}\r\n              </div>\r\n              <span class=\"ct-auto-badge ${badgeClass}\">${escapeHtml(job.status_label)}</span>\r\n              <input type=\"datetime-local\" data-auto-schedule value=\"${escapeHtml(toDatetimeLocalInputValue(job.schedule_time || \"\"))}\">\r\n              <div class=\"ct-auto-row-actions\">\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-auto-action=\"edit\">\u7F16\u8F91</button>\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-auto-action=\"schedule\">\u786E\u8BA4\u5B9A\u65F6\u53D1\u5E03</button>\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-auto-action=\"retry\">\u91CD\u8BD5</button>\r\n              </div>\r\n            </div>\r\n          `;\r\n        }).join(\"\");\r\n  \r\n        wrap.querySelectorAll(\"[data-auto-job-id]\").forEach(row => {\r\n          const jobId = row.dataset.autoJobId;\r\n          const input = row.querySelector(\"[data-auto-schedule]\");\r\n          if (input) {\r\n            input.addEventListener(\"change\", () => {\r\n              const job = autoArticleJobs.find(item => item.id === jobId);\r\n              if (job) job.schedule_time = input.value;\r\n            });\r\n          }\r\n          row.querySelectorAll(\"[data-auto-action]\").forEach(btn => {\r\n            btn.addEventListener(\"click\", () => handleAutoQueueAction(jobId, btn.dataset.autoAction));\r\n          });\r\n        });\r\n      }\r\n  \r\n      async function startLegacyBrowserAutoWorkflow() {\r\n        if (autoWorkflowRunning) return;\r\n        const config = getAutoConfig();\r\n        if (config.reference_history) {\r\n          await loadAnalyticsDashboard();\r\n        }\r\n        autoArticleJobs = createAutoJobs(config);\r\n        activeAutoEditId = \"\";\r\n        renderAutoQueue();\r\n        setStatus(\"autoWorkflowStatus\", \"\u81EA\u52A8\u4EFB\u52A1\u961F\u5217\u5DF2\u521B\u5EFA\uFF0C\u5F00\u59CB\u8C03\u7528 Worker \u751F\u6210\u6587\u7AE0\u3002\");\r\n  \r\n        autoWorkflowRunning = true;\r\n        const startBtn = $(\"btnRunAutoNow\");\r\n        if (startBtn) startBtn.disabled = true;\r\n  \r\n        try {\r\n          for (const job of autoArticleJobs) {\r\n            await runAutoJob(job, config);\r\n          }\r\n          setStatus(\"autoWorkflowStatus\", \"\u81EA\u52A8\u751F\u6210\u6D41\u7A0B\u5DF2\u5B8C\u6210\u3002\u8BF7\u68C0\u67E5\u961F\u5217\uFF0C\u786E\u8BA4\u5B9A\u65F6\u53D1\u5E03\u6216\u70B9\u51FB\u7F16\u8F91\u5FAE\u8C03\u3002\");\r\n        } finally {\r\n          autoWorkflowRunning = false;\r\n          if (startBtn) startBtn.disabled = false;\r\n          renderAutoQueue();\r\n        }\r\n      }\r\n  \r\n        function handleAutoQueueAction(jobId, action) {\r\n          const job = autoArticleJobs.find(item => item.id === jobId);\r\n          if (!job) return;\r\n  \r\n        if (action === \"retry\" && currentAutoTaskId) {\r\n          setStatus(\"autoWorkflowStatus\", \"\u6B63\u5728\u8BF7\u6C42 Worker \u91CD\u65B0\u6267\u884C\u8FD9\u7BC7\u6587\u7AE0...\");\r\n          apiPost(\"/auto/retry-job\", {\r\n            task_id: currentAutoTaskId,\r\n            job_id: job.job_id || job.id\r\n          })\r\n            .then(data => {\r\n              applyAutoAutomationStatus({\r\n                task: data?.task,\r\n                automation: {\r\n                  config: autoAutomationConfig || getAutoConfig(),\r\n                  state: autoAutomationState || {}\r\n                }\r\n              });\r\n              setStatus(\"autoWorkflowStatus\", \"\u5DF2\u5C06\u8BE5\u6587\u7AE0\u52A0\u5165 Worker \u91CD\u8BD5\u961F\u5217\u3002\");\r\n              scheduleAutoStatusPolling(1500);\r\n            })\r\n            .catch(err => {\r\n              setStatus(\"autoWorkflowStatus\", `\u91CD\u8BD5\u542F\u52A8\u5931\u8D25\uFF1A${err.message}`);\r\n            });\r\n          return;\r\n        }\r\n  \r\n        if (action === \"edit\") {\r\n          if (!job.draft) {\r\n            setStatus(\"autoWorkflowStatus\", \"\u8FD9\u7BC7\u6587\u7AE0\u8FD8\u6CA1\u6709\u751F\u6210\u5230\u53EF\u7F16\u8F91\u9636\u6BB5\uFF0C\u8BF7\u7A0D\u540E\u518D\u70B9\u7F16\u8F91\u3002\");\r\n            return;\r\n          }\r\n          activeAutoEditId = job.id;\r\n          loadBlogDraft(job.draft || {});\r\n          setBuilderMode(\"manual\");\r\n          const btn = $(\"btnReturnAutoFlow\");\r\n          if (btn) btn.hidden = false;\r\n          setStatus(\"builderModeStatus\", \"\u6B63\u5728\u7F16\u8F91\u81EA\u52A8\u6D41\u6587\u7AE0\u3002\u5B8C\u6210\u540E\u70B9\u51FB\u201C\u4FDD\u5B58\u5E76\u8FD4\u56DE\u81EA\u52A8\u5DE5\u4F5C\u6D41\u201D\u3002\");\r\n          return;\r\n        }\r\n  \r\n        if (action === \"schedule\") {\r\n          const scheduleTime = rowScheduleValue(job.id) || job.schedule_time;\r\n          if (!job.draft) {\r\n            setStatus(\"autoWorkflowStatus\", \"\u8FD9\u7BC7\u6587\u7AE0\u8FD8\u6CA1\u6709\u8349\u7A3F\uFF0C\u65E0\u6CD5\u5199\u5165 Shopify\u3002\");\r\n            return;\r\n          }\r\n  \r\n          if (job.article?.id) {\r\n            setStatus(\"autoWorkflowStatus\", \"\u8FD9\u7BC7\u6587\u7AE0\u5DF2\u7ECF\u5199\u5165 Shopify\uFF0C\u65E0\u9700\u518D\u6B21\u521B\u5EFA\u3002\");\r\n            return;\r\n          }\r\n  \r\n          if (currentAutoTaskId) {\r\n            const scheduledAt = toWorkerIso(scheduleTime);\r\n            if (!scheduledAt) {\r\n              setStatus(\"autoWorkflowStatus\", \"\u8BF7\u5148\u9009\u62E9\u6709\u6548\u7684 Shopify \u53D1\u5E03\u65F6\u95F4\u3002\");\r\n              return;\r\n            }\r\n            setStatus(\"autoWorkflowStatus\", \"\u6B63\u5728\u628A\u5F53\u524D\u8349\u7A3F\u5199\u5165 Shopify \u5B9A\u65F6\u53D1\u5E03...\");\r\n            apiPost(\"/auto/schedule-publish\", {\r\n              task_id: currentAutoTaskId,\r\n              job_id: job.job_id || job.id,\r\n              scheduled_at: scheduledAt\r\n            })\r\n              .then(data => {\r\n                applyAutoAutomationStatus({\r\n                  task: data?.task,\r\n                  automation: {\r\n                    config: autoAutomationConfig || getAutoConfig(),\r\n                    state: autoAutomationState || {}\r\n                  }\r\n                });\r\n                setStatus(\"autoWorkflowStatus\", \"\u5DF2\u5199\u5165 Shopify \u5B9A\u65F6\u53D1\u5E03\u3002\");\r\n              })\r\n              .catch(err => {\r\n                setStatus(\"autoWorkflowStatus\", `\u5199\u5165 Shopify \u5931\u8D25\uFF1A${err.message}`);\r\n              });\r\n            return;\r\n          }\r\n  \r\n          job.schedule_time = scheduleTime;\r\n          job.status = \"scheduled\";\r\n          job.status_label = \"\u5199\u5165\u4E2D\";\r\n          renderAutoQueue();\r\n          setStatus(\"autoWorkflowStatus\", \"\u6B63\u5728\u628A\u6587\u7AE0\u5199\u5165 Shopify\uFF0C\u8BF7\u7A0D\u5019\u3002\");\r\n  \r\n          submitDraftPayloadToShopify(job.draft, \"draft\", scheduleTime)\r\n            .then(data => {\r\n              const article = data?.article || null;\r\n              job.status = \"scheduled\";\r\n              job.status_label = \"\u5DF2\u5B9A\u65F6\";\r\n              job.schedule_time = scheduleTime;\r\n              job.article = article ? {\r\n                id: article.id || \"\",\r\n                title: article.title || job.title,\r\n                handle: article.handle || \"\",\r\n                url: data?.article_url || \"\"\r\n              } : job.article;\r\n              job.error = \"\";\r\n              renderAutoQueue();\r\n              setStatus(\"autoWorkflowStatus\", \"\u5DF2\u5199\u5165 Shopify\uFF0C\u5E76\u8BB0\u5F55\u9884\u7EA6\u53D1\u5E03\u65F6\u95F4\u3002\u540E\u53F0\u73B0\u5728\u53EF\u4EE5\u770B\u5230\u8FD9\u7BC7\u6587\u7AE0\u3002\");\r\n            })\r\n            .catch(err => {\r\n              job.status = \"failed\";\r\n              job.status_label = \"\u5199\u5165\u5931\u8D25\";\r\n              job.error = err.message || \"\u5199\u5165 Shopify \u5931\u8D25\";\r\n              renderAutoQueue();\r\n              setStatus(\"autoWorkflowStatus\", `\u5199\u5165 Shopify \u5931\u8D25\uFF1A${err.message || \"\u672A\u77E5\u9519\u8BEF\"}`);\r\n            });\r\n          return;\r\n        }\r\n  \r\n        if (action === \"retry\") {\r\n          job.status = \"pending\";\r\n          job.status_label = \"\u5F85\u91CD\u8BD5\";\r\n          job.error = \"\";\r\n          renderAutoQueue();\r\n          setStatus(\"autoWorkflowStatus\", \"\u5DF2\u5C06\u8BE5\u6587\u7AE0\u6807\u8BB0\u4E3A\u5F85\u91CD\u8BD5\u3002\");\r\n        }\r\n      }\r\n  \r\n      function rowScheduleValue(jobId) {\r\n        const row = Array.from(document.querySelectorAll(\"[data-auto-job-id]\"))\r\n          .find(item => item.dataset.autoJobId === jobId);\r\n        const input = row ? row.querySelector(\"[data-auto-schedule]\") : null;\r\n        return input ? input.value : \"\";\r\n      }\r\n  \r\n      function saveAndReturnAutoFlow() {\r\n        if (!activeAutoEditId) {\r\n          setBuilderMode(\"auto\");\r\n          return;\r\n        }\r\n        const job = autoArticleJobs.find(item => item.id === activeAutoEditId);\r\n        if (job) {\r\n          const draft = buildBlogDraft();\r\n          draft.source = \"auto\";\r\n          draft.auto_job_id = job.id;\r\n          job.draft = draft;\r\n          job.title = draft.publish?.title || draft.title?.final_title || job.title;\r\n          job.status = \"edited\";\r\n          if (currentAutoTaskId) {\r\n            apiPost(\"/auto/save-draft\", {\r\n              task_id: currentAutoTaskId,\r\n              job_id: job.job_id || job.id,\r\n              draft\r\n            })\r\n              .then(data => {\r\n                applyAutoAutomationStatus({\r\n                  task: data?.task,\r\n                  automation: {\r\n                    config: autoAutomationConfig || getAutoConfig(),\r\n                    state: autoAutomationState || {}\r\n                  }\r\n                });\r\n              })\r\n              .catch(err => {\r\n                setStatus(\"autoWorkflowStatus\", `\u4FDD\u5B58\u5230 Worker \u5931\u8D25\uFF1A${err.message}`);\r\n              });\r\n          }\r\n          job.status_label = \"\u5DF2\u7F16\u8F91\";\r\n        }\r\n        activeAutoEditId = \"\";\r\n        const btn = $(\"btnReturnAutoFlow\");\r\n        if (btn) btn.hidden = true;\r\n        setBuilderMode(\"auto\");\r\n        renderAutoQueue();\r\n        setStatus(\"autoWorkflowStatus\", \"\u7F16\u8F91\u7ED3\u679C\u5DF2\u4FDD\u5B58\u56DE\u81EA\u52A8\u6587\u7AE0\u961F\u5217\u3002\");\r\n      }\r\n  \r\n      window.ctBlogBuilderDraft = {\r\n        build: buildBlogDraft,\r\n        load: loadBlogDraft,\r\n        setMode: setBuilderMode\r\n      };\r\n  \r\n      function switchEditorMode(mode) {\r\n        document.querySelectorAll(\".ct-editor-tab\").forEach(btn => {\r\n          btn.classList.toggle(\"is-active\", btn.dataset.editorMode === mode);\r\n        });\r\n        $(\"editorRichWrap\").classList.toggle(\"is-active\", mode === \"rich\");\r\n        $(\"editorHtmlWrap\").classList.toggle(\"is-active\", mode === \"html\");\r\n  \r\n        if (mode === \"html\") {\r\n          $(\"textRaw\").value = $(\"articleEditor\").innerHTML.trim();\r\n        } else {\r\n          $(\"articleEditor\").innerHTML = $(\"textRaw\").value.trim();\r\n        }\r\n      }\r\n  \r\n      function execCommand(cmd, value = null) {\r\n        document.execCommand(cmd, false, value);\r\n        syncHtmlFromEditor();\r\n      }\r\n  \r\n      function syncHtmlFromEditor() {\r\n        $(\"textRaw\").value = $(\"articleEditor\").innerHTML.trim();\r\n      }\r\n  \r\n      function syncCurrentEditorModeToRaw() {\r\n        const htmlMode = $(\"editorHtmlWrap\")?.classList.contains(\"is-active\");\r\n        if (htmlMode) {\r\n          $(\"articleEditor\").innerHTML = $(\"textRaw\").value.trim();\r\n        } else {\r\n          syncHtmlFromEditor();\r\n        }\r\n      }\r\n  \r\n      function getCurrentArticleHtml() {\r\n        syncCurrentEditorModeToRaw();\r\n        return $(\"textRaw\").value.trim() || $(\"articleEditor\").innerHTML.trim();\r\n      }\r\n  \r\n      function countExistingLinks(html) {\r\n        const doc = new DOMParser().parseFromString(html || \"\", \"text/html\");\r\n        return doc.querySelectorAll(\"a[href]\").length;\r\n      }\r\n  \r\n      function renderLinkArticleSummary() {\r\n        const wrap = $(\"linkArticleSummary\");\r\n        if (!wrap) return;\r\n  \r\n        const title = $(\"finalTitle\").value.trim() || \"\u672A\u547D\u540D\u6587\u7AE0\";\r\n        const petType = $(\"petType\").value || \"\u672A\u6307\u5B9A\";\r\n        const productTitle = selectedProduct.title || \"\u672A\u9009\u62E9\u4EA7\u54C1\";\r\n        const html = getCurrentArticleHtml();\r\n        const existingLinks = countExistingLinks(html);\r\n  \r\n        wrap.innerHTML = `\r\n          <strong>${escapeHtml(title)}</strong><br>\r\n          \u5BA0\u7269\u7C7B\u578B\uFF1A${escapeHtml(petType)}\uFF1B\u5DF2\u9009\u4EA7\u54C1\uFF1A${escapeHtml(productTitle)}\uFF1B\u5F53\u524D\u6B63\u6587\u5DF2\u6709 ${existingLinks} \u4E2A\u94FE\u63A5\u3002\r\n        `;\r\n      }\r\n  \r\n      function buildLinkAnalyzePayload() {\r\n        const maxLinksTotal = Number($(\"maxLinksTotal\").value || 8);\r\n  \r\n        return {\r\n          article: {\r\n            title: $(\"finalTitle\").value.trim(),\r\n            body_html: getCurrentArticleHtml(),\r\n            excerpt: $(\"excerpt\").value.trim(),\r\n            blog: getMappedBlogTitle(),\r\n            tags: buildDefaultPublishTags().split(\",\").map(v => v.trim()).filter(Boolean),\r\n            selected_product: {\r\n              handle: selectedProduct.handle || \"\",\r\n              title: selectedProduct.title || \"\",\r\n              url: selectedProduct.url || \"\"\r\n            }\r\n          },\r\n          context: {\r\n            pet_type: ($(\"petType\").value || \"\").trim().toLowerCase(),\r\n            target_keywords: $(\"targetKeywords\").value.trim() || $(\"textTargetKeywords\").value.trim(),\r\n            content_type: $(\"contentType\").value\r\n          },\r\n          options: {\r\n            max_links_total: Number.isFinite(maxLinksTotal) ? maxLinksTotal : 8,\r\n            max_product_links: 4,\r\n            max_collection_links: 4,\r\n            max_function_links: 2,\r\n            include_unverified_collections: $(\"includeUnverifiedCollections\").value === \"true\",\r\n            avoid_existing_links: true,\r\n            skip_headings: true,\r\n            min_anchor_words: 2,\r\n            max_anchor_words: 8\r\n          }\r\n        };\r\n      }\r\n  \r\n      function normalizeLinkSuggestions(data) {\r\n        const suggestions = data?.suggestions || data?.data?.suggestions || [];\r\n        return Array.isArray(suggestions) ? suggestions : [];\r\n      }\r\n  \r\n      function renderLinkSuggestions() {\r\n        const wrap = $(\"linkSuggestions\");\r\n        if (!wrap) return;\r\n  \r\n        const suggestions = normalizeLinkSuggestions(currentLinkAnalysis);\r\n        selectedLinkSuggestionIds = new Set(\r\n          suggestions\r\n            .filter(item => (\r\n              (item.insert_mode === \"auto_eligible\" && item.target_status !== \"needs_live_check\") ||\r\n              item.insert_strategy === \"paragraph_end_recommendation\"\r\n            ))\r\n            .map(item => item.id)\r\n        );\r\n  \r\n        if (!suggestions.length) {\r\n          wrap.innerHTML = `<div class=\"ct-link-summary\">\u6682\u65F6\u6CA1\u6709\u53EF\u7528\u5185\u94FE\u5EFA\u8BAE\u3002\u53EF\u4EE5\u8DF3\u8FC7\u5185\u94FE\uFF0C\u6216\u8FD4\u56DE\u6B63\u6587\u8865\u5145\u66F4\u660E\u786E\u7684\u4EA7\u54C1\u3001\u96C6\u5408\u3001\u529F\u80FD\u9875\u5173\u952E\u8BCD\u3002</div>`;\r\n          return;\r\n        }\r\n  \r\n        const groups = [\"product\", \"collection\", \"function\"];\r\n        const labels = {\r\n          product: \"\u4EA7\u54C1\u94FE\u63A5\",\r\n          collection: \"\u96C6\u5408\u94FE\u63A5\",\r\n          function: \"\u529F\u80FD\u9875\u94FE\u63A5\"\r\n        };\r\n  \r\n        wrap.innerHTML = groups.map(type => {\r\n          const items = suggestions.filter(item => item.type === type);\r\n          if (!items.length) return \"\";\r\n  \r\n          return `\r\n            <div class=\"ct-link-group\">\r\n              <h3>${labels[type]}</h3>\r\n              ${items.map(item => {\r\n                const selected = selectedLinkSuggestionIds.has(item.id);\r\n                const isCandidate = item.target_status === \"needs_live_check\";\r\n                const isRecommendation = item.insert_strategy === \"paragraph_end_recommendation\";\r\n                return `\r\n                  <div class=\"ct-link-item ${selected ? \"is-selected\" : \"\"}\" data-link-row data-link-id=\"${escapeHtml(item.id)}\">\r\n                    <button class=\"ct-link-toggle ${selected ? \"is-selected\" : \"\"}\" type=\"button\" data-link-toggle data-link-id=\"${escapeHtml(item.id)}\" aria-pressed=\"${selected ? \"true\" : \"false\"}\">\r\n                      ${selected ? \"\u5DF2\u9009\" : \"\u9009\u62E9\"}\r\n                    </button>\r\n                    <span>\r\n                      <span class=\"ct-link-item-title\">${escapeHtml(item.anchor_text || item.target_title || \"\")}</span>\r\n                      <span class=\"ct-link-item-meta\">\r\n                        <span class=\"ct-link-badge\">${escapeHtml(type)}</span>\r\n                        <span class=\"ct-link-badge ${isCandidate ? \"is-warning\" : \"\"}\">${escapeHtml(item.target_status || \"verified\")}</span>\r\n                        ${isRecommendation ? `<span class=\"ct-link-badge is-warning\">\u6BB5\u5C3E\u63A8\u8350</span>` : \"\"}\r\n                        ${escapeHtml(item.target_title || \"\")} - ${escapeHtml(item.target_url || \"\")}\r\n                      </span>\r\n                      <span class=\"ct-link-item-meta\">${escapeHtml(item.reason || item.matched_keyword || \"\")}</span>\r\n                    </span>\r\n                  </div>\r\n                `;\r\n              }).join(\"\")}\r\n            </div>\r\n          `;\r\n        }).join(\"\");\r\n  \r\n        const updateLinkSelectionDisplay = linkId => {\r\n          const isSelected = selectedLinkSuggestionIds.has(linkId);\r\n          wrap.querySelectorAll(\"[data-link-row]\").forEach(row => {\r\n            if (row.dataset.linkId === linkId) {\r\n              row.classList.toggle(\"is-selected\", isSelected);\r\n            }\r\n          });\r\n          wrap.querySelectorAll(\"[data-link-toggle]\").forEach(button => {\r\n            if (button.dataset.linkId === linkId) {\r\n              button.classList.toggle(\"is-selected\", isSelected);\r\n              button.textContent = isSelected ? \"\u5DF2\u9009\" : \"\u9009\u62E9\";\r\n              button.setAttribute(\"aria-pressed\", isSelected ? \"true\" : \"false\");\r\n            }\r\n          });\r\n        };\r\n  \r\n        const toggleLinkSelection = linkId => {\r\n          if (!linkId) return;\r\n          if (selectedLinkSuggestionIds.has(linkId)) {\r\n            selectedLinkSuggestionIds.delete(linkId);\r\n          } else {\r\n            selectedLinkSuggestionIds.add(linkId);\r\n          }\r\n          updateLinkSelectionDisplay(linkId);\r\n          renderImageProductRecommendations();\r\n          const preview = renderTemporaryLinkPreview();\r\n          setStatus(\"linkStatus\", `\u5DF2\u9009\u62E9 ${selectedLinkSuggestionIds.size} \u4E2A\u5185\u94FE\u5EFA\u8BAE\uFF0C\u4E34\u65F6\u9884\u89C8\u5DF2\u5237\u65B0\uFF1B\u5F53\u524D\u53EF\u63D2\u5165 ${preview.appliedCount} \u4E2A\u3002\u786E\u8BA4\u540E\u70B9\u51FB\u201C\u5E94\u7528\u9009\u4E2D\u5185\u94FE\u201D\u5199\u5165\u6B63\u6587\u3002`);\r\n        };\r\n  \r\n        wrap.querySelectorAll(\"[data-link-row]\").forEach(row => {\r\n          row.addEventListener(\"click\", () => {\r\n            toggleLinkSelection(row.dataset.linkId);\r\n          });\r\n        });\r\n  \r\n        wrap.querySelectorAll(\"[data-link-toggle]\").forEach(button => {\r\n          button.addEventListener(\"click\", event => {\r\n            event.stopPropagation();\r\n            toggleLinkSelection(button.dataset.linkId);\r\n          });\r\n        });\r\n      }\r\n  \r\n      async function handleAnalyzeLinks() {\r\n        linkBaseArticleHtml = getCurrentArticleHtml();\r\n        linkedArticleHtml = \"\";\r\n        renderLinkArticleSummary();\r\n        setStatus(\"linkStatus\", \"\u6B63\u5728\u5206\u6790\u6B63\u6587\u5185\u94FE...\");\r\n  \r\n        try {\r\n          const payload = buildLinkAnalyzePayload();\r\n          if (!payload.article.body_html) {\r\n            throw new Error(\"\u6B63\u6587\u4E0D\u80FD\u4E3A\u7A7A\u3002\");\r\n          }\r\n  \r\n          const data = await apiPost(\"/link/analyze\", payload);\r\n          currentLinkAnalysis = data;\r\n          $(\"linkRaw\").value = JSON.stringify(data, null, 2);\r\n          renderLinkSuggestions();\r\n          renderImageProductRecommendations();\r\n          const preview = renderTemporaryLinkPreview();\r\n  \r\n          const summary = data?.summary || {};\r\n          setStatus(\r\n            \"linkStatus\",\r\n            `\u5185\u94FE\u5206\u6790\u5B8C\u6210\uFF1A\u5EFA\u8BAE ${summary.suggested_links ?? normalizeLinkSuggestions(data).length} \u4E2A\uFF0C\u53EF\u81EA\u52A8\u91C7\u7528 ${summary.auto_eligible_links ?? selectedLinkSuggestionIds.size} \u4E2A\uFF1B\u4E34\u65F6\u9884\u89C8\u5DF2\u63D2\u5165 ${preview.appliedCount} \u4E2A\u3002`\r\n          );\r\n        } catch (err) {\r\n          setStatus(\"linkStatus\", `\u5185\u94FE\u5206\u6790\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      function applySingleLink(doc, suggestion, recommendationState = null) {\r\n        const anchor = String(suggestion.anchor_text || \"\").trim();\r\n        const url = String(suggestion.target_url || \"\").trim();\r\n        if (!anchor || !url) return false;\r\n  \r\n        if (suggestion.insert_strategy === \"paragraph_end_recommendation\") {\r\n          return applyParagraphRecommendationLink(doc, suggestion, recommendationState);\r\n        }\r\n  \r\n        const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT, {\r\n          acceptNode(node) {\r\n            const parent = node.parentElement;\r\n            if (!parent) return NodeFilter.FILTER_REJECT;\r\n            if (parent.closest(\"a,h1,h2,h3,button,script,style\")) return NodeFilter.FILTER_REJECT;\r\n            if (!node.nodeValue || !node.nodeValue.toLowerCase().includes(anchor.toLowerCase())) {\r\n              return NodeFilter.FILTER_REJECT;\r\n            }\r\n            return NodeFilter.FILTER_ACCEPT;\r\n          }\r\n        });\r\n  \r\n        const node = walker.nextNode();\r\n        if (!node) return false;\r\n  \r\n        const text = node.nodeValue;\r\n        const index = text.toLowerCase().indexOf(anchor.toLowerCase());\r\n        if (index < 0) return false;\r\n  \r\n        const before = text.slice(0, index);\r\n        const matched = text.slice(index, index + anchor.length);\r\n        const after = text.slice(index + anchor.length);\r\n        const link = doc.createElement(\"a\");\r\n        link.href = url;\r\n        link.textContent = matched;\r\n  \r\n        const fragment = doc.createDocumentFragment();\r\n        if (before) fragment.appendChild(doc.createTextNode(before));\r\n        fragment.appendChild(link);\r\n        if (after) fragment.appendChild(doc.createTextNode(after));\r\n        node.parentNode.replaceChild(fragment, node);\r\n        return true;\r\n      }\r\n  \r\n      function applyParagraphRecommendationLink(doc, suggestion, recommendationState = null) {\r\n        const title = String(suggestion.target_title || suggestion.anchor_text || \"\").trim();\r\n        const url = String(suggestion.target_url || \"\").trim();\r\n        if (!title || !url) return false;\r\n  \r\n        const paragraphs = Array.from(doc.body.querySelectorAll(\"p\"))\r\n          .filter(p => !p.closest(\"a,script,style\") && p.textContent.trim().length > 80);\r\n        const usedIndexes = recommendationState?.usedIndexes || new Set();\r\n        const scored = paragraphs\r\n          .map((p, index) => ({\r\n            p,\r\n            index,\r\n            score: scoreRecommendationParagraph(p.textContent, suggestion)\r\n          }))\r\n          .filter(item => !usedIndexes.has(item.index))\r\n          .sort((a, b) => {\r\n            if (b.score !== a.score) return b.score - a.score;\r\n            return a.index - b.index;\r\n          });\r\n  \r\n        let targetItem = scored.find(item => item.score > 0 && !item.p.querySelector(\"a[href]\"))\r\n          || scored.find(item => item.score > 0)\r\n          || scored.find(item => !item.p.querySelector(\"a[href]\"))\r\n          || scored[0]\r\n          || null;\r\n  \r\n        let target = targetItem?.p || null;\r\n        if (!target) {\r\n          target = doc.createElement(\"p\");\r\n          doc.body.appendChild(target);\r\n        }\r\n  \r\n        if (doc.body.querySelector(`a[href=\"${url}\"]`)) return false;\r\n        if (targetItem) usedIndexes.add(targetItem.index);\r\n  \r\n        const note = doc.createElement(\"p\");\r\n        note.className = \"ct-soft-link-note\";\r\n        note.appendChild(doc.createTextNode(\"Related option: \"));\r\n  \r\n        const link = doc.createElement(\"a\");\r\n        link.href = url;\r\n        link.textContent = title;\r\n        note.appendChild(link);\r\n        note.appendChild(doc.createTextNode(\".\"));\r\n  \r\n        target.insertAdjacentElement(\"afterend\", note);\r\n        return true;\r\n      }\r\n  \r\n      function scoreRecommendationParagraph(text, suggestion) {\r\n        const haystack = String(text || \"\").toLowerCase();\r\n        const phrases = [\r\n          suggestion.target_title,\r\n          suggestion.anchor_text,\r\n          suggestion.matched_keyword\r\n        ].filter(Boolean);\r\n        let score = 0;\r\n  \r\n        phrases.forEach(phrase => {\r\n          String(phrase || \"\")\r\n            .toLowerCase()\r\n            .replace(/-/g, \" \")\r\n            .split(/\\s+/)\r\n            .map(token => token.replace(/[^a-z0-9]/g, \"\"))\r\n            .filter(token => token.length >= 4 && ![\"freeze\", \"dried\", \"treat\", \"treats\", \"rich\", \"care\", \"option\", \"related\", \"recommendation\"].includes(token))\r\n            .forEach(token => {\r\n              if (haystack.includes(token)) score += 1;\r\n            });\r\n        });\r\n  \r\n        if (suggestion.type === \"product\" && haystack.includes(\"product\")) score += 1;\r\n        if (String(suggestion.target_title || \"\").toLowerCase().includes(\"topper\") && haystack.includes(\"topper\")) score += 3;\r\n        if (String(suggestion.target_title || \"\").toLowerCase().includes(\"chew\") && haystack.includes(\"chew\")) score += 3;\r\n        if (String(suggestion.target_title || \"\").toLowerCase().includes(\"fish\") && haystack.includes(\"fish\")) score += 2;\r\n        if (String(suggestion.target_title || \"\").toLowerCase().includes(\"chicken\") && haystack.includes(\"chicken\")) score += 2;\r\n        return score;\r\n      }\r\n  \r\n      function getSelectedLinkSuggestions() {\r\n        return normalizeLinkSuggestions(currentLinkAnalysis)\r\n          .filter(item => selectedLinkSuggestionIds.has(item.id));\r\n      }\r\n  \r\n      function extractProductHandleFromUrl(url) {\r\n        const raw = String(url || \"\").trim();\r\n        if (!raw) return \"\";\r\n  \r\n        try {\r\n          const parsed = raw.includes(\"://\")\r\n            ? new URL(raw)\r\n            : new URL(raw.startsWith(\"/\") ? raw : `/${raw}`, window.location.origin);\r\n          const parts = parsed.pathname.split(\"/\").filter(Boolean);\r\n          const productIndex = parts.findIndex(part => part.toLowerCase() === \"products\");\r\n          return productIndex >= 0 && parts[productIndex + 1]\r\n            ? parts[productIndex + 1].trim()\r\n            : \"\";\r\n        } catch (error) {\r\n          const match = raw.match(/\\/products\\/([^/?#]+)/i);\r\n          return match ? match[1].trim() : \"\";\r\n        }\r\n      }\r\n  \r\n      function normalizeImageProductCandidate(item, selected = false) {\r\n        if (!item || item.type !== \"product\") return null;\r\n        const url = String(item.target_url || \"\").trim();\r\n        const handle = extractProductHandleFromUrl(url);\r\n        const title = String(item.target_title || item.anchor_text || handle || \"\").trim();\r\n        if (!handle || !title) return null;\r\n  \r\n        return {\r\n          id: item.id || handle,\r\n          handle,\r\n          title,\r\n          url,\r\n          selected,\r\n          status: item.target_status || \"\",\r\n          reason: item.reason || item.matched_keyword || \"\"\r\n        };\r\n      }\r\n  \r\n      function getImageProductCandidatesFromLinks() {\r\n        const suggestions = normalizeLinkSuggestions(currentLinkAnalysis)\r\n          .filter(item => item.type === \"product\");\r\n        const selected = suggestions\r\n          .filter(item => selectedLinkSuggestionIds.has(item.id))\r\n          .map(item => normalizeImageProductCandidate(item, true))\r\n          .filter(Boolean);\r\n        const source = selected.length\r\n          ? selected\r\n          : suggestions\r\n              .map(item => normalizeImageProductCandidate(item, false))\r\n              .filter(Boolean);\r\n  \r\n        const seen = new Set();\r\n        return source.filter(item => {\r\n          const key = item.handle.toLowerCase();\r\n          if (seen.has(key)) return false;\r\n          seen.add(key);\r\n          return true;\r\n        }).slice(0, 6);\r\n      }\r\n  \r\n      function renderImageProductRecommendations() {\r\n        const wrap = $(\"imageLinkProductRecommendations\");\r\n        if (!wrap) return;\r\n  \r\n        const candidates = getImageProductCandidatesFromLinks();\r\n        if (!candidates.length) {\r\n          wrap.innerHTML = `<div class=\"ct-link-summary\">\u7B2C\u4E09\u6B65\u6682\u672A\u51FA\u73B0\u53EF\u7528\u4EA7\u54C1\u94FE\u63A5\u3002\u53EF\u4EE5\u4FDD\u6301\u4E0D\u5E26\u4EA7\u54C1\uFF0C\u6216\u70B9\u51FB\u4E0A\u65B9\u6309\u94AE\u624B\u52A8\u9009\u62E9 Shopify \u4EA7\u54C1\u3002</div>`;\r\n          return;\r\n        }\r\n  \r\n        wrap.innerHTML = candidates.map(item => `\r\n          <div class=\"ct-image-product-rec\">\r\n            <div>\r\n              <div class=\"ct-image-product-rec-title\">${escapeHtml(item.title)}</div>\r\n              <div class=\"ct-image-product-rec-meta\">\r\n                ${item.selected ? \"\u6765\u81EA\u7B2C\u4E09\u6B65\u5DF2\u9009\u4EA7\u54C1\u5185\u94FE\" : \"\u6765\u81EA\u7B2C\u4E09\u6B65\u4EA7\u54C1\u5185\u94FE\u5EFA\u8BAE\"}${item.status ? ` \uFF5C ${escapeHtml(item.status)}` : \"\"}<br>\r\n                ${escapeHtml(item.url || `/products/${item.handle}`)}\r\n                ${item.reason ? `<br>${escapeHtml(item.reason)}` : \"\"}\r\n              </div>\r\n            </div>\r\n            <button type=\"button\" class=\"ct-mini-btn\" data-image-product-handle=\"${escapeHtml(item.handle)}\" data-image-product-title=\"${escapeHtml(item.title)}\" data-image-product-url=\"${escapeHtml(item.url)}\">\u7528\u4E8E\u914D\u56FE</button>\r\n          </div>\r\n        `).join(\"\");\r\n  \r\n        wrap.querySelectorAll(\"[data-image-product-handle]\").forEach(button => {\r\n          button.addEventListener(\"click\", async () => {\r\n            await useRecommendedImageProduct(button);\r\n          });\r\n        });\r\n      }\r\n  \r\n      async function useRecommendedImageProduct(button) {\r\n        const handle = button?.dataset?.imageProductHandle || \"\";\r\n        const fallbackTitle = button?.dataset?.imageProductTitle || \"\";\r\n        const fallbackUrl = button?.dataset?.imageProductUrl || (handle ? `/products/${handle}` : \"\");\r\n        if (!handle) return;\r\n  \r\n        const originalText = button.textContent;\r\n        button.disabled = true;\r\n        button.textContent = \"\u8BFB\u53D6\u4E2D\";\r\n  \r\n        try {\r\n          const full = await fetchProductJsonByHandle(handle);\r\n          if (!full) {\r\n            throw new Error(\"\u6CA1\u6709\u8BFB\u53D6\u5230\u8BE5\u4EA7\u54C1\u7684 Shopify \u56FE\u7247\u6570\u636E\u3002\");\r\n          }\r\n  \r\n          const imageUrl = getProductImageUrl(full);\r\n          const mergedImages = normalizeImageUrlList(full?.images || [full?.featured_image, imageUrl], 4);\r\n          const selectedImage = imageUrl || mergedImages[0] || \"\";\r\n          const mergedProduct = {\r\n            title: full?.title || fallbackTitle,\r\n            handle: full?.handle || handle,\r\n            url: fallbackUrl || (full?.handle ? `/products/${full.handle}` : `/products/${handle}`),\r\n            featured_image: selectedImage,\r\n            image: selectedImage,\r\n            images: mergedImages.length ? mergedImages : normalizeImageUrlList([selectedImage], 4),\r\n            tags: Array.isArray(full?.tags)\r\n              ? full.tags\r\n              : (typeof full?.tags === \"string\" ? full.tags.split(\",\").map(t => t.trim()).filter(Boolean) : [])\r\n          };\r\n  \r\n          applySelectedProduct(mergedProduct);\r\n          setStatus(\"imageGenStatus\", `\u5DF2\u9009\u62E9\u5185\u94FE\u4EA7\u54C1\u7528\u4E8E\u914D\u56FE\uFF1A${mergedProduct.title}`);\r\n        } catch (err) {\r\n          setStatus(\"imageGenStatus\", `\u8BFB\u53D6\u5185\u94FE\u4EA7\u54C1\u5931\u8D25\uFF1A${err.message}`);\r\n        } finally {\r\n          button.disabled = false;\r\n          button.textContent = originalText;\r\n        }\r\n      }\r\n  \r\n      function buildLinkedHtmlFromSuggestions(suggestions) {\r\n        const baseHtml = linkBaseArticleHtml || getCurrentArticleHtml();\r\n        const doc = new DOMParser().parseFromString(baseHtml, \"text/html\");\r\n        let appliedCount = 0;\r\n        const recommendationState = { usedIndexes: new Set() };\r\n  \r\n        suggestions.forEach(item => {\r\n          if (applySingleLink(doc, item, recommendationState)) appliedCount += 1;\r\n        });\r\n  \r\n        return {\r\n          html: doc.body.innerHTML.trim(),\r\n          appliedCount\r\n        };\r\n      }\r\n  \r\n      function renderTemporaryLinkPreview() {\r\n        const suggestions = getSelectedLinkSuggestions();\r\n        const result = buildLinkedHtmlFromSuggestions(suggestions);\r\n        $(\"linkPreview\").innerHTML = result.html || \"<p>\u6682\u65E0\u9884\u89C8\u3002</p>\";\r\n        return result;\r\n      }\r\n  \r\n      function handleApplyLinks() {\r\n        const suggestions = getSelectedLinkSuggestions();\r\n  \r\n        if (!suggestions.length) {\r\n          setStatus(\"linkStatus\", \"\u5F53\u524D\u6CA1\u6709\u9009\u4E2D\u7684\u5185\u94FE\u5EFA\u8BAE\u3002\");\r\n          return;\r\n        }\r\n  \r\n        const result = buildLinkedHtmlFromSuggestions(suggestions);\r\n  \r\n        linkedArticleHtml = result.html;\r\n        $(\"textRaw\").value = linkedArticleHtml;\r\n        $(\"articleEditor\").innerHTML = linkedArticleHtml;\r\n        $(\"linkPreview\").innerHTML = linkedArticleHtml || \"<p>\u6682\u65E0\u9884\u89C8\u3002</p>\";\r\n        renderLinkArticleSummary();\r\n        renderImageProductRecommendations();\r\n        setStatus(\"linkStatus\", `\u5DF2\u5E94\u7528 ${result.appliedCount} \u4E2A\u5185\u94FE\u3002\u8BF7\u68C0\u67E5\u9884\u89C8\u540E\u7EE7\u7EED\u3002`);\r\n      }\r\n  \r\n      function handleSkipLinks() {\r\n        linkedArticleHtml = getCurrentArticleHtml();\r\n        $(\"linkPreview\").innerHTML = linkedArticleHtml || \"<p>\u6682\u65E0\u9884\u89C8\u3002</p>\";\r\n        unlockStep(4);\r\n        renderImageProductRecommendations();\r\n        setStatus(\"linkStatus\", \"\u5DF2\u8DF3\u8FC7\u5185\u94FE\u6B65\u9AA4\uFF0C\u53EF\u4EE5\u7EE7\u7EED\u914D\u56FE\u3002\");\r\n        setStep(4);\r\n      }\r\n  \r\n      function handleConfirmLinks() {\r\n        if (!linkedArticleHtml) {\r\n          const suggestions = getSelectedLinkSuggestions();\r\n          if (suggestions.length) {\r\n            const result = buildLinkedHtmlFromSuggestions(suggestions);\r\n            linkedArticleHtml = result.html;\r\n            $(\"linkPreview\").innerHTML = linkedArticleHtml || \"<p>\u6682\u65E0\u9884\u89C8\u3002</p>\";\r\n          } else {\r\n            linkedArticleHtml = linkBaseArticleHtml || getCurrentArticleHtml();\r\n          }\r\n        }\r\n        $(\"textRaw\").value = linkedArticleHtml;\r\n        $(\"articleEditor\").innerHTML = linkedArticleHtml;\r\n        unlockStep(4);\r\n        renderImageProductRecommendations();\r\n        setStatus(\"linkStatus\", \"\u5185\u94FE\u5DF2\u786E\u8BA4\uFF0C\u6B63\u5728\u8FDB\u5165\u914D\u56FE\u6B65\u9AA4\u3002\");\r\n        setStep(4);\r\n      }\r\n  \r\n      function applyBlock(tagName) {\r\n        const selection = window.getSelection();\r\n        if (!selection.rangeCount) return;\r\n        const range = selection.getRangeAt(0);\r\n        const text = range.toString().trim();\r\n        if (!text) return;\r\n        const el = document.createElement(tagName);\r\n        el.textContent = text;\r\n        range.deleteContents();\r\n        range.insertNode(el);\r\n        syncHtmlFromEditor();\r\n      }\r\n  \r\n      function isRetryableApiPath(path) {\r\n        return /^\\/content\\//.test(path) || path === \"/link/analyze\" || path === \"/query-image\";\r\n      }\r\n  \r\n      function isRetryableApiError(error) {\r\n        const message = String(error?.message || error || \"\");\r\n        return error?.name === \"TypeError\" ||\r\n          error?.name === \"AbortError\" ||\r\n          error?.retryable === true ||\r\n          /failed to fetch|network|timeout|timed out|http (408|425|429|500|502|503|504|522|523|524)/i.test(message);\r\n      }\r\n  \r\n      function wait(ms) {\r\n        return new Promise(resolve => setTimeout(resolve, ms));\r\n      }\r\n  \r\n      function parseApiJson(text) {\r\n        if (!text) return {};\r\n        try {\r\n          return JSON.parse(text);\r\n        } catch (error) {\r\n          return null;\r\n        }\r\n      }\r\n  \r\n      function buildApiError(path, resp, data, text) {\r\n        const details = typeof data?.details === \"string\"\r\n          ? data.details\r\n          : data?.details\r\n            ? JSON.stringify(data.details)\r\n            : \"\";\r\n        const message = [\r\n          data?.error,\r\n          data?.message,\r\n          details,\r\n          text && !data?.error && !data?.message ? text.slice(0, 500) : \"\",\r\n          `HTTP ${resp.status}`\r\n        ].filter(Boolean).join(\" | \");\r\n        const error = new Error(message || `\u8BF7\u6C42\u5931\u8D25\uFF1A${path}`);\r\n        error.status = resp.status;\r\n        error.retryable = isRetryableApiPath(path) && [408, 425, 429, 500, 502, 503, 504, 522, 523, 524].includes(Number(resp.status));\r\n        return error;\r\n      }\r\n  \r\n      async function apiPost(path, body, options = {}) {\r\n        const retries = Math.max(0, Number(options.retries ?? (isRetryableApiPath(path) ? 1 : 0)));\r\n        let lastError = null;\r\n  \r\n        for (let attempt = 0; attempt <= retries; attempt++) {\r\n          try {\r\n            const resp = await fetch(`${getWorkerBase()}${path}`, {\r\n              method: \"POST\",\r\n              headers: getHeaders(),\r\n              body: JSON.stringify(body)\r\n            });\r\n  \r\n            const text = await resp.text();\r\n            const data = parseApiJson(text);\r\n            if (!resp.ok) {\r\n              throw buildApiError(path, resp, data, text);\r\n            }\r\n            if (!data) {\r\n              throw new Error(`\u54CD\u5E94\u4E0D\u662F\u6709\u6548 JSON\uFF1A${path}`);\r\n            }\r\n            return data;\r\n          } catch (error) {\r\n            lastError = error;\r\n            if (attempt < retries && isRetryableApiError(error)) {\r\n              await wait(900 * (attempt + 1));\r\n              continue;\r\n            }\r\n            throw error;\r\n          }\r\n        }\r\n  \r\n        throw lastError || new Error(`\u8BF7\u6C42\u5931\u8D25\uFF1A${path}`);\r\n      }\r\n  \r\n      async function apiGet(path, params = {}) {\r\n        const url = new URL(`${getWorkerBase()}${path}`);\r\n        Object.entries(params || {}).forEach(([key, value]) => {\r\n          if (value != null && value !== \"\") url.searchParams.set(key, value);\r\n        });\r\n        const resp = await fetch(url.toString(), {\r\n          method: \"GET\",\r\n          headers: getHeaders()\r\n        });\r\n        const text = await resp.text();\r\n        const data = parseApiJson(text);\r\n        if (!resp.ok) {\r\n          throw buildApiError(path, resp, data, text);\r\n        }\r\n        if (!data) {\r\n          throw new Error(`\u54CD\u5E94\u4E0D\u662F\u6709\u6548 JSON\uFF1A${path}`);\r\n        }\r\n        return data;\r\n      }\r\n  \r\n      async function handleHealth() {\r\n        setStatus(\"workerStatus\", \"\u6B63\u5728\u6D4B\u8BD5 Worker \u8FDE\u63A5\u2026\u2026\");\r\n        try {\r\n          const resp = await fetch(`${getWorkerBase()}/health`);\r\n          const data = await resp.json();\r\n          setStatus(\"workerStatus\", `\u8FDE\u63A5\u6210\u529F\uFF1A${JSON.stringify(data)}`);\r\n        } catch (err) {\r\n          setStatus(\"workerStatus\", `\u8FDE\u63A5\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      function normalizeApiData(data) {\r\n        return data?.data || data || {};\r\n      }\r\n  \r\n      function safeParseNestedJson(value) {\r\n        try {\r\n          if (typeof value === \"string\") return JSON.parse(value);\r\n          return value;\r\n        } catch (e) {\r\n          return value;\r\n        }\r\n      }\r\n  \r\n      function normalizeImagePlanTask(item, index) {\r\n        if (!item) return null;\r\n  \r\n        if (typeof item === \"string\") {\r\n          const prompt = item.trim();\r\n          return prompt ? { label: `\u56FE\u7247 ${index + 1}`, prompt, purpose: \"\" } : null;\r\n        }\r\n  \r\n        if (typeof item !== \"object\") return null;\r\n  \r\n        const prompt = String(\r\n          item.prompt ||\r\n          item.image_prompt ||\r\n          item.visual_prompt ||\r\n          item.description ||\r\n          \"\"\r\n        ).trim();\r\n  \r\n        if (!prompt) return null;\r\n  \r\n        return {\r\n          ...item,\r\n          label: String(item.label || item.title || `\u56FE\u7247 ${index + 1}`).trim(),\r\n          prompt,\r\n          negative_prompt: String(item.negative_prompt || item.negativePrompt || item.ne_prompt || item.no || \"\").trim(),\r\n          placement: String(item.placement || item.slot || \"\").trim(),\r\n          composition: String(item.composition || item.framing || item.camera || \"\").trim(),\r\n          purpose: String(item.purpose || item.reason || item.placement || \"\").trim()\r\n        };\r\n      }\r\n  \r\n      function normalizeImagePlanTasks(value) {\r\n        if (value == null) return [];\r\n  \r\n        let current = safeParseNestedJson(value);\r\n  \r\n        if (typeof current === \"string\") {\r\n          const prompt = current.trim();\r\n          return prompt ? [{ label: \"\u56FE\u7247 1\", prompt, purpose: \"\" }] : [];\r\n        }\r\n  \r\n        if (Array.isArray(current)) {\r\n          return current\r\n            .map((item, index) => normalizeImagePlanTask(item, index))\r\n            .filter(Boolean);\r\n        }\r\n  \r\n        if (current && typeof current === \"object\") {\r\n          const candidates = [\r\n            current.image_tasks_json,\r\n            current.image_tasks,\r\n            current.tasks,\r\n            current.images,\r\n            current.data,\r\n            current.result,\r\n            current.output,\r\n            current.raw\r\n          ];\r\n  \r\n          for (const candidate of candidates) {\r\n            if (candidate == null || candidate === current) continue;\r\n            const tasks = normalizeImagePlanTasks(candidate);\r\n            if (tasks.length) return tasks;\r\n          }\r\n        }\r\n  \r\n        return [];\r\n      }\r\n  \r\n      function normalizeImagePlanResponse(data) {\r\n        const rawOuter = data?.data || data?.raw || data;\r\n        const raw = safeParseNestedJson(rawOuter?.data || rawOuter);\r\n        let tasks = normalizeImagePlanTasks(raw);\r\n        if (!tasks.length) {\r\n          tasks = normalizeImagePlanTasks(data);\r\n        }\r\n  \r\n        return {\r\n          raw,\r\n          tasks,\r\n          global_negative_prompt:\r\n            raw?.global_ne_prompt ||\r\n            raw?.global_negative_prompt ||\r\n            data?.global_ne_prompt ||\r\n            data?.global_negative_prompt ||\r\n            \"\"\r\n        };\r\n      }\r\n  \r\n      function extractWorkflowOutput(data) {\r\n        const seen = new Set();\r\n  \r\n        function walk(value) {\r\n          if (value == null) return {};\r\n  \r\n          let current = value;\r\n  \r\n          if (typeof current === \"string\") {\r\n            const parsed = safeParseNestedJson(current);\r\n            if (parsed === current) return {};\r\n            current = parsed;\r\n          }\r\n  \r\n          if (!current || typeof current !== \"object\") return {};\r\n  \r\n          if (seen.has(current)) return {};\r\n          seen.add(current);\r\n  \r\n          if (\r\n            typeof current.article_html === \"string\" ||\r\n            typeof current.html === \"string\" ||\r\n            typeof current.content_html === \"string\"\r\n          ) {\r\n            return current;\r\n          }\r\n  \r\n          const candidates = [\r\n            current.data,\r\n            current.output,\r\n            current.result,\r\n            current.result?.output,\r\n            current.result?.data,\r\n            current.output?.data,\r\n            current.output?.output,\r\n            current.data?.output,\r\n            current.data?.data\r\n          ];\r\n  \r\n          for (const item of candidates) {\r\n            const found = walk(item);\r\n            if (found && typeof found === \"object\" && Object.keys(found).length) {\r\n              return found;\r\n            }\r\n          }\r\n  \r\n          return current;\r\n        }\r\n  \r\n        return walk(data);\r\n      }\r\n  \r\n      function normalizeImageUrl(url) {\r\n        let value = String(url || \"\").trim();\r\n  \r\n        if (!value) return \"\";\r\n  \r\n        value = value.replace(/&amp;/g, \"&\");\r\n  \r\n        if (value.startsWith(\"//\")) {\r\n          return `https:${value}`;\r\n        }\r\n  \r\n        if (value.startsWith(\"http://\")) {\r\n          return value.replace(/^http:\\/\\//i, \"https://\");\r\n        }\r\n  \r\n        return value;\r\n      }\r\n  \r\n      function normalizeImageUrlList(values, maxCount = 2) {\r\n        const urls = [];\r\n        const seen = new Set();\r\n  \r\n        (Array.isArray(values) ? values : [values]).forEach(value => {\r\n          const url = normalizeImageUrl(\r\n            value && typeof value === \"object\"\r\n              ? (value.url || value.src || value.image || \"\")\r\n              : value\r\n          );\r\n  \r\n          if (!url || seen.has(url)) return;\r\n  \r\n          seen.add(url);\r\n          urls.push(url);\r\n        });\r\n  \r\n        return urls.slice(0, maxCount);\r\n      }\r\n  \r\n      function escapeHtml(str) {\r\n        return String(str)\r\n          .replace(/&/g, \"&amp;\")\r\n          .replace(/</g, \"&lt;\")\r\n          .replace(/>/g, \"&gt;\")\r\n          .replace(/\"/g, \"&quot;\")\r\n          .replace(/'/g, \"&#039;\");\r\n      }\r\n  \r\n      function normalizeTags(product) {\r\n        if (!product) return [];\r\n        const tags = product.tags || product.tag || [];\r\n        if (Array.isArray(tags)) {\r\n          return tags.map(t => String(t).toLowerCase().trim()).filter(Boolean);\r\n        }\r\n        if (typeof tags === \"string\") {\r\n          return tags.split(\",\").map(t => t.toLowerCase().trim()).filter(Boolean);\r\n        }\r\n        return [];\r\n      }\r\n  \r\n      function isProductCompatibleWithPetType(productData, petType) {\r\n        if (!petType) return true;\r\n  \r\n        const tags = normalizeTags(productData);\r\n        const haystack = [\r\n          ...(tags || []),\r\n          String(productData?.title || \"\").toLowerCase(),\r\n          String(productData?.handle || \"\").toLowerCase(),\r\n          String(productData?.url || \"\").toLowerCase(),\r\n          String(productData?.product_type || \"\").toLowerCase(),\r\n          String(productData?.type || \"\").toLowerCase()\r\n        ].join(\" \");\r\n  \r\n        if (petType === \"cat\") {\r\n          return (\r\n            tags.includes(\"cat\") ||\r\n            tags.includes(\"for-cat\") ||\r\n            tags.includes(\"cat-safe\") ||\r\n            /\\bcat\\b/.test(haystack)\r\n          );\r\n        }\r\n  \r\n        if (petType === \"dog\") {\r\n          return (\r\n            tags.includes(\"dog\") ||\r\n            tags.includes(\"for-dog\") ||\r\n            tags.includes(\"dog-safe\") ||\r\n            /\\bdog\\b/.test(haystack)\r\n          );\r\n        }\r\n  \r\n        return true;\r\n      }\r\n  \r\n      function generateKeywordsFromProduct(productTitle, productTags, petType) {\r\n        const title = String(productTitle || \"\").trim().toLowerCase();\r\n        const tags = (productTags || []).map(t => String(t).toLowerCase());\r\n  \r\n        if (!title || !petType) return \"\";\r\n  \r\n        const species = petType === \"cat\" ? \"cats\" : \"dogs\";\r\n        const keywordSet = new Set();\r\n  \r\n        keywordSet.add(`${title} for ${species}`);\r\n  \r\n        if (tags.includes(\"freeze-dried\")) {\r\n          keywordSet.add(`freeze-dried ${petType} treats`);\r\n        }\r\n        if (tags.includes(\"single-ingredient\")) {\r\n          keywordSet.add(`single ingredient ${petType} treat`);\r\n        }\r\n        if (tags.includes(\"joint-support\")) {\r\n          keywordSet.add(`${petType} joint support treat`);\r\n        }\r\n        if (tags.includes(\"natural-chew\")) {\r\n          keywordSet.add(`natural ${petType} chew`);\r\n        }\r\n        if (tags.includes(\"training-treat\")) {\r\n          keywordSet.add(`${petType} training treats`);\r\n        }\r\n        if (tags.includes(\"high-protein\")) {\r\n          keywordSet.add(`high protein ${petType} treats`);\r\n        }\r\n        if (tags.includes(\"dental\")) {\r\n          keywordSet.add(`${petType} dental chew`);\r\n        }\r\n        if (tags.includes(\"human-grade\")) {\r\n          keywordSet.add(`human grade ${petType} treats`);\r\n        }\r\n  \r\n        if (keywordSet.size === 1) {\r\n          keywordSet.add(`natural ${petType} treats`);\r\n          keywordSet.add(`premium ${petType} treats`);\r\n        }\r\n  \r\n        return Array.from(keywordSet).slice(0, 5).join(\", \");\r\n      }\r\n  \r\n        function populatePetBreedOptions() {\r\n          const petType = ($(\"petType\").value || \"\").trim().toLowerCase();\r\n          const select = $(\"petBreedSelect\");\r\n          if (!select) return;\r\n  \r\n          const currentValue = select.value;\r\n          const source = petType === \"cat\" ? CAT_BREEDS : DOG_BREEDS;\r\n  \r\n          select.innerHTML = \"\";\r\n          source.forEach(item => {\r\n            const opt = document.createElement(\"option\");\r\n            opt.value = item.value;\r\n            opt.textContent = item.label;\r\n            select.appendChild(opt);\r\n          });\r\n  \r\n          if (source.some(item => item.value === currentValue)) {\r\n            select.value = currentValue;\r\n          }\r\n        }\r\n  \r\n        function buildPetCharacterAnchorFromInputs() {\r\n          const breed = $(\"petBreedSelect\") ? $(\"petBreedSelect\").value.trim() : \"\";\r\n          const feature = $(\"petFeatureNote\") ? $(\"petFeatureNote\").value.trim() : \"\";\r\n  \r\n          if (breed && feature) return `${breed}, ${feature}`;\r\n          if (breed) return breed;\r\n          if (feature) return feature;\r\n          return \"\";\r\n        }\r\n  \r\n        function syncPetAnchorFromBreedInputs(force = false) {\r\n          const anchor = $(\"petCharacterAnchor\");\r\n          if (!anchor) return;\r\n  \r\n          const autoValue = buildPetCharacterAnchorFromInputs();\r\n          const currentValue = anchor.value.trim();\r\n  \r\n          if (force || !currentValue || currentValue === anchor.dataset.lastAutoValue) {\r\n            anchor.value = autoValue;\r\n            anchor.dataset.lastAutoValue = autoValue;\r\n          }\r\n        }\r\n  \r\n      function syncProductToImageStep() {\r\n        updateProductUI();\r\n      }\r\n  \r\n      function syncProductVisualMode() {\r\n        const select = $(\"productVisualMode\");\r\n        if (!select) return;\r\n  \r\n        const hasProduct = !!selectedProduct.title;\r\n        const isAutoMode = builderMode === \"auto\";\r\n        const hasProductReferences = getCheckedProductReferenceUrls().length > 0;\r\n  \r\n        if (isAutoMode || !hasProduct || !hasProductReferences) {\r\n          select.value = \"no_product\";\r\n          select.disabled = true;\r\n          select.dataset.forcedNoProduct = \"true\";\r\n          return;\r\n        }\r\n  \r\n        if (!select.value || select.dataset.forcedNoProduct === \"true\") {\r\n          select.value = \"product_supported\";\r\n        }\r\n        select.disabled = false;\r\n        delete select.dataset.forcedNoProduct;\r\n      }\r\n  \r\n      function syncImageProductControls() {\r\n        const hasProduct = !!selectedProduct.title;\r\n        const isAutoMode = builderMode === \"auto\";\r\n        const productChecked = !!($(\"refProductImage\") && $(\"refProductImage\").checked);\r\n        const packageChecked = !!($(\"refPackageImage\") && $(\"refPackageImage\").checked);\r\n        const canUseProductReference = hasProduct && !isAutoMode;\r\n  \r\n        setFieldValue(\"imageProductName\", selectedProduct.title || \"\");\r\n  \r\n        const imageInfo = $(\"imagePickedProductInfo\");\r\n        if (imageInfo) {\r\n          imageInfo.textContent = selectedProduct.title\r\n            ? `\u5DF2\u9009\u62E9\uFF1A${selectedProduct.title}${selectedProduct.images?.length ? ` \uFF5C \u53EF\u7528\u56FE\u7247 ${selectedProduct.images.length} \u5F20` : \"\"}`\r\n            : \"\u672A\u9009\u62E9\u4EA7\u54C1\u3002\u5F53\u524D\u4F1A\u751F\u6210\u4E0D\u5E26\u4EA7\u54C1\u7684\u5BA0\u7269\u751F\u6D3B\u573A\u666F\u56FE\u3002\";\r\n        }\r\n  \r\n        [\r\n          [\"imageRefProductImage\", productChecked],\r\n          [\"imageRefPackageImage\", packageChecked]\r\n        ].forEach(([id, checked]) => {\r\n          const input = $(id);\r\n          if (!input) return;\r\n          input.disabled = !canUseProductReference;\r\n          input.checked = canUseProductReference ? checked : false;\r\n        });\r\n  \r\n        const help = $(\"imageReferenceHelp\");\r\n        if (help) {\r\n          help.textContent = isAutoMode\r\n            ? \"\u81EA\u52A8\u6A21\u5F0F\u5F3A\u5236\u4E0D\u4F7F\u7528\u4EA7\u54C1\u56FE\u548C\u5305\u88C5\u56FE\u3002\"\r\n            : hasProduct\r\n              ? \"\u52FE\u9009\u540E\u4F1A\u628A\u5BF9\u5E94\u4EA7\u54C1\u56FE\u7247\u4F5C\u4E3A\u53C2\u8003\u56FE\u53D1\u7ED9\u751F\u56FE\u63A5\u53E3\uFF1B\u4E0D\u52FE\u9009\u5219\u4ECD\u7136\u4E0D\u51FA\u73B0\u4EA7\u54C1\u3002\"\r\n              : \"\u672A\u9009\u62E9\u4EA7\u54C1\u65F6\u4E0D\u80FD\u4F7F\u7528\u4EA7\u54C1\u56FE\uFF1B\u53EF\u5148\u4ECE\u7B2C\u4E09\u6B65\u4EA7\u54C1\u63A8\u8350\u6216\u624B\u52A8\u9009\u62E9 Shopify \u4EA7\u54C1\u3002\";\r\n        }\r\n        renderImageProductRecommendations();\r\n      }\r\n  \r\n      function syncReferenceOptionState() {\r\n        const hasProduct = !!selectedProduct.title;\r\n        const isAutoMode = builderMode === \"auto\";\r\n        const canUseProductReference = hasProduct && !isAutoMode;\r\n        [\"refProductImage\", \"refPackageImage\"].forEach((id) => {\r\n          const input = $(id);\r\n          if (!input) return;\r\n          input.disabled = !canUseProductReference;\r\n          if (!canUseProductReference) input.checked = false;\r\n        });\r\n        const help = $(\"titleReferenceHelp\");\r\n        if (help) {\r\n          help.textContent = isAutoMode\r\n            ? \"\u81EA\u52A8\u6A21\u5F0F\u5F3A\u5236\u4E0D\u4F7F\u7528\u4EA7\u54C1\u56FE\u548C\u5305\u88C5\u56FE\uFF1B\u5207\u6362\u5230\u624B\u52A8\u6A21\u5F0F\u540E\u624D\u53EF\u9009\u62E9\u53C2\u8003\u56FE\u3002\"\r\n            : hasProduct\r\n              ? \"\u52FE\u9009\u540E\u4EC5\u5F71\u54CD\u7B2C 4 \u6B65\u624B\u52A8\u914D\u56FE\uFF1B\u4E0D\u52FE\u9009\u5219\u751F\u6210\u4E0D\u5E26\u4EA7\u54C1\u7684\u5BA0\u7269\u573A\u666F\u56FE\u3002\"\r\n              : \"\u672A\u9009\u62E9\u4EA7\u54C1\u65F6\u4E0D\u53EF\u52FE\u9009\u53C2\u8003\u56FE\uFF1B\u5148\u9009\u62E9\u4EA7\u54C1\u540E\u518D\u542F\u7528\u3002\";\r\n        }\r\n        syncImageProductControls();\r\n        syncProductVisualMode();\r\n        updateAvailableModels();\r\n      }\r\n  \r\n      function getCheckedProductReferenceUrls() {\r\n        if (builderMode === \"auto\") return [];\r\n        const refs = [];\r\n        const images = selectedProduct.images || [];\r\n        if ($(\"refProductImage\") && $(\"refProductImage\").checked && images[0]) refs.push(images[0]);\r\n        if ($(\"refPackageImage\") && $(\"refPackageImage\").checked && images[1]) refs.push(images[1]);\r\n        return normalizeImageUrlList(refs, 2);\r\n      }\r\n  \r\n      function getProductReferenceUrls() {\r\n        if ($(\"productVisualMode\")?.value === \"no_product\") return [];\r\n        return getCheckedProductReferenceUrls();\r\n      }\r\n  \r\n      function applySelectedProduct(product) {\r\n        const title = product?.title || \"\";\r\n        const image = normalizeImageUrl(product?.featured_image?.url || product?.image || product?.featured_image || \"\");\r\n        const images = normalizeImageUrlList([image, ...(product?.images || [])], 2);\r\n        const tags = normalizeTags(product);\r\n        const url = product?.url || product?.online_store_url || \"\";\r\n        const handle = product?.handle || \"\";\r\n        console.log(\"selected product raw =\", product);\r\n        console.log(\"selected product tags raw =\", product?.tags);\r\n        console.log(\"selected product tags normalized =\", normalizeTags(product));\r\n  \r\n        selectedProduct = {\r\n          title,\r\n          image,\r\n          images,\r\n          tags,\r\n          url,\r\n          handle\r\n        };\r\n  \r\n        $(\"productName\").value = title || \"\";\r\n        $(\"textProductName\").value = title || \"\";\r\n        if (title && builderMode !== \"auto\" && !$(\"refProductImage\").checked && !$(\"refPackageImage\").checked) {\r\n          $(\"refProductImage\").checked = true;\r\n        }\r\n  \r\n        const petTypeValue = ($(\"petType\").value || \"\").trim().toLowerCase();\r\n        const compatible = isProductCompatibleWithPetType({\r\n          title,\r\n          image,\r\n          tags,\r\n          url,\r\n          handle\r\n        }, petTypeValue);\r\n  \r\n        $(\"titlePickedProductInfo\").textContent =\r\n          title\r\n            ? `\u5DF2\u9009\u62E9\uFF1A${title}${tags.length ? ` \uFF5C tags: ${tags.join(\", \")}` : \"\"}`\r\n            : \"\";\r\n  \r\n        if (title && petTypeValue && !compatible) {\r\n          setStatus(\r\n            \"productCompatibilityStatus\",\r\n            `\u5F53\u524D\u4EA7\u54C1\u672A\u6807\u8BB0\u4E3A\u9002\u7528\u4E8E ${petTypeValue}\uFF0C\u4E0D\u80FD\u7EE7\u7EED\u751F\u6210\u6807\u9898\u3002\u8BF7\u66F4\u6362\u4EA7\u54C1\u6216\u66F4\u6539\u5BA0\u7269\u7C7B\u578B\u3002`\r\n          );\r\n        } else {\r\n          setStatus(\"productCompatibilityStatus\", \"\");\r\n        }\r\n  \r\n        if (title && compatible) {\r\n          const autoKeywords = generateKeywordsFromProduct(title, tags, petTypeValue);\r\n          if (autoKeywords) {\r\n            $(\"targetKeywords\").value = autoKeywords;\r\n            $(\"textTargetKeywords\").value = autoKeywords;\r\n          }\r\n        }\r\n  \r\n        updateProductUI();\r\n      }\r\n  \r\n      function clearSelectedProduct() {\r\n        selectedProduct = {\r\n          title: \"\",\r\n          image: \"\",\r\n          images: [],\r\n          tags: [],\r\n          url: \"\",\r\n          handle: \"\"\r\n        };\r\n  \r\n        $(\"productName\").value = \"\";\r\n        $(\"textProductName\").value = \"\";\r\n        $(\"titlePickedProductInfo\").textContent = \"\";\r\n        setStatus(\"productCompatibilityStatus\", \"\");\r\n        $(\"targetKeywords\").value = \"\";\r\n        $(\"textTargetKeywords\").value = \"\";\r\n        updateProductUI();\r\n      }\r\n  \r\n      function validateProductCompatibilityBeforeTitle() {\r\n        const petTypeValue = ($(\"petType\").value || \"\").trim().toLowerCase();\r\n  \r\n        if (!selectedProduct.title) {\r\n          return { ok: true };\r\n        }\r\n  \r\n        const compatible = isProductCompatibleWithPetType(selectedProduct, petTypeValue);\r\n        if (!compatible) {\r\n          return {\r\n            ok: false,\r\n            message: `\u5F53\u524D\u4EA7\u54C1\u672A\u6807\u8BB0\u4E3A\u9002\u7528\u4E8E ${petTypeValue}\uFF0C\u8BF7\u66F4\u6362\u4EA7\u54C1\u6216\u66F4\u6539\u5BA0\u7269\u7C7B\u578B\u540E\u518D\u751F\u6210\u6807\u9898\u3002`\r\n          };\r\n        }\r\n  \r\n        return { ok: true };\r\n      }\r\n  \r\n      function getImageSlotLabels(count) {\r\n        const n = Number(count || 3);\r\n        if (n === 2) return [\"\u9996\u56FE\", \"\u6B63\u6587\u56FE\"];\r\n        if (n === 3) return [\"\u9996\u56FE\", \"\u6B63\u6587\u56FE\", \"\u5C3E\u56FE\"];\r\n        return [\"\u9996\u56FE\", \"\u6B63\u6587\u56FE 1\", \"\u6B63\u6587\u56FE 2\", \"\u5C3E\u56FE\"];\r\n      }\r\n  \r\n      function getSourceUrlList() {\r\n        return getFieldValue(\"sourceUrls\")\r\n          .split(/\\r?\\n|,/)\r\n          .map(value => value.trim())\r\n          .filter(Boolean)\r\n          .slice(0, 8);\r\n      }\r\n  \r\n      function buildContentDiscoveryPayload() {\r\n        const query = getFieldValue(\"sourceQuery\").trim() || getFieldValue(\"targetKeywords\").trim();\r\n  \r\n        return {\r\n          parameters: {\r\n            content_type: $(\"contentType\").value,\r\n            pet_type: $(\"petType\").value.trim(),\r\n            query,\r\n            target_keywords: $(\"targetKeywords\").value.trim(),\r\n            product_name: $(\"productName\").value.trim(),\r\n            product_url: selectedProduct.url || \"\",\r\n            source_focus: getFieldValue(\"sourceFocus\") || \"authority_brand\",\r\n            source_urls: getSourceUrlList(),\r\n            limit: Math.max(1, Math.min(Number(getFieldValue(\"sourceLimit\") || 3), 12)),\r\n            brand_tone: $(\"brandTone\").value.trim(),\r\n            promotion_goal: $(\"promotionGoal\").value.trim(),\r\n            article_style_variant: getFieldValue(\"articleStyleVariant\") || \"practical_guide\",\r\n            rewrite_intensity: getFieldValue(\"rewriteIntensity\") || \"limited\",\r\n            notes: $(\"notes\").value.trim()\r\n          }\r\n        };\r\n      }\r\n  \r\n      function buildContentTitleRewritePayload(sources) {\r\n        return {\r\n          ...buildContentDiscoveryPayload(),\r\n          sources: Array.isArray(sources) ? sources : []\r\n        };\r\n      }\r\n  \r\n      function buildRewriteSourceExtract() {\r\n        const extract = getSourceExtract();\r\n        const source = selectedContentSource || {};\r\n        const title = source.original_title || source.title || extract?.title || \"\";\r\n        const url = source.url || extract?.url || \"\";\r\n        const domain = source.domain || extract?.domain || \"\";\r\n        const sourceName = source.source_name || extract?.source_name || \"\";\r\n        const sourceType = source.source_type || extract?.source_type || \"\";\r\n        const contentBlocks = normalizeSourceContentBlocks(\r\n          extract,\r\n          source.text_preview || source.snippet || \"\"\r\n        );\r\n        const headings = Array.isArray(extract?.headings) ? extract.headings : [];\r\n        const paragraphs = normalizeSourceParagraphs(\r\n          extract,\r\n          source.text_preview || source.snippet || \"\"\r\n        );\r\n        const fallbackText = contentBlocks.length\r\n          ? \"\"\r\n          : String(extract?.text || source.text_preview || source.snippet || \"\").slice(0, 48000);\r\n  \r\n        return {\r\n          url,\r\n          domain,\r\n          source_name: sourceName,\r\n          source_type: sourceType,\r\n          title,\r\n          meta_description: source.meta_description || extract?.meta_description || \"\",\r\n          headings: headings.slice(0, 40),\r\n          paragraphs: paragraphs.slice(0, 260),\r\n          content_blocks: contentBlocks.slice(0, 320),\r\n          text: fallbackText,\r\n          word_count_estimate: extract?.word_count_estimate || source.word_count_estimate || 0,\r\n          extracted_at: extract?.extracted_at || \"\"\r\n        };\r\n      }\r\n  \r\n      function buildRewriteSourceMeta(sourceExtract) {\r\n        const source = selectedContentSource || {};\r\n        return {\r\n          url: sourceExtract.url || source.url || \"\",\r\n          title: source.original_title || source.title || sourceExtract.title || \"\",\r\n          original_title: source.original_title || source.title || sourceExtract.title || \"\",\r\n          domain: sourceExtract.domain || source.domain || \"\",\r\n          source_name: sourceExtract.source_name || source.source_name || \"\",\r\n          source_type: sourceExtract.source_type || source.source_type || \"\",\r\n          meta_description: source.meta_description || sourceExtract.meta_description || \"\",\r\n          word_count_estimate: sourceExtract.word_count_estimate || source.word_count_estimate || 0,\r\n          extract_status: source.extract_status || \"readable\"\r\n        };\r\n      }\r\n  \r\n      function buildContentRewritePayload() {\r\n        const sourceExtract = buildRewriteSourceExtract();\r\n        const sourceMeta = buildRewriteSourceMeta(sourceExtract);\r\n        return {\r\n          parameters: {\r\n            content_type: $(\"contentType\").value,\r\n            pet_type: $(\"petType\").value.trim(),\r\n            query: $(\"sourceQuery\").value.trim() || $(\"targetKeywords\").value.trim(),\r\n            target_keywords: $(\"textTargetKeywords\").value.trim() || $(\"targetKeywords\").value.trim(),\r\n            product_name: $(\"textProductName\").value.trim(),\r\n            product_url: selectedProduct.url || \"\",\r\n            brand_tone: $(\"textBrandTone\").value.trim(),\r\n            promotion_goal: $(\"textPromotionGoal\").value.trim(),\r\n            rewrite_intensity: getFieldValue(\"rewriteIntensity\") || \"limited\",\r\n            notes: $(\"textNotes\").value.trim()\r\n          },\r\n          final_title: $(\"finalTitle\").value.trim(),\r\n          seo_title: $(\"seoTitle\").value.trim(),\r\n          meta_description: $(\"metaDescription\").value.trim(),\r\n          source: sourceMeta,\r\n          source_url: sourceMeta.url,\r\n          source_extract: sourceExtract\r\n        };\r\n      }\r\n  \r\n      function normalizeContentSources(data) {\r\n        const sources = data?.sources || data?.data?.sources || [];\r\n        return Array.isArray(sources) ? sources : [];\r\n      }\r\n  \r\n      function resolveContentSourceFromTitleOption(item, index = 0) {\r\n        if (item?.source && item.source.url) return item.source;\r\n        const sourceUrl = item?.source_url || \"\";\r\n        if (sourceUrl) {\r\n          const matched = currentContentSources.find(source => source.url === sourceUrl);\r\n          if (matched) return matched;\r\n          return {\r\n            title: item.source_title || sourceUrl,\r\n            url: sourceUrl,\r\n            source_name: item.source_name || \"\",\r\n            domain: \"\"\r\n          };\r\n        }\r\n        return currentContentSources[index % Math.max(1, currentContentSources.length)] || null;\r\n      }\r\n  \r\n      function renderSelectedSourceSummary() {\r\n        const wrap = $(\"selectedSourceSummary\");\r\n        if (!wrap) return;\r\n  \r\n        if (!selectedContentSource) {\r\n          wrap.innerHTML = \"\u6682\u672A\u9009\u62E9\u7D20\u6750\u3002\u8BF7\u5148\u5728\u7B2C\u4E00\u6B65\u91C7\u96C6\u5E76\u9009\u62E9\u4E00\u7BC7\u539F\u6587\u7D20\u6750\u3002\";\r\n          return;\r\n        }\r\n  \r\n        const title = selectedContentSource.title || selectedContentSource.url || \"\u53C2\u8003\u6587\u7AE0\";\r\n        const sourceName = selectedContentSource.source_name || selectedContentSource.domain || \"\";\r\n        const url = selectedContentSource.url || \"\";\r\n        const extractInfo = currentSourceExtract?.word_count_estimate\r\n          ? `\uFF1B\u5DF2\u63D0\u53D6\u7EA6 ${currentSourceExtract.word_count_estimate} \u8BCD`\r\n          : \"\";\r\n        const usageInfo = selectedContentSource?.used || selectedContentSource?.usage_status === \"used\"\r\n          ? `<br><strong>\u7D20\u6750\u72B6\u6001\uFF1A</strong>\u5DF2\u8FDB\u5165 Shopify\uFF0C\u540E\u7EED\u81EA\u52A8\u91C7\u96C6\u4F1A\u6392\u9664\u8FD9\u7BC7\u539F\u6587`\r\n          : \"\";\r\n  \r\n        wrap.innerHTML = `\r\n          <strong>\u53C2\u8003\u6765\u6E90\uFF1A</strong>${escapeHtml(title)}${sourceName ? `\uFF5C${escapeHtml(sourceName)}` : \"\"}${extractInfo}<br>\r\n          ${url ? `<a href=\"${escapeHtml(url)}\" target=\"_blank\" rel=\"noopener\">${escapeHtml(url)}</a>` : \"\"}\r\n          ${usageInfo}\r\n        `;\r\n      }\r\n  \r\n      function applySourceUsageStatus(usage) {\r\n        const sourceUrl = String(usage?.source_url || \"\").trim();\r\n        if (!sourceUrl) return;\r\n  \r\n        const matches = source => String(source?.url || \"\").trim() === sourceUrl;\r\n        currentContentSources.forEach(source => {\r\n          if (!matches(source)) return;\r\n          source.used = true;\r\n          source.usage_status = \"used\";\r\n          source.used_at = usage.used_at || new Date().toISOString();\r\n          source.used_article_url = usage.article_url || \"\";\r\n        });\r\n  \r\n        if (selectedContentSource && matches(selectedContentSource)) {\r\n          selectedContentSource.used = true;\r\n          selectedContentSource.usage_status = \"used\";\r\n          selectedContentSource.used_at = usage.used_at || new Date().toISOString();\r\n          selectedContentSource.used_article_url = usage.article_url || \"\";\r\n        }\r\n  \r\n        renderSourceMaterials(currentContentSources);\r\n        renderSelectedSourceSummary();\r\n      }\r\n  \r\n      function getSourceExtract(source = null) {\r\n        const target = source || selectedContentSource;\r\n        if (target?.source_extract && typeof target.source_extract === \"object\") return target.source_extract;\r\n        if (target?.extract && typeof target.extract === \"object\") return target.extract;\r\n        if (source) return null;\r\n        if (currentSourceExtract && typeof currentSourceExtract === \"object\") return currentSourceExtract;\r\n        return null;\r\n      }\r\n  \r\n      function normalizeSourceParagraphs(extract, fallbackText = \"\") {\r\n        const paragraphs = Array.isArray(extract?.paragraphs) ? extract.paragraphs : [];\r\n        const clean = paragraphs\r\n          .map(item => String(item || \"\").replace(/\\s+/g, \" \").trim())\r\n          .filter(Boolean);\r\n  \r\n        if (clean.length) return clean;\r\n  \r\n        return String(fallbackText || extract?.text || \"\")\r\n          .split(/\\n{2,}|\\r?\\n/)\r\n          .map(item => item.replace(/\\s+/g, \" \").trim())\r\n          .filter(Boolean);\r\n      }\r\n  \r\n      function normalizeSourceContentBlocks(extract, fallbackText = \"\") {\r\n        const blocks = Array.isArray(extract?.content_blocks) ? extract.content_blocks : [];\r\n        const clean = blocks\r\n          .map(item => ({\r\n            type: /^h[1-4]$/.test(String(item?.type || \"\").toLowerCase())\r\n              ? String(item.type).toLowerCase()\r\n              : item?.type === \"li\" ? \"li\" : \"p\",\r\n            text: String(item?.text || item?.content || \"\").replace(/\\s+/g, \" \").trim()\r\n          }))\r\n          .filter(item => item.text);\r\n  \r\n        if (clean.length) return clean;\r\n  \r\n        return normalizeSourceParagraphs(extract, fallbackText).map(text => ({ type: \"p\", text }));\r\n      }\r\n  \r\n      function getSelectedSourcePublishInfo() {\r\n        const extract = getSourceExtract();\r\n        const url = selectedContentSource?.url || extract?.url || \"\";\r\n  \r\n        return {\r\n          source_url: url,\r\n          source_title: selectedContentSource?.original_title || selectedContentSource?.title || extract?.title || \"\",\r\n          source_domain: selectedContentSource?.domain || extract?.domain || \"\"\r\n        };\r\n      }\r\n  \r\n      function truncateText(value, max = 420) {\r\n        const text = String(value || \"\").replace(/\\s+/g, \" \").trim();\r\n        if (text.length <= max) return text;\r\n        return `${text.slice(0, max).trim()}...`;\r\n      }\r\n  \r\n      function buildSourceOutline(source) {\r\n        const extract = getSourceExtract(source);\r\n        const headings = Array.isArray(extract?.headings) ? extract.headings : [];\r\n        if (headings.length) return headings.slice(0, 8).map(item => `- ${String(item || \"\").trim()}`).join(\"\\n\");\r\n  \r\n        const paragraphs = normalizeSourceParagraphs(extract, source?.text_preview || source?.snippet || \"\");\r\n        return paragraphs.slice(0, 5).map((item, index) => `${index + 1}. ${truncateText(item, 160)}`).join(\"\\n\");\r\n      }\r\n  \r\n      function selectSourceMaterial(source, index = 0) {\r\n        selectedContentSource = source || null;\r\n        currentSourceExtract = getSourceExtract(source);\r\n        currentRewriteResult = null;\r\n        linkBaseArticleHtml = \"\";\r\n        linkedArticleHtml = \"\";\r\n        currentLinkAnalysis = null;\r\n        selectedLinkSuggestionIds = new Set();\r\n  \r\n        const title = source?.original_title || source?.title || source?.url || \"\";\r\n        setFieldValue(\"finalTitle\", title);\r\n        setFieldValue(\"seoTitle\", title);\r\n        setFieldValue(\"articleAngle\", source?.reason || source?.snippet || source?.meta_description || \"\");\r\n        setFieldValue(\"articleOutline\", buildSourceOutline(source));\r\n        setFieldValue(\"metaDescription\", source?.meta_description || source?.snippet || \"\");\r\n        setFieldValue(\"textTargetKeywords\", getFieldValue(\"targetKeywords\"));\r\n        setFieldValue(\"textProductName\", getFieldValue(\"productName\"));\r\n        setFieldValue(\"textBrandTone\", getFieldValue(\"brandTone\"));\r\n        setFieldValue(\"textPromotionGoal\", getFieldValue(\"promotionGoal\"));\r\n        setFieldValue(\"textNotes\", getFieldValue(\"notes\"));\r\n  \r\n        renderSourceMaterials(currentContentSources, index);\r\n        renderSelectedSourceSummary();\r\n        renderOriginalSourceViewer();\r\n        renderRewriteCompareList();\r\n        unlockStep(2);\r\n        setStatus(\"titleStatus\", \"\u7D20\u6750\u5DF2\u9009\u5B9A\u3002\u7B2C\u4E8C\u6B65\u53EF\u4EE5\u8FDB\u884C AI \u6700\u5C0F\u5E45\u5EA6\u91CD\u5199\uFF0C\u4E5F\u53EF\u4EE5\u5728\u53F3\u4FA7\u624B\u52A8\u7F16\u8F91\u3002\");\r\n        setStep(2);\r\n      }\r\n  \r\n      function renderSourceMaterials(list, selectedIndex = -1) {\r\n        const wrap = $(\"titleResults\");\r\n        if (!wrap) return;\r\n        wrap.innerHTML = \"\";\r\n  \r\n        if (!Array.isArray(list) || !list.length) {\r\n          wrap.innerHTML = `<div class=\"ct-source-card\"><p>\u6682\u672A\u91C7\u96C6\u5230\u53EF\u8BFB\u7D20\u6750\uFF0C\u8BF7\u6362\u4E00\u4E2A\u4E3B\u9898\u5173\u952E\u8BCD\u6216\u6269\u5927\u9009\u6750\u8303\u56F4\u540E\u91CD\u8BD5\u3002</p></div>`;\r\n          return;\r\n        }\r\n  \r\n        list.forEach((source, idx) => {\r\n          const extract = getSourceExtract(source);\r\n          const title = source?.original_title || source?.title || source?.url || `\u7D20\u6750 ${idx + 1}`;\r\n          const site = source?.source_name || source?.domain || extract?.source_name || extract?.domain || \"\";\r\n          const url = source?.url || extract?.url || \"\";\r\n          const wordCount = source?.word_count_estimate || extract?.word_count_estimate || \"\";\r\n          const preview = truncateText(source?.text_preview || source?.snippet || extract?.text || \"\", 520);\r\n          const isSelected = selectedContentSource && url && (selectedContentSource.url || \"\") === url;\r\n          const isUsed = source?.used || source?.usage_status === \"used\";\r\n  \r\n          const div = document.createElement(\"div\");\r\n          div.className = `ct-source-card${isSelected || idx === selectedIndex ? \" is-selected\" : \"\"}`;\r\n          div.innerHTML = `\r\n            <h3>${escapeHtml(title)}</h3>\r\n            <div class=\"ct-source-meta\">\r\n              ${site ? `\u6765\u6E90\uFF1A${escapeHtml(site)} \u00B7 ` : \"\"}\r\n              ${wordCount ? `\u6B63\u6587\u7EA6 ${escapeHtml(String(wordCount))} \u8BCD \u00B7 ` : \"\"}\r\n              \u70ED\u5EA6\u53C2\u8003\uFF1A${escapeHtml(String(source?.heat_score || \"-\"))}\r\n            </div>\r\n            ${url ? `<div class=\"ct-source-link\"><a href=\"${escapeHtml(url)}\" target=\"_blank\" rel=\"noopener\">${escapeHtml(url)}</a></div>` : \"\"}\r\n            ${source?.reason ? `<p><strong>\u91C7\u96C6\u7406\u7531\uFF1A</strong>${escapeHtml(source.reason)}</p>` : \"\"}\r\n            ${preview ? `<p class=\"ct-source-preview\">${escapeHtml(preview)}</p>` : \"\"}\r\n            ${isUsed ? `<span class=\"ct-source-used-badge\">\u5DF2\u4F7F\u7528\uFF0C\u540E\u7EED\u91C7\u96C6\u4F1A\u6392\u9664</span>` : \"\"}\r\n            <div class=\"ct-actions\">\r\n              <button type=\"button\" class=\"ct-btn\" data-source-index=\"${idx}\"${isUsed ? \" disabled\" : \"\"}>${isUsed ? \"\u5DF2\u4F7F\u7528\" : \"\u9009\u7528\u8FD9\u7BC7\u7D20\u6750\"}</button>\r\n            </div>\r\n          `;\r\n          wrap.appendChild(div);\r\n        });\r\n  \r\n        wrap.querySelectorAll(\"button[data-source-index]\").forEach(btn => {\r\n          btn.addEventListener(\"click\", () => {\r\n            const idx = Number(btn.dataset.sourceIndex);\r\n            selectSourceMaterial(currentContentSources[idx], idx);\r\n          });\r\n        });\r\n      }\r\n  \r\n      function renderOriginalSourceViewer() {\r\n        const wrap = $(\"sourceOriginalViewer\");\r\n        if (!wrap) return;\r\n  \r\n        if (!selectedContentSource) {\r\n          wrap.innerHTML = `<p>\u8BF7\u5148\u5728\u7B2C\u4E00\u6B65\u9009\u62E9\u4E00\u7BC7\u7D20\u6750\u3002</p>`;\r\n          return;\r\n        }\r\n  \r\n        const extract = getSourceExtract();\r\n        const title = selectedContentSource.original_title || selectedContentSource.title || extract?.title || \"\u539F\u6587\u7D20\u6750\";\r\n        const url = selectedContentSource.url || extract?.url || \"\";\r\n        const site = selectedContentSource.source_name || selectedContentSource.domain || extract?.source_name || extract?.domain || \"\";\r\n        const wordCount = selectedContentSource.word_count_estimate || extract?.word_count_estimate || \"\";\r\n        const contentBlocks = normalizeSourceContentBlocks(\r\n          extract,\r\n          selectedContentSource.text_preview || selectedContentSource.snippet || \"\"\r\n        );\r\n        const contentHtml = contentBlocks.map(item => {\r\n          const text = escapeHtml(item.text);\r\n          if (/^h[2-4]$/.test(item.type)) {\r\n            return `<h4 class=\"ct-source-content-heading\">${text}</h4>`;\r\n          }\r\n          if (item.type === \"li\") {\r\n            return `<p class=\"ct-source-content-list-item\">\u2022 ${text}</p>`;\r\n          }\r\n          return `<p>${text}</p>`;\r\n        }).join(\"\");\r\n  \r\n        wrap.innerHTML = `\r\n          <h3>${escapeHtml(title)}</h3>\r\n          <div class=\"ct-original-meta\">\r\n            ${site ? `\u6765\u6E90\uFF1A${escapeHtml(site)}<br>` : \"\"}\r\n            ${wordCount ? `\u6B63\u6587\u7EA6 ${escapeHtml(String(wordCount))} \u8BCD<br>` : \"\"}\r\n            ${url ? `<a href=\"${escapeHtml(url)}\" target=\"_blank\" rel=\"noopener\">${escapeHtml(url)}</a>` : \"\"}\r\n          </div>\r\n          <div class=\"ct-original-section-title\">\u539F\u6587\u6B63\u6587\u63D0\u53D6</div>\r\n          <div class=\"ct-original-paragraphs\">\r\n            ${contentHtml\r\n              ? contentHtml\r\n              : \"<p>\u8FD9\u7BC7\u7D20\u6750\u6CA1\u6709\u8FD4\u56DE\u53EF\u8BFB\u6B63\u6587\uFF0C\u8BF7\u56DE\u5230\u7B2C\u4E00\u6B65\u6362\u4E00\u7BC7\u7D20\u6750\u3002</p>\"}\r\n          </div>\r\n        `;\r\n      }\r\n  \r\n      function renderRewriteCompareList() {\r\n        const wrap = $(\"rewriteCompareList\");\r\n        if (!wrap) return;\r\n  \r\n        const rows = Array.isArray(currentRewriteResult?.paragraph_map)\r\n          ? currentRewriteResult.paragraph_map\r\n          : [];\r\n  \r\n        if (!rows.length) {\r\n          wrap.innerHTML = \"\";\r\n          return;\r\n        }\r\n  \r\n        wrap.innerHTML = `\r\n          <div class=\"ct-link-summary\">\u6BB5\u843D\u5BA1\u6838\uFF1A\u5DE6\u4FA7\u4E3A\u539F\u6587\u6458\u5F55\uFF0C\u53F3\u4FA7\u4E3A AI \u91CD\u5199\u6458\u5F55\u3002\u5185\u94FE\u673A\u4F1A\u4F1A\u5728\u7B2C\u4E09\u6B65\u7EDF\u4E00\u5904\u7406\u3002</div>\r\n          ${rows.slice(0, 20).map((row, index) => `\r\n            <div class=\"ct-compare-item\">\r\n              <h4>\u6BB5\u843D ${escapeHtml(String(row.source_paragraph_index || index + 1))}</h4>\r\n              <div class=\"ct-compare-columns\">\r\n                <div class=\"ct-compare-column\">\r\n                  <span class=\"ct-compare-label\">\u539F\u6587</span>\r\n                  ${escapeHtml(row.source_excerpt || \"\")}\r\n                </div>\r\n                <div class=\"ct-compare-column\">\r\n                  <span class=\"ct-compare-label\">\u91CD\u5199</span>\r\n                  ${escapeHtml(row.rewritten_excerpt || \"\")}\r\n                </div>\r\n              </div>\r\n              ${row.link_opportunity ? `<div class=\"ct-link-opportunity\"><strong>\u5185\u94FE\u673A\u4F1A\uFF1A</strong>${escapeHtml(row.link_opportunity)}</div>` : \"\"}\r\n            </div>\r\n          `).join(\"\")}\r\n        `;\r\n      }\r\n  \r\n      function titleInputPayload() {\r\n        const articleStyleEl = $(\"articleStyleVariant\");\r\n        const articleStyleVariant = articleStyleEl ? articleStyleEl.value.trim() : \"random\";\r\n  \r\n        return {\r\n          parameters: {\r\n            content_type: $(\"contentType\").value,\r\n            image_count: Number($(\"titleImageCount\").value || 3),\r\n            pet_type: $(\"petType\").value.trim(),\r\n            target_keywords: $(\"targetKeywords\").value.trim(),\r\n            product_name: $(\"productName\").value.trim(),\r\n            product_url: selectedProduct.url || \"\",\r\n            brand_tone: $(\"brandTone\").value.trim(),\r\n            promotion_goal: $(\"promotionGoal\").value.trim(),\r\n            article_style_variant: articleStyleVariant,\r\n            notes: $(\"notes\").value.trim()\r\n          }\r\n        };\r\n      }\r\n  \r\n      function stringifyTitleField(value) {\r\n        if (value == null) return \"\";\r\n        if (Array.isArray(value)) {\r\n          return value\r\n            .map(item => stringifyTitleField(item))\r\n            .filter(Boolean)\r\n            .join(\"\\n\");\r\n        }\r\n        if (typeof value === \"object\") {\r\n          const parts = Object.entries(value)\r\n            .map(([key, item]) => {\r\n              const text = stringifyTitleField(item);\r\n              return text ? `${key}: ${text}` : \"\";\r\n            })\r\n            .filter(Boolean);\r\n          return parts.join(\"\\n\");\r\n        }\r\n        return String(value);\r\n      }\r\n  \r\n      function firstTitleValue(...values) {\r\n        for (const value of values) {\r\n          const text = stringifyTitleField(value).trim();\r\n          if (text) return text;\r\n        }\r\n        return \"\";\r\n      }\r\n  \r\n      function normalizeTitleOption(item, fallbackTitle = \"\") {\r\n        const source = item && typeof item === \"object\" ? item : { title: item };\r\n        const seo = source.seo && typeof source.seo === \"object\" ? source.seo : {};\r\n        const meta = source.meta && typeof source.meta === \"object\" ? source.meta : {};\r\n        const content = source.content && typeof source.content === \"object\" ? source.content : {};\r\n  \r\n        const title = firstTitleValue(\r\n          source.title,\r\n          source.final_title,\r\n          source.blog_title,\r\n          source.headline,\r\n          fallbackTitle\r\n        );\r\n  \r\n        return {\r\n          title,\r\n          article_angle: firstTitleValue(\r\n            source.article_angle,\r\n            source.articleAngle,\r\n            source.angle,\r\n            source.content_angle,\r\n            content.angle,\r\n            content.article_angle\r\n          ),\r\n          article_outline: firstTitleValue(\r\n            source.article_outline,\r\n            source.articleOutline,\r\n            source.outline,\r\n            source.content_outline,\r\n            content.outline,\r\n            content.article_outline\r\n          ),\r\n          seo_title: firstTitleValue(\r\n            source.seo_title,\r\n            source.seoTitle,\r\n            seo.title,\r\n            seo.seo_title,\r\n            title\r\n          ),\r\n          meta_description: firstTitleValue(\r\n            source.meta_description,\r\n            source.metaDescription,\r\n            source.seo_description,\r\n            source.description,\r\n            seo.meta_description,\r\n            seo.metaDescription,\r\n            seo.description,\r\n            meta.description,\r\n            meta.meta_description\r\n          )\r\n        };\r\n      }\r\n  \r\n      function findTitleOptionArray(raw) {\r\n        if (!raw || typeof raw !== \"object\") return [];\r\n        const candidates = [\r\n          raw.title_options,\r\n          raw.titleOptions,\r\n          raw.titles,\r\n          raw.options,\r\n          raw.results,\r\n          raw.data?.title_options,\r\n          raw.data?.titles,\r\n          raw.output?.title_options,\r\n          raw.output?.titles,\r\n          raw.result?.title_options,\r\n          raw.result?.titles\r\n        ];\r\n  \r\n        for (const candidate of candidates) {\r\n          const parsed = safeParseNestedJson(candidate);\r\n          if (Array.isArray(parsed)) return parsed;\r\n        }\r\n  \r\n        return [];\r\n      }\r\n  \r\n      function extractTitleOptions(data) {\r\n        const raw = extractWorkflowOutput(data);\r\n        const parsedRaw = safeParseNestedJson(raw.data || raw.output || raw);\r\n        const rawObject = parsedRaw && typeof parsedRaw === \"object\" ? parsedRaw : raw;\r\n        const list = findTitleOptionArray(rawObject);\r\n  \r\n        if (list.length) {\r\n          return list.map(item => normalizeTitleOption(item)).filter(item => item.title);\r\n        }\r\n  \r\n        if (rawObject && typeof rawObject === \"object\") {\r\n          const keys = Object.keys(rawObject);\r\n          const titleKeys = keys.filter(k => /^title_option_/i.test(k) || /^title_\\d+$/i.test(k));\r\n          if (titleKeys.length) {\r\n            return titleKeys.sort().map(k => {\r\n              const suffixMatch = k.match(/(\\d+)$/);\r\n              const suffix = suffixMatch ? suffixMatch[1] : \"\";\r\n              const value = rawObject[k];\r\n              const perTitleObject = value && typeof value === \"object\" ? value : {\r\n                title: value,\r\n                article_angle: firstTitleValue(\r\n                  rawObject[`${k}_article_angle`],\r\n                  rawObject[`${k}_angle`],\r\n                  rawObject[`article_angle_${suffix}`],\r\n                  rawObject[`angle_${suffix}`],\r\n                  rawObject.article_angle\r\n                ),\r\n                article_outline: firstTitleValue(\r\n                  rawObject[`${k}_article_outline`],\r\n                  rawObject[`${k}_outline`],\r\n                  rawObject[`article_outline_${suffix}`],\r\n                  rawObject[`outline_${suffix}`],\r\n                  rawObject.article_outline\r\n                ),\r\n                seo_title: firstTitleValue(\r\n                  rawObject[`${k}_seo_title`],\r\n                  rawObject[`seo_title_${suffix}`],\r\n                  rawObject.seo_title,\r\n                  value\r\n                ),\r\n                meta_description: firstTitleValue(\r\n                  rawObject[`${k}_meta_description`],\r\n                  rawObject[`${k}_meta`],\r\n                  rawObject[`meta_description_${suffix}`],\r\n                  rawObject[`meta_${suffix}`],\r\n                  rawObject.meta_description\r\n                )\r\n              };\r\n              const option = normalizeTitleOption(perTitleObject, value);\r\n              if (!option.title) option.title = firstTitleValue(value);\r\n              return option;\r\n            }).filter(item => item.title);\r\n          }\r\n        }\r\n  \r\n        return [];\r\n      }\r\n  \r\n      function renderTitleOptions(list) {\r\n        const wrap = $(\"titleResults\");\r\n        wrap.innerHTML = \"\";\r\n  \r\n        if (!list.length) {\r\n          wrap.innerHTML = `<div class=\"ct-title-option\"><p>\u672A\u89E3\u6790\u51FA\u6807\u9898\u5019\u9009\uFF0C\u8BF7\u68C0\u67E5\u539F\u59CB\u8FD4\u56DE\u3002</p></div>`;\r\n          return;\r\n        }\r\n  \r\n        list.forEach((item, idx) => {\r\n          const source = resolveContentSourceFromTitleOption(item, idx);\r\n          const sourceLabel = source\r\n            ? [source.source_name || source.domain || \"\", source.title || source.url || \"\"].filter(Boolean).join(\" - \")\r\n            : \"\";\r\n          const div = document.createElement(\"div\");\r\n          div.className = \"ct-title-option\";\r\n          div.innerHTML = `\r\n            <h3>${escapeHtml(item.title || \"\")}</h3>\r\n            ${sourceLabel ? `<p><strong>\u53C2\u8003\u6765\u6E90\uFF1A</strong>${escapeHtml(sourceLabel)}</p>` : \"\"}\r\n            <p><strong>\u6587\u7AE0\u89D2\u5EA6\uFF1A</strong>${escapeHtml(item.article_angle || \"\")}</p>\r\n            <p><strong>\u6587\u7AE0\u5927\u7EB2\uFF1A</strong>${escapeHtml(item.article_outline || \"\")}</p>\r\n            <div class=\"ct-actions\">\r\n              <button type=\"button\" class=\"ct-btn\" data-index=\"${idx}\">\u9009\u7528\u8FD9\u4E2A\u6807\u9898</button>\r\n            </div>\r\n          `;\r\n          wrap.appendChild(div);\r\n        });\r\n  \r\n        wrap.querySelectorAll(\"button[data-index]\").forEach(btn => {\r\n          btn.addEventListener(\"click\", () => {\r\n            const item = list[Number(btn.dataset.index)];\r\n            selectedContentSource = resolveContentSourceFromTitleOption(item, Number(btn.dataset.index));\r\n            currentSourceExtract = getSourceExtract(selectedContentSource);\r\n            currentRewriteResult = null;\r\n            $(\"finalTitle\").value = item.title || \"\";\r\n            $(\"seoTitle\").value = item.seo_title || item.title || \"\";\r\n            $(\"articleAngle\").value = item.article_angle || \"\";\r\n            $(\"articleOutline\").value = item.article_outline || \"\";\r\n            $(\"metaDescription\").value = item.meta_description || \"\";\r\n  \r\n            $(\"textTargetKeywords\").value = $(\"targetKeywords\").value.trim();\r\n            $(\"textProductName\").value = $(\"productName\").value.trim();\r\n            $(\"textBrandTone\").value = $(\"brandTone\").value.trim();\r\n            $(\"textPromotionGoal\").value = $(\"promotionGoal\").value.trim();\r\n            $(\"textNotes\").value = $(\"notes\").value.trim();\r\n            renderSelectedSourceSummary();\r\n            renderOriginalSourceViewer();\r\n            renderRewriteCompareList();\r\n  \r\n            unlockStep(2);\r\n            setStatus(\"titleStatus\", \"\u6807\u9898\u548C\u53C2\u8003\u6765\u6E90\u5DF2\u9009\u5B9A\uFF0C\u6B63\u5728\u8FDB\u5165\u6B63\u6587\u91CD\u5199\u6B65\u9AA4\u3002\");\r\n            setStep(2);\r\n          });\r\n        });\r\n      }\r\n  \r\n      async function handleGenerateTitle() {\r\n        const compatibilityCheck = validateProductCompatibilityBeforeTitle();\r\n        if (!compatibilityCheck.ok) {\r\n          setStatus(\"titleStatus\", compatibilityCheck.message);\r\n          return;\r\n        }\r\n  \r\n        if (builderMode !== \"auto\") {\r\n          setFieldValue(\"sourceUrls\", \"\");\r\n        }\r\n  \r\n        const manualSourceOnly = builderMode !== \"auto\";\r\n        setStatus(\"titleStatus\", manualSourceOnly ? \"\u6B63\u5728\u81EA\u52A8\u8054\u7F51\u91C7\u96C6\u539F\u6587\u7D20\u6750\uFF0C\u8BF7\u7A0D\u5019\u2026\u2026\" : \"\u6B63\u5728\u53D1\u73B0\u53C2\u8003\u6587\u7AE0\u5E76\u6539\u5199\u6807\u9898\uFF0C\u8BF7\u7A0D\u5019\u2026\u2026\");\r\n        $(\"titleResults\").innerHTML = \"\";\r\n        $(\"titleRaw\").value = \"\";\r\n  \r\n        try {\r\n          const discovery = await apiPost(\"/content/discover\", buildContentDiscoveryPayload());\r\n          currentContentSources = normalizeContentSources(discovery);\r\n          selectedContentSource = null;\r\n          currentSourceExtract = null;\r\n          currentRewriteResult = null;\r\n  \r\n          if (manualSourceOnly) {\r\n            $(\"titleRaw\").value = JSON.stringify(discovery, null, 2);\r\n            renderSourceMaterials(currentContentSources);\r\n            renderSelectedSourceSummary();\r\n            renderOriginalSourceViewer();\r\n            renderRewriteCompareList();\r\n            const warnings = [...(discovery?.warnings || [])].filter(Boolean);\r\n            setStatus(\"titleStatus\", `\u7D20\u6750\u91C7\u96C6\u5B8C\u6210\uFF1A\u627E\u5230 ${currentContentSources.length} \u7BC7\u53EF\u8BFB\u539F\u6587\u3002${warnings.length ? \"\u63D0\u793A\uFF1A\" + warnings.join(\"\uFF1B\") : \"\u8BF7\u9009\u62E9\u4E00\u7BC7\u8FDB\u5165\u91CD\u5199\u5BA1\u6838\u3002\"}`);\r\n            return;\r\n          }\r\n  \r\n          if (!currentContentSources.length) {\r\n            throw new Error(\"\u6CA1\u6709\u53EF\u7528\u7684\u672A\u4F7F\u7528\u6765\u6E90\u6587\u7AE0\u3002\u5DF2\u4F7F\u7528\u7684\u539F\u6587 URL \u4F1A\u88AB\u81EA\u52A8\u6392\u9664\uFF0C\u8BF7\u66F4\u6362\u4E3B\u9898\u6216\u6269\u5927\u9009\u6750\u8303\u56F4\u3002\");\r\n          }\r\n  \r\n          const data = await apiPost(\"/content/title-rewrite\", buildContentTitleRewritePayload(currentContentSources));\r\n          $(\"titleRaw\").value = JSON.stringify({ discovery, title_rewrite: data }, null, 2);\r\n          const titleList = extractTitleOptions(data);\r\n          renderTitleOptions(titleList);\r\n          const warnings = [...(discovery?.warnings || []), ...(data?.warnings || [])].filter(Boolean);\r\n          setStatus(\"titleStatus\", `\u9009\u9898\u53D1\u73B0\u5B8C\u6210\uFF1A\u627E\u5230 ${currentContentSources.length} \u4E2A\u53C2\u8003\u6765\u6E90\uFF0C\u6807\u9898\u5019\u9009 ${titleList.length} \u4E2A\u3002${warnings.length ? \"\u63D0\u793A\uFF1A\" + warnings.join(\"\uFF1B\") : \"\u8BF7\u9009\u62E9\u4E00\u4E2A\u6807\u9898\u3002\"}`);\r\n        } catch (err) {\r\n          setStatus(\"titleStatus\", `\u9009\u9898\u53D1\u73B0\u6216\u6807\u9898\u6539\u5199\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      function extractArticleHtml(raw) {\r\n        if (!raw || typeof raw !== \"object\") return \"\";\r\n  \r\n        if (typeof raw.article_html === \"string\" && raw.article_html.trim()) return raw.article_html;\r\n        if (typeof raw.html === \"string\" && raw.html.trim()) return raw.html;\r\n        if (typeof raw.content_html === \"string\" && raw.content_html.trim()) return raw.content_html;\r\n  \r\n        const nestedCandidates = [\r\n          raw.data,\r\n          raw.output,\r\n          raw.result,\r\n          raw.result?.output,\r\n          raw.result?.data,\r\n          raw.output?.data,\r\n          raw.output?.output,\r\n          raw.data?.output,\r\n          raw.data?.data\r\n        ];\r\n  \r\n        for (const item of nestedCandidates) {\r\n          if (typeof item === \"string\") {\r\n            const parsed = safeParseNestedJson(item);\r\n            const html = extractArticleHtml(parsed);\r\n            if (html) return html;\r\n          } else if (item && typeof item === \"object\") {\r\n            const html = extractArticleHtml(item);\r\n            if (html) return html;\r\n          }\r\n        }\r\n  \r\n        return \"\";\r\n      }\r\n  \r\n      async function handleGenerateText() {\r\n        try {\r\n          if (!selectedContentSource || !selectedContentSource.url) {\r\n            throw new Error(\"\u8BF7\u5148\u5728\u7B2C\u4E00\u6B65\u9009\u62E9\u4E00\u7BC7\u539F\u6587\u7D20\u6750\u3002\");\r\n          }\r\n  \r\n          const stopStatus = startElapsedStatus(\r\n            \"textStatus\",\r\n            elapsed => `\u6B63\u5728\u8BFB\u53D6\u539F\u6587\u7D20\u6750\u5E76\u8FDB\u884C AI \u6700\u5C0F\u5E45\u5EA6\u91CD\u5199\uFF0C\u5DF2\u7B49\u5F85 ${elapsed} \u79D2\u3002\u957F\u6587\u7AE0\u901A\u5E38\u9700\u8981 60-90 \u79D2\uFF0C\u8BF7\u4E0D\u8981\u5173\u95ED\u9875\u9762\u3002`\r\n          );\r\n          let data;\r\n          try {\r\n            data = await apiPost(\"/content/rewrite\", buildContentRewritePayload());\r\n          } finally {\r\n            stopStatus();\r\n          }\r\n  \r\n          const raw = extractWorkflowOutput(data);\r\n          const articleHtml = extractArticleHtml(raw);\r\n          currentRewriteResult = raw;\r\n          currentSourceExtract = data?.source_extract || currentSourceExtract;\r\n  \r\n          if (articleHtml) {\r\n            $(\"textRaw\").value = articleHtml;\r\n            $(\"articleEditor\").innerHTML = articleHtml;\r\n          } else {\r\n            $(\"textRaw\").value = JSON.stringify(data, null, 2);\r\n            $(\"articleEditor\").innerHTML = \"<p>\u672A\u8BC6\u522B\u5230 article_html\uFF0C\u8BF7\u67E5\u770B HTML \u6A21\u5F0F\u3002</p>\";\r\n          }\r\n  \r\n          if (raw && typeof raw === \"object\") {\r\n            if (raw.rewritten_title) {\r\n              $(\"finalTitle\").value = raw.rewritten_title;\r\n              if (!$(\"seoTitle\").value.trim()) $(\"seoTitle\").value = raw.rewritten_title;\r\n            }\r\n            if (raw.excerpt) {\r\n              $(\"excerpt\").value = raw.excerpt;\r\n            }\r\n            if (raw.section_summaries) {\r\n              $(\"sectionSummaries\").value = Array.isArray(raw.section_summaries)\r\n                ? raw.section_summaries.join(\"\\n\")\r\n                : String(raw.section_summaries);\r\n            }\r\n          }\r\n  \r\n          if (raw?.seo_title && !$(\"seoTitle\").value.trim()) $(\"seoTitle\").value = raw.seo_title;\r\n          if (raw?.meta_description && !$(\"metaDescription\").value.trim()) $(\"metaDescription\").value = raw.meta_description;\r\n          renderSelectedSourceSummary();\r\n          renderOriginalSourceViewer();\r\n          renderRewriteCompareList();\r\n          setStatus(\"textStatus\", \"AI \u6700\u5C0F\u91CD\u5199\u5B8C\u6210\u3002\u8BF7\u5DE6\u53F3\u5BF9\u7167\u68C0\u67E5\uFF0C\u5FC5\u8981\u65F6\u76F4\u63A5\u7F16\u8F91\u53F3\u4FA7\u6B63\u6587\uFF0C\u7136\u540E\u4FDD\u5B58\u4FEE\u6539\u6216\u8FDB\u5165\u5185\u94FE\u5BA1\u6838\u3002\");\r\n        } catch (err) {\r\n          setStatus(\"textStatus\", `\u6B63\u6587\u91CD\u5199\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      function saveRewriteDraftState(silent = false) {\r\n        syncCurrentEditorModeToRaw();\r\n        syncPetAnchorFromBreedInputs();\r\n        const html = $(\"textRaw\").value.trim();\r\n        if (!html) {\r\n          if (!silent) setStatus(\"textStatus\", \"\u53F3\u4FA7\u6B63\u6587\u4E3A\u7A7A\uFF0C\u6682\u65F6\u6CA1\u6709\u53EF\u4FDD\u5B58\u5185\u5BB9\u3002\");\r\n          return false;\r\n        }\r\n  \r\n        $(\"articleEditor\").innerHTML = html;\r\n        linkBaseArticleHtml = html;\r\n        linkedArticleHtml = \"\";\r\n        currentLinkAnalysis = null;\r\n        selectedLinkSuggestionIds = new Set();\r\n        $(\"linkSuggestions\").innerHTML = \"\";\r\n        $(\"linkPreview\").innerHTML = html;\r\n        $(\"linkRaw\").value = \"\";\r\n        renderLinkArticleSummary();\r\n  \r\n        if (!silent) {\r\n          setStatus(\"textStatus\", \"\u4FEE\u6539\u5DF2\u4FDD\u5B58\u5230\u5F53\u524D\u6D41\u7A0B\u3002\u7B2C\u4E09\u6B65\u4F1A\u4F7F\u7528\u8FD9\u7248\u6B63\u6587\u8FDB\u884C\u5185\u94FE\u5206\u6790\u3002\");\r\n        }\r\n        return true;\r\n      }\r\n  \r\n      function handleSaveRewriteDraft() {\r\n        saveRewriteDraftState(false);\r\n      }\r\n  \r\n      function handleConfirmText() {\r\n        if (!saveRewriteDraftState(true)) return;\r\n  \r\n        unlockStep(3);\r\n        setStatus(\"textStatus\", \"\u6B63\u6587\u5DF2\u786E\u8BA4\uFF0C\u6B63\u5728\u8FDB\u5165\u5185\u94FE\u6B65\u9AA4\u3002\");\r\n        setStep(3);\r\n      }\r\n  \r\n      function handleGoPublish() {\r\n        syncPublishStep(true);\r\n        unlockStep(5);\r\n        setPublishNotice(\r\n          \"info\",\r\n          \"\u53D1\u5E03\u51C6\u5907\u5C31\u7EEA\",\r\n          \"\u8BF7\u68C0\u67E5\u535A\u5BA2\u680F\u76EE\u3001SEO\u3001\u6807\u7B7E\u548C\u5C01\u9762\u56FE\u3002\u786E\u8BA4\u5B8C\u6574\u540E\u4FDD\u5B58\u8349\u7A3F\u6216\u53D1\u5E03\u3002\"\r\n        );\r\n        setStep(5);\r\n      }\r\n  \r\n      function updateProductUI() {\r\n        syncReferenceOptionState();\r\n      }\r\n  \r\n      function updateAvailableModels() {\r\n        const ratio = $(\"imageRatio\").value;\r\n        const includeProduct = getProductReferenceUrls().length > 0;\r\n  \r\n        let allowed = Object.keys(IMAGE_MODEL_CONFIGS);\r\n        let hint = \"\";\r\n  \r\n        allowed = allowed.filter(model => {\r\n          const cfg = IMAGE_MODEL_CONFIGS[model];\r\n          if (!cfg.supportsRatios || !ratio) return true;\r\n          return cfg.supportsRatios.includes(ratio) || cfg.supportsRatios.includes(\"auto\");\r\n        });\r\n  \r\n        if (includeProduct) {\r\n          allowed = allowed.filter(model => IMAGE_MODEL_CONFIGS[model].supportsReference);\r\n          hint = \"\u51FA\u73B0\u771F\u5B9E\u4EA7\u54C1\u65F6\uFF0C\u4F18\u5148\u4F7F\u7528\u652F\u6301\u53C2\u8003\u56FE\u7684\u6A21\u578B\uFF1B\u9ED8\u8BA4\u4F7F\u7528 ChatGPT Images 2.0 Edit\u3002\";\r\n        } else {\r\n          allowed = allowed.filter(model => IMAGE_MODEL_CONFIGS[model].supportsTextToImage !== false);\r\n          hint = \"\u4E0D\u51FA\u73B0\u4EA7\u54C1\u65F6\uFF0C\u9690\u85CF\u5FC5\u987B\u4F9D\u8D56\u53C2\u8003\u56FE\u7684 Edit \u6A21\u578B\uFF1B\u9ED8\u8BA4\u4F7F\u7528 ChatGPT Images 2.0\u3002\";\r\n        }\r\n  \r\n        const select = $(\"imageModel\");\r\n        const current = select.value;\r\n        select.innerHTML = \"\";\r\n  \r\n        allowed.forEach(model => {\r\n          const opt = document.createElement(\"option\");\r\n          opt.value = model;\r\n          opt.textContent = IMAGE_MODEL_CONFIGS[model].label;\r\n          select.appendChild(opt);\r\n        });\r\n  \r\n        if (allowed.includes(current)) {\r\n          select.value = current;\r\n        } else if (allowed.length) {\r\n          select.value = allowed[0];\r\n        }\r\n  \r\n        $(\"modelRestrictionHint\").textContent = hint;\r\n      }\r\n  \r\n      function selectedModelRequiresReference(model) {\r\n        const cfg = IMAGE_MODEL_CONFIGS[model];\r\n        return !!cfg && cfg.supportsReference && cfg.supportsTextToImage === false;\r\n      }\r\n  \r\n      function resolveImageModelForTask(model, task) {\r\n        if (task?.product_visibility !== \"supporting\" && selectedModelRequiresReference(model)) {\r\n          return \"openai/gpt-image-2\";\r\n        }\r\n        return model;\r\n      }\r\n  \r\n      function mapImageSizeForModel(model, ratio) {\r\n        // ChatGPT Images 2.0 / Edit\uFF1ANEX \u6587\u6863\u8981\u6C42 image_size \u4F7F\u7528\u5B57\u7B26\u4E32\u6BD4\u4F8B\r\n        if (model === \"openai/gpt-image-2\" || model === \"openai/gpt-image-2/edit\") {\r\n          const allowed = [\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\"];\r\n          return allowed.includes(ratio) ? ratio : \"16:9\";\r\n        }\r\n  \r\n        // Flux 2 Flash\uFF1ANEX \u6587\u6863\u8981\u6C42 image_size \u4F7F\u7528\u9884\u8BBE\u679A\u4E3E\r\n        if (model === \"fal-ai/flux-2/flash\") {\r\n          if (ratio === \"1:1\") return \"square_hd\";\r\n          if (ratio === \"4:3\") return \"landscape_4_3\";\r\n          if (ratio === \"16:9\") return \"landscape_16_9\";\r\n          if (ratio === \"4:5\") return \"portrait_4_5\";\r\n          return \"landscape_16_9\";\r\n        }\r\n  \r\n        return null;\r\n      }\r\n  \r\n      function mapAspectRatioForModel(model, ratio) {\r\n        if (model === \"fal-ai/nano-banana-pro\") {\r\n          return ratio || \"1:1\";\r\n        }\r\n  \r\n        if (model === \"fal-ai/nano-banana-2\") {\r\n          return ratio || \"auto\";\r\n        }\r\n  \r\n        return ratio || \"1:1\";\r\n      }\r\n  \r\n      async function searchShopifyProducts(keyword) {\r\n        const url = `/search/suggest.json?q=${encodeURIComponent(keyword)}&resources[type]=product&resources[limit]=8&resources[options][unavailable_products]=hide`;\r\n        const resp = await fetch(url, {\r\n          headers: { \"Accept\": \"application/json\" }\r\n        });\r\n        const data = await resp.json();\r\n        return data?.resources?.results?.products || [];\r\n      }\r\n  \r\n      async function fetchProductJsonByHandle(handle) {\r\n        if (!handle) return null;\r\n  \r\n        const cleanHandle = String(handle).trim().replace(/^\\/+|\\/+$/g, \"\");\r\n        const resp = await fetch(`/products/${cleanHandle}.js`, {\r\n          headers: { \"Accept\": \"application/json\" }\r\n        });\r\n  \r\n        if (!resp.ok) return null;\r\n  \r\n        return await resp.json();\r\n      }\r\n  \r\n      function openProductPicker() {\r\n        $(\"productPickerModal\").classList.add(\"is-open\");\r\n        $(\"productPickerModal\").setAttribute(\"aria-hidden\", \"false\");\r\n        $(\"productSearchResults\").innerHTML = \"\";\r\n        $(\"productSearchStatus\").textContent = \"\";\r\n        $(\"productSearchInput\").value = $(\"productName\").value.trim() || $(\"textProductName\").value.trim() || \"\";\r\n      }\r\n  \r\n      function closeProductPicker() {\r\n        $(\"productPickerModal\").classList.remove(\"is-open\");\r\n        $(\"productPickerModal\").setAttribute(\"aria-hidden\", \"true\");\r\n      }\r\n  \r\n      function getProductImageUrl(product) {\r\n        const featured = product?.featured_image;\r\n        if (typeof featured === \"string\") return featured;\r\n        if (featured?.url) return featured.url;\r\n        if (product?.image?.src) return product.image.src;\r\n        if (product?.image) return product.image;\r\n        if (Array.isArray(product?.images) && product.images.length) {\r\n          const first = product.images[0];\r\n          return typeof first === \"string\" ? first : (first?.src || first?.url || \"\");\r\n        }\r\n        return \"\";\r\n      }\r\n  \r\n      function renderProductSearchResults(products, emptyMessage) {\r\n        $(\"productSearchResults\").innerHTML = \"\";\r\n        if (!products || !products.length) {\r\n          setStatus(\"productSearchStatus\", emptyMessage || \"\u6CA1\u6709\u627E\u5230\u5339\u914D\u4EA7\u54C1\u3002\");\r\n          return;\r\n        }\r\n        setStatus(\"productSearchStatus\", \"\u627E\u5230 \" + products.length + \" \u4E2A\u4EA7\u54C1\uFF0C\u8BF7\u9009\u62E9\u3002\");\r\n        products.forEach((product) => {\r\n          const imageUrl = getProductImageUrl(product);\r\n          const productHandle = product?.handle || \"\";\r\n          const productUrl = product?.url || (productHandle ? \"/products/\" + productHandle : \"\");\r\n          const div = document.createElement(\"div\");\r\n          div.className = \"ct-product-item\";\r\n          div.innerHTML = \"<img src=\\\"\" + escapeHtml(imageUrl) + \"\\\" alt=\\\"\\\">\" +\r\n            \"<div><h4>\" + escapeHtml(product?.title || \"\") + \"</h4><p>\" +\r\n            escapeHtml(productUrl || imageUrl || \"\u6682\u65E0\u56FE\u7247\") +\r\n            \"</p></div><button type=\\\"button\\\" class=\\\"ct-btn ct-btn-secondary\\\">\u9009\u62E9</button>\";\r\n          const selectBtn = div.querySelector(\"button\");\r\n          selectBtn.addEventListener(\"click\", async () => {\r\n            try {\r\n              setStatus(\"productSearchStatus\", \"\u6B63\u5728\u8BFB\u53D6\u4EA7\u54C1\u8BE6\u60C5\u2026\u2026\");\r\n              const full = productHandle ? await fetchProductJsonByHandle(productHandle) : product;\r\n              const mergedImages = normalizeImageUrlList(full?.images || [full?.featured_image, imageUrl], 4);\r\n              const selectedImage = getProductImageUrl(full) || mergedImages[0] || imageUrl || \"\";\r\n              const mergedProduct = {\r\n                title: full?.title || product?.title || \"\",\r\n                handle: full?.handle || productHandle || \"\",\r\n                url: productUrl || (full?.handle ? \"/products/\" + full.handle : \"\"),\r\n                featured_image: selectedImage,\r\n                image: selectedImage,\r\n                images: mergedImages.length ? mergedImages : normalizeImageUrlList([imageUrl], 4),\r\n                tags: Array.isArray(full?.tags) ? full.tags : (typeof full?.tags === \"string\" ? full.tags.split(\",\").map(t => t.trim()).filter(Boolean) : [])\r\n              };\r\n              applySelectedProduct(mergedProduct);\r\n              setStatus(\"productSearchStatus\", \"\");\r\n              closeProductPicker();\r\n            } catch (err) {\r\n              console.error(\"select product error =\", err);\r\n              setStatus(\"productSearchStatus\", \"\u9009\u62E9\u4EA7\u54C1\u5931\u8D25\uFF1A\" + err.message);\r\n            }\r\n          });\r\n          $(\"productSearchResults\").appendChild(div);\r\n        });\r\n      }\r\n  \r\n      async function handleSearchProducts() {\r\n        const keyword = $(\"productSearchInput\").value.trim();\r\n        if (!keyword) {\r\n          setStatus(\"productSearchStatus\", \"\u8BF7\u8F93\u5165\u4EA7\u54C1\u5173\u952E\u8BCD\u3002\");\r\n          return;\r\n        }\r\n        setStatus(\"productSearchStatus\", \"\u6B63\u5728\u641C\u7D22\u4EA7\u54C1\u2026\u2026\");\r\n        $(\"productSearchResults\").innerHTML = \"\";\r\n        try {\r\n          const products = await searchShopifyProducts(keyword);\r\n          renderProductSearchResults(products, \"\u6CA1\u6709\u627E\u5230\u5339\u914D\u4EA7\u54C1\u3002\");\r\n        } catch (err) {\r\n          console.error(\"handleSearchProducts error =\", err);\r\n          setStatus(\"productSearchStatus\", \"\u641C\u7D22\u5931\u8D25\uFF1A\" + err.message);\r\n        }\r\n      }\r\n  \r\n      async function loadProductsByCollectionHandle(collectionHandle, label) {\r\n        const handle = String(collectionHandle || \"\").trim().replace(/^\\/+|\\/+$/g, \"\");\r\n        if (!handle) return;\r\n        $(\"productSearchInput\").value = \"\";\r\n        setStatus(\"productSearchStatus\", \"\u6B63\u5728\u52A0\u8F7D \" + label + \" \u7CFB\u5217\u4EA7\u54C1\u2026\u2026\");\r\n        $(\"productSearchResults\").innerHTML = \"\";\r\n        try {\r\n          const resp = await fetch(\"/collections/\" + handle + \"/products.json?limit=50\", {\r\n            headers: { \"Accept\": \"application/json\" }\r\n          });\r\n          if (!resp.ok) throw new Error(\"HTTP \" + resp.status);\r\n          const data = await resp.json();\r\n          const products = Array.isArray(data?.products) ? data.products : [];\r\n          renderProductSearchResults(products, \"\u672A\u627E\u5230 \" + label + \" \u7CFB\u5217\u4EA7\u54C1\u3002\");\r\n        } catch (err) {\r\n          console.error(\"loadProductsByCollectionHandle error =\", err);\r\n          setStatus(\"productSearchStatus\", \"\u52A0\u8F7D\u7CFB\u5217\u5931\u8D25\uFF1A\" + err.message);\r\n        }\r\n      }\r\n  \r\n      function getSoftRatioHint(ratioValue) {\r\n        const map = {\r\n          \"1:1\": \"square composition, balanced centered framing\",\r\n          \"4:3\": \"landscape composition, horizontal framing\",\r\n          \"4:5\": \"vertical composition, editorial portrait framing\",\r\n          \"16:9\": \"wide cinematic composition, horizontal framing\"\r\n        };\r\n        return map[ratioValue] || \"\";\r\n      }\r\n  \r\n      function mergeNegativePrompts(...values) {\r\n        const seen = new Set();\r\n        const parts = [];\r\n  \r\n        values\r\n          .join(\", \")\r\n          .split(\",\")\r\n          .map(item => item.replace(/\\s+/g, \" \").trim())\r\n          .filter(Boolean)\r\n          .forEach(item => {\r\n            const key = item.toLowerCase();\r\n            if (seen.has(key)) return;\r\n            seen.add(key);\r\n            parts.push(item);\r\n          });\r\n  \r\n        return parts.join(\", \");\r\n      }\r\n  \r\n      function normalizeImageSlotCount(value) {\r\n        const count = Number.parseInt(String(value || \"\"), 10);\r\n        if (!Number.isFinite(count)) return 3;\r\n        return Math.max(2, Math.min(count, 4));\r\n      }\r\n  \r\n      function getImageSlotBlueprint(index, totalCount, includeProduct) {\r\n        const count = normalizeImageSlotCount(totalCount || $(\"imageCount\")?.value || 3);\r\n        const closingIndex = count >= 3 ? count - 1 : -1;\r\n        const productDirection = visible => {\r\n          if (!includeProduct) return \"No products, packaging, treats, bowls, or food props in frame.\";\r\n          return visible\r\n            ? \"This is the only slot that may show the referenced product, and only as a small supporting detail matching the reference image.\"\r\n            : \"Do not show the product, packaging, treats, bowls, or food props in this slot.\";\r\n        };\r\n  \r\n        if (index === 0) {\r\n          return {\r\n            placement: \"hero\",\r\n            composition: \"24-35mm wide environmental establishing shot, eye-level, pet small to medium in frame, visible setting, generous negative space\",\r\n            visual_direction: \"Open the article with a pet-only context scene tied to the topic. Do not pose a person with the pet; at most use a distant incidental human figure with no interaction.\",\r\n            lighting: \"crisp natural light or weather-appropriate daylight, not warm living-room light\",\r\n            product_visibility: \"none\",\r\n            product_direction: productDirection(false),\r\n            negative_prompt: \"owner-pet interaction, hand touching pet, hugging, holding, sofa cuddle, seated portrait pair, close-up face, product display, tabletop packshot\"\r\n          };\r\n        }\r\n  \r\n        if (index === closingIndex) {\r\n          return {\r\n            placement: \"closing\",\r\n            composition: \"70-85mm side or back portrait, calm pet-only moment, simple background, visible depth, restrained framing\",\r\n            visual_direction: \"Close the article with the pet alone in a quiet resolved state, such as resting near a window, watching a path, or settling into a familiar space. Keep people out of frame.\",\r\n            lighting: \"low-contrast late-afternoon, overcast, or window-edge light, visibly different from the hero\",\r\n            product_visibility: \"none\",\r\n            product_direction: productDirection(false),\r\n            negative_prompt: \"person in frame, owner-pet interaction, wide establishing view, top-down composition, action pose, product display, matching hero background\"\r\n          };\r\n        }\r\n  \r\n        if ((index - 1) % 2 === 0) {\r\n          return {\r\n            placement: `body-${index}`,\r\n            composition: \"directly overhead or tight 85mm editorial detail, cropped pet body, paws, posture, sniffing behavior, resting area, or care-related surface\",\r\n            visual_direction: \"Make one article point tangible through a pet-only observational detail. Crop people out completely and focus on one physical cue or routine rather than a full lifestyle scene.\",\r\n            lighting: \"controlled shade, cool window light, or directional light on a textured surface\",\r\n            product_visibility: includeProduct ? \"supporting\" : \"none\",\r\n            product_direction: productDirection(includeProduct),\r\n            negative_prompt: \"wide environmental scene, owner-pet interaction, full seated portrait, couch cuddle, low-angle action, matching hero composition, crowded room\"\r\n          };\r\n        }\r\n  \r\n        return {\r\n          placement: `body-${index}`,\r\n          composition: \"low side-angle candid action frame, pet moving, exploring, stretching, or pausing mid-routine, clear motion cue and background separation\",\r\n          visual_direction: \"Illustrate a different section with one natural pet action in a setting clearly different from the other images. No person should touch, hold, or pose with the pet.\",\r\n          lighting: \"open shade, outdoor daylight, or directional side light with a different color temperature from the other slots\",\r\n          product_visibility: \"none\",\r\n          product_direction: productDirection(false),\r\n          negative_prompt: \"top-down detail, still portrait, owner-pet interaction, indoor couch scene, product display, matching hero background, matching closing pose\"\r\n        };\r\n      }\r\n  \r\n      function getSlotPromptGuidance(label, index) {\r\n        return getImageSlotBlueprint(index, $(\"imageCount\")?.value || 3, getProductReferenceUrls().length > 0);\r\n      }\r\n  \r\n      function createFallbackImageTask(label, index, includeProduct) {\r\n        const title = getFieldValue(\"finalTitle\") || \"ChewTrue pet blog article\";\r\n        const excerpt = getFieldValue(\"excerpt\") || getFieldValue(\"sectionSummaries\") || \"\";\r\n        const slot = getImageSlotBlueprint(index, $(\"imageCount\")?.value || 3, includeProduct);\r\n  \r\n        return {\r\n          label,\r\n          placement: slot.placement,\r\n          composition: slot.composition,\r\n          visual_direction: slot.visual_direction,\r\n          lighting: slot.lighting,\r\n          product_visibility: slot.product_visibility,\r\n          purpose: `Fallback ${label} prompt generated from the final article.`,\r\n          prompt: [\r\n            `Premium realistic editorial image for the blog article \"${title}\".`,\r\n            excerpt ? `Article context: ${truncateText(excerpt, 260)}.` : \"\",\r\n            `Hard visual direction: ${slot.visual_direction}`,\r\n            `Camera and composition: ${slot.composition}.`,\r\n            `Lighting: ${slot.lighting}.`,\r\n            slot.product_direction,\r\n            \"Do not replace this visual role with a generic person-and-pet lifestyle portrait. No text in image.\"\r\n          ].filter(Boolean).join(\" \"),\r\n          negative_prompt: slot.negative_prompt\r\n        };\r\n      }\r\n  \r\n      function completeImageTasks(tasks, labels, includeProduct) {\r\n        const sourceTasks = Array.isArray(tasks) ? tasks : [];\r\n        return labels.map((label, index) => {\r\n          const slot = getImageSlotBlueprint(index, labels.length, includeProduct);\r\n          const task = sourceTasks[index] || createFallbackImageTask(label, index, includeProduct);\r\n          const prompt = String(task.prompt || \"\").replace(/\\s+/g, \" \").trim();\r\n  \r\n          return {\r\n            ...task,\r\n            label,\r\n            placement: slot.placement,\r\n            composition: slot.composition,\r\n            visual_direction: slot.visual_direction,\r\n            lighting: slot.lighting,\r\n            product_visibility: slot.product_visibility,\r\n            prompt: [\r\n              `Hard visual blueprint: ${slot.visual_direction}`,\r\n              `Mandatory camera and composition: ${slot.composition}.`,\r\n              `Mandatory lighting: ${slot.lighting}.`,\r\n              slot.product_direction,\r\n              prompt ? `Article-specific scene detail; obey the hard blueprint above: ${prompt}` : \"\",\r\n              \"This image must remain visually distinct from every other slot. Do not turn it into a generic person-and-pet lifestyle portrait. No text in image.\"\r\n            ].filter(Boolean).join(\". \"),\r\n            negative_prompt: mergeNegativePrompts(task.negative_prompt || \"\", slot.negative_prompt || \"\")\r\n          };\r\n        });\r\n      }\r\n  \r\n      function getTaskNegativePrompt(task) {\r\n        return String(\r\n          task?.negative_prompt ||\r\n          task?.negativePrompt ||\r\n          task?.ne_prompt ||\r\n          task?.no ||\r\n          \"\"\r\n        ).trim();\r\n      }\r\n  \r\n      async function generateImagePlanInternally() {\r\n        setStatus(\"imagePlanStatus\", \"\u6B63\u5728\u81EA\u52A8\u751F\u6210\u56FE\u7247\u4EFB\u52A1\uFF0C\u8BF7\u7A0D\u5019\u2026\u2026\");\r\n  \r\n        const productReferenceUrls = getProductReferenceUrls();\r\n        const includeProduct = productReferenceUrls.length > 0;\r\n        const productContextName = includeProduct\r\n          ? $(\"textProductName\").value.trim() || $(\"productName\").value.trim()\r\n          : \"\";\r\n        let productVisualMode = $(\"productVisualMode\").value;\r\n  \r\n        if (!includeProduct) {\r\n          productVisualMode = \"no_product\";\r\n        } else if (!selectedProduct.image) {\r\n          throw new Error(\"\u5F53\u524D\u672A\u9009\u62E9\u4EA7\u54C1\uFF0C\u65E0\u6CD5\u4F7F\u7528\u771F\u5B9E\u4EA7\u54C1\u51FA\u56FE\u3002\u8BF7\u5148\u56DE\u5230\u7B2C\u4E00\u6B65\u9009\u62E9\u4EA7\u54C1\u3002\");\r\n        }\r\n  \r\n        const data = await apiPost(\"/content/image-plan\", {\r\n          parameters: {\r\n            final_title: $(\"finalTitle\").value.trim(),\r\n            excerpt: $(\"excerpt\").value.trim(),\r\n            article_html: getCurrentArticleHtml(),\r\n            section_summaries: $(\"sectionSummaries\").value.trim(),\r\n            pet_type: $(\"petType\").value.trim(),\r\n            image_count: String($(\"imageCount\").value || 3),\r\n            image_mode: $(\"imageMode\").value.trim(),\r\n            variants_per_prompt: \"1\",\r\n            brand_tone: $(\"textBrandTone\").value.trim() || $(\"brandTone\").value.trim(),\r\n            product_name: productContextName,\r\n            notes: $(\"textNotes\").value.trim() || $(\"notes\").value.trim(),\r\n            pet_character_anchor: $(\"petCharacterAnchor\").value.trim(),\r\n            product_visual_mode: productVisualMode,\r\n            include_product: includeProduct ? \"yes\" : \"no\"\r\n          }\r\n        });\r\n  \r\n        const planResponse = normalizeImagePlanResponse(data);\r\n        const raw = planResponse.raw || {};\r\n        let tasks = planResponse.tasks;\r\n  \r\n        let negative = planResponse.global_negative_prompt || \"\";\r\n        const includeProductNow = productReferenceUrls.length > 0;\r\n        let modeNegativeTail = \"\";\r\n  \r\n        if (!includeProductNow) {\r\n          const noProductTail = [\r\n            \"no packaging\",\r\n            \"no branded product\",\r\n            \"no product bag\",\r\n            \"no product package\",\r\n            \"no treats\",\r\n            \"no chew sticks\",\r\n            \"no edible chews\",\r\n            \"no dog snacks\",\r\n            \"no pet treats\",\r\n            \"no treat bowl\",\r\n            \"no food bowl with treats\",\r\n            \"no scattered treats\",\r\n            \"no product display props\",\r\n            \"no labeled packaging\"\r\n          ].join(\", \");\r\n          modeNegativeTail = noProductTail;\r\n          negative = negative ? `${negative}, ${noProductTail}` : noProductTail;\r\n        } else {\r\n          const noWrongSubstitute = [\r\n            \"no toy substitute\",\r\n            \"no ring toy\",\r\n            \"no generic bone toy\",\r\n            \"no water bowl\",\r\n            \"no unrelated food bowl\",\r\n            \"no substitute chew\",\r\n            \"no incorrect product shape\"\r\n          ].join(\", \");\r\n          modeNegativeTail = noWrongSubstitute;\r\n          negative = negative ? `${negative}, ${noWrongSubstitute}` : noWrongSubstitute;\r\n        }\r\n  \r\n        currentSlotLabels = getImageSlotLabels($(\"imageCount\").value);\r\n        tasks = completeImageTasks(tasks, currentSlotLabels, includeProductNow)\r\n          .map(task => ({\r\n            ...task,\r\n            negative_prompt: mergeNegativePrompts(task.negative_prompt || \"\", modeNegativeTail)\r\n          }));\r\n  \r\n        $(\"globalNePrompt\").value = negative;\r\n        $(\"imageTasksJson\").value = JSON.stringify(tasks, null, 2);\r\n        $(\"imageDebugRaw\").value = JSON.stringify(data, null, 2);\r\n  \r\n        currentPlannedTasks = currentSlotLabels.map((label, index) => ({\r\n          label,\r\n          task: tasks[index] || null\r\n        }));\r\n  \r\n        currentResults = currentSlotLabels.map(label => ({\r\n          label,\r\n          imageUrl: \"\",\r\n          taskId: \"\",\r\n          status: \"\u5F85\u751F\u6210\"\r\n        }));\r\n  \r\n        renderResultCards();\r\n        setStatus(\"imagePlanStatus\", \"\u56FE\u7247\u4EFB\u52A1\u5DF2\u751F\u6210\uFF0C\u5F00\u59CB\u63D0\u4EA4\u56FE\u7247\u751F\u6210\u4EFB\u52A1\u2026\u2026\");\r\n      }\r\n  \r\n      function buildImagePayload(task, selectedModel, ratioValue, globalNegativePrompt, productRefUrls) {\r\n        const requestedProductReferenceUrls = normalizeImageUrlList(productRefUrls, 2);\r\n        const allowProductInTask = task?.product_visibility === \"supporting\";\r\n        const productReferenceUrls = allowProductInTask ? requestedProductReferenceUrls : [];\r\n        const productRefUrl = productReferenceUrls[0] || \"\";\r\n        const cfg = IMAGE_MODEL_CONFIGS[selectedModel];\r\n        if (!cfg) throw new Error(\"\u672A\u627E\u5230\u6A21\u578B\u914D\u7F6E\");\r\n  \r\n        const includeProductNow = productReferenceUrls.length > 0;\r\n        const softRatioHint = getSoftRatioHint(ratioValue);\r\n  \r\n        let prompt = task.prompt || \"\";\r\n  \r\n        if (softRatioHint) {\r\n          prompt = `${prompt}. ${softRatioHint}`;\r\n        }\r\n  \r\n        if (!includeProductNow) {\r\n          prompt = `${prompt}. Pure pet lifestyle scene only. No product, no packaging, no treats, no chew items, no food props in frame.`;\r\n        } else if (productRefUrl) {\r\n          prompt = `${prompt}. Use the referenced product image as the real product appearance. Keep the product shape, material, and overall visual identity consistent with the reference. Do not invent a different chew, toy, bowl setup, or substitute product. The product shown in the image must match the referenced product rather than a generic pet item.`;\r\n        }\r\n  \r\n        const negativePrompt = mergeNegativePrompts(globalNegativePrompt, getTaskNegativePrompt(task));\r\n        if (negativePrompt) {\r\n          prompt = `${prompt}. Negative prompt: ${negativePrompt}.`;\r\n        }\r\n  \r\n        // ChatGPT Images 2.0\uFF1A\u7EAF\u6587\u751F\u56FE\r\n        if (selectedModel === \"openai/gpt-image-2\") {\r\n          const params = {\r\n            prompt,\r\n            image_size: mapImageSizeForModel(selectedModel, ratioValue),\r\n            resolution: cfg.defaultResolution || \"1K\",\r\n            quality: cfg.defaultQuality || \"high\",\r\n            num_images: 1,\r\n            output_format: cfg.defaultOutputFormat || \"png\"\r\n          };\r\n  \r\n        return {\r\n          model: selectedModel,\r\n          params,\r\n          channel: null\r\n        };\r\n      }\r\n  \r\n        // ChatGPT Images 2.0 Edit\uFF1A\u6709\u53C2\u8003\u56FE\u65F6\u4F7F\u7528\r\n        if (selectedModel === \"openai/gpt-image-2/edit\") {\r\n          if (!productRefUrl) {\r\n            throw new Error(\"ChatGPT Images 2.0 Edit \u9700\u8981\u4EA7\u54C1\u53C2\u8003\u56FE\u3002\u8BF7\u5148\u9009\u62E9\u4EA7\u54C1\uFF0C\u6216\u5207\u6362\u4E3A\u4E0D\u51FA\u73B0\u4EA7\u54C1\u6A21\u5F0F\u3002\");\r\n          }\r\n  \r\n          const params = {\r\n            prompt,\r\n            image_urls: productReferenceUrls,\r\n            image_size: mapImageSizeForModel(selectedModel, ratioValue),\r\n            resolution: cfg.defaultResolution || \"1K\",\r\n            quality: cfg.defaultQuality || \"high\",\r\n            num_images: 1,\r\n            output_format: cfg.defaultOutputFormat || \"png\"\r\n          };\r\n  \r\n          return {\r\n            model: selectedModel,\r\n            params,\r\n            channel: null\r\n          };\r\n        }\r\n  \r\n        // Nano Banana Pro\r\n        if (selectedModel === \"fal-ai/nano-banana-pro\") {\r\n          const params = {\r\n            prompt,\r\n            num_images: 1,\r\n            aspect_ratio: mapAspectRatioForModel(selectedModel, ratioValue),\r\n            resolution: cfg.defaultResolution || \"1K\",\r\n            output_format: cfg.defaultOutputFormat || \"png\"\r\n          };\r\n  \r\n          if (productReferenceUrls.length) {\r\n            params.image_urls = productReferenceUrls;\r\n          }\r\n  \r\n          return {\r\n            model: selectedModel,\r\n            params,\r\n            channel: null\r\n          };\r\n        }\r\n  \r\n        // Nano Banana 2\r\n        if (selectedModel === \"fal-ai/nano-banana-2\") {\r\n          const params = {\r\n            prompt,\r\n            num_images: 1,\r\n            aspect_ratio: mapAspectRatioForModel(selectedModel, ratioValue),\r\n            resolution: cfg.defaultResolution || \"1K\",\r\n            output_format: cfg.defaultOutputFormat || \"png\",\r\n            safety_tolerance: \"4\",\r\n            limit_generations: true\r\n          };\r\n  \r\n          if (productReferenceUrls.length) {\r\n            params.image_urls = productReferenceUrls;\r\n          }\r\n  \r\n          return {\r\n            model: selectedModel,\r\n            params,\r\n            channel: null\r\n          };\r\n        }\r\n  \r\n        // Flux 2 Flash\r\n        if (selectedModel === \"fal-ai/flux-2/flash\") {\r\n          const params = {\r\n            prompt,\r\n            image_size: mapImageSizeForModel(selectedModel, ratioValue),\r\n            num_images: 1\r\n          };\r\n  \r\n          if (cfg.extraParams) {\r\n            Object.assign(params, cfg.extraParams);\r\n          }\r\n  \r\n          if (productReferenceUrls.length) {\r\n            params.image_urls = productReferenceUrls;\r\n          }\r\n  \r\n          return {\r\n            model: selectedModel,\r\n            params,\r\n            channel: null\r\n          };\r\n        }\r\n  \r\n        throw new Error(\"\u5F53\u524D\u6A21\u578B\u6682\u672A\u914D\u7F6E payload \u751F\u6210\u903B\u8F91\");\r\n      }\r\n  \r\n      function extractImageUrlsFromQuery(data) {\r\n        const urls = [];\r\n        const seen = new Set();\r\n  \r\n        function addUrl(value) {\r\n          const url = String(value || \"\").trim();\r\n          if (!url) return;\r\n  \r\n          if (!/^https?:\\/\\//i.test(url)) return;\r\n  \r\n          if (!seen.has(url)) {\r\n            seen.add(url);\r\n            urls.push(url);\r\n          }\r\n        }\r\n  \r\n        function walk(value) {\r\n          if (!value) return;\r\n  \r\n          if (typeof value === \"string\") {\r\n            const trimmed = value.trim();\r\n  \r\n            if (\r\n              (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\r\n              (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\r\n            ) {\r\n              try {\r\n                walk(JSON.parse(trimmed));\r\n                return;\r\n              } catch (e) {}\r\n            }\r\n  \r\n            addUrl(trimmed);\r\n            return;\r\n          }\r\n  \r\n          if (Array.isArray(value)) {\r\n            value.forEach(walk);\r\n            return;\r\n          }\r\n  \r\n          if (typeof value === \"object\") {\r\n            [\r\n              \"url\",\r\n              \"image_url\",\r\n              \"imageUrl\",\r\n              \"src\",\r\n              \"uri\",\r\n              \"download_url\",\r\n              \"file_url\"\r\n            ].forEach(key => {\r\n              if (value[key]) addUrl(value[key]);\r\n            });\r\n  \r\n            [\r\n              \"images\",\r\n              \"image_urls\",\r\n              \"urls\",\r\n              \"files\",\r\n              \"outputs\",\r\n              \"assets\",\r\n              \"output\",\r\n              \"result\",\r\n              \"data\"\r\n            ].forEach(key => {\r\n              if (value[key]) walk(value[key]);\r\n            });\r\n          }\r\n        }\r\n  \r\n        const raw = normalizeApiData(data);\r\n  \r\n        const priorityCandidates = [\r\n          raw?.result?.output?.images,\r\n          raw?.result?.output?.image_urls,\r\n          raw?.result?.output?.urls,\r\n          raw?.result?.output,\r\n          raw?.output?.images,\r\n          raw?.output?.image_urls,\r\n          raw?.output?.urls,\r\n          raw?.output,\r\n          raw?.images,\r\n          raw?.image_urls,\r\n          raw?.urls\r\n        ];\r\n  \r\n        priorityCandidates.forEach(walk);\r\n  \r\n        if (!urls.length) {\r\n          walk(raw);\r\n        }\r\n  \r\n        return urls;\r\n      }\r\n  \r\n      function extractTaskStatusFromQuery(data) {\r\n        const raw = normalizeApiData(data);\r\n  \r\n        return String(\r\n          raw?.status ||\r\n          raw?.state ||\r\n          raw?.data?.status ||\r\n          raw?.data?.state ||\r\n          raw?.result?.status ||\r\n          raw?.result?.state ||\r\n          raw?.output?.status ||\r\n          \"\"\r\n        ).toLowerCase();\r\n      }\r\n  \r\n      function renderResultCards() {\r\n        const wrap = $(\"imageResultsGrouped\");\r\n        wrap.innerHTML = \"\";\r\n  \r\n        currentResults.forEach((item, index) => {\r\n          const card = document.createElement(\"div\");\r\n          card.className = \"ct-result-card\";\r\n  \r\n          const actions = item.imageUrl\r\n            ? `\r\n              <div class=\"ct-result-actions\">\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-action=\"regenerate\" data-index=\"${index}\">\u91CD\u65B0\u751F\u56FE</button>\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-action=\"preview\" data-index=\"${index}\">\u653E\u5927\u67E5\u770B</button>\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-action=\"download\" data-index=\"${index}\">\u4E0B\u8F7D\u56FE\u7247</button>\r\n              </div>\r\n            `\r\n            : `\r\n              <div class=\"ct-result-actions\">\r\n                <button type=\"button\" class=\"ct-mini-btn\" data-action=\"regenerate\" data-index=\"${index}\">\u91CD\u65B0\u751F\u56FE</button>\r\n              </div>\r\n            `;\r\n  \r\n          card.innerHTML = `\r\n            <h3>${escapeHtml(item.label)}</h3>\r\n            <div class=\"ct-result-image-wrap\">\r\n              ${item.imageUrl\r\n                ? `<img src=\"${item.imageUrl}\" alt=\"${escapeHtml(item.label)}\">`\r\n                : `<div class=\"ct-result-placeholder\">${escapeHtml(item.status || \"\u6682\u65E0\u7ED3\u679C\")}</div>`}\r\n            </div>\r\n            ${actions}\r\n            <div class=\"ct-result-meta\">\r\n              ${item.taskId ? `task_id: ${escapeHtml(item.taskId)}` : \"\"}\r\n            </div>\r\n          `;\r\n  \r\n          wrap.appendChild(card);\r\n        });\r\n  \r\n        wrap.querySelectorAll(\"[data-action]\").forEach(btn => {\r\n          btn.addEventListener(\"click\", async () => {\r\n            const action = btn.dataset.action;\r\n            const index = Number(btn.dataset.index);\r\n  \r\n            if (action === \"regenerate\") {\r\n              await regenerateSlot(index);\r\n            } else if (action === \"preview\") {\r\n              openImagePreview(currentResults[index]?.imageUrl || \"\");\r\n            } else if (action === \"download\") {\r\n              downloadImage(currentResults[index]?.imageUrl || \"\", currentResults[index]?.label || \"image\");\r\n            }\r\n          });\r\n        });\r\n      }\r\n  \r\n      function openImagePreview(url) {\r\n        if (!url) return;\r\n        $(\"imagePreviewModalImg\").src = url;\r\n        $(\"imagePreviewModal\").classList.add(\"is-open\");\r\n        $(\"imagePreviewModal\").setAttribute(\"aria-hidden\", \"false\");\r\n      }\r\n  \r\n      function closeImagePreview() {\r\n        $(\"imagePreviewModal\").classList.remove(\"is-open\");\r\n        $(\"imagePreviewModal\").setAttribute(\"aria-hidden\", \"true\");\r\n        $(\"imagePreviewModalImg\").src = \"\";\r\n      }\r\n  \r\n      function downloadImage(url, label) {\r\n        if (!url) return;\r\n        const a = document.createElement(\"a\");\r\n        a.href = url;\r\n        a.target = \"_blank\";\r\n        a.rel = \"noopener\";\r\n        a.download = `${label}.png`;\r\n        document.body.appendChild(a);\r\n        a.click();\r\n        a.remove();\r\n      }\r\n  \r\n      function stopAutoPolling() {\r\n        if (autoPollTimer) {\r\n          clearTimeout(autoPollTimer);\r\n          autoPollTimer = null;\r\n        }\r\n        autoPollCount = 0;\r\n        currentPollingContext = null;\r\n      }\r\n  \r\n      async function pollSingleTask(taskId, slotIndex) {\r\n        currentTaskId = taskId;\r\n        $(\"latestTaskId\").value = taskId;\r\n        autoPollCount = 0;\r\n        currentPollingContext = { taskId, slotIndex };\r\n  \r\n        return new Promise((resolve) => {\r\n          const tick = async () => {\r\n            autoPollCount += 1;\r\n            const label = currentResults[slotIndex]?.label || `\u56FE\u4F4D ${slotIndex + 1}`;\r\n            setStatus(\"imageQueryStatus\", `\u6B63\u5728\u67E5\u8BE2 ${label} \u7ED3\u679C\uFF08\u7B2C ${autoPollCount} \u6B21\uFF09\u2026\u2026`);\r\n  \r\n            try {\r\n              const data = await apiPost(\"/query-image\", { task_id: taskId });\r\n              $(\"imageDebugRaw\").value = JSON.stringify(data, null, 2);\r\n  \r\n                const status = extractTaskStatusFromQuery(data);\r\n                const urls = extractImageUrlsFromQuery(data);\r\n  \r\n              if (urls.length) {\r\n                  currentResults[slotIndex].imageUrl = urls[0];\r\n                  currentResults[slotIndex].status = \"\u5DF2\u751F\u6210\";\r\n                  renderResultCards();\r\n                  if (currentStep === 5) {\r\n                    renderPublishCoverOptions();\r\n                    updatePublishPayloadPreview();\r\n                  }\r\n                  resolve(true);\r\n                return;\r\n              }\r\n  \r\n              if ([\"failed\", \"error\", \"canceled\", \"cancelled\"].includes(status)) {\r\n                currentResults[slotIndex].status = \"\u751F\u6210\u5931\u8D25\";\r\n                renderResultCards();\r\n                resolve(false);\r\n                return;\r\n              }\r\n  \r\n              if (autoPollCount >= maxAutoPollCount) {\r\n                currentResults[slotIndex].status = \"\u6682\u672A\u751F\u6210\uFF0C\u53EF\u624B\u52A8\u67E5\u8BE2\";\r\n                renderResultCards();\r\n                resolve(false);\r\n                return;\r\n              }\r\n  \r\n              autoPollTimer = setTimeout(tick, 3000);\r\n            } catch (err) {\r\n              if (autoPollCount >= maxAutoPollCount) {\r\n                currentResults[slotIndex].status = \"\u67E5\u8BE2\u8D85\u65F6\uFF0C\u53EF\u624B\u52A8\u67E5\u8BE2\";\r\n                renderResultCards();\r\n                resolve(false);\r\n                return;\r\n              }\r\n              autoPollTimer = setTimeout(tick, 3000);\r\n            }\r\n          };\r\n  \r\n          tick();\r\n        });\r\n      }\r\n  \r\n      async function generateSlot(slotIndex) {\r\n        const productReferenceUrls = getProductReferenceUrls();\r\n        const selectedModel = $(\"imageModel\").value;\r\n        const ratioValue = $(\"imageRatio\").value;\r\n        const globalNegativePrompt = $(\"globalNePrompt\").value.trim();\r\n        const slotInfo = currentPlannedTasks[slotIndex];\r\n  \r\n        if (!slotInfo || !slotInfo.task) {\r\n          throw new Error(\"\u5F53\u524D\u56FE\u4F4D\u6CA1\u6709\u53EF\u7528\u4EFB\u52A1\u3002\");\r\n        }\r\n  \r\n        const generationModel = resolveImageModelForTask(selectedModel, slotInfo.task);\r\n        const payload = buildImagePayload(\r\n          slotInfo.task,\r\n          generationModel,\r\n          ratioValue,\r\n          globalNegativePrompt,\r\n          productReferenceUrls\r\n        );\r\n  \r\n        const label = currentResults[slotIndex]?.label || `\u56FE\u4F4D ${slotIndex + 1}`;\r\n        const modelNote = generationModel !== selectedModel\r\n          ? \"\uFF08\u8BE5\u56FE\u4F4D\u4E0D\u9732\u51FA\u4EA7\u54C1\uFF0C\u81EA\u52A8\u4F7F\u7528\u65E0\u53C2\u8003\u56FE\u6A21\u578B\uFF09\"\r\n          : \"\";\r\n        setStatus(\"imageGenStatus\", `\u6B63\u5728\u63D0\u4EA4 ${label}${modelNote} \u2026\u2026`);\r\n  \r\n        currentResults[slotIndex].status = \"\u5DF2\u63D0\u4EA4\uFF0C\u7B49\u5F85\u751F\u6210\";\r\n        currentResults[slotIndex].model = generationModel;\r\n        renderResultCards();\r\n  \r\n        const createResp = await apiPost(\"/generate-image\", payload);\r\n        $(\"imageDebugRaw\").value = JSON.stringify(createResp, null, 2);\r\n  \r\n        const taskId = createResp?.data?.task_id || createResp?.task_id || \"\";\r\n        if (!taskId) {\r\n          currentResults[slotIndex].status = \"\u672A\u8FD4\u56DE task_id\";\r\n          renderResultCards();\r\n          throw new Error(`${label} \u672A\u8FD4\u56DE task_id\u3002`);\r\n        }\r\n  \r\n        currentResults[slotIndex].taskId = taskId;\r\n        currentResults[slotIndex].status = \"\u6B63\u5728\u81EA\u52A8\u67E5\u8BE2\";\r\n        renderResultCards();\r\n  \r\n        const ok = await pollSingleTask(taskId, slotIndex);\r\n        if (!ok) {\r\n          setStatus(\"imageQueryStatus\", `${label} \u6682\u672A\u62FF\u5230\u56FE\u7247\u7ED3\u679C\uFF0C\u53EF\u7A0D\u540E\u70B9\u51FB\u201C\u624B\u52A8\u67E5\u8BE2\u5F53\u524D\u4EFB\u52A1\u201D\u3002`);\r\n        }\r\n      }\r\n  \r\n      async function regenerateSlot(slotIndex) {\r\n        stopAutoPolling();\r\n        setStatus(\"imageGenStatus\", `\u6B63\u5728\u91CD\u65B0\u751F\u6210 ${currentResults[slotIndex]?.label || \"\u8BE5\u56FE\u4F4D\"} \u2026\u2026`);\r\n        await generateSlot(slotIndex);\r\n      }\r\n  \r\n      async function handleGenerateImages() {\r\n        setStatus(\"imageGenStatus\", \"\u51C6\u5907\u751F\u6210\u56FE\u7247\u2026\u2026\");\r\n        setStatus(\"imageQueryStatus\", \"\");\r\n        stopAutoPolling();\r\n  \r\n        const productReferenceUrls = getProductReferenceUrls();\r\n  \r\n        if (selectedModelRequiresReference($(\"imageModel\").value) && !productReferenceUrls.length) {\r\n          setStatus(\"imageGenStatus\", \"\u5F53\u524D\u6A21\u578B\u9700\u8981\u53C2\u8003\u56FE\u3002\u8BF7\u5728\u7B2C\u56DB\u6B65\u4ECE\u7B2C\u4E09\u6B65\u4EA7\u54C1\u63A8\u8350\u6216\u624B\u52A8\u9009\u62E9\u4EA7\u54C1\uFF0C\u5E76\u52FE\u9009\u4EA7\u54C1\u56FE\u6216\u5305\u88C5\u56FE\u3002\");\r\n          return;\r\n        }\r\n  \r\n        try {\r\n          await generateImagePlanInternally();\r\n  \r\n          for (let i = 0; i < currentResults.length; i++) {\r\n            await generateSlot(i);\r\n          }\r\n  \r\n          setStatus(\"imageGenStatus\", \"\u672C\u8F6E\u914D\u56FE\u751F\u6210\u6D41\u7A0B\u5DF2\u5B8C\u6210\u3002\");\r\n        } catch (err) {\r\n          setStatus(\"imageGenStatus\", `\u751F\u6210\u56FE\u7247\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      async function handleManualQueryImage() {\r\n        setStatus(\"imageQueryStatus\", \"\u6B63\u5728\u624B\u52A8\u67E5\u8BE2\u5F53\u524D\u4EFB\u52A1\u2026\u2026\");\r\n  \r\n        try {\r\n          const taskId = $(\"latestTaskId\").value.trim();\r\n          if (!taskId) {\r\n            throw new Error(\"\u6CA1\u6709\u53EF\u67E5\u8BE2\u7684 task_id\u3002\");\r\n          }\r\n  \r\n          const data = await apiPost(\"/query-image\", { task_id: taskId });\r\n          $(\"imageDebugRaw\").value = JSON.stringify(data, null, 2);\r\n          const urls = extractImageUrlsFromQuery(data);\r\n  \r\n          if (urls.length) {\r\n            let targetIndex = 0;\r\n            if (currentPollingContext && currentPollingContext.taskId === taskId) {\r\n              targetIndex = currentPollingContext.slotIndex;\r\n            } else {\r\n              targetIndex = currentResults.findIndex(item => item.taskId === taskId);\r\n              if (targetIndex < 0) {\r\n                targetIndex = currentResults.findIndex(item => !item.imageUrl);\r\n                if (targetIndex < 0) targetIndex = 0;\r\n              }\r\n            }\r\n  \r\n              currentResults[targetIndex].imageUrl = urls[0];\r\n              currentResults[targetIndex].status = \"\u5DF2\u751F\u6210\";\r\n              renderResultCards();\r\n              if (currentStep === 5) {\r\n                renderPublishCoverOptions();\r\n                updatePublishPayloadPreview();\r\n              }\r\n              setStatus(\"imageQueryStatus\", \"\u5DF2\u67E5\u8BE2\u5230\u56FE\u7247\u7ED3\u679C\u3002\");\r\n          } else {\r\n            setStatus(\"imageQueryStatus\", \"\u6682\u672A\u8FD4\u56DE\u56FE\u7247\uFF0C\u8BF7\u7A0D\u540E\u518D\u67E5\u3002\");\r\n          }\r\n        } catch (err) {\r\n          setStatus(\"imageQueryStatus\", `\u624B\u52A8\u67E5\u8BE2\u5931\u8D25\uFF1A${err.message}`);\r\n        }\r\n      }\r\n  \r\n      document.querySelectorAll(\".ct-step-tab\").forEach(btn => {\r\n        btn.addEventListener(\"click\", () => {\r\n          if (btn.classList.contains(\"is-disabled\")) return;\r\n          setStep(Number(btn.dataset.step));\r\n        });\r\n      });\r\n  \r\n      document.querySelectorAll(\".ct-editor-tab\").forEach(btn => {\r\n        btn.addEventListener(\"click\", () => switchEditorMode(btn.dataset.editorMode));\r\n      });\r\n  \r\n      document.querySelectorAll(\".ct-tool-btn[data-cmd]\").forEach(btn => {\r\n        btn.addEventListener(\"click\", () => execCommand(btn.dataset.cmd));\r\n      });\r\n  \r\n      $(\"btnInsertLink\").addEventListener(\"click\", () => {\r\n        const url = window.prompt(\"\u8BF7\u8F93\u5165\u94FE\u63A5 URL\");\r\n        if (url) execCommand(\"createLink\", url);\r\n      });\r\n  \r\n      $(\"btnH2\").addEventListener(\"click\", () => applyBlock(\"h2\"));\r\n      $(\"btnP\").addEventListener(\"click\", () => applyBlock(\"p\"));\r\n      $(\"btnUl\").addEventListener(\"click\", () => execCommand(\"insertUnorderedList\"));\r\n      $(\"articleEditor\").addEventListener(\"input\", syncHtmlFromEditor);\r\n  \r\n      $(\"brandTonePreset\").addEventListener(\"change\", syncTonePreset);\r\n      $(\"promotionGoalPreset\").addEventListener(\"change\", syncGoalPreset);\r\n      $(\"contentType\").addEventListener(\"change\", syncContentTypeConfig);\r\n      $(\"petType\").addEventListener(\"change\", () => {\r\n        populatePetBreedOptions();\r\n        syncPetAnchorFromBreedInputs(true);\r\n  \r\n        if (!selectedProduct.title) return;\r\n  \r\n        const petTypeValue = ($(\"petType\").value || \"\").trim().toLowerCase();\r\n        const compatible = isProductCompatibleWithPetType(selectedProduct, petTypeValue);\r\n  \r\n        if (!compatible) {\r\n          setStatus(\r\n            \"productCompatibilityStatus\",\r\n            `\u5F53\u524D\u4EA7\u54C1\u672A\u6807\u8BB0\u4E3A\u9002\u7528\u4E8E ${petTypeValue}\uFF0C\u4E0D\u80FD\u7EE7\u7EED\u751F\u6210\u6807\u9898\u3002\u8BF7\u66F4\u6362\u4EA7\u54C1\u6216\u66F4\u6539\u5BA0\u7269\u7C7B\u578B\u3002`\r\n          );\r\n        } else {\r\n          setStatus(\"productCompatibilityStatus\", \"\");\r\n          const autoKeywords = generateKeywordsFromProduct(selectedProduct.title, selectedProduct.tags, petTypeValue);\r\n          if (autoKeywords) {\r\n            $(\"targetKeywords\").value = autoKeywords;\r\n            $(\"textTargetKeywords\").value = autoKeywords;\r\n          }\r\n        }\r\n      });\r\n  \r\n      if ($(\"petBreedSelect\")) {\r\n        $(\"petBreedSelect\").addEventListener(\"change\", () => {\r\n          syncPetAnchorFromBreedInputs();\r\n        });\r\n      }\r\n  \r\n      if ($(\"petFeatureNote\")) {\r\n        $(\"petFeatureNote\").addEventListener(\"input\", () => {\r\n          syncPetAnchorFromBreedInputs();\r\n        });\r\n      }\r\n  \r\n      $(\"imageRatio\").addEventListener(\"change\", updateAvailableModels);\r\n  \r\n      $(\"btnSaveWorkerSettings\").addEventListener(\"click\", saveWorkerSettings);\r\n      $(\"btnClearAdminKey\").addEventListener(\"click\", clearAdminKey);\r\n      $(\"btnHealth\").addEventListener(\"click\", handleHealth);\r\n      $(\"btnGenerateTitle\").addEventListener(\"click\", handleGenerateTitle);\r\n      $(\"btnRegenerateTitle\").addEventListener(\"click\", handleGenerateTitle);\r\n      $(\"btnGenerateText\").addEventListener(\"click\", handleGenerateText);\r\n      $(\"btnRegenerateText\").addEventListener(\"click\", handleGenerateText);\r\n      $(\"btnSaveRewriteDraft\").addEventListener(\"click\", handleSaveRewriteDraft);\r\n      $(\"btnConfirmText\").addEventListener(\"click\", handleConfirmText);\r\n      $(\"btnAnalyzeLinks\").addEventListener(\"click\", handleAnalyzeLinks);\r\n      $(\"btnApplyLinks\").addEventListener(\"click\", handleApplyLinks);\r\n      $(\"btnSkipLinks\").addEventListener(\"click\", handleSkipLinks);\r\n      $(\"btnConfirmLinks\").addEventListener(\"click\", handleConfirmLinks);\r\n  \r\n      $(\"btnGenerateImages\").addEventListener(\"click\", handleGenerateImages);\r\n      $(\"btnStopPolling\").addEventListener(\"click\", () => {\r\n        stopAutoPolling();\r\n        setStatus(\"imageQueryStatus\", \"\u5DF2\u505C\u6B62\u81EA\u52A8\u8F6E\u8BE2\u3002\");\r\n      });\r\n      $(\"btnManualQuery\").addEventListener(\"click\", handleManualQueryImage);\r\n  \r\n      $(\"btnGoPublish\").addEventListener(\"click\", handleGoPublish);\r\n  \r\n      $(\"btnRefreshPublish\").addEventListener(\"click\", () => {\r\n        syncPublishStep(true);\r\n        setPublishNotice(\r\n          \"info\",\r\n          \"\u53D1\u5E03\u4FE1\u606F\u5DF2\u5237\u65B0\",\r\n          \"\u5DF2\u6839\u636E\u5F53\u524D\u6807\u9898\u3001\u6B63\u6587\u548C\u914D\u56FE\u540C\u6B65\u66F4\u65B0\u53D1\u5E03\u4FE1\u606F\u3002\"\r\n        );\r\n      });\r\n  \r\n      $(\"publishCoverSource\").addEventListener(\"change\", () => {\r\n        updatePublishCoverPreview();\r\n        updatePublishPayloadPreview();\r\n      });\r\n  \r\n      [\"publishTitle\", \"publishHandle\", \"publishExcerpt\", \"publishSeoTitle\", \"publishMetaDescription\", \"publishTags\", \"publishBlog\"].forEach((id) => {\r\n        $(id).addEventListener(\"input\", updatePublishPayloadPreview);\r\n        $(id).addEventListener(\"change\", updatePublishPayloadPreview);\r\n      });\r\n  \r\n      $(\"publishTitle\").addEventListener(\"input\", () => {\r\n        const currentHandle = $(\"publishHandle\").value.trim();\r\n        const autoHandle = slugify($(\"publishTitle\").value.trim());\r\n        if (!currentHandle || currentHandle === $(\"publishHandle\").dataset.lastAutoValue) {\r\n          $(\"publishHandle\").value = autoHandle;\r\n          $(\"publishHandle\").dataset.lastAutoValue = autoHandle;\r\n        }\r\n        renderArticlePreview();\r\n        updatePublishPayloadPreview();\r\n      });\r\n  \r\n      $(\"publishExcerpt\").addEventListener(\"input\", renderArticlePreview);\r\n  \r\n      $(\"btnSaveDraft\").addEventListener(\"click\", async () => {\r\n        await submitArticleToShopify(\"draft\");\r\n      });\r\n  \r\n      $(\"btnPublishNow\").addEventListener(\"click\", async () => {\r\n        const title = $(\"publishTitle\").value.trim() || \"\u672A\u547D\u540D\u6587\u7AE0\";\r\n        const blog = $(\"publishBlog\").value.trim() || \"\u672A\u9009\u62E9\u680F\u76EE\";\r\n        const confirmed = window.confirm(`\u786E\u8BA4\u73B0\u5728\u53D1\u5E03\u8FD9\u7BC7\u6587\u7AE0\u5417\uFF1F\\n\\n\u6807\u9898\uFF1A${title}\\n\u535A\u5BA2\u680F\u76EE\uFF1A${blog}\\n\\n\u53D1\u5E03\u540E\u6587\u7AE0\u4F1A\u5728\u524D\u53F0\u53EF\u89C1\u3002`);\r\n        if (!confirmed) {\r\n          setPublishNotice(\"info\", \"\u5DF2\u53D6\u6D88\u53D1\u5E03\", \"\u6587\u7AE0\u672A\u63D0\u4EA4\u5230 Shopify\u3002\");\r\n          return;\r\n        }\r\n        await submitArticleToShopify(\"publish\");\r\n      }); \r\n  \r\n      $(\"btnOpenTitleProductPicker\").addEventListener(\"click\", openProductPicker);\r\n      $(\"btnOpenImageProductPicker\").addEventListener(\"click\", openProductPicker);\r\n      $(\"btnCloseProductPicker\").addEventListener(\"click\", closeProductPicker);\r\n      $(\"productPickerBackdrop\").addEventListener(\"click\", closeProductPicker);\r\n      $(\"btnSearchProducts\").addEventListener(\"click\", handleSearchProducts);\r\n      const seriesNameMap = {\r\n        \"all-chewtrue-treats\": \"All ChewTrue Treats\",\r\n        dog: \"Dog\",\r\n        cat: \"Cat\",\r\n        \"freeze-dried-meats\": \"Freeze-Dried Meats\",\r\n        \"meal-toppers\": \"Meal Toppers\",\r\n        \"dental-chews\": \"Dental Chews\",\r\n        \"puppy-kitten\": \"Puppy-Kitten\",\r\n        seafood: \"Seafood\",\r\n        \"gift-pack\": \"Gift Pack\"\r\n      };\r\n      document.querySelectorAll(\"#productSeriesQuickPick .ct-series-btn\").forEach((btn) => {\r\n        btn.addEventListener(\"click\", () => {\r\n          const label = seriesNameMap[btn.dataset.series] || btn.textContent.trim();\r\n          loadProductsByCollectionHandle(btn.dataset.series, label);\r\n        });\r\n      });\r\n      $(\"refProductImage\").addEventListener(\"change\", syncProductToImageStep);\r\n      $(\"refPackageImage\").addEventListener(\"change\", syncProductToImageStep);\r\n      $(\"imageRefProductImage\").addEventListener(\"change\", () => {\r\n        $(\"refProductImage\").checked = $(\"imageRefProductImage\").checked;\r\n        $(\"refProductImage\").dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n      });\r\n      $(\"imageRefPackageImage\").addEventListener(\"change\", () => {\r\n        $(\"refPackageImage\").checked = $(\"imageRefPackageImage\").checked;\r\n        $(\"refPackageImage\").dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n      });\r\n      $(\"productVisualMode\").addEventListener(\"change\", updateProductUI);\r\n      $(\"btnManualMode\").addEventListener(\"click\", () => setBuilderMode(\"manual\"));\r\n      $(\"btnAutoMode\").addEventListener(\"click\", () => setBuilderMode(\"auto\"));\r\n      $(\"btnOpenAnalytics\").addEventListener(\"click\", () => {\r\n        $(\"analyticsModal\").classList.add(\"is-open\");\r\n        $(\"analyticsModal\").setAttribute(\"aria-hidden\", \"false\");\r\n        loadAnalyticsDashboard();\r\n      });\r\n      $(\"btnCloseAnalytics\").addEventListener(\"click\", () => {\r\n        $(\"analyticsModal\").classList.remove(\"is-open\");\r\n        $(\"analyticsModal\").setAttribute(\"aria-hidden\", \"true\");\r\n      });\r\n      $(\"analyticsBackdrop\").addEventListener(\"click\", () => {\r\n        $(\"analyticsModal\").classList.remove(\"is-open\");\r\n        $(\"analyticsModal\").setAttribute(\"aria-hidden\", \"true\");\r\n      });\r\n      $(\"btnRefreshAnalytics\").addEventListener(\"click\", loadAnalyticsDashboard);\r\n      $(\"btnExportDraft\").addEventListener(\"click\", handleExportDraft);\r\n      $(\"btnImportDraft\").addEventListener(\"click\", handleImportDraft);\r\n      $(\"btnSaveAutoSettings\").addEventListener(\"click\", saveAutoAutomationSettings);\r\n      $(\"btnRunAutoNow\").addEventListener(\"click\", runWorkerAutoBatch);\r\n      if ($(\"autoFullEnabled\")) {\r\n        $(\"autoFullEnabled\").addEventListener(\"change\", async () => {\r\n          syncAutoRunControls();\r\n          renderAutoRuntime();\r\n          await saveAutoAutomationSettings();\r\n        });\r\n      }\r\n      [\"autoWorkerFrequency\", \"autoWorkerWeekday\", \"autoWorkerTime\"].forEach(id => {\r\n        const el = $(id);\r\n        if (el) el.addEventListener(\"change\", renderAutoRuntime);\r\n      });\r\n      $(\"btnRefreshAutoQueue\").addEventListener(\"click\", () => refreshAutoAutomationStatus(false));\r\n      $(\"btnReturnAutoFlow\").addEventListener(\"click\", saveAndReturnAutoFlow);\r\n      [\"refProductImage\", \"refPackageImage\", \"imageRefProductImage\", \"imageRefPackageImage\"].forEach((id) => {\r\n        const input = $(id);\r\n        const label = input ? input.closest(\"label\") : null;\r\n        if (label) {\r\n          label.addEventListener(\"click\", (event) => {\r\n            if (input.disabled) return;\r\n            if (event.target === input) return;\r\n            event.preventDefault();\r\n            input.checked = !input.checked;\r\n            input.dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n          });\r\n        }\r\n      });\r\n      $(\"btnBackToText\").addEventListener(\"click\", () => {\r\n        setStep(2);\r\n      });\r\n      $(\"btnCloseImagePreview\").addEventListener(\"click\", closeImagePreview);\r\n      $(\"imagePreviewBackdrop\").addEventListener(\"click\", closeImagePreview);\r\n  \r\n      [\r\n        \"fal-ai/nano-banana-2\",\r\n        \"fal-ai/nano-banana-pro\",\r\n        \"fal-ai/flux-2/flash\",\r\n        \"openai/gpt-image-2\",\r\n        \"openai/gpt-image-2/edit\"\r\n      ].forEach((value) => {\r\n        const cfg = IMAGE_MODEL_CONFIGS[value];\r\n        if (!cfg) return;\r\n        const opt = document.createElement(\"option\");\r\n        opt.value = value;\r\n        opt.textContent = cfg.label;\r\n        $(\"imageModel\").appendChild(opt);\r\n      });\r\n  \r\n      switchEditorMode(\"rich\");\r\n      updateProductUI();\r\n      syncReferenceOptionState();\r\n      populatePetBreedOptions();\r\n      loadWorkerSettings();\r\n      syncAutoRunControls();\r\n      syncPublishStep(true);\r\n      const initialMode = new URLSearchParams(window.location.search).get(\"mode\");\r\n      setBuilderMode(initialMode === \"auto\" || initialMode === \"manual\" ? initialMode : \"\");\r\n      renderAnalyticsDashboard();\r\n      renderAutoQueue();\r\n      refreshAutoAutomationStatus(true).then(() => {\r\n        scheduleAutoStatusPolling(6000);\r\n      });\r\n      setStep(1);\r\n  \r\n})();\r\n"],
  "mappings": "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",
  "names": ["ratios", "node", "prompt", "warnings"]
}
