dsh-image-gen 0.1.6 → 0.1.7

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/README.en.md CHANGED
@@ -122,11 +122,12 @@ Click the **`[Gallery]`** Tab in the top navigation bar to browse and search all
122
122
  ## ✨ Key Features
123
123
 
124
124
  - 💬 **In-Chat Image Generation**: Tell your Agent what you want to draw without switching tabs or tools.
125
- - 🖼️ **Native Image Gallery**: Dedicated "Gallery" tab automatically collecting all generated images with keyword search, provider filtering, and quick copy/download.
125
+ - 🖼️ **Native Image Gallery**: Dedicated "Gallery" tab automatically collecting all generated images with keyword search, provider filtering, single-item deletion (with confirmation and persistent tombstones), and quick copy/download.
126
126
  - 🔍 **Interactive Image Tools**: High-res fullscreen preview, one-click copy to clipboard, local download, and open in new tab.
127
127
  - 🎨 **Multi-Provider Support**: Supports Google Gemini, OpenAI Images, OpenAI Compatible API, ByteDance Seedream / Volcengine Ark, and Aliyun DashScope (Wanx / Qwen-Image).
128
128
  - 🔑 **BYOK (Bring Your Own Key)**: Uses your own API keys managed securely by DSH credentials service with write-only protection.
129
129
  - 🖼️ **Durable Session Persistence**: Images integrate with DSH Attachment and conversation lifecycle, preserved across reloads.
130
+ - 💾 **Workspace File Output**: By default each generated image is also written as a file into the current session workspace (`dsh-image-gen/` subfolder); the tool result carries the absolute file path. Can be disabled or re-pointed in settings.
130
131
  - ⚙️ **Native Web Settings**: Configure providers, keys, models, and endpoints directly in DSH settings.
131
132
 
132
133
  ---
package/README.md CHANGED
@@ -122,11 +122,12 @@ pnpm dsh plugin --profile web add ./dsh-image-gen
122
122
  ## ✨ 主要能力
123
123
 
124
124
  - 💬 **对话中直接生图**:不需要切换到其他网站,也不需要手动复制 Prompt,直接告诉 Agent 你想画什么即可。
125
- - 🖼️ **历史生图画廊**:顶栏自带「画廊」Tab,自动汇总所有历史生成的图片,支持关键词搜索、厂商筛选与一键复制/下载。
125
+ - 🖼️ **历史生图画廊**:顶栏自带「画廊」Tab,自动汇总所有历史生成的图片,支持关键词搜索、厂商筛选、单张删除(带防误触确认与持久化墓碑)与一键复制/下载。
126
126
  - 🔍 **交互式图片工具**:支持点击全屏大图预览、一键复制图片到剪贴板、本地下载与新标签页打开。
127
127
  - 🎨 **多 Provider 支持**:支持 Google Gemini、OpenAI Images、OpenAI Compatible API、ByteDance Seedream / 火山方舟以及阿里云 DashScope(通义万相 / Qwen-Image)。Provider、模型和 Endpoint 均可在设置中自由定制。
128
128
  - 🔑 **BYOK (自带 Key)**:插件使用你自己的 API Key。API Key 通过 DeepSeek Harness 的 `credentials` 服务管理,采用写保护隔离,不需要写进项目源码或配置文件,前端不存明文。
129
129
  - 🖼️ **图片跟随会话保存**:生成结果会接入 DeepSeek Harness 的 Attachment / Conversation 体系,重新打开历史会话后,仍然可以看到之前生成的图片。
130
+ - 💾 **生成图片自动落盘到工作区**:默认在每次生成后把图片文件保存到当前会话工作区(`dsh-image-gen/` 子目录),工具结果会返回文件的绝对路径;可在设置中关闭或修改保存目录。
130
131
  - ⚙️ **原生设置界面**:Provider、API Key、模型和 Endpoint 都可以直接在 DSH Web 设置中修改,不需要手动编辑配置文件。
131
132
 
132
133
  ---
package/README.zh-CN.md CHANGED
@@ -122,11 +122,12 @@ pnpm dsh plugin --profile web add ./dsh-image-gen
122
122
  ## ✨ 主要能力
123
123
 
124
124
  - 💬 **对话中直接生图**:不需要切换到其他网站,也不需要手动复制 Prompt,直接告诉 Agent 你想画什么即可。
125
- - 🖼️ **历史生图画廊**:顶栏自带「画廊」Tab,自动汇总所有历史生成的图片,支持关键词搜索、厂商筛选与一键复制/下载。
125
+ - 🖼️ **历史生图画廊**:顶栏自带「画廊」Tab,自动汇总所有历史生成的图片,支持关键词搜索、厂商筛选、单张删除(带防误触确认与持久化墓碑)与一键复制/下载。
126
126
  - 🔍 **交互式图片工具**:支持点击全屏大图预览、一键复制图片到剪贴板、本地下载与新标签页打开。
127
127
  - 🎨 **多 Provider 支持**:支持 Google Gemini、OpenAI Images、OpenAI Compatible API、ByteDance Seedream / 火山方舟以及阿里云 DashScope(通义万相 / Qwen-Image)。Provider、模型和 Endpoint 均可在设置中自由定制。
128
128
  - 🔑 **BYOK (自带 Key)**:插件使用你自己的 API Key。API Key 通过 DeepSeek Harness 的 `credentials` 服务管理,采用写保护隔离,不需要写进项目源码或配置文件,前端不存明文。
129
129
  - 🖼️ **图片跟随会话保存**:生成结果会接入 DeepSeek Harness 的 Attachment / Conversation 体系,重新打开历史会话后,仍然可以看到之前生成的图片。
130
+ - 💾 **生成图片自动落盘到工作区**:默认在每次生成后把图片文件保存到当前会话工作区(`dsh-image-gen/` 子目录),工具结果会返回文件的绝对路径;可在设置中关闭或修改保存目录。
130
131
  - ⚙️ **原生设置界面**:Provider、API Key、模型和 Endpoint 都可以直接在 DSH Web 设置中修改,不需要手动编辑配置文件。
131
132
 
132
133
  ---
