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.

@@ -1,8 +1,8 @@
1
1
  import { app } from "../../scripts/app.js";
2
- import { setNodeParams, filterNodeWidgets, isConfigurableNode } from "./nodeParamsFilter.js";
3
- import { processGraphOutput } from './tool.js';
4
- import { focusNodeOnly, setGlobalReferences, setupCanvasClickHandler, removeCanvasClickHandler } from './nodeFocusHandler.js';
5
- import { freezeWorkflow, unfreezeWorkflow, updateHighlightedNodes } from './freezeModeHandler.js';
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
- 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
- const response = await fetch('/bizyair/workflow_io', {
43
- method: 'POST',
44
- headers: {
45
- 'Content-Type': 'application/json'
46
- },
47
- body: JSON.stringify(formattedData)
48
- });
49
- const responseData = await response.json();
50
-
51
- // 保存节点参数信息
52
- if (responseData && responseData.data && Array.isArray(responseData.data.inputs)) {
53
- // 使用新模块保存节点参数信息
54
- setNodeParams(responseData.data.inputs);
55
- }
56
-
57
- // 将响应发送给前端
58
- window.parent.postMessage({
59
- type: 'WORKFLOW_IO_RESPONSE',
60
- data: responseData,
61
- sourceInfo: sourceInfo
62
- }, '*');
63
- } catch (error) {
64
- window.parent.postMessage({
65
- type: 'WORKFLOW_IO_ERROR',
66
- error: error.message
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
- unfreezeWorkflow();
107
-
108
- // 发送模式变更通知给父窗口
109
- if (mode === "export") {
110
- window.parent.postMessage({
111
- type: 'EXPORT_MODE_CHANGED',
112
- enabled: false
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
- return true;
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
- return toggleMode("aiapp", true);
132
+ return toggleMode("aiapp", true);
123
133
  }
124
134
 
125
135
  function disableAIAppMode() {
126
- return toggleMode("aiapp", false);
136
+ return toggleMode("aiapp", false);
127
137
  }
128
138
 
129
139
  function toggleExportMode(params) {
130
- return toggleMode("export", params.enable === true, params.isworkflow === true);
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
- if (!app || !app.graph || !app.graph._nodes) return;
142
-
143
- // 保存原始颜色并设置高亮
144
- for (const node of app.graph._nodes) {
145
- // 保存原始颜色
146
- if (!originalNodeColors.has(node.id)) {
147
- originalNodeColors.set(node.id, {
148
- color: node.color,
149
- bgcolor: node.bgcolor
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
- node._aiAppHighlighted = true;
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
- app.canvas.setDirty(true, true);
168
+ node._aiAppHighlighted = true;
169
+ }
170
+
171
+ // 刷新画布
172
+ app.canvas.setDirty(true, true);
165
173
  }
166
174
 
167
175
  // 恢复节点颜色
168
176
  function restoreNodeColors() {
169
- if (!app || !app.graph || !app.graph._nodes) return;
170
-
171
- for (const node of app.graph._nodes) {
172
- if (node && node._aiAppHighlighted) {
173
- // 恢复原始颜色
174
- const original = originalNodeColors.get(node.id);
175
- if (original) {
176
- node.color = original.color || undefined;
177
- node.bgcolor = original.bgcolor || undefined;
178
- } else {
179
- node.color = undefined;
180
- node.bgcolor = undefined;
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
- delete node._aiAppHighlighted;
184
- }
191
+ delete node._aiAppHighlighted;
185
192
  }
193
+ }
186
194
 
187
- // 清空保存的颜色
188
- originalNodeColors.clear();
195
+ // 清空保存的颜色
196
+ originalNodeColors.clear();
189
197
 
190
- // 刷新画布
191
- app.canvas.setDirty(true, true);
198
+ // 刷新画布
199
+ app.canvas.setDirty(true, true);
192
200
  }
193
201
 
194
202
  // 选择节点
195
203
  function selectInputNode(nodeId) {
196
- if (!app || !app.graph) return null;
204
+ if (!app || !app.graph) return null;
197
205
 
198
- const node = app.graph.getNodeById(nodeId);
199
- if (!node) return null;
206
+ const node = app.graph.getNodeById(nodeId);
207
+ if (!node) return null;
200
208
 
201
- // 检查节点是否已选择
202
- if (selectedInputNodes.some(n => n.id === nodeId)) {
203
- return null; // 节点已选择
204
- }
209
+ // 检查节点是否已选择
210
+ if (selectedInputNodes.some((n) => n.id === nodeId)) {
211
+ return null; // 节点已选择
212
+ }
205
213
 
206
- // 提取节点信息
207
- const nodeInfo = extractNodeInfo(node);
214
+ // 提取节点信息
215
+ const nodeInfo = extractNodeInfo(node);
208
216
 
209
- // 添加到选中列表
210
- selectedInputNodes.push(nodeInfo);
217
+ // 添加到选中列表
218
+ selectedInputNodes.push(nodeInfo);
211
219
 
212
- // 更新节点样式
213
- node.color = "#7C3AED"; // 紫色
214
- node.bgcolor = "#7C3AED22";
220
+ // 更新节点样式
221
+ node.color = "#7C3AED"; // 紫色
222
+ node.bgcolor = "#7C3AED22";
215
223
 
216
- // 刷新画布
217
- app.canvas.setDirty(true, true);
224
+ // 刷新画布
225
+ app.canvas.setDirty(true, true);
218
226
 
219
- // 返回节点信息
220
- return nodeInfo;
227
+ // 返回节点信息
228
+ return nodeInfo;
221
229
  }
222
230
 
223
231
  // 从选择中移除节点
224
232
  function deselectInputNode(nodeId) {
225
- // 统一 nodeId 类型为数字
226
- const id = typeof nodeId === 'string' ? parseInt(nodeId, 10) : nodeId;
227
-
228
- // 从列表中移除
229
- const index = selectedInputNodes.findIndex(n => n.id === id);
230
- if (index !== -1) {
231
- selectedInputNodes.splice(index, 1);
232
- }
233
- // 恢复节点颜色,确保类型正确
234
- const node = app.graph.getNodeById(id);
235
- if (node) {
236
- // 使用undefined而不是null,避免Zod schema验证错误
237
- node.color = undefined;
238
- node.bgcolor = undefined;
239
- delete node._aiAppHighlighted;
240
- app.canvas.setDirty(true, true);
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
- const nodeInfo = {
247
- id: node.id,
248
- type: node.type,
249
- comfyClass: node.comfyClass,
250
- title: node.title,
251
- widgets: []
252
- };
253
-
254
- // 处理widgets
255
- if (node.widgets && node.widgets.length > 0) {
256
- nodeInfo.widgets = node.widgets
257
- .filter(widget => widget.type !== "hidden" && !widget.disabled)
258
- .map(widget => {
259
- // 获取widget的值
260
- const widgetValue = widget.value || "";
261
-
262
- const widgetInfo = {
263
- name: String(widget.name || ""),
264
- value: widgetValue,
265
- type: String(widget.type || "")
266
- };
267
-
268
- // 处理options属性
269
- if (widget.options && widget.options.values) {
270
- widgetInfo.options = { values: [] };
271
-
272
- if (Array.isArray(widget.options.values)) {
273
- widgetInfo.options.values = [...widget.options.values];
274
- } else if (typeof widget.options.values === 'function') {
275
- try {
276
- const values = widget.options.values();
277
- if (Array.isArray(values)) {
278
- widgetInfo.options.values = [...values];
279
- }
280
- } catch (e) {
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
- return nodeInfo;
294
+ return widgetInfo;
295
+ });
296
+ }
297
+
298
+ return nodeInfo;
291
299
  }
292
300
 
293
301
  // 更新节点参数
294
302
  function updateInputNodeWidget(nodeId, widgetName, newValue) {
295
- if (!app || !app.graph) return false;
303
+ if (!app || !app.graph) return false;
296
304
 
297
- const node = app.graph.getNodeById(nodeId);
298
- if (!node || !node.widgets) return false;
305
+ const node = app.graph.getNodeById(nodeId);
306
+ if (!node || !node.widgets) return false;
299
307
 
300
- const widget = node.widgets.find(w => w.name === widgetName);
301
- if (!widget) return false;
308
+ const widget = node.widgets.find((w) => w.name === widgetName);
309
+ if (!widget) return false;
302
310
 
303
- // 更新widget值
304
- widget.value = newValue;
311
+ // 更新widget值
312
+ widget.value = newValue;
305
313
 
306
- // 执行回调
307
- if (typeof widget.callback === 'function') {
308
- try {
309
- widget.callback(newValue);
310
- } catch (e) {
311
- console.error(`执行widget回调出错: ${e.message}`);
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
- const nodeIndex = selectedInputNodes.findIndex(n => n.id === nodeId);
317
- if (nodeIndex !== -1) {
318
- const widgetIndex = selectedInputNodes[nodeIndex].widgets.findIndex(w => w.name === widgetName);
319
- if (widgetIndex !== -1) {
320
- selectedInputNodes[nodeIndex].widgets[widgetIndex].value = newValue;
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
- node.setDirtyCanvas(true, true);
334
+ // 刷新画布
335
+ node.setDirtyCanvas(true, true);
326
336
 
327
- return true;
337
+ return true;
328
338
  }
329
339
 
330
340
  // 获取所有选中的节点
331
341
  function getSelectedInputNodes() {
332
- return JSON.parse(JSON.stringify(selectedInputNodes));
342
+ return JSON.parse(JSON.stringify(selectedInputNodes));
333
343
  }
334
344
 
335
345
  // 清空选中的节点
336
346
  function clearSelectedInputNodes() {
337
- // 恢复节点颜色
338
- if (activeMode) {
339
- for (const node of app.graph._nodes) {
340
- if (node && selectedInputNodes.some(n => n.id === node.id)) {
341
- node.color = "#7C3AED"; // 紫色
342
- node.bgcolor = "#7C3AED22";
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
- selectedInputNodes = [];
357
+ // 清空列表
358
+ selectedInputNodes = [];
349
359
 
350
- // 刷新画布
351
- app.canvas.setDirty(true, true);
360
+ // 刷新画布
361
+ app.canvas.setDirty(true, true);
352
362
 
353
- return true;
363
+ return true;
354
364
  }
355
365
 
356
-
357
-
358
366
  // 选中节点并手动聚焦
359
367
  function selectNodeAndFocus(nodeId) {
360
- if (!app || !app.graph) {
361
- return;
362
- }
363
-
364
- const node = app.graph.getNodeById(parseInt(nodeId, 10));
365
- if (!node) {
366
- console.error('找不到节点:', nodeId);
367
- return;
368
- }
369
-
370
- // 设置节点的 selected 属性
371
- for (const n of app.graph._nodes) {
372
- n.selected = n.id === node.id;
373
- }
374
-
375
- // 设置 selected_nodes
376
- if (app.canvas) {
377
- app.canvas.selected_nodes = [node];
378
- }
379
-
380
- //使用 app.canvas.centerOnNode
381
- if (app.canvas && typeof app.canvas.centerOnNode === 'function') {
382
- app.canvas.centerOnNode(node);
383
- }
384
-
385
- // 刷新画布
386
- if (app.canvas) {
387
- app.canvas.setDirty(true, true);
388
- if (typeof app.canvas.draw === 'function') {
389
- app.canvas.draw(true, true);
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
- return
401
+ return;
394
402
  }
395
403
 
396
404
  // 保存原始节点颜色信息
397
405
  function saveOriginalNodeColors(workflowId) {
398
- if (!app || !app.graph || !app.graph._nodes) return;
406
+ if (!app || !app.graph || !app.graph._nodes) return;
399
407
 
400
- const nodeColors = new Map();
408
+ const nodeColors = new Map();
401
409
 
402
- // 遍历所有节点,保存原始颜色
403
- for (const node of app.graph._nodes) {
404
- if (node) {
405
- // 确保颜色值类型正确,使用undefined而不是null
406
- nodeColors.set(node.id, {
407
- color: node.color || undefined,
408
- bgcolor: node.bgcolor || undefined
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
- window.parent.postMessage({
414
- type: 'ORIGINAL_NODE_COLORS_SAVED',
415
- workflowId: workflowId,
416
- nodeColors: Array.from(nodeColors.entries())
417
- }, '*');
418
-
419
- console.log('已保存原始节点颜色信息,节点数量:', nodeColors.size);
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('message', function(event) {
424
-
425
- // 处理选中并聚焦节点
426
- if (event.data && event.data.type === 'selectNodeAndFocus' && event.data.nodeId !== undefined) {
427
- selectNodeAndFocus(event.data.nodeId);
428
- }
429
-
430
- // 处理保存原始节点颜色请求
431
- if (event.data && event.data.type === 'saveOriginalNodeColors' && event.data.workflowId !== undefined) {
432
- saveOriginalNodeColors(event.data.workflowId);
433
- }
434
-
435
- // 处理获取widget信息请求
436
- if (event.data && event.data.type === 'get_widget_info') {
437
- const { messageId, nodeId, widgetName } = event.data;
438
-
439
- let widget = null;
440
- let error = null;
441
-
442
- try {
443
- // 查找节点
444
- const node = app && app.graph ? app.graph.getNodeById(Number(nodeId)) : null;
445
- if (node && node.widgets) {
446
- widget = node.widgets.find(w => String(w.name) === String(widgetName));
447
- if (!widget) {
448
- error = '未找到指定widget';
449
- } else {
450
- // 保留所有非undefined的options属性
451
- const safeOptions = widget.options ?
452
- Object.fromEntries(
453
- Object.entries(widget.options)
454
- .filter(([_, value]) => value !== undefined)
455
- ) :
456
- {};
457
-
458
- // 直接使用 widget.value,这是截图中显示蓝色高亮的值
459
- const widgetValue = widget.value || "";
460
- // 创建一个新的简化widget对象,只包含我们实际需要的属性
461
- // 确保只使用可序列化的属性
462
- let safeWidgetValue = "";
463
- try {
464
- // 测试是否可序列化
465
- JSON.stringify({value: widgetValue});
466
- safeWidgetValue = widgetValue;
467
- safeWidgetValue = safeWidgetValue.replace(/pasted\/http/g, 'http');
468
- } catch (e) {
469
- console.error('[aiAppHandler] 值不可序列化:', e);
470
- // 使用安全的字符串值
471
- safeWidgetValue = String(widgetValue) || "";
472
- }
473
-
474
- widget = {
475
- name: widget.name || "",
476
- value: safeWidgetValue, // 使用安全处理后的值
477
- type: widget.type || "string",
478
- options: safeOptions,
479
- displayName: widget.displayName || widget.label || widget.name || "",
480
- tooltip: widget.tooltip || "", // 添加 tooltip 字段
481
- node_title: node.title || "",
482
- node_type: node.type || "",
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
- } catch (e) {
491
- console.error('[aiAppHandler] 查找节点/widget过程出错', e);
492
- error = e.message;
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
- try {
496
- // 确保只发送可序列化的数据
497
- // 创建一个安全的、深度复制的对象,移除所有函数和不可序列化内容
498
- const safeWidget = widget ? JSON.parse(JSON.stringify({
499
- name: widget.name || "",
500
- value: widget.value || "",
501
- type: widget.type || "string",
502
- options: widget.options || {},
503
- displayName: widget.displayName || "",
504
- tooltip: widget.tooltip || "", // 添加 tooltip 字段
505
- node_title: widget.node_title || "",
506
- node_type: widget.node_type || "",
507
- node_comfyClass: widget.node_comfyClass || ""
508
- })) : null;
509
-
510
- window.parent.postMessage({
511
- type: 'widget_info_response',
512
- messageId,
513
- widget: safeWidget,
514
- error
515
- }, '*');
516
- } catch (e) {
517
- console.error('[aiAppHandler] 发送 widget_info_response 失败', e);
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
- enableAIAppMode,
525
- disableAIAppMode,
526
- selectInputNode,
527
- deselectInputNode,
528
- updateInputNodeWidget,
529
- getSelectedInputNodes,
530
- clearSelectedInputNodes,
531
- toggleExportMode
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
- if (!app || !app.graph || !app.graph._nodes) return;
537
- for (const node of app.graph._nodes) {
538
- deselectInputNode(node.id);
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;