@optima-chat/gen-cli 1.0.0
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/dist/backends/bfl.d.ts +18 -0
- package/dist/backends/bfl.d.ts.map +1 -0
- package/dist/backends/bfl.js +130 -0
- package/dist/backends/bfl.js.map +1 -0
- package/dist/backends/comfyui.d.ts +10 -0
- package/dist/backends/comfyui.d.ts.map +1 -0
- package/dist/backends/comfyui.js +121 -0
- package/dist/backends/comfyui.js.map +1 -0
- package/dist/backends/index.d.ts +24 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +59 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/types.d.ts +99 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +2 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/backends/video-dashscope.d.ts +10 -0
- package/dist/backends/video-dashscope.d.ts.map +1 -0
- package/dist/backends/video-dashscope.js +108 -0
- package/dist/backends/video-dashscope.js.map +1 -0
- package/dist/backends/video-index.d.ts +23 -0
- package/dist/backends/video-index.d.ts.map +1 -0
- package/dist/backends/video-index.js +57 -0
- package/dist/backends/video-index.js.map +1 -0
- package/dist/commands/asr.d.ts +3 -0
- package/dist/commands/asr.d.ts.map +1 -0
- package/dist/commands/asr.js +133 -0
- package/dist/commands/asr.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +105 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/download.d.ts +3 -0
- package/dist/commands/download.d.ts.map +1 -0
- package/dist/commands/download.js +169 -0
- package/dist/commands/download.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +155 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +135 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/image.d.ts +3 -0
- package/dist/commands/image.d.ts.map +1 -0
- package/dist/commands/image.js +139 -0
- package/dist/commands/image.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +144 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/interrupt.d.ts +3 -0
- package/dist/commands/interrupt.d.ts.map +1 -0
- package/dist/commands/interrupt.js +54 -0
- package/dist/commands/interrupt.js.map +1 -0
- package/dist/commands/model.d.ts +3 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +82 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/node.d.ts +3 -0
- package/dist/commands/node.d.ts.map +1 -0
- package/dist/commands/node.js +148 -0
- package/dist/commands/node.js.map +1 -0
- package/dist/commands/queue.d.ts +3 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +199 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/system.d.ts +3 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +85 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/task.d.ts +3 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +176 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tryon.d.ts +3 -0
- package/dist/commands/tryon.d.ts.map +1 -0
- package/dist/commands/tryon.js +178 -0
- package/dist/commands/tryon.js.map +1 -0
- package/dist/commands/tts.d.ts +3 -0
- package/dist/commands/tts.d.ts.map +1 -0
- package/dist/commands/tts.js +157 -0
- package/dist/commands/tts.js.map +1 -0
- package/dist/commands/video.d.ts +3 -0
- package/dist/commands/video.d.ts.map +1 -0
- package/dist/commands/video.js +137 -0
- package/dist/commands/video.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +244 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api.d.ts +23 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +108 -0
- package/dist/services/api.js.map +1 -0
- package/dist/services/auth.d.ts +10 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +34 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/bfl-api.d.ts +67 -0
- package/dist/services/bfl-api.d.ts.map +1 -0
- package/dist/services/bfl-api.js +108 -0
- package/dist/services/bfl-api.js.map +1 -0
- package/dist/services/config.d.ts +12 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +30 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/dashscope-api.d.ts +69 -0
- package/dist/services/dashscope-api.d.ts.map +1 -0
- package/dist/services/dashscope-api.js +134 -0
- package/dist/services/dashscope-api.js.map +1 -0
- package/dist/services/dashscope-tts-api.d.ts +23 -0
- package/dist/services/dashscope-tts-api.d.ts.map +1 -0
- package/dist/services/dashscope-tts-api.js +56 -0
- package/dist/services/dashscope-tts-api.js.map +1 -0
- package/dist/services/fashn-api.d.ts +57 -0
- package/dist/services/fashn-api.d.ts.map +1 -0
- package/dist/services/fashn-api.js +84 -0
- package/dist/services/fashn-api.js.map +1 -0
- package/dist/services/generation-api.d.ts +139 -0
- package/dist/services/generation-api.d.ts.map +1 -0
- package/dist/services/generation-api.js +236 -0
- package/dist/services/generation-api.js.map +1 -0
- package/dist/services/groq-api.d.ts +18 -0
- package/dist/services/groq-api.d.ts.map +1 -0
- package/dist/services/groq-api.js +30 -0
- package/dist/services/groq-api.js.map +1 -0
- package/dist/services/websocket.d.ts +33 -0
- package/dist/services/websocket.d.ts.map +1 -0
- package/dist/services/websocket.js +217 -0
- package/dist/services/websocket.js.map +1 -0
- package/dist/utils/helpText.d.ts +15 -0
- package/dist/utils/helpText.d.ts.map +1 -0
- package/dist/utils/helpText.js +37 -0
- package/dist/utils/helpText.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output.d.ts +54 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +76 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/workflow.d.ts +17 -0
- package/dist/utils/workflow.d.ts.map +1 -0
- package/dist/utils/workflow.js +81 -0
- package/dist/utils/workflow.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
2
|
+
import { success } from '../utils/logger.js';
|
|
3
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
4
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
5
|
+
export function registerInterruptCommand(program) {
|
|
6
|
+
const cmd = program
|
|
7
|
+
.command('interrupt')
|
|
8
|
+
.description('中断当前执行 - 立即停止 ComfyUI 当前正在执行的任务')
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
const pretty = isPrettyMode(options);
|
|
11
|
+
try {
|
|
12
|
+
const client = new ComfyAPIClient();
|
|
13
|
+
await client.interrupt();
|
|
14
|
+
if (pretty) {
|
|
15
|
+
success('已发送中断信号');
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
outputSuccess({
|
|
19
|
+
message: '已发送中断信号',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
outputError('INTERRUPT_FAILED', `中断失败: ${err}`, options);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
// Add enhanced help for interrupt command
|
|
28
|
+
addEnhancedHelp(cmd, {
|
|
29
|
+
examples: [
|
|
30
|
+
'# 中断当前执行的任务',
|
|
31
|
+
'$ comfy interrupt',
|
|
32
|
+
'',
|
|
33
|
+
'# Pretty 模式',
|
|
34
|
+
'$ comfy interrupt --pretty',
|
|
35
|
+
],
|
|
36
|
+
outputJson: `{
|
|
37
|
+
"success": true,
|
|
38
|
+
"data": {
|
|
39
|
+
"message": "已发送中断信号"
|
|
40
|
+
}
|
|
41
|
+
}`,
|
|
42
|
+
relatedCommands: [
|
|
43
|
+
{ command: 'queue status', description: '查看队列状态' },
|
|
44
|
+
{ command: 'queue clear --confirm', description: '清空等待队列' },
|
|
45
|
+
{ command: 'queue delete <id>', description: '删除队列中的任务' },
|
|
46
|
+
],
|
|
47
|
+
notes: [
|
|
48
|
+
'立即停止当前正在执行的任务',
|
|
49
|
+
'只影响正在执行的任务,不影响队列中等待的任务',
|
|
50
|
+
'若要清空队列,使用 queue clear 命令',
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=interrupt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupt.js","sourceRoot":"","sources":["../../src/commands/interrupt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAS,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAEzB,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC;oBACZ,OAAO,EAAE,SAAS;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,kBAAkB,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,0CAA0C;IAC1C,eAAe,CAAC,GAAG,EAAE;QACnB,QAAQ,EAAE;YACR,aAAa;YACb,mBAAmB;YACnB,EAAE;YACF,aAAa;YACb,4BAA4B;SAC7B;QACD,UAAU,EAAE;;;;;EAKd;QACE,eAAe,EAAE;YACf,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE;YAClD,EAAE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE;YAC3D,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE;SAC1D;QACD,KAAK,EAAE;YACL,eAAe;YACf,wBAAwB;YACxB,0BAA0B;SAC3B;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAiFpD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
2
|
+
import { info } from '../utils/logger.js';
|
|
3
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
4
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
5
|
+
import Table from 'cli-table3';
|
|
6
|
+
export function registerModelCommand(program) {
|
|
7
|
+
const modelCmd = program
|
|
8
|
+
.command('model')
|
|
9
|
+
.description('模型管理');
|
|
10
|
+
// comfy model list
|
|
11
|
+
const listCmd = modelCmd
|
|
12
|
+
.command('list')
|
|
13
|
+
.description('列出可用模型 - 查看 ComfyUI 服务器上已安装的所有模型')
|
|
14
|
+
.option('--type <type>', '模型类型 (checkpoints, loras, vae, etc.)')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
const pretty = isPrettyMode(options);
|
|
17
|
+
try {
|
|
18
|
+
const client = new ComfyAPIClient();
|
|
19
|
+
const models = await client.listModels(options.type);
|
|
20
|
+
const modelList = Array.isArray(models) ? models : Object.values(models).flat();
|
|
21
|
+
if (pretty) {
|
|
22
|
+
if (modelList.length === 0) {
|
|
23
|
+
info('未找到模型');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const table = new Table({
|
|
27
|
+
head: ['序号', '模型名称'],
|
|
28
|
+
colWidths: [8, 70],
|
|
29
|
+
});
|
|
30
|
+
modelList.forEach((model, index) => {
|
|
31
|
+
table.push([index + 1, model]);
|
|
32
|
+
});
|
|
33
|
+
console.log(table.toString());
|
|
34
|
+
info(`共 ${modelList.length} 个模型${options.type ? ` (${options.type})` : ''}`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
outputSuccess({
|
|
38
|
+
models: modelList,
|
|
39
|
+
total: modelList.length,
|
|
40
|
+
type: options.type || null,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
outputError('MODEL_LIST_FAILED', `获取模型列表失败: ${err}`, options);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Add enhanced help for list command
|
|
49
|
+
addEnhancedHelp(listCmd, {
|
|
50
|
+
examples: [
|
|
51
|
+
'# 列出所有模型(JSON 模式)',
|
|
52
|
+
'$ comfy model list',
|
|
53
|
+
'',
|
|
54
|
+
'# 列出指定类型的模型',
|
|
55
|
+
'$ comfy model list --type checkpoints',
|
|
56
|
+
'',
|
|
57
|
+
'# Pretty 模式',
|
|
58
|
+
'$ comfy model list --pretty',
|
|
59
|
+
],
|
|
60
|
+
outputJson: `{
|
|
61
|
+
"success": true,
|
|
62
|
+
"data": {
|
|
63
|
+
"models": [
|
|
64
|
+
"flux1-dev-kontext_fp8_scaled.safetensors",
|
|
65
|
+
"wan2.1_i2v_720p_14B_fp8_scaled.safetensors"
|
|
66
|
+
],
|
|
67
|
+
"total": 2,
|
|
68
|
+
"type": null
|
|
69
|
+
}
|
|
70
|
+
}`,
|
|
71
|
+
relatedCommands: [
|
|
72
|
+
{ command: 'node list', description: '列出所有节点类型' },
|
|
73
|
+
{ command: 'system stats', description: '查看系统信息' },
|
|
74
|
+
],
|
|
75
|
+
notes: [
|
|
76
|
+
'返回 ComfyUI 服务器上已安装的模型列表',
|
|
77
|
+
'可通过 --type 参数过滤特定类型',
|
|
78
|
+
'常见类型: checkpoints, loras, vae, upscale_models, embeddings',
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/commands/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAwJnD"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
2
|
+
import { info } from '../utils/logger.js';
|
|
3
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
4
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
5
|
+
import Table from 'cli-table3';
|
|
6
|
+
export function registerNodeCommand(program) {
|
|
7
|
+
const nodeCmd = program
|
|
8
|
+
.command('node')
|
|
9
|
+
.description('节点信息查询');
|
|
10
|
+
// comfy node list
|
|
11
|
+
const listCmd = nodeCmd
|
|
12
|
+
.command('list')
|
|
13
|
+
.description('列出所有节点类型 - 查看 ComfyUI 中可用的所有节点类型')
|
|
14
|
+
.option('--filter <text>', '过滤节点名称')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
const pretty = isPrettyMode(options);
|
|
17
|
+
try {
|
|
18
|
+
const client = new ComfyAPIClient();
|
|
19
|
+
const nodeInfo = await client.getObjectInfo();
|
|
20
|
+
let nodeList = Object.keys(nodeInfo);
|
|
21
|
+
if (options.filter) {
|
|
22
|
+
nodeList = nodeList.filter((name) => name.toLowerCase().includes(options.filter.toLowerCase()));
|
|
23
|
+
}
|
|
24
|
+
if (pretty) {
|
|
25
|
+
if (nodeList.length === 0) {
|
|
26
|
+
info('未找到节点');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const table = new Table({
|
|
30
|
+
head: ['序号', '节点类型'],
|
|
31
|
+
colWidths: [8, 70],
|
|
32
|
+
});
|
|
33
|
+
nodeList.forEach((nodeName, index) => {
|
|
34
|
+
table.push([index + 1, nodeName]);
|
|
35
|
+
});
|
|
36
|
+
console.log(table.toString());
|
|
37
|
+
info(`共 ${nodeList.length} 个节点类型`);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
outputSuccess({
|
|
41
|
+
nodes: nodeList,
|
|
42
|
+
total: nodeList.length,
|
|
43
|
+
filter: options.filter || null,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
outputError('NODE_LIST_FAILED', `获取节点列表失败: ${err}`, options);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// Add enhanced help for list command
|
|
52
|
+
addEnhancedHelp(listCmd, {
|
|
53
|
+
examples: [
|
|
54
|
+
'# 列出所有节点类型',
|
|
55
|
+
'$ comfy node list',
|
|
56
|
+
'',
|
|
57
|
+
'# 过滤包含 "Load" 的节点',
|
|
58
|
+
'$ comfy node list --filter Load',
|
|
59
|
+
'',
|
|
60
|
+
'# Pretty 模式',
|
|
61
|
+
'$ comfy node list --pretty',
|
|
62
|
+
],
|
|
63
|
+
outputJson: `{
|
|
64
|
+
"success": true,
|
|
65
|
+
"data": {
|
|
66
|
+
"nodes": [
|
|
67
|
+
"KSampler",
|
|
68
|
+
"LoadImage",
|
|
69
|
+
"SaveImage",
|
|
70
|
+
"CLIPTextEncode"
|
|
71
|
+
],
|
|
72
|
+
"total": 4,
|
|
73
|
+
"filter": null
|
|
74
|
+
}
|
|
75
|
+
}`,
|
|
76
|
+
relatedCommands: [
|
|
77
|
+
{ command: 'node info <class>', description: '查看特定节点的详细信息' },
|
|
78
|
+
{ command: 'model list', description: '列出可用模型' },
|
|
79
|
+
],
|
|
80
|
+
notes: [
|
|
81
|
+
'返回 ComfyUI 中所有可用节点类型',
|
|
82
|
+
'使用 --filter 参数进行模糊搜索',
|
|
83
|
+
'配合 node info 命令查看节点详细信息',
|
|
84
|
+
],
|
|
85
|
+
});
|
|
86
|
+
// comfy node info
|
|
87
|
+
const infoCmd = nodeCmd
|
|
88
|
+
.command('info')
|
|
89
|
+
.description('查看节点详情 - 查看指定节点的输入输出参数和配置')
|
|
90
|
+
.argument('<class>', '节点类名')
|
|
91
|
+
.action(async (nodeClass, options) => {
|
|
92
|
+
const pretty = isPrettyMode(options);
|
|
93
|
+
try {
|
|
94
|
+
const client = new ComfyAPIClient();
|
|
95
|
+
const nodeInfo = await client.getObjectInfo(nodeClass);
|
|
96
|
+
if (pretty) {
|
|
97
|
+
console.log(`\n📦 节点: ${nodeClass}\n`);
|
|
98
|
+
console.log(JSON.stringify(nodeInfo, null, 2));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
outputSuccess({
|
|
102
|
+
class: nodeClass,
|
|
103
|
+
info: nodeInfo,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
outputError('NODE_INFO_FAILED', `获取节点信息失败: ${err}`, options);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// Add enhanced help for info command
|
|
112
|
+
addEnhancedHelp(infoCmd, {
|
|
113
|
+
examples: [
|
|
114
|
+
'# 查看 KSampler 节点详情',
|
|
115
|
+
'$ comfy node info KSampler',
|
|
116
|
+
'',
|
|
117
|
+
'# 查看 LoadImage 节点详情',
|
|
118
|
+
'$ comfy node info LoadImage',
|
|
119
|
+
'',
|
|
120
|
+
'# Pretty 模式',
|
|
121
|
+
'$ comfy node info SaveImage --pretty',
|
|
122
|
+
],
|
|
123
|
+
outputJson: `{
|
|
124
|
+
"success": true,
|
|
125
|
+
"data": {
|
|
126
|
+
"class": "KSampler",
|
|
127
|
+
"info": {
|
|
128
|
+
"input": {
|
|
129
|
+
"required": {...},
|
|
130
|
+
"optional": {...}
|
|
131
|
+
},
|
|
132
|
+
"output": [...],
|
|
133
|
+
"category": "sampling"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}`,
|
|
137
|
+
relatedCommands: [
|
|
138
|
+
{ command: 'node list', description: '列出所有节点类型' },
|
|
139
|
+
{ command: 'node list --filter <text>', description: '搜索节点' },
|
|
140
|
+
],
|
|
141
|
+
notes: [
|
|
142
|
+
'返回节点的完整定义信息',
|
|
143
|
+
'包含输入参数、输出类型、分类等',
|
|
144
|
+
'用于构建自定义 workflow 时了解节点接口',
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/commands/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA+MpD"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
2
|
+
import { success, info } from '../utils/logger.js';
|
|
3
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
4
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
5
|
+
import Table from 'cli-table3';
|
|
6
|
+
export function registerQueueCommand(program) {
|
|
7
|
+
const queueCmd = program
|
|
8
|
+
.command('queue')
|
|
9
|
+
.description('队列管理');
|
|
10
|
+
// comfy queue status
|
|
11
|
+
const statusCmd = queueCmd
|
|
12
|
+
.command('status')
|
|
13
|
+
.description('查看队列状态 - 查看 ComfyUI 当前正在执行和等待的任务')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
const pretty = isPrettyMode(options);
|
|
16
|
+
try {
|
|
17
|
+
const client = new ComfyAPIClient();
|
|
18
|
+
const queue = await client.getQueue();
|
|
19
|
+
if (pretty) {
|
|
20
|
+
const running = queue.queue_running || [];
|
|
21
|
+
const pending = queue.queue_pending || [];
|
|
22
|
+
console.log(`\n📊 队列状态\n`);
|
|
23
|
+
if (running.length > 0) {
|
|
24
|
+
info('🏃 正在执行:');
|
|
25
|
+
const table = new Table({
|
|
26
|
+
head: ['位置', 'Prompt ID', '节点数'],
|
|
27
|
+
colWidths: [8, 40, 12],
|
|
28
|
+
});
|
|
29
|
+
running.forEach((item, index) => {
|
|
30
|
+
table.push([index + 1, item[1] || '-', item[2]?.length || 0]);
|
|
31
|
+
});
|
|
32
|
+
console.log(table.toString());
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
info('✓ 当前无正在执行的任务');
|
|
36
|
+
}
|
|
37
|
+
console.log('');
|
|
38
|
+
if (pending.length > 0) {
|
|
39
|
+
info(`⏳ 等待中: ${pending.length} 个任务`);
|
|
40
|
+
const table = new Table({
|
|
41
|
+
head: ['位置', 'Prompt ID', '节点数'],
|
|
42
|
+
colWidths: [8, 40, 12],
|
|
43
|
+
});
|
|
44
|
+
pending.forEach((item, index) => {
|
|
45
|
+
table.push([index + 1, item[1] || '-', item[2]?.length || 0]);
|
|
46
|
+
});
|
|
47
|
+
console.log(table.toString());
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
info('✓ 无等待任务');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const running = (queue.queue_running || []).map((item, index) => ({
|
|
55
|
+
position: index + 1,
|
|
56
|
+
prompt_id: item[1] || null,
|
|
57
|
+
node_count: item[2]?.length || 0,
|
|
58
|
+
}));
|
|
59
|
+
const pending = (queue.queue_pending || []).map((item, index) => ({
|
|
60
|
+
position: index + 1,
|
|
61
|
+
prompt_id: item[1] || null,
|
|
62
|
+
node_count: item[2]?.length || 0,
|
|
63
|
+
}));
|
|
64
|
+
outputSuccess({
|
|
65
|
+
running,
|
|
66
|
+
pending,
|
|
67
|
+
running_count: running.length,
|
|
68
|
+
pending_count: pending.length,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
outputError('QUEUE_STATUS_FAILED', `获取队列状态失败: ${err}`, options);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Add enhanced help for status command
|
|
77
|
+
addEnhancedHelp(statusCmd, {
|
|
78
|
+
examples: [
|
|
79
|
+
'# 查看队列状态(JSON 模式)',
|
|
80
|
+
'$ comfy queue status',
|
|
81
|
+
'',
|
|
82
|
+
'# Pretty 模式',
|
|
83
|
+
'$ comfy queue status --pretty',
|
|
84
|
+
],
|
|
85
|
+
outputJson: `{
|
|
86
|
+
"success": true,
|
|
87
|
+
"data": {
|
|
88
|
+
"running": [],
|
|
89
|
+
"pending": [],
|
|
90
|
+
"running_count": 0,
|
|
91
|
+
"pending_count": 0
|
|
92
|
+
}
|
|
93
|
+
}`,
|
|
94
|
+
relatedCommands: [
|
|
95
|
+
{ command: 'queue clear --confirm', description: '清空队列' },
|
|
96
|
+
{ command: 'queue delete <id>', description: '删除指定任务' },
|
|
97
|
+
{ command: 'interrupt', description: '中断当前执行' },
|
|
98
|
+
],
|
|
99
|
+
notes: [
|
|
100
|
+
'running: 正在执行的任务列表',
|
|
101
|
+
'pending: 等待执行的任务列表',
|
|
102
|
+
'每个任务包含 prompt_id 和节点数量信息',
|
|
103
|
+
],
|
|
104
|
+
});
|
|
105
|
+
// comfy queue clear
|
|
106
|
+
const clearCmd = queueCmd
|
|
107
|
+
.command('clear')
|
|
108
|
+
.description('清空队列 - 清空所有等待中的任务(需要确认)')
|
|
109
|
+
.option('--confirm', '确认清空(必需)')
|
|
110
|
+
.action(async (options) => {
|
|
111
|
+
const pretty = isPrettyMode(options);
|
|
112
|
+
try {
|
|
113
|
+
if (!options.confirm) {
|
|
114
|
+
outputError('CONFIRM_REQUIRED', '请使用 --confirm 确认清空操作', options);
|
|
115
|
+
}
|
|
116
|
+
const client = new ComfyAPIClient();
|
|
117
|
+
await client.clearQueue();
|
|
118
|
+
if (pretty) {
|
|
119
|
+
success('队列已清空');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
outputSuccess({ message: '队列已清空' });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
outputError('QUEUE_CLEAR_FAILED', `清空队列失败: ${err}`, options);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// Add enhanced help for clear command
|
|
130
|
+
addEnhancedHelp(clearCmd, {
|
|
131
|
+
examples: [
|
|
132
|
+
'# 清空队列(需要 --confirm)',
|
|
133
|
+
'$ comfy queue clear --confirm',
|
|
134
|
+
],
|
|
135
|
+
outputJson: `{
|
|
136
|
+
"success": true,
|
|
137
|
+
"data": {
|
|
138
|
+
"message": "队列已清空"
|
|
139
|
+
}
|
|
140
|
+
}`,
|
|
141
|
+
relatedCommands: [
|
|
142
|
+
{ command: 'queue status', description: '查看队列状态' },
|
|
143
|
+
{ command: 'queue delete <id>', description: '删除单个任务' },
|
|
144
|
+
],
|
|
145
|
+
notes: [
|
|
146
|
+
'必须使用 --confirm 选项才能执行',
|
|
147
|
+
'只清空等待中的任务,不影响正在执行的任务',
|
|
148
|
+
'此操作不可撤销',
|
|
149
|
+
],
|
|
150
|
+
});
|
|
151
|
+
// comfy queue delete
|
|
152
|
+
const deleteCmd = queueCmd
|
|
153
|
+
.command('delete')
|
|
154
|
+
.description('删除指定队列项 - 从队列中删除指定的任务')
|
|
155
|
+
.argument('<item_id>', '队列项 ID(从 queue status 获取)')
|
|
156
|
+
.action(async (itemId, options) => {
|
|
157
|
+
const pretty = isPrettyMode(options);
|
|
158
|
+
try {
|
|
159
|
+
const client = new ComfyAPIClient();
|
|
160
|
+
await client.deleteQueueItem(itemId);
|
|
161
|
+
if (pretty) {
|
|
162
|
+
success(`已删除队列项: ${itemId}`);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
outputSuccess({
|
|
166
|
+
message: '已删除队列项',
|
|
167
|
+
item_id: itemId
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
outputError('QUEUE_DELETE_FAILED', `删除失败: ${err}`, options);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
// Add enhanced help for delete command
|
|
176
|
+
addEnhancedHelp(deleteCmd, {
|
|
177
|
+
examples: [
|
|
178
|
+
'# 删除指定队列项',
|
|
179
|
+
'$ comfy queue delete abc-123-def',
|
|
180
|
+
],
|
|
181
|
+
outputJson: `{
|
|
182
|
+
"success": true,
|
|
183
|
+
"data": {
|
|
184
|
+
"message": "已删除队列项",
|
|
185
|
+
"item_id": "abc-123-def"
|
|
186
|
+
}
|
|
187
|
+
}`,
|
|
188
|
+
relatedCommands: [
|
|
189
|
+
{ command: 'queue status', description: '查看队列获取 item_id' },
|
|
190
|
+
{ command: 'queue clear --confirm', description: '清空所有队列' },
|
|
191
|
+
],
|
|
192
|
+
notes: [
|
|
193
|
+
'item_id 从 queue status 命令获取',
|
|
194
|
+
'只能删除等待中的任务',
|
|
195
|
+
'正在执行的任务需要使用 interrupt 命令',
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/commands/system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAoFrD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
2
|
+
import { info } from '../utils/logger.js';
|
|
3
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
4
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
5
|
+
import Table from 'cli-table3';
|
|
6
|
+
export function registerSystemCommand(program) {
|
|
7
|
+
const systemCmd = program
|
|
8
|
+
.command('system')
|
|
9
|
+
.description('系统信息');
|
|
10
|
+
// comfy system stats
|
|
11
|
+
const statsCmd = systemCmd
|
|
12
|
+
.command('stats')
|
|
13
|
+
.description('查看系统统计信息 - 查看 ComfyUI 服务器的系统资源和设备状态')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
const pretty = isPrettyMode(options);
|
|
16
|
+
try {
|
|
17
|
+
const client = new ComfyAPIClient();
|
|
18
|
+
const stats = await client.getSystemStats();
|
|
19
|
+
if (pretty) {
|
|
20
|
+
console.log(`\n💻 系统状态\n`);
|
|
21
|
+
if (stats.system) {
|
|
22
|
+
const table = new Table({
|
|
23
|
+
head: ['指标', '值'],
|
|
24
|
+
colWidths: [30, 50],
|
|
25
|
+
});
|
|
26
|
+
Object.entries(stats.system).forEach(([key, value]) => {
|
|
27
|
+
table.push([key, String(value)]);
|
|
28
|
+
});
|
|
29
|
+
console.log(table.toString());
|
|
30
|
+
}
|
|
31
|
+
if (stats.devices) {
|
|
32
|
+
console.log('\n🎮 设备信息:\n');
|
|
33
|
+
stats.devices.forEach((device, index) => {
|
|
34
|
+
info(`设备 ${index + 1}:`);
|
|
35
|
+
console.log(JSON.stringify(device, null, 2));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
outputSuccess(stats);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
outputError('SYSTEM_STATS_FAILED', `获取系统信息失败: ${err}`, options);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// Add enhanced help for stats command
|
|
48
|
+
addEnhancedHelp(statsCmd, {
|
|
49
|
+
examples: [
|
|
50
|
+
'# 查看系统统计信息',
|
|
51
|
+
'$ comfy system stats',
|
|
52
|
+
'',
|
|
53
|
+
'# Pretty 模式',
|
|
54
|
+
'$ comfy system stats --pretty',
|
|
55
|
+
],
|
|
56
|
+
outputJson: `{
|
|
57
|
+
"success": true,
|
|
58
|
+
"data": {
|
|
59
|
+
"system": {
|
|
60
|
+
"os": "linux",
|
|
61
|
+
"python_version": "3.10.12",
|
|
62
|
+
"pytorch_version": "2.0.1"
|
|
63
|
+
},
|
|
64
|
+
"devices": [
|
|
65
|
+
{
|
|
66
|
+
"name": "NVIDIA GeForce RTX 4090",
|
|
67
|
+
"type": "cuda",
|
|
68
|
+
"vram_total": 24564,
|
|
69
|
+
"vram_free": 18432
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
}`,
|
|
74
|
+
relatedCommands: [
|
|
75
|
+
{ command: 'queue status', description: '查看队列状态' },
|
|
76
|
+
{ command: 'model list', description: '列出可用模型' },
|
|
77
|
+
],
|
|
78
|
+
notes: [
|
|
79
|
+
'显示 ComfyUI 服务器的系统信息',
|
|
80
|
+
'包含 CPU、内存、GPU 等硬件信息',
|
|
81
|
+
'用于诊断性能问题和资源使用情况',
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/commands/system.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAS,IAAI,EAAW,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,MAAM,CAAC,CAAC;IAEvB,qBAAqB;IACrB,MAAM,QAAQ,GAAG,SAAS;SACvB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;YAE5C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAE3B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;wBACtB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;wBACjB,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;qBACpB,CAAC,CAAC;oBAEH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;wBACpD,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnC,CAAC,CAAC,CAAC;oBAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAChC,CAAC;gBAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAC5B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,KAAa,EAAE,EAAE;wBACnD,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;wBACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC/C,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,qBAAqB,EAAE,aAAa,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,sCAAsC;IACtC,eAAe,CAAC,QAAQ,EAAE;QACxB,QAAQ,EAAE;YACR,YAAY;YACZ,sBAAsB;YACtB,EAAE;YACF,aAAa;YACb,+BAA+B;SAChC;QACD,UAAU,EAAE;;;;;;;;;;;;;;;;;EAiBd;QACE,eAAe,EAAE;YACf,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE;YAClD,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE;SACjD;QACD,KAAK,EAAE;YACL,qBAAqB;YACrB,qBAAqB;YACrB,iBAAiB;SAClB;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAgKnD"}
|