package/lib/client.js CHANGED
@@ -917,9 +917,14 @@ window.__ModuleLoader__.load({
917
917
  endpointHintSeedream: "火山方舟兼容的 /api/v3 地址。",
918
918
  endpointHintDashScope: "阿里云百炼 DashScope 官方接口地址。",
919
919
  model: "模型",
920
+ saveToWorkspace: "保存到工作区",
921
+ saveToWorkspaceHint: "每次生成后,把图片文件保存到当前会话工作区。",
922
+ folder: "工作区文件夹",
923
+ folderHint: "相对当前会话工作区的子目录;留空表示工作区根目录。",
920
924
  saving: "保存中…",
921
925
  save: "保存",
922
926
  saved: "已保存",
927
+ savedToPath: "已保存到",
923
928
  checkingKey: "正在检查 API Key…",
924
929
  keyConfigured: "已配置 API Key",
925
930
  keyNotConfigured: "尚未配置 API Key",
@@ -952,9 +957,14 @@ window.__ModuleLoader__.load({
952
957
  endpointHintSeedream: "Volcengine Ark compatible /api/v3 base URL.",
953
958
  endpointHintDashScope: "Official Aliyun DashScope endpoint.",
954
959
  model: "Model",
960
+ saveToWorkspace: "Save to workspace",
961
+ saveToWorkspaceHint: "Write each generated image as a file into the session workspace.",
962
+ folder: "Workspace folder",
963
+ folderHint: "Subdirectory of the session workspace; empty means the workspace root.",
955
964
  saving: "Saving…",
956
965
  save: "Save",
957
966
  saved: "Saved",
967
+ savedToPath: "Saved to",
958
968
  checkingKey: "Checking API Key…",
959
969
  keyConfigured: "API Key configured",
960
970
  keyNotConfigured: "API Key not configured",
@@ -990,6 +1000,9 @@ window.__ModuleLoader__.load({
990
1000
  .dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}
991
1001
  .dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}
992
1002
  .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)}
1003
+ .dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}
1004
+ .dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}
1005
+ .dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}
993
1006
  .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}
994
1007
  .dsh-ig-save:disabled{opacity:.4;cursor:default}
995
1008
 
