dsh-image-gen 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useState","_jsxs","_jsx"],"sources":["types/shared.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'];\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';\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_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_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};\n//# sourceMappingURL=shared.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';\nconst KEY_REF = { google: 'GEMINI_API_KEY', openai: 'OPENAI_API_KEY', seedream: 'ARK_API_KEY' };\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\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 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: 'Generated image',\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 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 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 },\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.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}\r\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\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.dsh-ig-modal{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\r\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\r\n.dsh-ig-modal-img{max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.6);user-select:none;cursor:default}\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}`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card and generated-image card. */\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 () => { style.remove(); };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n ctx.slots.inject('settings.plugin.item', () => register({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n id: IMAGE_GENERATION_NAMESPACE,\n order: 100,\n inject: () => ({ scope, credentials: api.credentials, locale }),\n }, ImageGenerationSettingsCard));\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({ name: 'tool.call.toolview', key: 'generate_image' }, GeneratedImageCard));\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 ?? '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 ?? '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 };\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' : 'seedreamModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : 'seedreamBaseURL', 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(\"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') : t('endpointHintSeedream') })] }), _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 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(`图片读取失败 (${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]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? '已复制图片' : '复制失败');\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: \"\\u6B63\\u5728\\u751F\\u6210\\u56FE\\u7247\\u2026\" });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": \"Generated image\", children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: \"Generated image\" }), error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: \"\\u6B63\\u5728\\u52A0\\u8F7D\\u56FE\\u7247\\u2026\" }) : 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: \"\\u590D\\u5236\\u56FE\\u7247\", 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: \"\\u4E0B\\u8F7D\\u56FE\\u7247\", 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: \"\\u65B0\\u6807\\u7B7E\\u9875\\u6253\\u5F00\", 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-modal\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"img\", { className: \"dsh-ig-modal-img\", src: url, alt: attachment.name ?? 'Generated image preview', onClick: (e) => { e.stopPropagation(); } }) }) : null] });\n}\nasync 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 => { canvas.toBlob(res, 'image/png'); });\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}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : value?.seedreamModel;\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 : value?.seedreamBaseURL;\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'];\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';\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_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_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};\n//# sourceMappingURL=shared.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'gallery_history';\nlet dbPromise = 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 };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\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 */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\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.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\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.delete(id);\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 delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Clear all gallery records.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\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.clear();\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 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, } 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 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 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 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 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(\"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') })] })] })] })] }))] }));\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\" })] }) })] })] }), _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 = { google: 'GEMINI_API_KEY', openai: 'OPENAI_API_KEY', seedream: 'ARK_API_KEY' };\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\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 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 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 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 = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s}\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n.dsh-ig-gallery-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 28px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-page-count{font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#4b5563);background:var(--dsw-alias-bg-layer-3,#f3f4f6);padding:3px 10px;border-radius:20px}\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\n.dsh-ig-gallery-search-input{padding:6px 12px 6px 32px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;width:200px;transition:border-color .15s,width .2s}\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\n.dsh-ig-gallery-select{padding:6px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;cursor:pointer}\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.06);border-color:var(--dsw-alias-border-l1,#cfd4dc)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f3f4f6;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:4px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.68);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n.dsh-ig-gallery-card-meta{padding:12px 14px;display:flex;flex-direction:column;gap:6px;background:var(--dsw-alias-bg-layer-2,#fff);flex:1}\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-gallery-card-prompt{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-primary,inherit);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end;border-top:1px solid rgba(255,255,255,0.1);padding-top:8px}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Hide floating chat composer when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const { 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 id: IMAGE_GENERATION_NAMESPACE,\n order: 100,\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 };\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' : 'seedreamModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : 'seedreamBaseURL', 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(\"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') : t('endpointHintSeedream') })] }), _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 : value?.seedreamModel;\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 : value?.seedreamBaseURL;\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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"}
package/lib/index.js CHANGED
@@ -459,9 +459,13 @@ function apply(ctx, config = {}) {
459
459
  type: "text",
460
460
  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.`
461
461
  }],
462
- presentationMeta: (_args, value) => ({
462
+ presentationMeta: (args, value) => ({
463
463
  kind: "dsh-image-gen",
464
- attachment: value.attachment
464
+ attachment: value.attachment,
465
+ provider: value.provider,
466
+ model: value.model,
467
+ output: value.output,
468
+ prompt: args.prompt
465
469
  })
466
470
  },
467
471
  async execute(args, exec) {
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Lightweight IndexedDB persistence layer for Image Generation Gallery.
3
+ * Stores lightweight metadata indexes; image binaries remain managed by DSH Attachment service.
4
+ */
5
+ import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
6
+ import type { ImageProvider } from '../shared.js';
7
+ export interface GalleryItem {
8
+ id: string;
9
+ attachment: ImageAttachmentRef;
10
+ prompt: string;
11
+ provider: ImageProvider;
12
+ model: string;
13
+ createdAt: number;
14
+ aspectRatio?: string;
15
+ imageSize?: string;
16
+ output?: string;
17
+ }
18
+ type GalleryListener = () => void;
19
+ /**
20
+ * Subscribe to gallery mutations (insert/delete/clear).
21
+ */
22
+ export declare function subscribeGallery(listener: GalleryListener): () => void;
23
+ /**
24
+ * Save or update a gallery record by attachmentId.
25
+ */
26
+ export declare function saveGalleryItem(item: Omit<GalleryItem, 'createdAt'> & {
27
+ createdAt?: number;
28
+ }): Promise<void>;
29
+ /**
30
+ * Retrieve all gallery records sorted by createdAt descending.
31
+ */
32
+ export declare function getGalleryItems(): Promise<GalleryItem[]>;
33
+ /**
34
+ * Delete a single gallery record by ID.
35
+ */
36
+ export declare function deleteGalleryItem(id: string): Promise<void>;
37
+ /**
38
+ * Clear all gallery records.
39
+ */
40
+ export declare function clearGallery(): Promise<void>;
41
+ export {};
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Native Workspace Gallery View Component for DSH `conversation.view` slot.
3
+ * Fully i18n-reactive (Chinese & English).
4
+ */
5
+ import { type FC } from 'react';
6
+ export interface LocaleService {
7
+ getSnapshot(): {
8
+ active: string;
9
+ };
10
+ subscribe(fn: () => void): () => void;
11
+ }
12
+ declare const DICT: {
13
+ readonly zh: {
14
+ readonly totalCount: "共 {count} 张生成图片";
15
+ readonly searchPlaceholder: "搜索 Prompt 关键词…";
16
+ readonly filterAll: "全部厂商";
17
+ readonly filterGoogle: "Google Gemini";
18
+ readonly filterOpenAI: "OpenAI / 中转站";
19
+ readonly filterSeedream: "字节 Seedream";
20
+ readonly emptyTitle: "暂无生图记录";
21
+ readonly emptyDesc: "在对话中让 Agent 生图后,生成的图片会自动收录到这里。";
22
+ readonly noMatchTitle: "未找到匹配结果";
23
+ readonly noMatchDesc: "尝试更换搜索关键词或选择其他厂商。";
24
+ readonly copiedPrompt: "已复制 Prompt";
25
+ readonly copiedImage: "已复制图片";
26
+ readonly copyFailed: "复制失败";
27
+ readonly preview: "查看大图";
28
+ readonly download: "下载图片";
29
+ readonly copyImg: "复制图片";
30
+ readonly copyPpt: "复制 Prompt";
31
+ readonly model: "模型";
32
+ readonly prompt: "Prompt";
33
+ readonly close: "关闭 (Esc)";
34
+ };
35
+ readonly en: {
36
+ readonly totalCount: "{count} images total";
37
+ readonly searchPlaceholder: "Search prompt keywords…";
38
+ readonly filterAll: "All Providers";
39
+ readonly filterGoogle: "Google Gemini";
40
+ readonly filterOpenAI: "OpenAI / Relay";
41
+ readonly filterSeedream: "ByteDance Seedream";
42
+ readonly emptyTitle: "No images generated yet";
43
+ readonly emptyDesc: "Images generated during conversations will automatically appear here.";
44
+ readonly noMatchTitle: "No matching images";
45
+ readonly noMatchDesc: "Try a different search keyword or provider filter.";
46
+ readonly copiedPrompt: "Prompt copied";
47
+ readonly copiedImage: "Image copied";
48
+ readonly copyFailed: "Copy failed";
49
+ readonly preview: "Full Preview";
50
+ readonly download: "Download";
51
+ readonly copyImg: "Copy Image";
52
+ readonly copyPpt: "Copy Prompt";
53
+ readonly model: "Model";
54
+ readonly prompt: "Prompt";
55
+ readonly close: "Close (Esc)";
56
+ };
57
+ };
58
+ export type DictKey = keyof typeof DICT.zh;
59
+ export declare const GalleryViewTab: FC<{
60
+ locale?: LocaleService;
61
+ }>;
62
+ export declare function copyImageBlob(blob: Blob): Promise<boolean>;
63
+ export {};
@@ -3,6 +3,7 @@ import type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client
3
3
  import type { SettingsScope } from '@deepseek-ai/dsh-client-runtime/client';
4
4
  import type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
5
5
  import { type ImageProvider } from '../shared.js';
6
+ import { type LocaleService } from './gallery-view.js';
6
7
  type Provider = ImageProvider;
7
8
  interface ImageSettings {
8
9
  provider?: Provider;
@@ -13,22 +14,19 @@ interface ImageSettings {
13
14
  seedreamBaseURL?: string;
14
15
  seedreamModel?: string;
15
16
  }
16
- interface LocaleService {
17
- getSnapshot(): {
18
- active: string;
19
- };
20
- subscribe(fn: () => void): () => void;
21
- }
22
17
  interface SettingsFace {
23
18
  scope: SettingsScope<ImageSettings>;
24
19
  credentials: ConnectionHandle['api']['credentials'];
25
20
  locale?: LocaleService | undefined;
26
21
  }
22
+ interface ImageCardFace {
23
+ locale?: LocaleService | undefined;
24
+ }
27
25
  type SettingsCardProps = PropsRuntime<'settings.plugin.item'> & InjectFace<SettingsFace>;
28
- type ImageCardProps = PropsRuntime<'tool.call.toolview'>;
26
+ type ImageCardProps = PropsRuntime<'tool.call.toolview'> & InjectFace<ImageCardFace>;
29
27
  /** Required browser services. */
30
28
  export declare const inject: string[];
31
- /** Mount the settings card and generated-image card. */
29
+ /** Mount the settings card, generated-image card, and native conversation gallery view. */
32
30
  export declare function apply(ctx: Context): void;
33
31
  /** Edit provider settings and its write-only API credential. */
34
32
  export declare function ImageGenerationSettingsCard(props: SettingsCardProps): import("react").JSX.Element;