dsh-image-gen 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["record","DICT","useState","useMemo","_jsxs","_jsx","useState","_jsxs","_jsx","_Fragment"],"sources":["types/shared.js","types/comfyui-workflow.js","types/client/gallery-store.js","types/client/gallery-view.js","types/client/image-ref.js","types/client/image-result-node.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope', 'comfyui'];\n/** Default endpoints and base URLs. */\nexport const DEFAULT_GOOGLE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/interactions';\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_SEEDREAM_BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_DASHSCOPE_ENDPOINT = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_COMFYUI_BASE_URL = 'http://127.0.0.1:8188';\nexport const DEFAULT_COMFYUI_TIMEOUT_MS = 300_000;\nexport const DEFAULT_COMFYUI_WORKFLOW_LABEL = 'API workflow';\nexport const MAX_COMFYUI_WORKFLOW_BYTES = 5 * 1024 * 1024;\n/** Default model names. */\nexport const DEFAULT_GOOGLE_MODEL = 'gemini-3.1-flash-image';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-image-2';\nexport const DEFAULT_SEEDREAM_MODEL = 'doubao-seedream-5-0-260128';\nexport const DEFAULT_DASHSCOPE_MODEL = 'qwen-image-3.0';\n/** Named workflows, falling back to the legacy single-workflow fields when the list is empty. */\nexport function resolveComfyUIWorkflows(source) {\n const named = [];\n for (const entry of source.comfyuiWorkflows ?? []) {\n const name = typeof entry?.name === 'string' ? entry.name.trim() : '';\n const json = typeof entry?.json === 'string' ? entry.json : '';\n if (name.length > 0 && json.trim().length > 0) {\n const presetPrompt = typeof entry.presetPrompt === 'string' ? entry.presetPrompt.trim() : '';\n named.push(presetPrompt.length > 0 ? { name, json, presetPrompt } : { name, json });\n }\n }\n if (named.length > 0)\n return named;\n const legacyJson = typeof source.comfyuiWorkflowJson === 'string' ? source.comfyuiWorkflowJson : '';\n if (legacyJson.trim().length === 0)\n return [];\n const legacyName = typeof source.comfyuiWorkflowName === 'string' ? source.comfyuiWorkflowName.trim() : '';\n return [{ name: legacyName.length > 0 ? legacyName : DEFAULT_COMFYUI_WORKFLOW_LABEL, json: legacyJson }];\n}\n/** The workflow ComfyUI calls use by default: the configured active name, else the first entry. */\nexport function activeComfyUIWorkflow(source) {\n const workflows = resolveComfyUIWorkflows(source);\n if (workflows.length === 0)\n return undefined;\n const activeName = typeof source.comfyuiActiveWorkflow === 'string' ? source.comfyuiActiveWorkflow.trim() : '';\n return workflows.find(workflow => workflow.name === activeName) ?? workflows[0];\n}\n/** Derive a workflow label that does not collide with the given existing names. */\nexport function uniqueComfyUIWorkflowName(name, existing) {\n const base = name.trim().length > 0 ? name.trim() : DEFAULT_COMFYUI_WORKFLOW_LABEL;\n if (!existing.includes(base))\n return base;\n for (let index = 2;; index += 1) {\n const candidate = `${base} (${index})`;\n if (!existing.includes(candidate))\n return candidate;\n }\n}\n/**\n * Combine a workflow's preset with the user prompt: preset first, user second,\n * joined by one comma — never doubled when the preset already ends in a\n * separator, and reduced to the non-empty side when the other is blank.\n */\nexport function mergeComfyUIPrompt(preset, user) {\n const presetText = typeof preset === 'string' ? preset.trim().replace(/[,;\\s]+$/, '') : '';\n const userText = user.trim();\n if (presetText.length === 0)\n return userText;\n if (userText.length === 0)\n return presetText;\n return `${presetText}, ${userText}`;\n}\nexport const DEFAULT_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_MODEL,\n dashscope: DEFAULT_DASHSCOPE_MODEL,\n comfyui: DEFAULT_COMFYUI_WORKFLOW_LABEL,\n};\nexport const DEFAULT_BASE_URLS = {\n google: DEFAULT_GOOGLE_ENDPOINT,\n openai: DEFAULT_OPENAI_BASE_URL,\n seedream: DEFAULT_SEEDREAM_BASE_URL,\n dashscope: DEFAULT_DASHSCOPE_ENDPOINT,\n comfyui: DEFAULT_COMFYUI_BASE_URL,\n};\n//# sourceMappingURL=shared.js.map","/** Pure ComfyUI API-workflow validation and placeholder injection. */\nimport { MAX_COMFYUI_WORKFLOW_BYTES } from './shared.js';\nexport const COMFYUI_PROMPT_PLACEHOLDER = '{{prompt}}';\nexport const COMFYUI_SEED_PLACEHOLDER = '{{seed}}';\nexport const COMFYUI_IMAGE_PLACEHOLDER = '{{image}}';\n/** Legacy single-percent placeholders from early releases, still accepted. */\nconst LEGACY_PROMPT_PLACEHOLDER = '%prompt%';\nconst LEGACY_SEED_PLACEHOLDER = '%seed%';\nconst LEGACY_IMAGE_PLACEHOLDER = '%image%';\n/** LoadImage-style input key that receives the uploaded source image name. */\nconst IMAGE_INPUT_KEY = 'image';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n const workflow = parseWorkflow(workflowJson);\n const imageInputs = countImagePlaceholders(workflow);\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain at most one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n}\n/**\n * Parse, clone, and inject one prompt plus an optional randomized seed.\n *\n * Prompt and seed placeholders are replaced inside any string so existing\n * workflows that embed them in longer text keep working. The image\n * placeholder is stricter: it only matches a dedicated `inputs.image` field\n * whose value is exactly the placeholder, and at most one may exist, because\n * the field must carry a single uploaded file name.\n */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed(), image) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n let replaced = value;\n if (replaced.includes(COMFYUI_PROMPT_PLACEHOLDER) || replaced.includes(LEGACY_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n replaced = replaced\n .replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt)\n .replaceAll(LEGACY_PROMPT_PLACEHOLDER, prompt);\n }\n if (replaced === COMFYUI_SEED_PLACEHOLDER || replaced === LEGACY_SEED_PLACEHOLDER)\n return seed;\n if (replaced.includes(COMFYUI_SEED_PLACEHOLDER) || replaced.includes(LEGACY_SEED_PLACEHOLDER)) {\n replaced = replaced\n .replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n .replaceAll(LEGACY_SEED_PLACEHOLDER, String(seed));\n }\n return replaced;\n }\n if (Array.isArray(value))\n return value.map(inject);\n if (!isRecord(value))\n return value;\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, inject(child)]));\n };\n let imageInputs = 0;\n const prepared = Object.fromEntries(Object.entries(workflow).map(([nodeId, value]) => {\n const node = record(value);\n const inputs = node === undefined ? undefined : record(node.inputs);\n if (inputs === undefined)\n return [nodeId, value];\n const nextInputs = inject(inputs);\n if (isImagePlaceholder(nextInputs[IMAGE_INPUT_KEY])) {\n imageInputs += 1;\n if (image !== undefined)\n nextInputs[IMAGE_INPUT_KEY] = image;\n }\n return [nodeId, { ...node, inputs: nextInputs }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n if (image === undefined) {\n if (imageInputs > 0) {\n throw new Error(`ComfyUI workflow contains an ${COMFYUI_IMAGE_PLACEHOLDER} image input, which requires edit_image with a source image`);\n }\n return prepared;\n }\n if (imageInputs === 0) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input to edit images`);\n }\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n return prepared;\n}\n/** Random seed in the 32-bit range ComfyUI samplers accept. */\nexport function randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\n}\nfunction parseWorkflow(workflowJson) {\n if (workflowJson.trim().length === 0)\n throw new Error('Import a ComfyUI API workflow JSON file in Settings before generating');\n if (new TextEncoder().encode(workflowJson).byteLength > MAX_COMFYUI_WORKFLOW_BYTES) {\n throw new Error('ComfyUI workflow file must be no larger than 5 MB');\n }\n let value;\n try {\n value = JSON.parse(workflowJson);\n }\n catch {\n throw new Error('ComfyUI workflow file is not valid JSON');\n }\n if (!isRecord(value) || Object.keys(value).length === 0) {\n throw new Error('ComfyUI workflow must be a non-empty API-format JSON object');\n }\n if (!Object.values(value).some(node => {\n const inputs = record(node)?.inputs;\n return inputs !== undefined && containsPromptPlaceholder(inputs);\n })) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} (or ${LEGACY_PROMPT_PLACEHOLDER}) in a text input`);\n }\n return value;\n}\n/** Count `inputs.image` fields that are exactly an image placeholder. */\nfunction countImagePlaceholders(workflow) {\n let count = 0;\n for (const node of Object.values(workflow)) {\n const inputs = record(record(node)?.inputs);\n if (inputs !== undefined && isImagePlaceholder(inputs[IMAGE_INPUT_KEY]))\n count += 1;\n }\n return count;\n}\nfunction isImagePlaceholder(value) {\n return value === COMFYUI_IMAGE_PLACEHOLDER || value === LEGACY_IMAGE_PLACEHOLDER;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string') {\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER) || value.includes(LEGACY_PROMPT_PLACEHOLDER);\n }\n if (Array.isArray(value))\n return value.some(containsPromptPlaceholder);\n return isRecord(value) && Object.values(value).some(containsPromptPlaceholder);\n}\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction record(value) {\n return isRecord(value) ? value : undefined;\n}\n//# sourceMappingURL=comfyui-workflow.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n const record = {\n ...item,\n createdAt: item.createdAt ?? Date.now(),\n };\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req = store.put(record);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English).\n */\nimport { useEffect, useState, useMemo } from 'react';\nimport { IMAGE_ROUTE } from '../shared.js';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n totalCount: '共 {count} 张生成图片',\n searchPlaceholder: '搜索 Prompt 关键词…',\n filterAll: '全部厂商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n filterComfyUI: '本地 ComfyUI',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或选择其他厂商。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n },\n en: {\n totalCount: '{count} images total',\n searchPlaceholder: 'Search prompt keywords…',\n filterAll: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n filterComfyUI: 'Local ComfyUI',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or provider filter.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n },\n};\nexport const GalleryViewTab = ({ locale }) => {\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n useEffect(() => {\n if (!previewItem)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape') {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [previewItem]);\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n if (selectedProvider !== 'all' && item.provider !== selectedProvider)\n return false;\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n if (!matchPrompt && !matchModel)\n return false;\n }\n return true;\n });\n }, [items, search, selectedProvider]);\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-gallery-page-header\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-page-title-row\", children: _jsx(\"span\", { className: \"dsh-ig-gallery-page-count\", children: t('totalCount', { count: String(items.length) }) }) }), _jsxs(\"div\", { className: \"dsh-ig-gallery-page-tools\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-search-wrap\", children: [_jsxs(\"svg\", { className: \"dsh-ig-gallery-search-icon\", width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"circle\", { cx: \"11\", cy: \"11\", r: \"8\" }), _jsx(\"line\", { x1: \"21\", y1: \"21\", x2: \"16.65\", y2: \"16.65\" })] }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-gallery-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(\"select\", { className: \"dsh-ig-gallery-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAll') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('filterComfyUI') })] })] })] }), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item) => (_jsx(GalleryCard, { item: item, t: t, onPreview: (url, blob) => {\n setPreviewItem(item);\n setPreviewUrl(url);\n setPreviewBlob(blob);\n }, onToast: showToast }, item.id))) })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), previewItem && previewUrl && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: _jsxs(\"svg\", { width: \"18\", height: \"18\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }), _jsx(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })] }) })] }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt }) }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: async () => {\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(previewItem.id);\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n showToast(t('deleted'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, t, onPreview, onToast }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-card\", onClick: () => {\n if (url && blob)\n onPreview(url, blob);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: async (e) => {\n e.stopPropagation();\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(item.id);\n onToast(t('deleted'));\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-header\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: item.provider }), item.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: item.model })) : null] }), _jsx(\"p\", { className: \"dsh-ig-gallery-card-prompt\", title: item.prompt, children: item.prompt })] })] }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","/**\n * Extract the verified durable image attachment from a completed tool result block.\n * Supports legacy rc.2 `resultView.content` and modern DSH `block.content`.\n */\nexport function imageRef(block) {\n if (!('kind' in block))\n return undefined;\n const fromResultView = block.resultView?.card === 'generic'\n ? block.resultView.content?.find(item => item.type === 'image')\n : undefined;\n if (fromResultView?.type === 'image')\n return fromResultView.attachment;\n const fromBlockContent = Array.isArray(block.content)\n ? block.content.find(item => item.type === 'image')\n : undefined;\n if (fromBlockContent?.type === 'image')\n return fromBlockContent.attachment;\n return undefined;\n}\n//# sourceMappingURL=image-ref.js.map","export const IMAGE_RESULT_NODE_KIND = 'dsh-image-result';\n/** Default definition: unknown transcript mode falls back to Compact-safe anchoring. */\nexport const imageResultDefinition = createImageResultDefinition();\n/**\n * One image result row per Turn, anchored at its own tool/result position while\n * the Turn runs, then optionally re-anchored beside the final answer once the\n * Turn closes (only needed under the folding Compact transcript view).\n */\nexport function createImageResultDefinition(options = {}) {\n return {\n kind: IMAGE_RESULT_NODE_KIND,\n target: 'chat',\n match: (event) => {\n const turn = eventTurn(event);\n if (turn === undefined)\n return null;\n if (event.type === 'turn/start')\n return { id: String(turn), role: 'start' };\n if (event.type === 'turn/end')\n return { id: String(turn), role: 'update' };\n if (event.type === 'assistant/message')\n return { id: String(turn), role: 'update' };\n if (event.type === 'tool/result' && imageResultFromMeta(event.data.meta) !== undefined) {\n return { id: String(turn), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n const turn = eventTurn(match.event);\n if (match.event.type !== 'turn/start' || turn === undefined) {\n throw new Error('dsh-image-result start requires turn/start');\n }\n return { turn, results: [] };\n },\n update: (context, match) => {\n if (match.event.type === 'turn/end')\n return { ...context.state, endSeq: match.event.seq };\n if (match.event.type === 'assistant/message')\n return { ...context.state, answerSeq: match.event.seq };\n if (match.event.type !== 'tool/result')\n return context.state;\n const result = imageResultFromMeta(match.event.data.meta);\n if (result === undefined)\n return context.state;\n if (context.state.results.some(candidate => candidate.attachment.attachmentId === result.attachment.attachmentId)) {\n return context.state;\n }\n return { ...context.state, results: [...context.state.results, { ...result, seq: match.event.seq }] };\n },\n buildViewNode: (context) => {\n const state = context.state;\n const last = state?.results.at(-1);\n if (state === undefined || last === undefined)\n return null;\n const location = context.matches.at(-1)?.location ?? context.start?.location ?? { kind: 'unresolved' };\n return {\n key: context.key,\n kind: IMAGE_RESULT_NODE_KIND,\n id: context.id,\n target: 'chat',\n // While the Turn is open the artifact stays at its own tool/result\n // position, so later messages in the same Turn order below it. Once the\n // Turn closes, Compact folds every node before the finalized answer\n // boundary, so the artifact re-anchors beside that answer to stay\n // visible; Normal mode has no folding and keeps the natural position.\n // An unknown transcript mode falls back to the Compact-safe behavior.\n anchorSeq: state.endSeq !== undefined && compactTranscript(options)\n ? state.answerSeq ?? state.endSeq ?? last.seq\n : last.seq,\n location,\n visibility: 'visible',\n data: {\n turn: state.turn,\n results: state.results.map(({ seq: _seq, ...result }) => result),\n },\n };\n },\n };\n}\nfunction compactTranscript(options) {\n try {\n return options.isCompactTranscript?.() ?? true;\n }\n catch {\n return true;\n }\n}\n/** Parse the plugin-owned durable presentation metadata from a Tool result event. */\nexport function imageResultFromMeta(value) {\n const meta = record(value);\n if (meta?.kind !== 'dsh-image-gen')\n return undefined;\n const attachment = imageAttachment(meta.attachment);\n if (attachment === undefined)\n return undefined;\n return {\n attachment,\n prompt: stringValue(meta.prompt, 'Generated Image'),\n provider: stringValue(meta.provider, 'google'),\n model: stringValue(meta.model, ''),\n output: stringValue(meta.output, ''),\n ...(typeof meta.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction eventTurn(event) {\n const turn = event.data.turn;\n return typeof turn === 'number' && Number.isSafeInteger(turn) && turn >= 0 ? turn : undefined;\n}\nfunction imageAttachment(value) {\n const candidate = record(value);\n if (candidate === undefined\n || typeof candidate.attachmentId !== 'string'\n || !isImageMediaType(candidate.mediaType)\n || !positiveInteger(candidate.bytes)\n || !positiveInteger(candidate.width)\n || !positiveInteger(candidate.height))\n return undefined;\n const original = record(candidate.originalDimensions);\n if (candidate.originalDimensions !== undefined\n && (original === undefined || !positiveInteger(original.width) || !positiveInteger(original.height)))\n return undefined;\n return {\n attachmentId: candidate.attachmentId,\n mediaType: candidate.mediaType,\n bytes: candidate.bytes,\n width: candidate.width,\n height: candidate.height,\n ...(typeof candidate.name === 'string' ? { name: candidate.name } : {}),\n ...(original === undefined ? {} : { originalDimensions: { width: original.width, height: original.height } }),\n };\n}\nfunction isImageMediaType(value) {\n return value === 'image/png' || value === 'image/jpeg' || value === 'image/webp' || value === 'image/gif';\n}\nfunction positiveInteger(value) {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\nfunction stringValue(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction record(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value\n : undefined;\n}\n//# sourceMappingURL=image-result-node.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, activeComfyUIWorkflow, resolveComfyUIWorkflows, uniqueComfyUIWorkflowName, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nimport { imageRef } from './image-ref.js';\nimport { IMAGE_RESULT_NODE_KIND, createImageResultDefinition, } from './image-result-node.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n providerComfyUI: '本地 ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: '留空即可保留已配置的 Key',\n apiKeyHint: '安全保存为 {key};页面不会读回明文。',\n endpoint: '接口地址',\n reset: '重置',\n resetTitle: '重置为默认官方地址',\n endpointHintGoogle: 'Google 官方地址或反代端点(全路径)。',\n endpointHintOpenAI: '中转站请填其 OpenAI 兼容的 /v1 地址。',\n endpointHintSeedream: '火山方舟兼容的 /api/v3 地址。',\n endpointHintDashScope: '阿里云百炼 DashScope 官方接口地址。',\n endpointHintComfyUI: '正在运行且 DSH Host 可以访问的 ComfyUI 地址,默认使用本机 8188 端口。',\n model: '模型',\n workflow: 'API Workflow 工作流',\n workflowImport: '导入 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '从 ComfyUI 导出 API Format JSON,在提示词输入写入 {{prompt}},种子可用 {{seed}};图生图工作流在 LoadImage 的 image 输入写入 {{image}}(仅一次)。可导入多个工作流,Agent 也能在调用时按名称指定。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\n workflowActiveTitle: '设为当前使用的工作流',\n workflowRemove: '删除',\n workflowPresetPlaceholder: '预设提示词,留空则只用对话内容',\n workflowPresetTitle: '预设提示词:每次调用此工作流时自动加在用户提示词前面。',\n workflowNameRequired: '工作流名称不能为空。',\n workflowDuplicateName: '工作流名称不能重复。',\n timeout: '生成超时(秒)',\n timeoutHint: '包括提交、等待和下载图片;默认 300 秒。',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n resultShown: '图片结果已显示在对话中',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n providerComfyUI: 'Local ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: 'Leave empty to keep configured key',\n apiKeyHint: 'Securely saved as {key}; never read back in plaintext.',\n endpoint: 'Endpoint / Base URL',\n reset: 'Reset',\n resetTitle: 'Reset to official default URL',\n endpointHintGoogle: 'Official Google endpoint or reverse proxy (full path).',\n endpointHintOpenAI: 'OpenAI-compatible /v1 base URL for relays.',\n endpointHintSeedream: 'Volcengine Ark compatible /api/v3 base URL.',\n endpointHintDashScope: 'Official Aliyun DashScope endpoint.',\n endpointHintComfyUI: 'A running ComfyUI server reachable by the DSH Host; the default points to port 8188 on this computer.',\n model: 'Model',\n workflow: 'API Workflows',\n workflowImport: 'Import JSON file',\n workflowMissing: 'No workflow imported',\n workflowImported: 'Imported {name}',\n workflowHint: 'Export an API Format JSON from ComfyUI and place {{prompt}} in its prompt input; {{seed}} is available for a random seed. For image editing put {{image}} (exactly once) in the LoadImage image input. Import as many workflows as you need; the Agent can also pick one by name.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\n workflowActiveTitle: 'Make this the active workflow',\n workflowRemove: 'Remove',\n workflowPresetPlaceholder: 'Preset prompt (optional)',\n workflowPresetTitle: 'Preset prompt: automatically prepended to the user prompt on every call of this workflow.',\n workflowNameRequired: 'Workflow names cannot be empty.',\n workflowDuplicateName: 'Workflow names must be unique.',\n timeout: 'Generation timeout (seconds)',\n timeoutHint: 'Covers submission, waiting, and image download; defaults to 300 seconds.',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n resultShown: 'Image result is shown in the conversation',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\n.dsh-ig-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.dsh-ig-file-button{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font-size:13px;cursor:pointer;transition:background .15s,border-color .15s}\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\n.dsh-ig-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,inherit);font-size:12px}\n.dsh-ig-workflow-list{list-style:none;margin:0;padding:0;display:grid;gap:8px}\n.dsh-ig-workflow-row{display:flex;flex-direction:column;gap:6px;padding:8px;border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px}\n.dsh-ig-workflow-main{display:flex;align-items:center;gap:8px}\n.dsh-ig-workflow-active{display:inline-flex;align-items:center;cursor:pointer;flex:none}\n.dsh-ig-workflow-active input[type=radio]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0;cursor:pointer}\n.dsh-ig-workflow-name{flex:1;min-width:0}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-status-error{color:var(--dsw-alias-label-error,#d33);font-weight:500}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-promoted-results{display:grid;gap:16px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n.dsh-ig-gallery-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 28px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-page-count{font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#4b5563);background:var(--dsw-alias-bg-layer-3,#f3f4f6);padding:3px 10px;border-radius:20px}\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\n.dsh-ig-gallery-search-input{padding:6px 12px 6px 32px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;width:200px;transition:border-color .15s,width .2s}\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\n.dsh-ig-gallery-select{padding:6px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;cursor:pointer}\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.06);border-color:var(--dsw-alias-border-l1,#cfd4dc)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f3f4f6;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:4px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.68);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n.dsh-ig-gallery-card-meta{padding:12px 14px;display:flex;flex-direction:column;gap:6px;background:var(--dsw-alias-bg-layer-2,#fff);flex:1}\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-gallery-card-prompt{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-primary,inherit);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end;border-top:1px solid rgba(255,255,255,0.1);padding-top:8px}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Hide floating chat composer when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n // Host-owned chat transcript preference (\"ui-chat\" transcriptView). Unknown,\n // unavailable, or not-yet-loaded reads fall back to Compact-safe anchoring.\n const chatScope = ctx.settingsScope.bind({ namespace: 'ui-chat' });\n const isCompactTranscript = () => chatScope.getSnapshot().value?.transcriptView !== 'normal';\n const locale = ctx.get('locale');\n const promotion = { enabled: false };\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = STYLE;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n ctx.inject(['uiConversation'], (owner) => {\n const uiConversation = asModernUiConversation(owner.get('uiConversation'));\n if (uiConversation === undefined) {\n throw new Error('dsh-image-gen: uiConversation has an incompatible interface');\n }\n promotion.enabled = true;\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.effect(() => uiConversation.events.register(createImageResultDefinition({ isCompactTranscript })), 'dsh-image-gen: promoted image result node');\n owner.slots.inject('conversation.chat.node', () => ownerRegister({\n name: 'conversation.chat.node',\n key: IMAGE_RESULT_NODE_KIND,\n inject: () => ({ locale }),\n }, PromotedImageResultNode));\n });\n // 1. Settings item\n const injectSettingsItem = (owner, credentials) => {\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.slots.inject('settings.plugin.item', () => ownerRegister({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\n };\n const remoteCredentials = asCredentialsRemote(ctx.get('remote.credentials'));\n const legacyCredentials = credentialsFromLegacyConnection(ctx.get('connection'));\n if (remoteCredentials !== undefined) {\n injectSettingsItem(ctx, remoteCredentials);\n }\n else if (legacyCredentials !== undefined) {\n injectSettingsItem(ctx, legacyCredentials);\n }\n else {\n ctx.inject(['remote.credentials'], (remoteCtx) => {\n const credentials = asCredentialsRemote(remoteCtx.get('remote.credentials'));\n if (credentials === undefined)\n throw new Error('dsh-image-gen: remote.credentials has an incompatible interface');\n injectSettingsItem(remoteCtx, credentials);\n });\n }\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\nfunction asModernUiConversation(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const events = value.events;\n if (events === null || typeof events !== 'object')\n return undefined;\n return typeof events.register === 'function'\n ? value\n : undefined;\n}\nfunction asCredentialsRemote(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const candidate = value;\n return typeof candidate.describe === 'function' && typeof candidate.set === 'function'\n ? candidate\n : undefined;\n}\nfunction credentialsFromLegacyConnection(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const credentials = value.api?.credentials;\n if (credentials === undefined || typeof credentials.describe !== 'function' || typeof credentials.set !== 'function')\n return undefined;\n const legacy = credentials;\n return {\n async describe(refs) {\n const response = await legacy.describe({ refs });\n return response.result.ok\n ? { ok: true, value: response.result.value.credentials }\n : { ok: false };\n },\n async set(ref, credentialValue) {\n const response = await legacy.set({ ref, value: credentialValue });\n return response.result.ok\n ? { ok: true }\n : { ok: false, error: response.result.error };\n },\n };\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [workflows, setWorkflows] = useState([]);\n const [activeWorkflow, setActiveWorkflow] = useState('');\n const [timeoutSeconds, setTimeoutSeconds] = useState(DEFAULT_COMFYUI_TIMEOUT_MS / 1000);\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n const [messageIsError, setMessageIsError] = useState(false);\n const reportMessage = (text) => { setMessage(text); setMessageIsError(false); };\n const reportError = (text) => { setMessage(text); setMessageIsError(true); };\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n comfyui: t('providerComfyUI'),\n };\n useEffect(() => {\n const value = snapshot.value;\n const next = value?.provider ?? 'google';\n setProvider(next);\n setModel(modelOf(next, value));\n setBaseURL(baseURLOf(next, value));\n setWorkflows(resolveComfyUIWorkflows(value ?? {}));\n setActiveWorkflow(activeComfyUIWorkflow(value ?? {})?.name ?? '');\n setTimeoutSeconds(Math.max(1, Math.round((value?.comfyuiTimeoutMs ?? DEFAULT_COMFYUI_TIMEOUT_MS) / 1000)));\n setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined) {\n setConfigured(undefined);\n return;\n }\n let active = true;\n void props.credentials.describe([keyRef]).then(response => {\n if (active)\n setConfigured(response.ok ? response.value?.[keyRef]?.configured ?? false : undefined);\n }).catch(() => { if (active)\n setConfigured(undefined); });\n return () => { active = false; };\n }, [props.credentials, provider]);\n const save = async (event) => {\n event.preventDefault();\n setSaving(true);\n setMessage('');\n try {\n await props.scope.set('provider', provider);\n if (provider === 'comfyui') {\n const entries = workflows.map(entry => ({ name: entry.name.trim(), json: entry.json, presetPrompt: (entry.presetPrompt ?? '').trim() }));\n for (const entry of entries) {\n if (entry.name.length === 0)\n throw new Error(t('workflowNameRequired'));\n validateComfyUIWorkflowJson(entry.json);\n }\n if (new Set(entries.map(entry => entry.name)).size !== entries.length)\n throw new Error(t('workflowDuplicateName'));\n const activeEntry = entries.find(entry => entry.name === activeWorkflow) ?? entries[0];\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflows', entries);\n await props.scope.set('comfyuiActiveWorkflow', activeEntry === undefined ? '' : activeEntry.name);\n // Keep the legacy single-workflow fields in sync so older plugin versions keep working.\n await props.scope.set('comfyuiWorkflowJson', activeEntry === undefined ? '' : activeEntry.json);\n await props.scope.set('comfyuiWorkflowName', activeEntry === undefined ? '' : activeEntry.name);\n await props.scope.set('comfyuiTimeoutMs', Math.max(1, Math.round(timeoutSeconds)) * 1000);\n }\n else {\n await props.scope.set(provider === 'google' ? 'googleModel' : provider === 'openai' ? 'openaiModel' : provider === 'seedream' ? 'seedreamModel' : 'dashscopeModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : provider === 'seedream' ? 'seedreamBaseURL' : 'dashscopeEndpoint', baseURL);\n }\n await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined)\n throw new Error('ComfyUI does not use an API key in this version');\n const response = await props.credentials.set(keyRef, key.trim());\n if (!response.ok)\n throw new Error(response.error?.message ?? 'Failed to save API key');\n setKey('');\n setConfigured(true);\n }\n reportMessage(t('saved'));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n const workflowStatus = activeWorkflow.length > 0 ? t('workflowImported', { name: activeWorkflow }) : t('workflowMissing');\n const importWorkflow = async (event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file === undefined)\n return;\n reportMessage('');\n try {\n if (file.size > MAX_COMFYUI_WORKFLOW_BYTES)\n throw new Error(t('workflowTooLarge'));\n const json = await file.text();\n validateComfyUIWorkflowJson(json);\n const name = uniqueComfyUIWorkflowName(file.name, workflows.map(entry => entry.name));\n setWorkflows(current => [...current, { name, json }]);\n setActiveWorkflow(current => current.length > 0 ? current : name);\n reportMessage(t('workflowImported', { name }));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n /** Renaming the active entry keeps the active selection following its new name. */\n const renameWorkflow = (index, name) => {\n const previous = workflows[index];\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, name } : entry));\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(name);\n };\n /** Removing the active entry moves the selection to the first remaining workflow. */\n const removeWorkflow = (index) => {\n const previous = workflows[index];\n const next = workflows.filter((_entry, position) => position !== index);\n setWorkflows(next);\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(next[0]?.name ?? '');\n };\n /** Editing one entry's preset leaves the rest of the entry untouched. */\n const setWorkflowPreset = (index, presetPrompt) => {\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, presetPrompt } : entry));\n };\n return (_jsxs(\"li\", { className: `dsh-ig-card ${open ? 'dsh-ig-card-open' : ''}`, children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-head\", \"aria-expanded\": open, onClick: () => { setOpen(value => !value); }, children: [_jsxs(\"span\", { className: \"dsh-ig-head-text\", children: [_jsx(\"span\", { className: \"dsh-ig-title\", children: t('title') }), _jsx(\"span\", { className: \"dsh-ig-desc\", children: t('description') })] }), _jsx(\"span\", { className: `dsh-ig-chevron ${open ? 'dsh-ig-chevron-open' : ''}`, \"aria-hidden\": \"true\", children: _jsx(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: _jsx(\"path\", { d: \"M4 6l4 4 4-4\" }) }) })] }), open ? (_jsxs(\"form\", { className: \"dsh-ig-body\", onSubmit: (event) => { void save(event); }, children: [_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('provider') }), _jsxs(\"select\", { className: \"dsh-ig-input\", value: provider, onChange: event => { const next = event.target.value; setProvider(next); setModel(modelOf(next, snapshot.value)); setBaseURL(baseURLOf(next, snapshot.value)); setKey(''); }, children: [_jsx(\"option\", { value: \"google\", children: t('providerGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('providerOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('providerSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('providerDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('providerComfyUI') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('apiKeyLabel', { provider: providerLabels[provider] }) }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"password\", autoComplete: \"off\", value: key, onChange: event => { setKey(event.target.value); }, placeholder: configured ? t('apiKeyPlaceholder') : '' }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('apiKeyHint', { key: KEY_REF[provider] ?? '' }) })] }) : null, _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('endpoint') }), _jsxs(\"div\", { className: \"dsh-ig-input-group\", children: [_jsx(\"input\", { className: \"dsh-ig-input\", type: \"url\", value: baseURL, onChange: event => { setBaseURL(event.target.value); }, required: true }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", title: t('resetTitle'), onClick: () => { setBaseURL(DEFAULT_BASE_URLS[provider]); }, children: t('reset') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: provider === 'google' ? t('endpointHintGoogle') : provider === 'openai' ? t('endpointHintOpenAI') : provider === 'seedream' ? t('endpointHintSeedream') : provider === 'dashscope' ? t('endpointHintDashScope') : t('endpointHintComfyUI') })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('model') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: model, onChange: event => { setModel(event.target.value); }, required: true })] }) : (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('workflow') }), _jsxs(\"div\", { className: \"dsh-ig-file-row\", children: [_jsxs(\"label\", { className: \"dsh-ig-file-button\", children: [_jsx(\"input\", { className: \"dsh-ig-file-input\", type: \"file\", accept: \".json,application/json\", onChange: event => { void importWorkflow(event); } }), t('workflowImport')] }), workflows.length === 0 ? _jsx(\"span\", { className: \"dsh-ig-file-name\", children: t('workflowMissing') }) : null] }), workflows.length > 0 ? (_jsx(\"ul\", { className: \"dsh-ig-workflow-list\", children: workflows.map((entry, index) => (_jsxs(\"li\", { className: \"dsh-ig-workflow-row\", children: [_jsxs(\"div\", { className: \"dsh-ig-workflow-main\", children: [_jsx(\"label\", { className: \"dsh-ig-workflow-active\", title: t('workflowActiveTitle'), children: _jsx(\"input\", { type: \"radio\", name: \"dsh-ig-active-workflow\", \"aria-label\": t('workflowActiveTitle'), checked: entry.name === activeWorkflow, onChange: () => { setActiveWorkflow(entry.name); } }) }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-name\", value: entry.name, title: entry.name, onChange: event => { renameWorkflow(index, event.target.value); } }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", onClick: () => { removeWorkflow(index); }, children: t('workflowRemove') })] }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-preset\", value: entry.presetPrompt ?? '', placeholder: t('workflowPresetPlaceholder'), title: t('workflowPresetTitle'), onChange: event => { setWorkflowPreset(index, event.target.value); } })] }, String(index)))) })) : null, _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('workflowHint') })] }), _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('timeout') }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"number\", min: \"1\", max: \"3600\", step: \"1\", value: timeoutSeconds, onChange: event => { setTimeoutSeconds(Number(event.target.value)); }, required: true }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('timeoutHint') })] })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: `dsh-ig-status${messageIsError ? ' dsh-ig-status-error' : ''}`, role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflows.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */\nexport function GeneratedImageCard(props) {\n const result = imageResultFromBlock(props.block);\n if (props.promoted && result !== undefined)\n return _jsx(PromotedResultNotice, { locale: props.locale });\n return _jsx(ImageResultCard, { result: result, locale: props.locale });\n}\n/** Render modern image artifacts as final conversation output instead of Tool process content. */\nexport function PromotedImageResultNode(props) {\n return _jsx(\"div\", { className: \"dsh-ig-promoted-results\", children: props.node.data.results.map(result => _jsx(ImageResultCard, { result: result, locale: props.locale }, result.attachment.attachmentId)) });\n}\nfunction PromotedResultNotice({ locale }) {\n const lang = usePluginLanguage(locale);\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: DICT[lang].resultShown });\n}\nfunction ImageResultCard({ result, locale, }) {\n const attachment = result?.attachment;\n const savedTo = result?.savedTo;\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const lang = usePluginLanguage(locale);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (result === undefined)\n return;\n void saveGalleryItem({\n id: result.attachment.attachmentId,\n attachment: result.attachment,\n prompt: result.prompt,\n provider: result.provider,\n model: result.model,\n output: result.output,\n ...(result.seed !== undefined ? { seed: result.seed } : {}),\n });\n }, [result?.attachment.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), savedTo !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-savedto\", children: [t('savedToPath'), \": \", savedTo] }) : null, error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction usePluginLanguage(locale) {\n const [lang, setLang] = useState(() => locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n useEffect(() => locale?.subscribe?.(() => {\n setLang(locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n }), [locale]);\n return lang;\n}\nfunction imageResultFromBlock(block) {\n const attachment = imageRef(block);\n if (attachment === undefined)\n return undefined;\n const blockValue = block;\n const meta = blockValue.meta ?? blockValue.resultView?.meta;\n return {\n attachment,\n prompt: typeof meta?.prompt === 'string' ? meta.prompt : blockValue.call?.args?.prompt ?? 'Generated Image',\n provider: typeof meta?.provider === 'string' ? meta.provider : 'google',\n model: typeof meta?.model === 'string' ? meta.model : '',\n output: typeof meta?.output === 'string' ? meta.output : '',\n ...(typeof meta?.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta?.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : activeComfyUIWorkflow(value ?? {})?.name;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_MODELS[provider];\n}\nfunction baseURLOf(provider, value) {\n const stored = provider === 'google' ? value?.googleEndpoint : provider === 'openai' ? value?.openaiBaseURL : provider === 'seedream' ? value?.seedreamBaseURL : provider === 'dashscope' ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["record","createContext","useContext","forwardRef","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Image","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","DICT","useState","useRef","useMemo","_jsxs","_jsx","ImageIcon","AlertTriangle","useState","_jsxs","_jsx","_Fragment"],"sources":["types/shared.js","types/comfyui-workflow.js","types/client/gallery-store.js","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/context.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-left.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/copy.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file-text.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/git-compare.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/heart.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/list-todo.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/triangle-alert.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.mjs","types/client/gallery-view.js","types/client/image-ref.js","types/client/image-result-node.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Browser route used for deleting generated images and workspace files. */\nexport const DELETE_ROUTE = '/plugins/dsh-image-gen/delete';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope', 'comfyui'];\n/** Default endpoints and base URLs. */\nexport const DEFAULT_GOOGLE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/interactions';\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_SEEDREAM_BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_DASHSCOPE_ENDPOINT = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_COMFYUI_BASE_URL = 'http://127.0.0.1:8188';\nexport const DEFAULT_COMFYUI_TIMEOUT_MS = 300_000;\nexport const DEFAULT_COMFYUI_WORKFLOW_LABEL = 'API workflow';\nexport const MAX_COMFYUI_WORKFLOW_BYTES = 5 * 1024 * 1024;\n/** Default model names. */\nexport const DEFAULT_GOOGLE_MODEL = 'gemini-3.1-flash-image';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-image-2';\nexport const DEFAULT_SEEDREAM_MODEL = 'doubao-seedream-5-0-260128';\nexport const DEFAULT_DASHSCOPE_MODEL = 'qwen-image-3.0';\n/** Named workflows, falling back to the legacy single-workflow fields when the list is empty. */\nexport function resolveComfyUIWorkflows(source) {\n const named = [];\n for (const entry of source.comfyuiWorkflows ?? []) {\n const name = typeof entry?.name === 'string' ? entry.name.trim() : '';\n const json = typeof entry?.json === 'string' ? entry.json : '';\n if (name.length > 0 && json.trim().length > 0) {\n const presetPrompt = typeof entry.presetPrompt === 'string' ? entry.presetPrompt.trim() : '';\n named.push(presetPrompt.length > 0 ? { name, json, presetPrompt } : { name, json });\n }\n }\n if (named.length > 0)\n return named;\n const legacyJson = typeof source.comfyuiWorkflowJson === 'string' ? source.comfyuiWorkflowJson : '';\n if (legacyJson.trim().length === 0)\n return [];\n const legacyName = typeof source.comfyuiWorkflowName === 'string' ? source.comfyuiWorkflowName.trim() : '';\n return [{ name: legacyName.length > 0 ? legacyName : DEFAULT_COMFYUI_WORKFLOW_LABEL, json: legacyJson }];\n}\n/** The workflow ComfyUI calls use by default: the configured active name, else the first entry. */\nexport function activeComfyUIWorkflow(source) {\n const workflows = resolveComfyUIWorkflows(source);\n if (workflows.length === 0)\n return undefined;\n const activeName = typeof source.comfyuiActiveWorkflow === 'string' ? source.comfyuiActiveWorkflow.trim() : '';\n return workflows.find(workflow => workflow.name === activeName) ?? workflows[0];\n}\n/** Derive a workflow label that does not collide with the given existing names. */\nexport function uniqueComfyUIWorkflowName(name, existing) {\n const base = name.trim().length > 0 ? name.trim() : DEFAULT_COMFYUI_WORKFLOW_LABEL;\n if (!existing.includes(base))\n return base;\n for (let index = 2;; index += 1) {\n const candidate = `${base} (${index})`;\n if (!existing.includes(candidate))\n return candidate;\n }\n}\n/**\n * Combine a workflow's preset with the user prompt: preset first, user second,\n * joined by one comma — never doubled when the preset already ends in a\n * separator, and reduced to the non-empty side when the other is blank.\n */\nexport function mergeComfyUIPrompt(preset, user) {\n const presetText = typeof preset === 'string' ? preset.trim().replace(/[,;\\s]+$/, '') : '';\n const userText = user.trim();\n if (presetText.length === 0)\n return userText;\n if (userText.length === 0)\n return presetText;\n return `${presetText}, ${userText}`;\n}\nexport const DEFAULT_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_MODEL,\n dashscope: DEFAULT_DASHSCOPE_MODEL,\n comfyui: DEFAULT_COMFYUI_WORKFLOW_LABEL,\n};\nexport const DEFAULT_BASE_URLS = {\n google: DEFAULT_GOOGLE_ENDPOINT,\n openai: DEFAULT_OPENAI_BASE_URL,\n seedream: DEFAULT_SEEDREAM_BASE_URL,\n dashscope: DEFAULT_DASHSCOPE_ENDPOINT,\n comfyui: DEFAULT_COMFYUI_BASE_URL,\n};\n//# sourceMappingURL=shared.js.map","/** Pure ComfyUI API-workflow validation and placeholder injection. */\nimport { MAX_COMFYUI_WORKFLOW_BYTES } from './shared.js';\nexport const COMFYUI_PROMPT_PLACEHOLDER = '{{prompt}}';\nexport const COMFYUI_SEED_PLACEHOLDER = '{{seed}}';\nexport const COMFYUI_IMAGE_PLACEHOLDER = '{{image}}';\n/** Legacy single-percent placeholders from early releases, still accepted. */\nconst LEGACY_PROMPT_PLACEHOLDER = '%prompt%';\nconst LEGACY_SEED_PLACEHOLDER = '%seed%';\nconst LEGACY_IMAGE_PLACEHOLDER = '%image%';\n/** LoadImage-style input key that receives the uploaded source image name. */\nconst IMAGE_INPUT_KEY = 'image';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n const workflow = parseWorkflow(workflowJson);\n const imageInputs = countImagePlaceholders(workflow);\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain at most one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n}\n/**\n * Parse, clone, and inject one prompt plus an optional randomized seed.\n *\n * Prompt and seed placeholders are replaced inside any string so existing\n * workflows that embed them in longer text keep working. The image\n * placeholder is stricter: it only matches a dedicated `inputs.image` field\n * whose value is exactly the placeholder, and at most one may exist, because\n * the field must carry a single uploaded file name.\n */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed(), image) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n let replaced = value;\n if (replaced.includes(COMFYUI_PROMPT_PLACEHOLDER) || replaced.includes(LEGACY_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n replaced = replaced\n .replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt)\n .replaceAll(LEGACY_PROMPT_PLACEHOLDER, prompt);\n }\n if (replaced === COMFYUI_SEED_PLACEHOLDER || replaced === LEGACY_SEED_PLACEHOLDER)\n return seed;\n if (replaced.includes(COMFYUI_SEED_PLACEHOLDER) || replaced.includes(LEGACY_SEED_PLACEHOLDER)) {\n replaced = replaced\n .replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n .replaceAll(LEGACY_SEED_PLACEHOLDER, String(seed));\n }\n return replaced;\n }\n if (Array.isArray(value))\n return value.map(inject);\n if (!isRecord(value))\n return value;\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, inject(child)]));\n };\n let imageInputs = 0;\n const prepared = Object.fromEntries(Object.entries(workflow).map(([nodeId, value]) => {\n const node = record(value);\n const inputs = node === undefined ? undefined : record(node.inputs);\n if (inputs === undefined)\n return [nodeId, value];\n const nextInputs = inject(inputs);\n if (isImagePlaceholder(nextInputs[IMAGE_INPUT_KEY])) {\n imageInputs += 1;\n if (image !== undefined)\n nextInputs[IMAGE_INPUT_KEY] = image;\n }\n return [nodeId, { ...node, inputs: nextInputs }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n if (image === undefined) {\n if (imageInputs > 0) {\n throw new Error(`ComfyUI workflow contains an ${COMFYUI_IMAGE_PLACEHOLDER} image input, which requires edit_image with a source image`);\n }\n return prepared;\n }\n if (imageInputs === 0) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input to edit images`);\n }\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n return prepared;\n}\n/** Random seed in the 32-bit range ComfyUI samplers accept. */\nexport function randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\n}\nfunction parseWorkflow(workflowJson) {\n if (workflowJson.trim().length === 0)\n throw new Error('Import a ComfyUI API workflow JSON file in Settings before generating');\n if (new TextEncoder().encode(workflowJson).byteLength > MAX_COMFYUI_WORKFLOW_BYTES) {\n throw new Error('ComfyUI workflow file must be no larger than 5 MB');\n }\n let value;\n try {\n value = JSON.parse(workflowJson);\n }\n catch {\n throw new Error('ComfyUI workflow file is not valid JSON');\n }\n if (!isRecord(value) || Object.keys(value).length === 0) {\n throw new Error('ComfyUI workflow must be a non-empty API-format JSON object');\n }\n if (!Object.values(value).some(node => {\n const inputs = record(node)?.inputs;\n return inputs !== undefined && containsPromptPlaceholder(inputs);\n })) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} (or ${LEGACY_PROMPT_PLACEHOLDER}) in a text input`);\n }\n return value;\n}\n/** Count `inputs.image` fields that are exactly an image placeholder. */\nfunction countImagePlaceholders(workflow) {\n let count = 0;\n for (const node of Object.values(workflow)) {\n const inputs = record(record(node)?.inputs);\n if (inputs !== undefined && isImagePlaceholder(inputs[IMAGE_INPUT_KEY]))\n count += 1;\n }\n return count;\n}\nfunction isImagePlaceholder(value) {\n return value === COMFYUI_IMAGE_PLACEHOLDER || value === LEGACY_IMAGE_PLACEHOLDER;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string') {\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER) || value.includes(LEGACY_PROMPT_PLACEHOLDER);\n }\n if (Array.isArray(value))\n return value.some(containsPromptPlaceholder);\n return isRecord(value) && Object.values(value).some(containsPromptPlaceholder);\n}\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction record(value) {\n return isRecord(value) ? value : undefined;\n}\n//# sourceMappingURL=comfyui-workflow.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n * Preserves existing isFavorite, tags, and original createdAt on re-renders.\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const getReq = store.get(item.id);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n const fav = item.isFavorite !== undefined ? item.isFavorite : existing?.isFavorite;\n const userTags = item.tags !== undefined ? item.tags : existing?.tags;\n const savedPath = item.savedTo !== undefined ? item.savedTo : existing?.savedTo;\n const record = {\n ...existing,\n ...item,\n // Preserve original generation timestamp if already recorded\n createdAt: existing?.createdAt ?? item.createdAt ?? Date.now(),\n ...(fav !== undefined ? { isFavorite: fav } : {}),\n ...(userTags !== undefined ? { tags: userTags } : {}),\n ...(savedPath !== undefined ? { savedTo: savedPath } : {}),\n };\n const putReq = store.put(record);\n putReq.onsuccess = () => resolve();\n putReq.onerror = () => reject(putReq.error);\n };\n getReq.onerror = () => reject(getReq.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Toggle favorite status of a gallery item.\n * Returns the new favorite status (true if favorited, false if unfavorited).\n */\nexport async function toggleFavoriteGalleryItem(id) {\n try {\n const db = await getDB();\n const newStatus = await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n const item = getReq.result;\n if (!item) {\n resolve(false);\n return;\n }\n const nextFavorite = !item.isFavorite;\n item.isFavorite = nextFavorite;\n const putReq = store.put(item);\n putReq.onsuccess = () => resolve(nextFavorite);\n putReq.onerror = () => reject(putReq.error);\n };\n getReq.onerror = () => reject(getReq.error);\n });\n notifyListeners();\n return newStatus;\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to toggle favorite item in IndexedDB:', err);\n return false;\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Bulk delete multiple gallery records by IDs and record tombstones in a single transaction.\n */\nexport async function bulkDeleteGalleryItems(ids) {\n if (ids.length === 0)\n return;\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n const now = Date.now();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n for (const id of ids) {\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: now });\n }\n tx.oncomplete = () => {\n for (const id of ids) {\n tombstones.add(id);\n }\n resolve();\n };\n tx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed'));\n tx.onabort = () => reject(tx.error ?? new Error('IndexedDB transaction aborted'));\n });\n notifyListeners();\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"18\", cy: \"18\", r: \"3\", key: \"1xkwt0\" }],\n [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M13 6h3a2 2 0 0 1 2 2v7\", key: \"1yeb86\" }],\n [\"path\", { d: \"M11 18H8a2 2 0 0 1-2-2V9\", key: \"19pyzm\" }]\n];\nconst GitCompare = createLucideIcon(\"git-compare\", __iconNode);\n\nexport { __iconNode, GitCompare as default };\n//# sourceMappingURL=git-compare.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\",\n key: \"mvr1a0\"\n }\n ]\n];\nconst Heart = createLucideIcon(\"heart\", __iconNode);\n\nexport { __iconNode, Heart as default };\n//# sourceMappingURL=heart.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n];\nconst ListTodo = createLucideIcon(\"list-todo\", __iconNode);\n\nexport { __iconNode, ListTodo as default };\n//# sourceMappingURL=list-todo.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 5H3\", key: \"1qgfaw\" }],\n [\"path\", { d: \"M12 19H3\", key: \"yhmn1j\" }],\n [\"path\", { d: \"M14 3v4\", key: \"1sua03\" }],\n [\"path\", { d: \"M16 17v4\", key: \"1q0r14\" }],\n [\"path\", { d: \"M21 12h-9\", key: \"1o4lsq\" }],\n [\"path\", { d: \"M21 19h-5\", key: \"1rlt1p\" }],\n [\"path\", { d: \"M21 5h-7\", key: \"1oszz2\" }],\n [\"path\", { d: \"M8 10v4\", key: \"tgpxqk\" }],\n [\"path\", { d: \"M8 12H3\", key: \"a7s4jb\" }]\n];\nconst SlidersHorizontal = createLucideIcon(\"sliders-horizontal\", __iconNode);\n\nexport { __iconNode, SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.mjs.map\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery & Studio View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English) with modular tabs, multi-dimensional filters,\n * responsive image grid, and placeholder routes.\n */\nimport { useEffect, useState, useMemo, useRef } from 'react';\nimport { IMAGE_ROUTE, DELETE_ROUTE } from '../shared.js';\nimport { Image as ImageIcon, SlidersHorizontal, Heart, GitCompare, ListTodo, Search, Copy, Download, FileText, Trash2, X, ChevronLeft, ChevronRight, CheckSquare, Check, AlertTriangle, } from 'lucide-react';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, bulkDeleteGalleryItems, toggleFavoriteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n // 顶部 Tab\n tabGallery: '图库',\n tabStudio: '工作台',\n tabFavorites: '收藏',\n tabCompare: '对比',\n tabTasks: '任务',\n // 筛选工具栏\n filterAllProviders: '全部提供商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n filterComfyUI: '本地 ComfyUI',\n filterAllModels: '全部模型',\n filterAllRatios: '全部比例',\n searchPlaceholder: '搜索 Prompt、标签…',\n sortNewest: '最新生成',\n sortOldest: '最早生成',\n // 状态与提示\n totalCount: '共 {count} 张生成图片',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n favEmptyTitle: '暂无收藏图片',\n favEmptyDesc: '在图库中点击卡片右下角的 ♡ 按钮,即可将喜爱的图片收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或调整筛选条件。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n favoriteAdded: '已添加到收藏',\n favoriteRemoved: '已取消收藏',\n // 卡片与弹窗操作\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n prevImage: '上一张 (←)',\n nextImage: '下一张 (→)',\n // 批量管理与删除\n manage: '批量删除',\n exitManage: '退出选择',\n selectedCount: '已选 {n} 项',\n selectAll: '全选',\n invertSelect: '反选',\n clearSelect: '清空',\n batchDelete: '批量删除',\n batchDeleteTitle: '确认批量删除选中的 {count} 张图片?',\n batchDeleteTitleSingle: '确认从画廊中删除这张图片?',\n batchDeleteDesc: '将从画廊历史记录中移除所选图片。',\n deleteWorkspaceFilesOpt: '同时清理工作区磁盘物理文件(不可恢复)',\n cancel: '取消',\n confirmBatchDelete: '确认删除 ({count})',\n confirmDeleteSingle: '确认删除',\n batchDeletedToast: '已删除 {count} 张图片',\n batchDeletedWithFilesToast: '已删除 {count} 张图片,并清理了 {files} 个工作区文件',\n deleteFailedFileLocked: '已删除 {count} 张图片,但有 {files} 个文件因被系统占用未能删除',\n deleteFailedDatabase: '删除失败:本地数据库操作异常',\n // 时间格式化\n justNow: '刚刚',\n minutesAgo: '{n} 分钟前',\n hoursAgo: '{n} 小时前',\n daysAgo: '{n} 天前',\n // 预留模块占位\n studioTitle: 'AI 图像工作台 (Studio)',\n studioDesc: '工作台模块正在紧锣密鼓开发中。在此你将体验大图精修、变体生成 (Variations)、参数重调并一键将生成结果无缝插回 DSH 正在进行的对话。',\n studioTip: '💡 提示:目前你可以在“图库”中点击任意图片,在弹窗中进行查看、复制与下载。',\n compareTitle: '多模型横向对比 (Compare)',\n compareDesc: '支持单个 Prompt 一键同时调度 Gemini、Seedream、DashScope 及本地 ComfyUI 模型并排生成,直观横评画质与细节。',\n tasksTitle: '异步任务队列 (Tasks)',\n tasksDesc: '集中管理后台批量生图、多模型并发生成与本地 ComfyUI 耗时任务。支持状态追踪、失败重试与执行耗时分析。',\n comingSoonBadge: '即将推出',\n },\n en: {\n // Top Tabs\n tabGallery: 'Gallery',\n tabStudio: 'Studio',\n tabFavorites: 'Favorites',\n tabCompare: 'Compare',\n tabTasks: 'Tasks',\n // Filter Toolbar\n filterAllProviders: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n filterComfyUI: 'Local ComfyUI',\n filterAllModels: 'All Models',\n filterAllRatios: 'All Ratios',\n searchPlaceholder: 'Search prompt, tags…',\n sortNewest: 'Newest first',\n sortOldest: 'Oldest first',\n // States & Toasts\n totalCount: '{count} images total',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n favEmptyTitle: 'No favorite images yet',\n favEmptyDesc: 'Click the ♡ button on any card in the gallery to collect your favorite images here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or adjust filter criteria.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n favoriteAdded: 'Added to favorites',\n favoriteRemoved: 'Removed from favorites',\n // Card & Lightbox Actions\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n prevImage: 'Previous (←)',\n nextImage: 'Next (→)',\n // Batch Management & Delete\n manage: 'Batch Delete',\n exitManage: 'Done',\n selectedCount: '{n} selected',\n selectAll: 'Select All',\n invertSelect: 'Invert',\n clearSelect: 'Clear',\n batchDelete: 'Batch Delete',\n batchDeleteTitle: 'Delete {count} selected images?',\n batchDeleteTitleSingle: 'Delete this image from gallery?',\n batchDeleteDesc: 'These images will be removed from your gallery history.',\n deleteWorkspaceFilesOpt: 'Also delete files from workspace disk (cannot be undone)',\n cancel: 'Cancel',\n confirmBatchDelete: 'Delete ({count})',\n confirmDeleteSingle: 'Delete',\n batchDeletedToast: 'Deleted {count} images',\n batchDeletedWithFilesToast: 'Deleted {count} images and cleaned {files} workspace files',\n deleteFailedFileLocked: 'Deleted {count} images, but {files} files could not be deleted (busy/locked)',\n deleteFailedDatabase: 'Failed to delete: local database error',\n // Relative Time\n justNow: 'Just now',\n minutesAgo: '{n}m ago',\n hoursAgo: '{n}h ago',\n daysAgo: '{n}d ago',\n // Route Placeholders\n studioTitle: 'AI Image Studio',\n studioDesc: 'Studio workbench is under active development. Fine-tune prompts, generate variations (2x/4x), and inject images directly into DSH chat.',\n studioTip: '💡 Tip: You can currently click any image in the Gallery to preview, copy, or download it.',\n compareTitle: 'Model Comparison (Compare)',\n compareDesc: 'Side-by-side multi-model benchmarking coming soon. Test Gemini, Seedream, DashScope, and ComfyUI with a single prompt.',\n tasksTitle: 'Task Queue (Tasks)',\n tasksDesc: 'Centralized view for batch generation, asynchronous ComfyUI runs, live progress tracking, and retry controls.',\n comingSoonBadge: 'Coming Soon',\n },\n};\n/** Format human-readable relative time */\nfunction formatRelativeTime(timestamp, t) {\n const diff = Date.now() - timestamp;\n if (diff < 60_000) {\n return t('justNow');\n }\n if (diff < 3600_000) {\n const mins = Math.max(1, Math.floor(diff / 60_000));\n return t('minutesAgo', { n: String(mins) });\n }\n if (diff < 86400_000) {\n const hours = Math.floor(diff / 3600_000);\n return t('hoursAgo', { n: String(hours) });\n }\n if (diff < 30 * 86400_000) {\n const days = Math.floor(diff / 86400_000);\n return t('daysAgo', { n: String(days) });\n }\n const d = new Date(timestamp);\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n}\n/** Extract standard aspect ratio for precise filtering */\nfunction getItemRatio(item) {\n if (item.aspectRatio && item.aspectRatio !== 'custom') {\n return item.aspectRatio;\n }\n if (item.output) {\n const ratioMatch = item.output.match(/\\b(1:1|16:9|9:16|4:3|3:4|3:2|2:3)\\b/);\n if (ratioMatch?.[1])\n return ratioMatch[1];\n const dimMatch = item.output.match(/(\\d{3,4})\\s*[×x*]\\s*(\\d{3,4})/);\n if (dimMatch?.[1] && dimMatch[2]) {\n const w = parseInt(dimMatch[1], 10);\n const h = parseInt(dimMatch[2], 10);\n if (w === h)\n return '1:1';\n const approx = w / h;\n if (Math.abs(approx - 16 / 9) < 0.05)\n return '16:9';\n if (Math.abs(approx - 9 / 16) < 0.05)\n return '9:16';\n if (Math.abs(approx - 4 / 3) < 0.05)\n return '4:3';\n if (Math.abs(approx - 3 / 4) < 0.05)\n return '3:4';\n if (Math.abs(approx - 3 / 2) < 0.05)\n return '3:2';\n if (Math.abs(approx - 2 / 3) < 0.05)\n return '2:3';\n }\n }\n return '1:1';\n}\n/** Format aspect ratio or dimensions for card metadata (e.g., 1024×1024 or 16:9) */\nfunction formatCardMeta(item) {\n if (item.output) {\n const dimMatch = item.output.match(/(\\d{3,4})\\s*[×x*]\\s*(\\d{3,4})/);\n if (dimMatch?.[1] && dimMatch[2]) {\n return `${dimMatch[1]}×${dimMatch[2]}`;\n }\n }\n if (item.aspectRatio && item.aspectRatio !== 'custom') {\n return item.aspectRatio;\n }\n if (item.output) {\n const ratioMatch = item.output.match(/\\b(1:1|16:9|9:16|4:3|3:4|3:2|2:3)\\b/);\n if (ratioMatch?.[1])\n return ratioMatch[1];\n }\n if (item.imageSize) {\n return item.imageSize;\n }\n return '1:1';\n}\nexport const GalleryViewTab = ({ locale }) => {\n const [activeTab, setActiveTab] = useState('gallery');\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [selectedRatio, setSelectedRatio] = useState('all');\n const [sortBy, setSortBy] = useState('newest');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n // Batch Management & Shift-Selection State\n const [isManageMode, setIsManageMode] = useState(false);\n const [selectedIds, setSelectedIds] = useState(new Set());\n const lastSelectedIndexRef = useRef(null);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [deleteWorkspaceFiles, setDeleteWorkspaceFiles] = useState(true);\n const [isDeleting, setIsDeleting] = useState(false);\n // Clear batch selection and shift anchor when switching tabs, searching, or changing filters\n useEffect(() => {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n }, [activeTab, search, selectedProvider, selectedRatio, sortBy]);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery/studio\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n // Load items from IndexedDB\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n const [previewLoading, setPreviewLoading] = useState(false);\n const blobCache = useMemo(() => new Map(), []);\n const abortControllerRef = useRef(null);\n // Multi-dimensional filtering and sorting (Provider, Ratio, Search, and Sort)\n const filteredItems = useMemo(() => {\n return items\n .filter((item) => {\n // Tab-level filter (Favorites tab only shows favorited items)\n if (activeTab === 'favorites' && !item.isFavorite) {\n return false;\n }\n // Provider filter\n if (selectedProvider !== 'all' && item.provider !== selectedProvider) {\n return false;\n }\n // Ratio filter\n if (selectedRatio !== 'all') {\n const ratio = getItemRatio(item);\n if (ratio !== selectedRatio) {\n return false;\n }\n }\n // Search filter (Prompt, model, tags, provider)\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n const matchProvider = item.provider?.toLowerCase().includes(q);\n const matchTags = item.tags?.some((t) => t.toLowerCase().includes(q));\n if (!matchPrompt && !matchModel && !matchProvider && !matchTags) {\n return false;\n }\n }\n return true;\n })\n .sort((a, b) => {\n if (sortBy === 'oldest') {\n return a.createdAt - b.createdAt;\n }\n return b.createdAt - a.createdAt;\n });\n }, [items, activeTab, selectedProvider, selectedRatio, search, sortBy]);\n // Current item index in the active filtered sequence\n const currentPreviewIndex = useMemo(() => {\n if (!previewItem)\n return -1;\n return filteredItems.findIndex((i) => i.id === previewItem.id);\n }, [previewItem, filteredItems]);\n const hasPrev = currentPreviewIndex > 0;\n const hasNext = currentPreviewIndex >= 0 && currentPreviewIndex < filteredItems.length - 1;\n // Safely open or navigate preview item\n const openPreviewItem = (item, blob) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n setPreviewItem(item);\n if (blob) {\n blobCache.set(item.id, blob);\n const url = URL.createObjectURL(blob);\n setPreviewBlob(blob);\n setPreviewUrl(url);\n setPreviewLoading(false);\n return;\n }\n const cached = blobCache.get(item.id);\n if (cached) {\n const url = URL.createObjectURL(cached);\n setPreviewBlob(cached);\n setPreviewUrl(url);\n setPreviewLoading(false);\n return;\n }\n setPreviewLoading(true);\n setPreviewBlob(null);\n setPreviewUrl(null);\n const controller = new AbortController();\n abortControllerRef.current = controller;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (res) => {\n if (!res.ok)\n throw new Error(`HTTP ${res.status}`);\n return res.blob();\n })\n .then((fetchedBlob) => {\n if (controller.signal.aborted)\n return;\n blobCache.set(item.id, fetchedBlob);\n const url = URL.createObjectURL(fetchedBlob);\n setPreviewBlob(fetchedBlob);\n setPreviewUrl(url);\n setPreviewLoading(false);\n })\n .catch((err) => {\n if (controller.signal.aborted)\n return;\n setPreviewLoading(false);\n showToast(t('copyFailed'));\n });\n };\n // Close preview and revoke object URL\n const handleClosePreview = () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n setPreviewLoading(false);\n };\n const goToPrev = () => {\n if (currentPreviewIndex > 0) {\n const prevItem = filteredItems[currentPreviewIndex - 1];\n if (prevItem)\n openPreviewItem(prevItem);\n }\n };\n const goToNext = () => {\n if (currentPreviewIndex >= 0 && currentPreviewIndex < filteredItems.length - 1) {\n const nextItem = filteredItems[currentPreviewIndex + 1];\n if (nextItem)\n openPreviewItem(nextItem);\n }\n };\n // Clean up any remaining preview URL on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current)\n abortControllerRef.current.abort();\n if (previewUrl)\n URL.revokeObjectURL(previewUrl);\n };\n }, [previewUrl]);\n // Keyboard navigation: Esc (close modal or preview), ArrowLeft (prev), ArrowRight (next)\n useEffect(() => {\n const onKeyDown = (e) => {\n if (['INPUT', 'TEXTAREA'].includes(e.target?.tagName)) {\n return;\n }\n if (showDeleteModal) {\n if (e.key === 'Escape' && !isDeleting) {\n e.preventDefault();\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }\n return;\n }\n if (previewItem) {\n if (e.key === 'Escape') {\n handleClosePreview();\n }\n else if (e.key === 'ArrowLeft' || e.key === 'Left') {\n e.preventDefault();\n goToPrev();\n }\n else if (e.key === 'ArrowRight' || e.key === 'Right') {\n e.preventDefault();\n goToNext();\n }\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [showDeleteModal, isDeleting, isManageMode, previewItem, currentPreviewIndex, filteredItems]);\n // Shift-Click Range Selection & Card Click Handler\n const handleCardClick = (item, index, e, blob) => {\n // If holding Shift, or if currently in manage mode:\n if (e.shiftKey || isManageMode) {\n e.stopPropagation();\n if (!isManageMode) {\n setIsManageMode(true);\n }\n if (e.shiftKey && lastSelectedIndexRef.current !== null) {\n const from = Math.min(lastSelectedIndexRef.current, index);\n const to = Math.max(lastSelectedIndexRef.current, index);\n const rangeItems = filteredItems.slice(from, to + 1);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const r of rangeItems) {\n next.add(r.id);\n }\n return next;\n });\n }\n else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) {\n next.delete(item.id);\n }\n else {\n next.add(item.id);\n }\n return next;\n });\n lastSelectedIndexRef.current = index;\n }\n return;\n }\n // Normal click -> open preview\n if (blob) {\n openPreviewItem(item, blob);\n }\n };\n // Toggle selection for a specific card index\n const handleToggleSelect = (id, index, e) => {\n e.stopPropagation();\n if (!isManageMode) {\n setIsManageMode(true);\n }\n if (e.shiftKey && lastSelectedIndexRef.current !== null) {\n const from = Math.min(lastSelectedIndexRef.current, index);\n const to = Math.max(lastSelectedIndexRef.current, index);\n const rangeItems = filteredItems.slice(from, to + 1);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const r of rangeItems) {\n next.add(r.id);\n }\n return next;\n });\n }\n else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n }\n else {\n next.add(id);\n }\n return next;\n });\n lastSelectedIndexRef.current = index;\n }\n };\n const handleSelectAll = () => {\n setSelectedIds(new Set(filteredItems.map((i) => i.id)));\n };\n const handleInvertSelect = () => {\n setSelectedIds((prev) => {\n const next = new Set();\n for (const item of filteredItems) {\n if (!prev.has(item.id)) {\n next.add(item.id);\n }\n }\n return next;\n });\n };\n const handleClearSelect = () => {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n };\n const handleExitManage = () => {\n setIsManageMode(false);\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n };\n // Request single image deletion through the unified modal\n const requestSingleDelete = (item, e) => {\n if (e)\n e.stopPropagation();\n setSelectedIds(new Set([item.id]));\n setShowDeleteModal(true);\n };\n // Execute batch deletion (IndexedDB single transaction + optional workspace disk unlink)\n const handleConfirmBatchDelete = async () => {\n if (selectedIds.size === 0 || isDeleting)\n return;\n setIsDeleting(true);\n const idsToDelete = Array.from(selectedIds);\n const itemsToDelete = items.filter((i) => selectedIds.has(i.id));\n // 1. Separate items: if savedTo is known, ONLY use exact path (no broad scan!)\n const pathsToDelete = itemsToDelete\n .map((i) => i.savedTo)\n .filter((p) => typeof p === 'string' && p.trim().length > 0);\n // 2. Only send attachmentId as fallback for legacy items that lack savedTo:\n const fallbackAttachmentIds = itemsToDelete\n .filter((i) => !i.savedTo || !i.savedTo.trim())\n .map((i) => i.id);\n let deletedFiles = 0;\n let failedFilesCount = 0;\n if (deleteWorkspaceFiles && (pathsToDelete.length > 0 || fallbackAttachmentIds.length > 0)) {\n try {\n const res = await fetch(DELETE_ROUTE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n paths: pathsToDelete,\n attachmentIds: fallbackAttachmentIds,\n }),\n });\n if (res.ok) {\n const data = (await res.json());\n deletedFiles = data.deletedCount ?? 0;\n if (Array.isArray(data.failedFiles)) {\n failedFilesCount = data.failedFiles.length;\n }\n }\n }\n catch (err) {\n console.warn('[dsh-image-gen] Workspace file deletion failed:', err);\n }\n }\n // 3. Perform IndexedDB deletion with real error handling\n try {\n await bulkDeleteGalleryItems(idsToDelete);\n }\n catch (err) {\n setIsDeleting(false);\n showToast(t('deleteFailedDatabase'));\n return;\n }\n // Close lightbox if preview item was deleted\n if (previewItem && selectedIds.has(previewItem.id)) {\n handleClosePreview();\n }\n setIsDeleting(false);\n setShowDeleteModal(false);\n if (isManageMode) {\n handleExitManage();\n }\n else {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n }\n if (failedFilesCount > 0) {\n showToast(t('deleteFailedFileLocked', { count: String(idsToDelete.length), files: String(failedFilesCount) }));\n }\n else if (deletedFiles > 0) {\n showToast(t('batchDeletedWithFilesToast', { count: String(idsToDelete.length), files: String(deletedFiles) }));\n }\n else {\n showToast(t('batchDeletedToast', { count: String(idsToDelete.length) }));\n }\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-studio-tabs-bar\", children: [_jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'gallery' ? 'is-active' : ''}`, onClick: () => setActiveTab('gallery'), children: [_jsx(ImageIcon, { size: 15 }), _jsx(\"span\", { children: t('tabGallery') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'studio' ? 'is-active' : ''}`, onClick: () => setActiveTab('studio'), children: [_jsx(SlidersHorizontal, { size: 15 }), _jsx(\"span\", { children: t('tabStudio') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'favorites' ? 'is-active' : ''}`, onClick: () => setActiveTab('favorites'), children: [_jsx(Heart, { size: 15 }), _jsx(\"span\", { children: t('tabFavorites') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'compare' ? 'is-active' : ''}`, onClick: () => setActiveTab('compare'), children: [_jsx(GitCompare, { size: 15 }), _jsx(\"span\", { children: t('tabCompare') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'tasks' ? 'is-active' : ''}`, onClick: () => setActiveTab('tasks'), children: [_jsx(ListTodo, { size: 15 }), _jsx(\"span\", { children: t('tabTasks') })] })] }), (activeTab === 'gallery' || activeTab === 'favorites') && (_jsxs(\"div\", { className: \"dsh-ig-studio-toolbar\", children: [_jsxs(\"div\", { className: \"dsh-ig-studio-toolbar-left\", children: [_jsxs(\"select\", { className: \"dsh-ig-studio-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAllProviders') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('filterComfyUI') })] }), _jsxs(\"select\", { className: \"dsh-ig-studio-select\", value: selectedRatio, onChange: (e) => setSelectedRatio(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAllRatios') }), _jsx(\"option\", { value: \"1:1\", children: \"1:1\" }), _jsx(\"option\", { value: \"16:9\", children: \"16:9\" }), _jsx(\"option\", { value: \"9:16\", children: \"9:16\" }), _jsx(\"option\", { value: \"4:3\", children: \"4:3\" }), _jsx(\"option\", { value: \"3:4\", children: \"3:4\" }), _jsx(\"option\", { value: \"3:2\", children: \"3:2\" }), _jsx(\"option\", { value: \"2:3\", children: \"2:3\" })] }), _jsxs(\"div\", { className: \"dsh-ig-studio-search-wrap\", children: [_jsx(Search, { className: \"dsh-ig-studio-search-icon\", size: 14 }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-studio-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-studio-toolbar-right\", children: [_jsxs(\"select\", { className: \"dsh-ig-studio-select dsh-ig-studio-select-sort\", value: sortBy, onChange: (e) => setSortBy(e.target.value), children: [_jsx(\"option\", { value: \"newest\", children: t('sortNewest') }), _jsx(\"option\", { value: \"oldest\", children: t('sortOldest') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-btn dsh-ig-studio-btn-danger ${isManageMode ? 'is-active' : ''}`, title: isManageMode ? t('exitManage') : t('manage'), onClick: () => {\n if (isManageMode) {\n handleExitManage();\n }\n else {\n setIsManageMode(true);\n }\n }, children: [_jsx(Trash2, { size: 13 }), _jsx(\"span\", { children: isManageMode ? t('exitManage') : t('manage') })] })] })] })), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: activeTab === 'gallery' || activeTab === 'favorites' ? (items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : activeTab === 'favorites' && filteredItems.length === 0 && search === '' && selectedProvider === 'all' && selectedRatio === 'all' ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83E\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('favEmptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('favEmptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item, idx) => (_jsx(GalleryCard, { item: item, index: idx, isManageMode: isManageMode, isSelected: selectedIds.has(item.id), t: t, onClick: (e, blob) => handleCardClick(item, idx, e, blob), onToggleSelect: (e) => handleToggleSelect(item.id, idx, e), onRequestDelete: () => requestSingleDelete(item), onPreview: (blob) => openPreviewItem(item, blob), onBlobLoaded: (b) => blobCache.set(item.id, b), onToast: showToast }, item.id))) }))) : activeTab === 'studio' ? (_jsx(PlaceholderView, { icon: \"\\uD83C\\uDFA8\", title: t('studioTitle'), description: t('studioDesc'), tip: t('studioTip'), badge: t('comingSoonBadge') })) : activeTab === 'compare' ? (_jsx(PlaceholderView, { icon: \"\\uD83D\\uDD00\", title: t('compareTitle'), description: t('compareDesc'), badge: t('comingSoonBadge') })) : (_jsx(PlaceholderView, { icon: \"\\uD83D\\uDCCB\", title: t('tasksTitle'), description: t('tasksDesc'), badge: t('comingSoonBadge') })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), (isManageMode || selectedIds.size > 0) && (_jsxs(\"div\", { className: \"dsh-ig-batch-bar\", children: [_jsxs(\"div\", { className: \"dsh-ig-batch-bar-left\", children: [_jsx(\"span\", { className: \"dsh-ig-batch-counter\", children: t('selectedCount', { n: String(selectedIds.size) }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleSelectAll, children: t('selectAll') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleInvertSelect, children: t('invertSelect') }), selectedIds.size > 0 && (_jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleClearSelect, children: t('clearSelect') }))] }), _jsxs(\"div\", { className: \"dsh-ig-batch-bar-right\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn dsh-ig-batch-btn-danger\", disabled: selectedIds.size === 0, onClick: () => setShowDeleteModal(true), children: [_jsx(Trash2, { size: 13 }), _jsxs(\"span\", { children: [t('batchDelete'), selectedIds.size > 0 ? ` (${selectedIds.size})` : ''] })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn dsh-ig-batch-btn-exit\", onClick: handleExitManage, children: t('exitManage') })] })] })), showDeleteModal && (_jsx(\"div\", { className: \"dsh-ig-modal-backdrop\", onClick: () => {\n if (!isDeleting) {\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }\n }, children: _jsxs(\"div\", { className: \"dsh-ig-modal-box\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-modal-header\", children: [_jsx(\"div\", { className: \"dsh-ig-modal-icon-danger\", children: _jsx(AlertTriangle, { size: 20 }) }), _jsx(\"div\", { className: \"dsh-ig-modal-title\", children: selectedIds.size === 1\n ? t('batchDeleteTitleSingle')\n : t('batchDeleteTitle', { count: String(selectedIds.size) }) })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-body\", children: [_jsx(\"p\", { className: \"dsh-ig-modal-desc\", children: t('batchDeleteDesc') }), _jsxs(\"label\", { className: \"dsh-ig-modal-checkbox-label\", children: [_jsx(\"input\", { type: \"checkbox\", checked: deleteWorkspaceFiles, onChange: (e) => setDeleteWorkspaceFiles(e.target.checked), disabled: isDeleting }), _jsx(\"span\", { children: t('deleteWorkspaceFilesOpt') })] })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-footer\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-cancel\", onClick: () => {\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }, disabled: isDeleting, children: t('cancel') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-danger\", onClick: handleConfirmBatchDelete, disabled: isDeleting, children: isDeleting\n ? '...'\n : selectedIds.size === 1\n ? t('confirmDeleteSingle')\n : t('confirmBatchDelete', { count: String(selectedIds.size) }) })] })] }) })), previewItem && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: handleClosePreview, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null, currentPreviewIndex >= 0 && (_jsxs(\"span\", { className: \"dsh-ig-lightbox-counter\", children: [currentPreviewIndex + 1, \" / \", filteredItems.length] }))] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: handleClosePreview, children: _jsx(X, { size: 18 }) })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav-btn dsh-ig-lightbox-nav-prev\", title: t('prevImage'), disabled: !hasPrev, onClick: (e) => {\n e.stopPropagation();\n goToPrev();\n }, children: _jsx(ChevronLeft, { size: 24 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav-btn dsh-ig-lightbox-nav-next\", title: t('nextImage'), disabled: !hasNext, onClick: (e) => {\n e.stopPropagation();\n goToNext();\n }, children: _jsx(ChevronRight, { size: 24 }) }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: previewLoading ? (_jsx(\"div\", { className: \"dsh-ig-lightbox-loading\", children: _jsx(\"div\", { className: \"dsh-ig-lightbox-spinner\" }) })) : previewUrl ? (_jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt })) : null }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsx(FileText, { size: 14 }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsx(Copy, { size: 14 }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n if (!previewUrl)\n return;\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsx(Download, { size: 14 }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: () => {\n if (previewItem) {\n requestSingleDelete(previewItem);\n }\n }, children: [_jsx(Trash2, { size: 14 }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, index: _index, isManageMode, isSelected, t, onClick, onToggleSelect, onRequestDelete, onPreview: _onPreview, onBlobLoaded, onToast, }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n onBlobLoaded?.(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const toggleFavorite = async (e) => {\n e.stopPropagation();\n const nextStatus = await toggleFavoriteGalleryItem(item.id);\n onToast(nextStatus ? t('favoriteAdded') : t('favoriteRemoved'));\n };\n // Label for top badge: show model or fallback to provider\n const badgeLabel = item.model || item.provider;\n return (_jsxs(\"div\", { className: `dsh-ig-gallery-card ${isSelected ? 'is-selected' : ''} ${isManageMode ? 'is-manage-mode' : ''}`, onClick: (e) => onClick(e, blob), children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [_jsx(\"button\", { type: \"button\", className: `dsh-ig-card-checkbox ${isSelected ? 'is-checked' : ''}`, title: isSelected ? t('clearSelect') : t('manage'), onClick: onToggleSelect, children: isSelected && _jsx(Check, { size: 11, strokeWidth: 3 }) }), loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsx(Copy, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsx(Download, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsx(FileText, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: (e) => {\n e.stopPropagation();\n onRequestDelete();\n }, children: _jsx(Trash2, { size: 13 }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsx(\"div\", { className: \"dsh-ig-card-badge-row\", children: _jsx(\"span\", { className: \"dsh-ig-card-badge\", title: badgeLabel, children: badgeLabel }) }), _jsx(\"div\", { className: \"dsh-ig-gallery-card-prompt-line\", title: item.prompt, children: item.prompt }), _jsxs(\"div\", { className: \"dsh-ig-card-footer-row\", children: [_jsxs(\"span\", { className: \"dsh-ig-card-meta-text\", children: [formatCardMeta(item), \" | \", formatRelativeTime(item.createdAt, t)] }), _jsx(\"button\", { type: \"button\", className: `dsh-ig-card-fav-btn ${item.isFavorite ? 'is-favorited' : ''}`, title: item.isFavorite ? t('favoriteRemoved') : t('favoriteAdded'), onClick: (e) => {\n void toggleFavorite(e);\n }, children: _jsx(Heart, { size: 15, fill: item.isFavorite ? 'currentColor' : 'none' }) })] })] })] }));\n};\nconst PlaceholderView = ({ icon, title, description, tip, badge, }) => {\n return (_jsx(\"div\", { className: \"dsh-ig-placeholder-view\", children: _jsxs(\"div\", { className: \"dsh-ig-placeholder-card\", children: [_jsx(\"div\", { className: \"dsh-ig-placeholder-icon\", children: icon }), _jsxs(\"div\", { className: \"dsh-ig-placeholder-header\", children: [_jsx(\"h2\", { className: \"dsh-ig-placeholder-title\", children: title }), badge && _jsx(\"span\", { className: \"dsh-ig-placeholder-badge\", children: badge })] }), _jsx(\"p\", { className: \"dsh-ig-placeholder-desc\", children: description }), tip && _jsx(\"div\", { className: \"dsh-ig-placeholder-tip\", children: tip })] }) }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","/**\n * Extract the verified durable image attachment from a completed tool result block.\n * Supports legacy rc.2 `resultView.content` and modern DSH `block.content`.\n */\nexport function imageRef(block) {\n if (!('kind' in block))\n return undefined;\n const fromResultView = block.resultView?.card === 'generic'\n ? block.resultView.content?.find(item => item.type === 'image')\n : undefined;\n if (fromResultView?.type === 'image')\n return fromResultView.attachment;\n const fromBlockContent = Array.isArray(block.content)\n ? block.content.find(item => item.type === 'image')\n : undefined;\n if (fromBlockContent?.type === 'image')\n return fromBlockContent.attachment;\n return undefined;\n}\n//# sourceMappingURL=image-ref.js.map","export const IMAGE_RESULT_NODE_KIND = 'dsh-image-result';\n/** Default definition: unknown transcript mode falls back to Compact-safe anchoring. */\nexport const imageResultDefinition = createImageResultDefinition();\n/**\n * One image result row per Turn, anchored at its own tool/result position while\n * the Turn runs, then optionally re-anchored beside the final answer once the\n * Turn closes (only needed under the folding Compact transcript view).\n */\nexport function createImageResultDefinition(options = {}) {\n return {\n kind: IMAGE_RESULT_NODE_KIND,\n target: 'chat',\n match: (event) => {\n const turn = eventTurn(event);\n if (turn === undefined)\n return null;\n if (event.type === 'turn/start')\n return { id: String(turn), role: 'start' };\n if (event.type === 'turn/end')\n return { id: String(turn), role: 'update' };\n if (event.type === 'assistant/message')\n return { id: String(turn), role: 'update' };\n if (event.type === 'tool/result' && imageResultFromMeta(event.data.meta) !== undefined) {\n return { id: String(turn), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n const turn = eventTurn(match.event);\n if (match.event.type !== 'turn/start' || turn === undefined) {\n throw new Error('dsh-image-result start requires turn/start');\n }\n return { turn, results: [] };\n },\n update: (context, match) => {\n if (match.event.type === 'turn/end')\n return { ...context.state, endSeq: match.event.seq };\n if (match.event.type === 'assistant/message')\n return { ...context.state, answerSeq: match.event.seq };\n if (match.event.type !== 'tool/result')\n return context.state;\n const result = imageResultFromMeta(match.event.data.meta);\n if (result === undefined)\n return context.state;\n if (context.state.results.some(candidate => candidate.attachment.attachmentId === result.attachment.attachmentId)) {\n return context.state;\n }\n return { ...context.state, results: [...context.state.results, { ...result, seq: match.event.seq }] };\n },\n buildViewNode: (context) => {\n const state = context.state;\n const last = state?.results.at(-1);\n if (state === undefined || last === undefined)\n return null;\n const location = context.matches.at(-1)?.location ?? context.start?.location ?? { kind: 'unresolved' };\n return {\n key: context.key,\n kind: IMAGE_RESULT_NODE_KIND,\n id: context.id,\n target: 'chat',\n // While the Turn is open the artifact stays at its own tool/result\n // position, so later messages in the same Turn order below it. Once the\n // Turn closes, Compact folds every node before the finalized answer\n // boundary, so the artifact re-anchors beside that answer to stay\n // visible; Normal mode has no folding and keeps the natural position.\n // An unknown transcript mode falls back to the Compact-safe behavior.\n anchorSeq: state.endSeq !== undefined && compactTranscript(options)\n ? state.answerSeq ?? state.endSeq ?? last.seq\n : last.seq,\n location,\n visibility: 'visible',\n data: {\n turn: state.turn,\n results: state.results.map(({ seq: _seq, ...result }) => result),\n },\n };\n },\n };\n}\nfunction compactTranscript(options) {\n try {\n return options.isCompactTranscript?.() ?? true;\n }\n catch {\n return true;\n }\n}\n/** Parse the plugin-owned durable presentation metadata from a Tool result event. */\nexport function imageResultFromMeta(value) {\n const meta = record(value);\n if (meta?.kind !== 'dsh-image-gen')\n return undefined;\n const attachment = imageAttachment(meta.attachment);\n if (attachment === undefined)\n return undefined;\n return {\n attachment,\n prompt: stringValue(meta.prompt, 'Generated Image'),\n provider: stringValue(meta.provider, 'google'),\n model: stringValue(meta.model, ''),\n output: stringValue(meta.output, ''),\n ...(typeof meta.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction eventTurn(event) {\n const turn = event.data.turn;\n return typeof turn === 'number' && Number.isSafeInteger(turn) && turn >= 0 ? turn : undefined;\n}\nfunction imageAttachment(value) {\n const candidate = record(value);\n if (candidate === undefined\n || typeof candidate.attachmentId !== 'string'\n || !isImageMediaType(candidate.mediaType)\n || !positiveInteger(candidate.bytes)\n || !positiveInteger(candidate.width)\n || !positiveInteger(candidate.height))\n return undefined;\n const original = record(candidate.originalDimensions);\n if (candidate.originalDimensions !== undefined\n && (original === undefined || !positiveInteger(original.width) || !positiveInteger(original.height)))\n return undefined;\n return {\n attachmentId: candidate.attachmentId,\n mediaType: candidate.mediaType,\n bytes: candidate.bytes,\n width: candidate.width,\n height: candidate.height,\n ...(typeof candidate.name === 'string' ? { name: candidate.name } : {}),\n ...(original === undefined ? {} : { originalDimensions: { width: original.width, height: original.height } }),\n };\n}\nfunction isImageMediaType(value) {\n return value === 'image/png' || value === 'image/jpeg' || value === 'image/webp' || value === 'image/gif';\n}\nfunction positiveInteger(value) {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\nfunction stringValue(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction record(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value\n : undefined;\n}\n//# sourceMappingURL=image-result-node.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, activeComfyUIWorkflow, resolveComfyUIWorkflows, uniqueComfyUIWorkflowName, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nimport { imageRef } from './image-ref.js';\nimport { IMAGE_RESULT_NODE_KIND, createImageResultDefinition, } from './image-result-node.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n providerComfyUI: '本地 ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: '留空即可保留已配置的 Key',\n apiKeyHint: '安全保存为 {key};页面不会读回明文。',\n endpoint: '接口地址',\n reset: '重置',\n resetTitle: '重置为默认官方地址',\n endpointHintGoogle: 'Google 官方地址或反代端点(全路径)。',\n endpointHintOpenAI: '中转站请填其 OpenAI 兼容的 /v1 地址。',\n endpointHintSeedream: '火山方舟兼容的 /api/v3 地址。',\n endpointHintDashScope: '阿里云百炼 DashScope 官方接口地址。',\n endpointHintComfyUI: '正在运行且 DSH Host 可以访问的 ComfyUI 地址,默认使用本机 8188 端口。',\n model: '模型',\n workflow: 'API Workflow 工作流',\n workflowImport: '导入 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '从 ComfyUI 导出 API Format JSON,在提示词输入写入 {{prompt}},种子可用 {{seed}};图生图工作流在 LoadImage 的 image 输入写入 {{image}}(仅一次)。可导入多个工作流,Agent 也能在调用时按名称指定。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\n workflowActiveTitle: '设为当前使用的工作流',\n workflowRemove: '删除',\n workflowPresetPlaceholder: '预设提示词,留空则只用对话内容',\n workflowPresetTitle: '预设提示词:每次调用此工作流时自动加在用户提示词前面。',\n workflowNameRequired: '工作流名称不能为空。',\n workflowDuplicateName: '工作流名称不能重复。',\n timeout: '生成超时(秒)',\n timeoutHint: '包括提交、等待和下载图片;默认 300 秒。',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n resultShown: '图片结果已显示在对话中',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n providerComfyUI: 'Local ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: 'Leave empty to keep configured key',\n apiKeyHint: 'Securely saved as {key}; never read back in plaintext.',\n endpoint: 'Endpoint / Base URL',\n reset: 'Reset',\n resetTitle: 'Reset to official default URL',\n endpointHintGoogle: 'Official Google endpoint or reverse proxy (full path).',\n endpointHintOpenAI: 'OpenAI-compatible /v1 base URL for relays.',\n endpointHintSeedream: 'Volcengine Ark compatible /api/v3 base URL.',\n endpointHintDashScope: 'Official Aliyun DashScope endpoint.',\n endpointHintComfyUI: 'A running ComfyUI server reachable by the DSH Host; the default points to port 8188 on this computer.',\n model: 'Model',\n workflow: 'API Workflows',\n workflowImport: 'Import JSON file',\n workflowMissing: 'No workflow imported',\n workflowImported: 'Imported {name}',\n workflowHint: 'Export an API Format JSON from ComfyUI and place {{prompt}} in its prompt input; {{seed}} is available for a random seed. For image editing put {{image}} (exactly once) in the LoadImage image input. Import as many workflows as you need; the Agent can also pick one by name.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\n workflowActiveTitle: 'Make this the active workflow',\n workflowRemove: 'Remove',\n workflowPresetPlaceholder: 'Preset prompt (optional)',\n workflowPresetTitle: 'Preset prompt: automatically prepended to the user prompt on every call of this workflow.',\n workflowNameRequired: 'Workflow names cannot be empty.',\n workflowDuplicateName: 'Workflow names must be unique.',\n timeout: 'Generation timeout (seconds)',\n timeoutHint: 'Covers submission, waiting, and image download; defaults to 300 seconds.',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n resultShown: 'Image result is shown in the conversation',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\n.dsh-ig-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.dsh-ig-file-button{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font-size:13px;cursor:pointer;transition:background .15s,border-color .15s}\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\n.dsh-ig-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,inherit);font-size:12px}\n.dsh-ig-workflow-list{list-style:none;margin:0;padding:0;display:grid;gap:8px}\n.dsh-ig-workflow-row{display:flex;flex-direction:column;gap:6px;padding:8px;border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px}\n.dsh-ig-workflow-main{display:flex;align-items:center;gap:8px}\n.dsh-ig-workflow-active{display:inline-flex;align-items:center;cursor:pointer;flex:none}\n.dsh-ig-workflow-active input[type=radio]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0;cursor:pointer}\n.dsh-ig-workflow-name{flex:1;min-width:0}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-status-error{color:var(--dsw-alias-label-error,#d33);font-weight:500}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-promoted-results{display:grid;gap:16px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery & Studio View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n\n/* 1. Top Navigation Tab Bar */\n.dsh-ig-studio-tabs-bar{display:flex;align-items:center;gap:6px;padding:6px 24px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-studio-tab-btn{appearance:none;-webkit-appearance:none;border:0;background:transparent;display:inline-flex;align-items:center;gap:7px;padding:7px 14px;font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#64748b);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease}\n.dsh-ig-studio-tab-btn:hover{color:var(--dsw-alias-label-primary,#0f172a);background:var(--dsw-alias-bg-layer-2,#f1f5f9)}\n.dsh-ig-studio-tab-btn.is-active{color:var(--dsw-alias-brand-primary,#2563eb);font-weight:600;background:rgba(37,99,235,0.08)}\n\n/* 2. Secondary Filter & Search Toolbar */\n.dsh-ig-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 24px;background:var(--dsw-alias-bg-layer-1,#ffffff);border-bottom:1px solid var(--dsw-alias-border-l2,#f1f5f9);flex-shrink:0;flex-wrap:wrap}\n.dsh-ig-studio-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}\n.dsh-ig-studio-toolbar-right{display:flex;align-items:center;gap:10px;flex-shrink:0}\n\n/* Modern Custom Select (Removes OS default arrows & ugly borders) */\n.dsh-ig-studio-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;height:32px;line-height:30px;padding:0 28px 0 12px;font-size:12.5px;color:var(--dsw-alias-label-primary,#334155);background-color:var(--dsw-alias-bg-layer-2,#ffffff);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 9px center;border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:6px;outline:none;cursor:pointer;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}\n.dsh-ig-studio-select:hover{border-color:var(--dsw-alias-border-l1,#cbd5e1);background-color:var(--dsw-alias-bg-layer-1,#f8fafc)}\n.dsh-ig-studio-select:focus{border-color:var(--dsw-alias-brand-primary,#3b82f6);box-shadow:0 0 0 2px rgba(59,130,246,0.15)}\n.dsh-ig-studio-select-sort{font-weight:500}\n\n/* Unified Search Input */\n.dsh-ig-studio-search-wrap{position:relative;display:flex;align-items:center;min-width:190px;max-width:320px;flex:1}\n.dsh-ig-studio-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#94a3b8);pointer-events:none}\n.dsh-ig-studio-search-input{width:100%;height:32px;line-height:30px;padding:0 12px 0 32px;font-size:12.5px;border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:6px;background-color:var(--dsw-alias-bg-layer-2,#ffffff);color:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}\n.dsh-ig-studio-search-input:hover{border-color:var(--dsw-alias-border-l1,#cbd5e1)}\n.dsh-ig-studio-search-input:focus{border-color:var(--dsw-alias-brand-primary,#3b82f6);box-shadow:0 0 0 2px rgba(59,130,246,0.15)}\n.dsh-ig-studio-search-input::placeholder{color:var(--dsw-alias-label-tertiary,#94a3b8)}\n\n/* 3. Grid & Responsive Cards */\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:20px 24px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:18px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#ffffff);border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:10px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 10px 20px -5px rgba(0,0,0,0.06),0 4px 6px -2px rgba(0,0,0,0.03);border-color:var(--dsw-alias-border-l1,#cbd5e1)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f1f5f9;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s ease}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#94a3b8}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar on Card Hover */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:6px;left:6px;display:flex;align-items:center;gap:3px;padding:3px 5px;border-radius:6px;background:rgba(15,23,42,0.72);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n/* Card Bottom Metadata */\n.dsh-ig-gallery-card-meta{padding:10px 12px;display:flex;flex-direction:column;gap:5px;background:var(--dsw-alias-bg-layer-2,#ffffff);flex:1}\n.dsh-ig-card-badge-row{display:flex;align-items:center}\n.dsh-ig-card-badge{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#f1f5f9);color:var(--dsw-alias-label-secondary,#475569);font-size:11px;font-weight:500;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-ig-gallery-card-prompt-line{font-size:12.5px;font-weight:500;color:var(--dsw-alias-label-primary,#1e293b);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-ig-card-footer-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:2px}\n.dsh-ig-card-meta-text{font-size:11px;color:var(--dsw-alias-label-tertiary,#94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.dsh-ig-card-fav-btn{appearance:none;border:0;background:transparent;color:var(--dsw-alias-label-tertiary,#94a3b8);padding:2px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:color .15s,transform .15s;flex-shrink:0}\n.dsh-ig-card-fav-btn:hover{color:#ef4444;transform:scale(1.15)}\n.dsh-ig-card-fav-btn.is-favorited{color:#ef4444}\n\n/* Placeholders for Upcoming Routes */\n.dsh-ig-placeholder-view{display:flex;align-items:center;justify-content:center;min-height:360px;height:100%;padding:24px}\n.dsh-ig-placeholder-card{max-width:500px;width:100%;text-align:center;padding:36px 28px;background:var(--dsw-alias-bg-layer-2,#ffffff);border:1px dashed var(--dsw-alias-border-l2,#e2e8f0);border-radius:14px;display:flex;flex-direction:column;align-items:center;gap:12px}\n.dsh-ig-placeholder-icon{font-size:40px;line-height:1}\n.dsh-ig-placeholder-header{display:flex;align-items:center;gap:8px;justify-content:center}\n.dsh-ig-placeholder-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin:0}\n.dsh-ig-placeholder-badge{font-size:11px;font-weight:500;background:rgba(37,99,235,0.1);color:#2563eb;padding:2px 8px;border-radius:12px}\n.dsh-ig-placeholder-desc{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary,#64748b);margin:0}\n.dsh-ig-placeholder-tip{margin-top:6px;padding:8px 12px;font-size:12px;background:var(--dsw-alias-bg-layer-3,#f8fafc);border-radius:8px;color:var(--dsw-alias-label-tertiary,#64748b);text-align:left}\n\n/* Empty State */\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#94a3b8)}\n.dsh-ig-gallery-empty-icon{font-size:44px;margin-bottom:10px}\n.dsh-ig-gallery-empty-title{font-size:15px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:4px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-counter{display:inline-flex;align-items:center;padding:2px 8px;border-radius:4px;background:rgba(255,255,255,0.15);color:#fff;font-size:11.5px;font-weight:500;font-variant-numeric:tabular-nums}\n.dsh-ig-lightbox-nav-btn{position:fixed;top:50%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.12);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:background-color .15s ease,transform .15s ease,opacity .15s ease;outline:none}\n.dsh-ig-lightbox-nav-btn:hover:not(:disabled){background:rgba(255,255,255,0.28);transform:translateY(-50%) scale(1.08)}\n.dsh-ig-lightbox-nav-btn:disabled{opacity:0.2;cursor:not-allowed;pointer-events:none}\n.dsh-ig-lightbox-nav-prev{left:24px}\n.dsh-ig-lightbox-nav-next{right:24px}\n.dsh-ig-lightbox-loading{display:flex;align-items:center;justify-content:center;min-width:180px;min-height:180px}\n.dsh-ig-lightbox-spinner{width:36px;height:36px;border:3px solid rgba(255,255,255,0.2);border-top-color:#fff;border-radius:50%;animation:dsh-ig-spin .8s linear infinite}\n@keyframes dsh-ig-spin{to{transform:rotate(360deg)}}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Card selection and checkbox */\n.dsh-ig-gallery-card.is-selected{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary,#2563eb);border-color:transparent}\n.dsh-ig-card-checkbox{position:absolute;top:8px;left:8px;width:22px;height:22px;border-radius:50%;border:1.5px solid rgba(255,255,255,0.7);background:rgba(0,0,0,0.35);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);color:#fff;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;z-index:5;opacity:0;transition:opacity .15s ease,background-color .15s ease,border-color .15s ease;padding:0;outline:none}\n.dsh-ig-gallery-card:hover .dsh-ig-card-checkbox,.dsh-ig-gallery-card.is-manage-mode .dsh-ig-card-checkbox,.dsh-ig-card-checkbox.is-checked{opacity:1}\n.dsh-ig-card-checkbox.is-checked{background:var(--dsw-alias-brand-primary,#2563eb);border-color:var(--dsw-alias-brand-primary,#2563eb)}\n\n/* Studio button in toolbar */\n.dsh-ig-studio-btn{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;box-sizing:border-box;border-radius:6px;border:1px solid var(--dsw-alias-border-subtle,rgba(0,0,0,0.12));background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,inherit);font-size:12.5px;font-weight:500;cursor:pointer;transition:border-color .15s,background .15s,color .15s}\n.dsh-ig-studio-btn:hover{background:var(--dsw-alias-bg-layer-3,#f3f4f6);border-color:var(--dsw-alias-border-default,rgba(0,0,0,0.2))}\n.dsh-ig-studio-btn.is-active{background:var(--dsw-alias-brand-primary,#2563eb);border-color:var(--dsw-alias-brand-primary,#2563eb);color:#fff}\n.dsh-ig-studio-btn-danger{color:#ef4444;border-color:rgba(239,68,68,0.35);background:rgba(239,68,68,0.06)}\n.dsh-ig-studio-btn-danger:hover{background:rgba(239,68,68,0.14);border-color:rgba(239,68,68,0.6);color:#dc2626}\n.dsh-ig-studio-btn-danger.is-active{background:#dc2626;border-color:#dc2626;color:#fff}\n\n/* Floating Batch Action Bar */\n.dsh-ig-batch-bar{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:16px;background:rgba(20,24,32,0.92);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,0.18);border-radius:40px;padding:8px 16px;box-shadow:0 16px 40px rgba(0,0,0,0.5);z-index:99990;animation:dsh-ig-slide-up .2s cubic-bezier(0.16,1,0.3,1);color:#fff}\n@keyframes dsh-ig-slide-up{from{transform:translate(-50%,20px);opacity:0}to{transform:translate(-50%,0);opacity:1}}\n.dsh-ig-batch-bar-left{display:flex;align-items:center;gap:10px}\n.dsh-ig-batch-bar-right{display:flex;align-items:center;gap:8px;border-left:1px solid rgba(255,255,255,0.15);padding-left:12px}\n.dsh-ig-batch-counter{font-size:13px;font-weight:600;color:rgba(255,255,255,0.95);margin-right:4px}\n.dsh-ig-batch-btn{appearance:none;border:1px solid rgba(255,255,255,0.15);background:rgba(255,255,255,0.08);color:#fff;border-radius:20px;padding:5px 12px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-batch-btn:hover:not(:disabled){background:rgba(255,255,255,0.2)}\n.dsh-ig-batch-btn:disabled{opacity:0.4;cursor:not-allowed}\n.dsh-ig-batch-btn-danger{background:rgba(239,68,68,0.2);border-color:rgba(239,68,68,0.5);color:#fca5a5}\n.dsh-ig-batch-btn-danger:hover:not(:disabled){background:rgba(239,68,68,0.4)!important;border-color:rgba(239,68,68,0.8)!important;color:#fff!important}\n.dsh-ig-batch-btn-exit{border-color:transparent;background:transparent;color:rgba(255,255,255,0.7)}\n.dsh-ig-batch-btn-exit:hover{background:rgba(255,255,255,0.1);color:#fff}\n\n/* Batch Delete Confirmation Modal */\n.dsh-ig-modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,0.65);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:99995;display:flex;align-items:center;justify-content:center;padding:16px;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-modal-box{width:100%;max-width:440px;background:var(--dsw-alias-bg-layer-1,#1c1e24);border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.12));border-radius:12px;padding:22px;box-sizing:border-box;box-shadow:0 20px 50px rgba(0,0,0,0.45);color:var(--dsw-alias-label-primary,#fff);animation:dsh-ig-scale-up .15s ease-out}\n@keyframes dsh-ig-scale-up{from{transform:scale(0.95);opacity:0}to{transform:scale(1);opacity:1}}\n.dsh-ig-modal-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px}\n.dsh-ig-modal-icon-danger{width:36px;height:36px;border-radius:50%;background:rgba(239,68,68,0.12);color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.dsh-ig-modal-title{font-size:16px;font-weight:600;line-height:1.4}\n.dsh-ig-modal-body{margin-bottom:20px;padding-left:48px}\n.dsh-ig-modal-desc{font-size:13.5px;color:var(--dsw-alias-label-secondary,rgba(255,255,255,0.7));margin:0 0 14px 0;line-height:1.5}\n.dsh-ig-modal-checkbox-label{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--dsw-alias-label-primary,inherit);cursor:pointer;user-select:none}\n.dsh-ig-modal-checkbox-label input{margin:0;cursor:pointer;width:15px;height:15px}\n.dsh-ig-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px}\n.dsh-ig-modal-btn{height:34px;padding:0 14px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s,color .15s;outline:none}\n.dsh-ig-modal-btn-cancel{background:transparent;border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.2));color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-modal-btn-cancel:hover{background:var(--dsw-alias-bg-layer-3,rgba(255,255,255,0.08))}\n.dsh-ig-modal-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}\n.dsh-ig-modal-btn-danger:hover{background:#b91c1c;border-color:#b91c1c}\n\n/* Hide floating chat composer when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n // Host-owned chat transcript preference (\"ui-chat\" transcriptView). Unknown,\n // unavailable, or not-yet-loaded reads fall back to Compact-safe anchoring.\n const chatScope = ctx.settingsScope.bind({ namespace: 'ui-chat' });\n const isCompactTranscript = () => chatScope.getSnapshot().value?.transcriptView !== 'normal';\n const locale = ctx.get('locale');\n const promotion = { enabled: false };\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = STYLE;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n ctx.inject(['uiConversation'], (owner) => {\n const uiConversation = asModernUiConversation(owner.get('uiConversation'));\n if (uiConversation === undefined) {\n throw new Error('dsh-image-gen: uiConversation has an incompatible interface');\n }\n promotion.enabled = true;\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.effect(() => uiConversation.events.register(createImageResultDefinition({ isCompactTranscript })), 'dsh-image-gen: promoted image result node');\n owner.slots.inject('conversation.chat.node', () => ownerRegister({\n name: 'conversation.chat.node',\n key: IMAGE_RESULT_NODE_KIND,\n inject: () => ({ locale }),\n }, PromotedImageResultNode));\n });\n // 1. Settings item\n const injectSettingsItem = (owner, credentials) => {\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.slots.inject('settings.plugin.item', () => ownerRegister({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\n };\n const remoteCredentials = asCredentialsRemote(ctx.get('remote.credentials'));\n const legacyCredentials = credentialsFromLegacyConnection(ctx.get('connection'));\n if (remoteCredentials !== undefined) {\n injectSettingsItem(ctx, remoteCredentials);\n }\n else if (legacyCredentials !== undefined) {\n injectSettingsItem(ctx, legacyCredentials);\n }\n else {\n ctx.inject(['remote.credentials'], (remoteCtx) => {\n const credentials = asCredentialsRemote(remoteCtx.get('remote.credentials'));\n if (credentials === undefined)\n throw new Error('dsh-image-gen: remote.credentials has an incompatible interface');\n injectSettingsItem(remoteCtx, credentials);\n });\n }\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\nfunction asModernUiConversation(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const events = value.events;\n if (events === null || typeof events !== 'object')\n return undefined;\n return typeof events.register === 'function'\n ? value\n : undefined;\n}\nfunction asCredentialsRemote(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const candidate = value;\n return typeof candidate.describe === 'function' && typeof candidate.set === 'function'\n ? candidate\n : undefined;\n}\nfunction credentialsFromLegacyConnection(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const credentials = value.api?.credentials;\n if (credentials === undefined || typeof credentials.describe !== 'function' || typeof credentials.set !== 'function')\n return undefined;\n const legacy = credentials;\n return {\n async describe(refs) {\n const response = await legacy.describe({ refs });\n return response.result.ok\n ? { ok: true, value: response.result.value.credentials }\n : { ok: false };\n },\n async set(ref, credentialValue) {\n const response = await legacy.set({ ref, value: credentialValue });\n return response.result.ok\n ? { ok: true }\n : { ok: false, error: response.result.error };\n },\n };\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [workflows, setWorkflows] = useState([]);\n const [activeWorkflow, setActiveWorkflow] = useState('');\n const [timeoutSeconds, setTimeoutSeconds] = useState(DEFAULT_COMFYUI_TIMEOUT_MS / 1000);\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n const [messageIsError, setMessageIsError] = useState(false);\n const reportMessage = (text) => { setMessage(text); setMessageIsError(false); };\n const reportError = (text) => { setMessage(text); setMessageIsError(true); };\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n comfyui: t('providerComfyUI'),\n };\n useEffect(() => {\n const value = snapshot.value;\n const next = value?.provider ?? 'google';\n setProvider(next);\n setModel(modelOf(next, value));\n setBaseURL(baseURLOf(next, value));\n setWorkflows(resolveComfyUIWorkflows(value ?? {}));\n setActiveWorkflow(activeComfyUIWorkflow(value ?? {})?.name ?? '');\n setTimeoutSeconds(Math.max(1, Math.round((value?.comfyuiTimeoutMs ?? DEFAULT_COMFYUI_TIMEOUT_MS) / 1000)));\n setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined) {\n setConfigured(undefined);\n return;\n }\n let active = true;\n void props.credentials.describe([keyRef]).then(response => {\n if (active)\n setConfigured(response.ok ? response.value?.[keyRef]?.configured ?? false : undefined);\n }).catch(() => { if (active)\n setConfigured(undefined); });\n return () => { active = false; };\n }, [props.credentials, provider]);\n const save = async (event) => {\n event.preventDefault();\n setSaving(true);\n setMessage('');\n try {\n await props.scope.set('provider', provider);\n if (provider === 'comfyui') {\n const entries = workflows.map(entry => ({ name: entry.name.trim(), json: entry.json, presetPrompt: (entry.presetPrompt ?? '').trim() }));\n for (const entry of entries) {\n if (entry.name.length === 0)\n throw new Error(t('workflowNameRequired'));\n validateComfyUIWorkflowJson(entry.json);\n }\n if (new Set(entries.map(entry => entry.name)).size !== entries.length)\n throw new Error(t('workflowDuplicateName'));\n const activeEntry = entries.find(entry => entry.name === activeWorkflow) ?? entries[0];\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflows', entries);\n await props.scope.set('comfyuiActiveWorkflow', activeEntry === undefined ? '' : activeEntry.name);\n // Keep the legacy single-workflow fields in sync so older plugin versions keep working.\n await props.scope.set('comfyuiWorkflowJson', activeEntry === undefined ? '' : activeEntry.json);\n await props.scope.set('comfyuiWorkflowName', activeEntry === undefined ? '' : activeEntry.name);\n await props.scope.set('comfyuiTimeoutMs', Math.max(1, Math.round(timeoutSeconds)) * 1000);\n }\n else {\n await props.scope.set(provider === 'google' ? 'googleModel' : provider === 'openai' ? 'openaiModel' : provider === 'seedream' ? 'seedreamModel' : 'dashscopeModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : provider === 'seedream' ? 'seedreamBaseURL' : 'dashscopeEndpoint', baseURL);\n }\n await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined)\n throw new Error('ComfyUI does not use an API key in this version');\n const response = await props.credentials.set(keyRef, key.trim());\n if (!response.ok)\n throw new Error(response.error?.message ?? 'Failed to save API key');\n setKey('');\n setConfigured(true);\n }\n reportMessage(t('saved'));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n const workflowStatus = activeWorkflow.length > 0 ? t('workflowImported', { name: activeWorkflow }) : t('workflowMissing');\n const importWorkflow = async (event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file === undefined)\n return;\n reportMessage('');\n try {\n if (file.size > MAX_COMFYUI_WORKFLOW_BYTES)\n throw new Error(t('workflowTooLarge'));\n const json = await file.text();\n validateComfyUIWorkflowJson(json);\n const name = uniqueComfyUIWorkflowName(file.name, workflows.map(entry => entry.name));\n setWorkflows(current => [...current, { name, json }]);\n setActiveWorkflow(current => current.length > 0 ? current : name);\n reportMessage(t('workflowImported', { name }));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n /** Renaming the active entry keeps the active selection following its new name. */\n const renameWorkflow = (index, name) => {\n const previous = workflows[index];\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, name } : entry));\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(name);\n };\n /** Removing the active entry moves the selection to the first remaining workflow. */\n const removeWorkflow = (index) => {\n const previous = workflows[index];\n const next = workflows.filter((_entry, position) => position !== index);\n setWorkflows(next);\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(next[0]?.name ?? '');\n };\n /** Editing one entry's preset leaves the rest of the entry untouched. */\n const setWorkflowPreset = (index, presetPrompt) => {\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, presetPrompt } : entry));\n };\n return (_jsxs(\"li\", { className: `dsh-ig-card ${open ? 'dsh-ig-card-open' : ''}`, children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-head\", \"aria-expanded\": open, onClick: () => { setOpen(value => !value); }, children: [_jsxs(\"span\", { className: \"dsh-ig-head-text\", children: [_jsx(\"span\", { className: \"dsh-ig-title\", children: t('title') }), _jsx(\"span\", { className: \"dsh-ig-desc\", children: t('description') })] }), _jsx(\"span\", { className: `dsh-ig-chevron ${open ? 'dsh-ig-chevron-open' : ''}`, \"aria-hidden\": \"true\", children: _jsx(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: _jsx(\"path\", { d: \"M4 6l4 4 4-4\" }) }) })] }), open ? (_jsxs(\"form\", { className: \"dsh-ig-body\", onSubmit: (event) => { void save(event); }, children: [_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('provider') }), _jsxs(\"select\", { className: \"dsh-ig-input\", value: provider, onChange: event => { const next = event.target.value; setProvider(next); setModel(modelOf(next, snapshot.value)); setBaseURL(baseURLOf(next, snapshot.value)); setKey(''); }, children: [_jsx(\"option\", { value: \"google\", children: t('providerGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('providerOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('providerSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('providerDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('providerComfyUI') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('apiKeyLabel', { provider: providerLabels[provider] }) }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"password\", autoComplete: \"off\", value: key, onChange: event => { setKey(event.target.value); }, placeholder: configured ? t('apiKeyPlaceholder') : '' }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('apiKeyHint', { key: KEY_REF[provider] ?? '' }) })] }) : null, _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('endpoint') }), _jsxs(\"div\", { className: \"dsh-ig-input-group\", children: [_jsx(\"input\", { className: \"dsh-ig-input\", type: \"url\", value: baseURL, onChange: event => { setBaseURL(event.target.value); }, required: true }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", title: t('resetTitle'), onClick: () => { setBaseURL(DEFAULT_BASE_URLS[provider]); }, children: t('reset') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: provider === 'google' ? t('endpointHintGoogle') : provider === 'openai' ? t('endpointHintOpenAI') : provider === 'seedream' ? t('endpointHintSeedream') : provider === 'dashscope' ? t('endpointHintDashScope') : t('endpointHintComfyUI') })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('model') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: model, onChange: event => { setModel(event.target.value); }, required: true })] }) : (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('workflow') }), _jsxs(\"div\", { className: \"dsh-ig-file-row\", children: [_jsxs(\"label\", { className: \"dsh-ig-file-button\", children: [_jsx(\"input\", { className: \"dsh-ig-file-input\", type: \"file\", accept: \".json,application/json\", onChange: event => { void importWorkflow(event); } }), t('workflowImport')] }), workflows.length === 0 ? _jsx(\"span\", { className: \"dsh-ig-file-name\", children: t('workflowMissing') }) : null] }), workflows.length > 0 ? (_jsx(\"ul\", { className: \"dsh-ig-workflow-list\", children: workflows.map((entry, index) => (_jsxs(\"li\", { className: \"dsh-ig-workflow-row\", children: [_jsxs(\"div\", { className: \"dsh-ig-workflow-main\", children: [_jsx(\"label\", { className: \"dsh-ig-workflow-active\", title: t('workflowActiveTitle'), children: _jsx(\"input\", { type: \"radio\", name: \"dsh-ig-active-workflow\", \"aria-label\": t('workflowActiveTitle'), checked: entry.name === activeWorkflow, onChange: () => { setActiveWorkflow(entry.name); } }) }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-name\", value: entry.name, title: entry.name, onChange: event => { renameWorkflow(index, event.target.value); } }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", onClick: () => { removeWorkflow(index); }, children: t('workflowRemove') })] }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-preset\", value: entry.presetPrompt ?? '', placeholder: t('workflowPresetPlaceholder'), title: t('workflowPresetTitle'), onChange: event => { setWorkflowPreset(index, event.target.value); } })] }, String(index)))) })) : null, _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('workflowHint') })] }), _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('timeout') }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"number\", min: \"1\", max: \"3600\", step: \"1\", value: timeoutSeconds, onChange: event => { setTimeoutSeconds(Number(event.target.value)); }, required: true }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('timeoutHint') })] })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: `dsh-ig-status${messageIsError ? ' dsh-ig-status-error' : ''}`, role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflows.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */\nexport function GeneratedImageCard(props) {\n const result = imageResultFromBlock(props.block);\n if (props.promoted && result !== undefined)\n return _jsx(PromotedResultNotice, { locale: props.locale });\n return _jsx(ImageResultCard, { result: result, locale: props.locale });\n}\n/** Render modern image artifacts as final conversation output instead of Tool process content. */\nexport function PromotedImageResultNode(props) {\n return _jsx(\"div\", { className: \"dsh-ig-promoted-results\", children: props.node.data.results.map(result => _jsx(ImageResultCard, { result: result, locale: props.locale }, result.attachment.attachmentId)) });\n}\nfunction PromotedResultNotice({ locale }) {\n const lang = usePluginLanguage(locale);\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: DICT[lang].resultShown });\n}\nfunction ImageResultCard({ result, locale, }) {\n const attachment = result?.attachment;\n const savedTo = result?.savedTo;\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const lang = usePluginLanguage(locale);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (result === undefined)\n return;\n void saveGalleryItem({\n id: result.attachment.attachmentId,\n attachment: result.attachment,\n prompt: result.prompt,\n provider: result.provider,\n model: result.model,\n output: result.output,\n ...(result.savedTo ? { savedTo: result.savedTo } : {}),\n ...(result.seed !== undefined ? { seed: result.seed } : {}),\n });\n }, [result?.attachment.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), savedTo !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-savedto\", children: [t('savedToPath'), \": \", savedTo] }) : null, error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction usePluginLanguage(locale) {\n const [lang, setLang] = useState(() => locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n useEffect(() => locale?.subscribe?.(() => {\n setLang(locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n }), [locale]);\n return lang;\n}\nfunction imageResultFromBlock(block) {\n const attachment = imageRef(block);\n if (attachment === undefined)\n return undefined;\n const blockValue = block;\n const meta = blockValue.meta ?? blockValue.resultView?.meta;\n return {\n attachment,\n prompt: typeof meta?.prompt === 'string' ? meta.prompt : blockValue.call?.args?.prompt ?? 'Generated Image',\n provider: typeof meta?.provider === 'string' ? meta.provider : 'google',\n model: typeof meta?.model === 'string' ? meta.model : '',\n output: typeof meta?.output === 'string' ? meta.output : '',\n ...(typeof meta?.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta?.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : activeComfyUIWorkflow(value ?? {})?.name;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_MODELS[provider];\n}\nfunction baseURLOf(provider, value) {\n const stored = provider === 'google' ? value?.googleEndpoint : provider === 'openai' ? value?.openaiBaseURL : provider === 'seedream' ? value?.seedreamBaseURL : provider === 'dashscope' ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"mappings":"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"}