@@ -1117,6 +1130,8 @@ window.__ModuleLoader__.load({
1117
1130
  const [provider, setProvider] = (0, react.useState)("google");
1118
1131
  const [model, setModel] = (0, react.useState)("");
1119
1132
  const [baseURL, setBaseURL] = (0, react.useState)("");
1133
+ const [saveToWorkspace, setSaveToWorkspace] = (0, react.useState)(true);
1134
+ const [workspaceFolder, setWorkspaceFolder] = (0, react.useState)("dsh-image-gen");
1120
1135
  const [key, setKey] = (0, react.useState)("");
1121
1136
  const [configured, setConfigured] = (0, react.useState)();
1122
1137
  const [saving, setSaving] = (0, react.useState)(false);
@@ -1146,6 +1161,8 @@ window.__ModuleLoader__.load({
1146
1161
  setProvider(next);
1147
1162
  setModel(modelOf(next, value));
1148
1163
  setBaseURL(baseURLOf(next, value));
1164
+ setSaveToWorkspace(value?.saveToWorkspace ?? true);
1165
+ setWorkspaceFolder(value?.workspaceFolder ?? "dsh-image-gen");
1149
1166
  }, [snapshot]);
1150
1167
  (0, react.useEffect)(() => {
1151
1168
  let active = true;
@@ -1166,6 +1183,8 @@ window.__ModuleLoader__.load({
1166
1183
  await props.scope.set("provider", provider);
1167
1184
  await props.scope.set(provider === "google" ? "googleModel" : provider === "openai" ? "openaiModel" : provider === "seedream" ? "seedreamModel" : "dashscopeModel", model);
1168
1185
  await props.scope.set(provider === "google" ? "googleEndpoint" : provider === "openai" ? "openaiBaseURL" : provider === "seedream" ? "seedreamBaseURL" : "dashscopeEndpoint", baseURL);
1186
+ await props.scope.set("saveToWorkspace", saveToWorkspace);
1187
+ await props.scope.set("workspaceFolder", workspaceFolder.trim());
1169
1188
  if (key.trim().length > 0) {
1170
1189
  const response = await props.credentials.set({
1171
1190
  ref: KEY_REF[provider],
@@ -1334,6 +1353,46 @@ window.__ModuleLoader__.load({
1334
1353
  required: true
1335
1354
  })]
1336
1355
  }),
1356
+ (0, react_jsx_runtime.jsxs)("div", {
1357
+ className: "dsh-ig-field",
1358
+ children: [(0, react_jsx_runtime.jsxs)("label", {
1359
+ className: "dsh-ig-check-row",
1360
+ children: [(0, react_jsx_runtime.jsx)("input", {
1361
+ type: "checkbox",
1362
+ checked: saveToWorkspace,
1363
+ onChange: (event) => {
1364
+ setSaveToWorkspace(event.target.checked);
1365
+ }
1366
+ }), (0, react_jsx_runtime.jsx)("span", {
1367
+ className: "dsh-ig-label",
1368
+ children: t("saveToWorkspace")
1369
+ })]
1370
+ }), (0, react_jsx_runtime.jsx)("span", {
1371
+ className: "dsh-ig-hint",
1372
+ children: t("saveToWorkspaceHint")
1373
+ })]
1374
+ }),
1375
+ saveToWorkspace ? (0, react_jsx_runtime.jsxs)("label", {
1376
+ className: "dsh-ig-field",
1377
+ children: [
1378
+ (0, react_jsx_runtime.jsx)("span", {
1379
+ className: "dsh-ig-label",
1380
+ children: t("folder")
1381
+ }),
1382
+ (0, react_jsx_runtime.jsx)("input", {
1383
+ className: "dsh-ig-input",
1384
+ value: workspaceFolder,
1385
+ onChange: (event) => {
1386
+ setWorkspaceFolder(event.target.value);
1387
+ },
1388
+ placeholder: "dsh-image-gen"
1389
+ }),
1390
+ (0, react_jsx_runtime.jsx)("span", {
1391
+ className: "dsh-ig-hint",
1392
+ children: t("folderHint")
1393
+ })
1394
+ ]
1395
+ }) : null,
1337
1396
  (0, react_jsx_runtime.jsxs)("div", {
1338
1397
  className: "dsh-ig-actions",
1339
1398
  children: [(0, react_jsx_runtime.jsx)("p", {
@@ -1354,6 +1413,7 @@ window.__ModuleLoader__.load({
1354
1413
  /** Render the durable attachment referenced by a completed image tool call. */
1355
1414
  function GeneratedImageCard(props) {
1356
1415
  const attachment = imageRef(props.block);
1416
+ const savedTo = imageSavedTo(props.block);
1357
1417
  const [url, setUrl] = (0, react.useState)();
1358
1418
  const [blob, setBlob] = (0, react.useState)();
1359
1419
  const [error, setError] = (0, react.useState)();
@@ -1457,6 +1517,14 @@ window.__ModuleLoader__.load({
1457
1517
  className: "dsh-ig-result-title",
1458
1518
  children: t("generatedTitle")
1459
1519
  }),
1520
+ savedTo !== void 0 ? (0, react_jsx_runtime.jsxs)("div", {
1521
+ className: "dsh-ig-savedto",
1522
+ children: [
1523
+ t("savedToPath"),
1524
+ ": ",
1525
+ savedTo
1526
+ ]
1527
+ }) : null,
1460
1528
  error !== void 0 ? (0, react_jsx_runtime.jsx)("div", {
1461
1529
  className: "dsh-ig-error",
1462
1530
  children: error
@@ -1595,6 +1663,12 @@ window.__ModuleLoader__.load({
1595
1663
  const image = block.resultView.content?.find((item) => item.type === "image");
1596
1664
  return image?.type === "image" ? image.attachment : void 0;
1597
1665
  }
1666
+ /** The workspace file path a completed image call saved, when the result meta carries one. */
1667
+ function imageSavedTo(block) {
1668
+ if (!("kind" in block)) return void 0;
1669
+ const meta = block.meta ?? block.resultView?.meta;
1670
+ return typeof meta?.savedTo === "string" ? meta.savedTo : void 0;
1671
+ }
1598
1672
  //#endregion
1599
1673
  exports.GeneratedImageCard = GeneratedImageCard;
1600
1674
  exports.ImageGenerationSettingsCard = ImageGenerationSettingsCard;
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["DICT","useState","useMemo","_jsxs","_jsx","useState","_jsxs","_jsx"],"sources":["types/shared.js","types/client/gallery-store.js","types/client/gallery-view.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope'];\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';\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 = 'wanx2.1-t2i-turbo';\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};\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};\n//# sourceMappingURL=shared.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n const record = {\n ...item,\n createdAt: item.createdAt ?? Date.now(),\n };\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req = store.put(record);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English).\n */\nimport { useEffect, useState, useMemo } from 'react';\nimport { IMAGE_ROUTE } from '../shared.js';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n totalCount: '共 {count} 张生成图片',\n searchPlaceholder: '搜索 Prompt 关键词…',\n filterAll: '全部厂商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或选择其他厂商。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n },\n en: {\n totalCount: '{count} images total',\n searchPlaceholder: 'Search prompt keywords…',\n filterAll: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or provider filter.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n },\n};\nexport const GalleryViewTab = ({ locale }) => {\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n useEffect(() => {\n if (!previewItem)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape') {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [previewItem]);\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n if (selectedProvider !== 'all' && item.provider !== selectedProvider)\n return false;\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n if (!matchPrompt && !matchModel)\n return false;\n }\n return true;\n });\n }, [items, search, selectedProvider]);\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-gallery-page-header\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-page-title-row\", children: _jsx(\"span\", { className: \"dsh-ig-gallery-page-count\", children: t('totalCount', { count: String(items.length) }) }) }), _jsxs(\"div\", { className: \"dsh-ig-gallery-page-tools\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-search-wrap\", children: [_jsxs(\"svg\", { className: \"dsh-ig-gallery-search-icon\", width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"circle\", { cx: \"11\", cy: \"11\", r: \"8\" }), _jsx(\"line\", { x1: \"21\", y1: \"21\", x2: \"16.65\", y2: \"16.65\" })] }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-gallery-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(\"select\", { className: \"dsh-ig-gallery-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAll') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') })] })] })] }), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item) => (_jsx(GalleryCard, { item: item, t: t, onPreview: (url, blob) => {\n setPreviewItem(item);\n setPreviewUrl(url);\n setPreviewBlob(blob);\n }, onToast: showToast }, item.id))) })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), previewItem && previewUrl && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: _jsxs(\"svg\", { width: \"18\", height: \"18\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }), _jsx(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })] }) })] }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt }) }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: async () => {\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(previewItem.id);\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n showToast(t('deleted'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, t, onPreview, onToast }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-card\", onClick: () => {\n if (url && blob)\n onPreview(url, blob);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: async (e) => {\n e.stopPropagation();\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(item.id);\n onToast(t('deleted'));\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-header\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: item.provider }), item.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: item.model })) : null] }), _jsx(\"p\", { className: \"dsh-ig-gallery-card-prompt\", title: item.prompt, children: item.prompt })] })] }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/** Web settings and generated-image cards contributed by the Bundle. */\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, } from '../shared.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n 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 model: '模型',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n 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 model: 'Model',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\r\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\r\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\r\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\r\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\r\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\r\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\r\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\r\n.dsh-ig-chevron-open{transform:rotate(180deg)}\r\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\r\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\r\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\r\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\r\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\r\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\r\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\r\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\r\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\r\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\r\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\r\n\r\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\r\n.dsh-ig-result-title{font-size:14px;font-weight:600}\r\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\r\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\r\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\r\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\r\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\r\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\r\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\r\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\r\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\r\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\r\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\r\n\r\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\r\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\r\n.dsh-ig-gallery-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 28px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\r\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\r\n.dsh-ig-gallery-page-count{font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#4b5563);background:var(--dsw-alias-bg-layer-3,#f3f4f6);padding:3px 10px;border-radius:20px}\r\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\r\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\r\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\r\n.dsh-ig-gallery-search-input{padding:6px 12px 6px 32px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;width:200px;transition:border-color .15s,width .2s}\r\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\r\n.dsh-ig-gallery-select{padding:6px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;cursor:pointer}\r\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\r\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\r\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\r\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.06);border-color:var(--dsw-alias-border-l1,#cfd4dc)}\r\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f3f4f6;overflow:hidden;display:flex;align-items:center;justify-content:center}\r\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\r\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\r\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\r\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\r\n\r\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\r\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\r\n.dsh-ig-card-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:4px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.68);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\r\n\r\n.dsh-ig-gallery-card-meta{padding:12px 14px;display:flex;flex-direction:column;gap:6px;background:var(--dsw-alias-bg-layer-2,#fff);flex:1}\r\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\r\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\r\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\r\n.dsh-ig-gallery-card-prompt{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-primary,inherit);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\r\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#7b818b)}\r\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\r\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\r\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\r\n\r\n/* Pure Centered Lightbox */\r\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\r\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\r\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\r\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\r\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\r\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\r\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\r\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\r\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\r\n.dsh-ig-lightbox-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end;border-top:1px solid rgba(255,255,255,0.1);padding-top:8px}\r\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\r\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\r\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\r\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\r\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\r\n\r\n/* Hide floating chat composer when gallery page is active */\r\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\r\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const { api } = ctx.get('connection');\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n const locale = ctx.get('locale');\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = STYLE;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n // 1. Settings item\n ctx.slots.inject('settings.plugin.item', () => register({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials: api.credentials, locale }),\n }, ImageGenerationSettingsCard));\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n };\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 }, [snapshot]);\n useEffect(() => {\n let active = true;\n void props.credentials.describe({ refs: [KEY_REF[provider]] }).then(response => {\n if (active)\n setConfigured(response.result.ok ? response.result.value.credentials[KEY_REF[provider]]?.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 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 if (key.trim().length > 0) {\n const response = await props.credentials.set({ ref: KEY_REF[provider], value: key.trim() });\n if (!response.result.ok)\n throw new Error(response.result.error.message);\n setKey('');\n setConfigured(true);\n }\n setMessage(t('saved'));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n 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(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), _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] }) })] }), _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') : t('endpointHintDashScope') })] }), _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(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: \"dsh-ig-status\", role: \"status\", children: message || keyStatus }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable, children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Render the durable attachment referenced by a completed image tool call. */\nexport function GeneratedImageCard(props) {\n const attachment = imageRef(props.block);\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (attachment === undefined)\n return;\n const blockAny = props.block;\n const meta = blockAny.meta ?? blockAny.resultView?.meta;\n const prompt = typeof meta?.prompt === 'string' ? meta.prompt : blockAny.call?.args?.prompt ?? 'Generated Image';\n const provider = (typeof meta?.provider === 'string' ? meta.provider : 'google');\n const model = typeof meta?.model === 'string' ? meta.model : '';\n const output = typeof meta?.output === 'string' ? meta.output : '';\n void saveGalleryItem({\n id: attachment.attachmentId,\n attachment,\n prompt,\n provider,\n model,\n output,\n });\n }, [attachment?.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : value?.dashscopeModel;\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 : value?.dashscopeEndpoint;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\nfunction imageRef(block) { if (!('kind' in block) || block.resultView?.card !== 'generic')\n return undefined; const image = block.resultView.content?.find(item => item.type === 'image'); return image?.type === 'image' ? image.attachment : undefined; }\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["DICT","useState","useMemo","_jsxs","_jsx","useState","_jsxs","_jsx"],"sources":["types/shared.js","types/client/gallery-store.js","types/client/gallery-view.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope'];\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';\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 = 'wanx2.1-t2i-turbo';\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};\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};\n//# sourceMappingURL=shared.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n const record = {\n ...item,\n createdAt: item.createdAt ?? Date.now(),\n };\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req = store.put(record);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English).\n */\nimport { useEffect, useState, useMemo } from 'react';\nimport { IMAGE_ROUTE } from '../shared.js';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n totalCount: '共 {count} 张生成图片',\n searchPlaceholder: '搜索 Prompt 关键词…',\n filterAll: '全部厂商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或选择其他厂商。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n },\n en: {\n totalCount: '{count} images total',\n searchPlaceholder: 'Search prompt keywords…',\n filterAll: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or provider filter.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n },\n};\nexport const GalleryViewTab = ({ locale }) => {\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n useEffect(() => {\n if (!previewItem)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape') {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [previewItem]);\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n if (selectedProvider !== 'all' && item.provider !== selectedProvider)\n return false;\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n if (!matchPrompt && !matchModel)\n return false;\n }\n return true;\n });\n }, [items, search, selectedProvider]);\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-gallery-page-header\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-page-title-row\", children: _jsx(\"span\", { className: \"dsh-ig-gallery-page-count\", children: t('totalCount', { count: String(items.length) }) }) }), _jsxs(\"div\", { className: \"dsh-ig-gallery-page-tools\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-search-wrap\", children: [_jsxs(\"svg\", { className: \"dsh-ig-gallery-search-icon\", width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"circle\", { cx: \"11\", cy: \"11\", r: \"8\" }), _jsx(\"line\", { x1: \"21\", y1: \"21\", x2: \"16.65\", y2: \"16.65\" })] }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-gallery-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(\"select\", { className: \"dsh-ig-gallery-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAll') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') })] })] })] }), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item) => (_jsx(GalleryCard, { item: item, t: t, onPreview: (url, blob) => {\n setPreviewItem(item);\n setPreviewUrl(url);\n setPreviewBlob(blob);\n }, onToast: showToast }, item.id))) })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), previewItem && previewUrl && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: _jsxs(\"svg\", { width: \"18\", height: \"18\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }), _jsx(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })] }) })] }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt }) }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: async () => {\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(previewItem.id);\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n showToast(t('deleted'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, t, onPreview, onToast }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-card\", onClick: () => {\n if (url && blob)\n onPreview(url, blob);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: async (e) => {\n e.stopPropagation();\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(item.id);\n onToast(t('deleted'));\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-header\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: item.provider }), item.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: item.model })) : null] }), _jsx(\"p\", { className: \"dsh-ig-gallery-card-prompt\", title: item.prompt, children: item.prompt })] })] }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/** Web settings and generated-image cards contributed by the Bundle. */\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, } from '../shared.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n 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 model: '模型',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n 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 model: 'Model',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\r\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\r\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\r\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\r\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\r\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\r\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\r\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\r\n.dsh-ig-chevron-open{transform:rotate(180deg)}\r\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\r\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\r\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\r\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\r\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\r\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\r\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\r\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\r\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\r\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\r\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\r\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\r\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\r\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\r\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\r\n\r\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\r\n.dsh-ig-result-title{font-size:14px;font-weight:600}\r\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\r\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\r\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\r\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\r\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\r\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\r\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\r\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\r\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\r\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\r\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\r\n\r\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\r\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\r\n.dsh-ig-gallery-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 28px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\r\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\r\n.dsh-ig-gallery-page-count{font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#4b5563);background:var(--dsw-alias-bg-layer-3,#f3f4f6);padding:3px 10px;border-radius:20px}\r\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\r\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\r\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\r\n.dsh-ig-gallery-search-input{padding:6px 12px 6px 32px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;width:200px;transition:border-color .15s,width .2s}\r\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\r\n.dsh-ig-gallery-select{padding:6px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;cursor:pointer}\r\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\r\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\r\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\r\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.06);border-color:var(--dsw-alias-border-l1,#cfd4dc)}\r\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f3f4f6;overflow:hidden;display:flex;align-items:center;justify-content:center}\r\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\r\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\r\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\r\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\r\n\r\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\r\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\r\n.dsh-ig-card-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:4px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.68);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\r\n\r\n.dsh-ig-gallery-card-meta{padding:12px 14px;display:flex;flex-direction:column;gap:6px;background:var(--dsw-alias-bg-layer-2,#fff);flex:1}\r\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\r\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\r\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\r\n.dsh-ig-gallery-card-prompt{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-primary,inherit);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\r\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#7b818b)}\r\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\r\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\r\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\r\n\r\n/* Pure Centered Lightbox */\r\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\r\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\r\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\r\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\r\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\r\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\r\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\r\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\r\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\r\n.dsh-ig-lightbox-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end;border-top:1px solid rgba(255,255,255,0.1);padding-top:8px}\r\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\r\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\r\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\r\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\r\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\r\n\r\n/* Hide floating chat composer when gallery page is active */\r\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\r\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const { api } = ctx.get('connection');\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n const locale = ctx.get('locale');\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = STYLE;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n // 1. Settings item\n ctx.slots.inject('settings.plugin.item', () => register({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials: api.credentials, locale }),\n }, ImageGenerationSettingsCard));\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n };\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 setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n let active = true;\n void props.credentials.describe({ refs: [KEY_REF[provider]] }).then(response => {\n if (active)\n setConfigured(response.result.ok ? response.result.value.credentials[KEY_REF[provider]]?.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 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 await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const response = await props.credentials.set({ ref: KEY_REF[provider], value: key.trim() });\n if (!response.result.ok)\n throw new Error(response.result.error.message);\n setKey('');\n setConfigured(true);\n }\n setMessage(t('saved'));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n 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(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), _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] }) })] }), _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') : t('endpointHintDashScope') })] }), _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(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: \"dsh-ig-status\", role: \"status\", children: message || keyStatus }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable, children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Render the durable attachment referenced by a completed image tool call. */\nexport function GeneratedImageCard(props) {\n const attachment = imageRef(props.block);\n const savedTo = imageSavedTo(props.block);\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (attachment === undefined)\n return;\n const blockAny = props.block;\n const meta = blockAny.meta ?? blockAny.resultView?.meta;\n const prompt = typeof meta?.prompt === 'string' ? meta.prompt : blockAny.call?.args?.prompt ?? 'Generated Image';\n const provider = (typeof meta?.provider === 'string' ? meta.provider : 'google');\n const model = typeof meta?.model === 'string' ? meta.model : '';\n const output = typeof meta?.output === 'string' ? meta.output : '';\n void saveGalleryItem({\n id: attachment.attachmentId,\n attachment,\n prompt,\n provider,\n model,\n output,\n });\n }, [attachment?.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), savedTo !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-savedto\", children: [t('savedToPath'), \": \", savedTo] }) : null, error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : value?.dashscopeModel;\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 : value?.dashscopeEndpoint;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\nfunction imageRef(block) { if (!('kind' in block) || block.resultView?.card !== 'generic')\n return undefined; const image = block.resultView.content?.find(item => item.type === 'image'); return image?.type === 'image' ? image.attachment : undefined; }\n/** The workspace file path a completed image call saved, when the result meta carries one. */\nfunction imageSavedTo(block) {\n if (!('kind' in block))\n return undefined;\n const meta = block.meta\n ?? block.resultView?.meta;\n return typeof meta?.savedTo === 'string' ? meta.savedTo : undefined;\n}\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -2,6 +2,9 @@ import { credentialRef } from "@deepseek-ai/dsh-credentials";
2
2
  import { installSettingsSection, settingsNamespace } from "@deepseek-ai/dsh-settings";
3
3
  import { defineTool } from "@deepseek-ai/dsh-tools";
4
4
  import z from "@deepseek-ai/schemastery";
5
+ import { randomUUID } from "node:crypto";
6
+ import { mkdir, realpath, rename, unlink, writeFile } from "node:fs/promises";
7
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
5
8
  //#region lib/types/shared.js
6
9
  /** Values shared by the Host and browser Bundle faces. */
7
10
  /** Browser route used by the generated-image card. */
@@ -28,6 +31,8 @@ const DEFAULT_DASHSCOPE_MODEL = "wanx2.1-t2i-turbo";
28
31
  //#endregion
29
32
  //#region lib/types/config.js
30
33
  /** User-facing configuration for supported image providers. */
34
+ /** Default workspace subfolder that receives generated image files. */
35
+ const DEFAULT_WORKSPACE_FOLDER = "dsh-image-gen";
31
36
  /** Google API credential reference. */
32
37
  const GOOGLE_API_KEY_ENV = "GEMINI_API_KEY";
33
38
  /** OpenAI Platform or compatible relay credential reference. */
@@ -46,7 +51,9 @@ const Config = z.object({
46
51
  seedreamBaseURL: z.string().default(DEFAULT_SEEDREAM_BASE_URL),
47
52
  seedreamModel: z.string().default(DEFAULT_SEEDREAM_MODEL),
48
53
  dashscopeEndpoint: z.string().default(DEFAULT_DASHSCOPE_ENDPOINT),
49
- dashscopeModel: z.string().default(DEFAULT_DASHSCOPE_MODEL)
54
+ dashscopeModel: z.string().default(DEFAULT_DASHSCOPE_MODEL),
55
+ saveToWorkspace: z.boolean().default(true),
56
+ workspaceFolder: z.string().default(DEFAULT_WORKSPACE_FOLDER)
50
57
  });
51
58
  /** Resolve exactly one provider profile for a tool call. */
52
59
  function resolveProvider(config) {
@@ -458,6 +465,122 @@ async function readBoundedBytes(response, maxBytes) {
458
465
  return joined;
459
466
  }
460
467
  //#endregion
468
+ //#region lib/types/workspace-save.js
469
+ /** Persist one generated image as a file under the session workspace. */
470
+ /** File extension for each supported image media type. */
471
+ const EXTENSION = {
472
+ "image/png": "png",
473
+ "image/jpeg": "jpg",
474
+ "image/webp": "webp",
475
+ "image/gif": "gif"
476
+ };
477
+ /**
478
+ * Build the deterministic file name for a generated image:
479
+ * `image-<digest-prefix>.<ext>`. The digest prefix comes from the
480
+ * content-addressed attachment id, so the same image bytes always map to the
481
+ * same file name regardless of when they were generated, and re-saving simply
482
+ * overwrites the previous copy in place.
483
+ * @param attachmentId - durable attachment id (`sha256:<hex>`).
484
+ * @param mediaType - verified image media type.
485
+ * @returns the file name (no directory).
486
+ */
487
+ function workspaceImageName(attachmentId, mediaType) {
488
+ return `image-${(attachmentId.startsWith("sha256:") ? attachmentId.slice(7) : attachmentId).slice(0, 8).padEnd(8, "0")}.${EXTENSION[mediaType]}`;
489
+ }
490
+ /**
491
+ * Resolve the configured image folder inside the session workspace. The
492
+ * folder may nest, but must stay inside the workspace: absolute paths and
493
+ * parent-traversal segments are rejected for both separator styles.
494
+ *
495
+ * This lexical pass is necessary but not sufficient: `saveImageToWorkspace`
496
+ * additionally verifies the on-disk resolution so symlinked folders cannot
497
+ * escape the workspace.
498
+ * @param workspaceRoot - the session workspace directory.
499
+ * @param folder - configured subfolder; empty/blank means the workspace root.
500
+ * @returns the absolute image directory.
501
+ * @throws when the folder would escape the workspace root.
502
+ */
503
+ function workspaceImageDir(workspaceRoot, folder) {
504
+ const trimmed = (folder ?? "").trim();
505
+ const root = resolve(workspaceRoot);
506
+ const dir = trimmed === "" ? root : resolve(root, trimmed);
507
+ if (!containsPath(root, dir)) throw new Error(`image workspace folder '${folder}' must stay inside the session workspace`);
508
+ return dir;
509
+ }
510
+ /** True when `child` equals `parent` or lives underneath it (lexically). */
511
+ function containsPath(parent, child) {
512
+ const rel = relative(parent, child);
513
+ return rel === "" || rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
514
+ }
515
+ /**
516
+ * Real path of the closest existing ancestor of `dir` (inclusive). Walking up
517
+ * lets us validate symlinked folder segments before creating anything under
518
+ * them.
519
+ */
520
+ async function nearestExistingRealPath(dir) {
521
+ let probe = dir;
522
+ for (;;) try {
523
+ return await realpath(probe);
524
+ } catch (error) {
525
+ if (error?.code !== "ENOENT") throw error;
526
+ const parent = dirname(probe);
527
+ if (parent === probe) throw error;
528
+ probe = parent;
529
+ }
530
+ }
531
+ /** Reject a directory whose on-disk resolution lands outside the workspace. */
532
+ function assertInsideWorkspace(realRoot, candidate, folder) {
533
+ if (containsPath(realRoot, candidate)) return;
534
+ throw new Error(`image workspace folder '${folder ?? ""}' must stay inside the session workspace (${candidate} resolves outside ${realRoot})`);
535
+ }
536
+ /**
537
+ * Write one generated image durably under the session workspace.
538
+ *
539
+ * Containment is enforced twice: lexically by `workspaceImageDir`, then
540
+ * against real paths, so a configured folder (or any intermediate segment)
541
+ * that is a symlink pointing outside the workspace is rejected before and
542
+ * after anything is created.
543
+ *
544
+ * The bytes are written to a same-directory staging file and renamed onto the
545
+ * target, so a crash never leaves a half-written image under its final name.
546
+ * Re-saving identical bytes rewrites the same file (the name is content-
547
+ * addressed), which keeps repeated generations idempotent. A cancellation is
548
+ * honoured up to and including the final rename: an aborted save never
549
+ * resolves successfully and never leaves the image behind under its final
550
+ * name.
551
+ * @param options - workspace root, configured folder, attachment identity, and image bytes.
552
+ * @returns the absolute path of the written file.
553
+ */
554
+ async function saveImageToWorkspace(options) {
555
+ const dir = workspaceImageDir(options.workspaceRoot, options.folder);
556
+ options.signal?.throwIfAborted();
557
+ const realRoot = await realpath(resolve(options.workspaceRoot));
558
+ assertInsideWorkspace(realRoot, await nearestExistingRealPath(dir), options.folder);
559
+ const name = workspaceImageName(options.attachmentId, options.mediaType);
560
+ const target = join(dir, name);
561
+ const staging = join(dir, `.${name}.${process.pid}-${randomUUID()}.tmp`);
562
+ await mkdir(dir, { recursive: true });
563
+ assertInsideWorkspace(realRoot, await realpath(dir), options.folder);
564
+ try {
565
+ await writeFile(staging, options.data, {
566
+ flag: "wx",
567
+ signal: options.signal
568
+ });
569
+ options.signal?.throwIfAborted();
570
+ await rename(staging, target);
571
+ } catch (error) {
572
+ await unlink(staging).catch(() => {});
573
+ throw error;
574
+ }
575
+ try {
576
+ options.signal?.throwIfAborted();
577
+ } catch (error) {
578
+ await unlink(target).catch(() => {});
579
+ throw error;
580
+ }
581
+ return target;
582
+ }
583
+ //#endregion
461
584
  //#region lib/types/index.js
462
585
  /** Cordis plugin name. */
463
586
  const name = "dsh-image-gen";
@@ -484,7 +607,7 @@ function apply(ctx, config = {}) {
484
607
  }), "dsh-image-gen: image route");
485
608
  ctx.tools.register(defineTool({
486
609
  name: "generate_image",
487
- description: "Generate one image with the configured image provider. Use when the user explicitly asks to create or draw an image. Give a complete visual prompt including subject, composition, style, lighting, and any exact text that should appear. A successful image is already attached directly to the conversation and has no local file path; do not call read, glob, or other tools to locate or verify it.",
610
+ description: "Generate one image with the configured image provider. Use when the user explicitly asks to create or draw an image. Give a complete visual prompt including subject, composition, style, lighting, and any exact text that should appear. A successful image is already attached directly to the conversation; with workspace saving enabled (the default) it is also written as a file under the session workspace, and the result's savedTo field carries that absolute file path. Do not call read, glob, or other tools to locate or verify the image.",
488
611
  parameters: {
489
612
  prompt: {
490
613
  type: "string",
@@ -562,19 +685,25 @@ function apply(ctx, config = {}) {
562
685
  output: {
563
686
  type: "string",
564
687
  required: true
565
- }
688
+ },
689
+ savedTo: { type: "string" },
690
+ saveError: { type: "string" }
566
691
  }
567
692
  },
568
- render: (_args, value) => [{
569
- type: "text",
570
- text: `Generated one image with ${value.provider}/${value.model} (${value.output}). It is already attached to the conversation with no local file path; respond to the user without reading or searching for it.`
571
- }],
693
+ render: (_args, value) => {
694
+ const saved = typeof value.savedTo === "string" ? ` It was also saved to the workspace as ${value.savedTo}.` : typeof value.saveError === "string" ? ` Saving it to the workspace failed: ${value.saveError}.` : " It has no local file path.";
695
+ return [{
696
+ type: "text",
697
+ text: `Generated one image with ${value.provider}/${value.model} (${value.output}). It is already attached to the conversation.${saved} Respond to the user without reading or searching for the image.`
698
+ }];
699
+ },
572
700
  presentationMeta: (args, value) => ({
573
701
  kind: "dsh-image-gen",
574
702
  attachment: value.attachment,
575
703
  provider: value.provider,
576
704
  model: value.model,
577
705
  output: value.output,
706
+ ...typeof value.savedTo === "string" ? { savedTo: value.savedTo } : {},
578
707
  prompt: args.prompt
579
708
  })
580
709
  },
@@ -594,7 +723,7 @@ function apply(ctx, config = {}) {
594
723
  imageSize,
595
724
  maxBytes: ctx.attachments.imageLimits.maxImageBytes,
596
725
  signal: exec.signal
597
- }), active.provider, active.model, `${aspectRatio}, ${imageSize}`);
726
+ }), active.provider, active.model, `${aspectRatio}, ${imageSize}`, current(), exec);
598
727
  }
599
728
  if (active.provider === "dashscope") {
600
729
  const size = args.size ?? active.imageSize;
@@ -606,7 +735,7 @@ function apply(ctx, config = {}) {
606
735
  size,
607
736
  maxBytes: ctx.attachments.imageLimits.maxImageBytes,
608
737
  signal: exec.signal
609
- }), active.provider, active.model, size);
738
+ }), active.provider, active.model, size, current(), exec);
610
739
  }
611
740
  const size = args.size ?? active.imageSize;
612
741
  return saveGenerated(ctx, await generateOpenAICompatibleImage({
@@ -618,23 +747,48 @@ function apply(ctx, config = {}) {
618
747
  size,
619
748
  maxBytes: ctx.attachments.imageLimits.maxImageBytes,
620
749
  signal: exec.signal
621
- }), active.provider, active.model, size);
750
+ }), active.provider, active.model, size, current(), exec);
622
751
  },
623
752
  presentResult: (_args, result) => imagePresentation(result)
624
753
  }));
