bizydraft 0.2.49__py3-none-any.whl → 0.2.87__py3-none-any.whl
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.
Potentially problematic release.
This version of bizydraft might be problematic. Click here for more details.
- bizydraft/env.py +3 -0
- bizydraft/hijack_nodes.py +60 -42
- bizydraft/hijack_routes.py +36 -3
- bizydraft/oss_utils.py +231 -2
- bizydraft/patch_handlers.py +197 -8
- bizydraft/static/js/aiAppHandler.js +460 -425
- bizydraft/static/js/clipspaceToOss.js +386 -0
- bizydraft/static/js/disableComfyWebSocket.js +64 -0
- bizydraft/static/js/freezeModeHandler.js +425 -404
- bizydraft/static/js/handleStyle.js +128 -36
- bizydraft/static/js/hookLoad/configLoader.js +74 -0
- bizydraft/static/js/hookLoad/media.js +684 -0
- bizydraft/static/js/hookLoad/model.js +322 -0
- bizydraft/static/js/hookLoadMedia.js +196 -0
- bizydraft/static/js/hookLoadModel.js +207 -256
- bizydraft/static/js/main.js +2 -0
- bizydraft/static/js/nodeFocusHandler.js +118 -106
- bizydraft/static/js/nodeParamsFilter.js +91 -89
- bizydraft/static/js/postEvent.js +1207 -967
- bizydraft/static/js/socket.js +55 -50
- bizydraft/static/js/tool.js +71 -63
- bizydraft/static/js/uploadFile.js +49 -41
- bizydraft/static/js/workflow_io.js +193 -0
- {bizydraft-0.2.49.dist-info → bizydraft-0.2.87.dist-info}/METADATA +1 -1
- bizydraft-0.2.87.dist-info/RECORD +34 -0
- bizydraft/static/js/hookLoadImage.js +0 -177
- bizydraft-0.2.49.dist-info/RECORD +0 -28
- {bizydraft-0.2.49.dist-info → bizydraft-0.2.87.dist-info}/WHEEL +0 -0
- {bizydraft-0.2.49.dist-info → bizydraft-0.2.87.dist-info}/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { app } from "../../scripts/app.js";
|
|
2
|
-
import { setNodeParams
|
|
3
|
-
import { processGraphOutput } from
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { setNodeParams } from "./nodeParamsFilter.js";
|
|
3
|
+
import { processGraphOutput } from "./tool.js";
|
|
4
|
+
import { freezeWorkflow, unfreezeWorkflow } from "./freezeModeHandler.js";
|
|
5
|
+
import { parseWorkflowIO } from "./workflow_io.js";
|
|
6
6
|
// 状态变量
|
|
7
7
|
let selectedInputNodes = [];
|
|
8
8
|
let activeMode = null; // 当前活动的模式: "aiapp" 或 "export"
|
|
@@ -15,528 +15,563 @@ const originalNodeColors = new Map();
|
|
|
15
15
|
* @returns {boolean} 操作是否成功
|
|
16
16
|
*/
|
|
17
17
|
function toggleMode(mode, enable, isworkflow = false) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
window.parent.postMessage({
|
|
73
|
-
type: 'EXPORT_MODE_CHANGED',
|
|
74
|
-
enabled: true
|
|
75
|
-
}, '*');
|
|
76
|
-
}
|
|
77
|
-
return true;
|
|
78
|
-
} else {
|
|
79
|
-
activeMode = null;
|
|
80
|
-
//修复所有节点颜色
|
|
81
|
-
selectedInputNodes = [];
|
|
82
|
-
|
|
83
|
-
// 强制恢复所有节点颜色
|
|
84
|
-
if (app && app.graph && app.graph._nodes) {
|
|
85
|
-
for (const node of app.graph._nodes) {
|
|
86
|
-
if (node) {
|
|
87
|
-
// 恢复原始颜色
|
|
88
|
-
const original = originalNodeColors.get(node.id);
|
|
89
|
-
if (original) {
|
|
90
|
-
node.color = original.color || undefined;
|
|
91
|
-
node.bgcolor = original.bgcolor || undefined;
|
|
92
|
-
} else {
|
|
93
|
-
// 如果没有原始颜色,设置为undefined
|
|
94
|
-
node.color = undefined;
|
|
95
|
-
node.bgcolor = undefined;
|
|
96
|
-
}
|
|
97
|
-
delete node._aiAppHighlighted;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
originalNodeColors.clear();
|
|
101
|
-
app.canvas.setDirty(true, true);
|
|
102
|
-
} else {
|
|
103
|
-
restoreNodeColors();
|
|
18
|
+
console.log(`${enable ? "启用" : "禁用"} ${mode} 模式`);
|
|
19
|
+
if (enable) {
|
|
20
|
+
activeMode = mode;
|
|
21
|
+
highlightInputNodes();
|
|
22
|
+
freezeWorkflow(isworkflow);
|
|
23
|
+
|
|
24
|
+
// 在进入发布模式时获取并打印工作流数据
|
|
25
|
+
if (mode === "export") {
|
|
26
|
+
// 使用 Promise 包装 graphToPrompt 调用
|
|
27
|
+
Promise.resolve().then(async () => {
|
|
28
|
+
const graphData = await app.graphToPrompt();
|
|
29
|
+
const processedOutput = processGraphOutput(graphData.output);
|
|
30
|
+
// 添加来源标识
|
|
31
|
+
const sourceInfo = { from: "aiAppHandler_toggleMode" };
|
|
32
|
+
// 构建新的数据格式
|
|
33
|
+
const formattedData = {
|
|
34
|
+
prompt: processedOutput,
|
|
35
|
+
extra_data: {
|
|
36
|
+
extra_pnginfo: {
|
|
37
|
+
workflow: graphData.workflow,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
// 使用前端workflow_io模块处理数据
|
|
43
|
+
const responseData = parseWorkflowIO(formattedData);
|
|
44
|
+
|
|
45
|
+
// 保存节点参数信息
|
|
46
|
+
if (
|
|
47
|
+
responseData &&
|
|
48
|
+
responseData.data &&
|
|
49
|
+
Array.isArray(responseData.data.inputs)
|
|
50
|
+
) {
|
|
51
|
+
// 使用新模块保存节点参数信息
|
|
52
|
+
setNodeParams(responseData.data.inputs);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 将响应发送给前端
|
|
56
|
+
window.parent.postMessage(
|
|
57
|
+
{
|
|
58
|
+
type: "WORKFLOW_IO_RESPONSE",
|
|
59
|
+
data: responseData,
|
|
60
|
+
sourceInfo: sourceInfo,
|
|
61
|
+
},
|
|
62
|
+
"*"
|
|
63
|
+
);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
window.parent.postMessage(
|
|
66
|
+
{
|
|
67
|
+
type: "WORKFLOW_IO_ERROR",
|
|
68
|
+
error: error.message,
|
|
69
|
+
},
|
|
70
|
+
"*"
|
|
71
|
+
);
|
|
104
72
|
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// 发送模式变更通知给父窗口
|
|
76
|
+
window.parent.postMessage(
|
|
77
|
+
{
|
|
78
|
+
type: "EXPORT_MODE_CHANGED",
|
|
79
|
+
enabled: true,
|
|
80
|
+
},
|
|
81
|
+
"*"
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
} else {
|
|
86
|
+
activeMode = null;
|
|
87
|
+
//修复所有节点颜色
|
|
88
|
+
selectedInputNodes = [];
|
|
105
89
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
90
|
+
// 强制恢复所有节点颜色
|
|
91
|
+
if (app && app.graph && app.graph._nodes) {
|
|
92
|
+
for (const node of app.graph._nodes) {
|
|
93
|
+
if (node) {
|
|
94
|
+
// 恢复原始颜色
|
|
95
|
+
const original = originalNodeColors.get(node.id);
|
|
96
|
+
if (original) {
|
|
97
|
+
node.color = original.color || undefined;
|
|
98
|
+
node.bgcolor = original.bgcolor || undefined;
|
|
99
|
+
} else {
|
|
100
|
+
// 如果没有原始颜色,设置为undefined
|
|
101
|
+
node.color = undefined;
|
|
102
|
+
node.bgcolor = undefined;
|
|
103
|
+
}
|
|
104
|
+
delete node._aiAppHighlighted;
|
|
114
105
|
}
|
|
106
|
+
}
|
|
107
|
+
originalNodeColors.clear();
|
|
108
|
+
app.canvas.setDirty(true, true);
|
|
109
|
+
} else {
|
|
110
|
+
restoreNodeColors();
|
|
111
|
+
}
|
|
115
112
|
|
|
116
|
-
|
|
113
|
+
unfreezeWorkflow();
|
|
114
|
+
|
|
115
|
+
// 发送模式变更通知给父窗口
|
|
116
|
+
if (mode === "export") {
|
|
117
|
+
window.parent.postMessage(
|
|
118
|
+
{
|
|
119
|
+
type: "EXPORT_MODE_CHANGED",
|
|
120
|
+
enabled: false,
|
|
121
|
+
},
|
|
122
|
+
"*"
|
|
123
|
+
);
|
|
117
124
|
}
|
|
125
|
+
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
118
128
|
}
|
|
119
129
|
|
|
120
130
|
// 切换模式函数已实现通用逻辑,下面是为了兼容现有代码的别名
|
|
121
131
|
function enableAIAppMode() {
|
|
122
|
-
|
|
132
|
+
return toggleMode("aiapp", true);
|
|
123
133
|
}
|
|
124
134
|
|
|
125
135
|
function disableAIAppMode() {
|
|
126
|
-
|
|
136
|
+
return toggleMode("aiapp", false);
|
|
127
137
|
}
|
|
128
138
|
|
|
129
139
|
function toggleExportMode(params) {
|
|
130
|
-
|
|
140
|
+
return toggleMode(
|
|
141
|
+
"export",
|
|
142
|
+
params.enable === true,
|
|
143
|
+
params.isworkflow === true
|
|
144
|
+
);
|
|
131
145
|
}
|
|
132
146
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
147
|
// 高亮输入节点
|
|
140
148
|
function highlightInputNodes() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// 只设置已选择的节点的颜色,其他节点保持原样
|
|
154
|
-
if (selectedInputNodes.some(n => n.id === node.id)) {
|
|
155
|
-
// 已选择的节点 - 紫色
|
|
156
|
-
node.color = "#7C3AED";
|
|
157
|
-
node.bgcolor = "#7C3AED22";
|
|
158
|
-
}
|
|
149
|
+
if (!app || !app.graph || !app.graph._nodes) return;
|
|
150
|
+
|
|
151
|
+
// 保存原始颜色并设置高亮
|
|
152
|
+
for (const node of app.graph._nodes) {
|
|
153
|
+
// 保存原始颜色
|
|
154
|
+
if (!originalNodeColors.has(node.id)) {
|
|
155
|
+
originalNodeColors.set(node.id, {
|
|
156
|
+
color: node.color,
|
|
157
|
+
bgcolor: node.bgcolor,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
159
160
|
|
|
160
|
-
|
|
161
|
+
// 只设置已选择的节点的颜色,其他节点保持原样
|
|
162
|
+
if (selectedInputNodes.some((n) => n.id === node.id)) {
|
|
163
|
+
// 已选择的节点 - 紫色
|
|
164
|
+
node.color = "#7C3AED";
|
|
165
|
+
node.bgcolor = "#7C3AED22";
|
|
161
166
|
}
|
|
162
167
|
|
|
163
|
-
|
|
164
|
-
|
|
168
|
+
node._aiAppHighlighted = true;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 刷新画布
|
|
172
|
+
app.canvas.setDirty(true, true);
|
|
165
173
|
}
|
|
166
174
|
|
|
167
175
|
// 恢复节点颜色
|
|
168
176
|
function restoreNodeColors() {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
177
|
+
if (!app || !app.graph || !app.graph._nodes) return;
|
|
178
|
+
|
|
179
|
+
for (const node of app.graph._nodes) {
|
|
180
|
+
if (node && node._aiAppHighlighted) {
|
|
181
|
+
// 恢复原始颜色
|
|
182
|
+
const original = originalNodeColors.get(node.id);
|
|
183
|
+
if (original) {
|
|
184
|
+
node.color = original.color || undefined;
|
|
185
|
+
node.bgcolor = original.bgcolor || undefined;
|
|
186
|
+
} else {
|
|
187
|
+
node.color = undefined;
|
|
188
|
+
node.bgcolor = undefined;
|
|
189
|
+
}
|
|
182
190
|
|
|
183
|
-
|
|
184
|
-
}
|
|
191
|
+
delete node._aiAppHighlighted;
|
|
185
192
|
}
|
|
193
|
+
}
|
|
186
194
|
|
|
187
|
-
|
|
188
|
-
|
|
195
|
+
// 清空保存的颜色
|
|
196
|
+
originalNodeColors.clear();
|
|
189
197
|
|
|
190
|
-
|
|
191
|
-
|
|
198
|
+
// 刷新画布
|
|
199
|
+
app.canvas.setDirty(true, true);
|
|
192
200
|
}
|
|
193
201
|
|
|
194
202
|
// 选择节点
|
|
195
203
|
function selectInputNode(nodeId) {
|
|
196
|
-
|
|
204
|
+
if (!app || !app.graph) return null;
|
|
197
205
|
|
|
198
|
-
|
|
199
|
-
|
|
206
|
+
const node = app.graph.getNodeById(nodeId);
|
|
207
|
+
if (!node) return null;
|
|
200
208
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
209
|
+
// 检查节点是否已选择
|
|
210
|
+
if (selectedInputNodes.some((n) => n.id === nodeId)) {
|
|
211
|
+
return null; // 节点已选择
|
|
212
|
+
}
|
|
205
213
|
|
|
206
|
-
|
|
207
|
-
|
|
214
|
+
// 提取节点信息
|
|
215
|
+
const nodeInfo = extractNodeInfo(node);
|
|
208
216
|
|
|
209
|
-
|
|
210
|
-
|
|
217
|
+
// 添加到选中列表
|
|
218
|
+
selectedInputNodes.push(nodeInfo);
|
|
211
219
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
220
|
+
// 更新节点样式
|
|
221
|
+
node.color = "#7C3AED"; // 紫色
|
|
222
|
+
node.bgcolor = "#7C3AED22";
|
|
215
223
|
|
|
216
|
-
|
|
217
|
-
|
|
224
|
+
// 刷新画布
|
|
225
|
+
app.canvas.setDirty(true, true);
|
|
218
226
|
|
|
219
|
-
|
|
220
|
-
|
|
227
|
+
// 返回节点信息
|
|
228
|
+
return nodeInfo;
|
|
221
229
|
}
|
|
222
230
|
|
|
223
231
|
// 从选择中移除节点
|
|
224
232
|
function deselectInputNode(nodeId) {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
233
|
+
// 统一 nodeId 类型为数字
|
|
234
|
+
const id = typeof nodeId === "string" ? parseInt(nodeId, 10) : nodeId;
|
|
235
|
+
|
|
236
|
+
// 从列表中移除
|
|
237
|
+
const index = selectedInputNodes.findIndex((n) => n.id === id);
|
|
238
|
+
if (index !== -1) {
|
|
239
|
+
selectedInputNodes.splice(index, 1);
|
|
240
|
+
}
|
|
241
|
+
// 恢复节点颜色,确保类型正确
|
|
242
|
+
const node = app.graph.getNodeById(id);
|
|
243
|
+
if (node) {
|
|
244
|
+
// 使用undefined而不是null,避免Zod schema验证错误
|
|
245
|
+
node.color = undefined;
|
|
246
|
+
node.bgcolor = undefined;
|
|
247
|
+
delete node._aiAppHighlighted;
|
|
248
|
+
app.canvas.setDirty(true, true);
|
|
249
|
+
}
|
|
242
250
|
}
|
|
243
251
|
|
|
244
252
|
// 提取节点信息
|
|
245
253
|
function extractNodeInfo(node) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return widgetInfo;
|
|
287
|
-
});
|
|
288
|
-
}
|
|
254
|
+
const nodeInfo = {
|
|
255
|
+
id: node.id,
|
|
256
|
+
type: node.type,
|
|
257
|
+
comfyClass: node.comfyClass,
|
|
258
|
+
title: node.title,
|
|
259
|
+
widgets: [],
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
// 处理widgets
|
|
263
|
+
if (node.widgets && node.widgets.length > 0) {
|
|
264
|
+
nodeInfo.widgets = node.widgets
|
|
265
|
+
.filter((widget) => widget.type !== "hidden" && !widget.disabled)
|
|
266
|
+
.map((widget) => {
|
|
267
|
+
// 获取widget的值
|
|
268
|
+
const widgetValue = widget.value || "";
|
|
269
|
+
|
|
270
|
+
const widgetInfo = {
|
|
271
|
+
name: String(widget.name || ""),
|
|
272
|
+
value: widgetValue,
|
|
273
|
+
type: String(widget.type || ""),
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
// 处理options属性
|
|
277
|
+
if (widget.options && widget.options.values) {
|
|
278
|
+
widgetInfo.options = { values: [] };
|
|
279
|
+
|
|
280
|
+
if (Array.isArray(widget.options.values)) {
|
|
281
|
+
widgetInfo.options.values = [...widget.options.values];
|
|
282
|
+
} else if (typeof widget.options.values === "function") {
|
|
283
|
+
try {
|
|
284
|
+
const values = widget.options.values();
|
|
285
|
+
if (Array.isArray(values)) {
|
|
286
|
+
widgetInfo.options.values = [...values];
|
|
287
|
+
}
|
|
288
|
+
} catch (e) {
|
|
289
|
+
// 忽略错误
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
289
293
|
|
|
290
|
-
|
|
294
|
+
return widgetInfo;
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return nodeInfo;
|
|
291
299
|
}
|
|
292
300
|
|
|
293
301
|
// 更新节点参数
|
|
294
302
|
function updateInputNodeWidget(nodeId, widgetName, newValue) {
|
|
295
|
-
|
|
303
|
+
if (!app || !app.graph) return false;
|
|
296
304
|
|
|
297
|
-
|
|
298
|
-
|
|
305
|
+
const node = app.graph.getNodeById(nodeId);
|
|
306
|
+
if (!node || !node.widgets) return false;
|
|
299
307
|
|
|
300
|
-
|
|
301
|
-
|
|
308
|
+
const widget = node.widgets.find((w) => w.name === widgetName);
|
|
309
|
+
if (!widget) return false;
|
|
302
310
|
|
|
303
|
-
|
|
304
|
-
|
|
311
|
+
// 更新widget值
|
|
312
|
+
widget.value = newValue;
|
|
305
313
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
314
|
+
// 执行回调
|
|
315
|
+
if (typeof widget.callback === "function") {
|
|
316
|
+
try {
|
|
317
|
+
widget.callback(newValue);
|
|
318
|
+
} catch (e) {
|
|
319
|
+
console.error(`执行widget回调出错: ${e.message}`);
|
|
313
320
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// 更新内部状态
|
|
324
|
+
const nodeIndex = selectedInputNodes.findIndex((n) => n.id === nodeId);
|
|
325
|
+
if (nodeIndex !== -1) {
|
|
326
|
+
const widgetIndex = selectedInputNodes[nodeIndex].widgets.findIndex(
|
|
327
|
+
(w) => w.name === widgetName
|
|
328
|
+
);
|
|
329
|
+
if (widgetIndex !== -1) {
|
|
330
|
+
selectedInputNodes[nodeIndex].widgets[widgetIndex].value = newValue;
|
|
322
331
|
}
|
|
332
|
+
}
|
|
323
333
|
|
|
324
|
-
|
|
325
|
-
|
|
334
|
+
// 刷新画布
|
|
335
|
+
node.setDirtyCanvas(true, true);
|
|
326
336
|
|
|
327
|
-
|
|
337
|
+
return true;
|
|
328
338
|
}
|
|
329
339
|
|
|
330
340
|
// 获取所有选中的节点
|
|
331
341
|
function getSelectedInputNodes() {
|
|
332
|
-
|
|
342
|
+
return JSON.parse(JSON.stringify(selectedInputNodes));
|
|
333
343
|
}
|
|
334
344
|
|
|
335
345
|
// 清空选中的节点
|
|
336
346
|
function clearSelectedInputNodes() {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
347
|
+
// 恢复节点颜色
|
|
348
|
+
if (activeMode) {
|
|
349
|
+
for (const node of app.graph._nodes) {
|
|
350
|
+
if (node && selectedInputNodes.some((n) => n.id === node.id)) {
|
|
351
|
+
node.color = "#7C3AED"; // 紫色
|
|
352
|
+
node.bgcolor = "#7C3AED22";
|
|
353
|
+
}
|
|
345
354
|
}
|
|
355
|
+
}
|
|
346
356
|
|
|
347
|
-
|
|
348
|
-
|
|
357
|
+
// 清空列表
|
|
358
|
+
selectedInputNodes = [];
|
|
349
359
|
|
|
350
|
-
|
|
351
|
-
|
|
360
|
+
// 刷新画布
|
|
361
|
+
app.canvas.setDirty(true, true);
|
|
352
362
|
|
|
353
|
-
|
|
363
|
+
return true;
|
|
354
364
|
}
|
|
355
365
|
|
|
356
|
-
|
|
357
|
-
|
|
358
366
|
// 选中节点并手动聚焦
|
|
359
367
|
function selectNodeAndFocus(nodeId) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
368
|
+
if (!app || !app.graph) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const node = app.graph.getNodeById(parseInt(nodeId, 10));
|
|
373
|
+
if (!node) {
|
|
374
|
+
console.error("找不到节点:", nodeId);
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// 设置节点的 selected 属性
|
|
379
|
+
for (const n of app.graph._nodes) {
|
|
380
|
+
n.selected = n.id === node.id;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// 设置 selected_nodes
|
|
384
|
+
if (app.canvas) {
|
|
385
|
+
app.canvas.selected_nodes = [node];
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
//使用 app.canvas.centerOnNode
|
|
389
|
+
if (app.canvas && typeof app.canvas.centerOnNode === "function") {
|
|
390
|
+
app.canvas.centerOnNode(node);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// 刷新画布
|
|
394
|
+
if (app.canvas) {
|
|
395
|
+
app.canvas.setDirty(true, true);
|
|
396
|
+
if (typeof app.canvas.draw === "function") {
|
|
397
|
+
app.canvas.draw(true, true);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
392
400
|
|
|
393
|
-
|
|
401
|
+
return;
|
|
394
402
|
}
|
|
395
403
|
|
|
396
404
|
// 保存原始节点颜色信息
|
|
397
405
|
function saveOriginalNodeColors(workflowId) {
|
|
398
|
-
|
|
406
|
+
if (!app || !app.graph || !app.graph._nodes) return;
|
|
399
407
|
|
|
400
|
-
|
|
408
|
+
const nodeColors = new Map();
|
|
401
409
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
410
|
+
// 遍历所有节点,保存原始颜色
|
|
411
|
+
for (const node of app.graph._nodes) {
|
|
412
|
+
if (node) {
|
|
413
|
+
// 确保颜色值类型正确,使用undefined而不是null
|
|
414
|
+
nodeColors.set(node.id, {
|
|
415
|
+
color: node.color || undefined,
|
|
416
|
+
bgcolor: node.bgcolor || undefined,
|
|
417
|
+
});
|
|
411
418
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
419
|
+
}
|
|
420
|
+
// 发送颜色信息到前端
|
|
421
|
+
window.parent.postMessage(
|
|
422
|
+
{
|
|
423
|
+
type: "ORIGINAL_NODE_COLORS_SAVED",
|
|
424
|
+
workflowId: workflowId,
|
|
425
|
+
nodeColors: Array.from(nodeColors.entries()),
|
|
426
|
+
},
|
|
427
|
+
"*"
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
console.log("已保存原始节点颜色信息,节点数量:", nodeColors.size);
|
|
420
431
|
}
|
|
421
432
|
|
|
422
433
|
// 监听 window 消息,处理 centerNode
|
|
423
|
-
window.addEventListener(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
node_comfyClass: node.comfyClass || ""
|
|
484
|
-
};
|
|
485
|
-
console.log('[aiAppHandler] 处理后的widget', widget);
|
|
486
|
-
}
|
|
487
|
-
} else {
|
|
488
|
-
error = '未找到指定节点或节点没有widgets';
|
|
434
|
+
window.addEventListener("message", function (event) {
|
|
435
|
+
// 处理选中并聚焦节点
|
|
436
|
+
if (
|
|
437
|
+
event.data &&
|
|
438
|
+
event.data.type === "selectNodeAndFocus" &&
|
|
439
|
+
event.data.nodeId !== undefined
|
|
440
|
+
) {
|
|
441
|
+
selectNodeAndFocus(event.data.nodeId);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// 处理保存原始节点颜色请求
|
|
445
|
+
if (
|
|
446
|
+
event.data &&
|
|
447
|
+
event.data.type === "saveOriginalNodeColors" &&
|
|
448
|
+
event.data.workflowId !== undefined
|
|
449
|
+
) {
|
|
450
|
+
saveOriginalNodeColors(event.data.workflowId);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// 处理获取widget信息请求
|
|
454
|
+
if (event.data && event.data.type === "get_widget_info") {
|
|
455
|
+
const { messageId, nodeId, widgetName } = event.data;
|
|
456
|
+
|
|
457
|
+
let widget = null;
|
|
458
|
+
let error = null;
|
|
459
|
+
|
|
460
|
+
try {
|
|
461
|
+
// 查找节点
|
|
462
|
+
const node =
|
|
463
|
+
app && app.graph ? app.graph.getNodeById(Number(nodeId)) : null;
|
|
464
|
+
if (node && node.widgets) {
|
|
465
|
+
widget = node.widgets.find(
|
|
466
|
+
(w) => String(w.name) === String(widgetName)
|
|
467
|
+
);
|
|
468
|
+
if (!widget) {
|
|
469
|
+
error = "未找到指定widget";
|
|
470
|
+
} else {
|
|
471
|
+
// 保留所有非undefined的options属性
|
|
472
|
+
const safeOptions = widget.options
|
|
473
|
+
? Object.fromEntries(
|
|
474
|
+
Object.entries(widget.options).filter(
|
|
475
|
+
([_, value]) => value !== undefined
|
|
476
|
+
)
|
|
477
|
+
)
|
|
478
|
+
: {};
|
|
479
|
+
|
|
480
|
+
// 直接使用 widget.value,这是截图中显示蓝色高亮的值
|
|
481
|
+
const widgetValue = widget.value ?? "";
|
|
482
|
+
// 创建一个新的简化widget对象,只包含我们实际需要的属性
|
|
483
|
+
// 确保只使用可序列化的属性
|
|
484
|
+
let safeWidgetValue = "";
|
|
485
|
+
try {
|
|
486
|
+
// 测试是否可序列化
|
|
487
|
+
JSON.stringify({ value: widgetValue });
|
|
488
|
+
safeWidgetValue = widgetValue;
|
|
489
|
+
if (typeof safeWidgetValue === "string") {
|
|
490
|
+
safeWidgetValue = safeWidgetValue.replace(
|
|
491
|
+
/pasted\/http/g,
|
|
492
|
+
"http"
|
|
493
|
+
);
|
|
489
494
|
}
|
|
490
|
-
|
|
491
|
-
console.error(
|
|
492
|
-
|
|
495
|
+
} catch (e) {
|
|
496
|
+
console.error("[aiAppHandler] 值不可序列化:", e);
|
|
497
|
+
// 使用安全的字符串值
|
|
498
|
+
safeWidgetValue = String(widgetValue) || "";
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
widget = {
|
|
502
|
+
name: widget.name || "",
|
|
503
|
+
value: safeWidgetValue, // 使用安全处理后的值
|
|
504
|
+
type: widget.type || "string",
|
|
505
|
+
options: safeOptions,
|
|
506
|
+
displayName:
|
|
507
|
+
widget.displayName || widget.label || widget.name || "",
|
|
508
|
+
tooltip: widget.tooltip || "", // 添加 tooltip 字段
|
|
509
|
+
node_title: node.title || "",
|
|
510
|
+
node_type: node.type || "",
|
|
511
|
+
node_comfyClass: node.comfyClass || "",
|
|
512
|
+
};
|
|
513
|
+
console.log("[aiAppHandler] 处理后的widget", widget);
|
|
493
514
|
}
|
|
515
|
+
} else {
|
|
516
|
+
error = "未找到指定节点或节点没有widgets";
|
|
517
|
+
}
|
|
518
|
+
} catch (e) {
|
|
519
|
+
console.error("[aiAppHandler] 查找节点/widget过程出错", e);
|
|
520
|
+
error = e.message;
|
|
521
|
+
}
|
|
494
522
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
523
|
+
try {
|
|
524
|
+
// 确保只发送可序列化的数据
|
|
525
|
+
// 创建一个安全的、深度复制的对象,移除所有函数和不可序列化内容
|
|
526
|
+
const safeWidget = widget
|
|
527
|
+
? JSON.parse(
|
|
528
|
+
JSON.stringify({
|
|
529
|
+
name: widget.name || "",
|
|
530
|
+
value: widget.value || "",
|
|
531
|
+
type: widget.type || "string",
|
|
532
|
+
options: widget.options || {},
|
|
533
|
+
displayName: widget.displayName || "",
|
|
534
|
+
tooltip: widget.tooltip || "", // 添加 tooltip 字段
|
|
535
|
+
node_title: widget.node_title || "",
|
|
536
|
+
node_type: widget.node_type || "",
|
|
537
|
+
node_comfyClass: widget.node_comfyClass || "",
|
|
538
|
+
})
|
|
539
|
+
)
|
|
540
|
+
: null;
|
|
541
|
+
|
|
542
|
+
window.parent.postMessage(
|
|
543
|
+
{
|
|
544
|
+
type: "widget_info_response",
|
|
545
|
+
messageId,
|
|
546
|
+
widget: safeWidget,
|
|
547
|
+
error,
|
|
548
|
+
},
|
|
549
|
+
"*"
|
|
550
|
+
);
|
|
551
|
+
} catch (e) {
|
|
552
|
+
console.error("[aiAppHandler] 发送 widget_info_response 失败", e);
|
|
519
553
|
}
|
|
554
|
+
}
|
|
520
555
|
});
|
|
521
556
|
|
|
522
557
|
// 导出模块
|
|
523
558
|
export {
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
559
|
+
enableAIAppMode,
|
|
560
|
+
disableAIAppMode,
|
|
561
|
+
selectInputNode,
|
|
562
|
+
deselectInputNode,
|
|
563
|
+
updateInputNodeWidget,
|
|
564
|
+
getSelectedInputNodes,
|
|
565
|
+
clearSelectedInputNodes,
|
|
566
|
+
toggleExportMode,
|
|
532
567
|
};
|
|
533
568
|
|
|
534
569
|
//前端点击清除所有
|
|
535
570
|
function clearExportNodes() {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
571
|
+
if (!app || !app.graph || !app.graph._nodes) return;
|
|
572
|
+
for (const node of app.graph._nodes) {
|
|
573
|
+
deselectInputNode(node.id);
|
|
574
|
+
}
|
|
540
575
|
}
|
|
541
576
|
window.clearExportNodes = clearExportNodes;
|
|
542
577
|
window.deselectInputNode = deselectInputNode;
|