@optima-chat/comfy-cli 0.1.3 → 0.2.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.
@@ -19,7 +19,8 @@
19
19
  "Bash(do)",
20
20
  "Bash(done)",
21
21
  "Bash(comfy:*)",
22
- "Bash(cat:*)"
22
+ "Bash(cat:*)",
23
+ "Read(//tmp/**)"
23
24
  ],
24
25
  "deny": [],
25
26
  "ask": []
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # ComfyUI CLI
2
2
 
3
+ ![ComfyUI CLI Banner](./docs/images/banner.png)
4
+
3
5
  面向 [ComfyUI](https://github.com/comfyanonymous/ComfyUI) 的命令行工具,专为 LLM 交互设计,特别适配 Claude Code。
4
6
 
5
7
  ## 特性
@@ -42,6 +44,7 @@ comfy model list --type checkpoints
42
44
  ```bash
43
45
  comfy generate "a beautiful sunset over mountains"
44
46
  comfy generate "cyberpunk city" --width 1024 --height 768 --steps 30
47
+ comfy generate "a cat" --watch # 实时监听生成进度
45
48
  ```
46
49
 
47
50
  **选项**:
@@ -50,6 +53,7 @@ comfy generate "cyberpunk city" --width 1024 --height 768 --steps 30
50
53
  - `--steps <number>`: 采样步数(默认:20)
51
54
  - `--cfg <number>`: CFG scale(默认:1.0,FLUX 优化值)
52
55
  - `--seed <number>`: 随机种子
56
+ - `--watch`: 实时显示生成进度(WebSocket)
53
57
  - `--json`: 输出 JSON 格式
54
58
 
55
59
  #### 图像编辑(图生图)
@@ -57,17 +61,19 @@ comfy generate "cyberpunk city" --width 1024 --height 768 --steps 30
57
61
  ```bash
58
62
  comfy edit input.png "add more details"
59
63
  comfy edit photo.jpg "make it anime style" --strength 0.8
64
+ comfy edit image.png "stylize" --watch # 实时监听编辑进度
60
65
  ```
61
66
 
62
67
  **选项**:
63
- - `--strength <number>`: 变换强度 0-1(默认:0.75
64
- - `--steps`, `--cfg`, `--seed`, `--json`: 同上
68
+ - `--strength <number>`: 变换强度 0-1(默认:1.0)
69
+ - `--steps`, `--cfg`, `--seed`, `--watch`, `--json`: 同上
65
70
 
66
71
  #### 视频生成(图生视频)
67
72
 
68
73
  ```bash
69
74
  comfy video portrait.png --prompt "smooth motion" --frames 60 --fps 30
70
75
  comfy video scene.jpg --width 512 --height 512
76
+ comfy video image.png --prompt "dancing" --watch # 实时监听生成进度
71
77
  ```
72
78
 
73
79
  **选项**:
@@ -77,7 +83,7 @@ comfy video scene.jpg --width 512 --height 512
77
83
  - `--frames <number>`: 帧数(默认:33,约 4 秒)
78
84
  - `--fps <number>`: 帧率(默认:8,Wan2.1 优化值)
79
85
  - `--cfg <number>`: CFG scale(默认:6.0)
80
- - `--steps`, `--seed`, `--json`: 同上
86
+ - `--steps`, `--seed`, `--watch`, `--json`: 同上
81
87
 
82
88
  ---
83
89
 
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAqEnD"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAmGnD"}
@@ -1,8 +1,10 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
+ import ora from 'ora';
3
4
  import { ComfyAPIClient } from '../services/api.js';
4
5
  import { loadWorkflow, getBuiltinWorkflowPath, replaceVariables } from '../utils/workflow.js';
5
6
  import { success, error, info } from '../utils/logger.js';
7
+ import { monitorProgress } from '../services/websocket.js';
6
8
  export function registerEditCommand(program) {
7
9
  program
8
10
  .command('edit')
@@ -14,6 +16,7 @@ export function registerEditCommand(program) {
14
16
  .option('--steps <number>', '采样步数', '20')
15
17
  .option('--cfg <number>', 'CFG scale', '1.0')
16
18
  .option('--seed <number>', '随机种子', String(Math.floor(Math.random() * 1000000)))
19
+ .option('--watch', '实时监听生成进度')
17
20
  .option('--json', '输出 JSON 格式')
18
21
  .action(async (image, prompt, options) => {
19
22
  try {
@@ -59,7 +62,33 @@ export function registerEditCommand(program) {
59
62
  else {
60
63
  success(`图像编辑任务已提交`);
61
64
  info(`Prompt ID: ${result.prompt_id}`);
62
- info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
65
+ // 如果启用了 watch 模式,监听进度
66
+ if (options.watch) {
67
+ const spinner = ora('正在连接 WebSocket...').start();
68
+ try {
69
+ await monitorProgress(result.prompt_id, (current, total, message) => {
70
+ if (total > 0) {
71
+ const percent = Math.round((current / total) * 100);
72
+ spinner.text = `编辑中: ${percent}% (${current}/${total})`;
73
+ spinner.render();
74
+ }
75
+ else {
76
+ spinner.text = message;
77
+ spinner.render();
78
+ }
79
+ }, () => {
80
+ spinner.succeed('图像编辑完成!');
81
+ });
82
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
83
+ }
84
+ catch (err) {
85
+ spinner.fail(`进度监听失败: ${err?.message || err}`);
86
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
87
+ }
88
+ }
89
+ else {
90
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
91
+ }
63
92
  }
64
93
  }
65
94
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,WAAW,CAAC;SACxB,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7B,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;SAC/B,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,UAAU,CAAC;SAChD,MAAM,CAAC,qBAAqB,EAAE,YAAY,EAAE,KAAK,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC;SACxC,MAAM,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,CAAC;SAC5C,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;SAC9E,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,MAAc,EAAE,OAAO,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,aAAa;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,KAAK,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC;YAEzB,QAAQ;YACR,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YAErF,gBAAgB;YAChB,MAAM,YAAY,GAAG,sBAAsB,CAAC,0BAA0B,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YAE5C,OAAO;YACP,MAAM,MAAM,GAAG;gBACb,MAAM;gBACN,WAAW,EAAE,YAAY,CAAC,IAAI;gBAC9B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACrC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9B,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;gBAClC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC5B,eAAe,EAAE,gBAAgB;gBACjC,KAAK,EAAE,0CAA0C;gBACjD,YAAY,EAAE,oBAAoB;gBAClC,aAAa,EAAE,qCAAqC;gBACpD,SAAS,EAAE,gBAAgB;gBAC3B,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,GAAG;aACd,CAAC;YAEF,OAAO;YACP,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE7D,cAAc;YACd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAE9D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrB,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,0BAA0B,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAuDvD"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAqFvD"}
@@ -1,6 +1,8 @@
1
+ import ora from 'ora';
1
2
  import { ComfyAPIClient } from '../services/api.js';
2
3
  import { loadWorkflow, getBuiltinWorkflowPath, replaceVariables } from '../utils/workflow.js';
3
4
  import { success, error, info } from '../utils/logger.js';
5
+ import { monitorProgress } from '../services/websocket.js';
4
6
  export function registerGenerateCommand(program) {
5
7
  program
6
8
  .command('generate')
@@ -12,6 +14,7 @@ export function registerGenerateCommand(program) {
12
14
  .option('--steps <number>', '采样步数', '20')
13
15
  .option('--cfg <number>', 'CFG scale', '1.0')
14
16
  .option('--seed <number>', '随机种子', String(Math.floor(Math.random() * 1000000)))
17
+ .option('--watch', '实时监听生成进度')
15
18
  .option('--json', '输出 JSON 格式')
16
19
  .action(async (prompt, options) => {
17
20
  try {
@@ -45,7 +48,33 @@ export function registerGenerateCommand(program) {
45
48
  else {
46
49
  success(`图像生成任务已提交`);
47
50
  info(`Prompt ID: ${result.prompt_id}`);
48
- info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
51
+ // 如果启用了 watch 模式,监听进度
52
+ if (options.watch) {
53
+ const spinner = ora('正在连接 WebSocket...').start();
54
+ try {
55
+ await monitorProgress(result.prompt_id, (current, total, message) => {
56
+ if (total > 0) {
57
+ const percent = Math.round((current / total) * 100);
58
+ spinner.text = `生成中: ${percent}% (${current}/${total})`;
59
+ spinner.render(); // 强制渲染
60
+ }
61
+ else {
62
+ spinner.text = message;
63
+ spinner.render();
64
+ }
65
+ }, () => {
66
+ spinner.succeed('图像生成完成!');
67
+ });
68
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
69
+ }
70
+ catch (err) {
71
+ spinner.fail(`进度监听失败: ${err?.message || err}`);
72
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
73
+ }
74
+ }
75
+ else {
76
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
77
+ }
49
78
  }
50
79
  }
51
80
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,WAAW,CAAC;SACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;SAC/B,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,UAAU,CAAC;SAChD,MAAM,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC;SAC1C,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC;SACxC,MAAM,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,CAAC;SAC5C,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;SAC9E,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAO,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC;YAE5B,gBAAgB;YAChB,MAAM,YAAY,GAAG,sBAAsB,CAAC,yBAAyB,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YAE5C,OAAO;YACP,MAAM,MAAM,GAAG;gBACb,MAAM;gBACN,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9B,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;gBAChC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9B,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;gBAClC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC5B,eAAe,EAAE,WAAW;gBAC5B,KAAK,EAAE,iCAAiC;gBACxC,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,QAAQ;gBACnB,eAAe,EAAE,0UAA0U;gBAC3V,QAAQ,EAAE,GAAG;aACd,CAAC;YAEF,OAAO;YACP,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE7D,cAAc;YACd,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAE9D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrB,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,0BAA0B,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA6EpD"}
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA2GpD"}
@@ -1,8 +1,10 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
+ import ora from 'ora';
3
4
  import { ComfyAPIClient } from '../services/api.js';
4
5
  import { loadWorkflow, getBuiltinWorkflowPath, replaceVariables } from '../utils/workflow.js';
5
6
  import { success, error, info } from '../utils/logger.js';
7
+ import { monitorProgress } from '../services/websocket.js';
6
8
  export function registerVideoCommand(program) {
7
9
  program
8
10
  .command('video')
@@ -18,6 +20,7 @@ export function registerVideoCommand(program) {
18
20
  .option('--steps <number>', '采样步数', '20')
19
21
  .option('--cfg <number>', 'CFG scale', '6.0')
20
22
  .option('--seed <number>', '随机种子', String(Math.floor(Math.random() * 1000000)))
23
+ .option('--watch', '实时监听生成进度')
21
24
  .option('--json', '输出 JSON 格式')
22
25
  .action(async (image, options) => {
23
26
  try {
@@ -67,7 +70,33 @@ export function registerVideoCommand(program) {
67
70
  success(`视频生成任务已提交`);
68
71
  info(`Prompt ID: ${result.prompt_id}`);
69
72
  info(`帧数: ${params.frames}, FPS: ${params.fps}, 时长: ${(params.frames / params.fps).toFixed(1)}秒`);
70
- info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
73
+ // 如果启用了 watch 模式,监听进度
74
+ if (options.watch) {
75
+ const spinner = ora('正在连接 WebSocket...').start();
76
+ try {
77
+ await monitorProgress(result.prompt_id, (current, total, message) => {
78
+ if (total > 0) {
79
+ const percent = Math.round((current / total) * 100);
80
+ spinner.text = `生成中: ${percent}% (${current}/${total})`;
81
+ spinner.render();
82
+ }
83
+ else {
84
+ spinner.text = message;
85
+ spinner.render();
86
+ }
87
+ }, () => {
88
+ spinner.succeed('视频生成完成!');
89
+ });
90
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
91
+ }
92
+ catch (err) {
93
+ spinner.fail(`进度监听失败: ${err?.message || err}`);
94
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
95
+ }
96
+ }
97
+ else {
98
+ info(`使用 'comfy workflow get ${result.prompt_id}' 查看结果`);
99
+ }
71
100
  }
72
101
  }
73
102
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ const program = new Command();
14
14
  program
15
15
  .name('comfy')
16
16
  .description('A CLI tool for ComfyUI designed for LLM interactions')
17
- .version('0.1.3');
17
+ .version('0.2.0');
18
18
  // 注册功能命令
19
19
  registerGenerateCommand(program);
20
20
  registerEditCommand(program);
@@ -0,0 +1,33 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface ProgressData {
3
+ value: number;
4
+ max: number;
5
+ node?: string | null;
6
+ prompt_id?: string;
7
+ }
8
+ export interface ExecutingData {
9
+ node: string | null;
10
+ prompt_id: string;
11
+ }
12
+ export interface ExecutedData {
13
+ node: string;
14
+ output: any;
15
+ prompt_id: string;
16
+ }
17
+ export declare class ComfyWebSocket extends EventEmitter {
18
+ private ws;
19
+ private clientId;
20
+ private reconnectAttempts;
21
+ private maxReconnectAttempts;
22
+ constructor(clientId?: string);
23
+ connect(): Promise<void>;
24
+ private handleMessage;
25
+ disconnect(): void;
26
+ isConnected(): boolean;
27
+ getClientId(): string;
28
+ }
29
+ /**
30
+ * 监听特定 prompt_id 的执行进度
31
+ */
32
+ export declare function monitorProgress(promptId: string, onProgress?: (current: number, total: number, message: string) => void, onComplete?: () => void): Promise<void>;
33
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;gBAErB,QAAQ,CAAC,EAAE,MAAM;IAKvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD9B,OAAO,CAAC,aAAa;IAiCrB,UAAU;IAOV,WAAW,IAAI,OAAO;IAItB,WAAW,IAAI,MAAM;CAGtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,EACtE,UAAU,CAAC,EAAE,MAAM,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAmHf"}
@@ -0,0 +1,217 @@
1
+ import WebSocket from 'ws';
2
+ import { EventEmitter } from 'events';
3
+ import { getConfig } from './config.js';
4
+ export class ComfyWebSocket extends EventEmitter {
5
+ ws = null;
6
+ clientId;
7
+ reconnectAttempts = 0;
8
+ maxReconnectAttempts = 3;
9
+ constructor(clientId) {
10
+ super();
11
+ this.clientId = clientId || `comfy-cli-${Date.now()}`;
12
+ }
13
+ async connect() {
14
+ const config = getConfig();
15
+ const serverUrl = new URL(config.server);
16
+ // 构建 WebSocket URL
17
+ const protocol = serverUrl.protocol === 'https:' ? 'wss:' : 'ws:';
18
+ const wsUrl = `${protocol}//${serverUrl.host}/ws?clientId=${this.clientId}`;
19
+ return new Promise((resolve, reject) => {
20
+ try {
21
+ this.ws = new WebSocket(wsUrl);
22
+ // 添加连接超时
23
+ const connectTimeout = setTimeout(() => {
24
+ if (this.ws && this.ws.readyState !== WebSocket.OPEN) {
25
+ this.ws.terminate();
26
+ reject(new Error('WebSocket connection timeout'));
27
+ }
28
+ }, 10000); // 10秒超时
29
+ this.ws.on('open', () => {
30
+ clearTimeout(connectTimeout);
31
+ this.reconnectAttempts = 0;
32
+ this.emit('connected');
33
+ resolve();
34
+ });
35
+ this.ws.on('message', (data) => {
36
+ try {
37
+ const message = JSON.parse(data.toString());
38
+ this.handleMessage(message);
39
+ }
40
+ catch (error) {
41
+ this.emit('error', new Error(`Failed to parse message: ${error}`));
42
+ }
43
+ });
44
+ this.ws.on('error', (error) => {
45
+ clearTimeout(connectTimeout);
46
+ this.emit('error', error);
47
+ reject(error);
48
+ });
49
+ this.ws.on('close', () => {
50
+ clearTimeout(connectTimeout);
51
+ this.emit('disconnected');
52
+ this.ws = null;
53
+ });
54
+ }
55
+ catch (error) {
56
+ reject(error);
57
+ }
58
+ });
59
+ }
60
+ handleMessage(message) {
61
+ const { type, data } = message;
62
+ switch (type) {
63
+ case 'status':
64
+ this.emit('status', data);
65
+ break;
66
+ case 'progress':
67
+ this.emit('progress', data);
68
+ break;
69
+ case 'executing':
70
+ this.emit('executing', data);
71
+ break;
72
+ case 'executed':
73
+ this.emit('executed', data);
74
+ break;
75
+ case 'execution_start':
76
+ this.emit('execution_start', data);
77
+ break;
78
+ case 'execution_cached':
79
+ this.emit('execution_cached', data);
80
+ break;
81
+ case 'execution_success':
82
+ this.emit('execution_success', data);
83
+ break;
84
+ case 'execution_error':
85
+ this.emit('execution_error', data);
86
+ break;
87
+ default:
88
+ this.emit('message', message);
89
+ }
90
+ }
91
+ disconnect() {
92
+ if (this.ws) {
93
+ this.ws.close();
94
+ this.ws = null;
95
+ }
96
+ }
97
+ isConnected() {
98
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
99
+ }
100
+ getClientId() {
101
+ return this.clientId;
102
+ }
103
+ }
104
+ /**
105
+ * 监听特定 prompt_id 的执行进度
106
+ */
107
+ export async function monitorProgress(promptId, onProgress, onComplete) {
108
+ const ws = new ComfyWebSocket();
109
+ return new Promise(async (resolve, reject) => {
110
+ let currentStep = 0;
111
+ let totalSteps = 0;
112
+ let hasStarted = false;
113
+ let hasCompleted = false;
114
+ let timeout;
115
+ let completionCheckTimeout = null;
116
+ // 设置所有事件监听器
117
+ ws.on('connected', () => {
118
+ onProgress?.(0, 100, 'WebSocket 已连接,等待执行...');
119
+ });
120
+ ws.on('status', (data) => {
121
+ // 接收到初始状态消息
122
+ if (!hasStarted) {
123
+ onProgress?.(0, 100, '等待任务开始...');
124
+ }
125
+ // 检查队列是否为空且任务已完成
126
+ if (hasStarted && !hasCompleted && data.status?.exec_info?.queue_remaining === 0) {
127
+ if (currentStep === totalSteps && totalSteps > 0) {
128
+ hasCompleted = true;
129
+ clearTimeout(timeout);
130
+ if (completionCheckTimeout)
131
+ clearTimeout(completionCheckTimeout);
132
+ ws.disconnect();
133
+ onComplete?.();
134
+ resolve();
135
+ }
136
+ }
137
+ });
138
+ ws.on('progress', (data) => {
139
+ // 只处理我们的 prompt_id 的消息
140
+ if (data.prompt_id !== promptId) {
141
+ return;
142
+ }
143
+ hasStarted = true;
144
+ if (data.max > 0) {
145
+ currentStep = data.value;
146
+ totalSteps = data.max;
147
+ const percent = Math.round((currentStep / totalSteps) * 100);
148
+ onProgress?.(currentStep, totalSteps, `处理中: ${percent}%`);
149
+ // 如果达到最大步数,设置一个延迟检查
150
+ if (currentStep === totalSteps) {
151
+ if (completionCheckTimeout)
152
+ clearTimeout(completionCheckTimeout);
153
+ completionCheckTimeout = setTimeout(() => {
154
+ if (!hasCompleted) {
155
+ hasCompleted = true;
156
+ clearTimeout(timeout);
157
+ ws.disconnect();
158
+ onComplete?.();
159
+ resolve();
160
+ }
161
+ }, 2000); // 等待2秒确认完成
162
+ }
163
+ }
164
+ });
165
+ ws.on('executing', (data) => {
166
+ // 只处理我们的 prompt_id 的消息
167
+ if (data.prompt_id !== promptId) {
168
+ return;
169
+ }
170
+ hasStarted = true;
171
+ if (data.node === null) {
172
+ // 执行完成
173
+ hasCompleted = true;
174
+ clearTimeout(timeout);
175
+ if (completionCheckTimeout)
176
+ clearTimeout(completionCheckTimeout);
177
+ ws.disconnect();
178
+ onComplete?.();
179
+ resolve();
180
+ }
181
+ });
182
+ ws.on('execution_error', (data) => {
183
+ if (data.prompt_id === promptId) {
184
+ clearTimeout(timeout);
185
+ if (completionCheckTimeout)
186
+ clearTimeout(completionCheckTimeout);
187
+ ws.disconnect();
188
+ reject(new Error(`执行失败: ${JSON.stringify(data)}`));
189
+ }
190
+ });
191
+ ws.on('error', (error) => {
192
+ clearTimeout(timeout);
193
+ if (completionCheckTimeout)
194
+ clearTimeout(completionCheckTimeout);
195
+ ws.disconnect();
196
+ reject(error);
197
+ });
198
+ // 超时保护
199
+ timeout = setTimeout(() => {
200
+ if (ws.isConnected()) {
201
+ if (completionCheckTimeout)
202
+ clearTimeout(completionCheckTimeout);
203
+ ws.disconnect();
204
+ reject(new Error('执行超时'));
205
+ }
206
+ }, 5 * 60 * 1000); // 5分钟超时
207
+ // 连接 WebSocket
208
+ try {
209
+ await ws.connect();
210
+ }
211
+ catch (error) {
212
+ clearTimeout(timeout);
213
+ reject(error);
214
+ }
215
+ });
216
+ }
217
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/comfy-cli",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "A CLI tool for ComfyUI designed for LLM interactions",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/test-ws.cjs ADDED
@@ -0,0 +1,35 @@
1
+ const WebSocket = require('ws');
2
+
3
+ const clientId = `test-${Date.now()}`;
4
+ const wsUrl = `ws://dev.optima.chat:8188/ws?clientId=${clientId}`;
5
+
6
+ console.log('Connecting to:', wsUrl);
7
+
8
+ const ws = new WebSocket(wsUrl);
9
+
10
+ let connected = false;
11
+
12
+ ws.on('open', () => {
13
+ connected = true;
14
+ console.log('✓ Connected!');
15
+ });
16
+
17
+ ws.on('message', (data) => {
18
+ console.log('Message:', data.toString());
19
+ });
20
+
21
+ ws.on('error', (error) => {
22
+ console.error('✗ Error:', error.message);
23
+ });
24
+
25
+ ws.on('close', () => {
26
+ console.log('Closed');
27
+ });
28
+
29
+ setTimeout(() => {
30
+ if (!connected) {
31
+ console.error('✗ Connection failed or timeout');
32
+ }
33
+ ws.close();
34
+ process.exit(0);
35
+ }, 5000);