comfyui-mcp 0.48.21 → 0.48.22
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/README.md +2 -2
- package/dist/comfyui/client.js +46 -6
- package/dist/comfyui/client.js.map +1 -1
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -1
- package/dist/orchestrator/error-text.js +29 -1
- package/dist/orchestrator/error-text.js.map +1 -1
- package/dist/orchestrator/error-text.test.js +28 -0
- package/dist/orchestrator/error-text.test.js.map +1 -1
- package/dist/orchestrator/index.js +151 -50
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/panel-agent.js +21 -4
- package/dist/orchestrator/panel-agent.js.map +1 -1
- package/dist/orchestrator/panel-tools.js +1098 -168
- package/dist/orchestrator/panel-tools.js.map +1 -1
- package/dist/orchestrator/ready-banner.js +70 -0
- package/dist/orchestrator/ready-banner.js.map +1 -0
- package/dist/services/api-nodes.js +5 -7
- package/dist/services/api-nodes.js.map +1 -1
- package/dist/services/download-cache.js +126 -18
- package/dist/services/download-cache.js.map +1 -1
- package/dist/services/download-jobs.js +463 -14
- package/dist/services/download-jobs.js.map +1 -1
- package/dist/services/download-progress.js +247 -2
- package/dist/services/download-progress.js.map +1 -1
- package/dist/services/env-capabilities.js +80 -9
- package/dist/services/env-capabilities.js.map +1 -1
- package/dist/services/generate-audio.js +16 -0
- package/dist/services/generate-audio.js.map +1 -1
- package/dist/services/local-models-fallback.js +7 -3
- package/dist/services/local-models-fallback.js.map +1 -1
- package/dist/services/manifest.js +180 -65
- package/dist/services/manifest.js.map +1 -1
- package/dist/services/model-resolver.js +267 -11
- package/dist/services/model-resolver.js.map +1 -1
- package/dist/services/node-management.js +38 -27
- package/dist/services/node-management.js.map +1 -1
- package/dist/services/output-dir.js +33 -3
- package/dist/services/output-dir.js.map +1 -1
- package/dist/services/panel-secrets.js +19 -7
- package/dist/services/panel-secrets.js.map +1 -1
- package/dist/services/queue-monitor.js +45 -2
- package/dist/services/queue-monitor.js.map +1 -1
- package/dist/services/queue-monitor.stall.test.js +78 -0
- package/dist/services/queue-monitor.stall.test.js.map +1 -0
- package/dist/services/secure-bridge.js +84 -0
- package/dist/services/secure-bridge.js.map +1 -1
- package/dist/services/storage/azure-blob.js +8 -3
- package/dist/services/storage/azure-blob.js.map +1 -1
- package/dist/services/storage/index.js +3 -3
- package/dist/services/storage/index.js.map +1 -1
- package/dist/services/storage/s3.js +9 -3
- package/dist/services/storage/s3.js.map +1 -1
- package/dist/services/ui-bridge.js +294 -24
- package/dist/services/ui-bridge.js.map +1 -1
- package/dist/services/workflow-converter.js +767 -72
- package/dist/services/workflow-converter.js.map +1 -1
- package/dist/services/workflow-lock.js +127 -27
- package/dist/services/workflow-lock.js.map +1 -1
- package/dist/services/workspace-env.js +48 -0
- package/dist/services/workspace-env.js.map +1 -1
- package/dist/tools/generate-audio.js +44 -0
- package/dist/tools/generate-audio.js.map +1 -1
- package/dist/tools/model-extras.js +24 -4
- package/dist/tools/model-extras.js.map +1 -1
- package/dist/tools/model-management.js +124 -14
- package/dist/tools/model-management.js.map +1 -1
- package/dist/tools/report-issue.js +220 -66
- package/dist/tools/report-issue.js.map +1 -1
- package/dist/tools/report-issue.test.js +223 -83
- package/dist/tools/report-issue.test.js.map +1 -1
- package/dist/tools/skills-access.js +7 -2
- package/dist/tools/skills-access.js.map +1 -1
- package/dist/tools/template-schema.js +5 -5
- package/dist/tools/template-schema.js.map +1 -1
- package/dist/tools/workflow-compose.js +18 -3
- package/dist/tools/workflow-compose.js.map +1 -1
- package/package.json +1 -1
- package/packs/anima/install-runpod.sh +0 -1
- package/packs/anima/install-windows.bat +0 -1
- package/packs/anima/manifest.yaml +0 -1
- package/packs/anima-img2img/install-runpod.sh +0 -1
- package/packs/anima-img2img/install-windows.bat +0 -1
- package/packs/anima-img2img/manifest.yaml +0 -1
- package/packs/anima-inpaint/install-runpod.sh +0 -1
- package/packs/anima-inpaint/install-windows.bat +0 -1
- package/packs/anima-inpaint/manifest.yaml +0 -1
- package/packs/anima-txt2img/install-runpod.sh +0 -1
- package/packs/anima-txt2img/install-windows.bat +0 -1
- package/packs/anima-txt2img/manifest.yaml +0 -1
- package/packs/artokun-flow/install-runpod.sh +0 -1
- package/packs/artokun-flow/install-windows.bat +0 -1
- package/packs/artokun-flow/manifest.yaml +0 -1
- package/packs/ernie/install-runpod.sh +0 -1
- package/packs/ernie/install-windows.bat +0 -1
- package/packs/ernie/manifest.yaml +0 -1
- package/packs/ernie-combo/install-runpod.sh +0 -1
- package/packs/ernie-combo/install-windows.bat +0 -1
- package/packs/ernie-combo/manifest.yaml +0 -1
- package/packs/ernie-img2img/install-runpod.sh +0 -1
- package/packs/ernie-img2img/install-windows.bat +0 -1
- package/packs/ernie-img2img/manifest.yaml +0 -1
- package/packs/ernie-txt2img/install-runpod.sh +0 -1
- package/packs/ernie-txt2img/install-windows.bat +0 -1
- package/packs/ernie-txt2img/manifest.yaml +0 -1
- package/packs/ideogram/install-runpod.sh +0 -1
- package/packs/ideogram/install-windows.bat +0 -1
- package/packs/ideogram/manifest.yaml +0 -1
- package/packs/ideogram-img2img/install-runpod.sh +0 -1
- package/packs/ideogram-img2img/install-windows.bat +0 -1
- package/packs/ideogram-img2img/manifest.yaml +0 -1
- package/packs/ideogram-txt2img/install-runpod.sh +0 -1
- package/packs/ideogram-txt2img/install-windows.bat +0 -1
- package/packs/ideogram-txt2img/manifest.yaml +0 -1
- package/packs/ltx-2.3/install-runpod.sh +0 -1
- package/packs/ltx-2.3/install-windows.bat +0 -1
- package/packs/ltx-2.3/manifest.yaml +0 -1
- package/packs/ltx-2.3-extender/install-runpod.sh +0 -1
- package/packs/ltx-2.3-extender/install-windows.bat +0 -1
- package/packs/ltx-2.3-extender/manifest.yaml +0 -1
- package/packs/ltx-2.3-extender-no-audio/install-runpod.sh +0 -1
- package/packs/ltx-2.3-extender-no-audio/install-windows.bat +0 -1
- package/packs/ltx-2.3-extender-no-audio/manifest.yaml +0 -1
- package/packs/ltx-2.3-flf/install-runpod.sh +0 -1
- package/packs/ltx-2.3-flf/install-windows.bat +0 -1
- package/packs/ltx-2.3-flf/manifest.yaml +0 -1
- package/packs/ltx-2.3-img2vid/install-runpod.sh +0 -1
- package/packs/ltx-2.3-img2vid/install-windows.bat +0 -1
- package/packs/ltx-2.3-img2vid/manifest.yaml +3 -4
- package/packs/ltx-2.3-txt2vid/install-runpod.sh +0 -1
- package/packs/ltx-2.3-txt2vid/install-windows.bat +0 -1
- package/packs/ltx-2.3-txt2vid/manifest.yaml +3 -4
- package/packs/ltx-2.3-xy-plot/install-runpod.sh +0 -1
- package/packs/ltx-2.3-xy-plot/install-windows.bat +0 -1
- package/packs/ltx-2.3-xy-plot/manifest.yaml +0 -1
- package/packs/ltx23-distill-3stage/install-runpod.sh +0 -1
- package/packs/ltx23-distill-3stage/install-windows.bat +0 -1
- package/packs/ltx23-distill-3stage/manifest.yaml +0 -1
- package/packs/qwen-image/install-runpod.sh +0 -1
- package/packs/qwen-image/install-windows.bat +0 -1
- package/packs/qwen-image/manifest.yaml +0 -1
- package/packs/qwen-image-edit/install-runpod.sh +0 -1
- package/packs/qwen-image-edit/install-windows.bat +0 -1
- package/packs/qwen-image-edit/manifest.yaml +0 -1
- package/packs/qwen-image-edit-edit/install-runpod.sh +0 -1
- package/packs/qwen-image-edit-edit/install-windows.bat +0 -1
- package/packs/qwen-image-edit-edit/manifest.yaml +0 -1
- package/packs/wan-animate/install-runpod.sh +0 -1
- package/packs/wan-animate/install-windows.bat +0 -1
- package/packs/wan-animate/manifest.yaml +0 -1
- package/packs/wan-animate-character/install-runpod.sh +0 -1
- package/packs/wan-animate-character/install-windows.bat +0 -1
- package/packs/wan-animate-character/manifest.yaml +0 -1
- package/packs/wan-animate-ofm/install-runpod.sh +0 -1
- package/packs/wan-animate-ofm/install-windows.bat +0 -1
- package/packs/wan-animate-ofm/manifest.yaml +0 -1
- package/packs/wan-longer-videos/install-runpod.sh +0 -1
- package/packs/wan-longer-videos/install-windows.bat +0 -1
- package/packs/wan-longer-videos/manifest.yaml +0 -1
- package/packs/wan-longer-videos-i2v/install-runpod.sh +0 -1
- package/packs/wan-longer-videos-i2v/install-windows.bat +0 -1
- package/packs/wan-longer-videos-i2v/manifest.yaml +0 -1
- package/packs/wan-longer-videos-i2v-96gb/install-runpod.sh +0 -1
- package/packs/wan-longer-videos-i2v-96gb/install-windows.bat +0 -1
- package/packs/wan-longer-videos-i2v-96gb/manifest.yaml +0 -1
- package/packs/wan-longer-videos-t2v/install-runpod.sh +0 -1
- package/packs/wan-longer-videos-t2v/install-windows.bat +0 -1
- package/packs/wan-longer-videos-t2v/manifest.yaml +0 -1
- package/packs/wan-longer-videos-t2v-96gb/install-runpod.sh +0 -1
- package/packs/wan-longer-videos-t2v-96gb/install-windows.bat +0 -1
- package/packs/wan-longer-videos-t2v-96gb/manifest.yaml +0 -1
- package/packs/wan-longer-videos-v2v/install-runpod.sh +0 -1
- package/packs/wan-longer-videos-v2v/install-windows.bat +0 -1
- package/packs/wan-longer-videos-v2v/manifest.yaml +0 -1
- package/packs/wan-longer-videos-v2v-96gb/install-runpod.sh +0 -1
- package/packs/wan-longer-videos-v2v-96gb/install-windows.bat +0 -1
- package/packs/wan-longer-videos-v2v-96gb/manifest.yaml +0 -1
- package/packs/wan-multitalk/install-runpod.sh +0 -1
- package/packs/wan-multitalk/install-windows.bat +0 -1
- package/packs/wan-multitalk/manifest.yaml +0 -1
- package/packs/wan-pusa-extend/install-runpod.sh +0 -1
- package/packs/wan-pusa-extend/install-windows.bat +0 -1
- package/packs/wan-pusa-extend/manifest.yaml +0 -1
- package/packs/wan-transparent/install-runpod.sh +0 -1
- package/packs/wan-transparent/install-windows.bat +0 -1
- package/packs/wan-transparent/manifest.yaml +0 -1
- package/packs/wan-transparent-img2vid/install-runpod.sh +0 -1
- package/packs/wan-transparent-img2vid/install-windows.bat +0 -1
- package/packs/wan-transparent-img2vid/manifest.yaml +0 -1
- package/packs/wan-transparent-img2vid-96gb/install-runpod.sh +0 -1
- package/packs/wan-transparent-img2vid-96gb/install-windows.bat +0 -1
- package/packs/wan-transparent-img2vid-96gb/manifest.yaml +0 -1
- package/packs/z-image-base/install-runpod.sh +0 -1
- package/packs/z-image-base/install-windows.bat +0 -1
- package/packs/z-image-base/manifest.yaml +0 -1
- package/packs/z-image-base-combo/install-runpod.sh +0 -1
- package/packs/z-image-base-combo/install-windows.bat +0 -1
- package/packs/z-image-base-combo/manifest.yaml +0 -1
- package/packs/z-image-base-controlnet/install-runpod.sh +0 -1
- package/packs/z-image-base-controlnet/install-windows.bat +0 -1
- package/packs/z-image-base-controlnet/manifest.yaml +0 -1
- package/packs/z-image-base-img2img/install-runpod.sh +0 -1
- package/packs/z-image-base-img2img/install-windows.bat +0 -1
- package/packs/z-image-base-img2img/manifest.yaml +0 -1
- package/packs/z-image-base-inpaint/install-runpod.sh +0 -1
- package/packs/z-image-base-inpaint/install-windows.bat +0 -1
- package/packs/z-image-base-inpaint/manifest.yaml +0 -1
- package/packs/z-image-base-txt2img/install-runpod.sh +0 -1
- package/packs/z-image-base-txt2img/install-windows.bat +0 -1
- package/packs/z-image-base-txt2img/manifest.yaml +0 -1
- package/packs/z-image-turbo/install-runpod.sh +0 -1
- package/packs/z-image-turbo/install-windows.bat +0 -1
- package/packs/z-image-turbo/manifest.yaml +0 -1
- package/packs/z-image-turbo-combo/install-runpod.sh +0 -1
- package/packs/z-image-turbo-combo/install-windows.bat +0 -1
- package/packs/z-image-turbo-combo/manifest.yaml +0 -1
- package/packs/z-image-turbo-controlnet/install-runpod.sh +0 -1
- package/packs/z-image-turbo-controlnet/install-windows.bat +0 -1
- package/packs/z-image-turbo-controlnet/manifest.yaml +0 -1
- package/packs/z-image-turbo-detail-daemon/install-runpod.sh +0 -1
- package/packs/z-image-turbo-detail-daemon/install-windows.bat +0 -1
- package/packs/z-image-turbo-detail-daemon/manifest.yaml +0 -1
- package/packs/z-image-turbo-img2img/install-runpod.sh +0 -1
- package/packs/z-image-turbo-img2img/install-windows.bat +0 -1
- package/packs/z-image-turbo-img2img/manifest.yaml +0 -1
- package/packs/z-image-turbo-inpainting/install-runpod.sh +0 -1
- package/packs/z-image-turbo-inpainting/install-windows.bat +0 -1
- package/packs/z-image-turbo-inpainting/manifest.yaml +0 -1
- package/packs/z-image-turbo-txt2img/install-runpod.sh +0 -1
- package/packs/z-image-turbo-txt2img/install-windows.bat +0 -1
- package/packs/z-image-turbo-txt2img/manifest.yaml +0 -1
- package/packs/z-image-xy-plot/install-runpod.sh +0 -1
- package/packs/z-image-xy-plot/install-windows.bat +0 -1
- package/packs/z-image-xy-plot/manifest.yaml +0 -1
- package/scripts/test-packs.sh +8 -3
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readdir, stat, mkdir, readFile, lstat, realpath } from "node:fs/promises";
|
|
4
|
+
import { dirname, join, basename, resolve, relative, sep, isAbsolute } from "node:path";
|
|
4
5
|
import { config, isRemoteMode } from "../config.js";
|
|
5
6
|
import { getClient, getSystemStats } from "../comfyui/client.js";
|
|
6
7
|
import { getExtraModelRoots } from "./extra-paths.js";
|
|
7
|
-
import { resolveEffectiveComfyUIBase } from "./workspace-env.js";
|
|
8
|
+
import { resolveEffectiveComfyUIBase, liveRootFromArgv } from "./workspace-env.js";
|
|
8
9
|
import { installModelViaManager } from "./node-management.js";
|
|
9
10
|
import { ModelError, ValidationError } from "../utils/errors.js";
|
|
10
11
|
import { logger } from "../utils/logger.js";
|
|
@@ -133,6 +134,114 @@ export async function searchHuggingFaceModels(query, options = {}) {
|
|
|
133
134
|
lastModified: String(m.lastModified ?? ""),
|
|
134
135
|
}));
|
|
135
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Discover the GGUF model-folder categories a running ComfyUI has registered, by
|
|
139
|
+
* asking `GET /models` (which returns every key in `folder_names_and_paths`) and
|
|
140
|
+
* keeping the `*_gguf` ones our static MODEL_SUBDIRS list doesn't already cover.
|
|
141
|
+
*
|
|
142
|
+
* This is what fixes #526: core `/models/<dir>` only lists extensions in
|
|
143
|
+
* `supported_pt_extensions` (no `.gguf`), so a static scan of MODEL_SUBDIRS misses
|
|
144
|
+
* every GGUF model. But those files are not hidden — ComfyUI-GGUF (and every
|
|
145
|
+
* derivative) registers its own categories (`unet_gguf`, `clip_gguf`) with a
|
|
146
|
+
* `.gguf` filter, and ComfyUI serves them over REST like any other category.
|
|
147
|
+
* Listing them surfaces GGUF models authoritatively: it reflects the LIVE server,
|
|
148
|
+
* honours extra_model_paths, works remotely, and needs no filesystem scan or folder
|
|
149
|
+
* guessing — each model is typed by the category ComfyUI itself registered.
|
|
150
|
+
*
|
|
151
|
+
* Why only `*_gguf` and not "every non-core category `/models` reports": `/models`
|
|
152
|
+
* exposes category NAMES but not their extension sets, so there is no safe way to
|
|
153
|
+
* tell a weight-bearing custom category from an extension-BLIND one (ComfyUI's own
|
|
154
|
+
* `custom_nodes` / `datasets` register with an empty set and would list every file
|
|
155
|
+
* under them — source code, arbitrary data — flooding the output). The `_gguf`
|
|
156
|
+
* suffix is a reliable, self-describing signal for GGUF model folders (the subject
|
|
157
|
+
* of #526) and cannot flood. Surfacing other loader categories (e.g. TensorRT's
|
|
158
|
+
* `.engine`) is a separate enhancement that needs per-category extension knowledge.
|
|
159
|
+
*
|
|
160
|
+
* Best-effort: returns [] when `/models` is unavailable (older server / error), in
|
|
161
|
+
* which case the caller still lists the core categories and, offline, the filesystem
|
|
162
|
+
* fallback still finds `.gguf` files on disk under their real folders.
|
|
163
|
+
*/
|
|
164
|
+
/** A `*_gguf` registry category (ComfyUI-GGUF's `unet_gguf`/`clip_gguf`, …). */
|
|
165
|
+
function isGgufCategory(dir) {
|
|
166
|
+
return /_gguf$/i.test(dir);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The physical folders a KNOWN `*_gguf` view is backed by — used ONLY to recognise when
|
|
170
|
+
* the SAME file is surfaced both via the view and via one of the real folders it
|
|
171
|
+
* aliases. ComfyUI-GGUF registers `unet_gguf` over the `diffusion_models` folders
|
|
172
|
+
* (`unet/` + `diffusion_models/`) and `clip_gguf` over the `text_encoders` folders
|
|
173
|
+
* (`text_encoders/` + `clip/`); that is the complete set for standard ComfyUI-GGUF.
|
|
174
|
+
* Never used for a model's reported `type`.
|
|
175
|
+
*/
|
|
176
|
+
const GGUF_BACKING_DIRS = {
|
|
177
|
+
unet_gguf: ["unet", "diffusion_models"],
|
|
178
|
+
clip_gguf: ["text_encoders", "clip"],
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* The real folder(s) a scanned category resolves to, for de-dup identity. A KNOWN
|
|
182
|
+
* `*_gguf` view resolves to the physical folders it aliases (so the same file surfaced
|
|
183
|
+
* via the view and via its backing core folder collapses to one). EVERY other category
|
|
184
|
+
* — a core category, OR an UNKNOWN/unmapped `*_gguf` — resolves to ITSELF. We must NOT
|
|
185
|
+
* assume an unknown `<x>_gguf` aliases a same-named `<x>` folder: a genuinely distinct
|
|
186
|
+
* `<x>_gguf/model.gguf` would then be wrongly collapsed against a real `<x>/model.gguf`
|
|
187
|
+
* and dropped. Lookup is case-insensitive.
|
|
188
|
+
*
|
|
189
|
+
* This intentionally targets only the duplication THIS fix can introduce. The
|
|
190
|
+
* pre-existing overlap between ComfyUI's own back-compat categories (e.g.
|
|
191
|
+
* `diffusion_models` also listing `unet/`) is left exactly as on main: its provenance
|
|
192
|
+
* is erased over REST, so collapsing it would risk discarding distinct same-name files.
|
|
193
|
+
*/
|
|
194
|
+
function identityFoldersFor(category) {
|
|
195
|
+
const lower = category.toLowerCase();
|
|
196
|
+
return GGUF_BACKING_DIRS[lower] ?? [lower];
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Identity keys for a file within a scanned category — `<backing-folder>/<relname>`.
|
|
200
|
+
* The RELATIVE name (which may include subfolders) is used, not just the basename: a
|
|
201
|
+
* `*_gguf` view and its backing core folder report the SAME relative path for the same
|
|
202
|
+
* file, so keying on it collapses that alias duplicate while keeping genuinely distinct
|
|
203
|
+
* files (same basename in a different subfolder, or in a different real folder)
|
|
204
|
+
* separate. The folder segment is lowercased (folder/category names are effectively
|
|
205
|
+
* case-insensitive); the relative NAME is used verbatim — its case and path separators
|
|
206
|
+
* matter (`Model.gguf` ≠ `model.gguf`, and a literal `a\b` ≠ nested `a/b` on POSIX).
|
|
207
|
+
* That's safe because a single call de-dups within ONE source (all HTTP or all
|
|
208
|
+
* filesystem), so the same file always arrives with identical spelling. `add` returns
|
|
209
|
+
* false (recording nothing) when the file is already present under any of its backing
|
|
210
|
+
* folders, so callers skip the duplicate; otherwise it records every key and returns
|
|
211
|
+
* true.
|
|
212
|
+
*/
|
|
213
|
+
function makeModelDeduper() {
|
|
214
|
+
const seen = new Set();
|
|
215
|
+
return {
|
|
216
|
+
add(category, name) {
|
|
217
|
+
const keys = identityFoldersFor(category).map((folder) => `${folder}/${name}`);
|
|
218
|
+
if (keys.some((k) => seen.has(k)))
|
|
219
|
+
return false;
|
|
220
|
+
for (const k of keys)
|
|
221
|
+
seen.add(k);
|
|
222
|
+
return true;
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
async function discoverGgufCategories(client) {
|
|
227
|
+
try {
|
|
228
|
+
const res = await client.fetchApi("/models");
|
|
229
|
+
if (!res.ok)
|
|
230
|
+
return [];
|
|
231
|
+
const json = (await res.json());
|
|
232
|
+
if (!Array.isArray(json))
|
|
233
|
+
return [];
|
|
234
|
+
const core = new Set(MODEL_SUBDIRS);
|
|
235
|
+
// Keep `*_gguf` categories only, deduped, minus any the core scan already covers.
|
|
236
|
+
return [
|
|
237
|
+
...new Set(json.filter((c) => typeof c === "string" && /_gguf$/i.test(c) && !core.has(c))),
|
|
238
|
+
];
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
logger.debug("HTTP /models category discovery failed", { err });
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
136
245
|
export async function listLocalModels(modelType) {
|
|
137
246
|
const dirsToScan = modelType ? [modelType] : [...MODEL_SUBDIRS];
|
|
138
247
|
const results = [];
|
|
@@ -145,6 +254,19 @@ export async function listLocalModels(modelType) {
|
|
|
145
254
|
let httpReturnedAny = false;
|
|
146
255
|
try {
|
|
147
256
|
const client = getClient(); // throws CLOUD_UNSUPPORTED in cloud mode
|
|
257
|
+
// For an unfiltered listing, also scan ComfyUI-GGUF's registered `*_gguf`
|
|
258
|
+
// categories (`unet_gguf`/`clip_gguf`, …) holding the `.gguf` weights that core
|
|
259
|
+
// `/models/<dir>` omits. A filtered call already targets its exact category via
|
|
260
|
+
// dirsToScan, so it needs no discovery. See #526.
|
|
261
|
+
if (!modelType) {
|
|
262
|
+
for (const cat of await discoverGgufCategories(client))
|
|
263
|
+
dirsToScan.push(cat);
|
|
264
|
+
}
|
|
265
|
+
// A `*_gguf` view aliases real folders, so the same file can be reported both
|
|
266
|
+
// via the view and via a core category (e.g. a custom node that re-registers
|
|
267
|
+
// `diffusion_models` to also admit `.gguf`). De-dup by resolved-folder identity
|
|
268
|
+
// so it surfaces once, without collapsing genuinely distinct same-name files.
|
|
269
|
+
const dedup = makeModelDeduper();
|
|
148
270
|
for (const dir of dirsToScan) {
|
|
149
271
|
try {
|
|
150
272
|
const res = await client.fetchApi(`/models/${dir}`);
|
|
@@ -156,6 +278,15 @@ export async function listLocalModels(modelType) {
|
|
|
156
278
|
for (const name of files) {
|
|
157
279
|
if (typeof name !== "string")
|
|
158
280
|
continue;
|
|
281
|
+
// Hardening for any `*_gguf` category (discovered OR explicitly requested):
|
|
282
|
+
// emit ONLY `.gguf` files. A well-behaved category registers a `{".gguf"}`
|
|
283
|
+
// filter, but a malformed one could register an EMPTY extension set (which
|
|
284
|
+
// lists every file) over a shared dir — without this guard that would flood
|
|
285
|
+
// the output. Core categories never contain `.gguf`, so this stays additive.
|
|
286
|
+
if (isGgufCategory(dir) && !name.toLowerCase().endsWith(".gguf"))
|
|
287
|
+
continue;
|
|
288
|
+
if (!dedup.add(dir, name))
|
|
289
|
+
continue; // same file already surfaced elsewhere
|
|
159
290
|
httpReturnedAny = true;
|
|
160
291
|
results.push({
|
|
161
292
|
name,
|
|
@@ -185,6 +316,7 @@ export async function listLocalModels(modelType) {
|
|
|
185
316
|
if (!config.comfyuiPath)
|
|
186
317
|
return results;
|
|
187
318
|
const modelsRoot = join(config.comfyuiPath, "models");
|
|
319
|
+
const dedup = makeModelDeduper();
|
|
188
320
|
for (const dir of dirsToScan) {
|
|
189
321
|
const dirPath = join(modelsRoot, dir);
|
|
190
322
|
let entries;
|
|
@@ -195,11 +327,17 @@ export async function listLocalModels(modelType) {
|
|
|
195
327
|
continue;
|
|
196
328
|
}
|
|
197
329
|
for (const entry of entries) {
|
|
330
|
+
// Same `.gguf`-only guard as the HTTP path for `*_gguf` categories (e.g. an
|
|
331
|
+
// explicit `listLocalModels("unet_gguf")`): never list non-gguf files here.
|
|
332
|
+
if (isGgufCategory(dir) && !entry.toLowerCase().endsWith(".gguf"))
|
|
333
|
+
continue;
|
|
198
334
|
const filePath = join(dirPath, entry);
|
|
199
335
|
try {
|
|
200
336
|
const info = await stat(filePath);
|
|
201
337
|
if (!info.isFile())
|
|
202
338
|
continue;
|
|
339
|
+
if (!dedup.add(dir, entry))
|
|
340
|
+
continue; // same file already surfaced elsewhere
|
|
203
341
|
results.push({
|
|
204
342
|
name: entry,
|
|
205
343
|
path: filePath,
|
|
@@ -334,8 +472,60 @@ export async function resolveModelSubfolderPreferServer(targetSubfolder) {
|
|
|
334
472
|
if (targetDir !== modelsRoot && !targetDir.startsWith(modelsRoot + sep)) {
|
|
335
473
|
throw new ModelError(`Refusing to write outside the models directory: ${raw}`);
|
|
336
474
|
}
|
|
475
|
+
// Path-string containment (above) is not enough: an EXISTING symlink somewhere
|
|
476
|
+
// between modelsRoot and targetDir could redirect the real write OUTSIDE the
|
|
477
|
+
// models dir. Because THIS resolver is the single canonical write-target for
|
|
478
|
+
// every local download (startDownloadJob keying AND downloadModel's write), the
|
|
479
|
+
// guard belongs here — co-located with the resolution the write actually uses —
|
|
480
|
+
// so it can never diverge from a caller's separate pre-validation (e.g.
|
|
481
|
+
// apply_manifest resolving the root a second time; #490 codex review).
|
|
482
|
+
await assertNoEscapingSymlinkAncestor(modelsRoot, targetDir, raw);
|
|
337
483
|
return targetDir;
|
|
338
484
|
}
|
|
485
|
+
/**
|
|
486
|
+
* Reject when any EXISTING directory STRICTLY BETWEEN `root` and `target` (a
|
|
487
|
+
* descendant of root, not root itself) is a symlink whose real location escapes
|
|
488
|
+
* root. The models root ITSELF is intentionally NOT checked: a ComfyUI install
|
|
489
|
+
* may legitimately symlink/junction its whole models dir onto another drive, so
|
|
490
|
+
* the root canonicalizes elsewhere by design — that is allowed. Descendants are
|
|
491
|
+
* compared against the CANONICAL root (realpath of root) so a subfolder that
|
|
492
|
+
* resolves back inside the real models tree is fine, while one escaping it is
|
|
493
|
+
* rejected. Best-effort: a not-yet-created segment is fine (the download mkdirs it
|
|
494
|
+
* inside root); never throws for a missing path — only for a genuine escape.
|
|
495
|
+
*/
|
|
496
|
+
async function assertNoEscapingSymlinkAncestor(root, target, label) {
|
|
497
|
+
// Canonical root: if the models dir is itself a symlink/junction, resolve it so
|
|
498
|
+
// descendants are checked against where it REALLY lives (not the lexical path).
|
|
499
|
+
let realRoot;
|
|
500
|
+
try {
|
|
501
|
+
realRoot = resolve(await realpath(root));
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
realRoot = root; // root not yet created — lexical containment is all we can check.
|
|
505
|
+
}
|
|
506
|
+
// Walk descendants only: from target up to (but NOT including) root.
|
|
507
|
+
let cursor = target;
|
|
508
|
+
while (cursor !== root && cursor.startsWith(root + sep)) {
|
|
509
|
+
try {
|
|
510
|
+
const info = await lstat(cursor);
|
|
511
|
+
if (info.isSymbolicLink()) {
|
|
512
|
+
const real = resolve(await realpath(cursor));
|
|
513
|
+
if (real !== realRoot && !real.startsWith(realRoot + sep)) {
|
|
514
|
+
throw new ModelError(`Refusing to write outside the models directory (a symlink in the path escapes it): ${label}`);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
catch (err) {
|
|
519
|
+
if (err instanceof ModelError)
|
|
520
|
+
throw err;
|
|
521
|
+
// ENOENT / not yet created — safe; the writer will create it inside root.
|
|
522
|
+
}
|
|
523
|
+
const parent = dirname(cursor);
|
|
524
|
+
if (parent === cursor)
|
|
525
|
+
break;
|
|
526
|
+
cursor = parent;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
339
529
|
/**
|
|
340
530
|
* The SINGLE source of truth for a model download's final on-disk destination,
|
|
341
531
|
* shared by downloadModel (the writer) AND the background job registry (which
|
|
@@ -487,7 +677,10 @@ export async function resolveExistingModelFile(relativePath) {
|
|
|
487
677
|
* the same guards as the local path (no traversal, bare filename) before
|
|
488
678
|
* dispatch, then returns a human-readable descriptor of where it will land.
|
|
489
679
|
*/
|
|
490
|
-
async function downloadModelViaManagerRemote(url, targetSubfolder, filename, auth) {
|
|
680
|
+
async function downloadModelViaManagerRemote(url, targetSubfolder, filename, auth, signal) {
|
|
681
|
+
// Cancelled before we dispatched — do not hand the fetch to the remote Manager at all.
|
|
682
|
+
if (signal?.aborted)
|
|
683
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
491
684
|
const raw = (targetSubfolder ?? "").trim();
|
|
492
685
|
if (!raw) {
|
|
493
686
|
throw new ModelError("target_subfolder is required (e.g. 'loras', 'checkpoints').");
|
|
@@ -556,6 +749,12 @@ async function downloadModelViaManagerRemote(url, targetSubfolder, filename, aut
|
|
|
556
749
|
// Panel tray: watch OUR canonical category for the file to land (#143).
|
|
557
750
|
trayCategory: modelType,
|
|
558
751
|
});
|
|
752
|
+
// Cancelled while the dispatch was in flight (#515): the local job is cancelled.
|
|
753
|
+
// We CAN'T recall a Manager queue task, so the host may keep fetching — but this
|
|
754
|
+
// must NOT be reported as a completed local download. Throw so the job records
|
|
755
|
+
// "cancelled" (the tool message notes the server may still be fetching).
|
|
756
|
+
if (signal?.aborted)
|
|
757
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
559
758
|
return `${normalizedSubfolder}/${resolvedFilename} (dispatched to the remote ComfyUI via ComfyUI-Manager — download continues server-side; the file lists under /models when complete)${authWarning}`;
|
|
560
759
|
}
|
|
561
760
|
/**
|
|
@@ -588,9 +787,29 @@ export async function shouldDispatchDownloadToManager() {
|
|
|
588
787
|
return false;
|
|
589
788
|
try {
|
|
590
789
|
const stats = await getSystemStats();
|
|
591
|
-
|
|
592
|
-
//
|
|
593
|
-
|
|
790
|
+
const argv = stats.system?.argv;
|
|
791
|
+
// Reachable server: stream locally when it exposes a base/models dir we can
|
|
792
|
+
// write to (--base-directory/--models-directory) OR when we can derive its own
|
|
793
|
+
// install root from argv (its main.py path) — the SAME live-first root the
|
|
794
|
+
// downloader writes into (resolveModelsDir). Keeping this in lockstep with
|
|
795
|
+
// resolveModelsDir is what lets a panel-connected local server with no
|
|
796
|
+
// COMFYUI_PATH stream models into its live install (#463) instead of bouncing
|
|
797
|
+
// through the Manager (which then fails when Manager isn't installed). Only
|
|
798
|
+
// dispatch to the Manager when NEITHER is discoverable (#420 reconnect with an
|
|
799
|
+
// opaque/relative argv we can't resolve).
|
|
800
|
+
if (parseModelsDirFromArgv(argv))
|
|
801
|
+
return false;
|
|
802
|
+
// Derive the server's own install root from argv (its main.py). Only treat it
|
|
803
|
+
// as a LOCAL stream target when that path ACTUALLY EXISTS on this filesystem:
|
|
804
|
+
// a loopback ComfyUI inside Docker / behind an SSH port-forward reports a
|
|
805
|
+
// container-side main.py path that is NOT the host's, so writing there would
|
|
806
|
+
// create a bogus host directory instead of reaching the server. When the root
|
|
807
|
+
// isn't locally present, hand the fetch to the connected Manager (server-side
|
|
808
|
+
// write), which lands in the real install regardless.
|
|
809
|
+
const liveRoot = liveRootFromArgv(argv, stats.system?.cwd);
|
|
810
|
+
if (liveRoot && existsSync(liveRoot))
|
|
811
|
+
return false;
|
|
812
|
+
return true;
|
|
594
813
|
}
|
|
595
814
|
catch {
|
|
596
815
|
// No reachable server → nothing to dispatch to. Let the local resolver throw.
|
|
@@ -610,7 +829,26 @@ export async function downloadModel(url, targetSubfolder, filename, auth,
|
|
|
610
829
|
dispatchToManager,
|
|
611
830
|
/** Sink for the resume decision, threaded from the job so the outcome is stored
|
|
612
831
|
* on that job (#467). Omitted by direct callers (no job to report to). */
|
|
613
|
-
onResume
|
|
832
|
+
onResume,
|
|
833
|
+
/** Per-download abort signal, threaded from the job's AbortController into the
|
|
834
|
+
* fetch + stream pipeline so cancel_download aborts exactly this transfer (#515).
|
|
835
|
+
* Omitted by direct callers (no cancellation handle). */
|
|
836
|
+
signal,
|
|
837
|
+
/** Reports the ACTUAL progress-tray id (a hash of the post-auth/post-HF-rewrite
|
|
838
|
+
* request URL) back to the job, so the job's trayId matches the id the streaming
|
|
839
|
+
* and done rows are written under. Without it a query-auth or HF_ENDPOINT-rewritten
|
|
840
|
+
* download's tray row is keyed differently from the job's original-URL trayId — so
|
|
841
|
+
* download_status byte display AND cancel cleanup would target the wrong id. Called
|
|
842
|
+
* only on the LOCAL streaming path (the Manager path writes no streaming rows). */
|
|
843
|
+
onTrayId,
|
|
844
|
+
/** Fired the instant the completed, validated file is renamed into its destination
|
|
845
|
+
* (#515) — so the job can commit "done" with NO window where the file exists but the
|
|
846
|
+
* job still reads "downloading". Local paths only (the remote Manager dispatch has no
|
|
847
|
+
* local rename; the caller commits done when this function returns). */
|
|
848
|
+
onLanded) {
|
|
849
|
+
// Cancelled before we did anything — never start a transfer (local OR server-side).
|
|
850
|
+
if (signal?.aborted)
|
|
851
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
614
852
|
// Region flags (issue #127) applied at THE choke point every download path
|
|
615
853
|
// funnels through (local disk AND the remote Manager dispatch below).
|
|
616
854
|
const wasHfUrl = /^https?:\/\/huggingface\.co([/?#]|$)/i.test(url);
|
|
@@ -633,7 +871,7 @@ onResume) {
|
|
|
633
871
|
// keyed on, even if reachability/base config flipped since (#420 codex round 1).
|
|
634
872
|
const routeToManager = dispatchToManager ?? (await shouldDispatchDownloadToManager());
|
|
635
873
|
if (routeToManager) {
|
|
636
|
-
return downloadModelViaManagerRemote(url, targetSubfolder, filename, auth);
|
|
874
|
+
return downloadModelViaManagerRemote(url, targetSubfolder, filename, auth, signal);
|
|
637
875
|
}
|
|
638
876
|
// Root the destination at the LIVE server's models dir (its --base-directory),
|
|
639
877
|
// not blindly at COMFYUI_PATH/models — otherwise a Desktop install downloads
|
|
@@ -663,6 +901,9 @@ onResume) {
|
|
|
663
901
|
// retries map to the same row. Name is the friendly file name.
|
|
664
902
|
const progressId = createHash("sha256").update(request.url).digest("hex").slice(0, 16);
|
|
665
903
|
const progress = { id: progressId, name: resolvedFilename };
|
|
904
|
+
// Tell the job the id the tray rows actually use, so status display + cancel
|
|
905
|
+
// cleanup key on the SAME id even when auth/HF-endpoint rewrote the request URL.
|
|
906
|
+
onTrayId?.(progressId);
|
|
666
907
|
try {
|
|
667
908
|
await downloadWithCache({
|
|
668
909
|
url: request.url,
|
|
@@ -672,14 +913,29 @@ onResume) {
|
|
|
672
913
|
storageAuth: auth?.type === "s3" ? { s3: auth } : undefined,
|
|
673
914
|
progress,
|
|
674
915
|
onResume,
|
|
916
|
+
signal,
|
|
917
|
+
onLanded,
|
|
675
918
|
});
|
|
676
919
|
}
|
|
677
920
|
catch (err) {
|
|
678
|
-
//
|
|
679
|
-
|
|
921
|
+
// On a user cancel (#515) the transfer was aborted, not a real failure — do NOT
|
|
922
|
+
// emit an "error" row (the job reports "cancelled"). The tray row is cleared by the
|
|
923
|
+
// JOB layer (finalizeCancelled), which is registry-aware so it can't wipe a
|
|
924
|
+
// coalesced sibling's live row; clearing here would clear that shared row blindly.
|
|
925
|
+
// For a genuine error, surface a failed row, then rethrow.
|
|
926
|
+
if (!signal?.aborted) {
|
|
927
|
+
reportDownloadProgress({ ...progress, downloaded: 0, total: 0, bytes_per_sec: 0, status: "error" }, true);
|
|
928
|
+
}
|
|
680
929
|
throw err;
|
|
681
930
|
}
|
|
682
931
|
const info = await stat(targetPath);
|
|
932
|
+
// The file has MATERIALIZED to its destination and passed model-payload/size
|
|
933
|
+
// validation. We deliberately do NOT abort here on a late cancel: the file on disk is
|
|
934
|
+
// a complete, valid model, so the honest outcome is a completed download (the job
|
|
935
|
+
// reports "done"). A cancel that arrived BEFORE the file landed already made this
|
|
936
|
+
// function THROW — via the stream abort, or the cache-layer pre-materialize /
|
|
937
|
+
// pre-rename guards — so it never reaches this point. (Rolling a validated landed file
|
|
938
|
+
// back would be unsafe.) Result: file present ⟺ done; file absent ⟺ cancelled.
|
|
683
939
|
logger.info(`Download complete: ${resolvedFilename} (${(info.size / 1024 / 1024).toFixed(1)} MB)`);
|
|
684
940
|
// Ensure a terminal "done" row even on a cache hit (no streaming happened).
|
|
685
941
|
reportDownloadProgress({ ...progress, downloaded: info.size, total: info.size, bytes_per_sec: 0, status: "done" }, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/services/model-resolver.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/services/model-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { config, getComfyUIBaseUrl } from "../config.js";
|
|
|
6
6
|
import { comfyuiFetch } from "../comfyui/fetch.js";
|
|
7
7
|
import { resetObjectInfoCache } from "../comfyui/client.js";
|
|
8
8
|
import { progressEnabled, reportDownloadProgress } from "./download-progress.js";
|
|
9
|
+
import { resolveRootInterpreter } from "./workspace-env.js";
|
|
9
10
|
import { assertComfyCliOk, runComfyCliSync } from "./comfy-cli.js";
|
|
10
11
|
import { ComfyUIError, ProcessControlError, ValidationError } from "../utils/errors.js";
|
|
11
12
|
import { logger } from "../utils/logger.js";
|
|
@@ -524,10 +525,14 @@ function gitCheckoutDir(baseUrl) {
|
|
|
524
525
|
const clean = stripUrlSuffix(pathPart);
|
|
525
526
|
return basename(clean).replace(/\.git$/i, "");
|
|
526
527
|
}
|
|
527
|
-
function runGitCheckout(baseUrl, ref) {
|
|
528
|
-
|
|
528
|
+
function runGitCheckout(baseUrl, ref, basePath) {
|
|
529
|
+
// basePath is the CALL-SCOPED local ComfyUI root (apply_manifest threads an
|
|
530
|
+
// adopted saved-default/live root WITHOUT mutating global config); fall back to
|
|
531
|
+
// config.comfyuiPath. Either may be unset in remote mode → clear error.
|
|
532
|
+
const comfyuiBase = basePath ?? config.comfyuiPath;
|
|
533
|
+
if (!comfyuiBase) {
|
|
529
534
|
throw new ProcessControlError("Checking out a custom-node git ref requires a local ComfyUI install, " +
|
|
530
|
-
"but
|
|
535
|
+
"but no ComfyUI path is set.");
|
|
531
536
|
}
|
|
532
537
|
// SECURITY: this is also reached by the forced-cm-cli git path, NOT just the
|
|
533
538
|
// clone fallback, so validate here too before baseUrl / the derived dir reach
|
|
@@ -536,7 +541,7 @@ function runGitCheckout(baseUrl, ref) {
|
|
|
536
541
|
assertSafeGitUrl(baseUrl);
|
|
537
542
|
const repoName = gitCheckoutDir(baseUrl);
|
|
538
543
|
assertSafeRepoName(repoName);
|
|
539
|
-
const customNodesRoot = resolve(
|
|
544
|
+
const customNodesRoot = resolve(comfyuiBase, "custom_nodes");
|
|
540
545
|
const nodeDir = resolve(customNodesRoot, repoName);
|
|
541
546
|
const rel = relative(customNodesRoot, nodeDir);
|
|
542
547
|
if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) {
|
|
@@ -549,13 +554,13 @@ function runGitCheckout(baseUrl, ref) {
|
|
|
549
554
|
});
|
|
550
555
|
try {
|
|
551
556
|
execFileSync("git", ["-C", nodeDir, "fetch", "--all", "--tags"], {
|
|
552
|
-
cwd:
|
|
557
|
+
cwd: comfyuiBase,
|
|
553
558
|
encoding: "utf-8",
|
|
554
559
|
timeout: GIT_CLONE_TIMEOUT,
|
|
555
560
|
env: nonInteractiveGitEnv(),
|
|
556
561
|
});
|
|
557
562
|
execFileSync("git", ["-C", nodeDir, "checkout", "--detach", "--end-of-options", ref], {
|
|
558
|
-
cwd:
|
|
563
|
+
cwd: comfyuiBase,
|
|
559
564
|
encoding: "utf-8",
|
|
560
565
|
timeout: GIT_CLONE_TIMEOUT,
|
|
561
566
|
env: nonInteractiveGitEnv(),
|
|
@@ -598,18 +603,18 @@ function nodeInstalledMatches(idOrUrl, installed) {
|
|
|
598
603
|
/**
|
|
599
604
|
* Resolve the ComfyUI venv python for installing a cloned node's deps. Prefers
|
|
600
605
|
* the install's own `.venv` (Windows Scripts/ or POSIX bin/), falling back to a
|
|
601
|
-
* bare "python" on PATH.
|
|
606
|
+
* bare "python" on PATH. `basePath` is the CALL-SCOPED install root (apply_manifest
|
|
607
|
+
* threads an adopted saved-default/live root without mutating global config); when
|
|
608
|
+
* omitted it falls back to config.comfyuiPath. Passing it matters: otherwise a
|
|
609
|
+
* cloned node's requirements.txt / install.py would run under a BARE system python
|
|
610
|
+
* for an adopted workspace, corrupting/ missing the real ComfyUI environment while
|
|
611
|
+
* the node is still reported installed (#463 codex review).
|
|
602
612
|
*/
|
|
603
|
-
function resolveVenvPython() {
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
const posixPy = join(config.comfyuiPath, ".venv", "bin", "python");
|
|
609
|
-
if (existsSync(posixPy))
|
|
610
|
-
return posixPy;
|
|
611
|
-
}
|
|
612
|
-
return "python";
|
|
613
|
+
function resolveVenvPython(basePath) {
|
|
614
|
+
// Honors .venv/venv AND portable Windows layouts (python_embeded/standalone-env)
|
|
615
|
+
// via the shared resolver, so a cloned node's deps target the install's OWN
|
|
616
|
+
// interpreter rather than a bare system python (#463 codex review).
|
|
617
|
+
return resolveRootInterpreter(basePath ?? config.comfyuiPath);
|
|
613
618
|
}
|
|
614
619
|
/**
|
|
615
620
|
* Validate a git URL before it is handed to `git clone` as an argument.
|
|
@@ -653,10 +658,15 @@ export function assertSafeRepoName(repoName) {
|
|
|
653
658
|
* Dep failures DON'T fail the install (clone succeeded) — they're surfaced as
|
|
654
659
|
* warnings. A clone failure throws NodeManagementError.
|
|
655
660
|
*/
|
|
656
|
-
function cloneCustomNodeFallback(gitId, repoName, gitRef, managerStatus) {
|
|
657
|
-
|
|
661
|
+
function cloneCustomNodeFallback(gitId, repoName, gitRef, managerStatus, basePath) {
|
|
662
|
+
// basePath is the CALL-SCOPED local ComfyUI root (apply_manifest threads an
|
|
663
|
+
// adopted saved-default/live root here WITHOUT mutating global config, so a
|
|
664
|
+
// panel-connected local session with no COMFYUI_PATH can still clone an
|
|
665
|
+
// unregistered git pack); fall back to config.comfyuiPath.
|
|
666
|
+
const comfyuiBase = basePath ?? config.comfyuiPath;
|
|
667
|
+
if (!comfyuiBase) {
|
|
658
668
|
throw new ProcessControlError(`"${repoName}" is not in the ComfyUI-Manager registry and cloning it ` +
|
|
659
|
-
`requires a local ComfyUI install, but
|
|
669
|
+
`requires a local ComfyUI install, but no ComfyUI path is set ` +
|
|
660
670
|
`(running in remote --comfyui-url mode). Install it on the ComfyUI host, ` +
|
|
661
671
|
`or pass a registered pack id.`);
|
|
662
672
|
}
|
|
@@ -664,10 +674,10 @@ function cloneCustomNodeFallback(gitId, repoName, gitRef, managerStatus) {
|
|
|
664
674
|
// segment. gitId is checked for option-injection; repoName for path traversal.
|
|
665
675
|
assertSafeGitUrl(gitId);
|
|
666
676
|
assertSafeRepoName(repoName);
|
|
667
|
-
// Resolve the target and ASSERT it stays inside <
|
|
677
|
+
// Resolve the target and ASSERT it stays inside <comfyuiBase>/custom_nodes,
|
|
668
678
|
// mirroring manifest.ts's isWithinRoot containment check (defense in depth on
|
|
669
679
|
// top of the repoName validation above).
|
|
670
|
-
const customNodesRoot = resolve(
|
|
680
|
+
const customNodesRoot = resolve(comfyuiBase, "custom_nodes");
|
|
671
681
|
const nodeDir = resolve(customNodesRoot, repoName);
|
|
672
682
|
const rel = relative(customNodesRoot, nodeDir);
|
|
673
683
|
if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) {
|
|
@@ -684,7 +694,7 @@ function cloneCustomNodeFallback(gitId, repoName, gitRef, managerStatus) {
|
|
|
684
694
|
logger.info("Cloning unregistered custom node", { gitId, nodeDir, gitRef });
|
|
685
695
|
try {
|
|
686
696
|
execFileSync("git", cloneArgs, {
|
|
687
|
-
cwd:
|
|
697
|
+
cwd: comfyuiBase,
|
|
688
698
|
encoding: "utf-8",
|
|
689
699
|
timeout: GIT_CLONE_TIMEOUT,
|
|
690
700
|
env: nonInteractiveGitEnv(),
|
|
@@ -698,7 +708,7 @@ function cloneCustomNodeFallback(gitId, repoName, gitRef, managerStatus) {
|
|
|
698
708
|
});
|
|
699
709
|
}
|
|
700
710
|
if (gitRef)
|
|
701
|
-
runGitCheckout(gitId, gitRef);
|
|
711
|
+
runGitCheckout(gitId, gitRef, comfyuiBase);
|
|
702
712
|
}
|
|
703
713
|
// VERIFY the clone landed before attempting deps.
|
|
704
714
|
if (!existsSync(nodeDir)) {
|
|
@@ -708,7 +718,7 @@ function cloneCustomNodeFallback(gitId, repoName, gitRef, managerStatus) {
|
|
|
708
718
|
const requirements = join(nodeDir, "requirements.txt");
|
|
709
719
|
const installScript = join(nodeDir, "install.py");
|
|
710
720
|
if (existsSync(requirements) || existsSync(installScript)) {
|
|
711
|
-
const python = resolveVenvPython();
|
|
721
|
+
const python = resolveVenvPython(comfyuiBase);
|
|
712
722
|
if (existsSync(requirements)) {
|
|
713
723
|
try {
|
|
714
724
|
execFileSync(python, ["-m", "pip", "install", "-r", requirements], {
|
|
@@ -767,6 +777,7 @@ export function installCustomNode(opts) {
|
|
|
767
777
|
}
|
|
768
778
|
async function installCustomNodeImpl(opts) {
|
|
769
779
|
const { id, version, mode = "remote", channel = "default" } = opts;
|
|
780
|
+
const basePath = opts.comfyuiPath ?? config.comfyuiPath;
|
|
770
781
|
const parsedGit = parseGitUrl(id);
|
|
771
782
|
const gitId = parsedGit.baseUrl;
|
|
772
783
|
const gitRefCandidate = opts.ref ?? parsedGit.ref ?? version;
|
|
@@ -790,7 +801,7 @@ async function installCustomNodeImpl(opts) {
|
|
|
790
801
|
const installId = source === "git" ? gitId : id;
|
|
791
802
|
const out = runCmCli(["install", installId, "--mode", mode, "--channel", channel]);
|
|
792
803
|
if (source === "git" && gitRef) {
|
|
793
|
-
runGitCheckout(gitId, gitRef);
|
|
804
|
+
runGitCheckout(gitId, gitRef, basePath);
|
|
794
805
|
}
|
|
795
806
|
return {
|
|
796
807
|
mechanism: "comfy-cli",
|
|
@@ -845,7 +856,7 @@ async function installCustomNodeImpl(opts) {
|
|
|
845
856
|
details: status,
|
|
846
857
|
};
|
|
847
858
|
}
|
|
848
|
-
return cloneCustomNodeFallback(gitId, repoName, gitRef, status);
|
|
859
|
+
return cloneCustomNodeFallback(gitId, repoName, gitRef, status, basePath);
|
|
849
860
|
}
|
|
850
861
|
// Registry (plain CNR id). Keep the prior defaults channel "default" /
|
|
851
862
|
// mode "remote" (overridable via opts) — forcing "dev"/"cache" risks resolving
|