@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.
Files changed (153) hide show
  1. package/dist/backends/bfl.d.ts +18 -0
  2. package/dist/backends/bfl.d.ts.map +1 -0
  3. package/dist/backends/bfl.js +130 -0
  4. package/dist/backends/bfl.js.map +1 -0
  5. package/dist/backends/comfyui.d.ts +10 -0
  6. package/dist/backends/comfyui.d.ts.map +1 -0
  7. package/dist/backends/comfyui.js +121 -0
  8. package/dist/backends/comfyui.js.map +1 -0
  9. package/dist/backends/index.d.ts +24 -0
  10. package/dist/backends/index.d.ts.map +1 -0
  11. package/dist/backends/index.js +59 -0
  12. package/dist/backends/index.js.map +1 -0
  13. package/dist/backends/types.d.ts +99 -0
  14. package/dist/backends/types.d.ts.map +1 -0
  15. package/dist/backends/types.js +2 -0
  16. package/dist/backends/types.js.map +1 -0
  17. package/dist/backends/video-dashscope.d.ts +10 -0
  18. package/dist/backends/video-dashscope.d.ts.map +1 -0
  19. package/dist/backends/video-dashscope.js +108 -0
  20. package/dist/backends/video-dashscope.js.map +1 -0
  21. package/dist/backends/video-index.d.ts +23 -0
  22. package/dist/backends/video-index.d.ts.map +1 -0
  23. package/dist/backends/video-index.js +57 -0
  24. package/dist/backends/video-index.js.map +1 -0
  25. package/dist/commands/asr.d.ts +3 -0
  26. package/dist/commands/asr.d.ts.map +1 -0
  27. package/dist/commands/asr.js +133 -0
  28. package/dist/commands/asr.js.map +1 -0
  29. package/dist/commands/config.d.ts +3 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +105 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/download.d.ts +3 -0
  34. package/dist/commands/download.d.ts.map +1 -0
  35. package/dist/commands/download.js +169 -0
  36. package/dist/commands/download.js.map +1 -0
  37. package/dist/commands/edit.d.ts +3 -0
  38. package/dist/commands/edit.d.ts.map +1 -0
  39. package/dist/commands/edit.js +155 -0
  40. package/dist/commands/edit.js.map +1 -0
  41. package/dist/commands/generate.d.ts +3 -0
  42. package/dist/commands/generate.d.ts.map +1 -0
  43. package/dist/commands/generate.js +135 -0
  44. package/dist/commands/generate.js.map +1 -0
  45. package/dist/commands/image.d.ts +3 -0
  46. package/dist/commands/image.d.ts.map +1 -0
  47. package/dist/commands/image.js +139 -0
  48. package/dist/commands/image.js.map +1 -0
  49. package/dist/commands/init.d.ts +3 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +144 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/interrupt.d.ts +3 -0
  54. package/dist/commands/interrupt.d.ts.map +1 -0
  55. package/dist/commands/interrupt.js +54 -0
  56. package/dist/commands/interrupt.js.map +1 -0
  57. package/dist/commands/model.d.ts +3 -0
  58. package/dist/commands/model.d.ts.map +1 -0
  59. package/dist/commands/model.js +82 -0
  60. package/dist/commands/model.js.map +1 -0
  61. package/dist/commands/node.d.ts +3 -0
  62. package/dist/commands/node.d.ts.map +1 -0
  63. package/dist/commands/node.js +148 -0
  64. package/dist/commands/node.js.map +1 -0
  65. package/dist/commands/queue.d.ts +3 -0
  66. package/dist/commands/queue.d.ts.map +1 -0
  67. package/dist/commands/queue.js +199 -0
  68. package/dist/commands/queue.js.map +1 -0
  69. package/dist/commands/system.d.ts +3 -0
  70. package/dist/commands/system.d.ts.map +1 -0
  71. package/dist/commands/system.js +85 -0
  72. package/dist/commands/system.js.map +1 -0
  73. package/dist/commands/task.d.ts +3 -0
  74. package/dist/commands/task.d.ts.map +1 -0
  75. package/dist/commands/task.js +176 -0
  76. package/dist/commands/task.js.map +1 -0
  77. package/dist/commands/tryon.d.ts +3 -0
  78. package/dist/commands/tryon.d.ts.map +1 -0
  79. package/dist/commands/tryon.js +178 -0
  80. package/dist/commands/tryon.js.map +1 -0
  81. package/dist/commands/tts.d.ts +3 -0
  82. package/dist/commands/tts.d.ts.map +1 -0
  83. package/dist/commands/tts.js +157 -0
  84. package/dist/commands/tts.js.map +1 -0
  85. package/dist/commands/video.d.ts +3 -0
  86. package/dist/commands/video.d.ts.map +1 -0
  87. package/dist/commands/video.js +137 -0
  88. package/dist/commands/video.js.map +1 -0
  89. package/dist/commands/workflow.d.ts +3 -0
  90. package/dist/commands/workflow.d.ts.map +1 -0
  91. package/dist/commands/workflow.js +244 -0
  92. package/dist/commands/workflow.js.map +1 -0
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +58 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/services/api.d.ts +23 -0
  98. package/dist/services/api.d.ts.map +1 -0
  99. package/dist/services/api.js +108 -0
  100. package/dist/services/api.js.map +1 -0
  101. package/dist/services/auth.d.ts +10 -0
  102. package/dist/services/auth.d.ts.map +1 -0
  103. package/dist/services/auth.js +34 -0
  104. package/dist/services/auth.js.map +1 -0
  105. package/dist/services/bfl-api.d.ts +67 -0
  106. package/dist/services/bfl-api.d.ts.map +1 -0
  107. package/dist/services/bfl-api.js +108 -0
  108. package/dist/services/bfl-api.js.map +1 -0
  109. package/dist/services/config.d.ts +12 -0
  110. package/dist/services/config.d.ts.map +1 -0
  111. package/dist/services/config.js +30 -0
  112. package/dist/services/config.js.map +1 -0
  113. package/dist/services/dashscope-api.d.ts +69 -0
  114. package/dist/services/dashscope-api.d.ts.map +1 -0
  115. package/dist/services/dashscope-api.js +134 -0
  116. package/dist/services/dashscope-api.js.map +1 -0
  117. package/dist/services/dashscope-tts-api.d.ts +23 -0
  118. package/dist/services/dashscope-tts-api.d.ts.map +1 -0
  119. package/dist/services/dashscope-tts-api.js +56 -0
  120. package/dist/services/dashscope-tts-api.js.map +1 -0
  121. package/dist/services/fashn-api.d.ts +57 -0
  122. package/dist/services/fashn-api.d.ts.map +1 -0
  123. package/dist/services/fashn-api.js +84 -0
  124. package/dist/services/fashn-api.js.map +1 -0
  125. package/dist/services/generation-api.d.ts +139 -0
  126. package/dist/services/generation-api.d.ts.map +1 -0
  127. package/dist/services/generation-api.js +236 -0
  128. package/dist/services/generation-api.js.map +1 -0
  129. package/dist/services/groq-api.d.ts +18 -0
  130. package/dist/services/groq-api.d.ts.map +1 -0
  131. package/dist/services/groq-api.js +30 -0
  132. package/dist/services/groq-api.js.map +1 -0
  133. package/dist/services/websocket.d.ts +33 -0
  134. package/dist/services/websocket.d.ts.map +1 -0
  135. package/dist/services/websocket.js +217 -0
  136. package/dist/services/websocket.js.map +1 -0
  137. package/dist/utils/helpText.d.ts +15 -0
  138. package/dist/utils/helpText.d.ts.map +1 -0
  139. package/dist/utils/helpText.js +37 -0
  140. package/dist/utils/helpText.js.map +1 -0
  141. package/dist/utils/logger.d.ts +5 -0
  142. package/dist/utils/logger.d.ts.map +1 -0
  143. package/dist/utils/logger.js +14 -0
  144. package/dist/utils/logger.js.map +1 -0
  145. package/dist/utils/output.d.ts +54 -0
  146. package/dist/utils/output.d.ts.map +1 -0
  147. package/dist/utils/output.js +76 -0
  148. package/dist/utils/output.js.map +1 -0
  149. package/dist/utils/workflow.d.ts +17 -0
  150. package/dist/utils/workflow.d.ts.map +1 -0
  151. package/dist/utils/workflow.js +81 -0
  152. package/dist/utils/workflow.js.map +1 -0
  153. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerModelCommand(program: Command): void;
3
+ //# sourceMappingURL=model.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerNodeCommand(program: Command): void;
3
+ //# sourceMappingURL=node.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerQueueCommand(program: Command): void;
3
+ //# sourceMappingURL=queue.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSystemCommand(program: Command): void;
3
+ //# sourceMappingURL=system.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTaskCommand(program: Command): void;
3
+ //# sourceMappingURL=task.d.ts.map
@@ -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"}