625
754
  }
626
- async function saveGenerated(ctx, generated, provider, model, output) {
755
+ /**
756
+ * Persist the generated image as a durable attachment, then — when workspace
757
+ * saving is enabled — also write it as a file under the calling agent's
758
+ * session workspace. A workspace write failure never discards the generated
759
+ * attachment: it is reported through `saveError` instead.
760
+ */
761
+ async function saveGenerated(ctx, generated, provider, model, output, config, exec) {
627
762
  if (!ctx.attachments.imageLimits.mediaTypes.includes(generated.mediaType)) throw new Error(`This DSH deployment does not accept ${generated.mediaType} generated images`);
628
- return {
629
- attachment: await ctx.attachments.saveImage({
630
- data: generated.data,
631
- mediaType: generated.mediaType,
632
- name: "generated-image"
633
- }),
763
+ const attachment = await ctx.attachments.saveImage({
764
+ data: generated.data,
765
+ mediaType: generated.mediaType,
766
+ name: "generated-image"
767
+ });
768
+ const value = {
769
+ attachment,
634
770
  provider,
635
771
  model,
636
772
  output
637
773
  };
774
+ if (config.saveToWorkspace === false) return value;
775
+ const workspaceRoot = exec.agent?.session.header.cwd;
776
+ if (workspaceRoot === void 0) return value;
777
+ try {
778
+ value.savedTo = await saveImageToWorkspace({
779
+ workspaceRoot,
780
+ folder: config.workspaceFolder,
781
+ attachmentId: attachment.attachmentId,
782
+ mediaType: generated.mediaType,
783
+ data: generated.data,
784
+ signal: exec.signal
785
+ });
786
+ } catch (error) {
787
+ exec.signal.throwIfAborted();
788
+ ctx.logger.warn(`dsh-image-gen: failed to save image to workspace: ${error instanceof Error ? error.message : String(error)}`);
789
+ value.saveError = error instanceof Error ? error.message : String(error);
790
+ }
791
+ return value;
638
792
  }
639
793
  function imagePresentation(result) {
640
794
  const attachment = imageAttachmentFromMeta(result.meta);
@@ -15,6 +15,8 @@ interface ImageSettings {
15
15
  seedreamModel?: string;
16
16
  dashscopeEndpoint?: string;
17
17
  dashscopeModel?: string;
18
+ saveToWorkspace?: boolean;
19
+ workspaceFolder?: string;
18
20
  }
19
21
  interface SettingsFace {
20
22
  scope: SettingsScope<ImageSettings>;
@@ -2,6 +2,8 @@
2
2
  import z from '@deepseek-ai/schemastery';
3
3
  import { DEFAULT_DASHSCOPE_ENDPOINT, DEFAULT_DASHSCOPE_MODEL, DEFAULT_GOOGLE_ENDPOINT, DEFAULT_GOOGLE_MODEL, DEFAULT_OPENAI_BASE_URL, DEFAULT_OPENAI_MODEL, DEFAULT_SEEDREAM_BASE_URL, DEFAULT_SEEDREAM_MODEL, IMAGE_PROVIDERS, type ImageProvider } from './shared.js';
4
4
  export { DEFAULT_DASHSCOPE_ENDPOINT, DEFAULT_DASHSCOPE_MODEL, DEFAULT_GOOGLE_ENDPOINT, DEFAULT_GOOGLE_MODEL, DEFAULT_OPENAI_BASE_URL, DEFAULT_OPENAI_MODEL, DEFAULT_SEEDREAM_BASE_URL, DEFAULT_SEEDREAM_MODEL, IMAGE_PROVIDERS, type ImageProvider, };
5
+ /** Default workspace subfolder that receives generated image files. */
6
+ export declare const DEFAULT_WORKSPACE_FOLDER = "dsh-image-gen";
5
7
  /** Google API credential reference. */
6
8
  export declare const GOOGLE_API_KEY_ENV = "GEMINI_API_KEY";
7
9
  /** OpenAI Platform or compatible relay credential reference. */
@@ -26,6 +28,10 @@ export interface Config {
26
28
  seedreamModel?: string;
27
29
  dashscopeEndpoint?: string;
28
30
  dashscopeModel?: string;
31
+ /** Also write every generated image as a file under the session workspace. */
32
+ saveToWorkspace?: boolean;
33
+ /** Workspace subfolder for generated images; empty means the workspace root. */
34
+ workspaceFolder?: string;
29
35
  }
30
36
  /** Cordis configuration schema. */
31
37
  export declare const Config: z<Config>;
@@ -0,0 +1,52 @@
1
+ import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
2
+ /**
3
+ * Build the deterministic file name for a generated image:
4
+ * `image-<digest-prefix>.<ext>`. The digest prefix comes from the
5
+ * content-addressed attachment id, so the same image bytes always map to the
6
+ * same file name regardless of when they were generated, and re-saving simply
7
+ * overwrites the previous copy in place.
8
+ * @param attachmentId - durable attachment id (`sha256:<hex>`).
9
+ * @param mediaType - verified image media type.
10
+ * @returns the file name (no directory).
11
+ */
12
+ export declare function workspaceImageName(attachmentId: string, mediaType: ImageAttachmentRef['mediaType']): string;
13
+ /**
14
+ * Resolve the configured image folder inside the session workspace. The
15
+ * folder may nest, but must stay inside the workspace: absolute paths and
16
+ * parent-traversal segments are rejected for both separator styles.
17
+ *
18
+ * This lexical pass is necessary but not sufficient: `saveImageToWorkspace`
19
+ * additionally verifies the on-disk resolution so symlinked folders cannot
20
+ * escape the workspace.
21
+ * @param workspaceRoot - the session workspace directory.
22
+ * @param folder - configured subfolder; empty/blank means the workspace root.
23
+ * @returns the absolute image directory.
24
+ * @throws when the folder would escape the workspace root.
25
+ */
26
+ export declare function workspaceImageDir(workspaceRoot: string, folder: string | undefined): string;
27
+ /**
28
+ * Write one generated image durably under the session workspace.
29
+ *
30
+ * Containment is enforced twice: lexically by `workspaceImageDir`, then
31
+ * against real paths, so a configured folder (or any intermediate segment)
32
+ * that is a symlink pointing outside the workspace is rejected before and
33
+ * after anything is created.
34
+ *
35
+ * The bytes are written to a same-directory staging file and renamed onto the
36
+ * target, so a crash never leaves a half-written image under its final name.
37
+ * Re-saving identical bytes rewrites the same file (the name is content-
38
+ * addressed), which keeps repeated generations idempotent. A cancellation is
39
+ * honoured up to and including the final rename: an aborted save never
40
+ * resolves successfully and never leaves the image behind under its final
41
+ * name.
42
+ * @param options - workspace root, configured folder, attachment identity, and image bytes.
43
+ * @returns the absolute path of the written file.
44
+ */
45
+ export declare function saveImageToWorkspace(options: {
46
+ workspaceRoot: string;
47
+ folder?: string | undefined;
48
+ attachmentId: string;
49
+ mediaType: ImageAttachmentRef['mediaType'];
50
+ data: Uint8Array;
51
+ signal?: AbortSignal;
52
+ }): Promise<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-image-gen",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Bring ChatGPT-like image generation to DeepSeek Harness — Gemini, OpenAI, Seedream, DashScope & more.",
5
5
  "type": "module",
6
6
  "author": "shanliuling",