dsh-image-gen 0.2.2 → 0.2.4

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":["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/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';\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}}';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n parseWorkflow(workflowJson);\n}\n/** Parse, clone, and inject one prompt plus an optional randomized seed. */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed()) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n if (value === COMFYUI_PROMPT_PLACEHOLDER) {\n promptReplacements += 1;\n return prompt;\n }\n if (value === COMFYUI_SEED_PLACEHOLDER)\n return seed;\n if (value.includes(COMFYUI_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n return value.replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt);\n }\n return value.includes(COMFYUI_SEED_PLACEHOLDER)\n ? value.replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n : value;\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 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 return inputs === undefined\n ? [nodeId, value]\n : [nodeId, { ...node, inputs: inject(inputs) }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n return prepared;\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} in a text input`);\n }\n return value;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string')\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER);\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}\nfunction randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\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 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 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(\"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","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\n/** Web settings and generated-image cards contributed by the Bundle. */\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.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 workflowReplace: '替换 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '请从 ComfyUI 导出 API Format JSON,并在提示词输入位置写入 {{prompt}};可用 {{seed}} 作为随机种子。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\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 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 Workflow',\n workflowImport: 'Import JSON file',\n workflowReplace: 'Replace 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.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\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 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 = `\r\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}\r\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\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}\r\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\r\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\r\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\r\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\r\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\r\n.dsh-ig-chevron-open{transform:rotate(180deg)}\r\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\r\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\r\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\r\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}\r\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\r\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\r\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\r\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%)}\r\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}\r\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\r\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}\r\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}\r\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\r\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)}\r\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\r\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\r\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\r\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}\r\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\r\n\r\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\r\n.dsh-ig-result-title{font-size:14px;font-weight:600}\r\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}\r\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\r\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}\r\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}\r\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\r\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\r\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}\r\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\r\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\r\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\r\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\r\n\r\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\r\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}\r\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}\r\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\r\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}\r\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\r\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\r\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\r\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}\r\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\r\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}\r\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\r\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\r\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}\r\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)}\r\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}\r\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\r\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\r\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\r\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\r\n\r\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\r\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\r\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}\r\n\r\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}\r\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\r\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}\r\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\r\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}\r\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)}\r\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\r\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\r\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\r\n\r\n/* Pure Centered Lightbox */\r\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}\r\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}\r\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\r\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}\r\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\r\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\r\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}\r\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}\r\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}\r\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}\r\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}\r\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\r\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\r\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}\r\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}\r\n\r\n/* Hide floating chat composer when gallery page is active */\r\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\r\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'remote', 'remote.credentials', '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 const locale = ctx.get('locale');\n const credentials = ctx.remote.credentials;\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 // 1. Settings item\n ctx.slots.inject('settings.plugin.item', () => register({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\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 }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale }),\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}\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 [workflowJson, setWorkflowJson] = useState('');\n const [workflowName, setWorkflowName] = 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 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 setWorkflowJson(value?.comfyuiWorkflowJson ?? '');\n setWorkflowName(value?.comfyuiWorkflowName ?? '');\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 validateComfyUIWorkflowJson(workflowJson);\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflowJson', workflowJson);\n await props.scope.set('comfyuiWorkflowName', workflowName);\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 setMessage(t('saved'));\n }\n catch (cause) {\n setMessage(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 = workflowName.length > 0 ? t('workflowImported', { name: workflowName }) : 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 setMessage('');\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 setWorkflowJson(json);\n setWorkflowName(file.name);\n setMessage(t('workflowImported', { name: file.name }));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\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); } }), workflowName.length > 0 ? t('workflowReplace') : t('workflowImport')] }), _jsx(\"span\", { className: \"dsh-ig-file-name\", title: workflowName, children: workflowName || t('workflowMissing') })] }), _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\", role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflowJson.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Render the durable attachment referenced by a completed image tool call. */\nexport function GeneratedImageCard(props) {\n const attachment = imageRef(props.block);\n const savedTo = imageSavedTo(props.block);\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, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\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 // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (attachment === undefined)\n return;\n const blockAny = props.block;\n const meta = blockAny.meta ?? blockAny.resultView?.meta;\n const prompt = typeof meta?.prompt === 'string' ? meta.prompt : blockAny.call?.args?.prompt ?? 'Generated Image';\n const provider = (typeof meta?.provider === 'string' ? meta.provider : 'google');\n const model = typeof meta?.model === 'string' ? meta.model : '';\n const output = typeof meta?.output === 'string' ? meta.output : '';\n void saveGalleryItem({\n id: attachment.attachmentId,\n attachment,\n prompt,\n provider,\n model,\n output,\n });\n }, [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 modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : value?.comfyuiWorkflowName;\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}\nfunction imageRef(block) { if (!('kind' in block) || block.resultView?.card !== 'generic')\n return undefined; const image = block.resultView.content?.find(item => item.type === 'image'); return image?.type === 'image' ? image.attachment : undefined; }\n/** The workspace file path a completed image call saved, when the result meta carries one. */\nfunction imageSavedTo(block) {\n if (!('kind' in block))\n return undefined;\n const meta = block.meta\n ?? block.resultView?.meta;\n return typeof meta?.savedTo === 'string' ? meta.savedTo : undefined;\n}\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
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';\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}}';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n parseWorkflow(workflowJson);\n}\n/** Parse, clone, and inject one prompt plus an optional randomized seed. */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed()) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n if (value === COMFYUI_PROMPT_PLACEHOLDER) {\n promptReplacements += 1;\n return prompt;\n }\n if (value === COMFYUI_SEED_PLACEHOLDER)\n return seed;\n if (value.includes(COMFYUI_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n return value.replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt);\n }\n return value.includes(COMFYUI_SEED_PLACEHOLDER)\n ? value.replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n : value;\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 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 return inputs === undefined\n ? [nodeId, value]\n : [nodeId, { ...node, inputs: inject(inputs) }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n return prepared;\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} in a text input`);\n }\n return value;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string')\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER);\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}\nfunction randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\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 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 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(\"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/** One image result row per Turn, re-anchored to Turn end after the final answer settles. */\nexport const imageResultDefinition = {\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 // Compact folds only nodes before the finalized answer boundary. Sharing\n // that boundary keeps the artifact beside the answer and outside process.\n anchorSeq: state.answerSeq ?? state.endSeq ?? 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/** 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 };\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, } 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, imageResultDefinition, } 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 workflowReplace: '替换 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '请从 ComfyUI 导出 API Format JSON,并在提示词输入位置写入 {{prompt}};可用 {{seed}} 作为随机种子。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\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 Workflow',\n workflowImport: 'Import JSON file',\n workflowReplace: 'Replace 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.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\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-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-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 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(imageResultDefinition), '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 [workflowJson, setWorkflowJson] = useState('');\n const [workflowName, setWorkflowName] = 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 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 setWorkflowJson(value?.comfyuiWorkflowJson ?? '');\n setWorkflowName(value?.comfyuiWorkflowName ?? '');\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 validateComfyUIWorkflowJson(workflowJson);\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflowJson', workflowJson);\n await props.scope.set('comfyuiWorkflowName', workflowName);\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 setMessage(t('saved'));\n }\n catch (cause) {\n setMessage(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 = workflowName.length > 0 ? t('workflowImported', { name: workflowName }) : 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 setMessage('');\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 setWorkflowJson(json);\n setWorkflowName(file.name);\n setMessage(t('workflowImported', { name: file.name }));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\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); } }), workflowName.length > 0 ? t('workflowReplace') : t('workflowImport')] }), _jsx(\"span\", { className: \"dsh-ig-file-name\", title: workflowName, children: workflowName || t('workflowMissing') })] }), _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\", role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflowJson.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 });\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 };\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : value?.comfyuiWorkflowName;\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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"}