dsh-image-gen 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +217 -33
- package/lib/client.js.map +1 -1
- package/lib/types/client/image-result-node.d.ts +53 -0
- package/lib/types/client/index.d.ts +13 -1
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -52,7 +52,7 @@ window.__ModuleLoader__.load({
|
|
|
52
52
|
}
|
|
53
53
|
if (!isRecord(value) || Object.keys(value).length === 0) throw new Error("ComfyUI workflow must be a non-empty API-format JSON object");
|
|
54
54
|
if (!Object.values(value).some((node) => {
|
|
55
|
-
const inputs = record(node)?.inputs;
|
|
55
|
+
const inputs = record$1(node)?.inputs;
|
|
56
56
|
return inputs !== void 0 && containsPromptPlaceholder(inputs);
|
|
57
57
|
})) throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);
|
|
58
58
|
return value;
|
|
@@ -65,7 +65,7 @@ window.__ModuleLoader__.load({
|
|
|
65
65
|
function isRecord(value) {
|
|
66
66
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
67
67
|
}
|
|
68
|
-
function record(value) {
|
|
68
|
+
function record$1(value) {
|
|
69
69
|
return isRecord(value) ? value : void 0;
|
|
70
70
|
}
|
|
71
71
|
//#endregion
|
|
@@ -941,6 +941,132 @@ window.__ModuleLoader__.load({
|
|
|
941
941
|
if (fromBlockContent?.type === "image") return fromBlockContent.attachment;
|
|
942
942
|
}
|
|
943
943
|
//#endregion
|
|
944
|
+
//#region lib/types/client/image-result-node.js
|
|
945
|
+
const IMAGE_RESULT_NODE_KIND = "dsh-image-result";
|
|
946
|
+
/** One image result row per Turn, re-anchored to Turn end after the final answer settles. */
|
|
947
|
+
const imageResultDefinition = {
|
|
948
|
+
kind: IMAGE_RESULT_NODE_KIND,
|
|
949
|
+
target: "chat",
|
|
950
|
+
match: (event) => {
|
|
951
|
+
const turn = eventTurn(event);
|
|
952
|
+
if (turn === void 0) return null;
|
|
953
|
+
if (event.type === "turn/start") return {
|
|
954
|
+
id: String(turn),
|
|
955
|
+
role: "start"
|
|
956
|
+
};
|
|
957
|
+
if (event.type === "turn/end") return {
|
|
958
|
+
id: String(turn),
|
|
959
|
+
role: "update"
|
|
960
|
+
};
|
|
961
|
+
if (event.type === "assistant/message") return {
|
|
962
|
+
id: String(turn),
|
|
963
|
+
role: "update"
|
|
964
|
+
};
|
|
965
|
+
if (event.type === "tool/result" && imageResultFromMeta(event.data.meta) !== void 0) return {
|
|
966
|
+
id: String(turn),
|
|
967
|
+
role: "update"
|
|
968
|
+
};
|
|
969
|
+
return null;
|
|
970
|
+
},
|
|
971
|
+
start: (_context, match) => {
|
|
972
|
+
const turn = eventTurn(match.event);
|
|
973
|
+
if (match.event.type !== "turn/start" || turn === void 0) throw new Error("dsh-image-result start requires turn/start");
|
|
974
|
+
return {
|
|
975
|
+
turn,
|
|
976
|
+
results: []
|
|
977
|
+
};
|
|
978
|
+
},
|
|
979
|
+
update: (context, match) => {
|
|
980
|
+
if (match.event.type === "turn/end") return {
|
|
981
|
+
...context.state,
|
|
982
|
+
endSeq: match.event.seq
|
|
983
|
+
};
|
|
984
|
+
if (match.event.type === "assistant/message") return {
|
|
985
|
+
...context.state,
|
|
986
|
+
answerSeq: match.event.seq
|
|
987
|
+
};
|
|
988
|
+
if (match.event.type !== "tool/result") return context.state;
|
|
989
|
+
const result = imageResultFromMeta(match.event.data.meta);
|
|
990
|
+
if (result === void 0) return context.state;
|
|
991
|
+
if (context.state.results.some((candidate) => candidate.attachment.attachmentId === result.attachment.attachmentId)) return context.state;
|
|
992
|
+
return {
|
|
993
|
+
...context.state,
|
|
994
|
+
results: [...context.state.results, {
|
|
995
|
+
...result,
|
|
996
|
+
seq: match.event.seq
|
|
997
|
+
}]
|
|
998
|
+
};
|
|
999
|
+
},
|
|
1000
|
+
buildViewNode: (context) => {
|
|
1001
|
+
const state = context.state;
|
|
1002
|
+
const last = state?.results.at(-1);
|
|
1003
|
+
if (state === void 0 || last === void 0) return null;
|
|
1004
|
+
const location = context.matches.at(-1)?.location ?? context.start?.location ?? { kind: "unresolved" };
|
|
1005
|
+
return {
|
|
1006
|
+
key: context.key,
|
|
1007
|
+
kind: IMAGE_RESULT_NODE_KIND,
|
|
1008
|
+
id: context.id,
|
|
1009
|
+
target: "chat",
|
|
1010
|
+
anchorSeq: state.answerSeq ?? state.endSeq ?? last.seq,
|
|
1011
|
+
location,
|
|
1012
|
+
visibility: "visible",
|
|
1013
|
+
data: {
|
|
1014
|
+
turn: state.turn,
|
|
1015
|
+
results: state.results.map(({ seq: _seq, ...result }) => result)
|
|
1016
|
+
}
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
};
|
|
1020
|
+
/** Parse the plugin-owned durable presentation metadata from a Tool result event. */
|
|
1021
|
+
function imageResultFromMeta(value) {
|
|
1022
|
+
const meta = record(value);
|
|
1023
|
+
if (meta?.kind !== "dsh-image-gen") return void 0;
|
|
1024
|
+
const attachment = imageAttachment(meta.attachment);
|
|
1025
|
+
if (attachment === void 0) return void 0;
|
|
1026
|
+
return {
|
|
1027
|
+
attachment,
|
|
1028
|
+
prompt: stringValue(meta.prompt, "Generated Image"),
|
|
1029
|
+
provider: stringValue(meta.provider, "google"),
|
|
1030
|
+
model: stringValue(meta.model, ""),
|
|
1031
|
+
output: stringValue(meta.output, ""),
|
|
1032
|
+
...typeof meta.savedTo === "string" ? { savedTo: meta.savedTo } : {}
|
|
1033
|
+
};
|
|
1034
|
+
}
|
|
1035
|
+
function eventTurn(event) {
|
|
1036
|
+
const turn = event.data.turn;
|
|
1037
|
+
return typeof turn === "number" && Number.isSafeInteger(turn) && turn >= 0 ? turn : void 0;
|
|
1038
|
+
}
|
|
1039
|
+
function imageAttachment(value) {
|
|
1040
|
+
const candidate = record(value);
|
|
1041
|
+
if (candidate === void 0 || typeof candidate.attachmentId !== "string" || !isImageMediaType(candidate.mediaType) || !positiveInteger(candidate.bytes) || !positiveInteger(candidate.width) || !positiveInteger(candidate.height)) return void 0;
|
|
1042
|
+
const original = record(candidate.originalDimensions);
|
|
1043
|
+
if (candidate.originalDimensions !== void 0 && (original === void 0 || !positiveInteger(original.width) || !positiveInteger(original.height))) return void 0;
|
|
1044
|
+
return {
|
|
1045
|
+
attachmentId: candidate.attachmentId,
|
|
1046
|
+
mediaType: candidate.mediaType,
|
|
1047
|
+
bytes: candidate.bytes,
|
|
1048
|
+
width: candidate.width,
|
|
1049
|
+
height: candidate.height,
|
|
1050
|
+
...typeof candidate.name === "string" ? { name: candidate.name } : {},
|
|
1051
|
+
...original === void 0 ? {} : { originalDimensions: {
|
|
1052
|
+
width: original.width,
|
|
1053
|
+
height: original.height
|
|
1054
|
+
} }
|
|
1055
|
+
};
|
|
1056
|
+
}
|
|
1057
|
+
function isImageMediaType(value) {
|
|
1058
|
+
return value === "image/png" || value === "image/jpeg" || value === "image/webp" || value === "image/gif";
|
|
1059
|
+
}
|
|
1060
|
+
function positiveInteger(value) {
|
|
1061
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
1062
|
+
}
|
|
1063
|
+
function stringValue(value, fallback) {
|
|
1064
|
+
return typeof value === "string" ? value : fallback;
|
|
1065
|
+
}
|
|
1066
|
+
function record(value) {
|
|
1067
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
1068
|
+
}
|
|
1069
|
+
//#endregion
|
|
944
1070
|
//#region lib/types/client/index.js
|
|
945
1071
|
const KEY_REF = {
|
|
946
1072
|
google: "GEMINI_API_KEY",
|
|
@@ -994,6 +1120,7 @@ window.__ModuleLoader__.load({
|
|
|
994
1120
|
loading: "正在加载图片…",
|
|
995
1121
|
loadFailed: "图片读取失败 ({status})",
|
|
996
1122
|
generatedTitle: "已生成图片",
|
|
1123
|
+
resultShown: "图片结果已显示在对话中",
|
|
997
1124
|
copyImg: "复制图片",
|
|
998
1125
|
download: "下载图片",
|
|
999
1126
|
openNewTab: "新标签页打开",
|
|
@@ -1045,6 +1172,7 @@ window.__ModuleLoader__.load({
|
|
|
1045
1172
|
loading: "Loading image…",
|
|
1046
1173
|
loadFailed: "Failed to load image ({status})",
|
|
1047
1174
|
generatedTitle: "Generated image",
|
|
1175
|
+
resultShown: "Image result is shown in the conversation",
|
|
1048
1176
|
copyImg: "Copy Image",
|
|
1049
1177
|
download: "Download Image",
|
|
1050
1178
|
openNewTab: "Open in new tab",
|
|
@@ -1086,6 +1214,7 @@ window.__ModuleLoader__.load({
|
|
|
1086
1214
|
.dsh-ig-save:disabled{opacity:.4;cursor:default}
|
|
1087
1215
|
|
|
1088
1216
|
.dsh-ig-result{display:grid;gap:10px;max-width:520px}
|
|
1217
|
+
.dsh-ig-promoted-results{display:grid;gap:16px}
|
|
1089
1218
|
.dsh-ig-result-title{font-size:14px;font-weight:600}
|
|
1090
1219
|
.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}
|
|
1091
1220
|
.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}
|
|
@@ -1166,6 +1295,7 @@ window.__ModuleLoader__.load({
|
|
|
1166
1295
|
function apply(ctx) {
|
|
1167
1296
|
const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });
|
|
1168
1297
|
const locale = ctx.get("locale");
|
|
1298
|
+
const promotion = { enabled: false };
|
|
1169
1299
|
ctx.effect(() => {
|
|
1170
1300
|
const style = document.createElement("style");
|
|
1171
1301
|
style.dataset.plugin = "dsh-image-gen";
|
|
@@ -1176,6 +1306,18 @@ window.__ModuleLoader__.load({
|
|
|
1176
1306
|
};
|
|
1177
1307
|
}, "dsh-image-gen: styles");
|
|
1178
1308
|
const register = ctx.slots.register.bind(ctx.slots);
|
|
1309
|
+
ctx.inject(["uiConversation"], (owner) => {
|
|
1310
|
+
const uiConversation = asModernUiConversation(owner.get("uiConversation"));
|
|
1311
|
+
if (uiConversation === void 0) throw new Error("dsh-image-gen: uiConversation has an incompatible interface");
|
|
1312
|
+
promotion.enabled = true;
|
|
1313
|
+
const ownerRegister = owner.slots.register.bind(owner.slots);
|
|
1314
|
+
owner.effect(() => uiConversation.events.register(imageResultDefinition), "dsh-image-gen: promoted image result node");
|
|
1315
|
+
owner.slots.inject("conversation.chat.node", () => ownerRegister({
|
|
1316
|
+
name: "conversation.chat.node",
|
|
1317
|
+
key: IMAGE_RESULT_NODE_KIND,
|
|
1318
|
+
inject: () => ({ locale })
|
|
1319
|
+
}, PromotedImageResultNode));
|
|
1320
|
+
});
|
|
1179
1321
|
const injectSettingsItem = (owner, credentials) => {
|
|
1180
1322
|
const ownerRegister = owner.slots.register.bind(owner.slots);
|
|
1181
1323
|
owner.slots.inject("settings.plugin.item", () => ownerRegister({
|
|
@@ -1200,12 +1342,18 @@ window.__ModuleLoader__.load({
|
|
|
1200
1342
|
ctx.slots.inject("tool.call.toolview", () => register({
|
|
1201
1343
|
name: "tool.call.toolview",
|
|
1202
1344
|
key: "generate_image",
|
|
1203
|
-
inject: () => ({
|
|
1345
|
+
inject: () => ({
|
|
1346
|
+
locale,
|
|
1347
|
+
promoted: promotion.enabled
|
|
1348
|
+
})
|
|
1204
1349
|
}, GeneratedImageCard));
|
|
1205
1350
|
ctx.slots.inject("tool.call.toolview", () => register({
|
|
1206
1351
|
name: "tool.call.toolview",
|
|
1207
1352
|
key: "edit_image",
|
|
1208
|
-
inject: () => ({
|
|
1353
|
+
inject: () => ({
|
|
1354
|
+
locale,
|
|
1355
|
+
promoted: promotion.enabled
|
|
1356
|
+
})
|
|
1209
1357
|
}, GeneratedImageCard));
|
|
1210
1358
|
ctx.slots.inject("conversation.view", () => register({
|
|
1211
1359
|
name: "conversation.view",
|
|
@@ -1217,6 +1365,12 @@ window.__ModuleLoader__.load({
|
|
|
1217
1365
|
inject: () => ({ locale })
|
|
1218
1366
|
}, GalleryViewTab));
|
|
1219
1367
|
}
|
|
1368
|
+
function asModernUiConversation(value) {
|
|
1369
|
+
if (value === null || typeof value !== "object") return void 0;
|
|
1370
|
+
const events = value.events;
|
|
1371
|
+
if (events === null || typeof events !== "object") return void 0;
|
|
1372
|
+
return typeof events.register === "function" ? value : void 0;
|
|
1373
|
+
}
|
|
1220
1374
|
function asCredentialsRemote(value) {
|
|
1221
1375
|
if (value === null || typeof value !== "object") return void 0;
|
|
1222
1376
|
const candidate = value;
|
|
@@ -1629,43 +1783,57 @@ window.__ModuleLoader__.load({
|
|
|
1629
1783
|
}) : null]
|
|
1630
1784
|
});
|
|
1631
1785
|
}
|
|
1632
|
-
/**
|
|
1786
|
+
/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */
|
|
1633
1787
|
function GeneratedImageCard(props) {
|
|
1634
|
-
const
|
|
1635
|
-
|
|
1788
|
+
const result = imageResultFromBlock(props.block);
|
|
1789
|
+
if (props.promoted && result !== void 0) return (0, react_jsx_runtime.jsx)(PromotedResultNotice, { locale: props.locale });
|
|
1790
|
+
return (0, react_jsx_runtime.jsx)(ImageResultCard, {
|
|
1791
|
+
result,
|
|
1792
|
+
locale: props.locale
|
|
1793
|
+
});
|
|
1794
|
+
}
|
|
1795
|
+
/** Render modern image artifacts as final conversation output instead of Tool process content. */
|
|
1796
|
+
function PromotedImageResultNode(props) {
|
|
1797
|
+
return (0, react_jsx_runtime.jsx)("div", {
|
|
1798
|
+
className: "dsh-ig-promoted-results",
|
|
1799
|
+
children: props.node.data.results.map((result) => (0, react_jsx_runtime.jsx)(ImageResultCard, {
|
|
1800
|
+
result,
|
|
1801
|
+
locale: props.locale
|
|
1802
|
+
}, result.attachment.attachmentId))
|
|
1803
|
+
});
|
|
1804
|
+
}
|
|
1805
|
+
function PromotedResultNotice({ locale }) {
|
|
1806
|
+
const lang = usePluginLanguage(locale);
|
|
1807
|
+
return (0, react_jsx_runtime.jsx)("div", {
|
|
1808
|
+
className: "dsh-ig-loading",
|
|
1809
|
+
children: DICT[lang].resultShown
|
|
1810
|
+
});
|
|
1811
|
+
}
|
|
1812
|
+
function ImageResultCard({ result, locale }) {
|
|
1813
|
+
const attachment = result?.attachment;
|
|
1814
|
+
const savedTo = result?.savedTo;
|
|
1636
1815
|
const [url, setUrl] = (0, react.useState)();
|
|
1637
1816
|
const [blob, setBlob] = (0, react.useState)();
|
|
1638
1817
|
const [error, setError] = (0, react.useState)();
|
|
1639
1818
|
const [previewOpen, setPreviewOpen] = (0, react.useState)(false);
|
|
1640
1819
|
const [toast, setToast] = (0, react.useState)();
|
|
1641
|
-
const
|
|
1642
|
-
(0, react.useEffect)(() => {
|
|
1643
|
-
return props.locale?.subscribe?.(() => {
|
|
1644
|
-
setLang(props.locale?.getSnapshot?.()?.active?.startsWith("en") ? "en" : "zh");
|
|
1645
|
-
});
|
|
1646
|
-
}, [props.locale]);
|
|
1820
|
+
const lang = usePluginLanguage(locale);
|
|
1647
1821
|
const t = (keyName, params) => {
|
|
1648
1822
|
let text = (lang === "en" ? DICT.en : DICT.zh)[keyName] || DICT.zh[keyName] || keyName;
|
|
1649
1823
|
if (params) for (const [k, v] of Object.entries(params)) text = text.replace(`{${k}}`, v);
|
|
1650
1824
|
return text;
|
|
1651
1825
|
};
|
|
1652
1826
|
(0, react.useEffect)(() => {
|
|
1653
|
-
if (
|
|
1654
|
-
const blockAny = props.block;
|
|
1655
|
-
const meta = blockAny.meta ?? blockAny.resultView?.meta;
|
|
1656
|
-
const prompt = typeof meta?.prompt === "string" ? meta.prompt : blockAny.call?.args?.prompt ?? "Generated Image";
|
|
1657
|
-
const provider = typeof meta?.provider === "string" ? meta.provider : "google";
|
|
1658
|
-
const model = typeof meta?.model === "string" ? meta.model : "";
|
|
1659
|
-
const output = typeof meta?.output === "string" ? meta.output : "";
|
|
1827
|
+
if (result === void 0) return;
|
|
1660
1828
|
saveGalleryItem({
|
|
1661
|
-
id: attachment.attachmentId,
|
|
1662
|
-
attachment,
|
|
1663
|
-
prompt,
|
|
1664
|
-
provider,
|
|
1665
|
-
model,
|
|
1666
|
-
output
|
|
1829
|
+
id: result.attachment.attachmentId,
|
|
1830
|
+
attachment: result.attachment,
|
|
1831
|
+
prompt: result.prompt,
|
|
1832
|
+
provider: result.provider,
|
|
1833
|
+
model: result.model,
|
|
1834
|
+
output: result.output
|
|
1667
1835
|
});
|
|
1668
|
-
}, [attachment
|
|
1836
|
+
}, [result?.attachment.attachmentId]);
|
|
1669
1837
|
(0, react.useEffect)(() => {
|
|
1670
1838
|
if (!previewOpen) return;
|
|
1671
1839
|
const onKeyDown = (e) => {
|
|
@@ -1869,6 +2037,27 @@ window.__ModuleLoader__.load({
|
|
|
1869
2037
|
]
|
|
1870
2038
|
});
|
|
1871
2039
|
}
|
|
2040
|
+
function usePluginLanguage(locale) {
|
|
2041
|
+
const [lang, setLang] = (0, react.useState)(() => locale?.getSnapshot?.()?.active?.startsWith("en") ? "en" : "zh");
|
|
2042
|
+
(0, react.useEffect)(() => locale?.subscribe?.(() => {
|
|
2043
|
+
setLang(locale?.getSnapshot?.()?.active?.startsWith("en") ? "en" : "zh");
|
|
2044
|
+
}), [locale]);
|
|
2045
|
+
return lang;
|
|
2046
|
+
}
|
|
2047
|
+
function imageResultFromBlock(block) {
|
|
2048
|
+
const attachment = imageRef(block);
|
|
2049
|
+
if (attachment === void 0) return void 0;
|
|
2050
|
+
const blockValue = block;
|
|
2051
|
+
const meta = blockValue.meta ?? blockValue.resultView?.meta;
|
|
2052
|
+
return {
|
|
2053
|
+
attachment,
|
|
2054
|
+
prompt: typeof meta?.prompt === "string" ? meta.prompt : blockValue.call?.args?.prompt ?? "Generated Image",
|
|
2055
|
+
provider: typeof meta?.provider === "string" ? meta.provider : "google",
|
|
2056
|
+
model: typeof meta?.model === "string" ? meta.model : "",
|
|
2057
|
+
output: typeof meta?.output === "string" ? meta.output : "",
|
|
2058
|
+
...typeof meta?.savedTo === "string" ? { savedTo: meta.savedTo } : {}
|
|
2059
|
+
};
|
|
2060
|
+
}
|
|
1872
2061
|
function modelOf(provider, value) {
|
|
1873
2062
|
const stored = provider === "google" ? value?.googleModel : provider === "openai" ? value?.openaiModel : provider === "seedream" ? value?.seedreamModel : provider === "dashscope" ? value?.dashscopeModel : value?.comfyuiWorkflowName;
|
|
1874
2063
|
return typeof stored === "string" && stored.length > 0 ? stored : DEFAULT_MODELS[provider];
|
|
@@ -1877,15 +2066,10 @@ window.__ModuleLoader__.load({
|
|
|
1877
2066
|
const stored = provider === "google" ? value?.googleEndpoint : provider === "openai" ? value?.openaiBaseURL : provider === "seedream" ? value?.seedreamBaseURL : provider === "dashscope" ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;
|
|
1878
2067
|
return typeof stored === "string" && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];
|
|
1879
2068
|
}
|
|
1880
|
-
/** The workspace file path a completed image call saved, when the result meta carries one. */
|
|
1881
|
-
function imageSavedTo(block) {
|
|
1882
|
-
if (!("kind" in block)) return void 0;
|
|
1883
|
-
const meta = block.meta ?? block.resultView?.meta;
|
|
1884
|
-
return typeof meta?.savedTo === "string" ? meta.savedTo : void 0;
|
|
1885
|
-
}
|
|
1886
2069
|
//#endregion
|
|
1887
2070
|
exports.GeneratedImageCard = GeneratedImageCard;
|
|
1888
2071
|
exports.ImageGenerationSettingsCard = ImageGenerationSettingsCard;
|
|
2072
|
+
exports.PromotedImageResultNode = PromotedImageResultNode;
|
|
1889
2073
|
exports.apply = apply;
|
|
1890
2074
|
exports.inject = inject;
|
|
1891
2075
|
return module.exports;
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["DICT","useState","useMemo","_jsxs","_jsx","useState","_jsxs","_jsx","_Fragment"],"sources":["types/shared.js","types/comfyui-workflow.js","types/client/gallery-store.js","types/client/gallery-view.js","types/client/image-ref.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope', 'comfyui'];\n/** Default endpoints and base URLs. */\nexport const DEFAULT_GOOGLE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/interactions';\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_SEEDREAM_BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_DASHSCOPE_ENDPOINT = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_COMFYUI_BASE_URL = 'http://127.0.0.1:8188';\nexport const DEFAULT_COMFYUI_TIMEOUT_MS = 300_000;\nexport const DEFAULT_COMFYUI_WORKFLOW_LABEL = 'API workflow';\nexport const MAX_COMFYUI_WORKFLOW_BYTES = 5 * 1024 * 1024;\n/** Default model names. */\nexport const DEFAULT_GOOGLE_MODEL = 'gemini-3.1-flash-image';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-image-2';\nexport const DEFAULT_SEEDREAM_MODEL = 'doubao-seedream-5-0-260128';\nexport const DEFAULT_DASHSCOPE_MODEL = 'qwen-image-3.0';\nexport const DEFAULT_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_MODEL,\n dashscope: DEFAULT_DASHSCOPE_MODEL,\n comfyui: DEFAULT_COMFYUI_WORKFLOW_LABEL,\n};\nexport const DEFAULT_BASE_URLS = {\n google: DEFAULT_GOOGLE_ENDPOINT,\n openai: DEFAULT_OPENAI_BASE_URL,\n seedream: DEFAULT_SEEDREAM_BASE_URL,\n dashscope: DEFAULT_DASHSCOPE_ENDPOINT,\n comfyui: DEFAULT_COMFYUI_BASE_URL,\n};\n//# sourceMappingURL=shared.js.map","/** Pure ComfyUI API-workflow validation and placeholder injection. */\nimport { MAX_COMFYUI_WORKFLOW_BYTES } from './shared.js';\nexport const COMFYUI_PROMPT_PLACEHOLDER = '{{prompt}}';\nexport const COMFYUI_SEED_PLACEHOLDER = '{{seed}}';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n parseWorkflow(workflowJson);\n}\n/** Parse, clone, and inject one prompt plus an optional randomized seed. */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed()) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n if (value === COMFYUI_PROMPT_PLACEHOLDER) {\n promptReplacements += 1;\n return prompt;\n }\n if (value === COMFYUI_SEED_PLACEHOLDER)\n return seed;\n if (value.includes(COMFYUI_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n return value.replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt);\n }\n return value.includes(COMFYUI_SEED_PLACEHOLDER)\n ? value.replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n : value;\n }\n if (Array.isArray(value))\n return value.map(inject);\n if (!isRecord(value))\n return value;\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, inject(child)]));\n };\n const prepared = Object.fromEntries(Object.entries(workflow).map(([nodeId, value]) => {\n const node = record(value);\n const inputs = node === undefined ? undefined : record(node.inputs);\n return inputs === undefined\n ? [nodeId, value]\n : [nodeId, { ...node, inputs: inject(inputs) }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n return prepared;\n}\nfunction parseWorkflow(workflowJson) {\n if (workflowJson.trim().length === 0)\n throw new Error('Import a ComfyUI API workflow JSON file in Settings before generating');\n if (new TextEncoder().encode(workflowJson).byteLength > MAX_COMFYUI_WORKFLOW_BYTES) {\n throw new Error('ComfyUI workflow file must be no larger than 5 MB');\n }\n let value;\n try {\n value = JSON.parse(workflowJson);\n }\n catch {\n throw new Error('ComfyUI workflow file is not valid JSON');\n }\n if (!isRecord(value) || Object.keys(value).length === 0) {\n throw new Error('ComfyUI workflow must be a non-empty API-format JSON object');\n }\n if (!Object.values(value).some(node => {\n const inputs = record(node)?.inputs;\n return inputs !== undefined && containsPromptPlaceholder(inputs);\n })) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n return value;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string')\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER);\n if (Array.isArray(value))\n return value.some(containsPromptPlaceholder);\n return isRecord(value) && Object.values(value).some(containsPromptPlaceholder);\n}\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction record(value) {\n return isRecord(value) ? value : undefined;\n}\nfunction randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\n}\n//# sourceMappingURL=comfyui-workflow.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n const record = {\n ...item,\n createdAt: item.createdAt ?? Date.now(),\n };\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req = store.put(record);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English).\n */\nimport { useEffect, useState, useMemo } from 'react';\nimport { IMAGE_ROUTE } from '../shared.js';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n totalCount: '共 {count} 张生成图片',\n searchPlaceholder: '搜索 Prompt 关键词…',\n filterAll: '全部厂商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或选择其他厂商。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n },\n en: {\n totalCount: '{count} images total',\n searchPlaceholder: 'Search prompt keywords…',\n filterAll: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or provider filter.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n },\n};\nexport const GalleryViewTab = ({ locale }) => {\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n useEffect(() => {\n if (!previewItem)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape') {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [previewItem]);\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n if (selectedProvider !== 'all' && item.provider !== selectedProvider)\n return false;\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n if (!matchPrompt && !matchModel)\n return false;\n }\n return true;\n });\n }, [items, search, selectedProvider]);\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-gallery-page-header\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-page-title-row\", children: _jsx(\"span\", { className: \"dsh-ig-gallery-page-count\", children: t('totalCount', { count: String(items.length) }) }) }), _jsxs(\"div\", { className: \"dsh-ig-gallery-page-tools\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-search-wrap\", children: [_jsxs(\"svg\", { className: \"dsh-ig-gallery-search-icon\", width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"circle\", { cx: \"11\", cy: \"11\", r: \"8\" }), _jsx(\"line\", { x1: \"21\", y1: \"21\", x2: \"16.65\", y2: \"16.65\" })] }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-gallery-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(\"select\", { className: \"dsh-ig-gallery-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAll') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') })] })] })] }), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item) => (_jsx(GalleryCard, { item: item, t: t, onPreview: (url, blob) => {\n setPreviewItem(item);\n setPreviewUrl(url);\n setPreviewBlob(blob);\n }, onToast: showToast }, item.id))) })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), previewItem && previewUrl && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: _jsxs(\"svg\", { width: \"18\", height: \"18\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }), _jsx(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })] }) })] }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt }) }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: async () => {\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(previewItem.id);\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n showToast(t('deleted'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, t, onPreview, onToast }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-card\", onClick: () => {\n if (url && blob)\n onPreview(url, blob);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: async (e) => {\n e.stopPropagation();\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(item.id);\n onToast(t('deleted'));\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-header\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: item.provider }), item.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: item.model })) : null] }), _jsx(\"p\", { className: \"dsh-ig-gallery-card-prompt\", title: item.prompt, children: item.prompt })] })] }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","/**\n * Extract the verified durable image attachment from a completed tool result block.\n * Supports legacy rc.2 `resultView.content` and modern DSH `block.content`.\n */\nexport function imageRef(block) {\n if (!('kind' in block))\n return undefined;\n const fromResultView = block.resultView?.card === 'generic'\n ? block.resultView.content?.find(item => item.type === 'image')\n : undefined;\n if (fromResultView?.type === 'image')\n return fromResultView.attachment;\n const fromBlockContent = Array.isArray(block.content)\n ? block.content.find(item => item.type === 'image')\n : undefined;\n if (fromBlockContent?.type === 'image')\n return fromBlockContent.attachment;\n return undefined;\n}\n//# sourceMappingURL=image-ref.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nimport { imageRef } from './image-ref.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n providerComfyUI: '本地 ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: '留空即可保留已配置的 Key',\n apiKeyHint: '安全保存为 {key};页面不会读回明文。',\n endpoint: '接口地址',\n reset: '重置',\n resetTitle: '重置为默认官方地址',\n endpointHintGoogle: 'Google 官方地址或反代端点(全路径)。',\n endpointHintOpenAI: '中转站请填其 OpenAI 兼容的 /v1 地址。',\n endpointHintSeedream: '火山方舟兼容的 /api/v3 地址。',\n endpointHintDashScope: '阿里云百炼 DashScope 官方接口地址。',\n endpointHintComfyUI: '正在运行且 DSH Host 可以访问的 ComfyUI 地址,默认使用本机 8188 端口。',\n model: '模型',\n workflow: 'API Workflow',\n workflowImport: '导入 JSON 文件',\n workflowReplace: '替换 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '请从 ComfyUI 导出 API Format JSON,并在提示词输入位置写入 {{prompt}};可用 {{seed}} 作为随机种子。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\n timeout: '生成超时(秒)',\n timeoutHint: '包括提交、等待和下载图片;默认 300 秒。',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n providerComfyUI: 'Local ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: 'Leave empty to keep configured key',\n apiKeyHint: 'Securely saved as {key}; never read back in plaintext.',\n endpoint: 'Endpoint / Base URL',\n reset: 'Reset',\n resetTitle: 'Reset to official default URL',\n endpointHintGoogle: 'Official Google endpoint or reverse proxy (full path).',\n endpointHintOpenAI: 'OpenAI-compatible /v1 base URL for relays.',\n endpointHintSeedream: 'Volcengine Ark compatible /api/v3 base URL.',\n endpointHintDashScope: 'Official Aliyun DashScope endpoint.',\n endpointHintComfyUI: 'A running ComfyUI server reachable by the DSH Host; the default points to port 8188 on this computer.',\n model: 'Model',\n workflow: 'API Workflow',\n workflowImport: 'Import JSON file',\n workflowReplace: 'Replace JSON file',\n workflowMissing: 'No workflow imported',\n workflowImported: 'Imported {name}',\n workflowHint: 'Export an API Format JSON from ComfyUI and place {{prompt}} in its prompt input. {{seed}} is available for a random seed.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\n timeout: 'Generation timeout (seconds)',\n timeoutHint: 'Covers submission, waiting, and image download; defaults to 300 seconds.',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\n.dsh-ig-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.dsh-ig-file-button{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font-size:13px;cursor:pointer;transition:background .15s,border-color .15s}\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\n.dsh-ig-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,inherit);font-size:12px}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n.dsh-ig-gallery-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 28px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-page-count{font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#4b5563);background:var(--dsw-alias-bg-layer-3,#f3f4f6);padding:3px 10px;border-radius:20px}\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\n.dsh-ig-gallery-search-input{padding:6px 12px 6px 32px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;width:200px;transition:border-color .15s,width .2s}\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\n.dsh-ig-gallery-select{padding:6px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;cursor:pointer}\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.06);border-color:var(--dsw-alias-border-l1,#cfd4dc)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f3f4f6;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:4px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.68);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n.dsh-ig-gallery-card-meta{padding:12px 14px;display:flex;flex-direction:column;gap:6px;background:var(--dsw-alias-bg-layer-2,#fff);flex:1}\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-gallery-card-prompt{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-primary,inherit);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end;border-top:1px solid rgba(255,255,255,0.1);padding-top:8px}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Hide floating chat composer when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n const locale = ctx.get('locale');\n 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 const injectSettingsItem = (owner, credentials) => {\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.slots.inject('settings.plugin.item', () => ownerRegister({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\n };\n const remoteCredentials = asCredentialsRemote(ctx.get('remote.credentials'));\n const legacyCredentials = credentialsFromLegacyConnection(ctx.get('connection'));\n if (remoteCredentials !== undefined) {\n injectSettingsItem(ctx, remoteCredentials);\n }\n else if (legacyCredentials !== undefined) {\n injectSettingsItem(ctx, legacyCredentials);\n }\n else {\n ctx.inject(['remote.credentials'], (remoteCtx) => {\n const credentials = asCredentialsRemote(remoteCtx.get('remote.credentials'));\n if (credentials === undefined)\n throw new Error('dsh-image-gen: remote.credentials has an incompatible interface');\n injectSettingsItem(remoteCtx, credentials);\n });\n }\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\nfunction asCredentialsRemote(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const candidate = value;\n return typeof candidate.describe === 'function' && typeof candidate.set === 'function'\n ? candidate\n : undefined;\n}\nfunction credentialsFromLegacyConnection(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const credentials = value.api?.credentials;\n if (credentials === undefined || typeof credentials.describe !== 'function' || typeof credentials.set !== 'function')\n return undefined;\n const legacy = credentials;\n return {\n async describe(refs) {\n const response = await legacy.describe({ refs });\n return response.result.ok\n ? { ok: true, value: response.result.value.credentials }\n : { ok: false };\n },\n async set(ref, credentialValue) {\n const response = await legacy.set({ ref, value: credentialValue });\n return response.result.ok\n ? { ok: true }\n : { ok: false, error: response.result.error };\n },\n };\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [workflowJson, setWorkflowJson] = useState('');\n const [workflowName, setWorkflowName] = useState('');\n const [timeoutSeconds, setTimeoutSeconds] = useState(DEFAULT_COMFYUI_TIMEOUT_MS / 1000);\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n comfyui: t('providerComfyUI'),\n };\n useEffect(() => {\n const value = snapshot.value;\n const next = value?.provider ?? 'google';\n setProvider(next);\n setModel(modelOf(next, value));\n setBaseURL(baseURLOf(next, value));\n setWorkflowJson(value?.comfyuiWorkflowJson ?? '');\n setWorkflowName(value?.comfyuiWorkflowName ?? '');\n setTimeoutSeconds(Math.max(1, Math.round((value?.comfyuiTimeoutMs ?? DEFAULT_COMFYUI_TIMEOUT_MS) / 1000)));\n setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined) {\n setConfigured(undefined);\n return;\n }\n let active = true;\n void props.credentials.describe([keyRef]).then(response => {\n if (active)\n setConfigured(response.ok ? response.value?.[keyRef]?.configured ?? false : undefined);\n }).catch(() => { if (active)\n setConfigured(undefined); });\n return () => { active = false; };\n }, [props.credentials, provider]);\n const save = async (event) => {\n event.preventDefault();\n setSaving(true);\n setMessage('');\n try {\n await props.scope.set('provider', provider);\n if (provider === 'comfyui') {\n validateComfyUIWorkflowJson(workflowJson);\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflowJson', workflowJson);\n await props.scope.set('comfyuiWorkflowName', workflowName);\n await props.scope.set('comfyuiTimeoutMs', Math.max(1, Math.round(timeoutSeconds)) * 1000);\n }\n else {\n await props.scope.set(provider === 'google' ? 'googleModel' : provider === 'openai' ? 'openaiModel' : provider === 'seedream' ? 'seedreamModel' : 'dashscopeModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : provider === 'seedream' ? 'seedreamBaseURL' : 'dashscopeEndpoint', baseURL);\n }\n await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined)\n throw new Error('ComfyUI does not use an API key in this version');\n const response = await props.credentials.set(keyRef, key.trim());\n if (!response.ok)\n throw new Error(response.error?.message ?? 'Failed to save API key');\n setKey('');\n setConfigured(true);\n }\n setMessage(t('saved'));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n const workflowStatus = workflowName.length > 0 ? t('workflowImported', { name: workflowName }) : t('workflowMissing');\n const importWorkflow = async (event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file === undefined)\n return;\n setMessage('');\n try {\n if (file.size > MAX_COMFYUI_WORKFLOW_BYTES)\n throw new Error(t('workflowTooLarge'));\n const json = await file.text();\n validateComfyUIWorkflowJson(json);\n setWorkflowJson(json);\n setWorkflowName(file.name);\n setMessage(t('workflowImported', { name: file.name }));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\n };\n return (_jsxs(\"li\", { className: `dsh-ig-card ${open ? 'dsh-ig-card-open' : ''}`, children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-head\", \"aria-expanded\": open, onClick: () => { setOpen(value => !value); }, children: [_jsxs(\"span\", { className: \"dsh-ig-head-text\", children: [_jsx(\"span\", { className: \"dsh-ig-title\", children: t('title') }), _jsx(\"span\", { className: \"dsh-ig-desc\", children: t('description') })] }), _jsx(\"span\", { className: `dsh-ig-chevron ${open ? 'dsh-ig-chevron-open' : ''}`, \"aria-hidden\": \"true\", children: _jsx(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: _jsx(\"path\", { d: \"M4 6l4 4 4-4\" }) }) })] }), open ? (_jsxs(\"form\", { className: \"dsh-ig-body\", onSubmit: (event) => { void save(event); }, children: [_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('provider') }), _jsxs(\"select\", { className: \"dsh-ig-input\", value: provider, onChange: event => { const next = event.target.value; setProvider(next); setModel(modelOf(next, snapshot.value)); setBaseURL(baseURLOf(next, snapshot.value)); setKey(''); }, children: [_jsx(\"option\", { value: \"google\", children: t('providerGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('providerOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('providerSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('providerDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('providerComfyUI') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('apiKeyLabel', { provider: providerLabels[provider] }) }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"password\", autoComplete: \"off\", value: key, onChange: event => { setKey(event.target.value); }, placeholder: configured ? t('apiKeyPlaceholder') : '' }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('apiKeyHint', { key: KEY_REF[provider] ?? '' }) })] }) : null, _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('endpoint') }), _jsxs(\"div\", { className: \"dsh-ig-input-group\", children: [_jsx(\"input\", { className: \"dsh-ig-input\", type: \"url\", value: baseURL, onChange: event => { setBaseURL(event.target.value); }, required: true }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", title: t('resetTitle'), onClick: () => { setBaseURL(DEFAULT_BASE_URLS[provider]); }, children: t('reset') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: provider === 'google' ? t('endpointHintGoogle') : provider === 'openai' ? t('endpointHintOpenAI') : provider === 'seedream' ? t('endpointHintSeedream') : provider === 'dashscope' ? t('endpointHintDashScope') : t('endpointHintComfyUI') })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('model') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: model, onChange: event => { setModel(event.target.value); }, required: true })] }) : (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('workflow') }), _jsxs(\"div\", { className: \"dsh-ig-file-row\", children: [_jsxs(\"label\", { className: \"dsh-ig-file-button\", children: [_jsx(\"input\", { className: \"dsh-ig-file-input\", type: \"file\", accept: \".json,application/json\", onChange: event => { void importWorkflow(event); } }), workflowName.length > 0 ? t('workflowReplace') : t('workflowImport')] }), _jsx(\"span\", { className: \"dsh-ig-file-name\", title: workflowName, children: workflowName || t('workflowMissing') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('workflowHint') })] }), _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('timeout') }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"number\", min: \"1\", max: \"3600\", step: \"1\", value: timeoutSeconds, onChange: event => { setTimeoutSeconds(Number(event.target.value)); }, required: true }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('timeoutHint') })] })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: \"dsh-ig-status\", role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflowJson.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Render the durable attachment referenced by a completed image tool call. */\nexport function GeneratedImageCard(props) {\n const attachment = imageRef(props.block);\n const savedTo = imageSavedTo(props.block);\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (attachment === undefined)\n return;\n const blockAny = props.block;\n const meta = blockAny.meta ?? blockAny.resultView?.meta;\n const prompt = typeof meta?.prompt === 'string' ? meta.prompt : blockAny.call?.args?.prompt ?? 'Generated Image';\n const provider = (typeof meta?.provider === 'string' ? meta.provider : 'google');\n const model = typeof meta?.model === 'string' ? meta.model : '';\n const output = typeof meta?.output === 'string' ? meta.output : '';\n void saveGalleryItem({\n id: attachment.attachmentId,\n attachment,\n prompt,\n provider,\n model,\n output,\n });\n }, [attachment?.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), savedTo !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-savedto\", children: [t('savedToPath'), \": \", savedTo] }) : null, error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : value?.comfyuiWorkflowName;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_MODELS[provider];\n}\nfunction baseURLOf(provider, value) {\n const stored = provider === 'google' ? value?.googleEndpoint : provider === 'openai' ? value?.openaiBaseURL : provider === 'seedream' ? value?.seedreamBaseURL : provider === 'dashscope' ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\n/** The workspace file path a completed image call saved, when the result meta carries one. */\nfunction imageSavedTo(block) {\n if (!('kind' in block))\n return undefined;\n const meta = block.meta\n ?? block.resultView?.meta;\n return typeof meta?.savedTo === 'string' ? meta.savedTo : undefined;\n}\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["record","DICT","useState","useMemo","_jsxs","_jsx","useState","_jsxs","_jsx","_Fragment"],"sources":["types/shared.js","types/comfyui-workflow.js","types/client/gallery-store.js","types/client/gallery-view.js","types/client/image-ref.js","types/client/image-result-node.js","types/client/index.js"],"sourcesContent":["/** Values shared by the Host and browser Bundle faces. */\n/** Browser route used by the generated-image card. */\nexport const IMAGE_ROUTE = '/plugins/dsh-image-gen/image';\n/** Namespace persisted through DSH Settings. */\nexport const IMAGE_GENERATION_NAMESPACE = 'image-generation';\n/** Supported providers. */\nexport const IMAGE_PROVIDERS = ['google', 'openai', 'seedream', 'dashscope', 'comfyui'];\n/** Default endpoints and base URLs. */\nexport const DEFAULT_GOOGLE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/interactions';\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_SEEDREAM_BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_DASHSCOPE_ENDPOINT = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_COMFYUI_BASE_URL = 'http://127.0.0.1:8188';\nexport const DEFAULT_COMFYUI_TIMEOUT_MS = 300_000;\nexport const DEFAULT_COMFYUI_WORKFLOW_LABEL = 'API workflow';\nexport const MAX_COMFYUI_WORKFLOW_BYTES = 5 * 1024 * 1024;\n/** Default model names. */\nexport const DEFAULT_GOOGLE_MODEL = 'gemini-3.1-flash-image';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-image-2';\nexport const DEFAULT_SEEDREAM_MODEL = 'doubao-seedream-5-0-260128';\nexport const DEFAULT_DASHSCOPE_MODEL = 'qwen-image-3.0';\nexport const DEFAULT_MODELS = {\n google: DEFAULT_GOOGLE_MODEL,\n openai: DEFAULT_OPENAI_MODEL,\n seedream: DEFAULT_SEEDREAM_MODEL,\n dashscope: DEFAULT_DASHSCOPE_MODEL,\n comfyui: DEFAULT_COMFYUI_WORKFLOW_LABEL,\n};\nexport const DEFAULT_BASE_URLS = {\n google: DEFAULT_GOOGLE_ENDPOINT,\n openai: DEFAULT_OPENAI_BASE_URL,\n seedream: DEFAULT_SEEDREAM_BASE_URL,\n dashscope: DEFAULT_DASHSCOPE_ENDPOINT,\n comfyui: DEFAULT_COMFYUI_BASE_URL,\n};\n//# sourceMappingURL=shared.js.map","/** Pure ComfyUI API-workflow validation and placeholder injection. */\nimport { MAX_COMFYUI_WORKFLOW_BYTES } from './shared.js';\nexport const COMFYUI_PROMPT_PLACEHOLDER = '{{prompt}}';\nexport const COMFYUI_SEED_PLACEHOLDER = '{{seed}}';\n/** Validate imported JSON without exposing workflow graph details to callers. */\nexport function validateComfyUIWorkflowJson(workflowJson) {\n parseWorkflow(workflowJson);\n}\n/** Parse, clone, and inject one prompt plus an optional randomized seed. */\nexport function prepareComfyUIWorkflow(workflowJson, prompt, seed = randomSeed()) {\n const workflow = parseWorkflow(workflowJson);\n let promptReplacements = 0;\n const inject = (value) => {\n if (typeof value === 'string') {\n if (value === COMFYUI_PROMPT_PLACEHOLDER) {\n promptReplacements += 1;\n return prompt;\n }\n if (value === COMFYUI_SEED_PLACEHOLDER)\n return seed;\n if (value.includes(COMFYUI_PROMPT_PLACEHOLDER)) {\n promptReplacements += 1;\n return value.replaceAll(COMFYUI_PROMPT_PLACEHOLDER, prompt);\n }\n return value.includes(COMFYUI_SEED_PLACEHOLDER)\n ? value.replaceAll(COMFYUI_SEED_PLACEHOLDER, String(seed))\n : value;\n }\n if (Array.isArray(value))\n return value.map(inject);\n if (!isRecord(value))\n return value;\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, inject(child)]));\n };\n const prepared = Object.fromEntries(Object.entries(workflow).map(([nodeId, value]) => {\n const node = record(value);\n const inputs = node === undefined ? undefined : record(node.inputs);\n return inputs === undefined\n ? [nodeId, value]\n : [nodeId, { ...node, inputs: inject(inputs) }];\n }));\n if (promptReplacements === 0) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n return prepared;\n}\nfunction parseWorkflow(workflowJson) {\n if (workflowJson.trim().length === 0)\n throw new Error('Import a ComfyUI API workflow JSON file in Settings before generating');\n if (new TextEncoder().encode(workflowJson).byteLength > MAX_COMFYUI_WORKFLOW_BYTES) {\n throw new Error('ComfyUI workflow file must be no larger than 5 MB');\n }\n let value;\n try {\n value = JSON.parse(workflowJson);\n }\n catch {\n throw new Error('ComfyUI workflow file is not valid JSON');\n }\n if (!isRecord(value) || Object.keys(value).length === 0) {\n throw new Error('ComfyUI workflow must be a non-empty API-format JSON object');\n }\n if (!Object.values(value).some(node => {\n const inputs = record(node)?.inputs;\n return inputs !== undefined && containsPromptPlaceholder(inputs);\n })) {\n throw new Error(`ComfyUI workflow must contain ${COMFYUI_PROMPT_PLACEHOLDER} in a text input`);\n }\n return value;\n}\nfunction containsPromptPlaceholder(value) {\n if (typeof value === 'string')\n return value.includes(COMFYUI_PROMPT_PLACEHOLDER);\n if (Array.isArray(value))\n return value.some(containsPromptPlaceholder);\n return isRecord(value) && Object.values(value).some(containsPromptPlaceholder);\n}\nfunction isRecord(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction record(value) {\n return isRecord(value) ? value : undefined;\n}\nfunction randomSeed() {\n return Math.floor(Math.random() * 0x1_0000_0000);\n}\n//# sourceMappingURL=comfyui-workflow.js.map","const DB_NAME = 'dsh_image_gen_db';\nconst DB_VERSION = 2;\nconst STORE_NAME = 'gallery_history';\nconst TOMBSTONE_STORE = 'gallery_tombstones';\nlet dbPromise = null;\nlet tombstonesCache = null;\nfunction getDB() {\n if (dbPromise)\n return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported in this environment.'));\n return;\n }\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt', { unique: false });\n }\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n db.createObjectStore(TOMBSTONE_STORE, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n return dbPromise;\n}\nasync function loadTombstones(db) {\n if (tombstonesCache)\n return tombstonesCache;\n return new Promise((resolve) => {\n if (!db.objectStoreNames.contains(TOMBSTONE_STORE)) {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n return;\n }\n try {\n const tx = db.transaction(TOMBSTONE_STORE, 'readonly');\n const store = tx.objectStore(TOMBSTONE_STORE);\n const req = store.getAllKeys();\n req.onsuccess = () => {\n tombstonesCache = new Set(req.result.map(String));\n resolve(tombstonesCache);\n };\n req.onerror = () => {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n };\n }\n catch {\n tombstonesCache = new Set();\n resolve(tombstonesCache);\n }\n });\n}\nconst listeners = new Set();\nfunction notifyListeners() {\n for (const listener of listeners) {\n try {\n listener();\n }\n catch (err) {\n console.error('[dsh-image-gen] Gallery listener error:', err);\n }\n }\n}\n/**\n * Subscribe to gallery mutations (insert/delete/clear).\n */\nexport function subscribeGallery(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n/**\n * Save or update a gallery record by attachmentId.\n * Skipped if the item was previously deleted (tombstoned).\n */\nexport async function saveGalleryItem(item) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n if (tombstones.has(item.id)) {\n return;\n }\n const record = {\n ...item,\n createdAt: item.createdAt ?? Date.now(),\n };\n await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req = store.put(record);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to save gallery item to IndexedDB:', err);\n }\n}\n/**\n * Retrieve all gallery records sorted by createdAt descending.\n */\nexport async function getGalleryItems() {\n try {\n const db = await getDB();\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('createdAt');\n const req = index.openCursor(null, 'prev'); // newest first\n const items = [];\n req.onsuccess = (event) => {\n const cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n resolve(items);\n }\n };\n req.onerror = () => reject(req.error);\n });\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to read gallery items from IndexedDB:', err);\n return [];\n }\n}\n/**\n * Delete a single gallery record by ID and record a tombstone.\n */\nexport async function deleteGalleryItem(id) {\n try {\n const db = await getDB();\n const tombstones = await loadTombstones(db);\n tombstones.add(id);\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.delete(id);\n tombstoneStore.put({ id, deletedAt: Date.now() });\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to delete gallery item from IndexedDB:', err);\n }\n}\n/**\n * Clear all gallery records and reset tombstones.\n */\nexport async function clearGallery() {\n try {\n const db = await getDB();\n if (tombstonesCache)\n tombstonesCache.clear();\n await new Promise((resolve, reject) => {\n const tx = db.transaction([STORE_NAME, TOMBSTONE_STORE], 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const tombstoneStore = tx.objectStore(TOMBSTONE_STORE);\n store.clear();\n tombstoneStore.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n notifyListeners();\n }\n catch (err) {\n console.warn('[dsh-image-gen] Failed to clear gallery in IndexedDB:', err);\n }\n}\n//# sourceMappingURL=gallery-store.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Native Workspace Gallery View Component for DSH `conversation.view` slot.\n * Fully i18n-reactive (Chinese & English).\n */\nimport { useEffect, useState, useMemo } from 'react';\nimport { IMAGE_ROUTE } from '../shared.js';\nimport { getGalleryItems, subscribeGallery, deleteGalleryItem, } from './gallery-store.js';\nconst DICT = {\n zh: {\n totalCount: '共 {count} 张生成图片',\n searchPlaceholder: '搜索 Prompt 关键词…',\n filterAll: '全部厂商',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / 中转站',\n filterSeedream: '字节 Seedream',\n filterDashScope: '阿里 DashScope',\n emptyTitle: '暂无生图记录',\n emptyDesc: '在对话中让 Agent 生图后,生成的图片会自动收录到这里。',\n noMatchTitle: '未找到匹配结果',\n noMatchDesc: '尝试更换搜索关键词或选择其他厂商。',\n copiedPrompt: '已复制 Prompt',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n preview: '查看大图',\n download: '下载图片',\n copyImg: '复制图片',\n copyPpt: '复制 Prompt',\n delete: '从画廊删除',\n confirmDelete: '确定要从画廊中删除这张图片吗?(不会影响原聊天记录)',\n deleted: '已从画廊删除',\n model: '模型',\n prompt: 'Prompt',\n close: '关闭 (Esc)',\n },\n en: {\n totalCount: '{count} images total',\n searchPlaceholder: 'Search prompt keywords…',\n filterAll: 'All Providers',\n filterGoogle: 'Google Gemini',\n filterOpenAI: 'OpenAI / Relay',\n filterSeedream: 'ByteDance Seedream',\n filterDashScope: 'Aliyun DashScope',\n emptyTitle: 'No images generated yet',\n emptyDesc: 'Images generated during conversations will automatically appear here.',\n noMatchTitle: 'No matching images',\n noMatchDesc: 'Try a different search keyword or provider filter.',\n copiedPrompt: 'Prompt copied',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n preview: 'Full Preview',\n download: 'Download',\n copyImg: 'Copy Image',\n copyPpt: 'Copy Prompt',\n delete: 'Delete from gallery',\n confirmDelete: 'Are you sure you want to remove this image from the gallery? (Chat history will not be affected)',\n deleted: 'Deleted from gallery',\n model: 'Model',\n prompt: 'Prompt',\n close: 'Close (Esc)',\n },\n};\nexport const GalleryViewTab = ({ locale }) => {\n const [items, setItems] = useState([]);\n const [search, setSearch] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('all');\n const [previewItem, setPreviewItem] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [previewBlob, setPreviewBlob] = useState(null);\n const [toast, setToast] = useState(null);\n const [lang, setLang] = useState(() => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'en' : 'zh';\n });\n useEffect(() => {\n if (!locale?.subscribe)\n return;\n return locale.subscribe(() => {\n const active = locale.getSnapshot?.()?.active;\n setLang(active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [locale]);\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n const t = (key, params) => {\n let text = dict[key] || DICT.zh[key] || key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const showToast = (msg) => {\n setToast(msg);\n setTimeout(() => {\n setToast(null);\n }, 2000);\n };\n // Hide chat input composer while browsing gallery\n useEffect(() => {\n const seat = document.querySelector('[data-composer-seat]');\n if (seat) {\n const prevDisplay = seat.style.display;\n seat.style.display = 'none';\n return () => {\n seat.style.display = prevDisplay;\n };\n }\n }, []);\n useEffect(() => {\n let active = true;\n const load = () => {\n void getGalleryItems().then((res) => {\n if (active)\n setItems(res);\n });\n };\n load();\n const unsubscribe = subscribeGallery(load);\n return () => {\n active = false;\n unsubscribe();\n };\n }, []);\n useEffect(() => {\n if (!previewItem)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape') {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [previewItem]);\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n if (selectedProvider !== 'all' && item.provider !== selectedProvider)\n return false;\n if (search.trim().length > 0) {\n const q = search.trim().toLowerCase();\n const matchPrompt = item.prompt?.toLowerCase().includes(q);\n const matchModel = item.model?.toLowerCase().includes(q);\n if (!matchPrompt && !matchModel)\n return false;\n }\n return true;\n });\n }, [items, search, selectedProvider]);\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-page\", children: [_jsxs(\"header\", { className: \"dsh-ig-gallery-page-header\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-page-title-row\", children: _jsx(\"span\", { className: \"dsh-ig-gallery-page-count\", children: t('totalCount', { count: String(items.length) }) }) }), _jsxs(\"div\", { className: \"dsh-ig-gallery-page-tools\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-search-wrap\", children: [_jsxs(\"svg\", { className: \"dsh-ig-gallery-search-icon\", width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"circle\", { cx: \"11\", cy: \"11\", r: \"8\" }), _jsx(\"line\", { x1: \"21\", y1: \"21\", x2: \"16.65\", y2: \"16.65\" })] }), _jsx(\"input\", { type: \"text\", className: \"dsh-ig-gallery-search-input\", placeholder: t('searchPlaceholder'), value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(\"select\", { className: \"dsh-ig-gallery-select\", value: selectedProvider, onChange: (e) => setSelectedProvider(e.target.value), children: [_jsx(\"option\", { value: \"all\", children: t('filterAll') }), _jsx(\"option\", { value: \"google\", children: t('filterGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('filterOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('filterSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('filterDashScope') })] })] })] }), _jsx(\"div\", { className: \"dsh-ig-gallery-page-body\", children: items.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDDBC\\uFE0F\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('emptyTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('emptyDesc') })] })) : filteredItems.length === 0 ? (_jsxs(\"div\", { className: \"dsh-ig-gallery-empty\", children: [_jsx(\"div\", { className: \"dsh-ig-gallery-empty-icon\", children: \"\\uD83D\\uDD0D\" }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-title\", children: t('noMatchTitle') }), _jsx(\"div\", { className: \"dsh-ig-gallery-empty-desc\", children: t('noMatchDesc') })] })) : (_jsx(\"div\", { className: \"dsh-ig-gallery-grid\", children: filteredItems.map((item) => (_jsx(GalleryCard, { item: item, t: t, onPreview: (url, blob) => {\n setPreviewItem(item);\n setPreviewUrl(url);\n setPreviewBlob(blob);\n }, onToast: showToast }, item.id))) })) }), toast && _jsx(\"div\", { className: \"dsh-ig-gallery-page-toast\", children: toast }), previewItem && previewUrl && (_jsxs(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-topbar\", onClick: (e) => e.stopPropagation(), children: [_jsxs(\"div\", { className: \"dsh-ig-lightbox-meta\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: previewItem.provider }), previewItem.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: previewItem.model })) : null] }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-close-btn\", title: t('close'), onClick: () => {\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n }, children: _jsxs(\"svg\", { width: \"18\", height: \"18\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"line\", { x1: \"18\", y1: \"6\", x2: \"6\", y2: \"18\" }), _jsx(\"line\", { x1: \"6\", y1: \"6\", x2: \"18\", y2: \"18\" })] }) })] }), _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => e.stopPropagation(), children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: previewUrl, alt: previewItem.prompt }) }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-bottombar\", onClick: (e) => e.stopPropagation(), children: [_jsx(\"div\", { className: \"dsh-ig-lightbox-prompt-text\", title: previewItem.prompt, children: previewItem.prompt }), _jsxs(\"div\", { className: \"dsh-ig-lightbox-actions\", children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyPpt'), onClick: async () => {\n await navigator.clipboard.writeText(previewItem.prompt);\n showToast(t('copiedPrompt'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }), _jsx(\"span\", { children: t('copyPpt') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('copyImg'), onClick: async () => {\n if (!previewBlob)\n return;\n const ok = await copyImageBlob(previewBlob);\n showToast(ok ? t('copiedImage') : t('copyFailed'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }), _jsx(\"span\", { children: t('copyImg') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn\", title: t('download'), onClick: () => {\n const a = document.createElement('a');\n a.href = previewUrl;\n a.download = `dsh-${previewItem.provider}-${previewItem.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }), _jsx(\"span\", { children: t('download') })] }), _jsxs(\"button\", { type: \"button\", className: \"dsh-ig-lightbox-btn dsh-ig-lightbox-btn-danger\", title: t('delete'), onClick: async () => {\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(previewItem.id);\n setPreviewItem(null);\n setPreviewUrl(null);\n setPreviewBlob(null);\n showToast(t('deleted'));\n }, children: [_jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }), _jsx(\"span\", { children: t('delete') })] })] })] })] }))] }));\n};\nconst GalleryCard = ({ item, t, onPreview, onToast }) => {\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n useEffect(() => {\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment: item.attachment }),\n })\n .then(async (response) => {\n if (!response.ok)\n throw new Error(`HTTP ${response.status}`);\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n setLoading(false);\n })\n .catch((err) => {\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n });\n return () => {\n controller.abort();\n if (objectUrl)\n URL.revokeObjectURL(objectUrl);\n };\n }, [item.attachment]);\n const copyPrompt = async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(item.prompt);\n onToast(t('copiedPrompt'));\n }\n catch {\n onToast(t('copyFailed'));\n }\n };\n const copyImage = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n onToast(ok ? t('copiedImage') : t('copyFailed'));\n };\n const downloadImage = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `dsh-${item.provider}-${item.id}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n return (_jsxs(\"div\", { className: \"dsh-ig-gallery-card\", onClick: () => {\n if (url && blob)\n onPreview(url, blob);\n }, children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-media\", children: [loading && _jsx(\"div\", { className: \"dsh-ig-gallery-card-loading\", children: \"...\" }), error && _jsxs(\"div\", { className: \"dsh-ig-gallery-card-error\", children: [\"\\u26A0\\uFE0F \", error] }), url && (_jsx(\"img\", { className: \"dsh-ig-gallery-card-img\", src: url, alt: item.prompt, loading: \"lazy\" })), _jsxs(\"div\", { className: \"dsh-ig-card-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => {\n void copyImage(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: downloadImage, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyPpt'), onClick: (e) => {\n void copyPrompt(e);\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" }), _jsx(\"rect\", { x: \"8\", y: \"2\", width: \"8\", height: \"4\", rx: \"1\", ry: \"1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn dsh-ig-tool-btn-danger\", title: t('delete'), onClick: async (e) => {\n e.stopPropagation();\n if (!window.confirm(t('confirmDelete')))\n return;\n await deleteGalleryItem(item.id);\n onToast(t('deleted'));\n }, children: _jsxs(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"polyline\", { points: \"3 6 5 6 21 6\" }), _jsx(\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }), _jsx(\"line\", { x1: \"10\", y1: \"11\", x2: \"10\", y2: \"17\" }), _jsx(\"line\", { x1: \"14\", y1: \"11\", x2: \"14\", y2: \"17\" })] }) })] })] }), _jsxs(\"div\", { className: \"dsh-ig-gallery-card-meta\", children: [_jsxs(\"div\", { className: \"dsh-ig-gallery-card-header\", children: [_jsx(\"span\", { className: \"dsh-ig-tag\", children: item.provider }), item.model ? (_jsx(\"span\", { className: \"dsh-ig-tag dsh-ig-tag-model\", children: item.model })) : null] }), _jsx(\"p\", { className: \"dsh-ig-gallery-card-prompt\", title: item.prompt, children: item.prompt })] })] }));\n};\nexport async function copyImageBlob(blob) {\n try {\n if (blob.type === 'image/png') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n return true;\n }\n const img = new Image();\n const url = URL.createObjectURL(blob);\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n throw new Error('Canvas unavailable');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n const pngBlob = await new Promise((res) => {\n canvas.toBlob(res, 'image/png');\n });\n if (!pngBlob)\n throw new Error('Blob conversion failed');\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': pngBlob })]);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\n//# sourceMappingURL=gallery-view.js.map","/**\n * Extract the verified durable image attachment from a completed tool result block.\n * Supports legacy rc.2 `resultView.content` and modern DSH `block.content`.\n */\nexport function imageRef(block) {\n if (!('kind' in block))\n return undefined;\n const fromResultView = block.resultView?.card === 'generic'\n ? block.resultView.content?.find(item => item.type === 'image')\n : undefined;\n if (fromResultView?.type === 'image')\n return fromResultView.attachment;\n const fromBlockContent = Array.isArray(block.content)\n ? block.content.find(item => item.type === 'image')\n : undefined;\n if (fromBlockContent?.type === 'image')\n return fromBlockContent.attachment;\n return undefined;\n}\n//# sourceMappingURL=image-ref.js.map","export const IMAGE_RESULT_NODE_KIND = 'dsh-image-result';\n/** One image result row per Turn, re-anchored to Turn end after the final answer settles. */\nexport const imageResultDefinition = {\n kind: IMAGE_RESULT_NODE_KIND,\n target: 'chat',\n match: (event) => {\n const turn = eventTurn(event);\n if (turn === undefined)\n return null;\n if (event.type === 'turn/start')\n return { id: String(turn), role: 'start' };\n if (event.type === 'turn/end')\n return { id: String(turn), role: 'update' };\n if (event.type === 'assistant/message')\n return { id: String(turn), role: 'update' };\n if (event.type === 'tool/result' && imageResultFromMeta(event.data.meta) !== undefined) {\n return { id: String(turn), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n const turn = eventTurn(match.event);\n if (match.event.type !== 'turn/start' || turn === undefined) {\n throw new Error('dsh-image-result start requires turn/start');\n }\n return { turn, results: [] };\n },\n update: (context, match) => {\n if (match.event.type === 'turn/end')\n return { ...context.state, endSeq: match.event.seq };\n if (match.event.type === 'assistant/message')\n return { ...context.state, answerSeq: match.event.seq };\n if (match.event.type !== 'tool/result')\n return context.state;\n const result = imageResultFromMeta(match.event.data.meta);\n if (result === undefined)\n return context.state;\n if (context.state.results.some(candidate => candidate.attachment.attachmentId === result.attachment.attachmentId)) {\n return context.state;\n }\n return { ...context.state, results: [...context.state.results, { ...result, seq: match.event.seq }] };\n },\n buildViewNode: (context) => {\n const state = context.state;\n const last = state?.results.at(-1);\n if (state === undefined || last === undefined)\n return null;\n const location = context.matches.at(-1)?.location ?? context.start?.location ?? { kind: 'unresolved' };\n return {\n key: context.key,\n kind: IMAGE_RESULT_NODE_KIND,\n id: context.id,\n target: 'chat',\n // Compact folds only nodes before the finalized answer boundary. Sharing\n // that boundary keeps the artifact beside the answer and outside process.\n anchorSeq: state.answerSeq ?? state.endSeq ?? last.seq,\n location,\n visibility: 'visible',\n data: {\n turn: state.turn,\n results: state.results.map(({ seq: _seq, ...result }) => result),\n },\n };\n },\n};\n/** Parse the plugin-owned durable presentation metadata from a Tool result event. */\nexport function imageResultFromMeta(value) {\n const meta = record(value);\n if (meta?.kind !== 'dsh-image-gen')\n return undefined;\n const attachment = imageAttachment(meta.attachment);\n if (attachment === undefined)\n return undefined;\n return {\n attachment,\n prompt: stringValue(meta.prompt, 'Generated Image'),\n provider: stringValue(meta.provider, 'google'),\n model: stringValue(meta.model, ''),\n output: stringValue(meta.output, ''),\n ...(typeof meta.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n };\n}\nfunction eventTurn(event) {\n const turn = event.data.turn;\n return typeof turn === 'number' && Number.isSafeInteger(turn) && turn >= 0 ? turn : undefined;\n}\nfunction imageAttachment(value) {\n const candidate = record(value);\n if (candidate === undefined\n || typeof candidate.attachmentId !== 'string'\n || !isImageMediaType(candidate.mediaType)\n || !positiveInteger(candidate.bytes)\n || !positiveInteger(candidate.width)\n || !positiveInteger(candidate.height))\n return undefined;\n const original = record(candidate.originalDimensions);\n if (candidate.originalDimensions !== undefined\n && (original === undefined || !positiveInteger(original.width) || !positiveInteger(original.height)))\n return undefined;\n return {\n attachmentId: candidate.attachmentId,\n mediaType: candidate.mediaType,\n bytes: candidate.bytes,\n width: candidate.width,\n height: candidate.height,\n ...(typeof candidate.name === 'string' ? { name: candidate.name } : {}),\n ...(original === undefined ? {} : { originalDimensions: { width: original.width, height: original.height } }),\n };\n}\nfunction isImageMediaType(value) {\n return value === 'image/png' || value === 'image/jpeg' || value === 'image/webp' || value === 'image/gif';\n}\nfunction positiveInteger(value) {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\nfunction stringValue(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction record(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value\n : undefined;\n}\n//# sourceMappingURL=image-result-node.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { DEFAULT_BASE_URLS, DEFAULT_COMFYUI_TIMEOUT_MS, DEFAULT_MODELS, IMAGE_GENERATION_NAMESPACE, IMAGE_ROUTE, MAX_COMFYUI_WORKFLOW_BYTES, } from '../shared.js';\nimport { validateComfyUIWorkflowJson } from '../comfyui-workflow.js';\nimport { saveGalleryItem } from './gallery-store.js';\nimport { GalleryViewTab, copyImageBlob } from './gallery-view.js';\nimport { imageRef } from './image-ref.js';\nimport { IMAGE_RESULT_NODE_KIND, imageResultDefinition, } from './image-result-node.js';\nconst KEY_REF = {\n google: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n seedream: 'ARK_API_KEY',\n dashscope: 'DASHSCOPE_API_KEY',\n};\nconst DICT = {\n zh: {\n title: '图像生成',\n description: '选择厂商并配置生图模型。',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / 中转站',\n providerSeedream: '字节 Seedream',\n providerDashScope: '阿里 DashScope (通义万相 / Qwen)',\n providerComfyUI: '本地 ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: '留空即可保留已配置的 Key',\n apiKeyHint: '安全保存为 {key};页面不会读回明文。',\n endpoint: '接口地址',\n reset: '重置',\n resetTitle: '重置为默认官方地址',\n endpointHintGoogle: 'Google 官方地址或反代端点(全路径)。',\n endpointHintOpenAI: '中转站请填其 OpenAI 兼容的 /v1 地址。',\n endpointHintSeedream: '火山方舟兼容的 /api/v3 地址。',\n endpointHintDashScope: '阿里云百炼 DashScope 官方接口地址。',\n endpointHintComfyUI: '正在运行且 DSH Host 可以访问的 ComfyUI 地址,默认使用本机 8188 端口。',\n model: '模型',\n workflow: 'API Workflow',\n workflowImport: '导入 JSON 文件',\n workflowReplace: '替换 JSON 文件',\n workflowMissing: '尚未导入工作流',\n workflowImported: '已导入 {name}',\n workflowHint: '请从 ComfyUI 导出 API Format JSON,并在提示词输入位置写入 {{prompt}};可用 {{seed}} 作为随机种子。',\n workflowTooLarge: '工作流文件不能超过 5 MB。',\n timeout: '生成超时(秒)',\n timeoutHint: '包括提交、等待和下载图片;默认 300 秒。',\n saveToWorkspace: '保存到工作区',\n saveToWorkspaceHint: '每次生成后,把图片文件保存到当前会话工作区。',\n folder: '工作区文件夹',\n folderHint: '相对当前会话工作区的子目录;留空表示工作区根目录。',\n saving: '保存中…',\n save: '保存',\n saved: '已保存',\n savedToPath: '已保存到',\n checkingKey: '正在检查 API Key…',\n keyConfigured: '已配置 API Key',\n keyNotConfigured: '尚未配置 API Key',\n generating: '正在生成图片…',\n loading: '正在加载图片…',\n loadFailed: '图片读取失败 ({status})',\n generatedTitle: '已生成图片',\n resultShown: '图片结果已显示在对话中',\n copyImg: '复制图片',\n download: '下载图片',\n openNewTab: '新标签页打开',\n copiedImage: '已复制图片',\n copyFailed: '复制失败',\n },\n en: {\n title: 'Image Generation',\n description: 'Select provider and configure image generation models.',\n provider: 'Provider',\n providerGoogle: 'Google Gemini',\n providerOpenAI: 'OpenAI / Relay',\n providerSeedream: 'ByteDance Seedream',\n providerDashScope: 'Aliyun DashScope (Wanx / Qwen)',\n providerComfyUI: 'Local ComfyUI',\n apiKeyLabel: '{provider} API Key',\n apiKeyPlaceholder: 'Leave empty to keep configured key',\n apiKeyHint: 'Securely saved as {key}; never read back in plaintext.',\n endpoint: 'Endpoint / Base URL',\n reset: 'Reset',\n resetTitle: 'Reset to official default URL',\n endpointHintGoogle: 'Official Google endpoint or reverse proxy (full path).',\n endpointHintOpenAI: 'OpenAI-compatible /v1 base URL for relays.',\n endpointHintSeedream: 'Volcengine Ark compatible /api/v3 base URL.',\n endpointHintDashScope: 'Official Aliyun DashScope endpoint.',\n endpointHintComfyUI: 'A running ComfyUI server reachable by the DSH Host; the default points to port 8188 on this computer.',\n model: 'Model',\n workflow: 'API Workflow',\n workflowImport: 'Import JSON file',\n workflowReplace: 'Replace JSON file',\n workflowMissing: 'No workflow imported',\n workflowImported: 'Imported {name}',\n workflowHint: 'Export an API Format JSON from ComfyUI and place {{prompt}} in its prompt input. {{seed}} is available for a random seed.',\n workflowTooLarge: 'Workflow files must be no larger than 5 MB.',\n timeout: 'Generation timeout (seconds)',\n timeoutHint: 'Covers submission, waiting, and image download; defaults to 300 seconds.',\n saveToWorkspace: 'Save to workspace',\n saveToWorkspaceHint: 'Write each generated image as a file into the session workspace.',\n folder: 'Workspace folder',\n folderHint: 'Subdirectory of the session workspace; empty means the workspace root.',\n saving: 'Saving…',\n save: 'Save',\n saved: 'Saved',\n savedToPath: 'Saved to',\n checkingKey: 'Checking API Key…',\n keyConfigured: 'API Key configured',\n keyNotConfigured: 'API Key not configured',\n generating: 'Generating image…',\n loading: 'Loading image…',\n loadFailed: 'Failed to load image ({status})',\n generatedTitle: 'Generated image',\n resultShown: 'Image result is shown in the conversation',\n copyImg: 'Copy Image',\n download: 'Download Image',\n openNewTab: 'Open in new tab',\n copiedImage: 'Image copied',\n copyFailed: 'Copy failed',\n },\n};\nconst STYLE = `\n.dsh-ig-card{list-style:none;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);transition:border-color .16s,background .16s;overflow:hidden}\n.dsh-ig-card:hover{border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-card-open{background:var(--dsw-alias-bg-layer-2,#fff);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-head{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:12px}\n.dsh-ig-head:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:-2px}\n.dsh-ig-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dsh-ig-title{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-desc{display:block;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#7b818b);transition:transform .16s;display:inline-flex;align-items:center}\n.dsh-ig-chevron-open{transform:rotate(180deg)}\n.dsh-ig-body{border-top:1px solid var(--dsw-alias-border-l2,#eee);padding:0 16px 16px}\n.dsh-ig-field{display:grid;gap:6px;margin-top:14px}\n.dsh-ig-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary,inherit)}\n.dsh-ig-input{box-sizing:border-box;width:100%;padding:8px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-3,transparent);color:inherit;outline:none;transition:border-color .15s}\n.dsh-ig-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff)}\n.dsh-ig-input-group{display:flex;gap:8px;align-items:center}\n.dsh-ig-file-row{display:flex;align-items:center;gap:10px;min-width:0}\n.dsh-ig-file-input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;clip-path:inset(50%)}\n.dsh-ig-file-button{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font-size:13px;cursor:pointer;transition:background .15s,border-color .15s}\n.dsh-ig-file-button:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-file-button:focus-within{outline:2px solid var(--dsw-alias-brand-primary,#4c78ff);outline-offset:2px}\n.dsh-ig-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary,inherit);font-size:12px}\n.dsh-ig-btn-reset{appearance:none;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;padding:7px 12px;background:var(--dsw-alias-bg-layer-3,#f9fafb);color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s}\n.dsh-ig-btn-reset:hover{background:var(--dsw-alias-bg-layer-2,#edf0f3);border-color:var(--dsw-alias-label-dimmed,#9ca3af)}\n.dsh-ig-hint,.dsh-ig-status{margin:0;color:var(--dsw-alias-label-tertiary,#7b818b);font-size:12px;line-height:1.4}\n.dsh-ig-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2,#eee)}\n.dsh-ig-check-row{display:flex;align-items:center;gap:8px;cursor:pointer}\n.dsh-ig-check-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--dsw-alias-brand-primary,#4c78ff);margin:0}\n.dsh-ig-savedto{font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#7b818b);word-break:break-all}\n.dsh-ig-save{appearance:none;border:0;border-radius:8px;padding:6px 16px;background:var(--dsw-alias-label-primary,#111827);color:var(--dsw-alias-bg-layer-3,#fff);font:inherit;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s}\n.dsh-ig-save:disabled{opacity:.4;cursor:default}\n\n.dsh-ig-result{display:grid;gap:10px;max-width:520px}\n.dsh-ig-promoted-results{display:grid;gap:16px}\n.dsh-ig-result-title{font-size:14px;font-weight:600}\n.dsh-ig-container{position:relative;display:inline-block;width:fit-content;max-width:100%;justify-self:start;border-radius:12px;overflow:hidden;line-height:0}\n.dsh-ig-container:hover .dsh-ig-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.65);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n.dsh-ig-tool-btn{appearance:none;border:0;background:transparent;color:#fff;padding:5px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}\n.dsh-ig-tool-btn:hover{background:rgba(255,255,255,0.25)}\n.dsh-ig-tool-btn-danger:hover{background:rgba(239,68,68,0.75)!important;color:#fff!important}\n.dsh-ig-toast{position:absolute;top:100%;left:0;margin-top:5px;padding:3px 8px;border-radius:6px;background:rgba(0,0,0,0.85);color:#fff;font-size:11px;white-space:nowrap;pointer-events:none;z-index:20}\n.dsh-ig-image{display:block;max-width:100%;max-height:520px;border-radius:12px;background:#f2f3f5;cursor:pointer}\n@keyframes dsh-ig-fade{from{opacity:0}to{opacity:1}}\n.dsh-ig-error{color:var(--dsw-alias-label-error,#d33);font-size:13px}\n.dsh-ig-loading{color:var(--dsw-alias-label-tertiary,#7b818b);font-size:13px}\n\n/* Native Workspace Gallery View (Renders seamlessly inside DSH Session View) */\n.dsh-ig-gallery-page{width:100%;height:100%;background:var(--dsw-alias-bg-layer-1,#ffffff);display:flex;flex-direction:column;overflow:hidden;flex:1}\n.dsh-ig-gallery-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 28px;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#ffffff);flex-shrink:0}\n.dsh-ig-gallery-page-title-row{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-page-count{font-size:13px;font-weight:500;color:var(--dsw-alias-label-secondary,#4b5563);background:var(--dsw-alias-bg-layer-3,#f3f4f6);padding:3px 10px;border-radius:20px}\n.dsh-ig-gallery-page-tools{display:flex;align-items:center;gap:12px}\n.dsh-ig-gallery-search-wrap{position:relative;display:flex;align-items:center}\n.dsh-ig-gallery-search-icon{position:absolute;left:10px;color:var(--dsw-alias-label-tertiary,#9ca3af);pointer-events:none}\n.dsh-ig-gallery-search-input{padding:6px 12px 6px 32px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;width:200px;transition:border-color .15s,width .2s}\n.dsh-ig-gallery-search-input:focus{border-color:var(--dsw-alias-brand-primary,#4c78ff);width:240px}\n.dsh-ig-gallery-select{padding:6px 12px;font-size:13px;border:1px solid var(--dsw-alias-border-l2,#d7dbe0);border-radius:8px;background:var(--dsw-alias-bg-layer-2,#fff);color:inherit;outline:none;cursor:pointer}\n.dsh-ig-gallery-page-body{flex:1;overflow-y:auto;padding:24px 28px}\n.dsh-ig-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}\n.dsh-ig-gallery-card{background:var(--dsw-alias-bg-layer-2,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}\n.dsh-ig-gallery-card:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,0.06);border-color:var(--dsw-alias-border-l1,#cfd4dc)}\n.dsh-ig-gallery-card-media{position:relative;width:100%;aspect-ratio:1/1;background:#f3f4f6;overflow:hidden;display:flex;align-items:center;justify-content:center}\n.dsh-ig-gallery-card-img{width:100%;height:100%;object-fit:cover;transition:transform .2s}\n.dsh-ig-gallery-card:hover .dsh-ig-gallery-card-img{transform:scale(1.03)}\n.dsh-ig-gallery-card-loading{font-size:12px;color:#9ca3af}\n.dsh-ig-gallery-card-error{font-size:12px;color:#ef4444;padding:8px;text-align:center}\n\n/* Floating Action Toolbar (Matches Chat Image Toolbar) */\n.dsh-ig-gallery-card:hover .dsh-ig-card-toolbar{opacity:1;pointer-events:auto}\n.dsh-ig-card-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:4px;padding:3px 5px;border-radius:8px;background:rgba(0,0,0,0.68);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .18s ease;z-index:10;line-height:1}\n\n.dsh-ig-gallery-card-meta{padding:12px 14px;display:flex;flex-direction:column;gap:6px;background:var(--dsw-alias-bg-layer-2,#fff);flex:1}\n.dsh-ig-gallery-card-header{display:flex;align-items:center;justify-content:space-between;font-size:11px}\n.dsh-ig-tag{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3,#edf0f3);color:var(--dsw-alias-label-secondary,inherit);font-weight:500;text-transform:uppercase;font-size:10px}\n.dsh-ig-tag-model{background:rgba(76,120,255,0.1);color:#4c78ff}\n.dsh-ig-gallery-card-prompt{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-primary,inherit);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-gallery-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:360px;text-align:center;color:var(--dsw-alias-label-tertiary,#7b818b)}\n.dsh-ig-gallery-empty-icon{font-size:48px;margin-bottom:12px}\n.dsh-ig-gallery-empty-title{font-size:16px;font-weight:600;color:var(--dsw-alias-label-primary,inherit);margin-bottom:6px}\n.dsh-ig-gallery-empty-desc{font-size:13px;max-width:360px;line-height:1.5}\n\n/* Pure Centered Lightbox */\n.dsh-ig-lightbox-backdrop{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box;cursor:zoom-out;animation:dsh-ig-fade .15s ease-out}\n.dsh-ig-lightbox-topbar{position:absolute;top:20px;left:24px;right:24px;display:flex;align-items:center;justify-content:space-between;z-index:10;pointer-events:none}\n.dsh-ig-lightbox-meta{display:flex;align-items:center;gap:8px;pointer-events:auto}\n.dsh-ig-lightbox-close-btn{appearance:none;border:0;background:rgba(255,255,255,0.15);color:#fff;border-radius:50%;width:34px;height:34px;font-size:16px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;pointer-events:auto}\n.dsh-ig-lightbox-close-btn:hover{background:rgba(255,255,255,0.3)}\n.dsh-ig-lightbox-img-wrap{max-width:86vw;max-height:78vh;display:flex;align-items:center;justify-content:center;cursor:default}\n.dsh-ig-lightbox-img{max-width:100%;max-height:78vh;object-fit:contain;border-radius:8px;box-shadow:0 24px 60px rgba(0,0,0,0.7);user-select:none}\n.dsh-ig-lightbox-bottombar{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,640px);background:rgba(20,22,26,0.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:14px;padding:10px 16px;display:flex;flex-direction:column;gap:8px;color:#fff;box-shadow:0 16px 40px rgba(0,0,0,0.5);cursor:default}\n.dsh-ig-lightbox-prompt-text{font-size:13px;line-height:1.4;color:rgba(255,255,255,0.92);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}\n.dsh-ig-lightbox-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end;border-top:1px solid rgba(255,255,255,0.1);padding-top:8px}\n.dsh-ig-lightbox-btn{appearance:none;border:1px solid rgba(255,255,255,0.18);background:rgba(255,255,255,0.08);color:#fff;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;transition:background .15s,border-color .15s,color .15s}\n.dsh-ig-lightbox-btn:hover{background:rgba(255,255,255,0.22)}\n.dsh-ig-lightbox-btn-danger{border-color:rgba(239,68,68,0.4);color:#fca5a5}\n.dsh-ig-lightbox-btn-danger:hover{background:rgba(239,68,68,0.35)!important;color:#fff!important;border-color:rgba(239,68,68,0.7)!important}\n.dsh-ig-gallery-page-toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.85);color:#fff;padding:6px 14px;border-radius:8px;font-size:13px;z-index:99999;animation:dsh-ig-fade .15s}\n\n/* Hide floating chat composer when gallery page is active */\n[data-conversation-scroll]:has(.dsh-ig-gallery-page) [data-composer-seat]{display:none!important}\n`;\n/** Required browser services. */\nexport const inject = ['slots', 'connection', 'remote', 'settingsScope', 'locale'];\n/** Mount the settings card, generated-image card, and native conversation gallery view. */\nexport function apply(ctx) {\n const scope = ctx.settingsScope.bind({ namespace: IMAGE_GENERATION_NAMESPACE });\n const locale = ctx.get('locale');\n const promotion = { enabled: false };\n ctx.effect(() => {\n const style = document.createElement('style');\n style.dataset.plugin = 'dsh-image-gen';\n style.textContent = STYLE;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, 'dsh-image-gen: styles');\n const register = ctx.slots.register.bind(ctx.slots);\n ctx.inject(['uiConversation'], (owner) => {\n const uiConversation = asModernUiConversation(owner.get('uiConversation'));\n if (uiConversation === undefined) {\n throw new Error('dsh-image-gen: uiConversation has an incompatible interface');\n }\n promotion.enabled = true;\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.effect(() => uiConversation.events.register(imageResultDefinition), 'dsh-image-gen: promoted image result node');\n owner.slots.inject('conversation.chat.node', () => ownerRegister({\n name: 'conversation.chat.node',\n key: IMAGE_RESULT_NODE_KIND,\n inject: () => ({ locale }),\n }, PromotedImageResultNode));\n });\n // 1. Settings item\n const injectSettingsItem = (owner, credentials) => {\n const ownerRegister = owner.slots.register.bind(owner.slots);\n owner.slots.inject('settings.plugin.item', () => ownerRegister({\n name: 'settings.plugin.item',\n key: IMAGE_GENERATION_NAMESPACE,\n inject: () => ({ scope, credentials, locale }),\n }, ImageGenerationSettingsCard));\n };\n const remoteCredentials = asCredentialsRemote(ctx.get('remote.credentials'));\n const legacyCredentials = credentialsFromLegacyConnection(ctx.get('connection'));\n if (remoteCredentials !== undefined) {\n injectSettingsItem(ctx, remoteCredentials);\n }\n else if (legacyCredentials !== undefined) {\n injectSettingsItem(ctx, legacyCredentials);\n }\n else {\n ctx.inject(['remote.credentials'], (remoteCtx) => {\n const credentials = asCredentialsRemote(remoteCtx.get('remote.credentials'));\n if (credentials === undefined)\n throw new Error('dsh-image-gen: remote.credentials has an incompatible interface');\n injectSettingsItem(remoteCtx, credentials);\n });\n }\n // 2. Tool result view card in chat stream\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'generate_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('tool.call.toolview', () => register({\n name: 'tool.call.toolview',\n key: 'edit_image',\n inject: () => ({ locale, promoted: promotion.enabled }),\n }, GeneratedImageCard));\n ctx.slots.inject('conversation.view', () => register({\n name: 'conversation.view',\n id: 'gallery',\n order: 20,\n label: () => {\n const active = locale?.getSnapshot?.()?.active;\n return active?.startsWith('en') ? 'Gallery' : '画廊';\n },\n inject: () => ({ locale }),\n }, GalleryViewTab));\n}\nfunction asModernUiConversation(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const events = value.events;\n if (events === null || typeof events !== 'object')\n return undefined;\n return typeof events.register === 'function'\n ? value\n : undefined;\n}\nfunction asCredentialsRemote(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const candidate = value;\n return typeof candidate.describe === 'function' && typeof candidate.set === 'function'\n ? candidate\n : undefined;\n}\nfunction credentialsFromLegacyConnection(value) {\n if (value === null || typeof value !== 'object')\n return undefined;\n const credentials = value.api?.credentials;\n if (credentials === undefined || typeof credentials.describe !== 'function' || typeof credentials.set !== 'function')\n return undefined;\n const legacy = credentials;\n return {\n async describe(refs) {\n const response = await legacy.describe({ refs });\n return response.result.ok\n ? { ok: true, value: response.result.value.credentials }\n : { ok: false };\n },\n async set(ref, credentialValue) {\n const response = await legacy.set({ ref, value: credentialValue });\n return response.result.ok\n ? { ok: true }\n : { ok: false, error: response.result.error };\n },\n };\n}\n/** Edit provider settings and its write-only API credential. */\nexport function ImageGenerationSettingsCard(props) {\n const [open, setOpen] = useState(false);\n const [snapshot, setSnapshot] = useState(() => props.scope.getSnapshot());\n const [lang, setLang] = useState(() => (props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh'));\n const [provider, setProvider] = useState('google');\n const [model, setModel] = useState('');\n const [baseURL, setBaseURL] = useState('');\n const [workflowJson, setWorkflowJson] = useState('');\n const [workflowName, setWorkflowName] = useState('');\n const [timeoutSeconds, setTimeoutSeconds] = useState(DEFAULT_COMFYUI_TIMEOUT_MS / 1000);\n const [saveToWorkspace, setSaveToWorkspace] = useState(true);\n const [workspaceFolder, setWorkspaceFolder] = useState('dsh-image-gen');\n const [key, setKey] = useState('');\n const [configured, setConfigured] = useState();\n const [saving, setSaving] = useState(false);\n const [message, setMessage] = useState('');\n useEffect(() => props.scope.subscribe(() => { setSnapshot(props.scope.getSnapshot()); }), [props.scope]);\n useEffect(() => {\n return props.locale?.subscribe?.(() => {\n setLang(props.locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n });\n }, [props.locale]);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n const providerLabels = {\n google: t('providerGoogle'),\n openai: t('providerOpenAI'),\n seedream: t('providerSeedream'),\n dashscope: t('providerDashScope'),\n comfyui: t('providerComfyUI'),\n };\n useEffect(() => {\n const value = snapshot.value;\n const next = value?.provider ?? 'google';\n setProvider(next);\n setModel(modelOf(next, value));\n setBaseURL(baseURLOf(next, value));\n setWorkflowJson(value?.comfyuiWorkflowJson ?? '');\n setWorkflowName(value?.comfyuiWorkflowName ?? '');\n setTimeoutSeconds(Math.max(1, Math.round((value?.comfyuiTimeoutMs ?? DEFAULT_COMFYUI_TIMEOUT_MS) / 1000)));\n setSaveToWorkspace(value?.saveToWorkspace ?? true);\n setWorkspaceFolder(value?.workspaceFolder ?? 'dsh-image-gen');\n }, [snapshot]);\n useEffect(() => {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined) {\n setConfigured(undefined);\n return;\n }\n let active = true;\n void props.credentials.describe([keyRef]).then(response => {\n if (active)\n setConfigured(response.ok ? response.value?.[keyRef]?.configured ?? false : undefined);\n }).catch(() => { if (active)\n setConfigured(undefined); });\n return () => { active = false; };\n }, [props.credentials, provider]);\n const save = async (event) => {\n event.preventDefault();\n setSaving(true);\n setMessage('');\n try {\n await props.scope.set('provider', provider);\n if (provider === 'comfyui') {\n validateComfyUIWorkflowJson(workflowJson);\n await props.scope.set('comfyuiBaseURL', baseURL);\n await props.scope.set('comfyuiWorkflowJson', workflowJson);\n await props.scope.set('comfyuiWorkflowName', workflowName);\n await props.scope.set('comfyuiTimeoutMs', Math.max(1, Math.round(timeoutSeconds)) * 1000);\n }\n else {\n await props.scope.set(provider === 'google' ? 'googleModel' : provider === 'openai' ? 'openaiModel' : provider === 'seedream' ? 'seedreamModel' : 'dashscopeModel', model);\n await props.scope.set(provider === 'google' ? 'googleEndpoint' : provider === 'openai' ? 'openaiBaseURL' : provider === 'seedream' ? 'seedreamBaseURL' : 'dashscopeEndpoint', baseURL);\n }\n await props.scope.set('saveToWorkspace', saveToWorkspace);\n await props.scope.set('workspaceFolder', workspaceFolder.trim());\n if (key.trim().length > 0) {\n const keyRef = KEY_REF[provider];\n if (keyRef === undefined)\n throw new Error('ComfyUI does not use an API key in this version');\n const response = await props.credentials.set(keyRef, key.trim());\n if (!response.ok)\n throw new Error(response.error?.message ?? 'Failed to save API key');\n setKey('');\n setConfigured(true);\n }\n setMessage(t('saved'));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\n finally {\n setSaving(false);\n }\n };\n const keyStatus = configured === undefined ? t('checkingKey') : configured ? t('keyConfigured') : t('keyNotConfigured');\n const workflowStatus = workflowName.length > 0 ? t('workflowImported', { name: workflowName }) : t('workflowMissing');\n const importWorkflow = async (event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file === undefined)\n return;\n setMessage('');\n try {\n if (file.size > MAX_COMFYUI_WORKFLOW_BYTES)\n throw new Error(t('workflowTooLarge'));\n const json = await file.text();\n validateComfyUIWorkflowJson(json);\n setWorkflowJson(json);\n setWorkflowName(file.name);\n setMessage(t('workflowImported', { name: file.name }));\n }\n catch (cause) {\n setMessage(cause instanceof Error ? cause.message : String(cause));\n }\n };\n return (_jsxs(\"li\", { className: `dsh-ig-card ${open ? 'dsh-ig-card-open' : ''}`, children: [_jsxs(\"button\", { type: \"button\", className: \"dsh-ig-head\", \"aria-expanded\": open, onClick: () => { setOpen(value => !value); }, children: [_jsxs(\"span\", { className: \"dsh-ig-head-text\", children: [_jsx(\"span\", { className: \"dsh-ig-title\", children: t('title') }), _jsx(\"span\", { className: \"dsh-ig-desc\", children: t('description') })] }), _jsx(\"span\", { className: `dsh-ig-chevron ${open ? 'dsh-ig-chevron-open' : ''}`, \"aria-hidden\": \"true\", children: _jsx(\"svg\", { width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: _jsx(\"path\", { d: \"M4 6l4 4 4-4\" }) }) })] }), open ? (_jsxs(\"form\", { className: \"dsh-ig-body\", onSubmit: (event) => { void save(event); }, children: [_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('provider') }), _jsxs(\"select\", { className: \"dsh-ig-input\", value: provider, onChange: event => { const next = event.target.value; setProvider(next); setModel(modelOf(next, snapshot.value)); setBaseURL(baseURLOf(next, snapshot.value)); setKey(''); }, children: [_jsx(\"option\", { value: \"google\", children: t('providerGoogle') }), _jsx(\"option\", { value: \"openai\", children: t('providerOpenAI') }), _jsx(\"option\", { value: \"seedream\", children: t('providerSeedream') }), _jsx(\"option\", { value: \"dashscope\", children: t('providerDashScope') }), _jsx(\"option\", { value: \"comfyui\", children: t('providerComfyUI') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: providerLabels[provider] })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('apiKeyLabel', { provider: providerLabels[provider] }) }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"password\", autoComplete: \"off\", value: key, onChange: event => { setKey(event.target.value); }, placeholder: configured ? t('apiKeyPlaceholder') : '' }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('apiKeyHint', { key: KEY_REF[provider] ?? '' }) })] }) : null, _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('endpoint') }), _jsxs(\"div\", { className: \"dsh-ig-input-group\", children: [_jsx(\"input\", { className: \"dsh-ig-input\", type: \"url\", value: baseURL, onChange: event => { setBaseURL(event.target.value); }, required: true }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-btn-reset\", title: t('resetTitle'), onClick: () => { setBaseURL(DEFAULT_BASE_URLS[provider]); }, children: t('reset') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: provider === 'google' ? t('endpointHintGoogle') : provider === 'openai' ? t('endpointHintOpenAI') : provider === 'seedream' ? t('endpointHintSeedream') : provider === 'dashscope' ? t('endpointHintDashScope') : t('endpointHintComfyUI') })] }), provider !== 'comfyui' ? _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('model') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: model, onChange: event => { setModel(event.target.value); }, required: true })] }) : (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('workflow') }), _jsxs(\"div\", { className: \"dsh-ig-file-row\", children: [_jsxs(\"label\", { className: \"dsh-ig-file-button\", children: [_jsx(\"input\", { className: \"dsh-ig-file-input\", type: \"file\", accept: \".json,application/json\", onChange: event => { void importWorkflow(event); } }), workflowName.length > 0 ? t('workflowReplace') : t('workflowImport')] }), _jsx(\"span\", { className: \"dsh-ig-file-name\", title: workflowName, children: workflowName || t('workflowMissing') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('workflowHint') })] }), _jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('timeout') }), _jsx(\"input\", { className: \"dsh-ig-input\", type: \"number\", min: \"1\", max: \"3600\", step: \"1\", value: timeoutSeconds, onChange: event => { setTimeoutSeconds(Number(event.target.value)); }, required: true }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('timeoutHint') })] })] })), _jsxs(\"div\", { className: \"dsh-ig-field\", children: [_jsxs(\"label\", { className: \"dsh-ig-check-row\", children: [_jsx(\"input\", { type: \"checkbox\", checked: saveToWorkspace, onChange: event => { setSaveToWorkspace(event.target.checked); } }), _jsx(\"span\", { className: \"dsh-ig-label\", children: t('saveToWorkspace') })] }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('saveToWorkspaceHint') })] }), saveToWorkspace ? (_jsxs(\"label\", { className: \"dsh-ig-field\", children: [_jsx(\"span\", { className: \"dsh-ig-label\", children: t('folder') }), _jsx(\"input\", { className: \"dsh-ig-input\", value: workspaceFolder, onChange: event => { setWorkspaceFolder(event.target.value); }, placeholder: \"dsh-image-gen\" }), _jsx(\"span\", { className: \"dsh-ig-hint\", children: t('folderHint') })] })) : null, _jsxs(\"div\", { className: \"dsh-ig-actions\", children: [_jsx(\"p\", { className: \"dsh-ig-status\", role: \"status\", children: message || (provider === 'comfyui' ? workflowStatus : keyStatus) }), _jsx(\"button\", { className: \"dsh-ig-save\", type: \"submit\", disabled: saving || !snapshot.writable || (provider === 'comfyui' && workflowJson.length === 0), children: saving ? t('saving') : t('save') })] })] })) : null] }));\n}\n/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */\nexport function GeneratedImageCard(props) {\n const result = imageResultFromBlock(props.block);\n if (props.promoted && result !== undefined)\n return _jsx(PromotedResultNotice, { locale: props.locale });\n return _jsx(ImageResultCard, { result: result, locale: props.locale });\n}\n/** Render modern image artifacts as final conversation output instead of Tool process content. */\nexport function PromotedImageResultNode(props) {\n return _jsx(\"div\", { className: \"dsh-ig-promoted-results\", children: props.node.data.results.map(result => _jsx(ImageResultCard, { result: result, locale: props.locale }, result.attachment.attachmentId)) });\n}\nfunction PromotedResultNotice({ locale }) {\n const lang = usePluginLanguage(locale);\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: DICT[lang].resultShown });\n}\nfunction ImageResultCard({ result, locale, }) {\n const attachment = result?.attachment;\n const savedTo = result?.savedTo;\n const [url, setUrl] = useState();\n const [blob, setBlob] = useState();\n const [error, setError] = useState();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [toast, setToast] = useState();\n const lang = usePluginLanguage(locale);\n const t = (keyName, params) => {\n const dict = lang === 'en' ? DICT.en : DICT.zh;\n let text = dict[keyName] || DICT.zh[keyName] || keyName;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n };\n // Auto-collect into gallery IndexedDB\n useEffect(() => {\n if (result === undefined)\n return;\n void saveGalleryItem({\n id: result.attachment.attachmentId,\n attachment: result.attachment,\n prompt: result.prompt,\n provider: result.provider,\n model: result.model,\n output: result.output,\n });\n }, [result?.attachment.attachmentId]);\n useEffect(() => {\n if (!previewOpen)\n return;\n const onKeyDown = (e) => {\n if (e.key === 'Escape')\n setPreviewOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, [previewOpen]);\n useEffect(() => {\n if (attachment === undefined)\n return;\n const controller = new AbortController();\n let objectUrl;\n void fetch(IMAGE_ROUTE, {\n method: 'POST',\n signal: controller.signal,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ attachment }),\n }).then(async (response) => {\n if (!response.ok)\n throw new Error(t('loadFailed', { status: String(response.status) }));\n const resBlob = await response.blob();\n if (controller.signal.aborted)\n return;\n setBlob(resBlob);\n objectUrl = URL.createObjectURL(resBlob);\n setUrl(objectUrl);\n }).catch(cause => {\n if (!controller.signal.aborted)\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n if (objectUrl !== undefined)\n URL.revokeObjectURL(objectUrl);\n };\n }, [attachment?.attachmentId, lang]);\n const copy = async (e) => {\n e.stopPropagation();\n if (!blob)\n return;\n const ok = await copyImageBlob(blob);\n setToast(ok ? t('copiedImage') : t('copyFailed'));\n setTimeout(() => { setToast(undefined); }, 2000);\n };\n const download = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n const a = document.createElement('a');\n a.href = url;\n a.download = attachment?.name || `dsh-image-${Date.now()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const openNewTab = (e) => {\n e.stopPropagation();\n if (!url)\n return;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n if (attachment === undefined)\n return _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('generating') });\n return _jsxs(\"section\", { className: \"dsh-ig-result\", \"aria-label\": t('generatedTitle'), children: [_jsx(\"div\", { className: \"dsh-ig-result-title\", children: t('generatedTitle') }), savedTo !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-savedto\", children: [t('savedToPath'), \": \", savedTo] }) : null, error !== undefined ? _jsx(\"div\", { className: \"dsh-ig-error\", children: error }) : null, url === undefined && error === undefined ? _jsx(\"div\", { className: \"dsh-ig-loading\", children: t('loading') }) : null, url !== undefined ? _jsxs(\"div\", { className: \"dsh-ig-container\", children: [_jsx(\"img\", { className: \"dsh-ig-image\", src: url, alt: attachment.name ?? 'Generated image', onClick: () => { setPreviewOpen(true); } }), _jsxs(\"div\", { className: \"dsh-ig-toolbar\", children: [_jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('copyImg'), onClick: (e) => { void copy(e); }, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }), _jsx(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('download'), onClick: download, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }), _jsx(\"polyline\", { points: \"7 10 12 15 17 10\" }), _jsx(\"line\", { x1: \"12\", y1: \"15\", x2: \"12\", y2: \"3\" })] }) }), _jsx(\"button\", { type: \"button\", className: \"dsh-ig-tool-btn\", title: t('openNewTab'), onClick: openNewTab, children: _jsxs(\"svg\", { width: \"15\", height: \"15\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: [_jsx(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }), _jsx(\"polyline\", { points: \"15 3 21 3 21 9\" }), _jsx(\"line\", { x1: \"10\", y1: \"14\", x2: \"21\", y2: \"3\" })] }) }), toast ? _jsx(\"div\", { className: \"dsh-ig-toast\", children: toast }) : null] })] }) : null, previewOpen && url !== undefined ? _jsx(\"div\", { className: \"dsh-ig-lightbox-backdrop\", onClick: () => { setPreviewOpen(false); }, children: _jsx(\"div\", { className: \"dsh-ig-lightbox-img-wrap\", onClick: (e) => { e.stopPropagation(); }, children: _jsx(\"img\", { className: \"dsh-ig-lightbox-img\", src: url, alt: attachment.name ?? 'Generated image preview' }) }) }) : null] });\n}\nfunction usePluginLanguage(locale) {\n const [lang, setLang] = useState(() => locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n useEffect(() => locale?.subscribe?.(() => {\n setLang(locale?.getSnapshot?.()?.active?.startsWith('en') ? 'en' : 'zh');\n }), [locale]);\n return lang;\n}\nfunction imageResultFromBlock(block) {\n const attachment = imageRef(block);\n if (attachment === undefined)\n return undefined;\n const blockValue = block;\n const meta = blockValue.meta ?? blockValue.resultView?.meta;\n return {\n attachment,\n prompt: typeof meta?.prompt === 'string' ? meta.prompt : blockValue.call?.args?.prompt ?? 'Generated Image',\n provider: typeof meta?.provider === 'string' ? meta.provider : 'google',\n model: typeof meta?.model === 'string' ? meta.model : '',\n output: typeof meta?.output === 'string' ? meta.output : '',\n ...(typeof meta?.savedTo === 'string' ? { savedTo: meta.savedTo } : {}),\n };\n}\nfunction modelOf(provider, value) {\n const stored = provider === 'google' ? value?.googleModel : provider === 'openai' ? value?.openaiModel : provider === 'seedream' ? value?.seedreamModel : provider === 'dashscope' ? value?.dashscopeModel : value?.comfyuiWorkflowName;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_MODELS[provider];\n}\nfunction baseURLOf(provider, value) {\n const stored = provider === 'google' ? value?.googleEndpoint : provider === 'openai' ? value?.openaiBaseURL : provider === 'seedream' ? value?.seedreamBaseURL : provider === 'dashscope' ? value?.dashscopeEndpoint : value?.comfyuiBaseURL;\n return typeof stored === 'string' && stored.length > 0 ? stored : DEFAULT_BASE_URLS[provider];\n}\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Modern DSH conversation node that keeps completed image artifacts outside Compact process folding. */
|
|
2
|
+
import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
|
|
3
|
+
export declare const IMAGE_RESULT_NODE_KIND = "dsh-image-result";
|
|
4
|
+
export interface ImageResultPresentation {
|
|
5
|
+
readonly attachment: ImageAttachmentRef;
|
|
6
|
+
readonly prompt: string;
|
|
7
|
+
readonly provider: string;
|
|
8
|
+
readonly model: string;
|
|
9
|
+
readonly output: string;
|
|
10
|
+
readonly savedTo?: string;
|
|
11
|
+
}
|
|
12
|
+
interface ImageResultState {
|
|
13
|
+
readonly turn: number;
|
|
14
|
+
readonly results: readonly (ImageResultPresentation & {
|
|
15
|
+
readonly seq: number;
|
|
16
|
+
})[];
|
|
17
|
+
readonly answerSeq?: number;
|
|
18
|
+
readonly endSeq?: number;
|
|
19
|
+
}
|
|
20
|
+
interface EventLike {
|
|
21
|
+
readonly type: string;
|
|
22
|
+
readonly seq: number;
|
|
23
|
+
readonly data: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
interface MatchLike {
|
|
26
|
+
readonly event: EventLike;
|
|
27
|
+
readonly location: unknown;
|
|
28
|
+
}
|
|
29
|
+
interface ContextLike<State> {
|
|
30
|
+
readonly key: string;
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly matches: readonly MatchLike[];
|
|
33
|
+
readonly start?: MatchLike;
|
|
34
|
+
readonly state?: State;
|
|
35
|
+
}
|
|
36
|
+
interface ConversationNodeDefinitionLike<State> {
|
|
37
|
+
readonly kind: string;
|
|
38
|
+
readonly target: 'chat';
|
|
39
|
+
match(event: EventLike): {
|
|
40
|
+
id: string;
|
|
41
|
+
role: 'start' | 'update';
|
|
42
|
+
} | null;
|
|
43
|
+
start(context: ContextLike<State>, match: MatchLike, reader: unknown): State;
|
|
44
|
+
update(context: ContextLike<State> & {
|
|
45
|
+
readonly state: State;
|
|
46
|
+
}, match: MatchLike): State;
|
|
47
|
+
buildViewNode(context: ContextLike<State>): Record<string, unknown> | null;
|
|
48
|
+
}
|
|
49
|
+
/** One image result row per Turn, re-anchored to Turn end after the final answer settles. */
|
|
50
|
+
export declare const imageResultDefinition: ConversationNodeDefinitionLike<ImageResultState>;
|
|
51
|
+
/** Parse the plugin-owned durable presentation metadata from a Tool result event. */
|
|
52
|
+
export declare function imageResultFromMeta(value: unknown): ImageResultPresentation | undefined;
|
|
53
|
+
export {};
|
|
@@ -3,6 +3,7 @@ import type { SettingsScope } from '@deepseek-ai/dsh-client-runtime/client';
|
|
|
3
3
|
import type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
4
|
import { type ImageProvider } from '../shared.js';
|
|
5
5
|
import { type LocaleService } from './gallery-view.js';
|
|
6
|
+
import { type ImageResultPresentation } from './image-result-node.js';
|
|
6
7
|
type Provider = ImageProvider;
|
|
7
8
|
interface ImageSettings {
|
|
8
9
|
provider?: Provider;
|
|
@@ -45,15 +46,26 @@ interface SettingsFace {
|
|
|
45
46
|
}
|
|
46
47
|
interface ImageCardFace {
|
|
47
48
|
locale?: LocaleService | undefined;
|
|
49
|
+
promoted: boolean;
|
|
48
50
|
}
|
|
49
51
|
type SettingsCardProps = PropsRuntime<'settings.plugin.item'> & InjectFace<SettingsFace>;
|
|
50
52
|
type ImageCardProps = PropsRuntime<'tool.call.toolview'> & InjectFace<ImageCardFace>;
|
|
53
|
+
interface ImageResultNodeProps {
|
|
54
|
+
node: {
|
|
55
|
+
data: {
|
|
56
|
+
results: readonly ImageResultPresentation[];
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
locale?: LocaleService | undefined;
|
|
60
|
+
}
|
|
51
61
|
/** Required browser services. */
|
|
52
62
|
export declare const inject: string[];
|
|
53
63
|
/** Mount the settings card, generated-image card, and native conversation gallery view. */
|
|
54
64
|
export declare function apply(ctx: Context): void;
|
|
55
65
|
/** Edit provider settings and its write-only API credential. */
|
|
56
66
|
export declare function ImageGenerationSettingsCard(props: SettingsCardProps): import("react").JSX.Element;
|
|
57
|
-
/**
|
|
67
|
+
/** Keep the legacy Tool row for old DSH and hand modern results to the independent Chat node. */
|
|
58
68
|
export declare function GeneratedImageCard(props: ImageCardProps): import("react").JSX.Element;
|
|
69
|
+
/** Render modern image artifacts as final conversation output instead of Tool process content. */
|
|
70
|
+
export declare function PromotedImageResultNode(props: ImageResultNodeProps): import("react").JSX.Element;
|
|
59
71
|
export {};
|
package/package.json
CHANGED