dsh-image-gen 0.2.6 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["record","createContext","useContext","forwardRef","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Image","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","DICT","useState","useRef","useMemo","_jsxs","_jsx","ImageIcon","AlertTriangle","useState","_jsxs","_jsx","_Fragment"],"sources":["types/shared.js","types/comfyui-workflow.js","types/client/gallery-store.js","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/context.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-left.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/copy.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file-text.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/git-compare.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/heart.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/list-todo.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/triangle-alert.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.mjs","types/client/gallery-view.js","types/client/image-ref.js","types/client/image-result-node.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Browser route used for deleting generated images and workspace files. */\nexport const DELETE_ROUTE = '/plugins/dsh-image-gen/delete';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope', 'comfyui'];\n/** Default endpoints and base URLs. */\nexport const DEFAULT_GOOGLE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/interactions';\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_SEEDREAM_BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_DASHSCOPE_ENDPOINT = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_COMFYUI_BASE_URL = 'http://127.0.0.1:8188';\nexport const DEFAULT_COMFYUI_TIMEOUT_MS = 300_000;\nexport const DEFAULT_COMFYUI_WORKFLOW_LABEL = 'API workflow';\nexport const MAX_COMFYUI_WORKFLOW_BYTES = 5 * 1024 * 1024;\n/** Default model names. */\nexport const DEFAULT_GOOGLE_MODEL = 'gemini-3.1-flash-image';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-image-2';\nexport const DEFAULT_SEEDREAM_MODEL = 'doubao-seedream-5-0-260128';\nexport const DEFAULT_DASHSCOPE_MODEL = 'qwen-image-3.0';\n/** Named workflows, falling back to the legacy single-workflow fields when the list is empty. */\nexport function resolveComfyUIWorkflows(source) {\n const named = [];\n for (const entry of source.comfyuiWorkflows ?? []) {\n const name = typeof entry?.name === 'string' ? entry.name.trim() : '';\n const json = typeof entry?.json === 'string' ? entry.json : '';\n if (name.length > 0 && json.trim().length > 0) {\n const presetPrompt = typeof entry.presetPrompt === 'string' ? entry.presetPrompt.trim() : '';\n named.push(presetPrompt.length > 0 ? { name, json, presetPrompt } : { name, json });\n }\n }\n if (named.length > 0)\n return named;\n const legacyJson = typeof source.comfyuiWorkflowJson === 'string' ? source.comfyuiWorkflowJson : '';\n if (legacyJson.trim().length === 0)\n return [];\n const legacyName = typeof source.comfyuiWorkflowName === 'string' ? source.comfyuiWorkflowName.trim() : '';\n return [{ name: legacyName.length > 0 ? legacyName : DEFAULT_COMFYUI_WORKFLOW_LABEL, json: legacyJson }];\n}\n/** The workflow ComfyUI calls use by default: the configured active name, else the first entry. */\nexport function activeComfyUIWorkflow(source) {\n const workflows = resolveComfyUIWorkflows(source);\n if (workflows.length === 0)\n return undefined;\n const activeName = typeof source.comfyuiActiveWorkflow === 'string' ? source.comfyuiActiveWorkflow.trim() : '';\n return workflows.find(workflow => workflow.name === activeName) ?? workflows[0];\n}\n/** Derive a workflow label that does not collide with the given existing names. */\nexport function uniqueComfyUIWorkflowName(name, existing) {\n const base = name.trim().length > 0 ? name.trim() : DEFAULT_COMFYUI_WORKFLOW_LABEL;\n if (!existing.includes(base))\n return base;\n for (let index = 2;; index += 1) {\n const candidate = `${base} (${index})`;\n if (!existing.includes(candidate))\n return candidate;\n }\n}\n/**\n * Combine a workflow's preset with the user prompt: preset first, user second,\n * joined by one comma — never doubled when the preset already ends in a\n * separator, and reduced to the non-empty side when the other is blank.\n */\nexport function mergeComfyUIPrompt(preset, user) {\n const presetText = typeof preset === 'string' ? preset.trim().replace(/[,;\\s]+$/, '') : '';\n const userText = user.trim();\n if (presetText.length === 0)\n return userText;\n if (userText.length === 0)\n return presetText;\n return `${presetText}, ${userText}`;\n}\nexport const DEFAULT_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_MODEL,\n dashscope: DEFAULT_DASHSCOPE_MODEL,\n comfyui: DEFAULT_COMFYUI_WORKFLOW_LABEL,\n};\nexport const DEFAULT_BASE_URLS = {\n google: DEFAULT_GOOGLE_ENDPOINT,\n openai: DEFAULT_OPENAI_BASE_URL,\n seedream: DEFAULT_SEEDREAM_BASE_URL,\n dashscope: DEFAULT_DASHSCOPE_ENDPOINT,\n comfyui: DEFAULT_COMFYUI_BASE_URL,\n};\n//# sourceMappingURL=shared.js.map","/** Pure ComfyUI API-workflow validation and placeholder injection. */\nimport { MAX_COMFYUI_WORKFLOW_BYTES } from './shared.js';\nexport const COMFYUI_PROMPT_PLACEHOLDER = '{{prompt}}';\nexport const COMFYUI_SEED_PLACEHOLDER = '{{seed}}';\nexport const COMFYUI_IMAGE_PLACEHOLDER = '{{image}}';\n/** Legacy single-percent placeholders from early releases, still accepted. */\nconst LEGACY_PROMPT_PLACEHOLDER = '%prompt%';\nconst LEGACY_SEED_PLACEHOLDER = '%seed%';\nconst LEGACY_IMAGE_PLACEHOLDER = '%image%';\n/** LoadImage-style input key that receives the uploaded source image name. */\nconst IMAGE_INPUT_KEY = 'image';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n const workflow = parseWorkflow(workflowJson);\n const imageInputs = countImagePlaceholders(workflow);\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain at most one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n}\n/**\n * Parse, clone, and inject one prompt plus an optional randomized seed.\n *\n * Prompt and seed placeholders are replaced inside any string so existing\n * workflows that embed them in longer text keep working. The image\n * placeholder is stricter: it only matches a dedicated `inputs.image` field\n * whose value is exactly the placeholder, and at most one may exist, because\n * the field must carry a single uploaded file name.\n */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed(), image) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n let replaced = value;\n if (replaced.includes(COMFYUI_PROMPT_PLACEHOLDER) || replaced.includes(LEGACY_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n replaced = replaced\n .replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt)\n .replaceAll(LEGACY_PROMPT_PLACEHOLDER, prompt);\n }\n if (replaced === COMFYUI_SEED_PLACEHOLDER || replaced === LEGACY_SEED_PLACEHOLDER)\n return seed;\n if (replaced.includes(COMFYUI_SEED_PLACEHOLDER) || replaced.includes(LEGACY_SEED_PLACEHOLDER)) {\n replaced = replaced\n .replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n .replaceAll(LEGACY_SEED_PLACEHOLDER, String(seed));\n }\n return replaced;\n }\n if (Array.isArray(value))\n return value.map(inject);\n if (!isRecord(value))\n return value;\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, inject(child)]));\n };\n let imageInputs = 0;\n const prepared = Object.fromEntries(Object.entries(workflow).map(([nodeId, value]) => {\n const node = record(value);\n const inputs = node === undefined ? undefined : record(node.inputs);\n if (inputs === undefined)\n return [nodeId, value];\n const nextInputs = inject(inputs);\n if (isImagePlaceholder(nextInputs[IMAGE_INPUT_KEY])) {\n imageInputs += 1;\n if (image !== undefined)\n nextInputs[IMAGE_INPUT_KEY] = image;\n }\n return [nodeId, { ...node, inputs: nextInputs }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n if (image === undefined) {\n if (imageInputs > 0) {\n throw new Error(`ComfyUI workflow contains an ${COMFYUI_IMAGE_PLACEHOLDER} image input, which requires edit_image with a source image`);\n }\n return prepared;\n }\n if (imageInputs === 0) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input to edit images`);\n }\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n return prepared;\n}\n/** Random seed in the 32-bit range ComfyUI samplers accept. */\nexport function randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\n}\nfunction parseWorkflow(workflowJson) {\n if (workflowJson.trim().length === 0)\n throw new Error('Import a ComfyUI API workflow JSON file in Settings before generating');\n if (new TextEncoder().encode(workflowJson).byteLength > MAX_COMFYUI_WORKFLOW_BYTES) {\n throw new Error('ComfyUI workflow file must be no larger than 5 MB');\n }\n let value;\n try {\n value = JSON.parse(workflowJson);\n }\n catch {\n throw new Error('ComfyUI workflow file is not valid JSON');\n }\n if (!isRecord(value) || Object.keys(value).length === 0) {\n throw new Error('ComfyUI workflow must be a non-empty API-format JSON object');\n }\n if (!Object.values(value).some(node => {\n const inputs = record(node)?.inputs;\n return inputs !== undefined && containsPromptPlaceholder(inputs);\n })) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} (or ${LEGACY_PROMPT_PLACEHOLDER}) in a text input`);\n }\n return value;\n}\n/** Count `inputs.image` fields that are exactly an image placeholder. */\nfunction countImagePlaceholders(workflow) {\n let count = 0;\n for (const node of Object.values(workflow)) {\n const inputs = record(record(node)?.inputs);\n if (inputs !== undefined && isImagePlaceholder(inputs[IMAGE_INPUT_KEY]))\n count += 1;\n }\n return count;\n}\nfunction isImagePlaceholder(value) {\n return value === COMFYUI_IMAGE_PLACEHOLDER || value === LEGACY_IMAGE_PLACEHOLDER;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string') {\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER) || value.includes(LEGACY_PROMPT_PLACEHOLDER);\n }\n if (Array.isArray(value))\n return value.some(containsPromptPlaceholder);\n return isRecord(value) && Object.values(value).some(containsPromptPlaceholder);\n}\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction record(value) {\n return isRecord(value) ? value : undefined;\n}\n//# sourceMappingURL=comfyui-workflow.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n * Preserves existing isFavorite, tags, and original createdAt on re-renders.\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const getReq = store.get(item.id);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n const fav = item.isFavorite !== undefined ? item.isFavorite : existing?.isFavorite;\n const userTags = item.tags !== undefined ? item.tags : existing?.tags;\n const savedPath = item.savedTo !== undefined ? item.savedTo : existing?.savedTo;\n const record = {\n ...existing,\n ...item,\n // Preserve original generation timestamp if already recorded\n createdAt: existing?.createdAt ?? item.createdAt ?? Date.now(),\n ...(fav !== undefined ? { isFavorite: fav } : {}),\n ...(userTags !== undefined ? { tags: userTags } : {}),\n ...(savedPath !== undefined ? { savedTo: savedPath } : {}),\n };\n const putReq = store.put(record);\n putReq.onsuccess = () => resolve();\n putReq.onerror = () => reject(putReq.error);\n };\n getReq.onerror = () => reject(getReq.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Toggle favorite status of a gallery item.\n * Returns the new favorite status (true if favorited, false if unfavorited).\n */\nexport async function toggleFavoriteGalleryItem(id) {\n try {\n const db = await getDB();\n const newStatus = await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n const item = getReq.result;\n if (!item) {\n resolve(false);\n return;\n }\n const nextFavorite = !item.isFavorite;\n item.isFavorite = nextFavorite;\n const putReq = store.put(item);\n putReq.onsuccess = () => resolve(nextFavorite);\n putReq.onerror = () => reject(putReq.error);\n };\n getReq.onerror = () => reject(getReq.error);\n });\n notifyListeners();\n return newStatus;\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to toggle favorite item in IndexedDB:', err);\n return false;\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Bulk delete multiple gallery records by IDs and record tombstones in a single transaction.\n */\nexport async function bulkDeleteGalleryItems(ids) {\n if (ids.length === 0)\n return;\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n const now = Date.now();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n for (const id of ids) {\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: now });\n }\n tx.oncomplete = () => {\n for (const id of ids) {\n tombstones.add(id);\n }\n resolve();\n };\n tx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed'));\n tx.onabort = () => reject(tx.error ?? new Error('IndexedDB transaction aborted'));\n });\n notifyListeners();\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"18\", cy: \"18\", r: \"3\", key: \"1xkwt0\" }],\n [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M13 6h3a2 2 0 0 1 2 2v7\", key: \"1yeb86\" }],\n [\"path\", { d: \"M11 18H8a2 2 0 0 1-2-2V9\", key: \"19pyzm\" }]\n];\nconst GitCompare = createLucideIcon(\"git-compare\", __iconNode);\n\nexport { __iconNode, GitCompare as default };\n//# sourceMappingURL=git-compare.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\",\n key: \"mvr1a0\"\n }\n ]\n];\nconst Heart = createLucideIcon(\"heart\", __iconNode);\n\nexport { __iconNode, Heart as default };\n//# sourceMappingURL=heart.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n];\nconst ListTodo = createLucideIcon(\"list-todo\", __iconNode);\n\nexport { __iconNode, ListTodo as default };\n//# sourceMappingURL=list-todo.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 5H3\", key: \"1qgfaw\" }],\n [\"path\", { d: \"M12 19H3\", key: \"yhmn1j\" }],\n [\"path\", { d: \"M14 3v4\", key: \"1sua03\" }],\n [\"path\", { d: \"M16 17v4\", key: \"1q0r14\" }],\n [\"path\", { d: \"M21 12h-9\", key: \"1o4lsq\" }],\n [\"path\", { d: \"M21 19h-5\", key: \"1rlt1p\" }],\n [\"path\", { d: \"M21 5h-7\", key: \"1oszz2\" }],\n [\"path\", { d: \"M8 10v4\", key: \"tgpxqk\" }],\n [\"path\", { d: \"M8 12H3\", key: \"a7s4jb\" }]\n];\nconst SlidersHorizontal = createLucideIcon(\"sliders-horizontal\", __iconNode);\n\nexport { __iconNode, SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.mjs.map\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery & Studio View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English) with modular tabs, multi-dimensional filters,\n * responsive image grid, and placeholder routes.\n */\nimport { useEffect, useState, useMemo, useRef } from 'react';\nimport { IMAGE_ROUTE, DELETE_ROUTE } from '../shared.js';\nimport { Image as ImageIcon, SlidersHorizontal, Heart, GitCompare, ListTodo, Search, Copy, Download, FileText, Trash2, X, ChevronLeft, ChevronRight, CheckSquare, Check, AlertTriangle, } from 'lucide-react';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, bulkDeleteGalleryItems, toggleFavoriteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n // 顶部 Tab\n tabGallery: '图库',\n tabStudio: '工作台',\n tabFavorites: '收藏',\n tabCompare: '对比',\n tabTasks: '任务',\n // 筛选工具栏\n filterAllProviders: '全部提供商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n filterComfyUI: '本地 ComfyUI',\n filterAllModels: '全部模型',\n filterAllRatios: '全部比例',\n searchPlaceholder: '搜索 Prompt、标签…',\n sortNewest: '最新生成',\n sortOldest: '最早生成',\n // 状态与提示\n totalCount: '共 {count} 张生成图片',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n favEmptyTitle: '暂无收藏图片',\n favEmptyDesc: '在图库中点击卡片右下角的 ♡ 按钮,即可将喜爱的图片收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或调整筛选条件。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n favoriteAdded: '已添加到收藏',\n favoriteRemoved: '已取消收藏',\n // 卡片与弹窗操作\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n prevImage: '上一张 (←)',\n nextImage: '下一张 (→)',\n // 批量管理与删除\n manage: '批量删除',\n exitManage: '退出选择',\n selectedCount: '已选 {n} 项',\n selectAll: '全选',\n invertSelect: '反选',\n clearSelect: '清空',\n batchDelete: '批量删除',\n batchDeleteTitle: '确认批量删除选中的 {count} 张图片?',\n batchDeleteTitleSingle: '确认从画廊中删除这张图片?',\n batchDeleteDesc: '将从画廊历史记录中移除所选图片。',\n deleteWorkspaceFilesOpt: '同时清理工作区磁盘物理文件(不可恢复)',\n cancel: '取消',\n confirmBatchDelete: '确认删除 ({count})',\n confirmDeleteSingle: '确认删除',\n batchDeletedToast: '已删除 {count} 张图片',\n batchDeletedWithFilesToast: '已删除 {count} 张图片,并清理了 {files} 个工作区文件',\n deleteFailedFileLocked: '已删除 {count} 张图片,但有 {files} 个文件因被系统占用未能删除',\n deleteFailedDatabase: '删除失败:本地数据库操作异常',\n // 时间格式化\n justNow: '刚刚',\n minutesAgo: '{n} 分钟前',\n hoursAgo: '{n} 小时前',\n daysAgo: '{n} 天前',\n // 预留模块占位\n studioTitle: 'AI 图像工作台 (Studio)',\n studioDesc: '工作台模块正在紧锣密鼓开发中。在此你将体验大图精修、变体生成 (Variations)、参数重调并一键将生成结果无缝插回 DSH 正在进行的对话。',\n studioTip: '💡 提示:目前你可以在“图库”中点击任意图片,在弹窗中进行查看、复制与下载。',\n compareTitle: '多模型横向对比 (Compare)',\n compareDesc: '支持单个 Prompt 一键同时调度 Gemini、Seedream、DashScope 及本地 ComfyUI 模型并排生成,直观横评画质与细节。',\n tasksTitle: '异步任务队列 (Tasks)',\n tasksDesc: '集中管理后台批量生图、多模型并发生成与本地 ComfyUI 耗时任务。支持状态追踪、失败重试与执行耗时分析。',\n comingSoonBadge: '即将推出',\n },\n en: {\n // Top Tabs\n tabGallery: 'Gallery',\n tabStudio: 'Studio',\n tabFavorites: 'Favorites',\n tabCompare: 'Compare',\n tabTasks: 'Tasks',\n // Filter Toolbar\n filterAllProviders: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n filterComfyUI: 'Local ComfyUI',\n filterAllModels: 'All Models',\n filterAllRatios: 'All Ratios',\n searchPlaceholder: 'Search prompt, tags…',\n sortNewest: 'Newest first',\n sortOldest: 'Oldest first',\n // States & Toasts\n totalCount: '{count} images total',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n favEmptyTitle: 'No favorite images yet',\n favEmptyDesc: 'Click the ♡ button on any card in the gallery to collect your favorite images here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or adjust filter criteria.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n favoriteAdded: 'Added to favorites',\n favoriteRemoved: 'Removed from favorites',\n // Card & Lightbox Actions\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n prevImage: 'Previous (←)',\n nextImage: 'Next (→)',\n // Batch Management & Delete\n manage: 'Batch Delete',\n exitManage: 'Done',\n selectedCount: '{n} selected',\n selectAll: 'Select All',\n invertSelect: 'Invert',\n clearSelect: 'Clear',\n batchDelete: 'Batch Delete',\n batchDeleteTitle: 'Delete {count} selected images?',\n batchDeleteTitleSingle: 'Delete this image from gallery?',\n batchDeleteDesc: 'These images will be removed from your gallery history.',\n deleteWorkspaceFilesOpt: 'Also delete files from workspace disk (cannot be undone)',\n cancel: 'Cancel',\n confirmBatchDelete: 'Delete ({count})',\n confirmDeleteSingle: 'Delete',\n batchDeletedToast: 'Deleted {count} images',\n batchDeletedWithFilesToast: 'Deleted {count} images and cleaned {files} workspace files',\n deleteFailedFileLocked: 'Deleted {count} images, but {files} files could not be deleted (busy/locked)',\n deleteFailedDatabase: 'Failed to delete: local database error',\n // Relative Time\n justNow: 'Just now',\n minutesAgo: '{n}m ago',\n hoursAgo: '{n}h ago',\n daysAgo: '{n}d ago',\n // Route Placeholders\n studioTitle: 'AI Image Studio',\n studioDesc: 'Studio workbench is under active development. Fine-tune prompts, generate variations (2x/4x), and inject images directly into DSH chat.',\n studioTip: '💡 Tip: You can currently click any image in the Gallery to preview, copy, or download it.',\n compareTitle: 'Model Comparison (Compare)',\n compareDesc: 'Side-by-side multi-model benchmarking coming soon. Test Gemini, Seedream, DashScope, and ComfyUI with a single prompt.',\n tasksTitle: 'Task Queue (Tasks)',\n tasksDesc: 'Centralized view for batch generation, asynchronous ComfyUI runs, live progress tracking, and retry controls.',\n comingSoonBadge: 'Coming Soon',\n },\n};\n/** Format human-readable relative time */\nfunction formatRelativeTime(timestamp, t) {\n const diff = Date.now() - timestamp;\n if (diff < 60_000) {\n return t('justNow');\n }\n if (diff < 3600_000) {\n const mins = Math.max(1, Math.floor(diff / 60_000));\n return t('minutesAgo', { n: String(mins) });\n }\n if (diff < 86400_000) {\n const hours = Math.floor(diff / 3600_000);\n return t('hoursAgo', { n: String(hours) });\n }\n if (diff < 30 * 86400_000) {\n const days = Math.floor(diff / 86400_000);\n return t('daysAgo', { n: String(days) });\n }\n const d = new Date(timestamp);\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n}\n/** Extract standard aspect ratio for precise filtering */\nfunction getItemRatio(item) {\n if (item.aspectRatio && item.aspectRatio !== 'custom') {\n return item.aspectRatio;\n }\n if (item.output) {\n const ratioMatch = item.output.match(/\\b(1:1|16:9|9:16|4:3|3:4|3:2|2:3)\\b/);\n if (ratioMatch?.[1])\n return ratioMatch[1];\n const dimMatch = item.output.match(/(\\d{3,4})\\s*[×x*]\\s*(\\d{3,4})/);\n if (dimMatch?.[1] && dimMatch[2]) {\n const w = parseInt(dimMatch[1], 10);\n const h = parseInt(dimMatch[2], 10);\n if (w === h)\n return '1:1';\n const approx = w / h;\n if (Math.abs(approx - 16 / 9) < 0.05)\n return '16:9';\n if (Math.abs(approx - 9 / 16) < 0.05)\n return '9:16';\n if (Math.abs(approx - 4 / 3) < 0.05)\n return '4:3';\n if (Math.abs(approx - 3 / 4) < 0.05)\n return '3:4';\n if (Math.abs(approx - 3 / 2) < 0.05)\n return '3:2';\n if (Math.abs(approx - 2 / 3) < 0.05)\n return '2:3';\n }\n }\n return '1:1';\n}\n/** Format aspect ratio or dimensions for card metadata (e.g., 1024×1024 or 16:9) */\nfunction formatCardMeta(item) {\n if (item.output) {\n const dimMatch = item.output.match(/(\\d{3,4})\\s*[×x*]\\s*(\\d{3,4})/);\n if (dimMatch?.[1] && dimMatch[2]) {\n return `${dimMatch[1]}×${dimMatch[2]}`;\n }\n }\n if (item.aspectRatio && item.aspectRatio !== 'custom') {\n return item.aspectRatio;\n }\n if (item.output) {\n const ratioMatch = item.output.match(/\\b(1:1|16:9|9:16|4:3|3:4|3:2|2:3)\\b/);\n if (ratioMatch?.[1])\n return ratioMatch[1];\n }\n if (item.imageSize) {\n return item.imageSize;\n }\n return '1:1';\n}\nexport const GalleryViewTab = ({ locale }) => {\n const [activeTab, setActiveTab] = useState('gallery');\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [selectedRatio, setSelectedRatio] = useState('all');\n const [sortBy, setSortBy] = useState('newest');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n // Batch Management & Shift-Selection State\n const [isManageMode, setIsManageMode] = useState(false);\n const [selectedIds, setSelectedIds] = useState(new Set());\n const lastSelectedIndexRef = useRef(null);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [deleteWorkspaceFiles, setDeleteWorkspaceFiles] = useState(true);\n const [isDeleting, setIsDeleting] = useState(false);\n // Clear batch selection and shift anchor when switching tabs, searching, or changing filters\n useEffect(() => {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n }, [activeTab, search, selectedProvider, selectedRatio, sortBy]);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery/studio\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n // Load items from IndexedDB\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n const [previewLoading, setPreviewLoading] = useState(false);\n const blobCache = useMemo(() => new Map(), []);\n const abortControllerRef = useRef(null);\n // Multi-dimensional filtering and sorting (Provider, Ratio, Search, and Sort)\n const filteredItems = useMemo(() => {\n return items\n .filter((item) => {\n // Tab-level filter (Favorites tab only shows favorited items)\n if (activeTab === 'favorites' && !item.isFavorite) {\n return false;\n }\n // Provider filter\n if (selectedProvider !== 'all' && item.provider !== selectedProvider) {\n return false;\n }\n // Ratio filter\n if (selectedRatio !== 'all') {\n const ratio = getItemRatio(item);\n if (ratio !== selectedRatio) {\n return false;\n }\n }\n // Search filter (Prompt, model, tags, provider)\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n const matchProvider = item.provider?.toLowerCase().includes(q);\n const matchTags = item.tags?.some((t) => t.toLowerCase().includes(q));\n if (!matchPrompt && !matchModel && !matchProvider && !matchTags) {\n return false;\n }\n }\n return true;\n })\n .sort((a, b) => {\n if (sortBy === 'oldest') {\n return a.createdAt - b.createdAt;\n }\n return b.createdAt - a.createdAt;\n });\n }, [items, activeTab, selectedProvider, selectedRatio, search, sortBy]);\n // Current item index in the active filtered sequence\n const currentPreviewIndex = useMemo(() => {\n if (!previewItem)\n return -1;\n return filteredItems.findIndex((i) => i.id === previewItem.id);\n }, [previewItem, filteredItems]);\n const hasPrev = currentPreviewIndex > 0;\n const hasNext = currentPreviewIndex >= 0 && currentPreviewIndex < filteredItems.length - 1;\n // Safely open or navigate preview item\n const openPreviewItem = (item, blob) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n setPreviewItem(item);\n if (blob) {\n blobCache.set(item.id, blob);\n const url = URL.createObjectURL(blob);\n setPreviewBlob(blob);\n setPreviewUrl(url);\n setPreviewLoading(false);\n return;\n }\n const cached = blobCache.get(item.id);\n if (cached) {\n const url = URL.createObjectURL(cached);\n setPreviewBlob(cached);\n setPreviewUrl(url);\n setPreviewLoading(false);\n return;\n }\n setPreviewLoading(true);\n setPreviewBlob(null);\n setPreviewUrl(null);\n const controller = new AbortController();\n abortControllerRef.current = controller;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (res) => {\n if (!res.ok)\n throw new Error(`HTTP ${res.status}`);\n return res.blob();\n })\n .then((fetchedBlob) => {\n if (controller.signal.aborted)\n return;\n blobCache.set(item.id, fetchedBlob);\n const url = URL.createObjectURL(fetchedBlob);\n setPreviewBlob(fetchedBlob);\n setPreviewUrl(url);\n setPreviewLoading(false);\n })\n .catch((err) => {\n if (controller.signal.aborted)\n return;\n setPreviewLoading(false);\n showToast(t('copyFailed'));\n });\n };\n // Close preview and revoke object URL\n const handleClosePreview = () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n setPreviewLoading(false);\n };\n const goToPrev = () => {\n if (currentPreviewIndex > 0) {\n const prevItem = filteredItems[currentPreviewIndex - 1];\n if (prevItem)\n openPreviewItem(prevItem);\n }\n };\n const goToNext = () => {\n if (currentPreviewIndex >= 0 && currentPreviewIndex < filteredItems.length - 1) {\n const nextItem = filteredItems[currentPreviewIndex + 1];\n if (nextItem)\n openPreviewItem(nextItem);\n }\n };\n // Clean up any remaining preview URL on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current)\n abortControllerRef.current.abort();\n if (previewUrl)\n URL.revokeObjectURL(previewUrl);\n };\n }, [previewUrl]);\n // Keyboard navigation: Esc (close modal or preview), ArrowLeft (prev), ArrowRight (next)\n useEffect(() => {\n const onKeyDown = (e) => {\n if (['INPUT', 'TEXTAREA'].includes(e.target?.tagName)) {\n return;\n }\n if (showDeleteModal) {\n if (e.key === 'Escape' && !isDeleting) {\n e.preventDefault();\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }\n return;\n }\n if (previewItem) {\n if (e.key === 'Escape') {\n handleClosePreview();\n }\n else if (e.key === 'ArrowLeft' || e.key === 'Left') {\n e.preventDefault();\n goToPrev();\n }\n else if (e.key === 'ArrowRight' || e.key === 'Right') {\n e.preventDefault();\n goToNext();\n }\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [showDeleteModal, isDeleting, isManageMode, previewItem, currentPreviewIndex, filteredItems]);\n // Shift-Click Range Selection & Card Click Handler\n const handleCardClick = (item, index, e, blob) => {\n // If holding Shift, or if currently in manage mode:\n if (e.shiftKey || isManageMode) {\n e.stopPropagation();\n if (!isManageMode) {\n setIsManageMode(true);\n }\n if (e.shiftKey && lastSelectedIndexRef.current !== null) {\n const from = Math.min(lastSelectedIndexRef.current, index);\n const to = Math.max(lastSelectedIndexRef.current, index);\n const rangeItems = filteredItems.slice(from, to + 1);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const r of rangeItems) {\n next.add(r.id);\n }\n return next;\n });\n }\n else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) {\n next.delete(item.id);\n }\n else {\n next.add(item.id);\n }\n return next;\n });\n lastSelectedIndexRef.current = index;\n }\n return;\n }\n // Normal click -> open preview\n if (blob) {\n openPreviewItem(item, blob);\n }\n };\n // Toggle selection for a specific card index\n const handleToggleSelect = (id, index, e) => {\n e.stopPropagation();\n if (!isManageMode) {\n setIsManageMode(true);\n }\n if (e.shiftKey && lastSelectedIndexRef.current !== null) {\n const from = Math.min(lastSelectedIndexRef.current, index);\n const to = Math.max(lastSelectedIndexRef.current, index);\n const rangeItems = filteredItems.slice(from, to + 1);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const r of rangeItems) {\n next.add(r.id);\n }\n return next;\n });\n }\n else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n }\n else {\n next.add(id);\n }\n return next;\n });\n lastSelectedIndexRef.current = index;\n }\n };\n const handleSelectAll = () => {\n setSelectedIds(new Set(filteredItems.map((i) => i.id)));\n };\n const handleInvertSelect = () => {\n setSelectedIds((prev) => {\n const next = new Set();\n for (const item of filteredItems) {\n if (!prev.has(item.id)) {\n next.add(item.id);\n }\n }\n return next;\n });\n };\n const handleClearSelect = () => {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n };\n const handleExitManage = () => {\n setIsManageMode(false);\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n };\n // Request single image deletion through the unified modal\n const requestSingleDelete = (item, e) => {\n if (e)\n e.stopPropagation();\n setSelectedIds(new Set([item.id]));\n setShowDeleteModal(true);\n };\n // Execute batch deletion (IndexedDB single transaction + optional workspace disk unlink)\n const handleConfirmBatchDelete = async () => {\n if (selectedIds.size === 0 || isDeleting)\n return;\n setIsDeleting(true);\n const idsToDelete = Array.from(selectedIds);\n const itemsToDelete = items.filter((i) => selectedIds.has(i.id));\n // 1. Separate items: if savedTo is known, ONLY use exact path (no broad scan!)\n const pathsToDelete = itemsToDelete\n .map((i) => i.savedTo)\n .filter((p) => typeof p === 'string' && p.trim().length > 0);\n // 2. Only send attachmentId as fallback for legacy items that lack savedTo:\n const fallbackAttachmentIds = itemsToDelete\n .filter((i) => !i.savedTo || !i.savedTo.trim())\n .map((i) => i.id);\n let deletedFiles = 0;\n let failedFilesCount = 0;\n if (deleteWorkspaceFiles && (pathsToDelete.length > 0 || fallbackAttachmentIds.length > 0)) {\n try {\n const res = await fetch(DELETE_ROUTE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n paths: pathsToDelete,\n attachmentIds: fallbackAttachmentIds,\n }),\n });\n if (res.ok) {\n const data = (await res.json());\n deletedFiles = data.deletedCount ?? 0;\n if (Array.isArray(data.failedFiles)) {\n failedFilesCount = data.failedFiles.length;\n }\n }\n }\n catch (err) {\n console.warn('[dsh-image-gen] Workspace file deletion failed:', err);\n }\n }\n // 3. Perform IndexedDB deletion with real error handling\n try {\n await bulkDeleteGalleryItems(idsToDelete);\n }\n catch (err) {\n setIsDeleting(false);\n showToast(t('deleteFailedDatabase'));\n return;\n }\n // Close lightbox if preview item was deleted\n if (previewItem && selectedIds.has(previewItem.id)) {\n handleClosePreview();\n }\n setIsDeleting(false);\n setShowDeleteModal(false);\n if (isManageMode) {\n handleExitManage();\n }\n else {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n }\n if (failedFilesCount > 0) {\n showToast(t('deleteFailedFileLocked', { count: String(idsToDelete.length), files: String(failedFilesCount) }));\n }\n else if (deletedFiles > 0) {\n showToast(t('batchDeletedWithFilesToast', { count: String(idsToDelete.length), files: String(deletedFiles) }));\n }\n else {\n showToast(t('batchDeletedToast', { count: String(idsToDelete.length) }));\n }\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-studio-tabs-bar\", children: [_jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'gallery' ? 'is-active' : ''}`, onClick: () => setActiveTab('gallery'), children: [_jsx(ImageIcon, { size: 15 }), _jsx(\"span\", { children: t('tabGallery') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'studio' ? 'is-active' : ''}`, onClick: () => setActiveTab('studio'), children: [_jsx(SlidersHorizontal, { size: 15 }), _jsx(\"span\", { children: t('tabStudio') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'favorites' ? 'is-active' : ''}`, onClick: () => setActiveTab('favorites'), children: [_jsx(Heart, { size: 15 }), _jsx(\"span\", { children: t('tabFavorites') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'compare' ? 'is-active' : ''}`, onClick: () => setActiveTab('compare'), children: [_jsx(GitCompare, { size: 15 }), _jsx(\"span\", { children: t('tabCompare') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'tasks' ? 'is-active' : ''}`, onClick: () => setActiveTab('tasks'), children: [_jsx(ListTodo, { size: 15 }), _jsx(\"span\", { children: t('tabTasks') })] })] }), (activeTab === 'gallery' || activeTab === 'favorites') && (_jsxs(\"div\", { className: \"dsh-ig-studio-toolbar\", children: [_jsxs(\"div\", { className: \"dsh-ig-studio-toolbar-left\", children: [_jsxs(\"select\", { className: \"dsh-ig-studio-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAllProviders') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('filterComfyUI') })] }), _jsxs(\"select\", { className: \"dsh-ig-studio-select\", value: selectedRatio, onChange: (e) => setSelectedRatio(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAllRatios') }), _jsx(\"option\", { value: \"1:1\", children: \"1:1\" }), _jsx(\"option\", { value: \"16:9\", children: \"16:9\" }), _jsx(\"option\", { value: \"9:16\", children: \"9:16\" }), _jsx(\"option\", { value: \"4:3\", children: \"4:3\" }), _jsx(\"option\", { value: \"3:4\", children: \"3:4\" }), _jsx(\"option\", { value: \"3:2\", children: \"3:2\" }), _jsx(\"option\", { value: \"2:3\", children: \"2:3\" })] }), _jsxs(\"div\", { className: \"dsh-ig-studio-search-wrap\", children: [_jsx(Search, { className: \"dsh-ig-studio-search-icon\", size: 14 }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-studio-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-studio-toolbar-right\", children: [_jsxs(\"select\", { className: \"dsh-ig-studio-select dsh-ig-studio-select-sort\", value: sortBy, onChange: (e) => setSortBy(e.target.value), children: [_jsx(\"option\", { value: \"newest\", children: t('sortNewest') }), _jsx(\"option\", { value: \"oldest\", children: t('sortOldest') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-btn dsh-ig-studio-btn-danger ${isManageMode ? 'is-active' : ''}`, title: isManageMode ? t('exitManage') : t('manage'), onClick: () => {\n if (isManageMode) {\n handleExitManage();\n }\n else {\n setIsManageMode(true);\n }\n }, children: [_jsx(Trash2, { size: 13 }), _jsx(\"span\", { children: isManageMode ? t('exitManage') : t('manage') })] })] })] })), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: activeTab === 'gallery' || activeTab === 'favorites' ? (items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : activeTab === 'favorites' && filteredItems.length === 0 && search === '' && selectedProvider === 'all' && selectedRatio === 'all' ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83E\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('favEmptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('favEmptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item, idx) => (_jsx(GalleryCard, { item: item, index: idx, isManageMode: isManageMode, isSelected: selectedIds.has(item.id), t: t, onClick: (e, blob) => handleCardClick(item, idx, e, blob), onToggleSelect: (e) => handleToggleSelect(item.id, idx, e), onRequestDelete: () => requestSingleDelete(item), onPreview: (blob) => openPreviewItem(item, blob), onBlobLoaded: (b) => blobCache.set(item.id, b), onToast: showToast }, item.id))) }))) : activeTab === 'studio' ? (_jsx(PlaceholderView, { icon: \"\\uD83C\\uDFA8\", title: t('studioTitle'), description: t('studioDesc'), tip: t('studioTip'), badge: t('comingSoonBadge') })) : activeTab === 'compare' ? (_jsx(PlaceholderView, { icon: \"\\uD83D\\uDD00\", title: t('compareTitle'), description: t('compareDesc'), badge: t('comingSoonBadge') })) : (_jsx(PlaceholderView, { icon: \"\\uD83D\\uDCCB\", title: t('tasksTitle'), description: t('tasksDesc'), badge: t('comingSoonBadge') })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), (isManageMode || selectedIds.size > 0) && (_jsxs(\"div\", { className: \"dsh-ig-batch-bar\", children: [_jsxs(\"div\", { className: \"dsh-ig-batch-bar-left\", children: [_jsx(\"span\", { className: \"dsh-ig-batch-counter\", children: t('selectedCount', { n: String(selectedIds.size) }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleSelectAll, children: t('selectAll') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleInvertSelect, children: t('invertSelect') }), selectedIds.size > 0 && (_jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleClearSelect, children: t('clearSelect') }))] }), _jsxs(\"div\", { className: \"dsh-ig-batch-bar-right\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn dsh-ig-batch-btn-danger\", disabled: selectedIds.size === 0, onClick: () => setShowDeleteModal(true), children: [_jsx(Trash2, { size: 13 }), _jsxs(\"span\", { children: [t('batchDelete'), selectedIds.size > 0 ? ` (${selectedIds.size})` : ''] })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn dsh-ig-batch-btn-exit\", onClick: handleExitManage, children: t('exitManage') })] })] })), showDeleteModal && (_jsx(\"div\", { className: \"dsh-ig-modal-backdrop\", onClick: () => {\n if (!isDeleting) {\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }\n }, children: _jsxs(\"div\", { className: \"dsh-ig-modal-box\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-modal-header\", children: [_jsx(\"div\", { className: \"dsh-ig-modal-icon-danger\", children: _jsx(AlertTriangle, { size: 20 }) }), _jsx(\"div\", { className: \"dsh-ig-modal-title\", children: selectedIds.size === 1\n ? t('batchDeleteTitleSingle')\n : t('batchDeleteTitle', { count: String(selectedIds.size) }) })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-body\", children: [_jsx(\"p\", { className: \"dsh-ig-modal-desc\", children: t('batchDeleteDesc') }), _jsxs(\"label\", { className: \"dsh-ig-modal-checkbox-label\", children: [_jsx(\"input\", { type: \"checkbox\", checked: deleteWorkspaceFiles, onChange: (e) => setDeleteWorkspaceFiles(e.target.checked), disabled: isDeleting }), _jsx(\"span\", { children: t('deleteWorkspaceFilesOpt') })] })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-footer\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-cancel\", onClick: () => {\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }, disabled: isDeleting, children: t('cancel') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-danger\", onClick: handleConfirmBatchDelete, disabled: isDeleting, children: isDeleting\n ? '...'\n : selectedIds.size === 1\n ? t('confirmDeleteSingle')\n : t('confirmBatchDelete', { count: String(selectedIds.size) }) })] })] }) })), previewItem && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: handleClosePreview, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null, currentPreviewIndex >= 0 && (_jsxs(\"span\", { className: \"dsh-ig-lightbox-counter\", children: [currentPreviewIndex + 1, \" / \", filteredItems.length] }))] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: handleClosePreview, children: _jsx(X, { size: 18 }) })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav-btn dsh-ig-lightbox-nav-prev\", title: t('prevImage'), disabled: !hasPrev, onClick: (e) => {\n e.stopPropagation();\n goToPrev();\n }, children: _jsx(ChevronLeft, { size: 24 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav-btn dsh-ig-lightbox-nav-next\", title: t('nextImage'), disabled: !hasNext, onClick: (e) => {\n e.stopPropagation();\n goToNext();\n }, children: _jsx(ChevronRight, { size: 24 }) }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: previewLoading ? (_jsx(\"div\", { className: \"dsh-ig-lightbox-loading\", children: _jsx(\"div\", { className: \"dsh-ig-lightbox-spinner\" }) })) : previewUrl ? (_jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt })) : null }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsx(FileText, { size: 14 }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsx(Copy, { size: 14 }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n if (!previewUrl)\n return;\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsx(Download, { size: 14 }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: () => {\n if (previewItem) {\n requestSingleDelete(previewItem);\n }\n }, children: [_jsx(Trash2, { size: 14 }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, index: _index, isManageMode, isSelected, t, onClick, onToggleSelect, onRequestDelete, onPreview: _onPreview, onBlobLoaded, onToast, }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n onBlobLoaded?.(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const toggleFavorite = async (e) => {\n e.stopPropagation();\n const nextStatus = await toggleFavoriteGalleryItem(item.id);\n onToast(nextStatus ? t('favoriteAdded') : t('favoriteRemoved'));\n };\n // Label for top badge: show model or fallback to provider\n const badgeLabel = item.model || item.provider;\n return (_jsxs(\"div\", { className: `dsh-ig-gallery-card ${isSelected ? 'is-selected' : ''} ${isManageMode ? 'is-manage-mode' : ''}`, onClick: (e) => onClick(e, blob), children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [_jsx(\"button\", { type: \"button\", className: `dsh-ig-card-checkbox ${isSelected ? 'is-checked' : ''}`, title: isSelected ? t('clearSelect') : t('manage'), onClick: onToggleSelect, children: isSelected && _jsx(Check, { size: 11, strokeWidth: 3 }) }), loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsx(Copy, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsx(Download, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsx(FileText, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: (e) => {\n e.stopPropagation();\n onRequestDelete();\n }, children: _jsx(Trash2, { size: 13 }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsx(\"div\", { className: \"dsh-ig-card-badge-row\", children: _jsx(\"span\", { className: \"dsh-ig-card-badge\", title: badgeLabel, children: badgeLabel }) }), _jsx(\"div\", { className: \"dsh-ig-gallery-card-prompt-line\", title: item.prompt, children: item.prompt }), _jsxs(\"div\", { className: \"dsh-ig-card-footer-row\", children: [_jsxs(\"span\", { className: \"dsh-ig-card-meta-text\", children: [formatCardMeta(item), \" | \", formatRelativeTime(item.createdAt, t)] }), _jsx(\"button\", { type: \"button\", className: `dsh-ig-card-fav-btn ${item.isFavorite ? 'is-favorited' : ''}`, title: item.isFavorite ? t('favoriteRemoved') : t('favoriteAdded'), onClick: (e) => {\n void toggleFavorite(e);\n }, children: _jsx(Heart, { size: 15, fill: item.isFavorite ? 'currentColor' : 'none' }) })] })] })] }));\n};\nconst PlaceholderView = ({ icon, title, description, tip, badge, }) => {\n return (_jsx(\"div\", { className: \"dsh-ig-placeholder-view\", children: _jsxs(\"div\", { className: \"dsh-ig-placeholder-card\", children: [_jsx(\"div\", { className: \"dsh-ig-placeholder-icon\", children: icon }), _jsxs(\"div\", { className: \"dsh-ig-placeholder-header\", children: [_jsx(\"h2\", { className: \"dsh-ig-placeholder-title\", children: title }), badge && _jsx(\"span\", { className: \"dsh-ig-placeholder-badge\", children: badge })] }), _jsx(\"p\", { className: \"dsh-ig-placeholder-desc\", children: description }), tip && _jsx(\"div\", { className: \"dsh-ig-placeholder-tip\", children: tip })] }) }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","/**\n * Extract the verified durable image attachment from a completed tool result block.\n * Supports legacy rc.2 `resultView.content` and modern DSH `block.content`.\n */\nexport function imageRef(block) {\n if (!('kind' in block))\n return undefined;\n const fromResultView = block.resultView?.card === 'generic'\n ? block.resultView.content?.find(item => item.type === 'image')\n : undefined;\n if (fromResultView?.type === 'image')\n return fromResultView.attachment;\n const fromBlockContent = Array.isArray(block.content)\n ? block.content.find(item => item.type === 'image')\n : undefined;\n if (fromBlockContent?.type === 'image')\n return fromBlockContent.attachment;\n return undefined;\n}\n//# sourceMappingURL=image-ref.js.map","export const IMAGE_RESULT_NODE_KIND = 'dsh-image-result';\n/** Default definition: unknown transcript mode falls back to Compact-safe anchoring. */\nexport const imageResultDefinition = createImageResultDefinition();\n/**\n * One image result row per Turn, anchored at its own tool/result position while\n * the Turn runs, then optionally re-anchored beside the final answer once the\n * Turn closes (only needed under the folding Compact transcript view).\n */\nexport function createImageResultDefinition(options = {}) {\n return {\n kind: IMAGE_RESULT_NODE_KIND,\n target: 'chat',\n match: (event) => {\n const turn = eventTurn(event);\n if (turn === undefined)\n return null;\n if (event.type === 'turn/start')\n return { id: String(turn), role: 'start' };\n if (event.type === 'turn/end')\n return { id: String(turn), role: 'update' };\n if (event.type === 'assistant/message')\n return { id: String(turn), role: 'update' };\n if (event.type === 'tool/result' && imageResultFromMeta(event.data.meta) !== undefined) {\n return { id: String(turn), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n const turn = eventTurn(match.event);\n if (match.event.type !== 'turn/start' || turn === undefined) {\n throw new Error('dsh-image-result start requires turn/start');\n }\n return { turn, results: [] };\n },\n update: (context, match) => {\n if (match.event.type === 'turn/end')\n return { ...context.state, endSeq: match.event.seq };\n if (match.event.type === 'assistant/message')\n return { ...context.state, answerSeq: match.event.seq };\n if (match.event.type !== 'tool/result')\n return context.state;\n const result = imageResultFromMeta(match.event.data.meta);\n if (result === undefined)\n return context.state;\n if (context.state.results.some(candidate => candidate.attachment.attachmentId === result.attachment.attachmentId)) {\n return context.state;\n }\n return { ...context.state, results: [...context.state.results, { ...result, seq: match.event.seq }] };\n },\n buildViewNode: (context) => {\n const state = context.state;\n const last = state?.results.at(-1);\n if (state === undefined || last === undefined)\n return null;\n const location = context.matches.at(-1)?.location ?? context.start?.location ?? { kind: 'unresolved' };\n return {\n key: context.key,\n kind: IMAGE_RESULT_NODE_KIND,\n id: context.id,\n target: 'chat',\n // While the Turn is open the artifact stays at its own tool/result\n // position, so later messages in the same Turn order below it. Once the\n // Turn closes, Compact folds every node before the finalized answer\n // boundary, so the artifact re-anchors beside that answer to stay\n // visible; Normal mode has no folding and keeps the natural position.\n // An unknown transcript mode falls back to the Compact-safe behavior.\n anchorSeq: state.endSeq !== undefined && compactTranscript(options)\n ? state.answerSeq ?? state.endSeq ?? last.seq\n : last.seq,\n location,\n visibility: 'visible',\n data: {\n turn: state.turn,\n results: state.results.map(({ seq: _seq, ...result }) => result),\n },\n };\n },\n };\n}\nfunction compactTranscript(options) {\n try {\n return options.isCompactTranscript?.() ?? true;\n }\n catch {\n return true;\n }\n}\n/** Parse the plugin-owned durable presentation metadata from a Tool result event. */\nexport function imageResultFromMeta(value) {\n const meta = record(value);\n if (meta?.kind !== 'dsh-image-gen')\n return undefined;\n const attachment = imageAttachment(meta.attachment);\n if (attachment === undefined)\n return undefined;\n return {\n attachment,\n prompt: stringValue(meta.prompt, 'Generated Image'),\n provider: stringValue(meta.provider, 'google'),\n model: stringValue(meta.model, ''),\n output: stringValue(meta.output, ''),\n ...(typeof meta.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction eventTurn(event) {\n const turn = event.data.turn;\n return typeof turn === 'number' && Number.isSafeInteger(turn) && turn >= 0 ? turn : undefined;\n}\nfunction imageAttachment(value) {\n const candidate = record(value);\n if (candidate === undefined\n || typeof candidate.attachmentId !== 'string'\n || !isImageMediaType(candidate.mediaType)\n || !positiveInteger(candidate.bytes)\n || !positiveInteger(candidate.width)\n || !positiveInteger(candidate.height))\n return undefined;\n const original = record(candidate.originalDimensions);\n if (candidate.originalDimensions !== undefined\n && (original === undefined || !positiveInteger(original.width) || !positiveInteger(original.height)))\n return undefined;\n return {\n attachmentId: candidate.attachmentId,\n mediaType: candidate.mediaType,\n bytes: candidate.bytes,\n width: candidate.width,\n height: candidate.height,\n ...(typeof candidate.name === 'string' ? { name: candidate.name } : {}),\n ...(original === undefined ? {} : { originalDimensions: { width: original.width, height: original.height } }),\n };\n}\nfunction isImageMediaType(value) {\n return value === 'image/png' || value === 'image/jpeg' || value === 'image/webp' || value === 'image/gif';\n}\nfunction positiveInteger(value) {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\nfunction stringValue(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction record(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value\n : undefined;\n}\n//# sourceMappingURL=image-result-node.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, activeComfyUIWorkflow, resolveComfyUIWorkflows, uniqueComfyUIWorkflowName, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nimport { imageRef } from './image-ref.js';\nimport { IMAGE_RESULT_NODE_KIND, createImageResultDefinition, } from './image-result-node.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n providerComfyUI: '本地 ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: '留空即可保留已配置的 Key',\n apiKeyHint: '安全保存为 {key};页面不会读回明文。',\n endpoint: '接口地址',\n reset: '重置',\n resetTitle: '重置为默认官方地址',\n endpointHintGoogle: 'Google 官方地址或反代端点(全路径)。',\n endpointHintOpenAI: '中转站请填其 OpenAI 兼容的 /v1 地址。',\n endpointHintSeedream: '火山方舟兼容的 /api/v3 地址。',\n endpointHintDashScope: '阿里云百炼 DashScope 官方接口地址。',\n endpointHintComfyUI: '正在运行且 DSH Host 可以访问的 ComfyUI 地址,默认使用本机 8188 端口。',\n model: '模型',\n workflow: 'API Workflow 工作流',\n workflowImport: '导入 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '从 ComfyUI 导出 API Format JSON,在提示词输入写入 {{prompt}},种子可用 {{seed}};图生图工作流在 LoadImage 的 image 输入写入 {{image}}(仅一次)。可导入多个工作流,Agent 也能在调用时按名称指定。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\n workflowActiveTitle: '设为当前使用的工作流',\n workflowRemove: '删除',\n workflowPresetPlaceholder: '预设提示词,留空则只用对话内容',\n workflowPresetTitle: '预设提示词:每次调用此工作流时自动加在用户提示词前面。',\n workflowNameRequired: '工作流名称不能为空。',\n workflowDuplicateName: '工作流名称不能重复。',\n timeout: '生成超时(秒)',\n timeoutHint: '包括提交、等待和下载图片;默认 300 秒。',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n resultShown: '图片结果已显示在对话中',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n providerComfyUI: 'Local ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: 'Leave empty to keep configured key',\n apiKeyHint: 'Securely saved as {key}; never read back in plaintext.',\n endpoint: 'Endpoint / Base URL',\n reset: 'Reset',\n resetTitle: 'Reset to official default URL',\n endpointHintGoogle: 'Official Google endpoint or reverse proxy (full path).',\n endpointHintOpenAI: 'OpenAI-compatible /v1 base URL for relays.',\n endpointHintSeedream: 'Volcengine Ark compatible /api/v3 base URL.',\n endpointHintDashScope: 'Official Aliyun DashScope endpoint.',\n endpointHintComfyUI: 'A running ComfyUI server reachable by the DSH Host; the default points to port 8188 on this computer.',\n model: 'Model',\n workflow: 'API Workflows',\n workflowImport: 'Import JSON file',\n workflowMissing: 'No workflow imported',\n workflowImported: 'Imported {name}',\n workflowHint: 'Export an API Format JSON from ComfyUI and place {{prompt}} in its prompt input; {{seed}} is available for a random seed. For image editing put {{image}} (exactly once) in the LoadImage image input. Import as many workflows as you need; the Agent can also pick one by name.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\n workflowActiveTitle: 'Make this the active workflow',\n workflowRemove: 'Remove',\n workflowPresetPlaceholder: 'Preset prompt (optional)',\n workflowPresetTitle: 'Preset prompt: automatically prepended to the user prompt on every call of this workflow.',\n workflowNameRequired: 'Workflow names cannot be empty.',\n workflowDuplicateName: 'Workflow names must be unique.',\n timeout: 'Generation timeout (seconds)',\n timeoutHint: 'Covers submission, waiting, and image download; defaults to 300 seconds.',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n resultShown: 'Image result is shown in the conversation',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\n.dsh-ig-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.dsh-ig-file-button{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font-size:13px;cursor:pointer;transition:background .15s,border-color .15s}\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\n.dsh-ig-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,inherit);font-size:12px}\n.dsh-ig-workflow-list{list-style:none;margin:0;padding:0;display:grid;gap:8px}\n.dsh-ig-workflow-row{display:flex;flex-direction:column;gap:6px;padding:8px;border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px}\n.dsh-ig-workflow-main{display:flex;align-items:center;gap:8px}\n.dsh-ig-workflow-active{display:inline-flex;align-items:center;cursor:pointer;flex:none}\n.dsh-ig-workflow-active input[type=radio]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0;cursor:pointer}\n.dsh-ig-workflow-name{flex:1;min-width:0}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-status-error{color:var(--dsw-alias-label-error,#d33);font-weight:500}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-promoted-results{display:grid;gap:16px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery & Studio View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n\n/* 1. Top Navigation Tab Bar */\n.dsh-ig-studio-tabs-bar{display:flex;align-items:center;gap:6px;padding:6px 24px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-studio-tab-btn{appearance:none;-webkit-appearance:none;border:0;background:transparent;display:inline-flex;align-items:center;gap:7px;padding:7px 14px;font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#64748b);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease}\n.dsh-ig-studio-tab-btn:hover{color:var(--dsw-alias-label-primary,#0f172a);background:var(--dsw-alias-bg-layer-2,#f1f5f9)}\n.dsh-ig-studio-tab-btn.is-active{color:var(--dsw-alias-brand-primary,#2563eb);font-weight:600;background:rgba(37,99,235,0.08)}\n\n/* 2. Secondary Filter & Search Toolbar */\n.dsh-ig-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 24px;background:var(--dsw-alias-bg-layer-1,#ffffff);border-bottom:1px solid var(--dsw-alias-border-l2,#f1f5f9);flex-shrink:0;flex-wrap:wrap}\n.dsh-ig-studio-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}\n.dsh-ig-studio-toolbar-right{display:flex;align-items:center;gap:10px;flex-shrink:0}\n\n/* Modern Custom Select (Removes OS default arrows & ugly borders) */\n.dsh-ig-studio-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;height:32px;line-height:30px;padding:0 28px 0 12px;font-size:12.5px;color:var(--dsw-alias-label-primary,#334155);background-color:var(--dsw-alias-bg-layer-2,#ffffff);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 9px center;border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:6px;outline:none;cursor:pointer;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}\n.dsh-ig-studio-select:hover{border-color:var(--dsw-alias-border-l1,#cbd5e1);background-color:var(--dsw-alias-bg-layer-1,#f8fafc)}\n.dsh-ig-studio-select:focus{border-color:var(--dsw-alias-brand-primary,#3b82f6);box-shadow:0 0 0 2px rgba(59,130,246,0.15)}\n.dsh-ig-studio-select-sort{font-weight:500}\n\n/* Unified Search Input */\n.dsh-ig-studio-search-wrap{position:relative;display:flex;align-items:center;min-width:190px;max-width:320px;flex:1}\n.dsh-ig-studio-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#94a3b8);pointer-events:none}\n.dsh-ig-studio-search-input{width:100%;height:32px;line-height:30px;padding:0 12px 0 32px;font-size:12.5px;border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:6px;background-color:var(--dsw-alias-bg-layer-2,#ffffff);color:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}\n.dsh-ig-studio-search-input:hover{border-color:var(--dsw-alias-border-l1,#cbd5e1)}\n.dsh-ig-studio-search-input:focus{border-color:var(--dsw-alias-brand-primary,#3b82f6);box-shadow:0 0 0 2px rgba(59,130,246,0.15)}\n.dsh-ig-studio-search-input::placeholder{color:var(--dsw-alias-label-tertiary,#94a3b8)}\n\n/* 3. Grid & Responsive Cards */\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:20px 24px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:18px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#ffffff);border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:10px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 10px 20px -5px rgba(0,0,0,0.06),0 4px 6px -2px rgba(0,0,0,0.03);border-color:var(--dsw-alias-border-l1,#cbd5e1)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f1f5f9;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s ease}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#94a3b8}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar on Card Hover */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:6px;left:6px;display:flex;align-items:center;gap:3px;padding:3px 5px;border-radius:6px;background:rgba(15,23,42,0.72);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n/* Card Bottom Metadata */\n.dsh-ig-gallery-card-meta{padding:10px 12px;display:flex;flex-direction:column;gap:5px;background:var(--dsw-alias-bg-layer-2,#ffffff);flex:1}\n.dsh-ig-card-badge-row{display:flex;align-items:center}\n.dsh-ig-card-badge{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#f1f5f9);color:var(--dsw-alias-label-secondary,#475569);font-size:11px;font-weight:500;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-ig-gallery-card-prompt-line{font-size:12.5px;font-weight:500;color:var(--dsw-alias-label-primary,#1e293b);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-ig-card-footer-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:2px}\n.dsh-ig-card-meta-text{font-size:11px;color:var(--dsw-alias-label-tertiary,#94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.dsh-ig-card-fav-btn{appearance:none;border:0;background:transparent;color:var(--dsw-alias-label-tertiary,#94a3b8);padding:2px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:color .15s,transform .15s;flex-shrink:0}\n.dsh-ig-card-fav-btn:hover{color:#ef4444;transform:scale(1.15)}\n.dsh-ig-card-fav-btn.is-favorited{color:#ef4444}\n\n/* Placeholders for Upcoming Routes */\n.dsh-ig-placeholder-view{display:flex;align-items:center;justify-content:center;min-height:360px;height:100%;padding:24px}\n.dsh-ig-placeholder-card{max-width:500px;width:100%;text-align:center;padding:36px 28px;background:var(--dsw-alias-bg-layer-2,#ffffff);border:1px dashed var(--dsw-alias-border-l2,#e2e8f0);border-radius:14px;display:flex;flex-direction:column;align-items:center;gap:12px}\n.dsh-ig-placeholder-icon{font-size:40px;line-height:1}\n.dsh-ig-placeholder-header{display:flex;align-items:center;gap:8px;justify-content:center}\n.dsh-ig-placeholder-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin:0}\n.dsh-ig-placeholder-badge{font-size:11px;font-weight:500;background:rgba(37,99,235,0.1);color:#2563eb;padding:2px 8px;border-radius:12px}\n.dsh-ig-placeholder-desc{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary,#64748b);margin:0}\n.dsh-ig-placeholder-tip{margin-top:6px;padding:8px 12px;font-size:12px;background:var(--dsw-alias-bg-layer-3,#f8fafc);border-radius:8px;color:var(--dsw-alias-label-tertiary,#64748b);text-align:left}\n\n/* Empty State */\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#94a3b8)}\n.dsh-ig-gallery-empty-icon{font-size:44px;margin-bottom:10px}\n.dsh-ig-gallery-empty-title{font-size:15px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:4px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-counter{display:inline-flex;align-items:center;padding:2px 8px;border-radius:4px;background:rgba(255,255,255,0.15);color:#fff;font-size:11.5px;font-weight:500;font-variant-numeric:tabular-nums}\n.dsh-ig-lightbox-nav-btn{position:fixed;top:50%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.12);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:background-color .15s ease,transform .15s ease,opacity .15s ease;outline:none}\n.dsh-ig-lightbox-nav-btn:hover:not(:disabled){background:rgba(255,255,255,0.28);transform:translateY(-50%) scale(1.08)}\n.dsh-ig-lightbox-nav-btn:disabled{opacity:0.2;cursor:not-allowed;pointer-events:none}\n.dsh-ig-lightbox-nav-prev{left:24px}\n.dsh-ig-lightbox-nav-next{right:24px}\n.dsh-ig-lightbox-loading{display:flex;align-items:center;justify-content:center;min-width:180px;min-height:180px}\n.dsh-ig-lightbox-spinner{width:36px;height:36px;border:3px solid rgba(255,255,255,0.2);border-top-color:#fff;border-radius:50%;animation:dsh-ig-spin .8s linear infinite}\n@keyframes dsh-ig-spin{to{transform:rotate(360deg)}}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Card selection and checkbox */\n.dsh-ig-gallery-card.is-selected{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary,#2563eb);border-color:transparent}\n.dsh-ig-card-checkbox{position:absolute;top:8px;left:8px;width:22px;height:22px;border-radius:50%;border:1.5px solid rgba(255,255,255,0.7);background:rgba(0,0,0,0.35);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);color:#fff;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;z-index:5;opacity:0;transition:opacity .15s ease,background-color .15s ease,border-color .15s ease;padding:0;outline:none}\n.dsh-ig-gallery-card:hover .dsh-ig-card-checkbox,.dsh-ig-gallery-card.is-manage-mode .dsh-ig-card-checkbox,.dsh-ig-card-checkbox.is-checked{opacity:1}\n.dsh-ig-card-checkbox.is-checked{background:var(--dsw-alias-brand-primary,#2563eb);border-color:var(--dsw-alias-brand-primary,#2563eb)}\n\n/* Studio button in toolbar */\n.dsh-ig-studio-btn{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;box-sizing:border-box;border-radius:6px;border:1px solid var(--dsw-alias-border-subtle,rgba(0,0,0,0.12));background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,inherit);font-size:12.5px;font-weight:500;cursor:pointer;transition:border-color .15s,background .15s,color .15s}\n.dsh-ig-studio-btn:hover{background:var(--dsw-alias-bg-layer-3,#f3f4f6);border-color:var(--dsw-alias-border-default,rgba(0,0,0,0.2))}\n.dsh-ig-studio-btn.is-active{background:var(--dsw-alias-brand-primary,#2563eb);border-color:var(--dsw-alias-brand-primary,#2563eb);color:#fff}\n.dsh-ig-studio-btn-danger{color:#ef4444;border-color:rgba(239,68,68,0.35);background:rgba(239,68,68,0.06)}\n.dsh-ig-studio-btn-danger:hover{background:rgba(239,68,68,0.14);border-color:rgba(239,68,68,0.6);color:#dc2626}\n.dsh-ig-studio-btn-danger.is-active{background:#dc2626;border-color:#dc2626;color:#fff}\n\n/* Floating Batch Action Bar */\n.dsh-ig-batch-bar{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:16px;background:rgba(20,24,32,0.92);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,0.18);border-radius:40px;padding:8px 16px;box-shadow:0 16px 40px rgba(0,0,0,0.5);z-index:99990;animation:dsh-ig-slide-up .2s cubic-bezier(0.16,1,0.3,1);color:#fff}\n@keyframes dsh-ig-slide-up{from{transform:translate(-50%,20px);opacity:0}to{transform:translate(-50%,0);opacity:1}}\n.dsh-ig-batch-bar-left{display:flex;align-items:center;gap:10px}\n.dsh-ig-batch-bar-right{display:flex;align-items:center;gap:8px;border-left:1px solid rgba(255,255,255,0.15);padding-left:12px}\n.dsh-ig-batch-counter{font-size:13px;font-weight:600;color:rgba(255,255,255,0.95);margin-right:4px}\n.dsh-ig-batch-btn{appearance:none;border:1px solid rgba(255,255,255,0.15);background:rgba(255,255,255,0.08);color:#fff;border-radius:20px;padding:5px 12px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-batch-btn:hover:not(:disabled){background:rgba(255,255,255,0.2)}\n.dsh-ig-batch-btn:disabled{opacity:0.4;cursor:not-allowed}\n.dsh-ig-batch-btn-danger{background:rgba(239,68,68,0.2);border-color:rgba(239,68,68,0.5);color:#fca5a5}\n.dsh-ig-batch-btn-danger:hover:not(:disabled){background:rgba(239,68,68,0.4)!important;border-color:rgba(239,68,68,0.8)!important;color:#fff!important}\n.dsh-ig-batch-btn-exit{border-color:transparent;background:transparent;color:rgba(255,255,255,0.7)}\n.dsh-ig-batch-btn-exit:hover{background:rgba(255,255,255,0.1);color:#fff}\n\n/* Batch Delete Confirmation Modal */\n.dsh-ig-modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,0.65);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:99995;display:flex;align-items:center;justify-content:center;padding:16px;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-modal-box{width:100%;max-width:440px;background:var(--dsw-alias-bg-layer-1,#1c1e24);border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.12));border-radius:12px;padding:22px;box-sizing:border-box;box-shadow:0 20px 50px rgba(0,0,0,0.45);color:var(--dsw-alias-label-primary,#fff);animation:dsh-ig-scale-up .15s ease-out}\n@keyframes dsh-ig-scale-up{from{transform:scale(0.95);opacity:0}to{transform:scale(1);opacity:1}}\n.dsh-ig-modal-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px}\n.dsh-ig-modal-icon-danger{width:36px;height:36px;border-radius:50%;background:rgba(239,68,68,0.12);color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.dsh-ig-modal-title{font-size:16px;font-weight:600;line-height:1.4}\n.dsh-ig-modal-body{margin-bottom:20px;padding-left:48px}\n.dsh-ig-modal-desc{font-size:13.5px;color:var(--dsw-alias-label-secondary,rgba(255,255,255,0.7));margin:0 0 14px 0;line-height:1.5}\n.dsh-ig-modal-checkbox-label{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--dsw-alias-label-primary,inherit);cursor:pointer;user-select:none}\n.dsh-ig-modal-checkbox-label input{margin:0;cursor:pointer;width:15px;height:15px}\n.dsh-ig-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px}\n.dsh-ig-modal-btn{height:34px;padding:0 14px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s,color .15s;outline:none}\n.dsh-ig-modal-btn-cancel{background:transparent;border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.2));color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-modal-btn-cancel:hover{background:var(--dsw-alias-bg-layer-3,rgba(255,255,255,0.08))}\n.dsh-ig-modal-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}\n.dsh-ig-modal-btn-danger:hover{background:#b91c1c;border-color:#b91c1c}\n\n/* Hide floating chat composer when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n // Host-owned chat transcript preference (\"ui-chat\" transcriptView). Unknown,\n // unavailable, or not-yet-loaded reads fall back to Compact-safe anchoring.\n const chatScope = ctx.settingsScope.bind({ namespace: 'ui-chat' });\n const isCompactTranscript = () => chatScope.getSnapshot().value?.transcriptView !== 'normal';\n const locale = ctx.get('locale');\n const promotion = { enabled: false };\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = STYLE;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n ctx.inject(['uiConversation'], (owner) => {\n const uiConversation = asModernUiConversation(owner.get('uiConversation'));\n if (uiConversation === undefined) {\n throw new Error('dsh-image-gen: uiConversation has an incompatible interface');\n }\n promotion.enabled = true;\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.effect(() => uiConversation.events.register(createImageResultDefinition({ isCompactTranscript })), 'dsh-image-gen: promoted image result node');\n owner.slots.inject('conversation.chat.node', () => ownerRegister({\n name: 'conversation.chat.node',\n key: IMAGE_RESULT_NODE_KIND,\n inject: () => ({ locale }),\n }, PromotedImageResultNode));\n });\n // 1. Settings item\n const injectSettingsItem = (owner, credentials) => {\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.slots.inject('settings.plugin.item', () => ownerRegister({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\n };\n const remoteCredentials = asCredentialsRemote(ctx.get('remote.credentials'));\n const legacyCredentials = credentialsFromLegacyConnection(ctx.get('connection'));\n if (remoteCredentials !== undefined) {\n injectSettingsItem(ctx, remoteCredentials);\n }\n else if (legacyCredentials !== undefined) {\n injectSettingsItem(ctx, legacyCredentials);\n }\n else {\n ctx.inject(['remote.credentials'], (remoteCtx) => {\n const credentials = asCredentialsRemote(remoteCtx.get('remote.credentials'));\n if (credentials === undefined)\n throw new Error('dsh-image-gen: remote.credentials has an incompatible interface');\n injectSettingsItem(remoteCtx, credentials);\n });\n }\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\nfunction asModernUiConversation(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const events = value.events;\n if (events === null || typeof events !== 'object')\n return undefined;\n return typeof events.register === 'function'\n ? value\n : undefined;\n}\nfunction asCredentialsRemote(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const candidate = value;\n return typeof candidate.describe === 'function' && typeof candidate.set === 'function'\n ? candidate\n : undefined;\n}\nfunction credentialsFromLegacyConnection(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const credentials = value.api?.credentials;\n if (credentials === undefined || typeof credentials.describe !== 'function' || typeof credentials.set !== 'function')\n return undefined;\n const legacy = credentials;\n return {\n async describe(refs) {\n const response = await legacy.describe({ refs });\n return response.result.ok\n ? { ok: true, value: response.result.value.credentials }\n : { ok: false };\n },\n async set(ref, credentialValue) {\n const response = await legacy.set({ ref, value: credentialValue });\n return response.result.ok\n ? { ok: true }\n : { ok: false, error: response.result.error };\n },\n };\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [workflows, setWorkflows] = useState([]);\n const [activeWorkflow, setActiveWorkflow] = useState('');\n const [timeoutSeconds, setTimeoutSeconds] = useState(DEFAULT_COMFYUI_TIMEOUT_MS / 1000);\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n const [messageIsError, setMessageIsError] = useState(false);\n const reportMessage = (text) => { setMessage(text); setMessageIsError(false); };\n const reportError = (text) => { setMessage(text); setMessageIsError(true); };\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n comfyui: t('providerComfyUI'),\n };\n useEffect(() => {\n const value = snapshot.value;\n const next = value?.provider ?? 'google';\n setProvider(next);\n setModel(modelOf(next, value));\n setBaseURL(baseURLOf(next, value));\n setWorkflows(resolveComfyUIWorkflows(value ?? {}));\n setActiveWorkflow(activeComfyUIWorkflow(value ?? {})?.name ?? '');\n setTimeoutSeconds(Math.max(1, Math.round((value?.comfyuiTimeoutMs ?? DEFAULT_COMFYUI_TIMEOUT_MS) / 1000)));\n setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined) {\n setConfigured(undefined);\n return;\n }\n let active = true;\n void props.credentials.describe([keyRef]).then(response => {\n if (active)\n setConfigured(response.ok ? response.value?.[keyRef]?.configured ?? false : undefined);\n }).catch(() => { if (active)\n setConfigured(undefined); });\n return () => { active = false; };\n }, [props.credentials, provider]);\n const save = async (event) => {\n event.preventDefault();\n setSaving(true);\n setMessage('');\n try {\n await props.scope.set('provider', provider);\n if (provider === 'comfyui') {\n const entries = workflows.map(entry => ({ name: entry.name.trim(), json: entry.json, presetPrompt: (entry.presetPrompt ?? '').trim() }));\n for (const entry of entries) {\n if (entry.name.length === 0)\n throw new Error(t('workflowNameRequired'));\n validateComfyUIWorkflowJson(entry.json);\n }\n if (new Set(entries.map(entry => entry.name)).size !== entries.length)\n throw new Error(t('workflowDuplicateName'));\n const activeEntry = entries.find(entry => entry.name === activeWorkflow) ?? entries[0];\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflows', entries);\n await props.scope.set('comfyuiActiveWorkflow', activeEntry === undefined ? '' : activeEntry.name);\n // Keep the legacy single-workflow fields in sync so older plugin versions keep working.\n await props.scope.set('comfyuiWorkflowJson', activeEntry === undefined ? '' : activeEntry.json);\n await props.scope.set('comfyuiWorkflowName', activeEntry === undefined ? '' : activeEntry.name);\n await props.scope.set('comfyuiTimeoutMs', Math.max(1, Math.round(timeoutSeconds)) * 1000);\n }\n else {\n await props.scope.set(provider === 'google' ? 'googleModel' : provider === 'openai' ? 'openaiModel' : provider === 'seedream' ? 'seedreamModel' : 'dashscopeModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : provider === 'seedream' ? 'seedreamBaseURL' : 'dashscopeEndpoint', baseURL);\n }\n await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined)\n throw new Error('ComfyUI does not use an API key in this version');\n const response = await props.credentials.set(keyRef, key.trim());\n if (!response.ok)\n throw new Error(response.error?.message ?? 'Failed to save API key');\n setKey('');\n setConfigured(true);\n }\n reportMessage(t('saved'));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n const workflowStatus = activeWorkflow.length > 0 ? t('workflowImported', { name: activeWorkflow }) : t('workflowMissing');\n const importWorkflow = async (event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file === undefined)\n return;\n reportMessage('');\n try {\n if (file.size > MAX_COMFYUI_WORKFLOW_BYTES)\n throw new Error(t('workflowTooLarge'));\n const json = await file.text();\n validateComfyUIWorkflowJson(json);\n const name = uniqueComfyUIWorkflowName(file.name, workflows.map(entry => entry.name));\n setWorkflows(current => [...current, { name, json }]);\n setActiveWorkflow(current => current.length > 0 ? current : name);\n reportMessage(t('workflowImported', { name }));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n /** Renaming the active entry keeps the active selection following its new name. */\n const renameWorkflow = (index, name) => {\n const previous = workflows[index];\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, name } : entry));\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(name);\n };\n /** Removing the active entry moves the selection to the first remaining workflow. */\n const removeWorkflow = (index) => {\n const previous = workflows[index];\n const next = workflows.filter((_entry, position) => position !== index);\n setWorkflows(next);\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(next[0]?.name ?? '');\n };\n /** Editing one entry's preset leaves the rest of the entry untouched. */\n const setWorkflowPreset = (index, presetPrompt) => {\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, presetPrompt } : entry));\n };\n return (_jsxs(\"li\", { className: `dsh-ig-card ${open ? 'dsh-ig-card-open' : ''}`, children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-head\", \"aria-expanded\": open, onClick: () => { setOpen(value => !value); }, children: [_jsxs(\"span\", { className: \"dsh-ig-head-text\", children: [_jsx(\"span\", { className: \"dsh-ig-title\", children: t('title') }), _jsx(\"span\", { className: \"dsh-ig-desc\", children: t('description') })] }), _jsx(\"span\", { className: `dsh-ig-chevron ${open ? 'dsh-ig-chevron-open' : ''}`, \"aria-hidden\": \"true\", children: _jsx(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: _jsx(\"path\", { d: \"M4 6l4 4 4-4\" }) }) })] }), open ? (_jsxs(\"form\", { className: \"dsh-ig-body\", onSubmit: (event) => { void save(event); }, children: [_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('provider') }), _jsxs(\"select\", { className: \"dsh-ig-input\", value: provider, onChange: event => { const next = event.target.value; setProvider(next); setModel(modelOf(next, snapshot.value)); setBaseURL(baseURLOf(next, snapshot.value)); setKey(''); }, children: [_jsx(\"option\", { value: \"google\", children: t('providerGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('providerOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('providerSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('providerDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('providerComfyUI') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('apiKeyLabel', { provider: providerLabels[provider] }) }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"password\", autoComplete: \"off\", value: key, onChange: event => { setKey(event.target.value); }, placeholder: configured ? t('apiKeyPlaceholder') : '' }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('apiKeyHint', { key: KEY_REF[provider] ?? '' }) })] }) : null, _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('endpoint') }), _jsxs(\"div\", { className: \"dsh-ig-input-group\", children: [_jsx(\"input\", { className: \"dsh-ig-input\", type: \"url\", value: baseURL, onChange: event => { setBaseURL(event.target.value); }, required: true }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", title: t('resetTitle'), onClick: () => { setBaseURL(DEFAULT_BASE_URLS[provider]); }, children: t('reset') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: provider === 'google' ? t('endpointHintGoogle') : provider === 'openai' ? t('endpointHintOpenAI') : provider === 'seedream' ? t('endpointHintSeedream') : provider === 'dashscope' ? t('endpointHintDashScope') : t('endpointHintComfyUI') })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('model') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: model, onChange: event => { setModel(event.target.value); }, required: true })] }) : (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('workflow') }), _jsxs(\"div\", { className: \"dsh-ig-file-row\", children: [_jsxs(\"label\", { className: \"dsh-ig-file-button\", children: [_jsx(\"input\", { className: \"dsh-ig-file-input\", type: \"file\", accept: \".json,application/json\", onChange: event => { void importWorkflow(event); } }), t('workflowImport')] }), workflows.length === 0 ? _jsx(\"span\", { className: \"dsh-ig-file-name\", children: t('workflowMissing') }) : null] }), workflows.length > 0 ? (_jsx(\"ul\", { className: \"dsh-ig-workflow-list\", children: workflows.map((entry, index) => (_jsxs(\"li\", { className: \"dsh-ig-workflow-row\", children: [_jsxs(\"div\", { className: \"dsh-ig-workflow-main\", children: [_jsx(\"label\", { className: \"dsh-ig-workflow-active\", title: t('workflowActiveTitle'), children: _jsx(\"input\", { type: \"radio\", name: \"dsh-ig-active-workflow\", \"aria-label\": t('workflowActiveTitle'), checked: entry.name === activeWorkflow, onChange: () => { setActiveWorkflow(entry.name); } }) }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-name\", value: entry.name, title: entry.name, onChange: event => { renameWorkflow(index, event.target.value); } }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", onClick: () => { removeWorkflow(index); }, children: t('workflowRemove') })] }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-preset\", value: entry.presetPrompt ?? '', placeholder: t('workflowPresetPlaceholder'), title: t('workflowPresetTitle'), onChange: event => { setWorkflowPreset(index, event.target.value); } })] }, String(index)))) })) : null, _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('workflowHint') })] }), _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('timeout') }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"number\", min: \"1\", max: \"3600\", step: \"1\", value: timeoutSeconds, onChange: event => { setTimeoutSeconds(Number(event.target.value)); }, required: true }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('timeoutHint') })] })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: `dsh-ig-status${messageIsError ? ' dsh-ig-status-error' : ''}`, role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflows.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */\nexport function GeneratedImageCard(props) {\n const result = imageResultFromBlock(props.block);\n if (props.promoted && result !== undefined)\n return _jsx(PromotedResultNotice, { locale: props.locale });\n return _jsx(ImageResultCard, { result: result, locale: props.locale });\n}\n/** Render modern image artifacts as final conversation output instead of Tool process content. */\nexport function PromotedImageResultNode(props) {\n return _jsx(\"div\", { className: \"dsh-ig-promoted-results\", children: props.node.data.results.map(result => _jsx(ImageResultCard, { result: result, locale: props.locale }, result.attachment.attachmentId)) });\n}\nfunction PromotedResultNotice({ locale }) {\n const lang = usePluginLanguage(locale);\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: DICT[lang].resultShown });\n}\nfunction ImageResultCard({ result, locale, }) {\n const attachment = result?.attachment;\n const savedTo = result?.savedTo;\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const lang = usePluginLanguage(locale);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (result === undefined)\n return;\n void saveGalleryItem({\n id: result.attachment.attachmentId,\n attachment: result.attachment,\n prompt: result.prompt,\n provider: result.provider,\n model: result.model,\n output: result.output,\n ...(result.savedTo ? { savedTo: result.savedTo } : {}),\n ...(result.seed !== undefined ? { seed: result.seed } : {}),\n });\n }, [result?.attachment.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), savedTo !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-savedto\", children: [t('savedToPath'), \": \", savedTo] }) : null, error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction usePluginLanguage(locale) {\n const [lang, setLang] = useState(() => locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n useEffect(() => locale?.subscribe?.(() => {\n setLang(locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n }), [locale]);\n return lang;\n}\nfunction imageResultFromBlock(block) {\n const attachment = imageRef(block);\n if (attachment === undefined)\n return undefined;\n const blockValue = block;\n const meta = blockValue.meta ?? blockValue.resultView?.meta;\n return {\n attachment,\n prompt: typeof meta?.prompt === 'string' ? meta.prompt : blockValue.call?.args?.prompt ?? 'Generated Image',\n provider: typeof meta?.provider === 'string' ? meta.provider : 'google',\n model: typeof meta?.model === 'string' ? meta.model : '',\n output: typeof meta?.output === 'string' ? meta.output : '',\n ...(typeof meta?.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta?.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : activeComfyUIWorkflow(value ?? {})?.name;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_MODELS[provider];\n}\nfunction baseURLOf(provider, value) {\n const stored = provider === 'google' ? value?.googleEndpoint : provider === 'openai' ? value?.openaiBaseURL : provider === 'seedream' ? value?.seedreamBaseURL : provider === 'dashscope' ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["record","createContext","useContext","forwardRef","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Image","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","formatRelativeTime","useState","useRef","useCallback","useMemo","_jsxs","_jsx","_Fragment","formatRelativeTime","AlertTriangle","DICT","useState","useMemo","useRef","_jsxs","_jsx","ImageIcon","AlertTriangle","useState","_jsxs","_jsx","_Fragment","useRef"],"sources":["types/shared.js","types/comfyui-workflow.js","types/client/gallery-store.js","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/context.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/bookmark-plus.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-left.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/clipboard.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/copy.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/expand.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file-text.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/heart.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image-plus.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/loader-circle.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/panel-left-close.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/panel-left.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pencil-line.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/sparkles.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/triangle-alert.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/upload.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zoom-in.mjs","../node_modules/.pnpm/lucide-react@1.38.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zoom-out.mjs","types/client/image-cache.js","types/client/browser-image-utils.js","types/client/studio-view.js","types/client/conversation-regenerate.js","types/client/gallery-view.js","types/client/image-ref.js","types/client/studio-style.js","types/client/image-result-node.js","types/client/conversation-image-revisions.js","types/client/index.js"],"sourcesContent":["/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Browser route used for deleting generated images and workspace files. */\nexport const DELETE_ROUTE = '/plugins/dsh-image-gen/delete';\n/** Same-origin route used by the browser image workbench. */\nexport const STUDIO_ROUTE = '/plugins/dsh-image-gen/studio';\n/** Browser route used for saving generated images to workspace on demand. */\nexport const SAVE_WORKSPACE_ROUTE = '/plugins/dsh-image-gen/save-workspace';\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/** Providers supported by the first browser workbench release. */\nexport const CLOUD_IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope'];\n/** Default endpoints and base URLs. */\nexport const DEFAULT_GOOGLE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/interactions';\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_SEEDREAM_BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_DASHSCOPE_ENDPOINT = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_COMFYUI_BASE_URL = 'http://127.0.0.1:8188';\nexport const DEFAULT_COMFYUI_TIMEOUT_MS = 300_000;\nexport const DEFAULT_COMFYUI_WORKFLOW_LABEL = 'API workflow';\nexport const MAX_COMFYUI_WORKFLOW_BYTES = 5 * 1024 * 1024;\n/** Default model names. */\nexport const DEFAULT_GOOGLE_MODEL = 'gemini-3.1-flash-image';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-image-2';\nexport const DEFAULT_SEEDREAM_MODEL = 'doubao-seedream-5-0-260128';\nexport const DEFAULT_DASHSCOPE_MODEL = 'qwen-image-3.0';\n/** Named workflows, falling back to the legacy single-workflow fields when the list is empty. */\nexport function resolveComfyUIWorkflows(source) {\n const named = [];\n for (const entry of source.comfyuiWorkflows ?? []) {\n const name = typeof entry?.name === 'string' ? entry.name.trim() : '';\n const json = typeof entry?.json === 'string' ? entry.json : '';\n if (name.length > 0 && json.trim().length > 0) {\n const presetPrompt = typeof entry.presetPrompt === 'string' ? entry.presetPrompt.trim() : '';\n named.push(presetPrompt.length > 0 ? { name, json, presetPrompt } : { name, json });\n }\n }\n if (named.length > 0)\n return named;\n const legacyJson = typeof source.comfyuiWorkflowJson === 'string' ? source.comfyuiWorkflowJson : '';\n if (legacyJson.trim().length === 0)\n return [];\n const legacyName = typeof source.comfyuiWorkflowName === 'string' ? source.comfyuiWorkflowName.trim() : '';\n return [{ name: legacyName.length > 0 ? legacyName : DEFAULT_COMFYUI_WORKFLOW_LABEL, json: legacyJson }];\n}\n/** The workflow ComfyUI calls use by default: the configured active name, else the first entry. */\nexport function activeComfyUIWorkflow(source) {\n const workflows = resolveComfyUIWorkflows(source);\n if (workflows.length === 0)\n return undefined;\n const activeName = typeof source.comfyuiActiveWorkflow === 'string' ? source.comfyuiActiveWorkflow.trim() : '';\n return workflows.find(workflow => workflow.name === activeName) ?? workflows[0];\n}\n/** Derive a workflow label that does not collide with the given existing names. */\nexport function uniqueComfyUIWorkflowName(name, existing) {\n const base = name.trim().length > 0 ? name.trim() : DEFAULT_COMFYUI_WORKFLOW_LABEL;\n if (!existing.includes(base))\n return base;\n for (let index = 2;; index += 1) {\n const candidate = `${base} (${index})`;\n if (!existing.includes(candidate))\n return candidate;\n }\n}\n/**\n * Combine a workflow's preset with the user prompt: preset first, user second,\n * joined by one comma — never doubled when the preset already ends in a\n * separator, and reduced to the non-empty side when the other is blank.\n */\nexport function mergeComfyUIPrompt(preset, user) {\n const presetText = typeof preset === 'string' ? preset.trim().replace(/[,;\\s]+$/, '') : '';\n const userText = user.trim();\n if (presetText.length === 0)\n return userText;\n if (userText.length === 0)\n return presetText;\n return `${presetText}, ${userText}`;\n}\nexport const DEFAULT_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_MODEL,\n dashscope: DEFAULT_DASHSCOPE_MODEL,\n comfyui: DEFAULT_COMFYUI_WORKFLOW_LABEL,\n};\nexport const DEFAULT_BASE_URLS = {\n google: DEFAULT_GOOGLE_ENDPOINT,\n openai: DEFAULT_OPENAI_BASE_URL,\n seedream: DEFAULT_SEEDREAM_BASE_URL,\n dashscope: DEFAULT_DASHSCOPE_ENDPOINT,\n comfyui: DEFAULT_COMFYUI_BASE_URL,\n};\n//# sourceMappingURL=shared.js.map","/** Pure ComfyUI API-workflow validation and placeholder injection. */\nimport { MAX_COMFYUI_WORKFLOW_BYTES } from './shared.js';\nexport const COMFYUI_PROMPT_PLACEHOLDER = '{{prompt}}';\nexport const COMFYUI_SEED_PLACEHOLDER = '{{seed}}';\nexport const COMFYUI_IMAGE_PLACEHOLDER = '{{image}}';\n/** Legacy single-percent placeholders from early releases, still accepted. */\nconst LEGACY_PROMPT_PLACEHOLDER = '%prompt%';\nconst LEGACY_SEED_PLACEHOLDER = '%seed%';\nconst LEGACY_IMAGE_PLACEHOLDER = '%image%';\n/** LoadImage-style input key that receives the uploaded source image name. */\nconst IMAGE_INPUT_KEY = 'image';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n const workflow = parseWorkflow(workflowJson);\n const imageInputs = countImagePlaceholders(workflow);\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain at most one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n}\n/**\n * Parse, clone, and inject one prompt plus an optional randomized seed.\n *\n * Prompt and seed placeholders are replaced inside any string so existing\n * workflows that embed them in longer text keep working. The image\n * placeholder is stricter: it only matches a dedicated `inputs.image` field\n * whose value is exactly the placeholder, and at most one may exist, because\n * the field must carry a single uploaded file name.\n */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed(), image) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n let replaced = value;\n if (replaced.includes(COMFYUI_PROMPT_PLACEHOLDER) || replaced.includes(LEGACY_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n replaced = replaced\n .replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt)\n .replaceAll(LEGACY_PROMPT_PLACEHOLDER, prompt);\n }\n if (replaced === COMFYUI_SEED_PLACEHOLDER || replaced === LEGACY_SEED_PLACEHOLDER)\n return seed;\n if (replaced.includes(COMFYUI_SEED_PLACEHOLDER) || replaced.includes(LEGACY_SEED_PLACEHOLDER)) {\n replaced = replaced\n .replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n .replaceAll(LEGACY_SEED_PLACEHOLDER, String(seed));\n }\n return replaced;\n }\n if (Array.isArray(value))\n return value.map(inject);\n if (!isRecord(value))\n return value;\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, inject(child)]));\n };\n let imageInputs = 0;\n const prepared = Object.fromEntries(Object.entries(workflow).map(([nodeId, value]) => {\n const node = record(value);\n const inputs = node === undefined ? undefined : record(node.inputs);\n if (inputs === undefined)\n return [nodeId, value];\n const nextInputs = inject(inputs);\n if (isImagePlaceholder(nextInputs[IMAGE_INPUT_KEY])) {\n imageInputs += 1;\n if (image !== undefined)\n nextInputs[IMAGE_INPUT_KEY] = image;\n }\n return [nodeId, { ...node, inputs: nextInputs }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n if (image === undefined) {\n if (imageInputs > 0) {\n throw new Error(`ComfyUI workflow contains an ${COMFYUI_IMAGE_PLACEHOLDER} image input, which requires edit_image with a source image`);\n }\n return prepared;\n }\n if (imageInputs === 0) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input to edit images`);\n }\n if (imageInputs > 1) {\n throw new Error(`ComfyUI workflow must contain exactly one ${COMFYUI_IMAGE_PLACEHOLDER} image input; found ${String(imageInputs)}`);\n }\n return prepared;\n}\n/** Random seed in the 32-bit range ComfyUI samplers accept. */\nexport function randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\n}\nfunction parseWorkflow(workflowJson) {\n if (workflowJson.trim().length === 0)\n throw new Error('Import a ComfyUI API workflow JSON file in Settings before generating');\n if (new TextEncoder().encode(workflowJson).byteLength > MAX_COMFYUI_WORKFLOW_BYTES) {\n throw new Error('ComfyUI workflow file must be no larger than 5 MB');\n }\n let value;\n try {\n value = JSON.parse(workflowJson);\n }\n catch {\n throw new Error('ComfyUI workflow file is not valid JSON');\n }\n if (!isRecord(value) || Object.keys(value).length === 0) {\n throw new Error('ComfyUI workflow must be a non-empty API-format JSON object');\n }\n if (!Object.values(value).some(node => {\n const inputs = record(node)?.inputs;\n return inputs !== undefined && containsPromptPlaceholder(inputs);\n })) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} (or ${LEGACY_PROMPT_PLACEHOLDER}) in a text input`);\n }\n return value;\n}\n/** Count `inputs.image` fields that are exactly an image placeholder. */\nfunction countImagePlaceholders(workflow) {\n let count = 0;\n for (const node of Object.values(workflow)) {\n const inputs = record(record(node)?.inputs);\n if (inputs !== undefined && isImagePlaceholder(inputs[IMAGE_INPUT_KEY]))\n count += 1;\n }\n return count;\n}\nfunction isImagePlaceholder(value) {\n return value === COMFYUI_IMAGE_PLACEHOLDER || value === LEGACY_IMAGE_PLACEHOLDER;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string') {\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER) || value.includes(LEGACY_PROMPT_PLACEHOLDER);\n }\n if (Array.isArray(value))\n return value.some(containsPromptPlaceholder);\n return isRecord(value) && Object.values(value).some(containsPromptPlaceholder);\n}\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction record(value) {\n return isRecord(value) ? value : undefined;\n}\n//# sourceMappingURL=comfyui-workflow.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n * Preserves existing isFavorite, tags, and original createdAt on re-renders.\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const getReq = store.get(item.id);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n const fav = item.isFavorite !== undefined ? item.isFavorite : existing?.isFavorite;\n const userTags = item.tags !== undefined ? item.tags : existing?.tags;\n const savedPath = item.savedTo !== undefined ? item.savedTo : existing?.savedTo;\n const record = {\n ...existing,\n ...item,\n // Preserve original generation timestamp if already recorded\n createdAt: existing?.createdAt ?? item.createdAt ?? Date.now(),\n ...(fav !== undefined ? { isFavorite: fav } : {}),\n ...(userTags !== undefined ? { tags: userTags } : {}),\n ...(savedPath !== undefined ? { savedTo: savedPath } : {}),\n };\n const putReq = store.put(record);\n putReq.onsuccess = () => resolve();\n putReq.onerror = () => reject(putReq.error);\n };\n getReq.onerror = () => reject(getReq.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Toggle favorite status of a gallery item.\n * Returns the new favorite status (true if favorited, false if unfavorited).\n */\nexport async function toggleFavoriteGalleryItem(id) {\n try {\n const db = await getDB();\n const newStatus = await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n const item = getReq.result;\n if (!item) {\n resolve(false);\n return;\n }\n const nextFavorite = !item.isFavorite;\n item.isFavorite = nextFavorite;\n const putReq = store.put(item);\n putReq.onsuccess = () => resolve(nextFavorite);\n putReq.onerror = () => reject(putReq.error);\n };\n getReq.onerror = () => reject(getReq.error);\n });\n notifyListeners();\n return newStatus;\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to toggle favorite item in IndexedDB:', err);\n return false;\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\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 = () => {\n tombstones.add(id);\n resolve();\n };\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n}\n/**\n * Bulk delete multiple gallery records by IDs and record tombstones in a single transaction.\n */\nexport async function bulkDeleteGalleryItems(ids) {\n if (ids.length === 0)\n return;\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n const now = Date.now();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n for (const id of ids) {\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: now });\n }\n tx.oncomplete = () => {\n for (const id of ids) {\n tombstones.add(id);\n }\n resolve();\n };\n tx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed'));\n tx.onabort = () => reject(tx.error ?? new Error('IndexedDB transaction aborted'));\n });\n notifyListeners();\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n/**\n * Standardize path format across Windows and POSIX (lowercase, forward slashes, no trailing slash).\n */\nexport function normalizeWorkspacePath(rawPath) {\n return rawPath.replace(/\\\\/g, '/').toLowerCase().replace(/\\/+$/, '');\n}\n/**\n * Determine if a gallery item belongs to the given workspace context.\n * Compares workspaceId, sessionId membership, workspacePath, and savedTo file path prefix.\n */\nexport function isItemInWorkspace(item, workspace) {\n if (!workspace || (!workspace.workspaceId && !workspace.path && (!workspace.sessionIds || workspace.sessionIds.length === 0))) {\n return true;\n }\n // 1. Direct workspaceId match\n if (item.workspaceId && workspace.workspaceId && item.workspaceId === workspace.workspaceId) {\n return true;\n }\n // 2. SessionId membership match\n if (item.sessionId && Array.isArray(workspace.sessionIds) && workspace.sessionIds.includes(item.sessionId)) {\n return true;\n }\n // 3. Direct workspacePath match\n if (item.workspacePath && workspace.path) {\n if (normalizeWorkspacePath(item.workspacePath) === normalizeWorkspacePath(workspace.path)) {\n return true;\n }\n }\n // 4. savedTo disk file prefix match (for historical items or files written to the workspace)\n if (item.savedTo && workspace.path) {\n const normSaved = normalizeWorkspacePath(item.savedTo);\n const normWs = normalizeWorkspacePath(workspace.path);\n if (normSaved === normWs || normSaved.startsWith(normWs + '/')) {\n return true;\n }\n }\n return false;\n}\n//# sourceMappingURL=gallery-store.js.map","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 7v6\", key: \"lw1j43\" }],\n [\"path\", { d: \"M15 10H9\", key: \"o6yqo3\" }],\n [\n \"path\",\n {\n d: \"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z\",\n key: \"oz39mx\"\n }\n ]\n];\nconst BookmarkPlus = createLucideIcon(\"bookmark-plus\", __iconNode);\n\nexport { __iconNode, BookmarkPlus as default };\n//# sourceMappingURL=bookmark-plus.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n 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\",\n key: \"116196\"\n }\n ]\n];\nconst Clipboard = createLucideIcon(\"clipboard\", __iconNode);\n\nexport { __iconNode, Clipboard as default };\n//# sourceMappingURL=clipboard.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 15 6 6\", key: \"1s409w\" }],\n [\"path\", { d: \"m15 9 6-6\", key: \"ko1vev\" }],\n [\"path\", { d: \"M21 16v5h-5\", key: \"1ck2sf\" }],\n [\"path\", { d: \"M21 8V3h-5\", key: \"1qoq8a\" }],\n [\"path\", { d: \"M3 16v5h5\", key: \"1t08am\" }],\n [\"path\", { d: \"m3 21 6-6\", key: \"wwnumi\" }],\n [\"path\", { d: \"M3 8V3h5\", key: \"1ln10m\" }],\n [\"path\", { d: \"M9 9 3 3\", key: \"v551iv\" }]\n];\nconst Expand = createLucideIcon(\"expand\", __iconNode);\n\nexport { __iconNode, Expand as default };\n//# sourceMappingURL=expand.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\",\n key: \"mvr1a0\"\n }\n ]\n];\nconst Heart = createLucideIcon(\"heart\", __iconNode);\n\nexport { __iconNode, Heart as default };\n//# sourceMappingURL=heart.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 5h6\", key: \"1vod17\" }],\n [\"path\", { d: \"M19 2v6\", key: \"4bpg5p\" }],\n [\"path\", { d: \"M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5\", key: \"1ue2ih\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }]\n];\nconst ImagePlus = createLucideIcon(\"image-plus\", __iconNode);\n\nexport { __iconNode, ImagePlus as default };\n//# sourceMappingURL=image-plus.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m16 15-3-3 3-3\", key: \"14y99z\" }]\n];\nconst PanelLeftClose = createLucideIcon(\"panel-left-close\", __iconNode);\n\nexport { __iconNode, PanelLeftClose as default };\n//# sourceMappingURL=panel-left-close.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }]\n];\nconst PanelLeft = createLucideIcon(\"panel-left\", __iconNode);\n\nexport { __iconNode, PanelLeft as default };\n//# sourceMappingURL=panel-left.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 21h8\", key: \"1jsn5i\" }],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }],\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ]\n];\nconst PencilLine = createLucideIcon(\"pencil-line\", __iconNode);\n\nexport { __iconNode, PencilLine as default };\n//# sourceMappingURL=pencil-line.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 5H3\", key: \"1qgfaw\" }],\n [\"path\", { d: \"M12 19H3\", key: \"yhmn1j\" }],\n [\"path\", { d: \"M14 3v4\", key: \"1sua03\" }],\n [\"path\", { d: \"M16 17v4\", key: \"1q0r14\" }],\n [\"path\", { d: \"M21 12h-9\", key: \"1o4lsq\" }],\n [\"path\", { d: \"M21 19h-5\", key: \"1rlt1p\" }],\n [\"path\", { d: \"M21 5h-7\", key: \"1oszz2\" }],\n [\"path\", { d: \"M8 10v4\", key: \"tgpxqk\" }],\n [\"path\", { d: \"M8 12H3\", key: \"a7s4jb\" }]\n];\nconst SlidersHorizontal = createLucideIcon(\"sliders-horizontal\", __iconNode);\n\nexport { __iconNode, SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"11\", x2: \"11\", y1: \"8\", y2: \"14\", key: \"1vmskp\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomIn = createLucideIcon(\"zoom-in\", __iconNode);\n\nexport { __iconNode, ZoomIn as default };\n//# sourceMappingURL=zoom-in.mjs.map\n","/**\n * @license lucide-react v1.38.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomOut = createLucideIcon(\"zoom-out\", __iconNode);\n\nexport { __iconNode, ZoomOut as default };\n//# sourceMappingURL=zoom-out.mjs.map\n","import { IMAGE_ROUTE } from '../shared.js';\nexport const MAX_CACHE_COUNT = 30;\nexport const MAX_CACHE_BYTES = 128 * 1024 * 1024; // 128 MB\nlet currentCacheBytes = 0;\nconst cache = new Map();\n/**\n * Fetch or reuse an image Blob by attachment ID.\n * Refreshes LRU recency on hit and enforces count/byte limits on arrival.\n */\nexport function fetchAttachmentBlob(attachment) {\n const key = String(attachment.attachmentId);\n const existing = cache.get(key);\n if (existing !== undefined) {\n // Refresh LRU recency\n cache.delete(key);\n cache.set(key, existing);\n return existing.promise;\n }\n const entry = {\n promise: Promise.resolve().then(async () => {\n try {\n const response = await fetch(IMAGE_ROUTE, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n });\n if (!response.ok)\n throw new Error(`Image unavailable (${response.status})`);\n const blob = await response.blob();\n if (cache.get(key) === entry) {\n entry.bytes = blob.size;\n currentCacheBytes += blob.size;\n enforceLimits();\n }\n return blob;\n }\n catch (err) {\n // Failed requests must never stay in cache\n if (cache.get(key) === entry) {\n cache.delete(key);\n }\n throw err;\n }\n }),\n bytes: 0,\n };\n cache.set(key, entry);\n enforceLimits();\n return entry.promise;\n}\n/** Check if an attachment Blob is already cached in memory. */\nexport function getCachedAttachmentBlob(attachmentId) {\n return cache.get(String(attachmentId))?.promise;\n}\n/** Evict one item from memory cache (e.g. when deleted from gallery). */\nexport function evictAttachmentCache(attachmentId) {\n const key = String(attachmentId);\n const entry = cache.get(key);\n if (entry !== undefined) {\n currentCacheBytes = Math.max(0, currentCacheBytes - entry.bytes);\n cache.delete(key);\n }\n}\n/** Clear all in-memory image caches. */\nexport function clearAttachmentCache() {\n cache.clear();\n currentCacheBytes = 0;\n}\n/** Get current cache size metrics (useful for assertions and health monitoring). */\nexport function getCacheMetrics() {\n return { count: cache.size, bytes: currentCacheBytes };\n}\nfunction enforceLimits() {\n while (cache.size > MAX_CACHE_COUNT || currentCacheBytes > MAX_CACHE_BYTES) {\n const oldestKey = cache.keys().next().value;\n if (oldestKey === undefined)\n break;\n const oldest = cache.get(oldestKey);\n if (oldest !== undefined) {\n currentCacheBytes = Math.max(0, currentCacheBytes - oldest.bytes);\n }\n cache.delete(oldestKey);\n }\n}\n//# sourceMappingURL=image-cache.js.map","/**\n * Shared browser image and DOM helpers for client views.\n * Completely decoupled from gallery-view and studio-view to prevent circular dependencies.\n */\n/** Copy an image Blob to the OS clipboard, converting to PNG if required by the browser. */\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([\n new ClipboardItem({ 'image/png': blob }),\n ]);\n return true;\n }\n if (typeof createImageBitmap === 'function') {\n const bitmap = await createImageBitmap(blob);\n try {\n const canvas = document.createElement('canvas');\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n return false;\n ctx.drawImage(bitmap, 0, 0);\n const pngBlob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!pngBlob)\n return false;\n await navigator.clipboard.write([\n new ClipboardItem({ 'image/png': pngBlob }),\n ]);\n return true;\n }\n finally {\n bitmap.close();\n }\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n try {\n await new Promise((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error('Image decode failed'));\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 return false;\n ctx.drawImage(img, 0, 0);\n const pngBlob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!pngBlob)\n return false;\n await navigator.clipboard.write([\n new ClipboardItem({ 'image/png': pngBlob }),\n ]);\n return true;\n }\n finally {\n URL.revokeObjectURL(url);\n }\n }\n catch {\n return false;\n }\n}\n/** Safely trigger a browser file download by mounting an anchor element into the DOM. */\nexport function downloadBlobUrl(url, filename) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n try {\n link.click();\n }\n finally {\n document.body.removeChild(link);\n }\n}\n/** Human-readable relative time formatter supporting zh and en. */\nexport function formatRelativeTime(timestamp, lang) {\n const diff = Math.max(0, Date.now() - timestamp);\n if (lang === 'zh') {\n if (diff < 60_000)\n return '刚刚';\n if (diff < 3_600_000)\n return `${Math.floor(diff / 60_000)} 分钟前`;\n if (diff < 86_400_000)\n return `${Math.floor(diff / 3_600_000)} 小时前`;\n if (diff < 30 * 86_400_000)\n return `${Math.floor(diff / 86_400_000)} 天前`;\n const d = new Date(timestamp);\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n }\n if (diff < 60_000)\n return 'Just now';\n if (diff < 3_600_000)\n return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000)\n return `${Math.floor(diff / 3_600_000)}h ago`;\n if (diff < 30 * 86_400_000)\n return `${Math.floor(diff / 86_400_000)}d ago`;\n const d = new Date(timestamp);\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n}\n//# sourceMappingURL=browser-image-utils.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { AlertTriangle, BookmarkPlus, Check, ChevronDown, ChevronLeft, ChevronRight, Clipboard, Copy, Download, Expand, FileText, Heart, ImagePlus, LoaderCircle, PanelLeft, PanelLeftClose, PencilLine, Plus, RefreshCw, Sparkles, Trash2, Upload, X, ZoomIn, ZoomOut, } from 'lucide-react';\nimport { DELETE_ROUTE, SAVE_WORKSPACE_ROUTE, STUDIO_ROUTE } from '../shared.js';\nimport { deleteGalleryItem, getGalleryItems, saveGalleryItem, subscribeGallery, toggleFavoriteGalleryItem } from './gallery-store.js';\nimport { evictAttachmentCache, fetchAttachmentBlob } from './image-cache.js';\nimport { copyImageBlob, downloadBlobUrl, formatRelativeTime } from './browser-image-utils.js';\nconst PAGE_SIZE = 12;\nconst COPY = {\n zh: {\n title: '云端生图工作台', configured: 'API 已配置', unconfigured: '未配置', recent: '最近生成', empty: '暂无生成历史',\n generate: '文生图', edit: '图生图', details: '图片详情', reference: '参考图', optional: '选填', upload: '点击或拖拽图片到此处',\n uploadHint: '支持 JPG / PNG / WebP / GIF,最大 10MB(最多 5 张)', prompt: '提示词 Prompt', clear: '清空', promptPlaceholder: '描述主体、构图、风格、光线与需要出现的文字…(支持 Ctrl+Enter 快捷生成)',\n provider: 'Provider', model: 'Model', ratio: '比例', quality: '清晰度', start: '开始生成', generating: '正在生成…', cancelGenerate: '取消生成',\n count: '生成数量', countUnit: '{n} 张', partialSuccess: '已生成 {success} 张图片,{failed} 张失败', generatingCount: '正在生成(共 {count} 张)…',\n batchResult: '本次生成(共 {count} 张)',\n saveToGallery: '收藏进画廊', savedToGallery: '已收藏进画廊', inGallery: '已在画廊',\n retry: '重新加载', configLoadFailed: '工作台配置加载失败,请检查服务后重试。',\n noProvider: '请先在设置中配置至少一个云端图像 Provider 的 API Key。', selectConfigured: '该 Provider 尚未配置,请先到设置中配置 API Key。',\n needPrompt: '请输入提示词', needReference: '请先添加至少一张参考图', result: '本次结果', continueEdit: '继续编辑(垫图)', regenerate: '再次生成',\n copy: '复制', copied: '已复制到剪贴板', copyFailed: '复制失败', download: '下载', remove: '删除', fit: '适应窗口', loading: '正在读取图片…', generationFailed: '生成失败',\n selectHistory: '从左侧选择一张图片,或在右侧开始新的生成。', created: '生成时间', elapsed: '耗时', dimensions: '尺寸', output: '输出参数',\n closeReference: '移除参考图', uploadInvalid: '请选择有效的图片文件(最大 10MB)', imageLoadFailed: '图片读取失败',\n fullscreen: '大图全屏', close: '关闭', copyPpt: '复制 Prompt', copiedPrompt: '已复制 Prompt', copiedImage: '已复制图片',\n favorite: '收藏', favorited: '已收藏', favoriteAdded: '已添加到收藏', favoriteRemoved: '已取消收藏',\n loadMore: '加载更多 ({n})', deleteModalTitle: '从图库删除', deleteModalDesc: '确定从图库中删除这张图片吗?(原聊天记录不会受影响)',\n deleteWorkspaceFilesLabel: '同时删除工作区本地文件', confirm: '确定删除', cancel: '取消', deletedToast: '已从图库删除',\n referencesCount: '参考图 ({current}/{max})', addMoreRef: '+ 添加', maxReferencesExceeded: '最多支持添加 {max} 张参考图',\n newGeneration: '新建生成', new: '新建',\n configuredCount: 'API 已配置 · {count}', unconfiguredStatus: 'API 未配置', providerStatus: '云端提供商与模型状态',\n collapseSidebar: '折叠最近生成', expandSidebar: '展开最近生成',\n },\n en: {\n title: 'Cloud Image Studio', configured: 'API configured', unconfigured: 'Not configured', recent: 'Recent generations', empty: 'No generated images yet',\n generate: 'Text to image', edit: 'Image to image', details: 'Image details', reference: 'Reference image', optional: 'optional', upload: 'Click or drop images here',\n uploadHint: 'JPG / PNG / WebP / GIF, up to 10MB (max 5)', prompt: 'Prompt', clear: 'Clear', promptPlaceholder: 'Describe the subject, composition, style, lighting, and exact text… (Ctrl+Enter to generate)',\n provider: 'Provider', model: 'Model', ratio: 'Aspect ratio', quality: 'Quality', start: 'Generate', generating: 'Generating…', cancelGenerate: 'Cancel',\n count: 'Number of images', countUnit: '{n}', partialSuccess: 'Generated {success} images, {failed} failed', generatingCount: 'Generating ({count} images)…',\n batchResult: 'Generated {count} images',\n saveToGallery: 'Save to Gallery', savedToGallery: 'Saved to Gallery', inGallery: 'In Gallery',\n retry: 'Retry', configLoadFailed: 'Failed to load studio configuration.',\n noProvider: 'Configure an API key for at least one cloud image provider in Settings.', selectConfigured: 'This provider is not configured. Add its API key in Settings first.',\n needPrompt: 'Enter a prompt', needReference: 'Add at least one reference image first', result: 'Current result', continueEdit: 'Continue editing', regenerate: 'Generate again',\n copy: 'Copy', copied: 'Copied to clipboard', copyFailed: 'Copy failed', download: 'Download', remove: 'Delete', fit: 'Fit', loading: 'Loading image…', generationFailed: 'Generation failed',\n selectHistory: 'Select an image on the left, or start a new generation on the right.', created: 'Created', elapsed: 'Elapsed', dimensions: 'Dimensions', output: 'Output',\n closeReference: 'Remove reference', uploadInvalid: 'Choose a valid image file up to 10MB.', imageLoadFailed: 'Could not load image',\n fullscreen: 'Fullscreen', close: 'Close', copyPpt: 'Copy Prompt', copiedPrompt: 'Prompt copied', copiedImage: 'Image copied',\n favorite: 'Favorite', favorited: 'Favorited', favoriteAdded: 'Added to favorites', favoriteRemoved: 'Removed from favorites',\n loadMore: 'Load more ({n})', deleteModalTitle: 'Delete from gallery', deleteModalDesc: 'Remove this image from the local gallery? (Chat history remains unaffected)',\n deleteWorkspaceFilesLabel: 'Also delete local workspace files', confirm: 'Delete', cancel: 'Cancel', deletedToast: 'Deleted from gallery',\n referencesCount: 'References ({current}/{max})', addMoreRef: '+ Add', maxReferencesExceeded: 'Up to {max} reference images allowed',\n newGeneration: 'New generation', new: 'New',\n configuredCount: 'API configured · {count}', unconfiguredStatus: 'Not configured', providerStatus: 'Provider & Model Status',\n collapseSidebar: 'Collapse sidebar', expandSidebar: 'Expand recent list',\n },\n};\nexport const StudioView = ({ locale, workspace }) => {\n const [lang, setLang] = useState(() => locale?.getSnapshot?.().active?.startsWith('en') ? 'en' : 'zh');\n const [config, setConfig] = useState(null);\n const [configLoading, setConfigLoading] = useState(true);\n const [configError, setConfigError] = useState(null);\n const [items, setItems] = useState([]);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(false);\n const [visibleLimit, setVisibleLimit] = useState(30);\n const [selected, setSelected] = useState(null);\n const [mode, setMode] = useState('generate');\n const [panelTab, setPanelTab] = useState('generate');\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [ratio, setRatio] = useState('1:1');\n const [quality, setQuality] = useState('1K');\n const [prompt, setPrompt] = useState('');\n const [references, setReferences] = useState([]);\n const [count, setCount] = useState(1);\n const [currentBatch, setCurrentBatch] = useState(null);\n const [isGenerating, setIsGenerating] = useState(false);\n const [error, setError] = useState(null);\n const [notice, setNotice] = useState(null);\n // Interactive Pan-Zoom Viewport State\n const [zoom, setZoom] = useState(100);\n const [fit, setFit] = useState(true);\n const [offset, setOffset] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const dragStartRef = useRef(null);\n const hasDraggedRef = useRef(false);\n const [dragging, setDragging] = useState(false);\n const [lightboxOpen, setLightboxOpen] = useState(false);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [deleteWorkspaceFiles, setDeleteWorkspaceFiles] = useState(true);\n const requestRef = useRef(null);\n const canvasRef = useRef(null);\n const fileInputRef = useRef(null);\n const image = useAttachmentImage(selected?.attachment);\n const maxReferences = provider === 'dashscope' ? 3 : 5;\n const referencesRef = useRef(references);\n referencesRef.current = references;\n const t = (key, values) => {\n let text = COPY[lang][key];\n for (const [name, value] of Object.entries(values ?? {}))\n text = text.replace(`{${name}}`, value);\n return text;\n };\n useEffect(() => locale?.subscribe?.(() => setLang(locale.getSnapshot().active?.startsWith('en') ? 'en' : 'zh')), [locale]);\n const loadConfig = useCallback(async () => {\n setConfigLoading(true);\n setConfigError(null);\n const controller = new AbortController();\n try {\n const response = await fetch(STUDIO_ROUTE, { signal: controller.signal, credentials: 'same-origin' });\n const payload = await response.json();\n if (!response.ok || !('providers' in payload))\n throw new Error('error' in payload && payload.error ? payload.error : 'Studio unavailable');\n setConfig(payload);\n const initial = payload.providers.find(item => item.provider === payload.activeProvider) ?? payload.providers[0];\n if (initial !== undefined)\n applyProvider(initial);\n }\n catch (fetchError) {\n if (!controller.signal.aborted)\n setConfigError(messageOf(fetchError));\n }\n finally {\n setConfigLoading(false);\n }\n }, []);\n useEffect(() => {\n void loadConfig();\n }, [loadConfig]);\n useEffect(() => {\n let mounted = true;\n const load = () => void getGalleryItems().then(next => {\n if (!mounted)\n return;\n setItems(next);\n setSelected(current => current === null ? null : (next.find(item => item.id === current.id) ?? null));\n });\n load();\n const unsubscribe = subscribeGallery(load);\n return () => { mounted = false; unsubscribe(); };\n }, []);\n // Abort only on component unmount\n useEffect(() => {\n return () => {\n requestRef.current?.abort();\n };\n }, []);\n // Revoke all reference object URLs on component unmount\n useEffect(() => {\n return () => {\n for (const item of referencesRef.current) {\n if (item.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(item.previewUrl);\n }\n }\n };\n }, []);\n // Support Escape to close Lightbox\n useEffect(() => {\n const handleKeyDown = (e) => {\n if (e.key === 'Escape' && lightboxOpen) {\n setLightboxOpen(false);\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [lightboxOpen]);\n // Non-passive wheel zoom on canvas to prevent page scrolling and provide smooth zooming\n useEffect(() => {\n const canvasEl = canvasRef.current;\n if (!canvasEl)\n return;\n const onWheel = (e) => {\n if (selected === null && (!currentBatch || currentBatch.length === 0))\n return;\n e.preventDefault();\n const delta = e.deltaY < 0 ? 15 : -15;\n setFit(false);\n setZoom(prev => Math.min(500, Math.max(25, prev + delta)));\n };\n canvasEl.addEventListener('wheel', onWheel, { passive: false });\n return () => canvasEl.removeEventListener('wheel', onWheel);\n }, [selected, currentBatch]);\n // Global mousemove and mouseup to handle canvas panning smoothly\n useEffect(() => {\n const handleMouseMove = (e) => {\n if (!dragStartRef.current)\n return;\n const dx = e.clientX - dragStartRef.current.x;\n const dy = e.clientY - dragStartRef.current.y;\n if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {\n hasDraggedRef.current = true;\n setFit(false);\n }\n setOffset({\n x: dragStartRef.current.startX + dx,\n y: dragStartRef.current.startY + dy,\n });\n };\n const handleMouseUp = () => {\n dragStartRef.current = null;\n setIsDragging(false);\n };\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, []);\n const activeProfile = useMemo(() => config?.providers.find(item => item.provider === provider), [config, provider]);\n const configuredCount = config?.providers.filter(item => item.configured).length ?? 0;\n const displayItems = useMemo(() => items.slice(0, visibleLimit), [items, visibleLimit]);\n const applyProvider = (profile) => {\n setProvider(profile.provider);\n setModel(profile.model);\n setRatio(profile.defaultRatio);\n setQuality(profile.defaultQuality);\n setError(null);\n };\n const changeProvider = (value) => {\n const profile = config?.providers.find(item => item.provider === value);\n if (profile !== undefined) {\n applyProvider(profile);\n const providerMax = value === 'dashscope' ? 3 : 5;\n if (referencesRef.current.length > providerMax) {\n const keep = referencesRef.current.slice(0, providerMax);\n const overflow = referencesRef.current.slice(providerMax);\n for (const item of overflow) {\n if (item.previewUrl.startsWith('blob:'))\n URL.revokeObjectURL(item.previewUrl);\n }\n setReferences(keep);\n referencesRef.current = keep;\n setError(t('maxReferencesExceeded', { max: String(providerMax) }));\n }\n }\n };\n const resetFit = () => {\n setFit(true);\n setZoom(100);\n setOffset({ x: 0, y: 0 });\n };\n const selectItem = (item) => {\n setCurrentBatch(null);\n setSelected(item);\n setPanelTab('details');\n resetFit();\n };\n const startNew = () => {\n setCurrentBatch(null);\n setSelected(null);\n setPanelTab('generate');\n resetFit();\n };\n const handleCanvasMouseDown = (e) => {\n if (e.button !== 0 && e.button !== 1)\n return;\n if (selected === null && (!currentBatch || currentBatch.length === 0))\n return;\n setIsDragging(true);\n hasDraggedRef.current = false;\n dragStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n startX: offset.x,\n startY: offset.y,\n };\n };\n const handleImageClick = () => {\n // Canvas click is for selection, not preview\n };\n const addReferenceFiles = (fileList) => {\n if (!fileList || fileList.length === 0)\n return;\n const files = Array.from(fileList);\n const validFiles = [];\n for (const file of files) {\n if (!['image/jpeg', 'image/png', 'image/webp', 'image/gif'].includes(file.type) || file.size > 10 * 1024 * 1024) {\n setError(t('uploadInvalid'));\n continue;\n }\n validFiles.push(file);\n }\n if (validFiles.length === 0)\n return;\n const currentLen = referencesRef.current.length;\n const available = maxReferences - currentLen;\n if (available <= 0) {\n setError(t('maxReferencesExceeded', { max: String(maxReferences) }));\n return;\n }\n const toAdd = validFiles.slice(0, available);\n if (validFiles.length > available) {\n setError(t('maxReferencesExceeded', { max: String(maxReferences) }));\n }\n else {\n setError(null);\n }\n const newItems = toAdd.map((file, idx) => ({\n id: `upload-${Date.now()}-${idx}-${Math.random().toString(36).slice(2, 7)}`,\n file,\n previewUrl: URL.createObjectURL(file),\n }));\n setReferences(prev => [...prev, ...newItems]);\n };\n const removeReference = (id) => {\n const target = referencesRef.current.find(item => item.id === id);\n if (target && target.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(target.previewUrl);\n }\n setReferences(prev => prev.filter(item => item.id !== id));\n };\n const clearAllReferences = () => {\n for (const item of referencesRef.current) {\n if (item.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(item.previewUrl);\n }\n }\n setReferences([]);\n };\n const continueEdit = async () => {\n if (selected === null)\n return;\n const targetItem = selected;\n const targetAttId = targetItem.attachment.attachmentId;\n const targetMax = targetItem.provider === 'dashscope' ? 3 : 5;\n if (referencesRef.current.some(r => r.attachment?.attachmentId === targetAttId)) {\n setMode('edit');\n setPanelTab('generate');\n changeProvider(targetItem.provider);\n return;\n }\n if (referencesRef.current.length >= targetMax) {\n setError(t('maxReferencesExceeded', { max: String(targetMax) }));\n return;\n }\n try {\n const blob = image.blob ?? await fetchAttachmentBlob(targetItem.attachment);\n if (referencesRef.current.some(r => r.attachment?.attachmentId === targetAttId)) {\n setMode('edit');\n setPanelTab('generate');\n changeProvider(targetItem.provider);\n return;\n }\n if (referencesRef.current.length >= targetMax) {\n setError(t('maxReferencesExceeded', { max: String(targetMax) }));\n return;\n }\n const independentUrl = URL.createObjectURL(blob);\n const newItem = {\n id: `item-${targetItem.id}-${Date.now()}`,\n attachment: targetItem.attachment,\n previewUrl: independentUrl,\n };\n const nextList = [...referencesRef.current, newItem];\n setReferences(nextList);\n referencesRef.current = nextList;\n setError(null);\n setMode('edit');\n setPanelTab('generate');\n changeProvider(targetItem.provider);\n }\n catch {\n setError(t('imageLoadFailed'));\n }\n };\n const cancelGeneration = () => {\n if (requestRef.current) {\n requestRef.current.abort();\n requestRef.current = null;\n setIsGenerating(false);\n }\n };\n const submit = async () => {\n if (isGenerating || activeProfile === undefined)\n return;\n if (prompt.trim().length === 0)\n return setError(t('needPrompt'));\n if (!activeProfile.configured)\n return setError(t('selectConfigured'));\n if (mode === 'edit' && references.length === 0)\n return setError(t('needReference'));\n setIsGenerating(true);\n setError(null);\n const controller = new AbortController();\n requestRef.current = controller;\n try {\n const referencesPayload = mode === 'edit' && references.length > 0\n ? await Promise.all(references.map(async (ref) => {\n if (ref.attachment !== undefined) {\n return { attachment: ref.attachment };\n }\n if (ref.file !== undefined) {\n return {\n mediaType: ref.file.type,\n data: await fileToBase64(ref.file),\n ...(ref.file.name ? { name: ref.file.name } : {}),\n };\n }\n throw new Error('无效参考图');\n }))\n : undefined;\n const response = await fetch(STUDIO_ROUTE, {\n method: 'POST', credentials: 'same-origin', signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n mode, provider, model, prompt: prompt.trim(), ratio, quality,\n ...(count > 1 ? { count } : {}),\n ...(workspace?.path ? { workspaceRoot: workspace.path } : {}),\n ...(referencesPayload === undefined ? {} : {\n references: referencesPayload,\n }),\n }),\n });\n const payload = await response.json();\n if (!response.ok || !('attachment' in payload))\n throw new Error('error' in payload && payload.error ? payload.error : t('generationFailed'));\n const generatedList = Array.isArray(payload.items) && payload.items.length > 0\n ? payload.items\n : [{\n attachment: payload.attachment,\n output: payload.output,\n ...(payload.savedTo ? { savedTo: payload.savedTo } : {}),\n }];\n const galleryEntries = generatedList.map((gen, idx) => ({\n id: String(gen.attachment.attachmentId || `${payload.createdAt}-${idx}`),\n attachment: gen.attachment,\n prompt: payload.prompt,\n provider: payload.provider,\n model: payload.model,\n createdAt: payload.createdAt + idx,\n aspectRatio: ratio,\n imageSize: quality,\n output: gen.output,\n ...(gen.savedTo ? { savedTo: gen.savedTo } : {}),\n ...(workspace?.path ? { workspacePath: workspace.path } : {}),\n ...(workspace?.workspaceId ? { workspaceId: workspace.workspaceId } : {}),\n }));\n if (galleryEntries.length > 1) {\n setCurrentBatch(galleryEntries);\n setSelected(galleryEntries[0]);\n }\n else if (galleryEntries.length === 1) {\n setCurrentBatch(null);\n setSelected(galleryEntries[0]);\n }\n setPanelTab('details');\n resetFit();\n if (payload.failedCount && payload.failedCount > 0) {\n flash(t('partialSuccess', { success: String(generatedList.length), failed: String(payload.failedCount) }));\n }\n }\n catch (submitError) {\n if (controller.signal.aborted) {\n return;\n }\n setError(messageOf(submitError));\n }\n finally {\n if (requestRef.current === controller) {\n requestRef.current = null;\n setIsGenerating(false);\n }\n }\n };\n const isSelectedInGallery = useMemo(() => {\n if (selected === null)\n return false;\n return items.some(item => item.id === selected.id);\n }, [items, selected]);\n const handleSaveToGallery = async () => {\n if (selected === null || isSelectedInGallery)\n return;\n let savedTo = selected.savedTo;\n const targetRoot = workspace?.path || config?.workspaceRoot;\n if (!savedTo) {\n try {\n const res = await fetch(SAVE_WORKSPACE_ROUTE, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n attachment: selected.attachment,\n ...(targetRoot ? { workspaceRoot: targetRoot } : {}),\n }),\n });\n if (res.ok) {\n const data = await res.json();\n if (data.savedTo) {\n savedTo = data.savedTo;\n }\n }\n }\n catch (e) {\n console.warn('Failed to save to workspace:', e);\n }\n }\n const updatedItem = {\n ...selected,\n ...(savedTo ? { savedTo } : {}),\n ...(targetRoot ? { workspacePath: targetRoot } : {}),\n ...(workspace?.workspaceId ? { workspaceId: workspace.workspaceId } : {}),\n };\n await saveGalleryItem(updatedItem);\n setSelected(updatedItem);\n if (currentBatch) {\n setCurrentBatch(prev => prev ? prev.map(i => i.id === updatedItem.id ? updatedItem : i) : prev);\n }\n flash(t('savedToGallery'));\n };\n const handleConfirmDelete = async () => {\n if (selected === null)\n return;\n const idToDelete = selected.id;\n const attachmentId = selected.attachment.attachmentId;\n const savedPath = selected.savedTo;\n setShowDeleteModal(false);\n try {\n if (deleteWorkspaceFiles && typeof savedPath === 'string' && savedPath.trim().length > 0) {\n const res = await fetch(DELETE_ROUTE, {\n method: 'POST', credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ paths: [savedPath] }),\n });\n if (!res.ok) {\n throw new Error(`删除请求网络异常 (${res.status})`);\n }\n const data = await res.json().catch(() => null);\n if (!data || data.ok === false || (Array.isArray(data.failedFiles) && data.failedFiles.length > 0)) {\n const reason = data?.failedFiles?.[0]?.error || '工作区文件删除失败';\n throw new Error(reason);\n }\n }\n if (isSelectedInGallery) {\n await deleteGalleryItem(idToDelete);\n }\n evictAttachmentCache(attachmentId);\n if (currentBatch) {\n const remaining = currentBatch.filter(i => i.id !== idToDelete);\n if (remaining.length > 1) {\n setCurrentBatch(remaining);\n setSelected(remaining[0]);\n }\n else if (remaining.length === 1) {\n setCurrentBatch(null);\n setSelected(remaining[0]);\n }\n else {\n setCurrentBatch(null);\n setSelected(null);\n }\n }\n else {\n setSelected(null);\n }\n flash(t('deletedToast'));\n }\n catch (delError) {\n setError(messageOf(delError));\n }\n };\n const copySelected = async () => {\n if (image.blob === null)\n return;\n const ok = await copyImageBlob(image.blob);\n flash(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadSelected = () => {\n if (image.url === null || selected === null)\n return;\n downloadBlobUrl(image.url, `dsh-${selected.provider}-${selected.id.slice(-8)}.${extension(selected.attachment.mediaType)}`);\n };\n const toggleFavorite = async () => {\n if (selected === null)\n return;\n const targetId = selected.id;\n if (isSelectedInGallery) {\n const nextFav = await toggleFavoriteGalleryItem(targetId);\n setSelected(curr => (curr !== null && curr.id === targetId ? { ...curr, isFavorite: nextFav } : curr));\n if (currentBatch) {\n setCurrentBatch(prev => prev ? prev.map(i => i.id === targetId ? { ...i, isFavorite: nextFav } : i) : null);\n }\n flash(nextFav ? t('favoriteAdded') : t('favoriteRemoved'));\n }\n else {\n const nextFav = !selected.isFavorite;\n setSelected(curr => (curr !== null && curr.id === targetId ? { ...curr, isFavorite: nextFav } : curr));\n if (currentBatch) {\n setCurrentBatch(prev => prev ? prev.map(i => i.id === targetId ? { ...i, isFavorite: nextFav } : i) : null);\n }\n flash(nextFav ? t('favoriteAdded') : t('favoriteRemoved'));\n }\n };\n const stepLightbox = (delta) => {\n if (!currentBatch || currentBatch.length <= 1 || selected === null)\n return;\n const currIdx = currentBatch.findIndex(i => i.id === selected.id);\n if (currIdx === -1)\n return;\n const nextIdx = (currIdx + delta + currentBatch.length) % currentBatch.length;\n setSelected(currentBatch[nextIdx]);\n };\n useEffect(() => {\n if (!lightboxOpen || !currentBatch || currentBatch.length <= 1)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'ArrowLeft')\n stepLightbox(-1);\n else if (e.key === 'ArrowRight')\n stepLightbox(1);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [lightboxOpen, currentBatch, selected]);\n const flash = (message) => {\n setNotice(message);\n window.setTimeout(() => setNotice(null), 2_200);\n };\n return (_jsxs(\"section\", { className: \"dsh-ig-workbench\", \"aria-label\": t('title'), children: [_jsxs(\"div\", { className: `dsh-ig-workbench-grid ${sidebarCollapsed ? 'is-sidebar-collapsed' : ''}`, children: [!sidebarCollapsed && (_jsxs(\"aside\", { className: \"dsh-ig-recent-panel\", children: [_jsxs(\"div\", { className: \"dsh-ig-panel-title\", children: [_jsxs(\"div\", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx(\"span\", { children: t('recent') }), _jsx(\"span\", { className: \"dsh-ig-count-badge\", children: items.length })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-collapse-btn\", onClick: () => setSidebarCollapsed(true), title: t('collapseSidebar'), children: _jsx(PanelLeftClose, { size: 15 }) })] }), _jsxs(\"div\", { className: \"dsh-ig-recent-scroll\", children: [items.length === 0 ? _jsxs(\"div\", { className: \"dsh-ig-recent-empty\", children: [_jsx(ImagePlus, { size: 22 }), _jsx(\"span\", { children: t('empty') })] }) : displayItems.map(item => _jsx(RecentItem, { item: item, active: selected?.id === item.id, lang: lang, onClick: () => selectItem(item) }, item.id)), items.length > visibleLimit && (_jsx(\"button\", { type: \"button\", className: \"dsh-ig-load-more\", onClick: () => setVisibleLimit(l => l + 30), children: t('loadMore', { n: String(items.length - visibleLimit) }) }))] })] })), _jsxs(\"main\", { className: \"dsh-ig-canvas-column\", children: [_jsxs(\"div\", { className: \"dsh-ig-canvas-toolbar\", children: [_jsxs(\"div\", { className: \"dsh-ig-canvas-toolbar-left\", children: [sidebarCollapsed && (_jsxs(\"button\", { type: \"button\", onClick: () => setSidebarCollapsed(false), title: t('expandSidebar'), children: [_jsx(PanelLeft, { size: 14 }), _jsx(\"span\", { children: t('recent') })] })), _jsxs(\"div\", { className: \"dsh-ig-status-badge-wrap\", children: [_jsxs(\"div\", { className: \"dsh-ig-status-badge\", children: [_jsx(\"span\", { className: `dsh-ig-status-dot ${configuredCount > 0 ? 'is-ready' : 'is-muted'}` }), _jsx(\"span\", { className: \"dsh-ig-status-text\", children: configuredCount > 0 ? t('configuredCount', { count: String(configuredCount) }) : t('unconfiguredStatus') }), _jsx(ChevronDown, { size: 11, className: \"dsh-ig-status-arrow\" })] }), config !== null && (_jsxs(\"div\", { className: \"dsh-ig-status-popover\", children: [_jsx(\"div\", { className: \"dsh-ig-status-popover-title\", children: t('providerStatus') }), _jsx(\"ul\", { className: \"dsh-ig-status-list\", children: config.providers.map(p => (_jsxs(\"li\", { className: p.configured ? 'is-configured' : 'is-missing', children: [_jsxs(\"div\", { className: \"dsh-ig-status-item-name\", children: [_jsx(\"strong\", { children: p.label }), _jsx(\"small\", { children: p.model })] }), _jsx(\"span\", { className: \"dsh-ig-status-item-tag\", children: p.configured ? t('configured') : t('unconfigured') })] }, p.provider))) })] }))] })] }), _jsxs(\"div\", { className: \"dsh-ig-canvas-toolbar-right\", children: [selected !== null && (_jsxs(\"button\", { type: \"button\", onClick: startNew, title: t('newGeneration'), children: [_jsx(Plus, { size: 13 }), _jsx(\"span\", { children: t('newGeneration') })] })), _jsxs(\"button\", { type: \"button\", className: fit ? 'is-active' : '', onClick: resetFit, children: [t('fit'), \" \", _jsx(ChevronDown, { size: 13 })] }), _jsx(\"button\", { type: \"button\", onClick: () => { setFit(false); setZoom(value => Math.max(25, value - 25)); }, title: \"Zoom out\", children: _jsx(ZoomOut, { size: 16 }) }), _jsx(\"span\", { className: \"dsh-ig-zoom-display\", children: fit ? 'AUTO' : `${Math.round(zoom)}%` }), _jsx(\"button\", { type: \"button\", onClick: () => { setFit(false); setZoom(value => Math.min(500, value + 25)); }, title: \"Zoom in\", children: _jsx(ZoomIn, { size: 16 }) }), _jsx(\"button\", { type: \"button\", onClick: () => setLightboxOpen(true), title: t('fullscreen'), disabled: selected === null, children: _jsx(Expand, { size: 16 }) })] })] }), _jsx(\"div\", { className: `dsh-ig-canvas ${isDragging ? 'is-dragging' : ''}`, ref: canvasRef, onMouseDown: handleCanvasMouseDown, onDoubleClick: resetFit, children: isGenerating ? (_jsxs(\"div\", { className: \"dsh-ig-generating-state\", children: [_jsx(\"div\", { className: \"dsh-ig-generation-orbit\", children: _jsx(Sparkles, { size: 28 }) }), _jsx(\"strong\", { children: count > 1 ? t('generatingCount', { count: String(count) }) : t('generating') }), _jsxs(\"span\", { children: [activeProfile?.label, \" \\u00B7 \", model] })] })) : currentBatch && currentBatch.length > 1 ? (_jsx(\"div\", { className: \"dsh-ig-canvas-cluster\", \"data-count\": currentBatch.length, style: {\n transform: `translate(${offset.x}px, ${offset.y}px) scale(${zoom / 100})`,\n transformOrigin: 'center center',\n transition: isDragging ? 'none' : 'transform 0.08s ease-out',\n }, children: currentBatch.map((batchItem, index) => (_jsx(BatchCanvasItem, { item: batchItem, index: index, isSelected: selected?.id === batchItem.id, onSelect: () => {\n if (!hasDraggedRef.current) {\n setSelected(batchItem);\n }\n } }, batchItem.id))) })) : selected === null ? (_jsxs(\"div\", { className: \"dsh-ig-canvas-empty\", children: [_jsx(ImagePlus, { size: 36 }), _jsx(\"span\", { children: t('selectHistory') })] })) : image.loading ? (_jsxs(\"div\", { className: \"dsh-ig-canvas-empty\", children: [_jsx(LoaderCircle, { className: \"dsh-ig-spin\", size: 28 }), _jsx(\"span\", { children: t('loading') })] })) : image.url !== null ? (_jsx(\"img\", { src: image.url, alt: selected.prompt, draggable: false, onClick: handleImageClick, style: {\n transform: `translate(${offset.x}px, ${offset.y}px) scale(${zoom / 100})`,\n transformOrigin: 'center center',\n transition: isDragging ? 'none' : 'transform 0.08s ease-out',\n } })) : (_jsxs(\"div\", { className: \"dsh-ig-canvas-empty\", children: [_jsx(ImagePlus, { size: 32 }), _jsx(\"span\", { children: t('imageLoadFailed') })] })) }), selected !== null && _jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-result-strip\", children: [_jsx(\"span\", { children: t('result') }), _jsxs(\"div\", { children: [_jsxs(\"button\", { type: \"button\", onClick: () => void continueEdit(), children: [_jsx(PencilLine, { size: 15 }), t('continueEdit')] }), _jsxs(\"button\", { type: \"button\", onClick: () => { setMode('generate'); setPanelTab('generate'); setPrompt(selected.prompt); }, children: [_jsx(RefreshCw, { size: 15 }), t('regenerate')] })] })] }), _jsxs(\"div\", { className: \"dsh-ig-result-actions\", children: [_jsx(\"p\", { children: selected.prompt }), _jsxs(\"div\", { children: [_jsxs(\"button\", { type: \"button\", className: `dsh-ig-save-gallery-btn ${isSelectedInGallery ? 'is-saved' : ''}`, onClick: () => void handleSaveToGallery(), title: isSelectedInGallery ? t('inGallery') : t('saveToGallery'), disabled: isSelectedInGallery, children: [isSelectedInGallery ? _jsx(Check, { size: 15 }) : _jsx(BookmarkPlus, { size: 15 }), _jsx(\"span\", { children: isSelectedInGallery ? t('inGallery') : t('saveToGallery') })] }), _jsxs(\"button\", { type: \"button\", onClick: () => void toggleFavorite(), title: selected.isFavorite ? t('favorited') : t('favorite'), children: [_jsx(Heart, { size: 15, fill: selected.isFavorite ? '#ef4444' : 'none', color: selected.isFavorite ? '#ef4444' : 'currentColor' }), _jsx(\"span\", { children: selected.isFavorite ? t('favorited') : t('favorite') })] }), _jsxs(\"button\", { type: \"button\", onClick: () => void copySelected(), children: [_jsx(Clipboard, { size: 15 }), _jsx(\"span\", { children: t('copy') })] }), _jsxs(\"button\", { type: \"button\", onClick: downloadSelected, children: [_jsx(Download, { size: 15 }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", onClick: () => setShowDeleteModal(true), children: [_jsx(Trash2, { size: 15 }), _jsx(\"span\", { children: t('remove') })] })] })] }), _jsxs(\"div\", { className: \"dsh-ig-result-meta\", children: [_jsx(\"span\", { children: formatRelativeTime(selected.createdAt, lang) }), _jsx(\"span\", { children: selected.provider }), _jsx(\"span\", { children: selected.model }), _jsx(\"span\", { children: selected.attachment.width && selected.attachment.height ? `${selected.attachment.width} × ${selected.attachment.height}` : '—' })] })] })] }), _jsxs(\"aside\", { className: \"dsh-ig-generate-panel\", children: [_jsxs(\"div\", { className: \"dsh-ig-panel-tabs\", children: [_jsx(\"button\", { type: \"button\", className: panelTab === 'generate' ? 'is-active' : '', onClick: () => setPanelTab('generate'), children: t('generate') }), _jsx(\"button\", { type: \"button\", className: panelTab === 'details' ? 'is-active' : '', onClick: () => setPanelTab('details'), children: t('details') })] }), panelTab === 'details' ? _jsx(DetailsPanel, { item: selected, t: t }) : _jsxs(\"div\", { className: \"dsh-ig-generator-form\", children: [_jsxs(\"div\", { className: \"dsh-ig-mode-switch\", children: [_jsxs(\"button\", { type: \"button\", className: mode === 'generate' ? 'is-active' : '', onClick: () => setMode('generate'), children: [_jsx(Sparkles, { size: 15 }), t('generate')] }), _jsxs(\"button\", { type: \"button\", className: mode === 'edit' ? 'is-active' : '', onClick: () => setMode('edit'), children: [_jsx(ImagePlus, { size: 15 }), t('edit')] })] }), mode === 'edit' && (_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"div\", { className: \"dsh-ig-field-label\", children: [_jsxs(\"label\", { children: [t('referencesCount', { current: String(references.length), max: String(maxReferences) }), \" \", _jsx(\"b\", { children: \"*\" })] }), references.length > 0 && (_jsx(\"button\", { type: \"button\", onClick: clearAllReferences, children: t('clear') }))] }), references.length === 0 ? (_jsxs(\"button\", { type: \"button\", className: `dsh-ig-upload ${dragging ? 'is-dragging' : ''}`, onClick: () => fileInputRef.current?.click(), onDragOver: event => { event.preventDefault(); setDragging(true); }, onDragLeave: () => setDragging(false), onDrop: event => {\n event.preventDefault();\n setDragging(false);\n addReferenceFiles(event.dataTransfer.files);\n }, children: [_jsx(Upload, { size: 20 }), _jsx(\"strong\", { children: t('upload') }), _jsx(\"small\", { children: t('uploadHint') })] })) : (_jsxs(\"div\", { className: \"dsh-ig-reference-grid\", children: [references.map((item, index) => (_jsxs(\"div\", { className: \"dsh-ig-reference-card\", children: [_jsx(\"img\", { src: item.previewUrl, alt: `Ref ${index + 1}` }), _jsx(\"button\", { type: \"button\", title: t('closeReference'), onClick: () => removeReference(item.id), children: _jsx(X, { size: 12 }) })] }, item.id))), references.length < maxReferences && (_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-reference-add\", onClick: () => fileInputRef.current?.click(), title: t('upload'), children: [_jsx(Upload, { size: 16 }), _jsx(\"span\", { children: t('addMoreRef') })] }))] })), _jsx(\"input\", { ref: fileInputRef, type: \"file\", multiple: true, accept: \"image/png,image/jpeg,image/webp,image/gif\", hidden: true, onChange: (event) => {\n addReferenceFiles(event.target.files);\n event.target.value = '';\n } })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"div\", { className: \"dsh-ig-field-label\", children: [_jsxs(\"label\", { htmlFor: \"dsh-ig-prompt\", children: [t('prompt'), \" \", _jsx(\"b\", { children: \"*\" })] }), _jsx(\"button\", { type: \"button\", onClick: () => setPrompt(''), children: t('clear') })] }), _jsx(\"textarea\", { id: \"dsh-ig-prompt\", value: prompt, maxLength: 2000, onChange: event => setPrompt(event.target.value), onKeyDown: event => {\n if (event.nativeEvent.isComposing)\n return;\n if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {\n event.preventDefault();\n if (!isGenerating && config !== null && prompt.trim().length > 0)\n void submit();\n }\n }, placeholder: t('promptPlaceholder') }), _jsxs(\"small\", { children: [prompt.length, \"/2000\"] })] }), config === null ? (configLoading ? (_jsx(\"div\", { className: \"dsh-ig-form-loading\", children: _jsx(LoaderCircle, { className: \"dsh-ig-spin\", size: 18 }) })) : (_jsxs(\"div\", { className: \"dsh-ig-config-error\", children: [_jsx(\"p\", { children: configError ?? t('configLoadFailed') }), _jsxs(\"button\", { type: \"button\", onClick: () => void loadConfig(), children: [_jsx(RefreshCw, { size: 13 }), _jsx(\"span\", { children: t('retry') })] })] }))) : _jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field-grid\", children: [_jsx(FieldSelect, { label: t('provider'), value: provider, onChange: changeProvider, options: config.providers.map(item => ({ value: item.provider, label: `${item.label}${item.configured ? '' : ` · ${t('unconfigured')}`}` })) }), _jsx(FieldSelect, { label: t('model'), value: model, onChange: setModel, options: activeProfile === undefined ? [] : [{ value: activeProfile.model, label: activeProfile.model }] })] }), _jsxs(\"div\", { className: \"dsh-ig-field-grid\", children: [_jsx(FieldSelect, { label: t('ratio'), value: ratio, onChange: setRatio, options: activeProfile?.ratioOptions ?? [] }), _jsx(FieldSelect, { label: t('quality'), value: quality, onChange: setQuality, options: activeProfile?.qualityOptions ?? [] })] }), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"label\", { children: t('count') }), _jsx(\"div\", { className: \"dsh-ig-count-row\", children: [1, 2, 3, 4].map(option => (_jsx(\"button\", { type: \"button\", className: `dsh-ig-count-pill ${count === option ? 'is-active' : ''}`, onClick: () => setCount(option), children: t('countUnit', { n: String(option) }) }, option))) })] })] }), configuredCount === 0 && config !== null && _jsx(\"div\", { className: \"dsh-ig-inline-note\", children: t('noProvider') }), error !== null && _jsx(\"div\", { className: \"dsh-ig-form-error\", children: error }), isGenerating ? (_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-generate-button is-cancel\", onClick: cancelGeneration, children: [_jsx(LoaderCircle, { className: \"dsh-ig-spin\", size: 17 }), _jsx(\"span\", { children: t('cancelGenerate') })] })) : (_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-generate-button\", disabled: config === null, onClick: () => void submit(), children: [_jsx(Sparkles, { size: 17 }), _jsxs(\"span\", { children: [t('start'), count > 1 ? ` (${count})` : ''] })] }))] })] })] }), lightboxOpen && selected !== null && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => setLightboxOpen(false), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: selected.provider }), _jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: selected.model }), currentBatch && currentBatch.length > 1 && (_jsxs(\"span\", { className: \"dsh-ig-tag\", children: [currentBatch.findIndex(i => i.id === selected.id) + 1, \" / \", currentBatch.length] })), selected.attachment.width && selected.attachment.height ? (_jsxs(\"span\", { className: \"dsh-ig-tag\", children: [selected.attachment.width, \" \\u00D7 \", selected.attachment.height] })) : null] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: () => setLightboxOpen(false), children: _jsx(X, { size: 18 }) })] }), currentBatch && currentBatch.length > 1 && (_jsxs(_Fragment, { children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav is-prev\", onClick: e => {\n e.stopPropagation();\n stepLightbox(-1);\n }, title: \"\\u4E0A\\u4E00\\u5F20\", children: _jsx(ChevronLeft, { size: 24 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav is-next\", onClick: e => {\n e.stopPropagation();\n stepLightbox(1);\n }, title: \"\\u4E0B\\u4E00\\u5F20\", children: _jsx(ChevronRight, { size: 24 }) })] })), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: e => e.stopPropagation(), children: image.url !== null ? (_jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: image.url, alt: selected.prompt })) : (_jsx(\"div\", { className: \"dsh-ig-lightbox-loading\", children: _jsx(\"div\", { className: \"dsh-ig-lightbox-spinner\" }) })) }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: e => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: selected.prompt, children: selected.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(selected.prompt);\n flash(t('copiedPrompt'));\n }, children: [_jsx(FileText, { size: 14 }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copy'), onClick: async () => {\n if (!image.blob)\n return;\n const ok = await copyImageBlob(image.blob);\n flash(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsx(Copy, { size: 14 }), _jsx(\"span\", { children: t('copy') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: downloadSelected, children: [_jsx(Download, { size: 14 }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-lightbox-btn ${isSelectedInGallery ? 'is-saved' : ''}`, title: isSelectedInGallery ? t('inGallery') : t('saveToGallery'), onClick: () => void handleSaveToGallery(), disabled: isSelectedInGallery, children: [isSelectedInGallery ? _jsx(Check, { size: 14 }) : _jsx(BookmarkPlus, { size: 14 }), _jsx(\"span\", { children: isSelectedInGallery ? t('inGallery') : t('saveToGallery') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: selected.isFavorite ? t('favorited') : t('favorite'), onClick: () => void toggleFavorite(), children: [_jsx(Heart, { size: 14, fill: selected.isFavorite ? '#ef4444' : 'none', color: selected.isFavorite ? '#ef4444' : 'currentColor' }), _jsx(\"span\", { children: selected.isFavorite ? t('favorited') : t('favorite') })] })] })] })] })), showDeleteModal && selected !== null && (_jsx(\"div\", { className: \"dsh-ig-workbench-modal-backdrop\", onClick: () => setShowDeleteModal(false), children: _jsxs(\"div\", { className: \"dsh-ig-workbench-modal-box\", onClick: e => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-workbench-modal-header\", children: [_jsx(AlertTriangle, { size: 20, color: \"#dc2626\" }), _jsx(\"strong\", { children: t('deleteModalTitle') })] }), _jsx(\"p\", { className: \"dsh-ig-workbench-modal-desc\", children: t('deleteModalDesc') }), Boolean(selected.savedTo) && (_jsxs(\"label\", { className: \"dsh-ig-workbench-modal-option\", children: [_jsx(\"input\", { type: \"checkbox\", checked: deleteWorkspaceFiles, onChange: e => setDeleteWorkspaceFiles(e.target.checked) }), _jsx(\"span\", { children: t('deleteWorkspaceFilesLabel') })] })), _jsxs(\"div\", { className: \"dsh-ig-workbench-modal-actions\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-workbench-modal-cancel\", onClick: () => setShowDeleteModal(false), children: t('cancel') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-workbench-modal-danger\", onClick: () => void handleConfirmDelete(), children: t('confirm') })] })] }) })), notice !== null && _jsx(\"div\", { className: \"dsh-ig-workbench-toast\", children: notice })] }));\n};\nconst BatchCanvasItem = ({ item, index, isSelected, onSelect }) => {\n const image = useAttachmentImage(item.attachment, true);\n return (_jsxs(\"div\", { className: `dsh-ig-canvas-item ${isSelected ? 'is-selected' : ''}`, onClick: onSelect, children: [_jsxs(\"span\", { className: \"dsh-ig-canvas-badge\", children: [\"#\", index + 1] }), image.url !== null ? (_jsx(\"img\", { src: image.url, alt: item.prompt, draggable: false })) : image.loading ? (_jsx(\"div\", { className: \"dsh-ig-canvas-item-loading\", children: _jsx(LoaderCircle, { className: \"dsh-ig-spin\", size: 24 }) })) : (_jsx(\"div\", { className: \"dsh-ig-canvas-item-loading\", children: _jsx(ImagePlus, { size: 24 }) }))] }));\n};\nconst FieldSelect = ({ label, value, options, onChange }) => _jsxs(\"label\", { className: \"dsh-ig-field-select\", children: [_jsx(\"span\", { children: label }), _jsx(\"select\", { value: value, onChange: event => onChange(event.target.value), children: options.map(option => _jsx(\"option\", { value: option.value, children: option.label }, option.value)) })] });\nconst DetailsPanel = ({ item, t }) => item === null ? _jsxs(\"div\", { className: \"dsh-ig-details-empty\", children: [_jsx(ImagePlus, { size: 28 }), _jsx(\"span\", { children: t('selectHistory') })] }) : _jsxs(\"dl\", { className: \"dsh-ig-details\", children: [_jsxs(\"div\", { children: [_jsx(\"dt\", { children: t('prompt') }), _jsx(\"dd\", { children: item.prompt })] }), _jsxs(\"div\", { children: [_jsx(\"dt\", { children: t('provider') }), _jsx(\"dd\", { children: item.provider })] }), _jsxs(\"div\", { children: [_jsx(\"dt\", { children: t('model') }), _jsx(\"dd\", { children: item.model })] }), _jsxs(\"div\", { children: [_jsx(\"dt\", { children: t('dimensions') }), _jsx(\"dd\", { children: item.attachment.width && item.attachment.height ? `${item.attachment.width} × ${item.attachment.height}` : '—' })] }), _jsxs(\"div\", { children: [_jsx(\"dt\", { children: t('output') }), _jsx(\"dd\", { children: item.output ?? '—' })] }), _jsxs(\"div\", { children: [_jsx(\"dt\", { children: t('created') }), _jsx(\"dd\", { children: new Date(item.createdAt).toLocaleString() })] })] });\nconst RecentItem = ({ item, active, lang, onClick }) => {\n const [setRef, inView] = useInView();\n const image = useAttachmentImage(item.attachment, inView);\n return (_jsxs(\"button\", { ref: setRef, type: \"button\", className: `dsh-ig-recent-item ${active ? 'is-active' : ''}`, onClick: onClick, children: [_jsx(\"div\", { className: \"dsh-ig-recent-thumb\", children: image.url !== null ? _jsx(\"img\", { src: image.url, alt: \"\", loading: \"lazy\" }) : _jsx(ImagePlus, { size: 18 }) }), _jsxs(\"div\", { children: [_jsx(\"strong\", { children: item.prompt }), _jsx(\"span\", { children: formatRelativeTime(item.createdAt, lang) }), _jsxs(\"small\", { children: [item.provider, \" \\u00B7 \", item.model] }), _jsx(\"small\", { children: item.attachment.width && item.attachment.height ? `${item.attachment.width} × ${item.attachment.height}` : '—' })] })] }));\n};\nfunction useInView() {\n const [inView, setInView] = useState(false);\n const observerRef = useRef(null);\n useEffect(() => {\n return () => {\n observerRef.current?.disconnect();\n };\n }, []);\n const refCallback = useCallback((el) => {\n observerRef.current?.disconnect();\n if (!el || inView)\n return;\n if (typeof IntersectionObserver === 'undefined') {\n setInView(true);\n return;\n }\n const observer = new IntersectionObserver(([entry]) => {\n if (entry?.isIntersecting) {\n setInView(true);\n observer.disconnect();\n }\n }, { rootMargin: '120px' });\n observerRef.current = observer;\n observer.observe(el);\n }, [inView]);\n return [refCallback, inView];\n}\nexport function useAttachmentImage(attachment, shouldLoad = true) {\n const [value, setValue] = useState({ url: null, blob: null, loading: false });\n useEffect(() => {\n if (attachment === undefined || !shouldLoad) {\n setValue({ url: null, blob: null, loading: false });\n return;\n }\n let cancelled = false;\n let objectUrl = null;\n setValue({ url: null, blob: null, loading: true });\n fetchAttachmentBlob(attachment)\n .then(blob => {\n if (cancelled)\n return;\n objectUrl = URL.createObjectURL(blob);\n setValue({ url: objectUrl, blob, loading: false });\n })\n .catch(() => { if (!cancelled)\n setValue({ url: null, blob: null, loading: false }); });\n return () => {\n cancelled = true;\n if (objectUrl !== null)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, shouldLoad]);\n return value;\n}\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n const commaIndex = result.indexOf(',');\n resolve(commaIndex >= 0 ? result.slice(commaIndex + 1) : result);\n };\n reader.onerror = () => reject(reader.error ?? new Error('Failed to read image file'));\n reader.readAsDataURL(file);\n });\n}\nfunction extension(mediaType) {\n return mediaType === 'image/jpeg' ? 'jpg' : mediaType.split('/')[1] ?? 'png';\n}\nfunction messageOf(error) {\n return error instanceof Error ? error.message : String(error);\n}\n//# sourceMappingURL=studio-view.js.map","import { CLOUD_IMAGE_PROVIDERS, } from '../shared.js';\n/** Build the workbench request that reproduces a conversation image with an edited prompt. */\nexport function conversationRegenerateRequest(image, prompt, remembered) {\n if (!CLOUD_IMAGE_PROVIDERS.includes(image.provider)) {\n throw new Error('当前图片使用的 Provider 暂不支持重新生成');\n }\n const provider = image.provider;\n const settings = remembered ?? outputSettings(provider, image.output);\n return {\n mode: 'generate',\n provider,\n model: image.model,\n prompt: prompt.trim(),\n ratio: settings.ratio,\n quality: settings.quality,\n };\n}\nfunction outputSettings(provider, output) {\n const normalized = (output ?? '').trim();\n if (provider === 'google') {\n const [rawRatio, rawQuality] = normalized.split(',').map(value => value.trim());\n return {\n ratio: isRatio(rawRatio) ? rawRatio : '1:1',\n quality: rawQuality === '1K' || rawQuality === '2K' || rawQuality === '4K' ? rawQuality : '1K',\n };\n }\n if (provider === 'seedream') {\n return { ratio: 'auto', quality: normalized === '1K' || normalized === '4K' ? normalized : '2K' };\n }\n if (provider === 'openai') {\n return { ratio: ratioFromSize(normalized, 'x'), quality: 'standard' };\n }\n return { ratio: ratioFromSize(normalized, '*'), quality: 'standard' };\n}\nfunction ratioFromSize(size, separator) {\n const sizes = separator === 'x'\n ? { '1024x1024': '1:1', '1536x1024': '3:2', '1024x1536': '2:3' }\n : { '1024*1024': '1:1', '1536*1024': '3:2', '1024*1536': '2:3', '1664*928': '16:9', '928*1664': '9:16' };\n return sizes[size] ?? '1:1';\n}\nfunction isRatio(value) {\n return value === '1:1' || value === '3:2' || value === '2:3' || value === '4:3' || value === '3:4' || value === '16:9' || value === '9:16';\n}\n//# sourceMappingURL=conversation-regenerate.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery & Studio View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English) with modular tabs, multi-dimensional filters,\n * responsive image grid, and placeholder routes.\n */\nimport { useEffect, useState, useMemo, useRef } from 'react';\nimport { IMAGE_ROUTE, DELETE_ROUTE } from '../shared.js';\nimport { Image as ImageIcon, SlidersHorizontal, Heart, Search, Copy, Download, FileText, Trash2, X, ChevronLeft, ChevronRight, CheckSquare, Check, AlertTriangle, Sparkles, } from 'lucide-react';\nimport { getGalleryItems, subscribeGallery, saveGalleryItem, deleteGalleryItem, bulkDeleteGalleryItems, toggleFavoriteGalleryItem, isItemInWorkspace, } from './gallery-store.js';\nimport { StudioView } from './studio-view.js';\nimport { evictAttachmentCache, fetchAttachmentBlob } from './image-cache.js';\nimport { copyImageBlob } from './browser-image-utils.js';\nimport { conversationRegenerateRequest } from './conversation-regenerate.js';\nimport { STUDIO_ROUTE } from '../shared.js';\nconst DICT = {\n zh: {\n // 顶部 Tab\n tabGallery: '图库',\n tabStudio: '工作台',\n tabFavorites: '收藏',\n tabCompare: '对比',\n tabTasks: '任务',\n // 筛选工具栏\n filterAllProviders: '全部提供商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n filterComfyUI: '本地 ComfyUI',\n filterAllModels: '全部模型',\n filterAllRatios: '全部比例',\n searchPlaceholder: '搜索 Prompt、标签…',\n filterCurrentWorkspace: '仅看此工作区',\n filterCurrentWorkspaceHint: '只展示属于当前工作区的生图记录与物理文件',\n sortNewest: '最新生成',\n sortOldest: '最早生成',\n // 状态与提示\n totalCount: '共 {count} 张生成图片',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n favEmptyTitle: '暂无收藏图片',\n favEmptyDesc: '在图库中点击卡片右下角的 ♡ 按钮,即可将喜爱的图片收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或调整筛选条件。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n favoriteAdded: '已添加到收藏',\n favoriteRemoved: '已取消收藏',\n // 卡片与弹窗操作\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n regenerate: '重新生成',\n regenerateTitle: '重新生成图片',\n regenerateHint: '可按需修改 Prompt,基于当前模型和比例在画廊生成一张新图片。',\n confirmRegenerate: '开始生成',\n regenerating: '正在重新生成…',\n regenerateSuccess: '已生成新图片并收录到画廊',\n regenerateFailed: '重新生成失败',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n prevImage: '上一张 (←)',\n nextImage: '下一张 (→)',\n // 批量管理与删除\n manage: '批量删除',\n exitManage: '退出选择',\n selectedCount: '已选 {n} 项',\n selectAll: '全选',\n invertSelect: '反选',\n clearSelect: '清空',\n batchDelete: '批量删除',\n batchDeleteTitle: '确认批量删除选中的 {count} 张图片?',\n batchDeleteTitleSingle: '确认从画廊中删除这张图片?',\n batchDeleteDesc: '将从画廊历史记录中移除所选图片。',\n deleteWorkspaceFilesOpt: '同时清理工作区磁盘物理文件(不可恢复)',\n cancel: '取消',\n confirmBatchDelete: '确认删除 ({count})',\n confirmDeleteSingle: '确认删除',\n batchDeletedToast: '已删除 {count} 张图片',\n batchDeletedWithFilesToast: '已删除 {count} 张图片,并清理了 {files} 个工作区文件',\n deleteFailedFileLocked: '已删除 {count} 张图片,但有 {files} 个文件因被系统占用未能删除',\n deleteFailedDatabase: '删除失败:本地数据库操作异常',\n // 时间格式化\n justNow: '刚刚',\n minutesAgo: '{n} 分钟前',\n hoursAgo: '{n} 小时前',\n daysAgo: '{n} 天前',\n // 预留模块占位\n studioTitle: 'AI 图像工作台 (Studio)',\n studioDesc: '工作台模块正在紧锣密鼓开发中。在此你将体验大图精修、变体生成 (Variations)、参数重调并一键将生成结果无缝插回 DSH 正在进行的对话。',\n studioTip: '💡 提示:目前你可以在“图库”中点击任意图片,在弹窗中进行查看、复制与下载。',\n compareTitle: '多模型横向对比 (Compare)',\n compareDesc: '支持单个 Prompt 一键同时调度 Gemini、Seedream、DashScope 及本地 ComfyUI 模型并排生成,直观横评画质与细节。',\n tasksTitle: '异步任务队列 (Tasks)',\n tasksDesc: '集中管理后台批量生图、多模型并发生成与本地 ComfyUI 耗时任务。支持状态追踪、失败重试与执行耗时分析。',\n comingSoonBadge: '即将推出',\n },\n en: {\n // Top Tabs\n tabGallery: 'Gallery',\n tabStudio: 'Studio',\n tabFavorites: 'Favorites',\n tabCompare: 'Compare',\n tabTasks: 'Tasks',\n // Filter Toolbar\n filterAllProviders: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n filterComfyUI: 'Local ComfyUI',\n filterAllModels: 'All Models',\n filterAllRatios: 'All Ratios',\n searchPlaceholder: 'Search prompt, tags…',\n filterCurrentWorkspace: 'Current workspace only',\n filterCurrentWorkspaceHint: 'Only show images belonging to the active workspace',\n sortNewest: 'Newest first',\n sortOldest: 'Oldest first',\n // States & Toasts\n totalCount: '{count} images total',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n favEmptyTitle: 'No favorite images yet',\n favEmptyDesc: 'Click the ♡ button on any card in the gallery to collect your favorite images here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or adjust filter criteria.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n favoriteAdded: 'Added to favorites',\n favoriteRemoved: 'Removed from favorites',\n // Card & Lightbox Actions\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n regenerate: 'Regenerate',\n regenerateTitle: 'Regenerate Image',\n regenerateHint: 'Edit prompt if needed. A new image will be generated and added to the gallery.',\n confirmRegenerate: 'Generate',\n regenerating: 'Regenerating…',\n regenerateSuccess: 'New image generated and added to gallery',\n regenerateFailed: 'Regeneration failed',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n prevImage: 'Previous (←)',\n nextImage: 'Next (→)',\n // Batch Management & Delete\n manage: 'Batch Delete',\n exitManage: 'Done',\n selectedCount: '{n} selected',\n selectAll: 'Select All',\n invertSelect: 'Invert',\n clearSelect: 'Clear',\n batchDelete: 'Batch Delete',\n batchDeleteTitle: 'Delete {count} selected images?',\n batchDeleteTitleSingle: 'Delete this image from gallery?',\n batchDeleteDesc: 'These images will be removed from your gallery history.',\n deleteWorkspaceFilesOpt: 'Also delete files from workspace disk (cannot be undone)',\n cancel: 'Cancel',\n confirmBatchDelete: 'Delete ({count})',\n confirmDeleteSingle: 'Delete',\n batchDeletedToast: 'Deleted {count} images',\n batchDeletedWithFilesToast: 'Deleted {count} images and cleaned {files} workspace files',\n deleteFailedFileLocked: 'Deleted {count} images, but {files} files could not be deleted (busy/locked)',\n deleteFailedDatabase: 'Failed to delete: local database error',\n // Relative Time\n justNow: 'Just now',\n minutesAgo: '{n}m ago',\n hoursAgo: '{n}h ago',\n daysAgo: '{n}d ago',\n // Route Placeholders\n studioTitle: 'AI Image Studio',\n studioDesc: 'Studio workbench is under active development. Fine-tune prompts, generate variations (2x/4x), and inject images directly into DSH chat.',\n studioTip: '💡 Tip: You can currently click any image in the Gallery to preview, copy, or download it.',\n compareTitle: 'Model Comparison (Compare)',\n compareDesc: 'Side-by-side multi-model benchmarking coming soon. Test Gemini, Seedream, DashScope, and ComfyUI with a single prompt.',\n tasksTitle: 'Task Queue (Tasks)',\n tasksDesc: 'Centralized view for batch generation, asynchronous ComfyUI runs, live progress tracking, and retry controls.',\n comingSoonBadge: 'Coming Soon',\n },\n};\n/** Format human-readable relative time */\nfunction formatRelativeTime(timestamp, t) {\n const diff = Date.now() - timestamp;\n if (diff < 60_000) {\n return t('justNow');\n }\n if (diff < 3600_000) {\n const mins = Math.max(1, Math.floor(diff / 60_000));\n return t('minutesAgo', { n: String(mins) });\n }\n if (diff < 86400_000) {\n const hours = Math.floor(diff / 3600_000);\n return t('hoursAgo', { n: String(hours) });\n }\n if (diff < 30 * 86400_000) {\n const days = Math.floor(diff / 86400_000);\n return t('daysAgo', { n: String(days) });\n }\n const d = new Date(timestamp);\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n}\n/** Extract standard aspect ratio for precise filtering */\nfunction getItemRatio(item) {\n if (item.aspectRatio && item.aspectRatio !== 'custom') {\n return item.aspectRatio;\n }\n if (item.output) {\n const ratioMatch = item.output.match(/\\b(1:1|16:9|9:16|4:3|3:4|3:2|2:3)\\b/);\n if (ratioMatch?.[1])\n return ratioMatch[1];\n const dimMatch = item.output.match(/(\\d{3,4})\\s*[×x*]\\s*(\\d{3,4})/);\n if (dimMatch?.[1] && dimMatch[2]) {\n const w = parseInt(dimMatch[1], 10);\n const h = parseInt(dimMatch[2], 10);\n if (w === h)\n return '1:1';\n const approx = w / h;\n if (Math.abs(approx - 16 / 9) < 0.05)\n return '16:9';\n if (Math.abs(approx - 9 / 16) < 0.05)\n return '9:16';\n if (Math.abs(approx - 4 / 3) < 0.05)\n return '4:3';\n if (Math.abs(approx - 3 / 4) < 0.05)\n return '3:4';\n if (Math.abs(approx - 3 / 2) < 0.05)\n return '3:2';\n if (Math.abs(approx - 2 / 3) < 0.05)\n return '2:3';\n }\n }\n return '1:1';\n}\n/** Format aspect ratio or dimensions for card metadata (e.g., 1024×1024 or 16:9) */\nfunction formatCardMeta(item) {\n if (item.output) {\n const dimMatch = item.output.match(/(\\d{3,4})\\s*[×x*]\\s*(\\d{3,4})/);\n if (dimMatch?.[1] && dimMatch[2]) {\n return `${dimMatch[1]}×${dimMatch[2]}`;\n }\n }\n if (item.aspectRatio && item.aspectRatio !== 'custom') {\n return item.aspectRatio;\n }\n if (item.output) {\n const ratioMatch = item.output.match(/\\b(1:1|16:9|9:16|4:3|3:4|3:2|2:3)\\b/);\n if (ratioMatch?.[1])\n return ratioMatch[1];\n }\n if (item.imageSize) {\n return item.imageSize;\n }\n return '1:1';\n}\nexport const GalleryViewTab = (props) => {\n const { locale, sessionId, useSessions, useWorkspaces } = props;\n const [activeTab, setActiveTab] = useState('gallery');\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [selectedRatio, setSelectedRatio] = useState('all');\n const [sortBy, setSortBy] = useState('newest');\n const [onlyCurrentWorkspace, setOnlyCurrentWorkspace] = useState(() => {\n try {\n const stored = localStorage.getItem('dsh-ig-only-current-workspace');\n return stored === null ? true : stored === 'true';\n }\n catch {\n return true;\n }\n });\n const [serverWorkspaces, setServerWorkspaces] = useState([]);\n const [serverActiveRoot, setServerActiveRoot] = useState(null);\n useEffect(() => {\n try {\n localStorage.setItem('dsh-ig-only-current-workspace', String(onlyCurrentWorkspace));\n }\n catch { }\n }, [onlyCurrentWorkspace]);\n useEffect(() => {\n let mounted = true;\n fetch(STUDIO_ROUTE)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => {\n if (!mounted || !data)\n return;\n if (Array.isArray(data.workspaces))\n setServerWorkspaces(data.workspaces);\n if (typeof data.workspaceRoot === 'string')\n setServerActiveRoot(data.workspaceRoot);\n })\n .catch(() => { });\n return () => {\n mounted = false;\n };\n }, []);\n const liveWorkspaces = useWorkspaces ? useWorkspaces((s) => s?.items) : null;\n const liveSessions = useSessions ? useSessions((s) => s) : null;\n const currentSessionId = sessionId || liveSessions?.current;\n const activeWorkspace = useMemo(() => {\n const allWs = Array.isArray(liveWorkspaces) && liveWorkspaces.length > 0\n ? liveWorkspaces\n : serverWorkspaces;\n if (allWs.length > 0) {\n if (currentSessionId) {\n const matched = allWs.find((ws) => Array.isArray(ws.sessionIds) && ws.sessionIds.includes(currentSessionId));\n if (matched)\n return matched;\n }\n if (serverActiveRoot) {\n const normActive = serverActiveRoot.replace(/\\\\/g, '/').toLowerCase();\n const matched = allWs.find((ws) => ws.path && ws.path.replace(/\\\\/g, '/').toLowerCase() === normActive);\n if (matched)\n return matched;\n }\n return allWs[0];\n }\n if (serverActiveRoot) {\n return { workspaceId: 'default', path: serverActiveRoot, title: 'Workspace', sessionIds: [] };\n }\n return null;\n }, [liveWorkspaces, serverWorkspaces, currentSessionId, serverActiveRoot]);\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const previewUrlRef = useRef(null);\n previewUrlRef.current = previewUrl;\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n // In-Gallery Regenerate State\n const [showRegenerateModal, setShowRegenerateModal] = useState(false);\n const [regeneratePrompt, setRegeneratePrompt] = useState('');\n const [isRegenerating, setIsRegenerating] = useState(false);\n const regenerateControllerRef = useRef(null);\n // Batch Management & Shift-Selection State\n const [isManageMode, setIsManageMode] = useState(false);\n const [selectedIds, setSelectedIds] = useState(new Set());\n const lastSelectedIndexRef = useRef(null);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [deleteWorkspaceFiles, setDeleteWorkspaceFiles] = useState(true);\n const [isDeleting, setIsDeleting] = useState(false);\n // Clear batch selection and shift anchor when switching tabs, searching, or changing filters\n useEffect(() => {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n }, [activeTab, search, selectedProvider, selectedRatio, sortBy, onlyCurrentWorkspace]);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery/studio\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n // Load items from IndexedDB\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n const [previewLoading, setPreviewLoading] = useState(false);\n const blobCache = useMemo(() => new Map(), []);\n const abortControllerRef = useRef(null);\n // Multi-dimensional filtering and sorting (Provider, Ratio, Search, and Sort)\n const filteredItems = useMemo(() => {\n return items\n .filter((item) => {\n // Tab-level filter (Favorites tab only shows favorited items)\n if (activeTab === 'favorites' && !item.isFavorite) {\n return false;\n }\n // Provider filter\n if (selectedProvider !== 'all' && item.provider !== selectedProvider) {\n return false;\n }\n // Ratio filter\n if (selectedRatio !== 'all') {\n const ratio = getItemRatio(item);\n if (ratio !== selectedRatio) {\n return false;\n }\n }\n // Search filter (Prompt, model, tags, provider)\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n const matchProvider = item.provider?.toLowerCase().includes(q);\n const matchTags = item.tags?.some((t) => t.toLowerCase().includes(q));\n if (!matchPrompt && !matchModel && !matchProvider && !matchTags) {\n return false;\n }\n }\n // Workspace filter\n if (onlyCurrentWorkspace && activeWorkspace) {\n if (!isItemInWorkspace(item, activeWorkspace)) {\n return false;\n }\n }\n return true;\n })\n .sort((a, b) => {\n if (sortBy === 'oldest') {\n return a.createdAt - b.createdAt;\n }\n return b.createdAt - a.createdAt;\n });\n }, [items, activeTab, selectedProvider, selectedRatio, search, sortBy, onlyCurrentWorkspace, activeWorkspace]);\n // Count of items belonging to the current workspace (before other search/filter criteria)\n const workspaceItemsCount = useMemo(() => {\n if (!activeWorkspace)\n return items.length;\n return items.filter((item) => isItemInWorkspace(item, activeWorkspace)).length;\n }, [items, activeWorkspace]);\n // Current item index in the active filtered sequence\n const currentPreviewIndex = useMemo(() => {\n if (!previewItem)\n return -1;\n return filteredItems.findIndex((i) => i.id === previewItem.id);\n }, [previewItem, filteredItems]);\n const hasPrev = currentPreviewIndex > 0;\n const hasNext = currentPreviewIndex >= 0 && currentPreviewIndex < filteredItems.length - 1;\n // Safely open or navigate preview item\n const openPreviewItem = (item, blob) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (previewUrlRef.current) {\n URL.revokeObjectURL(previewUrlRef.current);\n previewUrlRef.current = null;\n }\n setPreviewItem(item);\n if (blob) {\n blobCache.set(item.id, blob);\n const url = URL.createObjectURL(blob);\n previewUrlRef.current = url;\n setPreviewBlob(blob);\n setPreviewUrl(url);\n setPreviewLoading(false);\n return;\n }\n const cached = blobCache.get(item.id);\n if (cached) {\n const url = URL.createObjectURL(cached);\n previewUrlRef.current = url;\n setPreviewBlob(cached);\n setPreviewUrl(url);\n setPreviewLoading(false);\n return;\n }\n setPreviewLoading(true);\n setPreviewBlob(null);\n setPreviewUrl(null);\n const controller = new AbortController();\n abortControllerRef.current = controller;\n fetchAttachmentBlob(item.attachment)\n .then((fetchedBlob) => {\n if (controller.signal.aborted)\n return;\n blobCache.set(item.id, fetchedBlob);\n const url = URL.createObjectURL(fetchedBlob);\n previewUrlRef.current = url;\n setPreviewBlob(fetchedBlob);\n setPreviewUrl(url);\n setPreviewLoading(false);\n })\n .catch((err) => {\n if (controller.signal.aborted)\n return;\n setPreviewLoading(false);\n showToast(t('copyFailed'));\n });\n };\n // Close preview and revoke object URL\n const handleClosePreview = () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (regenerateControllerRef.current) {\n regenerateControllerRef.current.abort();\n regenerateControllerRef.current = null;\n setIsRegenerating(false);\n }\n setShowRegenerateModal(false);\n if (previewUrlRef.current) {\n URL.revokeObjectURL(previewUrlRef.current);\n previewUrlRef.current = null;\n }\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n setPreviewLoading(false);\n };\n const goToPrev = () => {\n if (currentPreviewIndex > 0) {\n const prevItem = filteredItems[currentPreviewIndex - 1];\n if (prevItem)\n openPreviewItem(prevItem);\n }\n };\n const goToNext = () => {\n if (currentPreviewIndex >= 0 && currentPreviewIndex < filteredItems.length - 1) {\n const nextItem = filteredItems[currentPreviewIndex + 1];\n if (nextItem)\n openPreviewItem(nextItem);\n }\n };\n const handleOpenRegenerate = () => {\n if (!previewItem || isRegenerating)\n return;\n setRegeneratePrompt(previewItem.prompt);\n setShowRegenerateModal(true);\n };\n const handleCancelRegeneratePrompt = () => {\n setShowRegenerateModal(false);\n };\n const handleAbortRegenerating = () => {\n regenerateControllerRef.current?.abort();\n regenerateControllerRef.current = null;\n setIsRegenerating(false);\n showToast(t('cancel'));\n };\n const handleConfirmRegenerate = async () => {\n if (!previewItem || isRegenerating || regeneratePrompt.trim().length === 0)\n return;\n setShowRegenerateModal(false);\n setIsRegenerating(true);\n const controller = new AbortController();\n regenerateControllerRef.current = controller;\n try {\n const request = conversationRegenerateRequest(previewItem, regeneratePrompt, previewItem.aspectRatio\n ? { ratio: previewItem.aspectRatio, quality: previewItem.imageSize || 'standard' }\n : undefined);\n if (activeWorkspace?.path) {\n request.workspaceRoot = activeWorkspace.path;\n }\n const response = await fetch(STUDIO_ROUTE, {\n method: 'POST',\n credentials: 'same-origin',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(request),\n });\n const payload = (await response.json().catch(() => null));\n if (!response.ok || payload === null || !('attachment' in payload)) {\n throw new Error(payload && 'error' in payload && payload.error ? payload.error : t('regenerateFailed'));\n }\n const newItem = {\n id: String(payload.attachment.attachmentId),\n attachment: payload.attachment,\n prompt: payload.prompt,\n provider: payload.provider,\n model: payload.model,\n createdAt: payload.createdAt,\n aspectRatio: request.ratio,\n imageSize: request.quality,\n output: payload.output,\n ...(payload.savedTo ? { savedTo: payload.savedTo } : {}),\n ...(activeWorkspace?.path ? { workspacePath: activeWorkspace.path } : {}),\n ...(activeWorkspace?.workspaceId ? { workspaceId: activeWorkspace.workspaceId } : {}),\n ...(currentSessionId ? { sessionId: currentSessionId } : {}),\n };\n await saveGalleryItem(newItem);\n if (activeTab !== 'gallery') {\n setActiveTab('gallery');\n }\n if (search.trim().length > 0) {\n setSearch('');\n }\n // Smoothly update preview to the newly created item and load its image blob\n openPreviewItem(newItem);\n showToast(t('regenerateSuccess'));\n }\n catch (err) {\n if (controller.signal.aborted)\n return;\n showToast(err instanceof Error ? err.message : String(err));\n }\n finally {\n setIsRegenerating(false);\n regenerateControllerRef.current = null;\n }\n };\n // Clean up only on component unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current)\n abortControllerRef.current.abort();\n if (regenerateControllerRef.current)\n regenerateControllerRef.current.abort();\n if (previewUrlRef.current)\n URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n // Keyboard navigation: Esc (close modal or preview), ArrowLeft (prev), ArrowRight (next)\n useEffect(() => {\n const onKeyDown = (e) => {\n if (['INPUT', 'TEXTAREA'].includes(e.target?.tagName)) {\n return;\n }\n if (showRegenerateModal) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setShowRegenerateModal(false);\n }\n return;\n }\n if (showDeleteModal) {\n if (e.key === 'Escape' && !isDeleting) {\n e.preventDefault();\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }\n return;\n }\n if (previewItem) {\n if (e.key === 'Escape') {\n handleClosePreview();\n }\n else if (e.key === 'ArrowLeft' || e.key === 'Left') {\n e.preventDefault();\n goToPrev();\n }\n else if (e.key === 'ArrowRight' || e.key === 'Right') {\n e.preventDefault();\n goToNext();\n }\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [showRegenerateModal, showDeleteModal, isDeleting, isManageMode, previewItem, currentPreviewIndex, filteredItems]);\n // Shift-Click Range Selection & Card Click Handler\n const handleCardClick = (item, index, e, blob) => {\n // If holding Shift, or if currently in manage mode:\n if (e.shiftKey || isManageMode) {\n e.stopPropagation();\n if (!isManageMode) {\n setIsManageMode(true);\n }\n if (e.shiftKey && lastSelectedIndexRef.current !== null) {\n const from = Math.min(lastSelectedIndexRef.current, index);\n const to = Math.max(lastSelectedIndexRef.current, index);\n const rangeItems = filteredItems.slice(from, to + 1);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const r of rangeItems) {\n next.add(r.id);\n }\n return next;\n });\n }\n else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) {\n next.delete(item.id);\n }\n else {\n next.add(item.id);\n }\n return next;\n });\n lastSelectedIndexRef.current = index;\n }\n return;\n }\n // Normal click -> open preview\n if (blob) {\n openPreviewItem(item, blob);\n }\n };\n // Toggle selection for a specific card index\n const handleToggleSelect = (id, index, e) => {\n e.stopPropagation();\n if (!isManageMode) {\n setIsManageMode(true);\n }\n if (e.shiftKey && lastSelectedIndexRef.current !== null) {\n const from = Math.min(lastSelectedIndexRef.current, index);\n const to = Math.max(lastSelectedIndexRef.current, index);\n const rangeItems = filteredItems.slice(from, to + 1);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const r of rangeItems) {\n next.add(r.id);\n }\n return next;\n });\n }\n else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n }\n else {\n next.add(id);\n }\n return next;\n });\n lastSelectedIndexRef.current = index;\n }\n };\n const handleSelectAll = () => {\n setSelectedIds(new Set(filteredItems.map((i) => i.id)));\n };\n const handleInvertSelect = () => {\n setSelectedIds((prev) => {\n const next = new Set();\n for (const item of filteredItems) {\n if (!prev.has(item.id)) {\n next.add(item.id);\n }\n }\n return next;\n });\n };\n const handleClearSelect = () => {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n };\n const handleExitManage = () => {\n setIsManageMode(false);\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n };\n // Request single image deletion through the unified modal\n const requestSingleDelete = (item, e) => {\n if (e)\n e.stopPropagation();\n setSelectedIds(new Set([item.id]));\n setShowDeleteModal(true);\n };\n const hasWorkspaceFilesToDelete = useMemo(() => items.some(i => selectedIds.has(i.id) && typeof i.savedTo === 'string' && i.savedTo.trim().length > 0), [items, selectedIds]);\n // Execute batch deletion (IndexedDB single transaction + optional workspace disk unlink)\n const handleConfirmBatchDelete = async () => {\n if (selectedIds.size === 0 || isDeleting)\n return;\n setIsDeleting(true);\n const idsToDelete = Array.from(selectedIds);\n const itemsToDelete = items.filter((i) => selectedIds.has(i.id));\n // 1. Collect exact workspace file paths\n const pathsToDelete = itemsToDelete\n .map((i) => i.savedTo)\n .filter((p) => typeof p === 'string' && p.trim().length > 0);\n let deletedFiles = 0;\n if (deleteWorkspaceFiles && pathsToDelete.length > 0) {\n try {\n const res = await fetch(DELETE_ROUTE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n paths: pathsToDelete,\n }),\n });\n if (!res.ok) {\n setIsDeleting(false);\n showToast(`工作区文件删除失败 (${res.status})`);\n return;\n }\n const data = (await res.json().catch(() => null));\n if (!data || data.ok === false || (Array.isArray(data.failedFiles) && data.failedFiles.length > 0)) {\n setIsDeleting(false);\n const reason = data?.failedFiles?.[0]?.error || '工作区文件未能删除';\n showToast(`删除失败:${reason}`);\n return;\n }\n deletedFiles = data.deletedCount ?? 0;\n }\n catch (err) {\n setIsDeleting(false);\n showToast(err instanceof Error ? err.message : '工作区文件删除网络异常');\n return;\n }\n }\n // 2. Perform IndexedDB deletion with real error handling\n try {\n await bulkDeleteGalleryItems(idsToDelete);\n for (const item of itemsToDelete) {\n evictAttachmentCache(item.attachment.attachmentId);\n }\n }\n catch (err) {\n setIsDeleting(false);\n showToast(t('deleteFailedDatabase'));\n return;\n }\n // Close lightbox if preview item was deleted\n if (previewItem && selectedIds.has(previewItem.id)) {\n handleClosePreview();\n }\n setIsDeleting(false);\n setShowDeleteModal(false);\n if (isManageMode) {\n handleExitManage();\n }\n else {\n setSelectedIds(new Set());\n lastSelectedIndexRef.current = null;\n }\n if (deletedFiles > 0) {\n showToast(t('batchDeletedWithFilesToast', { count: String(idsToDelete.length), files: String(deletedFiles) }));\n }\n else {\n showToast(t('batchDeletedToast', { count: String(idsToDelete.length) }));\n }\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", \"data-conversation-composer-overlay\": \"\", children: [_jsxs(\"header\", { className: \"dsh-ig-studio-tabs-bar\", children: [_jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'gallery' ? 'is-active' : ''}`, onClick: () => setActiveTab('gallery'), children: [_jsx(ImageIcon, { size: 15 }), _jsx(\"span\", { children: t('tabGallery') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'studio' ? 'is-active' : ''}`, onClick: () => setActiveTab('studio'), children: [_jsx(SlidersHorizontal, { size: 15 }), _jsx(\"span\", { children: t('tabStudio') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-tab-btn ${activeTab === 'favorites' ? 'is-active' : ''}`, onClick: () => setActiveTab('favorites'), children: [_jsx(Heart, { size: 15 }), _jsx(\"span\", { children: t('tabFavorites') })] })] }), (activeTab === 'gallery' || activeTab === 'favorites') && (_jsxs(\"div\", { className: \"dsh-ig-studio-toolbar\", children: [_jsxs(\"div\", { className: \"dsh-ig-studio-toolbar-left\", children: [_jsxs(\"select\", { className: \"dsh-ig-studio-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAllProviders') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('filterComfyUI') })] }), _jsxs(\"select\", { className: \"dsh-ig-studio-select\", value: selectedRatio, onChange: (e) => setSelectedRatio(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAllRatios') }), _jsx(\"option\", { value: \"1:1\", children: \"1:1\" }), _jsx(\"option\", { value: \"16:9\", children: \"16:9\" }), _jsx(\"option\", { value: \"9:16\", children: \"9:16\" }), _jsx(\"option\", { value: \"4:3\", children: \"4:3\" }), _jsx(\"option\", { value: \"3:4\", children: \"3:4\" }), _jsx(\"option\", { value: \"3:2\", children: \"3:2\" }), _jsx(\"option\", { value: \"2:3\", children: \"2:3\" })] }), _jsxs(\"div\", { className: \"dsh-ig-studio-search-wrap\", children: [_jsx(Search, { className: \"dsh-ig-studio-search-icon\", size: 14 }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-studio-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(\"label\", { className: \"dsh-ig-workspace-filter-label\", title: t('filterCurrentWorkspaceHint'), children: [_jsx(\"input\", { type: \"checkbox\", className: \"dsh-ig-workspace-checkbox\", checked: onlyCurrentWorkspace, onChange: (e) => setOnlyCurrentWorkspace(e.target.checked) }), _jsx(\"span\", { className: \"dsh-ig-workspace-filter-text\", children: t('filterCurrentWorkspace') }), _jsxs(\"span\", { className: \"dsh-ig-workspace-filter-badge\", children: [workspaceItemsCount, \"/\", items.length] })] })] }), _jsxs(\"div\", { className: \"dsh-ig-studio-toolbar-right\", children: [_jsxs(\"select\", { className: \"dsh-ig-studio-select dsh-ig-studio-select-sort\", value: sortBy, onChange: (e) => setSortBy(e.target.value), children: [_jsx(\"option\", { value: \"newest\", children: t('sortNewest') }), _jsx(\"option\", { value: \"oldest\", children: t('sortOldest') })] }), _jsxs(\"button\", { type: \"button\", className: `dsh-ig-studio-btn dsh-ig-studio-btn-danger ${isManageMode ? 'is-active' : ''}`, title: isManageMode ? t('exitManage') : t('manage'), onClick: () => {\n if (isManageMode) {\n handleExitManage();\n }\n else {\n setIsManageMode(true);\n }\n }, children: [_jsx(Trash2, { size: 13 }), _jsx(\"span\", { children: isManageMode ? t('exitManage') : t('manage') })] })] })] })), _jsx(\"div\", { className: `dsh-ig-gallery-page-body ${activeTab === 'studio' ? 'is-workbench' : ''}`, children: activeTab === 'gallery' || activeTab === 'favorites' ? (items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : activeTab === 'favorites' && filteredItems.length === 0 && search === '' && selectedProvider === 'all' && selectedRatio === 'all' ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83E\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('favEmptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('favEmptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item, idx) => (_jsx(GalleryCard, { item: item, index: idx, isManageMode: isManageMode, isSelected: selectedIds.has(item.id), t: t, onClick: (e, blob) => handleCardClick(item, idx, e, blob), onToggleSelect: (e) => handleToggleSelect(item.id, idx, e), onRequestDelete: () => requestSingleDelete(item), onPreview: (blob) => openPreviewItem(item, blob), onBlobLoaded: (b) => blobCache.set(item.id, b), onToast: showToast }, item.id))) }))) : (_jsx(StudioView, { locale: locale, workspace: activeWorkspace })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), (isManageMode || selectedIds.size > 0) && (_jsxs(\"div\", { className: \"dsh-ig-batch-bar\", children: [_jsxs(\"div\", { className: \"dsh-ig-batch-bar-left\", children: [_jsx(\"span\", { className: \"dsh-ig-batch-counter\", children: t('selectedCount', { n: String(selectedIds.size) }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleSelectAll, children: t('selectAll') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleInvertSelect, children: t('invertSelect') }), selectedIds.size > 0 && (_jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn\", onClick: handleClearSelect, children: t('clearSelect') }))] }), _jsxs(\"div\", { className: \"dsh-ig-batch-bar-right\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn dsh-ig-batch-btn-danger\", disabled: selectedIds.size === 0, onClick: () => setShowDeleteModal(true), children: [_jsx(Trash2, { size: 13 }), _jsxs(\"span\", { children: [t('batchDelete'), selectedIds.size > 0 ? ` (${selectedIds.size})` : ''] })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-batch-btn dsh-ig-batch-btn-exit\", onClick: handleExitManage, children: t('exitManage') })] })] })), showDeleteModal && (_jsx(\"div\", { className: \"dsh-ig-modal-backdrop\", onClick: () => {\n if (!isDeleting) {\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }\n }, children: _jsxs(\"div\", { className: \"dsh-ig-modal-box\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-modal-header\", children: [_jsx(\"div\", { className: \"dsh-ig-modal-icon-danger\", children: _jsx(AlertTriangle, { size: 20 }) }), _jsx(\"div\", { className: \"dsh-ig-modal-title\", children: selectedIds.size === 1\n ? t('batchDeleteTitleSingle')\n : t('batchDeleteTitle', { count: String(selectedIds.size) }) })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-body\", children: [_jsx(\"p\", { className: \"dsh-ig-modal-desc\", children: t('batchDeleteDesc') }), hasWorkspaceFilesToDelete && (_jsxs(\"label\", { className: \"dsh-ig-modal-checkbox-label\", children: [_jsx(\"input\", { type: \"checkbox\", checked: deleteWorkspaceFiles, onChange: (e) => setDeleteWorkspaceFiles(e.target.checked), disabled: isDeleting }), _jsx(\"span\", { children: t('deleteWorkspaceFilesOpt') })] }))] }), _jsxs(\"div\", { className: \"dsh-ig-modal-footer\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-cancel\", onClick: () => {\n setShowDeleteModal(false);\n if (!isManageMode)\n setSelectedIds(new Set());\n }, disabled: isDeleting, children: t('cancel') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-danger\", onClick: handleConfirmBatchDelete, disabled: isDeleting, children: isDeleting\n ? '...'\n : selectedIds.size === 1\n ? t('confirmDeleteSingle')\n : t('confirmBatchDelete', { count: String(selectedIds.size) }) })] })] }) })), showRegenerateModal && previewItem && (_jsx(\"div\", { className: \"dsh-ig-modal-backdrop\", onClick: handleCancelRegeneratePrompt, children: _jsxs(\"div\", { className: \"dsh-ig-modal-box dsh-ig-regenerate-modal-box\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-modal-header\", children: [_jsx(\"div\", { className: \"dsh-ig-regenerate-modal-icon\", children: _jsx(Sparkles, { size: 18 }) }), _jsxs(\"div\", { className: \"dsh-ig-regenerate-modal-title-wrap\", children: [_jsx(\"div\", { className: \"dsh-ig-modal-title\", children: t('regenerateTitle') }), _jsxs(\"div\", { className: \"dsh-ig-regenerate-modal-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 }), _jsx(\"span\", { className: \"dsh-ig-tag\", children: formatCardMeta(previewItem) })] })] })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-body\", children: [_jsx(\"p\", { className: \"dsh-ig-modal-desc\", children: t('regenerateHint') }), _jsx(\"textarea\", { className: \"dsh-ig-regenerate-modal-textarea\", value: regeneratePrompt, onChange: (e) => setRegeneratePrompt(e.target.value), placeholder: t('prompt'), rows: 4, autoFocus: true })] }), _jsxs(\"div\", { className: \"dsh-ig-modal-footer\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-cancel\", onClick: handleCancelRegeneratePrompt, children: t('cancel') }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-modal-btn dsh-ig-modal-btn-primary\", onClick: handleConfirmRegenerate, disabled: regeneratePrompt.trim().length === 0, children: [_jsx(Sparkles, { size: 14 }), _jsx(\"span\", { children: t('confirmRegenerate') })] })] })] }) })), previewItem && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: handleClosePreview, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null, currentPreviewIndex >= 0 && (_jsxs(\"span\", { className: \"dsh-ig-lightbox-counter\", children: [currentPreviewIndex + 1, \" / \", filteredItems.length] }))] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: handleClosePreview, children: _jsx(X, { size: 18 }) })] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav-btn dsh-ig-lightbox-nav-prev\", title: t('prevImage'), disabled: !hasPrev, onClick: (e) => {\n e.stopPropagation();\n goToPrev();\n }, children: _jsx(ChevronLeft, { size: 24 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-nav-btn dsh-ig-lightbox-nav-next\", title: t('nextImage'), disabled: !hasNext, onClick: (e) => {\n e.stopPropagation();\n goToNext();\n }, children: _jsx(ChevronRight, { size: 24 }) }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: previewLoading ? (_jsx(\"div\", { className: \"dsh-ig-lightbox-loading\", children: _jsx(\"div\", { className: \"dsh-ig-lightbox-spinner\" }) })) : previewUrl ? (_jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt })) : null }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsx(FileText, { size: 14 }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsx(Copy, { size: 14 }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n if (!previewUrl)\n return;\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsx(Download, { size: 14 }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-regenerate\", title: t('regenerate'), disabled: isRegenerating, onClick: handleOpenRegenerate, children: [_jsx(Sparkles, { size: 14 }), _jsx(\"span\", { children: t('regenerate') })] }), isRegenerating && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-generating-indicator\", children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-spinner-sm\" }), _jsx(\"span\", { children: t('regenerating') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-abort-btn\", onClick: handleAbortRegenerating, children: t('cancel') })] })), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: () => {\n if (previewItem) {\n requestSingleDelete(previewItem);\n }\n }, children: [_jsx(Trash2, { size: 14 }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, index: _index, isManageMode, isSelected, t, onClick, onToggleSelect, onRequestDelete, onPreview: _onPreview, onBlobLoaded, onToast, }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n onBlobLoaded?.(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const toggleFavorite = async (e) => {\n e.stopPropagation();\n const nextStatus = await toggleFavoriteGalleryItem(item.id);\n onToast(nextStatus ? t('favoriteAdded') : t('favoriteRemoved'));\n };\n // Label for top badge: show model or fallback to provider\n const badgeLabel = item.model || item.provider;\n return (_jsxs(\"div\", { className: `dsh-ig-gallery-card ${isSelected ? 'is-selected' : ''} ${isManageMode ? 'is-manage-mode' : ''}`, onClick: (e) => onClick(e, blob), children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [_jsx(\"button\", { type: \"button\", className: `dsh-ig-card-checkbox ${isSelected ? 'is-checked' : ''}`, title: isSelected ? t('clearSelect') : t('manage'), onClick: onToggleSelect, children: isSelected && _jsx(Check, { size: 11, strokeWidth: 3 }) }), loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsx(Copy, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsx(Download, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsx(FileText, { size: 13 }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: (e) => {\n e.stopPropagation();\n onRequestDelete();\n }, children: _jsx(Trash2, { size: 13 }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsx(\"div\", { className: \"dsh-ig-card-badge-row\", children: _jsx(\"span\", { className: \"dsh-ig-card-badge\", title: badgeLabel, children: badgeLabel }) }), _jsx(\"div\", { className: \"dsh-ig-gallery-card-prompt-line\", title: item.prompt, children: item.prompt }), _jsxs(\"div\", { className: \"dsh-ig-card-footer-row\", children: [_jsxs(\"span\", { className: \"dsh-ig-card-meta-text\", children: [formatCardMeta(item), \" | \", formatRelativeTime(item.createdAt, t)] }), _jsx(\"button\", { type: \"button\", className: `dsh-ig-card-fav-btn ${item.isFavorite ? 'is-favorited' : ''}`, title: item.isFavorite ? t('favoriteRemoved') : t('favoriteAdded'), onClick: (e) => {\n void toggleFavorite(e);\n }, children: _jsx(Heart, { size: 15, fill: item.isFavorite ? 'currentColor' : 'none' }) })] })] })] }));\n};\nconst PlaceholderView = ({ icon, title, description, tip, badge, }) => {\n return (_jsx(\"div\", { className: \"dsh-ig-placeholder-view\", children: _jsxs(\"div\", { className: \"dsh-ig-placeholder-card\", children: [_jsx(\"div\", { className: \"dsh-ig-placeholder-icon\", children: icon }), _jsxs(\"div\", { className: \"dsh-ig-placeholder-header\", children: [_jsx(\"h2\", { className: \"dsh-ig-placeholder-title\", children: title }), badge && _jsx(\"span\", { className: \"dsh-ig-placeholder-badge\", children: badge })] }), _jsx(\"p\", { className: \"dsh-ig-placeholder-desc\", children: description }), tip && _jsx(\"div\", { className: \"dsh-ig-placeholder-tip\", children: tip })] }) }));\n};\nexport { copyImageBlob } from './browser-image-utils.js';\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 STUDIO_STYLE = `\n.dsh-ig-gallery-page-body.is-workbench{flex:1 1 0;height:100%;min-height:0;padding:0;overflow:hidden;display:flex;flex-direction:column}\n.dsh-ig-workbench{--ig-blue:#2f64f5;--ig-line:color-mix(in srgb,currentColor 11%,transparent);--ig-soft:color-mix(in srgb,currentColor 4%,transparent);position:relative;display:flex;flex-direction:column;min-height:0;height:100%;overflow:hidden;padding:10px 12px 12px;color:var(--foreground,#182033);box-sizing:border-box;background:radial-gradient(circle at 60% -20%,rgba(63,104,246,.07),transparent 30%)}\n.dsh-ig-workbench *{box-sizing:border-box}.dsh-ig-workbench button,.dsh-ig-workbench select,.dsh-ig-workbench textarea{font:inherit;color:inherit}\n.dsh-ig-workbench-grid{display:grid;grid-template-columns:minmax(190px,238px) minmax(0,1fr) minmax(286px,340px);grid-template-rows:minmax(0,1fr);min-height:0;height:0;flex:1 1 0;border:1px solid var(--ig-line);border-radius:12px;overflow:hidden;background:var(--background,#fff);box-shadow:0 12px 32px rgba(30,42,76,.05);transition:grid-template-columns .2s ease}\n.dsh-ig-workbench-grid.is-sidebar-collapsed{grid-template-columns:minmax(0,1fr) minmax(286px,340px)}\n.dsh-ig-recent-panel,.dsh-ig-generate-panel{min-width:0;min-height:0;overflow:hidden;background:color-mix(in srgb,var(--background,#fff) 96%,#f5f7fb)}.dsh-ig-recent-panel{display:flex;flex-direction:column;border-right:1px solid var(--ig-line)}\n.dsh-ig-panel-title{height:48px;flex:0 0 48px;padding:0 12px 0 14px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--ig-line);font-size:13px;font-weight:650}\n.dsh-ig-count-badge{font-size:11px;min-width:22px;text-align:center;padding:2px 6px;border-radius:999px;background:var(--ig-soft);color:#7b8498;font-weight:500}\n.dsh-ig-collapse-btn{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:6px;background:transparent;color:#717b90;cursor:pointer;transition:all .15s}\n.dsh-ig-collapse-btn:hover{border-color:var(--ig-line);background:var(--ig-soft);color:var(--foreground,#182033)}\n.dsh-ig-recent-scroll{flex:1 1 0;height:0;padding:8px;overflow-x:hidden;overflow-y:auto;min-height:0}.dsh-ig-recent-empty{min-height:180px;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:10px;color:#929bad;text-align:center;font-size:12px}\n.dsh-ig-recent-item{display:grid;grid-template-columns:70px minmax(0,1fr);gap:10px;width:100%;padding:8px;border:1px solid transparent;border-radius:9px;background:transparent;text-align:left;cursor:pointer;transition:background .16s,border-color .16s,transform .16s}.dsh-ig-recent-item:hover{background:var(--ig-soft);transform:translateY(-1px)}.dsh-ig-recent-item.is-active{border-color:#89a7ff;background:rgba(47,100,245,.075);box-shadow:inset 3px 0 0 var(--ig-blue)}.dsh-ig-recent-thumb{width:70px;height:70px;border-radius:7px;display:flex;align-items:center;justify-content:center;overflow:hidden;background:#eef1f7;color:#929bad}.dsh-ig-recent-thumb img{width:100%;height:100%;object-fit:cover}.dsh-ig-recent-item>div:last-child{min-width:0;padding:1px 0}.dsh-ig-recent-item strong{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:12.5px;line-height:19px;font-weight:630}.dsh-ig-recent-item span,.dsh-ig-recent-item small{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:#828b9e;font-size:10.5px;line-height:16px}\n.dsh-ig-load-more{width:100%;height:32px;margin:8px 0;display:flex;align-items:center;justify-content:center;border:1px dashed var(--ig-line);border-radius:7px;background:transparent;font-size:11px;color:#6b758b;cursor:pointer;transition:background .15s,color .15s}.dsh-ig-load-more:hover{background:var(--ig-soft);color:var(--ig-blue);border-color:#a2b9f6}\n.dsh-ig-mini-btn{height:22px;padding:0 7px;display:inline-flex;align-items:center;gap:3px;border:1px solid var(--ig-line);border-radius:5px;background:var(--background,#fff);font-size:10.5px;font-weight:500;color:var(--foreground,#242f44);cursor:pointer;transition:all .15s}.dsh-ig-mini-btn:hover{border-color:#9bb4f5;color:var(--ig-blue);background:rgba(47,100,245,.06)}\n.dsh-ig-canvas-column{min-width:0;min-height:0;height:100%;overflow:hidden;display:flex;flex-direction:column;background:color-mix(in srgb,var(--background,#fff) 97%,#e8edf7)}\n.dsh-ig-canvas-toolbar{height:46px;flex:0 0 46px;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 14px;border-bottom:1px solid var(--ig-line)}\n.dsh-ig-canvas-toolbar-left,.dsh-ig-canvas-toolbar-right{display:flex;align-items:center;gap:6px}\n.dsh-ig-canvas-toolbar button{height:30px;min-width:30px;padding:0 9px;display:inline-flex;align-items:center;justify-content:center;gap:5px;border:1px solid var(--ig-line);border-radius:7px;background:var(--background,#fff);color:var(--foreground,#242f44);font-size:11.5px;font-weight:500;cursor:pointer;transition:border-color .15s,background .15s,color .15s}\n.dsh-ig-canvas-toolbar button:hover{border-color:#9bb4f5;background:rgba(47,100,245,.05);color:var(--ig-blue)}\n.dsh-ig-canvas-toolbar button.is-active{border-color:#8ba8f8;background:rgba(47,100,245,.08);color:var(--ig-blue);font-weight:550}\n.dsh-ig-zoom-display{font-size:11px;min-width:38px;text-align:center;color:#64748b;user-select:none;font-variant-numeric:tabular-nums}\n.dsh-ig-status-badge-wrap{position:relative;display:inline-flex;align-items:center}\n.dsh-ig-status-badge{height:30px;display:inline-flex;align-items:center;gap:7px;padding:0 10px;border:1px solid var(--ig-line);border-radius:7px;background:var(--background,#fff);cursor:pointer;user-select:none;transition:border-color .15s,background .15s,box-shadow .15s}\n.dsh-ig-status-badge:hover{border-color:#9bb4f5;background:rgba(47,100,245,.04)}\n.dsh-ig-status-dot{width:7px;height:7px;min-width:7px;max-width:7px;border-radius:50%;flex-shrink:0;box-sizing:border-box}\n.dsh-ig-status-dot.is-ready{background:#10b981;box-shadow:0 0 0 2px rgba(16,185,129,.2)}\n.dsh-ig-status-dot.is-muted{background:#ef4444;box-shadow:0 0 0 2px rgba(239,68,68,.2)}\n.dsh-ig-status-text{font-size:11.5px;font-weight:500;color:var(--foreground,#242f44);line-height:1}\n.dsh-ig-status-arrow{color:#94a3b8;transition:transform .15s,color .15s}\n.dsh-ig-status-badge-wrap:hover .dsh-ig-status-arrow{transform:rotate(180deg);color:var(--ig-blue)}\n.dsh-ig-status-popover{position:absolute;left:0;top:calc(100% + 6px);width:260px;background:var(--background,#fff);border:1px solid var(--ig-line);border-radius:9px;box-shadow:0 12px 36px rgba(20,28,45,.14);padding:10px 12px;z-index:40;opacity:0;pointer-events:none;transform:translateY(4px);transition:opacity .15s cubic-bezier(.16,1,.3,1),transform .15s cubic-bezier(.16,1,.3,1)}\n.dsh-ig-status-badge-wrap:hover .dsh-ig-status-popover{opacity:1;pointer-events:auto;transform:translateY(0)}\n.dsh-ig-status-popover-title{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:650;color:#8590a6;margin-bottom:8px;letter-spacing:.02em;text-transform:uppercase}\n.dsh-ig-status-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}\n.dsh-ig-status-list li{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-radius:6px;transition:background .12s}\n.dsh-ig-status-list li.is-configured{background:rgba(16,185,129,.05);border:1px solid rgba(16,185,129,.12)}\n.dsh-ig-status-list li.is-missing{background:rgba(239,68,68,.04);border:1px solid rgba(239,68,68,.12);opacity:.75}\n.dsh-ig-status-item-name{display:flex;flex-direction:column;min-width:0}\n.dsh-ig-status-item-name strong{font-size:11.5px;font-weight:600;color:var(--foreground,#182033);line-height:16px}\n.dsh-ig-status-item-name small{font-size:9.5px;color:#7c869a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:145px;line-height:14px}\n.dsh-ig-status-item-tag{font-size:10px;font-weight:600;padding:2px 6px;border-radius:4px;flex-shrink:0}\n.is-configured .dsh-ig-status-item-tag{color:#059669;background:rgba(16,185,129,.14)}\n.is-missing .dsh-ig-status-item-tag{color:#dc2626;background:rgba(239,68,68,.14)}\n.dsh-ig-canvas{position:relative;flex:1 1 0;height:0;min-height:0;display:flex;align-items:center;justify-content:center;overflow:hidden;padding:24px;touch-action:none;user-select:none;cursor:grab;background-image:linear-gradient(45deg,rgba(114,128,156,.035) 25%,transparent 25%),linear-gradient(-45deg,rgba(114,128,156,.035) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(114,128,156,.035) 75%),linear-gradient(-45deg,transparent 75%,rgba(114,128,156,.035) 75%);background-size:24px 24px;background-position:0 0,0 12px,12px -12px,-12px 0}\n.dsh-ig-canvas.is-dragging,.dsh-ig-canvas.is-dragging *{cursor:grabbing!important}\n.dsh-ig-canvas img{display:block;max-width:100%;max-height:100%;width:auto;height:auto;border-radius:10px;box-shadow:0 14px 45px rgba(25,35,63,.18);user-select:none;-webkit-user-drag:none;pointer-events:auto}\n.dsh-ig-canvas-empty,.dsh-ig-generating-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:12px;color:#929bad;font-size:12px;padding:26px;cursor:default}\n.dsh-ig-generating-state strong{font-size:15px;color:var(--foreground,#182033)}.dsh-ig-generating-state span{font-size:11px}.dsh-ig-generation-orbit{width:66px;height:66px;border-radius:50%;display:grid;place-items:center;color:var(--ig-blue);background:rgba(47,100,245,.09);box-shadow:0 0 0 10px rgba(47,100,245,.035);animation:dshIgPulse 1.8s ease-in-out infinite}\n.dsh-ig-result-strip{flex:0 0 auto;min-height:52px;padding:8px 14px;display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--ig-line)}.dsh-ig-result-strip>span{font-size:12px;font-weight:650}.dsh-ig-result-strip>div,.dsh-ig-result-actions>div{display:flex;gap:7px}.dsh-ig-result-strip button,.dsh-ig-result-actions button{height:32px;display:inline-flex;align-items:center;gap:6px;padding:0 10px;border:1px solid var(--ig-line);border-radius:7px;background:var(--background,#fff);font-size:11px;cursor:pointer}.dsh-ig-result-strip button:hover,.dsh-ig-result-actions button:hover{border-color:#9fb2ed;color:var(--ig-blue)}.dsh-ig-result-actions{flex:0 0 auto;min-height:54px;padding:8px 14px;display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--ig-line)}.dsh-ig-result-actions p{margin:0;min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:11.5px;line-height:18px;color:#596277}.dsh-ig-result-meta{flex:0 0 auto;min-height:32px;padding:6px 14px;display:flex;gap:13px;align-items:center;flex-wrap:wrap;border-top:1px solid var(--ig-line);font-size:10px;color:#8790a3}.dsh-ig-result-meta span+span:before{content:'·';margin-right:13px}\n.dsh-ig-generate-panel{height:100%;display:flex;flex-direction:column;border-left:1px solid var(--ig-line);overflow:hidden}.dsh-ig-panel-tabs{height:48px;flex:0 0 48px;display:grid;grid-template-columns:1fr 1fr;border-bottom:1px solid var(--ig-line);padding:0 14px}.dsh-ig-panel-tabs button{position:relative;border:0;background:transparent;font-size:12px;color:#7c8598;cursor:pointer}.dsh-ig-panel-tabs button.is-active{color:var(--ig-blue);font-weight:650}.dsh-ig-panel-tabs button.is-active:after{content:'';position:absolute;left:20%;right:20%;bottom:-1px;height:2px;background:var(--ig-blue);border-radius:2px 2px 0 0}.dsh-ig-generator-form{flex:1 1 0;height:0;padding:15px;display:flex;flex-direction:column;gap:15px;overflow-x:hidden;overflow-y:auto;min-height:0}.dsh-ig-mode-switch{display:grid;grid-template-columns:1fr 1fr;gap:8px}.dsh-ig-mode-switch button{height:39px;border:1px solid var(--ig-line);border-radius:8px;background:var(--background,#fff);display:flex;align-items:center;justify-content:center;gap:7px;font-size:12px;cursor:pointer}.dsh-ig-mode-switch button.is-active{border-color:#789bff;color:var(--ig-blue);background:rgba(47,100,245,.065);box-shadow:inset 0 0 0 1px rgba(47,100,245,.1)}\n.dsh-ig-field{position:relative;display:flex;flex-direction:column;gap:7px}.dsh-ig-field>label,.dsh-ig-field-label label{font-size:11.5px;font-weight:630}.dsh-ig-field>label span{font-weight:400;color:#929bad}.dsh-ig-field-label{display:flex;align-items:center;justify-content:space-between}.dsh-ig-field-label b{color:#e14d4d}.dsh-ig-field-label button{border:0;background:transparent;color:#798397;font-size:10.5px;cursor:pointer}.dsh-ig-field textarea{width:100%;height:112px;padding:11px 12px 22px;resize:vertical;border:1px solid var(--ig-line);border-radius:9px;background:var(--background,#fff);font-size:12px;line-height:19px;outline:none}.dsh-ig-field textarea:focus{border-color:var(--ig-blue);box-shadow:0 0 0 3px rgba(47,100,245,.09)}.dsh-ig-field>small{position:absolute;right:9px;bottom:7px;color:#9aa2b2;font-size:9.5px}.dsh-ig-field-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px}.dsh-ig-field-select{display:flex;flex-direction:column;gap:6px;min-width:0}.dsh-ig-field-select>span{font-size:11px;font-weight:620}.dsh-ig-field-select select{width:100%;height:36px;padding:0 26px 0 9px;border:1px solid var(--ig-line);border-radius:8px;background:var(--background,#fff);font-size:11px;outline:none;text-overflow:ellipsis}.dsh-ig-field-select select:focus{border-color:var(--ig-blue)}.dsh-ig-count-row{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.dsh-ig-count-pill{height:34px;border:1px solid var(--ig-line);border-radius:7px;background:var(--background,#fff);font-size:12px;font-weight:600;color:#596277;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s}.dsh-ig-count-pill:hover{border-color:#9fb2ed;color:var(--ig-blue)}.dsh-ig-count-pill.is-active{border-color:var(--ig-blue);background:rgba(47,100,245,.08);color:var(--ig-blue);box-shadow:inset 0 0 0 1px var(--ig-blue)}\n.dsh-ig-upload{height:92px;border:1px dashed #bcc6d9;border-radius:9px;background:rgba(255,255,255,.45);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:#7d879b;cursor:pointer}.dsh-ig-upload strong{font-size:11px;font-weight:570}.dsh-ig-upload small{font-size:9.5px}.dsh-ig-upload:hover,.dsh-ig-upload.is-dragging{border-color:var(--ig-blue);background:rgba(47,100,245,.05);color:var(--ig-blue)}\n.dsh-ig-reference-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(64px,1fr));gap:8px}\n.dsh-ig-reference-card{position:relative;aspect-ratio:1;border-radius:8px;overflow:hidden;background:#eef1f7;border:1px solid var(--ig-line)}\n.dsh-ig-reference-card img{width:100%;height:100%;object-fit:cover}\n.dsh-ig-reference-card button{position:absolute;right:4px;top:4px;width:18px;height:18px;border:0;border-radius:50%;display:grid;place-items:center;background:rgba(20,28,45,.75);color:#fff;cursor:pointer;padding:0;transition:background .15s}\n.dsh-ig-reference-card button:hover{background:#ef4444}\n.dsh-ig-reference-add{aspect-ratio:1;border:1px dashed #bcc6d9;border-radius:8px;background:rgba(255,255,255,.45);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;color:#7d879b;cursor:pointer;font-size:10px;transition:border-color .15s,color .15s,background .15s}\n.dsh-ig-reference-add:hover{border-color:var(--ig-blue);background:rgba(47,100,245,.05);color:var(--ig-blue)}\n.dsh-ig-reference-preview{position:relative;height:108px;border-radius:9px;overflow:hidden;background:#eef1f7}.dsh-ig-reference-preview img{width:100%;height:100%;object-fit:contain}.dsh-ig-reference-preview button{position:absolute;right:7px;top:7px;width:25px;height:25px;border:0;border-radius:50%;display:grid;place-items:center;background:rgba(20,28,45,.72);color:#fff;cursor:pointer}\n.dsh-ig-inline-note,.dsh-ig-form-error{padding:9px 10px;border-radius:7px;font-size:10.5px;line-height:16px}.dsh-ig-inline-note{background:#fff8e7;color:#8b671c;border:1px solid #f1dfae}.dsh-ig-form-error{background:#fff1f1;color:#b63737;border:1px solid #f2caca}.dsh-ig-form-loading{height:70px;display:grid;place-items:center;color:var(--ig-blue)}\n.dsh-ig-config-error{padding:14px;display:flex;flex-direction:column;align-items:center;gap:10px;background:#fff1f1;border:1px solid #f2caca;border-radius:8px;color:#b63737;font-size:11.5px;text-align:center}.dsh-ig-config-error p{margin:0;line-height:17px}.dsh-ig-config-error button{height:30px;display:inline-flex;align-items:center;gap:6px;padding:0 12px;border:1px solid #e0a8a8;border-radius:6px;background:#fff;color:#b63737;font-size:11.5px;font-weight:600;cursor:pointer}.dsh-ig-config-error button:hover{background:#ffebeb}\n.dsh-ig-generate-button{height:42px;flex:0 0 auto;border:0;border-radius:8px;background:linear-gradient(135deg,#386cf6,#2758e7);color:#fff!important;display:flex;align-items:center;justify-content:center;gap:8px;font-size:12px;font-weight:650;cursor:pointer;box-shadow:0 8px 18px rgba(47,100,245,.22);transition:transform .16s,box-shadow .16s}.dsh-ig-generate-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 10px 24px rgba(47,100,245,.28)}.dsh-ig-generate-button:disabled{opacity:.55;cursor:not-allowed;box-shadow:none}\n.dsh-ig-generate-button.is-cancel{background:linear-gradient(135deg,#ef4444,#dc2626);box-shadow:0 8px 18px rgba(239,68,68,.25)}.dsh-ig-generate-button.is-cancel:hover{background:linear-gradient(135deg,#dc2626,#b91c1c);box-shadow:0 10px 24px rgba(239,68,68,.35)}\n.dsh-ig-details{padding:16px;margin:0;overflow:auto}.dsh-ig-details>div{padding:12px 0;border-bottom:1px solid var(--ig-line)}.dsh-ig-details dt{font-size:10.5px;color:#8992a4;margin-bottom:5px}.dsh-ig-details dd{margin:0;font-size:11.5px;line-height:18px;word-break:break-word}.dsh-ig-details-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;height:220px;padding:20px;color:#929bad;font-size:11px;text-align:center}\n.dsh-ig-workbench-modal-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.45);backdrop-filter:blur(3px);z-index:999;display:grid;place-items:center;padding:16px}\n.dsh-ig-workbench-modal-box{width:100%;max-width:380px;background:var(--background,#fff);border-radius:12px;padding:20px;box-shadow:0 20px 48px rgba(0,0,0,.22);display:flex;flex-direction:column;gap:14px}\n.dsh-ig-workbench-modal-header{display:flex;align-items:center;gap:10px}\n.dsh-ig-workbench-modal-header strong{font-size:14px;font-weight:650;color:#b91c1c}\n.dsh-ig-workbench-modal-desc{font-size:12px;line-height:18px;color:#555f77;margin:0}\n.dsh-ig-workbench-modal-option{display:flex;align-items:center;gap:8px;font-size:11.5px;color:#4b5563;cursor:pointer}\n.dsh-ig-workbench-modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}\n.dsh-ig-workbench-modal-actions button{height:32px;padding:0 14px;border-radius:7px;font-size:11.5px;font-weight:600;cursor:pointer}\n.dsh-ig-workbench-modal-cancel{border:1px solid var(--ig-line);background:var(--background,#fff);color:#6b7280}\n.dsh-ig-workbench-modal-cancel:hover{background:#f3f4f6}\n.dsh-ig-workbench-modal-danger{border:0;background:#dc2626;color:#fff}\n.dsh-ig-workbench-modal-danger:hover{background:#b91c1c}\n@keyframes dshIgPulse{50%{transform:scale(1.06);box-shadow:0 0 0 16px rgba(47,100,245,.025)}}\n.dsh-ig-workbench-toast{position:fixed;bottom:28px;left:50%;transform:translateX(-50%);background:rgba(15,23,42,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#fff;padding:8px 18px;border-radius:10px;font-size:12.5px;font-weight:500;box-shadow:0 12px 32px rgba(0,0,0,0.3);z-index:99999;animation:dshIgFade .15s ease-out;pointer-events:none}\n@keyframes dshIgFade{from{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%,0)}}\n@media(max-width:1120px){.dsh-ig-workbench-grid{grid-template-columns:190px minmax(360px,1fr) 300px}.dsh-ig-result-actions button span{display:none}}\n@media(max-width:900px){.dsh-ig-gallery-page-body.is-workbench{height:auto;overflow:auto}.dsh-ig-workbench{height:auto;min-height:100%;overflow:visible;padding:12px}.dsh-ig-workbench-heading{height:auto;padding-bottom:12px;align-items:center}.dsh-ig-provider-quick>span{display:none}.dsh-ig-workbench-grid{height:auto;display:flex;flex:none;flex-direction:column;overflow:visible}.dsh-ig-recent-panel{height:auto;overflow:hidden;border-right:0;border-bottom:1px solid var(--ig-line)}.dsh-ig-recent-scroll{height:auto;display:flex;overflow-x:auto;overflow-y:hidden;padding:8px}.dsh-ig-recent-item{min-width:220px}.dsh-ig-canvas-column{height:auto;min-height:560px}.dsh-ig-generate-panel{height:auto;border-left:0;border-top:1px solid var(--ig-line);min-height:560px}.dsh-ig-generator-form{height:auto;overflow:visible}.dsh-ig-canvas{height:auto;min-height:360px}}\n@media(max-width:560px){.dsh-ig-workbench-heading>div{display:block}.dsh-ig-workbench-heading h1{font-size:15px}.dsh-ig-provider-quick select{min-width:128px;max-width:150px}.dsh-ig-canvas{padding:12px;min-height:300px}.dsh-ig-result-strip,.dsh-ig-result-actions{align-items:flex-start;flex-direction:column}.dsh-ig-result-strip>div,.dsh-ig-result-actions>div{width:100%}.dsh-ig-result-strip button,.dsh-ig-result-actions button{flex:1;justify-content:center}.dsh-ig-result-actions button span{display:inline}.dsh-ig-field-grid{grid-template-columns:1fr}.dsh-ig-result-meta span+span:before{display:none}}\n@media(prefers-reduced-motion:reduce){.dsh-ig-workbench *{scroll-behavior:auto!important;animation-duration:.01ms!important;transition-duration:.01ms!important}}\n.dsh-ig-workspace-filter-label{height:30px;display:inline-flex;align-items:center;gap:6px;padding:0 10px;border:1px solid var(--ig-line,rgba(0,0,0,.1));border-radius:7px;background:var(--background,#fff);font-size:11.5px;color:var(--foreground,#242f44);cursor:pointer;user-select:none;transition:border-color .15s,background .15s}\n.dsh-ig-workspace-filter-label:hover{border-color:#9bb4f5;background:rgba(47,100,245,.04)}\n.dsh-ig-workspace-checkbox{cursor:pointer;accent-color:#2f64f5;width:13.5px;height:13.5px;margin:0}\n.dsh-ig-workspace-filter-text{font-weight:500;white-space:nowrap}\n.dsh-ig-workspace-filter-badge{font-size:10px;font-weight:600;padding:1px 6px;border-radius:999px;background:color-mix(in srgb,currentColor 7%,transparent);color:#64748b;font-variant-numeric:tabular-nums}\n.dsh-ig-canvas-cluster{display:grid;gap:16px;align-items:center;justify-content:center;user-select:none;pointer-events:auto;flex-shrink:0}\n.dsh-ig-canvas-cluster[data-count=\"2\"]{grid-template-columns:repeat(2,1fr);max-width:880px}\n.dsh-ig-canvas-cluster[data-count=\"3\"],.dsh-ig-canvas-cluster[data-count=\"4\"]{grid-template-columns:repeat(2,1fr);max-width:760px}\n.dsh-ig-canvas-item{position:relative;display:flex;align-items:center;justify-content:center;border-radius:10px;cursor:pointer;transition:transform .12s ease-out}\n.dsh-ig-canvas-item img{display:block;max-width:100%;max-height:360px;width:auto;height:auto;object-fit:contain;border-radius:10px;box-shadow:0 10px 30px rgba(25,35,63,.16);user-select:none;-webkit-user-drag:none;pointer-events:auto;transition:box-shadow .15s,outline .15s}\n.dsh-ig-canvas-item:hover img{box-shadow:0 14px 40px rgba(47,100,245,.2)}\n.dsh-ig-canvas-item.is-selected img{outline:3px solid var(--ig-blue);outline-offset:2px;box-shadow:0 14px 40px rgba(47,100,245,.35)}\n.dsh-ig-canvas-badge{position:absolute;top:10px;left:10px;background:rgba(15,23,42,.7);color:#fff;font-size:11px;font-weight:700;padding:2px 7px;border-radius:5px;backdrop-filter:blur(4px);pointer-events:none;transition:background .15s;z-index:2}\n.dsh-ig-canvas-item.is-selected .dsh-ig-canvas-badge{background:var(--ig-blue)}\n.dsh-ig-canvas-item-loading{width:260px;height:260px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.45);border:1px solid var(--ig-line);border-radius:10px;color:#929bad}\n.dsh-ig-lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);width:42px;height:42px;border-radius:50%;border:0;background:rgba(15,23,42,.65);color:#fff;display:grid;place-items:center;cursor:pointer;transition:background .15s,transform .15s;z-index:10;backdrop-filter:blur(4px)}\n.dsh-ig-lightbox-nav:hover{background:rgba(47,100,245,.85);transform:translateY(-50%) scale(1.08)}\n.dsh-ig-lightbox-nav.is-prev{left:18px}\n.dsh-ig-lightbox-nav.is-next{right:18px}\n.dsh-ig-save-gallery-btn{color:var(--ig-blue)!important;border-color:rgba(47,100,245,.35)!important;background:rgba(47,100,245,.06)!important}\n.dsh-ig-save-gallery-btn:hover{background:rgba(47,100,245,.12)!important}\n.dsh-ig-save-gallery-btn.is-saved{color:#64748b!important;border-color:var(--ig-line)!important;background:transparent!important}\n`;\n//# sourceMappingURL=studio-style.js.map","export const IMAGE_RESULT_NODE_KIND = 'dsh-image-result';\n/** Default definition: unknown transcript mode falls back to Compact-safe anchoring. */\nexport const imageResultDefinition = createImageResultDefinition();\n/**\n * One image result row per Turn, anchored at its own tool/result position while\n * the Turn runs, then optionally re-anchored beside the final answer once the\n * Turn closes (only needed under the folding Compact transcript view).\n */\nexport function createImageResultDefinition(options = {}) {\n return {\n kind: IMAGE_RESULT_NODE_KIND,\n target: 'chat',\n match: (event) => {\n const turn = eventTurn(event);\n if (turn === undefined)\n return null;\n if (event.type === 'turn/start')\n return { id: String(turn), role: 'start' };\n if (event.type === 'turn/end')\n return { id: String(turn), role: 'update' };\n if (event.type === 'assistant/message')\n return { id: String(turn), role: 'update' };\n if (event.type === 'tool/result' && imageResultFromMeta(event.data.meta) !== undefined) {\n return { id: String(turn), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n const turn = eventTurn(match.event);\n if (match.event.type !== 'turn/start' || turn === undefined) {\n throw new Error('dsh-image-result start requires turn/start');\n }\n return { turn, results: [] };\n },\n update: (context, match) => {\n if (match.event.type === 'turn/end')\n return { ...context.state, endSeq: match.event.seq };\n if (match.event.type === 'assistant/message')\n return { ...context.state, answerSeq: match.event.seq };\n if (match.event.type !== 'tool/result')\n return context.state;\n const result = imageResultFromMeta(match.event.data.meta);\n if (result === undefined)\n return context.state;\n if (context.state.results.some(candidate => candidate.attachment.attachmentId === result.attachment.attachmentId)) {\n return context.state;\n }\n return { ...context.state, results: [...context.state.results, { ...result, seq: match.event.seq }] };\n },\n buildViewNode: (context) => {\n const state = context.state;\n const last = state?.results.at(-1);\n if (state === undefined || last === undefined)\n return null;\n const location = context.matches.at(-1)?.location ?? context.start?.location ?? { kind: 'unresolved' };\n return {\n key: context.key,\n kind: IMAGE_RESULT_NODE_KIND,\n id: context.id,\n target: 'chat',\n // While the Turn is open the artifact stays at its own tool/result\n // position, so later messages in the same Turn order below it. Once the\n // Turn closes, Compact folds every node before the finalized answer\n // boundary, so the artifact re-anchors beside that answer to stay\n // visible; Normal mode has no folding and keeps the natural position.\n // An unknown transcript mode falls back to the Compact-safe behavior.\n anchorSeq: state.endSeq !== undefined && compactTranscript(options)\n ? state.answerSeq ?? state.endSeq ?? last.seq\n : last.seq,\n location,\n visibility: 'visible',\n data: {\n turn: state.turn,\n results: state.results.map(({ seq: _seq, ...result }) => result),\n },\n };\n },\n };\n}\nfunction compactTranscript(options) {\n try {\n return options.isCompactTranscript?.() ?? true;\n }\n catch {\n return true;\n }\n}\n/** Parse the plugin-owned durable presentation metadata from a Tool result event. */\nexport function imageResultFromMeta(value) {\n const meta = record(value);\n if (meta?.kind !== 'dsh-image-gen')\n return undefined;\n const attachment = imageAttachment(meta.attachment);\n if (attachment === undefined)\n return undefined;\n return {\n attachment,\n prompt: stringValue(meta.prompt, 'Generated Image'),\n provider: stringValue(meta.provider, 'google'),\n model: stringValue(meta.model, ''),\n output: stringValue(meta.output, ''),\n ...(typeof meta.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction eventTurn(event) {\n const turn = event.data.turn;\n return typeof turn === 'number' && Number.isSafeInteger(turn) && turn >= 0 ? turn : undefined;\n}\nfunction imageAttachment(value) {\n const candidate = record(value);\n if (candidate === undefined\n || typeof candidate.attachmentId !== 'string'\n || !isImageMediaType(candidate.mediaType)\n || !positiveInteger(candidate.bytes)\n || !positiveInteger(candidate.width)\n || !positiveInteger(candidate.height))\n return undefined;\n const original = record(candidate.originalDimensions);\n if (candidate.originalDimensions !== undefined\n && (original === undefined || !positiveInteger(original.width) || !positiveInteger(original.height)))\n return undefined;\n return {\n attachmentId: candidate.attachmentId,\n mediaType: candidate.mediaType,\n bytes: candidate.bytes,\n width: candidate.width,\n height: candidate.height,\n ...(typeof candidate.name === 'string' ? { name: candidate.name } : {}),\n ...(original === undefined ? {} : { originalDimensions: { width: original.width, height: original.height } }),\n };\n}\nfunction isImageMediaType(value) {\n return value === 'image/png' || value === 'image/jpeg' || value === 'image/webp' || value === 'image/gif';\n}\nfunction positiveInteger(value) {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\nfunction stringValue(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction record(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value\n : undefined;\n}\n//# sourceMappingURL=image-result-node.js.map","const STORAGE_PREFIX = 'dsh_image_gen_conversation_revisions:';\nconst MAX_REVISIONS = 20;\n/** Read the locally persisted replacement history for one immutable conversation image. */\nexport function loadConversationImageRevisionChain(originId) {\n const empty = () => ({ originId, currentIndex: 0, revisions: [] });\n try {\n const raw = globalThis.localStorage?.getItem(storageKey(originId));\n if (!raw)\n return empty();\n const value = JSON.parse(raw);\n if (!isChain(value, originId))\n return empty();\n const currentIndex = Math.min(value.currentIndex, value.revisions.length);\n return { originId, currentIndex, revisions: value.revisions };\n }\n catch {\n return empty();\n }\n}\n/** Append a generated version and make it the version shown by the conversation card. */\nexport function appendConversationImageRevision(originId, revision) {\n const current = loadConversationImageRevisionChain(originId);\n const withoutDuplicate = current.revisions.filter(item => item.attachment.attachmentId !== revision.attachment.attachmentId);\n const revisions = [...withoutDuplicate, revision].slice(-MAX_REVISIONS);\n const next = { originId, currentIndex: revisions.length, revisions };\n persist(next);\n return next;\n}\n/** Select an earlier or later version without altering the underlying conversation event. */\nexport function selectConversationImageRevision(originId, requestedIndex) {\n const current = loadConversationImageRevisionChain(originId);\n const currentIndex = Math.max(0, Math.min(Math.trunc(requestedIndex), current.revisions.length));\n const next = { ...current, currentIndex };\n persist(next);\n return next;\n}\nfunction persist(chain) {\n try {\n globalThis.localStorage?.setItem(storageKey(chain.originId), JSON.stringify(chain));\n }\n catch {\n // The generated attachment is still available for this mount when browser storage is unavailable.\n }\n}\nfunction storageKey(originId) {\n return `${STORAGE_PREFIX}${originId}`;\n}\nfunction isChain(value, originId) {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n return false;\n const candidate = value;\n return candidate.originId === originId\n && typeof candidate.currentIndex === 'number'\n && Number.isSafeInteger(candidate.currentIndex)\n && candidate.currentIndex >= 0\n && Array.isArray(candidate.revisions)\n && candidate.revisions.every(isRevision);\n}\nfunction isRevision(value) {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n return false;\n const candidate = value;\n return isAttachment(candidate.attachment)\n && (candidate.provider === 'google' || candidate.provider === 'openai' || candidate.provider === 'seedream' || candidate.provider === 'dashscope')\n && typeof candidate.prompt === 'string'\n && typeof candidate.model === 'string'\n && typeof candidate.output === 'string'\n && typeof candidate.createdAt === 'number'\n && Number.isFinite(candidate.createdAt)\n && typeof candidate.ratio === 'string'\n && typeof candidate.quality === 'string';\n}\nfunction isAttachment(value) {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n return false;\n const candidate = value;\n return typeof candidate.attachmentId === 'string'\n && (candidate.mediaType === 'image/png' || candidate.mediaType === 'image/jpeg' || candidate.mediaType === 'image/webp' || candidate.mediaType === 'image/gif')\n && typeof candidate.bytes === 'number'\n && typeof candidate.width === 'number'\n && typeof candidate.height === 'number';\n}\n//# sourceMappingURL=conversation-image-revisions.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState, useRef } from 'react';\nimport { CLOUD_IMAGE_PROVIDERS, DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, STUDIO_ROUTE, activeComfyUIWorkflow, resolveComfyUIWorkflows, uniqueComfyUIWorkflowName, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nimport { fetchAttachmentBlob } from './image-cache.js';\nimport { imageRef } from './image-ref.js';\nimport { STUDIO_STYLE } from './studio-style.js';\nimport { IMAGE_RESULT_NODE_KIND, createImageResultDefinition, } from './image-result-node.js';\nimport { appendConversationImageRevision, loadConversationImageRevisionChain, selectConversationImageRevision, } from './conversation-image-revisions.js';\nimport { conversationRegenerateRequest } from './conversation-regenerate.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n providerComfyUI: '本地 ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: '留空即可保留已配置的 Key',\n apiKeyHint: '安全保存为 {key};页面不会读回明文。',\n endpoint: '接口地址',\n reset: '重置',\n resetTitle: '重置为默认官方地址',\n endpointHintGoogle: 'Google 官方地址或反代端点(全路径)。',\n endpointHintOpenAI: '中转站请填其 OpenAI 兼容的 /v1 地址。',\n endpointHintSeedream: '火山方舟兼容的 /api/v3 地址。',\n endpointHintDashScope: '阿里云百炼 DashScope 官方接口地址。',\n endpointHintComfyUI: '正在运行且 DSH Host 可以访问的 ComfyUI 地址,默认使用本机 8188 端口。',\n model: '模型',\n workflow: 'API Workflow 工作流',\n workflowImport: '导入 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '从 ComfyUI 导出 API Format JSON,在提示词输入写入 {{prompt}},种子可用 {{seed}};图生图工作流在 LoadImage 的 image 输入写入 {{image}}(仅一次)。可导入多个工作流,Agent 也能在调用时按名称指定。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\n workflowActiveTitle: '设为当前使用的工作流',\n workflowRemove: '删除',\n workflowPresetPlaceholder: '预设提示词,留空则只用对话内容',\n workflowPresetTitle: '预设提示词:每次调用此工作流时自动加在用户提示词前面。',\n workflowNameRequired: '工作流名称不能为空。',\n workflowDuplicateName: '工作流名称不能重复。',\n timeout: '生成超时(秒)',\n timeoutHint: '包括提交、等待和下载图片;默认 300 秒。',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n resultShown: '图片结果已显示在对话中',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n regenerate: '重新生成',\n regenerateTitle: '重新生成图片',\n regenerateHint: '如有需要可微调提示词。生成的新图片将替代当前展示,原图依然可在版本中查看。',\n prompt: '提示词',\n cancel: '取消',\n confirmRegenerate: '确认生成',\n regenerating: '重新生成中…',\n regenerateFailed: '重新生成失败',\n versionPrevious: '上一版本',\n versionNext: '下一版本',\n versionLabel: '图片版本 {current}/{total}',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n providerComfyUI: 'Local ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: 'Leave empty to keep configured key',\n apiKeyHint: 'Securely saved as {key}; never read back in plaintext.',\n endpoint: 'Endpoint / Base URL',\n reset: 'Reset',\n resetTitle: 'Reset to official default URL',\n endpointHintGoogle: 'Official Google endpoint or reverse proxy (full path).',\n endpointHintOpenAI: 'OpenAI-compatible /v1 base URL for relays.',\n endpointHintSeedream: 'Volcengine Ark compatible /api/v3 base URL.',\n endpointHintDashScope: 'Official Aliyun DashScope endpoint.',\n endpointHintComfyUI: 'A running ComfyUI server reachable by the DSH Host; the default points to port 8188 on this computer.',\n model: 'Model',\n workflow: 'API Workflows',\n workflowImport: 'Import JSON file',\n workflowMissing: 'No workflow imported',\n workflowImported: 'Imported {name}',\n workflowHint: 'Export an API Format JSON from ComfyUI and place {{prompt}} in its prompt input; {{seed}} is available for a random seed. For image editing put {{image}} (exactly once) in the LoadImage image input. Import as many workflows as you need; the Agent can also pick one by name.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\n workflowActiveTitle: 'Make this the active workflow',\n workflowRemove: 'Remove',\n workflowPresetPlaceholder: 'Preset prompt (optional)',\n workflowPresetTitle: 'Preset prompt: automatically prepended to the user prompt on every call of this workflow.',\n workflowNameRequired: 'Workflow names cannot be empty.',\n workflowDuplicateName: 'Workflow names must be unique.',\n timeout: 'Generation timeout (seconds)',\n timeoutHint: 'Covers submission, waiting, and image download; defaults to 300 seconds.',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n resultShown: 'Image result is shown in the conversation',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n regenerate: 'Regenerate',\n regenerateTitle: 'Regenerate image',\n regenerateHint: 'Edit the prompt if needed. The new image replaces this view while the original remains available.',\n prompt: 'Prompt',\n cancel: 'Cancel',\n confirmRegenerate: 'Regenerate',\n regenerating: 'Regenerating…',\n regenerateFailed: 'Regeneration failed',\n versionPrevious: 'Previous version',\n versionNext: 'Next version',\n versionLabel: 'Image version {current}/{total}',\n },\n};\nconst STYLE = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\n.dsh-ig-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.dsh-ig-file-button{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font-size:13px;cursor:pointer;transition:background .15s,border-color .15s}\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\n.dsh-ig-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,inherit);font-size:12px}\n.dsh-ig-workflow-list{list-style:none;margin:0;padding:0;display:grid;gap:8px}\n.dsh-ig-workflow-row{display:flex;flex-direction:column;gap:6px;padding:8px;border:1px solid var(--dsw-alias-border-l2,#eee);border-radius:8px}\n.dsh-ig-workflow-main{display:flex;align-items:center;gap:8px}\n.dsh-ig-workflow-active{display:inline-flex;align-items:center;cursor:pointer;flex:none}\n.dsh-ig-workflow-active input[type=radio]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0;cursor:pointer}\n.dsh-ig-workflow-name{flex:1;min-width:0}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-status-error{color:var(--dsw-alias-label-error,#d33);font-weight:500}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-promoted-results{display:grid;gap:16px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0;isolation:isolate}\n.dsh-ig-container:hover .dsh-ig-toolbar,.dsh-ig-container:focus-within .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:2;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:4}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n.dsh-ig-version-nav{position:absolute;right:8px;bottom:8px;display:flex;align-items:center;gap:2px;padding:3px;border-radius:999px;background:rgba(15,23,42,.72);color:#fff;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);font-size:11px;line-height:1;z-index:2}\n.dsh-ig-version-nav button{appearance:none;border:0;background:transparent;color:inherit;width:25px;height:25px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;font-size:17px;line-height:1}\n.dsh-ig-version-nav button:hover:not(:disabled){background:rgba(255,255,255,.2)}\n.dsh-ig-version-nav button:disabled{opacity:.3;cursor:default}\n.dsh-ig-version-count{min-width:34px;text-align:center;font-variant-numeric:tabular-nums}\n.dsh-ig-regenerate-overlay{position:absolute;inset:0;background:rgba(15,23,42,0.52);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:#fff;z-index:3;animation:dsh-ig-fade .18s ease-out;line-height:1.4;border-radius:12px}\n.dsh-ig-regenerate-spinner{width:28px;height:28px;border:3px solid rgba(255,255,255,0.25);border-top-color:#fff;border-radius:50%;animation:dsh-ig-spin .8s linear infinite}\n.dsh-ig-regenerate-overlay-text{font-size:12.5px;font-weight:550;color:#fff;letter-spacing:0.2px;text-shadow:0 1px 2px rgba(0,0,0,0.4)}\n.dsh-ig-regenerate-overlay-cancel{appearance:none;border:1px solid rgba(255,255,255,0.4);border-radius:6px;background:rgba(255,255,255,0.15);color:#fff;padding:3px 12px;font-size:11.5px;cursor:pointer;transition:background .15s}\n.dsh-ig-regenerate-overlay-cancel:hover{background:rgba(255,255,255,0.3)}\n@keyframes dsh-ig-spin{to{transform:rotate(360deg)}}\n.dsh-ig-regenerate-backdrop{position:fixed;inset:0;z-index:100000;display:flex;align-items:center;justify-content:center;padding:18px;background:rgba(11,17,29,.6);backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-regenerate-dialog{width:min(520px,100%);border:1px solid var(--dsw-alias-border-l2,#dfe3ea);border-radius:14px;background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-primary,#172033);box-shadow:0 24px 72px rgba(11,17,29,.28);padding:20px;box-sizing:border-box;line-height:1.4}\n.dsh-ig-regenerate-dialog h3{margin:0;font-size:16px;font-weight:650}\n.dsh-ig-regenerate-dialog p{margin:7px 0 16px;color:var(--dsw-alias-label-tertiary,#737d8f);font-size:12.5px;line-height:1.55}\n.dsh-ig-regenerate-dialog label{display:grid;gap:7px;font-size:12.5px;font-weight:600}\n.dsh-ig-regenerate-dialog textarea{box-sizing:border-box;width:100%;min-height:132px;resize:vertical;border:1px solid var(--dsw-alias-border-l2,#d7dce5);border-radius:9px;padding:11px 12px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;font:inherit;font-size:13px;line-height:1.55;outline:none}\n.dsh-ig-regenerate-dialog textarea:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);box-shadow:0 0 0 3px rgba(76,120,255,.12)}\n.dsh-ig-regenerate-error{margin-top:10px!important;color:var(--dsw-alias-label-error,#d33)!important}\n.dsh-ig-regenerate-actions{display:flex;justify-content:flex-end;gap:9px;margin-top:16px}\n.dsh-ig-regenerate-actions button{height:35px;padding:0 14px;border-radius:7px;font:inherit;font-size:13px;font-weight:550;cursor:pointer}\n.dsh-ig-regenerate-cancel{border:1px solid var(--dsw-alias-border-l2,#d7dce5);background:transparent;color:inherit}\n.dsh-ig-regenerate-confirm{border:1px solid var(--dsw-alias-brand-primary,#3569ed);background:var(--dsw-alias-brand-primary,#3569ed);color:#fff}\n.dsh-ig-regenerate-actions button:disabled{opacity:.5;cursor:default}\n@media(hover:none){.dsh-ig-container .dsh-ig-toolbar{opacity:1;pointer-events:auto}}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery & Studio View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n\n/* 1. Top Navigation Tab Bar */\n.dsh-ig-studio-tabs-bar{display:flex;align-items:center;gap:6px;padding:6px 24px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-studio-tab-btn{appearance:none;-webkit-appearance:none;border:0;background:transparent;display:inline-flex;align-items:center;gap:7px;padding:7px 14px;font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#64748b);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease}\n.dsh-ig-studio-tab-btn:hover{color:var(--dsw-alias-label-primary,#0f172a);background:var(--dsw-alias-bg-layer-2,#f1f5f9)}\n.dsh-ig-studio-tab-btn.is-active{color:var(--dsw-alias-brand-primary,#2563eb);font-weight:600;background:rgba(37,99,235,0.08)}\n\n/* 2. Secondary Filter & Search Toolbar */\n.dsh-ig-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 24px;background:var(--dsw-alias-bg-layer-1,#ffffff);border-bottom:1px solid var(--dsw-alias-border-l2,#f1f5f9);flex-shrink:0;flex-wrap:wrap}\n.dsh-ig-studio-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}\n.dsh-ig-studio-toolbar-right{display:flex;align-items:center;gap:10px;flex-shrink:0}\n\n/* Modern Custom Select (Removes OS default arrows & ugly borders) */\n.dsh-ig-studio-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;height:32px;line-height:30px;padding:0 28px 0 12px;font-size:12.5px;color:var(--dsw-alias-label-primary,#334155);background-color:var(--dsw-alias-bg-layer-2,#ffffff);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 9px center;border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:6px;outline:none;cursor:pointer;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}\n.dsh-ig-studio-select:hover{border-color:var(--dsw-alias-border-l1,#cbd5e1);background-color:var(--dsw-alias-bg-layer-1,#f8fafc)}\n.dsh-ig-studio-select:focus{border-color:var(--dsw-alias-brand-primary,#3b82f6);box-shadow:0 0 0 2px rgba(59,130,246,0.15)}\n.dsh-ig-studio-select-sort{font-weight:500}\n\n/* Unified Search Input */\n.dsh-ig-studio-search-wrap{position:relative;display:flex;align-items:center;min-width:190px;max-width:320px;flex:1}\n.dsh-ig-studio-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#94a3b8);pointer-events:none}\n.dsh-ig-studio-search-input{width:100%;height:32px;line-height:30px;padding:0 12px 0 32px;font-size:12.5px;border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:6px;background-color:var(--dsw-alias-bg-layer-2,#ffffff);color:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}\n.dsh-ig-studio-search-input:hover{border-color:var(--dsw-alias-border-l1,#cbd5e1)}\n.dsh-ig-studio-search-input:focus{border-color:var(--dsw-alias-brand-primary,#3b82f6);box-shadow:0 0 0 2px rgba(59,130,246,0.15)}\n.dsh-ig-studio-search-input::placeholder{color:var(--dsw-alias-label-tertiary,#94a3b8)}\n\n/* 3. Grid & Responsive Cards */\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:20px 24px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:18px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#ffffff);border:1px solid var(--dsw-alias-border-l2,#e2e8f0);border-radius:10px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 10px 20px -5px rgba(0,0,0,0.06),0 4px 6px -2px rgba(0,0,0,0.03);border-color:var(--dsw-alias-border-l1,#cbd5e1)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f1f5f9;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s ease}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#94a3b8}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar on Card Hover */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:6px;left:6px;display:flex;align-items:center;gap:3px;padding:3px 5px;border-radius:6px;background:rgba(15,23,42,0.72);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n/* Card Bottom Metadata */\n.dsh-ig-gallery-card-meta{padding:10px 12px;display:flex;flex-direction:column;gap:5px;background:var(--dsw-alias-bg-layer-2,#ffffff);flex:1}\n.dsh-ig-card-badge-row{display:flex;align-items:center}\n.dsh-ig-card-badge{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#f1f5f9);color:var(--dsw-alias-label-secondary,#475569);font-size:11px;font-weight:500;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-ig-gallery-card-prompt-line{font-size:12.5px;font-weight:500;color:var(--dsw-alias-label-primary,#1e293b);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-ig-card-footer-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:2px}\n.dsh-ig-card-meta-text{font-size:11px;color:var(--dsw-alias-label-tertiary,#94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.dsh-ig-card-fav-btn{appearance:none;border:0;background:transparent;color:var(--dsw-alias-label-tertiary,#94a3b8);padding:2px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:color .15s,transform .15s;flex-shrink:0}\n.dsh-ig-card-fav-btn:hover{color:#ef4444;transform:scale(1.15)}\n.dsh-ig-card-fav-btn.is-favorited{color:#ef4444}\n\n/* Placeholders for Upcoming Routes */\n.dsh-ig-placeholder-view{display:flex;align-items:center;justify-content:center;min-height:360px;height:100%;padding:24px}\n.dsh-ig-placeholder-card{max-width:500px;width:100%;text-align:center;padding:36px 28px;background:var(--dsw-alias-bg-layer-2,#ffffff);border:1px dashed var(--dsw-alias-border-l2,#e2e8f0);border-radius:14px;display:flex;flex-direction:column;align-items:center;gap:12px}\n.dsh-ig-placeholder-icon{font-size:40px;line-height:1}\n.dsh-ig-placeholder-header{display:flex;align-items:center;gap:8px;justify-content:center}\n.dsh-ig-placeholder-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin:0}\n.dsh-ig-placeholder-badge{font-size:11px;font-weight:500;background:rgba(37,99,235,0.1);color:#2563eb;padding:2px 8px;border-radius:12px}\n.dsh-ig-placeholder-desc{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary,#64748b);margin:0}\n.dsh-ig-placeholder-tip{margin-top:6px;padding:8px 12px;font-size:12px;background:var(--dsw-alias-bg-layer-3,#f8fafc);border-radius:8px;color:var(--dsw-alias-label-tertiary,#64748b);text-align:left}\n\n/* Empty State */\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#94a3b8)}\n.dsh-ig-gallery-empty-icon{font-size:44px;margin-bottom:10px}\n.dsh-ig-gallery-empty-title{font-size:15px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:4px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-counter{display:inline-flex;align-items:center;padding:2px 8px;border-radius:4px;background:rgba(255,255,255,0.15);color:#fff;font-size:11.5px;font-weight:500;font-variant-numeric:tabular-nums}\n.dsh-ig-lightbox-nav-btn{position:fixed;top:50%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.12);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:background-color .15s ease,transform .15s ease,opacity .15s ease;outline:none}\n.dsh-ig-lightbox-nav-btn:hover:not(:disabled){background:rgba(255,255,255,0.28);transform:translateY(-50%) scale(1.08)}\n.dsh-ig-lightbox-nav-btn:disabled{opacity:0.2;cursor:not-allowed;pointer-events:none}\n.dsh-ig-lightbox-nav-prev{left:24px}\n.dsh-ig-lightbox-nav-next{right:24px}\n.dsh-ig-lightbox-loading{display:flex;align-items:center;justify-content:center;min-width:180px;min-height:180px}\n.dsh-ig-lightbox-spinner{width:36px;height:36px;border:3px solid rgba(255,255,255,0.2);border-top-color:#fff;border-radius:50%;animation:dsh-ig-spin .8s linear infinite}\n@keyframes dsh-ig-spin{to{transform:rotate(360deg)}}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Card selection and checkbox */\n.dsh-ig-gallery-card.is-selected{box-shadow:0 0 0 2px var(--dsw-alias-brand-primary,#2563eb);border-color:transparent}\n.dsh-ig-card-checkbox{position:absolute;top:8px;left:8px;width:22px;height:22px;border-radius:50%;border:1.5px solid rgba(255,255,255,0.7);background:rgba(0,0,0,0.35);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);color:#fff;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;z-index:5;opacity:0;transition:opacity .15s ease,background-color .15s ease,border-color .15s ease;padding:0;outline:none}\n.dsh-ig-gallery-card:hover .dsh-ig-card-checkbox,.dsh-ig-gallery-card.is-manage-mode .dsh-ig-card-checkbox,.dsh-ig-card-checkbox.is-checked{opacity:1}\n.dsh-ig-card-checkbox.is-checked{background:var(--dsw-alias-brand-primary,#2563eb);border-color:var(--dsw-alias-brand-primary,#2563eb)}\n\n/* Studio button in toolbar */\n.dsh-ig-studio-btn{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;box-sizing:border-box;border-radius:6px;border:1px solid var(--dsw-alias-border-subtle,rgba(0,0,0,0.12));background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-primary,inherit);font-size:12.5px;font-weight:500;cursor:pointer;transition:border-color .15s,background .15s,color .15s}\n.dsh-ig-studio-btn:hover{background:var(--dsw-alias-bg-layer-3,#f3f4f6);border-color:var(--dsw-alias-border-default,rgba(0,0,0,0.2))}\n.dsh-ig-studio-btn.is-active{background:var(--dsw-alias-brand-primary,#2563eb);border-color:var(--dsw-alias-brand-primary,#2563eb);color:#fff}\n.dsh-ig-studio-btn-danger{color:#ef4444;border-color:rgba(239,68,68,0.35);background:rgba(239,68,68,0.06)}\n.dsh-ig-studio-btn-danger:hover{background:rgba(239,68,68,0.14);border-color:rgba(239,68,68,0.6);color:#dc2626}\n.dsh-ig-studio-btn-danger.is-active{background:#dc2626;border-color:#dc2626;color:#fff}\n\n/* Floating Batch Action Bar */\n.dsh-ig-batch-bar{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:16px;background:rgba(20,24,32,0.92);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,0.18);border-radius:40px;padding:8px 16px;box-shadow:0 16px 40px rgba(0,0,0,0.5);z-index:99990;animation:dsh-ig-slide-up .2s cubic-bezier(0.16,1,0.3,1);color:#fff}\n@keyframes dsh-ig-slide-up{from{transform:translate(-50%,20px);opacity:0}to{transform:translate(-50%,0);opacity:1}}\n.dsh-ig-batch-bar-left{display:flex;align-items:center;gap:10px}\n.dsh-ig-batch-bar-right{display:flex;align-items:center;gap:8px;border-left:1px solid rgba(255,255,255,0.15);padding-left:12px}\n.dsh-ig-batch-counter{font-size:13px;font-weight:600;color:rgba(255,255,255,0.95);margin-right:4px}\n.dsh-ig-batch-btn{appearance:none;border:1px solid rgba(255,255,255,0.15);background:rgba(255,255,255,0.08);color:#fff;border-radius:20px;padding:5px 12px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-batch-btn:hover:not(:disabled){background:rgba(255,255,255,0.2)}\n.dsh-ig-batch-btn:disabled{opacity:0.4;cursor:not-allowed}\n.dsh-ig-batch-btn-danger{background:rgba(239,68,68,0.2);border-color:rgba(239,68,68,0.5);color:#fca5a5}\n.dsh-ig-batch-btn-danger:hover:not(:disabled){background:rgba(239,68,68,0.4)!important;border-color:rgba(239,68,68,0.8)!important;color:#fff!important}\n.dsh-ig-batch-btn-exit{border-color:transparent;background:transparent;color:rgba(255,255,255,0.7)}\n.dsh-ig-batch-btn-exit:hover{background:rgba(255,255,255,0.1);color:#fff}\n\n/* Batch Delete Confirmation Modal */\n.dsh-ig-modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,0.65);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:100005;display:flex;align-items:center;justify-content:center;padding:16px;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-modal-box{width:100%;max-width:440px;background:var(--dsw-alias-bg-layer-1,#1c1e24);border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.12));border-radius:12px;padding:22px;box-sizing:border-box;box-shadow:0 20px 50px rgba(0,0,0,0.45);color:var(--dsw-alias-label-primary,#fff);animation:dsh-ig-scale-up .15s ease-out}\n@keyframes dsh-ig-scale-up{from{transform:scale(0.95);opacity:0}to{transform:scale(1);opacity:1}}\n.dsh-ig-modal-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px}\n.dsh-ig-modal-icon-danger{width:36px;height:36px;border-radius:50%;background:rgba(239,68,68,0.12);color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.dsh-ig-modal-title{font-size:16px;font-weight:600;line-height:1.4}\n.dsh-ig-modal-body{margin-bottom:20px;padding-left:48px}\n.dsh-ig-modal-desc{font-size:13.5px;color:var(--dsw-alias-label-secondary,rgba(255,255,255,0.7));margin:0 0 14px 0;line-height:1.5}\n.dsh-ig-modal-checkbox-label{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--dsw-alias-label-primary,inherit);cursor:pointer;user-select:none}\n.dsh-ig-modal-checkbox-label input{margin:0;cursor:pointer;width:15px;height:15px}\n.dsh-ig-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px}\n.dsh-ig-modal-btn{height:34px;padding:0 14px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s,color .15s;outline:none}\n.dsh-ig-modal-btn-cancel{background:transparent;border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.2));color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-modal-btn-cancel:hover{background:var(--dsw-alias-bg-layer-3,rgba(255,255,255,0.08))}\n.dsh-ig-modal-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}\n.dsh-ig-modal-btn-danger:hover{background:#b91c1c;border-color:#b91c1c}\n.dsh-ig-modal-btn-primary{background:linear-gradient(135deg,#3b82f6,#2563eb);border:1px solid #2563eb;color:#fff;display:inline-flex;align-items:center;gap:6px}\n.dsh-ig-modal-btn-primary:hover:not(:disabled){background:linear-gradient(135deg,#2563eb,#1d4ed8)}\n.dsh-ig-modal-btn-primary:disabled{opacity:0.5;cursor:not-allowed}\n.dsh-ig-regenerate-modal-box{max-width:520px}\n.dsh-ig-regenerate-modal-icon{width:36px;height:36px;border-radius:50%;background:rgba(59,130,246,0.15);color:#3b82f6;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.dsh-ig-regenerate-modal-title-wrap{display:flex;flex-direction:column;gap:4px}\n.dsh-ig-regenerate-modal-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.dsh-ig-regenerate-modal-textarea{width:100%;box-sizing:border-box;background:var(--dsw-alias-bg-layer-2,rgba(0,0,0,0.25));border:1px solid var(--dsw-alias-border-subtle,rgba(255,255,255,0.15));border-radius:8px;padding:10px 12px;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-primary,#fff);resize:vertical;font-family:inherit;outline:none;transition:border-color .15s,box-shadow .15s}\n.dsh-ig-regenerate-modal-textarea:focus{border-color:#3b82f6;box-shadow:0 0 0 2px rgba(59,130,246,0.2)}\n.dsh-ig-lightbox-btn-regenerate:hover{color:#60a5fa!important;border-color:rgba(96,165,250,0.5)!important;background:rgba(96,165,250,0.12)!important}\n.dsh-ig-lightbox-generating-indicator{display:inline-flex;align-items:center;gap:8px;padding:4px 12px;background:rgba(37,99,235,0.2);border:1px solid rgba(59,130,246,0.5);border-radius:20px;font-size:12px;color:#93c5fd;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-spinner-sm{width:12px;height:12px;border:2px solid rgba(147,197,253,0.3);border-top-color:#93c5fd;border-radius:50%;animation:dsh-ig-spin .8s linear infinite;flex-shrink:0}\n.dsh-ig-lightbox-abort-btn{appearance:none;background:transparent;border:0;color:#fca5a5;font-size:11.5px;cursor:pointer;padding:0 4px;margin-left:4px;text-decoration:underline;text-underline-offset:2px}\n.dsh-ig-lightbox-abort-btn:hover{color:#ef4444}\n\n/* Hide floating chat composer and width handles when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n:has(> [data-conversation-scroll]:has(.dsh-ig-gallery-page)) > [class*=\"widthHandle\"],\n:has(.dsh-ig-gallery-page) [class*=\"widthHandle\"],\n.root:has(.dsh-ig-gallery-page) [class*=\"widthHandle\"]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n // Host-owned chat transcript preference (\"ui-chat\" transcriptView). Unknown,\n // unavailable, or not-yet-loaded reads fall back to Compact-safe anchoring.\n const chatScope = ctx.settingsScope.bind({ namespace: 'ui-chat' });\n const isCompactTranscript = () => chatScope.getSnapshot().value?.transcriptView !== 'normal';\n const locale = ctx.get('locale');\n const promotion = { enabled: false };\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = `${STYLE}\\n${STUDIO_STYLE}`;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n ctx.inject(['uiConversation'], (owner) => {\n const uiConversation = asModernUiConversation(owner.get('uiConversation'));\n if (uiConversation === undefined) {\n throw new Error('dsh-image-gen: uiConversation has an incompatible interface');\n }\n promotion.enabled = true;\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.effect(() => uiConversation.events.register(createImageResultDefinition({ isCompactTranscript })), 'dsh-image-gen: promoted image result node');\n owner.slots.inject('conversation.chat.node', () => ownerRegister({\n name: 'conversation.chat.node',\n key: IMAGE_RESULT_NODE_KIND,\n inject: () => ({ locale }),\n }, PromotedImageResultNode));\n });\n // 1. Settings item\n const injectSettingsItem = (owner, credentials) => {\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.slots.inject('settings.plugin.item', () => ownerRegister({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\n };\n const remoteCredentials = asCredentialsRemote(ctx.get('remote.credentials'));\n const legacyCredentials = credentialsFromLegacyConnection(ctx.get('connection'));\n if (remoteCredentials !== undefined) {\n injectSettingsItem(ctx, remoteCredentials);\n }\n else if (legacyCredentials !== undefined) {\n injectSettingsItem(ctx, legacyCredentials);\n }\n else {\n ctx.inject(['remote.credentials'], (remoteCtx) => {\n const credentials = asCredentialsRemote(remoteCtx.get('remote.credentials'));\n if (credentials === undefined)\n throw new Error('dsh-image-gen: remote.credentials has an incompatible interface');\n injectSettingsItem(remoteCtx, credentials);\n });\n }\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\nfunction asModernUiConversation(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const events = value.events;\n if (events === null || typeof events !== 'object')\n return undefined;\n return typeof events.register === 'function'\n ? value\n : undefined;\n}\nfunction asCredentialsRemote(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const candidate = value;\n return typeof candidate.describe === 'function' && typeof candidate.set === 'function'\n ? candidate\n : undefined;\n}\nfunction credentialsFromLegacyConnection(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const credentials = value.api?.credentials;\n if (credentials === undefined || typeof credentials.describe !== 'function' || typeof credentials.set !== 'function')\n return undefined;\n const legacy = credentials;\n return {\n async describe(refs) {\n const response = await legacy.describe({ refs });\n return response.result.ok\n ? { ok: true, value: response.result.value.credentials }\n : { ok: false };\n },\n async set(ref, credentialValue) {\n const response = await legacy.set({ ref, value: credentialValue });\n return response.result.ok\n ? { ok: true }\n : { ok: false, error: response.result.error };\n },\n };\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [workflows, setWorkflows] = useState([]);\n const [activeWorkflow, setActiveWorkflow] = useState('');\n const [timeoutSeconds, setTimeoutSeconds] = useState(DEFAULT_COMFYUI_TIMEOUT_MS / 1000);\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n const [messageIsError, setMessageIsError] = useState(false);\n const reportMessage = (text) => { setMessage(text); setMessageIsError(false); };\n const reportError = (text) => { setMessage(text); setMessageIsError(true); };\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n comfyui: t('providerComfyUI'),\n };\n useEffect(() => {\n const value = snapshot.value;\n const next = value?.provider ?? 'google';\n setProvider(next);\n setModel(modelOf(next, value));\n setBaseURL(baseURLOf(next, value));\n setWorkflows(resolveComfyUIWorkflows(value ?? {}));\n setActiveWorkflow(activeComfyUIWorkflow(value ?? {})?.name ?? '');\n setTimeoutSeconds(Math.max(1, Math.round((value?.comfyuiTimeoutMs ?? DEFAULT_COMFYUI_TIMEOUT_MS) / 1000)));\n setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined) {\n setConfigured(undefined);\n return;\n }\n let active = true;\n void props.credentials.describe([keyRef]).then(response => {\n if (active)\n setConfigured(response.ok ? response.value?.[keyRef]?.configured ?? false : undefined);\n }).catch(() => { if (active)\n setConfigured(undefined); });\n return () => { active = false; };\n }, [props.credentials, provider]);\n const save = async (event) => {\n event.preventDefault();\n setSaving(true);\n setMessage('');\n try {\n await props.scope.set('provider', provider);\n if (provider === 'comfyui') {\n const entries = workflows.map(entry => ({ name: entry.name.trim(), json: entry.json, presetPrompt: (entry.presetPrompt ?? '').trim() }));\n for (const entry of entries) {\n if (entry.name.length === 0)\n throw new Error(t('workflowNameRequired'));\n validateComfyUIWorkflowJson(entry.json);\n }\n if (new Set(entries.map(entry => entry.name)).size !== entries.length)\n throw new Error(t('workflowDuplicateName'));\n const activeEntry = entries.find(entry => entry.name === activeWorkflow) ?? entries[0];\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflows', entries);\n await props.scope.set('comfyuiActiveWorkflow', activeEntry === undefined ? '' : activeEntry.name);\n // Keep the legacy single-workflow fields in sync so older plugin versions keep working.\n await props.scope.set('comfyuiWorkflowJson', activeEntry === undefined ? '' : activeEntry.json);\n await props.scope.set('comfyuiWorkflowName', activeEntry === undefined ? '' : activeEntry.name);\n await props.scope.set('comfyuiTimeoutMs', Math.max(1, Math.round(timeoutSeconds)) * 1000);\n }\n else {\n await props.scope.set(provider === 'google' ? 'googleModel' : provider === 'openai' ? 'openaiModel' : provider === 'seedream' ? 'seedreamModel' : 'dashscopeModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : provider === 'seedream' ? 'seedreamBaseURL' : 'dashscopeEndpoint', baseURL);\n }\n await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined)\n throw new Error('ComfyUI does not use an API key in this version');\n const response = await props.credentials.set(keyRef, key.trim());\n if (!response.ok)\n throw new Error(response.error?.message ?? 'Failed to save API key');\n setKey('');\n setConfigured(true);\n }\n reportMessage(t('saved'));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n const workflowStatus = activeWorkflow.length > 0 ? t('workflowImported', { name: activeWorkflow }) : t('workflowMissing');\n const importWorkflow = async (event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file === undefined)\n return;\n reportMessage('');\n try {\n if (file.size > MAX_COMFYUI_WORKFLOW_BYTES)\n throw new Error(t('workflowTooLarge'));\n const json = await file.text();\n validateComfyUIWorkflowJson(json);\n const name = uniqueComfyUIWorkflowName(file.name, workflows.map(entry => entry.name));\n setWorkflows(current => [...current, { name, json }]);\n setActiveWorkflow(current => current.length > 0 ? current : name);\n reportMessage(t('workflowImported', { name }));\n }\n catch (cause) {\n reportError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n /** Renaming the active entry keeps the active selection following its new name. */\n const renameWorkflow = (index, name) => {\n const previous = workflows[index];\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, name } : entry));\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(name);\n };\n /** Removing the active entry moves the selection to the first remaining workflow. */\n const removeWorkflow = (index) => {\n const previous = workflows[index];\n const next = workflows.filter((_entry, position) => position !== index);\n setWorkflows(next);\n if (previous !== undefined && previous.name === activeWorkflow)\n setActiveWorkflow(next[0]?.name ?? '');\n };\n /** Editing one entry's preset leaves the rest of the entry untouched. */\n const setWorkflowPreset = (index, presetPrompt) => {\n setWorkflows(current => current.map((entry, position) => position === index ? { ...entry, presetPrompt } : entry));\n };\n return (_jsxs(\"li\", { className: `dsh-ig-card ${open ? 'dsh-ig-card-open' : ''}`, children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-head\", \"aria-expanded\": open, onClick: () => { setOpen(value => !value); }, children: [_jsxs(\"span\", { className: \"dsh-ig-head-text\", children: [_jsx(\"span\", { className: \"dsh-ig-title\", children: t('title') }), _jsx(\"span\", { className: \"dsh-ig-desc\", children: t('description') })] }), _jsx(\"span\", { className: `dsh-ig-chevron ${open ? 'dsh-ig-chevron-open' : ''}`, \"aria-hidden\": \"true\", children: _jsx(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: _jsx(\"path\", { d: \"M4 6l4 4 4-4\" }) }) })] }), open ? (_jsxs(\"form\", { className: \"dsh-ig-body\", onSubmit: (event) => { void save(event); }, children: [_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('provider') }), _jsxs(\"select\", { className: \"dsh-ig-input\", value: provider, onChange: event => { const next = event.target.value; setProvider(next); setModel(modelOf(next, snapshot.value)); setBaseURL(baseURLOf(next, snapshot.value)); setKey(''); }, children: [_jsx(\"option\", { value: \"google\", children: t('providerGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('providerOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('providerSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('providerDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('providerComfyUI') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('apiKeyLabel', { provider: providerLabels[provider] }) }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"password\", autoComplete: \"off\", value: key, onChange: event => { setKey(event.target.value); }, placeholder: configured ? t('apiKeyPlaceholder') : '' }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('apiKeyHint', { key: KEY_REF[provider] ?? '' }) })] }) : null, _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('endpoint') }), _jsxs(\"div\", { className: \"dsh-ig-input-group\", children: [_jsx(\"input\", { className: \"dsh-ig-input\", type: \"url\", value: baseURL, onChange: event => { setBaseURL(event.target.value); }, required: true }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", title: t('resetTitle'), onClick: () => { setBaseURL(DEFAULT_BASE_URLS[provider]); }, children: t('reset') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: provider === 'google' ? t('endpointHintGoogle') : provider === 'openai' ? t('endpointHintOpenAI') : provider === 'seedream' ? t('endpointHintSeedream') : provider === 'dashscope' ? t('endpointHintDashScope') : t('endpointHintComfyUI') })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('model') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: model, onChange: event => { setModel(event.target.value); }, required: true })] }) : (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('workflow') }), _jsxs(\"div\", { className: \"dsh-ig-file-row\", children: [_jsxs(\"label\", { className: \"dsh-ig-file-button\", children: [_jsx(\"input\", { className: \"dsh-ig-file-input\", type: \"file\", accept: \".json,application/json\", onChange: event => { void importWorkflow(event); } }), t('workflowImport')] }), workflows.length === 0 ? _jsx(\"span\", { className: \"dsh-ig-file-name\", children: t('workflowMissing') }) : null] }), workflows.length > 0 ? (_jsx(\"ul\", { className: \"dsh-ig-workflow-list\", children: workflows.map((entry, index) => (_jsxs(\"li\", { className: \"dsh-ig-workflow-row\", children: [_jsxs(\"div\", { className: \"dsh-ig-workflow-main\", children: [_jsx(\"label\", { className: \"dsh-ig-workflow-active\", title: t('workflowActiveTitle'), children: _jsx(\"input\", { type: \"radio\", name: \"dsh-ig-active-workflow\", \"aria-label\": t('workflowActiveTitle'), checked: entry.name === activeWorkflow, onChange: () => { setActiveWorkflow(entry.name); } }) }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-name\", value: entry.name, title: entry.name, onChange: event => { renameWorkflow(index, event.target.value); } }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", onClick: () => { removeWorkflow(index); }, children: t('workflowRemove') })] }), _jsx(\"input\", { className: \"dsh-ig-input dsh-ig-workflow-preset\", value: entry.presetPrompt ?? '', placeholder: t('workflowPresetPlaceholder'), title: t('workflowPresetTitle'), onChange: event => { setWorkflowPreset(index, event.target.value); } })] }, String(index)))) })) : null, _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('workflowHint') })] }), _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('timeout') }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"number\", min: \"1\", max: \"3600\", step: \"1\", value: timeoutSeconds, onChange: event => { setTimeoutSeconds(Number(event.target.value)); }, required: true }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('timeoutHint') })] })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: `dsh-ig-status${messageIsError ? ' dsh-ig-status-error' : ''}`, role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflows.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */\nexport function GeneratedImageCard(props) {\n const result = imageResultFromBlock(props.block);\n if (props.promoted && result !== undefined)\n return _jsx(PromotedResultNotice, { locale: props.locale });\n return _jsx(ImageResultCard, { result: result, locale: props.locale, sessionId: props.sessionId });\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, sessionId: props.sessionId }, 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, sessionId, }) {\n const attachment = result?.attachment;\n const originId = attachment?.attachmentId;\n const [revisionChain, setRevisionChain] = useState(() => loadConversationImageRevisionChain(String(originId ?? '')));\n const selectedRevision = revisionChain.revisions[revisionChain.currentIndex - 1];\n const activeAttachment = selectedRevision?.attachment ?? attachment;\n const activeResult = selectedRevision !== undefined ? {\n prompt: selectedRevision.prompt,\n provider: selectedRevision.provider,\n model: selectedRevision.model,\n output: selectedRevision.output,\n createdAt: selectedRevision.createdAt,\n } : result;\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 [regenerateOpen, setRegenerateOpen] = useState(false);\n const [regeneratePrompt, setRegeneratePrompt] = useState('');\n const [regenerateError, setRegenerateError] = useState();\n const [isRegenerating, setIsRegenerating] = useState(false);\n const regenerateControllerRef = useRef();\n const regenerateTextareaRef = useRef(null);\n const lang = usePluginLanguage(locale);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (result === undefined)\n return;\n void saveGalleryItem({\n id: result.attachment.attachmentId,\n attachment: result.attachment,\n prompt: result.prompt,\n provider: result.provider,\n model: result.model,\n output: result.output,\n ...(result.savedTo ? { savedTo: result.savedTo } : {}),\n ...(result.seed !== undefined ? { seed: result.seed } : {}),\n ...(sessionId ? { sessionId } : {}),\n });\n }, [result?.attachment.attachmentId]);\n useEffect(() => {\n if (!originId)\n return;\n regenerateControllerRef.current?.abort();\n regenerateControllerRef.current = undefined;\n setIsRegenerating(false);\n setRegenerateOpen(false);\n setRevisionChain(loadConversationImageRevisionChain(String(originId)));\n }, [originId]);\n useEffect(() => () => { regenerateControllerRef.current?.abort(); }, []);\n useEffect(() => {\n if (!regenerateOpen || isRegenerating)\n return;\n const frame = requestAnimationFrame(() => {\n regenerateTextareaRef.current?.focus();\n regenerateTextareaRef.current?.select();\n });\n const onKeyDown = (event) => {\n if (event.key === 'Escape')\n setRegenerateOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [regenerateOpen, isRegenerating]);\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 const currentUrlRef = useRef();\n useEffect(() => {\n return () => {\n if (currentUrlRef.current !== undefined) {\n URL.revokeObjectURL(currentUrlRef.current);\n currentUrlRef.current = undefined;\n }\n };\n }, []);\n useEffect(() => {\n if (activeAttachment === undefined)\n return;\n let canceled = false;\n void fetchAttachmentBlob(activeAttachment).then(resBlob => {\n if (canceled)\n return;\n setBlob(resBlob);\n setError(undefined);\n const nextUrl = URL.createObjectURL(resBlob);\n if (currentUrlRef.current !== undefined) {\n URL.revokeObjectURL(currentUrlRef.current);\n }\n currentUrlRef.current = nextUrl;\n setUrl(nextUrl);\n }).catch(cause => {\n if (canceled)\n return;\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n canceled = true;\n };\n }, [activeAttachment?.attachmentId]);\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 = activeAttachment?.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 const openRegenerate = (event) => {\n event.stopPropagation();\n if (activeResult === undefined || isRegenerating)\n return;\n setRegeneratePrompt(activeResult.prompt);\n setRegenerateError(undefined);\n setRegenerateOpen(true);\n };\n const cancelRegenerate = () => {\n regenerateControllerRef.current?.abort();\n regenerateControllerRef.current = undefined;\n setIsRegenerating(false);\n setRegenerateOpen(false);\n setRegenerateError(undefined);\n };\n const regenerate = async () => {\n if (activeResult === undefined || !originId || isRegenerating || regeneratePrompt.trim().length === 0)\n return;\n setIsRegenerating(true);\n setRegenerateError(undefined);\n // Non-blocking: close dialog immediately so user can continue chatting/scrolling!\n setRegenerateOpen(false);\n const controller = new AbortController();\n regenerateControllerRef.current = controller;\n try {\n const request = conversationRegenerateRequest(activeResult, regeneratePrompt, selectedRevision === undefined ? undefined : { ratio: selectedRevision.ratio, quality: selectedRevision.quality });\n const response = await fetch(STUDIO_ROUTE, {\n method: 'POST',\n credentials: 'same-origin',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(request),\n });\n const payload = await response.json().catch(() => null);\n if (!response.ok || payload === null || !('attachment' in payload)) {\n throw new Error(payload && 'error' in payload && payload.error ? payload.error : t('regenerateFailed'));\n }\n const revision = {\n attachment: payload.attachment,\n prompt: payload.prompt,\n provider: payload.provider,\n model: payload.model,\n output: payload.output,\n createdAt: payload.createdAt,\n ratio: request.ratio,\n quality: request.quality,\n };\n await saveGalleryItem({\n id: String(revision.attachment.attachmentId),\n attachment: revision.attachment,\n prompt: revision.prompt,\n provider: revision.provider,\n model: revision.model,\n createdAt: revision.createdAt,\n aspectRatio: revision.ratio,\n imageSize: revision.quality,\n output: revision.output,\n ...(savedTo ? { savedTo } : {}),\n ...(sessionId ? { sessionId } : {}),\n });\n const next = appendConversationImageRevision(String(originId), revision);\n setRevisionChain(next);\n setToast(t('regenerate'));\n setTimeout(() => { setToast(undefined); }, 2000);\n }\n catch (cause) {\n if (!controller.signal.aborted) {\n const errMsg = cause instanceof Error ? cause.message : String(cause);\n setError(errMsg);\n setToast(errMsg);\n setTimeout(() => { setToast(undefined); }, 3500);\n }\n }\n finally {\n if (regenerateControllerRef.current === controller) {\n regenerateControllerRef.current = undefined;\n setIsRegenerating(false);\n }\n }\n };\n const selectVersion = (index) => {\n if (!originId || isRegenerating)\n return;\n setRevisionChain(selectConversationImageRevision(String(originId), index));\n };\n const canRegenerate = activeResult !== undefined\n && CLOUD_IMAGE_PROVIDERS.includes(activeResult.provider)\n && activeResult.model.trim().length > 0;\n const versionTotal = revisionChain.revisions.length + 1;\n const versionCurrent = revisionChain.currentIndex + 1;\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: activeAttachment?.name ?? 'Generated image', onClick: () => { if (!isRegenerating)\n setPreviewOpen(true); } }), isRegenerating ? (_jsxs(\"div\", { className: \"dsh-ig-regenerate-overlay\", children: [_jsx(\"div\", { className: \"dsh-ig-regenerate-spinner\" }), _jsx(\"span\", { className: \"dsh-ig-regenerate-overlay-text\", children: t('regenerating') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-regenerate-overlay-cancel\", onClick: cancelRegenerate, children: t('cancel') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [canRegenerate ? _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", disabled: isRegenerating, title: isRegenerating ? t('regenerating') : t('regenerate'), onClick: openRegenerate, 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: \"M20 11a8.1 8.1 0 0 0-15.5-2M4 4v5h5\" }), _jsx(\"path\", { d: \"M4 13a8.1 8.1 0 0 0 15.5 2M20 20v-5h-5\" })] }) }) : null, _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] }), versionTotal > 1 ? _jsxs(\"div\", { className: \"dsh-ig-version-nav\", \"aria-label\": t('versionLabel', { current: String(versionCurrent), total: String(versionTotal) }), children: [_jsx(\"button\", { type: \"button\", title: t('versionPrevious'), disabled: revisionChain.currentIndex === 0 || isRegenerating, onClick: (event) => { event.stopPropagation(); selectVersion(revisionChain.currentIndex - 1); }, children: \"\\u2039\" }), _jsxs(\"span\", { className: \"dsh-ig-version-count\", children: [versionCurrent, \"/\", versionTotal] }), _jsx(\"button\", { type: \"button\", title: t('versionNext'), disabled: revisionChain.currentIndex >= revisionChain.revisions.length || isRegenerating, onClick: (event) => { event.stopPropagation(); selectVersion(revisionChain.currentIndex + 1); }, children: \"\\u203A\" })] }) : 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: activeAttachment?.name ?? 'Generated image preview' }) }) }) : null, regenerateOpen && activeResult !== undefined ? _jsx(\"div\", { className: \"dsh-ig-regenerate-backdrop\", onMouseDown: (event) => {\n if (event.target === event.currentTarget && !isRegenerating)\n setRegenerateOpen(false);\n }, children: _jsxs(\"div\", { className: \"dsh-ig-regenerate-dialog\", role: \"dialog\", \"aria-modal\": \"true\", \"aria-labelledby\": `dsh-ig-regenerate-${String(originId)}`, children: [_jsx(\"h3\", { id: `dsh-ig-regenerate-${String(originId)}`, children: t('regenerateTitle') }), _jsx(\"p\", { children: t('regenerateHint') }), _jsxs(\"label\", { children: [_jsx(\"span\", { children: t('prompt') }), _jsx(\"textarea\", { ref: regenerateTextareaRef, value: regeneratePrompt, maxLength: 2000, disabled: isRegenerating, onChange: (event) => setRegeneratePrompt(event.target.value), onKeyDown: (event) => {\n if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n void regenerate();\n }\n } })] }), regenerateError ? _jsx(\"p\", { className: \"dsh-ig-regenerate-error\", role: \"alert\", children: regenerateError }) : null, _jsxs(\"div\", { className: \"dsh-ig-regenerate-actions\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-regenerate-cancel\", onClick: cancelRegenerate, children: t('cancel') }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-regenerate-confirm\", disabled: isRegenerating || regeneratePrompt.trim().length === 0, onClick: () => { void regenerate(); }, children: t('confirmRegenerate') })] })] }) }) : null] });\n}\nfunction usePluginLanguage(locale) {\n const [lang, setLang] = useState(() => locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n useEffect(() => locale?.subscribe?.(() => {\n setLang(locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n }), [locale]);\n return lang;\n}\nfunction imageResultFromBlock(block) {\n const attachment = imageRef(block);\n if (attachment === undefined)\n return undefined;\n const blockValue = block;\n const meta = blockValue.meta ?? blockValue.resultView?.meta;\n return {\n attachment,\n prompt: typeof meta?.prompt === 'string' ? meta.prompt : blockValue.call?.args?.prompt ?? 'Generated Image',\n provider: typeof meta?.provider === 'string' ? meta.provider : 'google',\n model: typeof meta?.model === 'string' ? meta.model : '',\n output: typeof meta?.output === 'string' ? meta.output : '',\n ...(typeof meta?.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n ...(typeof meta?.seed === 'number' ? { seed: meta.seed } : {}),\n };\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : activeComfyUIWorkflow(value ?? {})?.name;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_MODELS[provider];\n}\nfunction baseURLOf(provider, value) {\n const stored = provider === 'google' ? value?.googleEndpoint : provider === 'openai' ? value?.openaiBaseURL : provider === 'seedream' ? value?.seedreamBaseURL : provider === 'dashscope' ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"mappings":"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"}