comfyui-mcp 0.48.21 → 0.48.23
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 +331 -56
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/panel-agent.js +122 -31
- package/dist/orchestrator/panel-agent.js.map +1 -1
- package/dist/orchestrator/panel-tools.js +1256 -198
- 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/orchestrator/session-store.js +163 -28
- package/dist/orchestrator/session-store.js.map +1 -1
- 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 +252 -3
- 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 +179 -45
- 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/process-control.js +107 -8
- package/dist/services/process-control.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 +341 -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-deps.js +20 -1
- package/dist/services/workflow-deps.js.map +1 -1
- package/dist/services/workflow-lock.js +127 -27
- package/dist/services/workflow-lock.js.map +1 -1
- package/dist/services/workflow-target-store.js +7 -3
- package/dist/services/workflow-target-store.js.map +1 -1
- package/dist/services/workspace-env.js +48 -0
- package/dist/services/workspace-env.js.map +1 -1
- package/dist/tools/diagnostics.js +10 -1
- package/dist/tools/diagnostics.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-explorer.js +85 -5
- package/dist/tools/model-explorer.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/dist/tools/workflow-visualize.js +1 -1
- package/dist/tools/workflow-visualize.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/plugin/skills/flux-txt2img/SKILL.md +9 -4
- package/plugin/skills/wan-scail-replacement/SKILL.md +95 -0
- package/scripts/sync-agents.mjs +18 -8
- package/scripts/test-packs.sh +8 -3
|
@@ -2,69 +2,204 @@ import { readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { logger } from "../utils/logger.js";
|
|
5
|
-
/**
|
|
6
|
-
* Durable per-tab SDK session ids, so an agent's memory survives the orchestrator
|
|
7
|
-
* PROCESS dying — a wedge auto-restart, a crash, an OOM — not just a soft reload.
|
|
8
|
-
*
|
|
9
|
-
* The panel also persists the session id (onSession → a `session` frame → the
|
|
10
|
-
* panel's localStorage), and resumes by re-sending it on reconnect. But that path
|
|
11
|
-
* is the PANEL's: if the orchestrator is killed and a fresh one comes up before the
|
|
12
|
-
* panel re-sends `hello.resume` — or the panel never sends it — the conversation is
|
|
13
|
-
* silently lost (P0: the agent "forgets everything" after an auto-restart). This is
|
|
14
|
-
* the orchestrator's own belt-and-suspenders copy: written when the agent reports
|
|
15
|
-
* its session id, read as the resume fallback when a tab first spawns. Keyed by the
|
|
16
|
-
* bridge port so two ComfyUI instances on one machine never cross-resume.
|
|
17
|
-
*/
|
|
18
5
|
export class SessionStore {
|
|
6
|
+
/** Entries untouched for longer than this are pruned on load. Resumes are
|
|
7
|
+
* same-day / few-days in practice; three weeks is a generous ceiling that still
|
|
8
|
+
* bounds growth (stale test + reloaded-`tmp:` keys never accumulate forever). */
|
|
9
|
+
static GC_TTL_MS = 21 * 24 * 60 * 60 * 1000;
|
|
19
10
|
path;
|
|
20
|
-
|
|
11
|
+
sessions;
|
|
12
|
+
stable;
|
|
21
13
|
constructor(port) {
|
|
22
14
|
this.path = join(tmpdir(), `comfyui-mcp-panel-sessions-${port}.json`);
|
|
23
|
-
|
|
15
|
+
const loaded = this.read();
|
|
16
|
+
this.sessions = loaded.sessions;
|
|
17
|
+
this.stable = loaded.stable;
|
|
18
|
+
// If load had to SANITIZE the file (migrate the legacy format, GC an expired
|
|
19
|
+
// entry, clamp a corrupt future timestamp), persist the cleaned version NOW.
|
|
20
|
+
// Otherwise a clamped-in-memory-only future timestamp survives on disk and is
|
|
21
|
+
// re-clamped to "now" on every load — immortal, never aging out (#570 P3).
|
|
22
|
+
if (loaded.dirty)
|
|
23
|
+
this.flush();
|
|
24
|
+
}
|
|
25
|
+
now() {
|
|
26
|
+
return Date.now();
|
|
24
27
|
}
|
|
25
28
|
read() {
|
|
29
|
+
const empty = { sessions: {}, stable: {}, dirty: false };
|
|
26
30
|
try {
|
|
27
31
|
const parsed = JSON.parse(readFileSync(this.path, "utf8"));
|
|
28
|
-
if (parsed
|
|
29
|
-
|
|
32
|
+
if (!parsed || typeof parsed !== "object")
|
|
33
|
+
return empty;
|
|
34
|
+
const obj = parsed;
|
|
35
|
+
const cutoff = this.now() - SessionStore.GC_TTL_MS;
|
|
36
|
+
// `dirty` = the on-disk bytes no longer match what we hold, so the constructor
|
|
37
|
+
// must re-flush (drop GC'd/malformed rows, persist a clamped timestamp, migrate).
|
|
38
|
+
let dirty = false;
|
|
39
|
+
// Coerce an untrusted map into {key -> Entry}, dropping malformed/expired rows.
|
|
40
|
+
const coerce = (raw) => {
|
|
30
41
|
const out = {};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
if (raw === undefined)
|
|
43
|
+
return out; // absent field — canonicalized on next write
|
|
44
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
45
|
+
dirty = true; // malformed container → rewrite as a canonical {} on load
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
const nowMs = this.now();
|
|
49
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
50
|
+
if (!v || typeof v !== "object") {
|
|
51
|
+
dirty = true;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const e = v;
|
|
55
|
+
if (typeof e.s !== "string") {
|
|
56
|
+
dirty = true;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Sanitize the timestamp. A corrupt `1e999` parses as Infinity and would
|
|
60
|
+
// slip past `t < cutoff` forever (never GC'd, never refreshed); a finite
|
|
61
|
+
// FUTURE value (e.g. 1e100) likewise never ages out and makes touch() a
|
|
62
|
+
// no-op. Non-finite → epoch 0 (pruned as too old); future → clamped to now
|
|
63
|
+
// so the TTL is measured from load like any other entry.
|
|
64
|
+
const rawT = typeof e.t === "number" && Number.isFinite(e.t) ? e.t : 0;
|
|
65
|
+
let t = rawT;
|
|
66
|
+
if (t > nowMs)
|
|
67
|
+
t = nowMs;
|
|
68
|
+
if (t !== rawT)
|
|
69
|
+
dirty = true; // clamp/coerce must be persisted (P3)
|
|
70
|
+
if (t < cutoff) {
|
|
71
|
+
dirty = true; // GC drop must be persisted
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const entry = { s: e.s, t };
|
|
75
|
+
if (typeof e.o === "string")
|
|
76
|
+
entry.o = e.o;
|
|
77
|
+
if (e.p === true)
|
|
78
|
+
entry.p = true;
|
|
79
|
+
out[k] = entry;
|
|
34
80
|
}
|
|
35
81
|
return out;
|
|
82
|
+
};
|
|
83
|
+
if (obj.v === 2) {
|
|
84
|
+
const sessions = coerce(obj.sessions);
|
|
85
|
+
const stable = coerce(obj.stable);
|
|
86
|
+
return { sessions, stable, dirty };
|
|
87
|
+
}
|
|
88
|
+
// LEGACY flat format (Record<string,string>) — migrate. Stamp `now` so the
|
|
89
|
+
// migration itself never trips GC (a live install's keys stay resumable).
|
|
90
|
+
const sessions = {};
|
|
91
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
92
|
+
if (typeof v === "string")
|
|
93
|
+
sessions[k] = { s: v, t: this.now() };
|
|
36
94
|
}
|
|
95
|
+
return { sessions, stable: {}, dirty: true }; // format upgrade → re-flush as v2
|
|
37
96
|
}
|
|
38
97
|
catch {
|
|
39
98
|
// Missing or corrupt — start empty. Resume falls back to a fresh session.
|
|
40
99
|
}
|
|
41
|
-
return
|
|
100
|
+
return empty;
|
|
42
101
|
}
|
|
43
102
|
flush() {
|
|
44
103
|
try {
|
|
45
|
-
|
|
104
|
+
const payload = { v: 2, sessions: this.sessions, stable: this.stable };
|
|
105
|
+
writeFileSync(this.path, JSON.stringify(payload));
|
|
46
106
|
}
|
|
47
107
|
catch (err) {
|
|
48
108
|
logger.debug(`[session-store] write failed: ${String(err)}`);
|
|
49
109
|
}
|
|
50
110
|
}
|
|
111
|
+
/** Touch an entry's timestamp on a resume hit so an actively-used session never
|
|
112
|
+
* ages out of the store. GC only ever reclaims a key that hasn't been RESUMED
|
|
113
|
+
* (spawned) within the TTL — i.e. a genuinely idle tab. Debounced (1h) so the
|
|
114
|
+
* per-spawn read doesn't churn the disk. */
|
|
115
|
+
touch(map, key) {
|
|
116
|
+
const e = map[key];
|
|
117
|
+
if (!e)
|
|
118
|
+
return;
|
|
119
|
+
const now = this.now();
|
|
120
|
+
if (now - e.t < 60 * 60 * 1000)
|
|
121
|
+
return;
|
|
122
|
+
e.t = now;
|
|
123
|
+
this.flush();
|
|
124
|
+
}
|
|
51
125
|
/** The persisted session id to resume for a tab, if any. */
|
|
52
126
|
get(tabId) {
|
|
53
|
-
|
|
127
|
+
const s = this.sessions[tabId]?.s;
|
|
128
|
+
if (s !== undefined)
|
|
129
|
+
this.touch(this.sessions, tabId);
|
|
130
|
+
return s;
|
|
54
131
|
}
|
|
55
132
|
/** Record (and persist) a tab's current session id. No-op if unchanged. */
|
|
56
133
|
set(tabId, sessionId) {
|
|
57
|
-
if (this.
|
|
58
|
-
|
|
59
|
-
|
|
134
|
+
if (this.sessions[tabId]?.s === sessionId) {
|
|
135
|
+
// Same id — refresh the timestamp so an actively-used session never GCs out,
|
|
136
|
+
// but skip the disk write when the timestamp is already recent.
|
|
137
|
+
const existing = this.sessions[tabId];
|
|
138
|
+
if (existing && this.now() - existing.t < 60 * 60 * 1000)
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.sessions[tabId] = { s: sessionId, t: this.now() };
|
|
60
142
|
this.flush();
|
|
61
143
|
}
|
|
62
144
|
/** Forget a tab's session — called when the panel starts a NEW chat, so the
|
|
63
145
|
* disk fallback never resurrects a deliberately-reset conversation. */
|
|
64
146
|
clear(tabId) {
|
|
65
|
-
if (!(tabId in this.
|
|
147
|
+
if (!(tabId in this.sessions))
|
|
148
|
+
return;
|
|
149
|
+
delete this.sessions[tabId];
|
|
150
|
+
this.flush();
|
|
151
|
+
}
|
|
152
|
+
/** The resume session id for a STABLE identity (survives a panel reload for an
|
|
153
|
+
* unsaved workflow), if any. A POISONED key (two tabs contended — see setStable)
|
|
154
|
+
* returns undefined, so a collision degrades to a fresh session, never a resume of
|
|
155
|
+
* the WRONG conversation. See the class docstring. */
|
|
156
|
+
getStable(stableKey) {
|
|
157
|
+
const e = this.stable[stableKey];
|
|
158
|
+
if (!e || e.p)
|
|
159
|
+
return undefined;
|
|
160
|
+
this.touch(this.stable, stableKey);
|
|
161
|
+
return e.s;
|
|
162
|
+
}
|
|
163
|
+
/** Record (and persist) the session id under a STABLE identity, so a reloaded
|
|
164
|
+
* unsaved-workflow tab (new `tmp:` id) can still resume it. `owner` is the panel
|
|
165
|
+
* tab writing it — the collision discriminator.
|
|
166
|
+
*
|
|
167
|
+
* The stable key (origin+title+backend) is NOT unique: two unsaved tabs with the
|
|
168
|
+
* same default title collide. If a DIFFERENT owner writes a DIFFERENT session
|
|
169
|
+
* under an existing key, that key is POISONED — neither tab may resume it, so a
|
|
170
|
+
* fresh sibling can never inherit the other's conversation. The SAME owner writing
|
|
171
|
+
* a new session (a rewind/fork) is NOT a collision; a reloaded tab writing the
|
|
172
|
+
* SAME (resumed) session under a new owner just refreshes it. */
|
|
173
|
+
setStable(stableKey, sessionId, owner) {
|
|
174
|
+
const existing = this.stable[stableKey];
|
|
175
|
+
if (existing?.p)
|
|
176
|
+
return; // already poisoned — stays refused until clearStable
|
|
177
|
+
if (existing &&
|
|
178
|
+
existing.s !== sessionId &&
|
|
179
|
+
existing.o !== undefined &&
|
|
180
|
+
owner !== undefined &&
|
|
181
|
+
existing.o !== owner) {
|
|
182
|
+
// Two different tabs, two different sessions, one non-unique key → poison it.
|
|
183
|
+
this.stable[stableKey] = { s: "", t: this.now(), p: true };
|
|
184
|
+
this.flush();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (existing && existing.s === sessionId && existing.o === owner) {
|
|
188
|
+
// Unchanged — refresh the timestamp (debounced) so an active session doesn't GC.
|
|
189
|
+
if (this.now() - existing.t < 60 * 60 * 1000)
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const entry = { s: sessionId, t: this.now() };
|
|
193
|
+
if (owner !== undefined)
|
|
194
|
+
entry.o = owner;
|
|
195
|
+
this.stable[stableKey] = entry;
|
|
196
|
+
this.flush();
|
|
197
|
+
}
|
|
198
|
+
/** Forget a stable identity's session (a deliberate NEW chat on that tab). */
|
|
199
|
+
clearStable(stableKey) {
|
|
200
|
+
if (!(stableKey in this.stable))
|
|
66
201
|
return;
|
|
67
|
-
delete this.
|
|
202
|
+
delete this.stable[stableKey];
|
|
68
203
|
this.flush();
|
|
69
204
|
}
|
|
70
205
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/orchestrator/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/orchestrator/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -137,12 +137,7 @@ export function extractWorkflowClassTypes(graph) {
|
|
|
137
137
|
}
|
|
138
138
|
return [...out];
|
|
139
139
|
}
|
|
140
|
-
|
|
141
|
-
* Classify a workflow's runtime (local-GPU vs paid API nodes) by scanning its
|
|
142
|
-
* node class_types against the connected ComfyUI's /object_info (the same signal
|
|
143
|
-
* isApiNode uses). Works on UI or API/prompt format graphs.
|
|
144
|
-
*/
|
|
145
|
-
export async function checkWorkflowRuntime(graph, deps = defaultDeps) {
|
|
140
|
+
export async function checkWorkflowRuntime(graph, deps = defaultDeps, opts = {}) {
|
|
146
141
|
const classTypes = extractWorkflowClassTypes(graph);
|
|
147
142
|
const objectInfo = await deps.getObjectInfo();
|
|
148
143
|
const apiNodes = [];
|
|
@@ -165,13 +160,16 @@ export async function checkWorkflowRuntime(graph, deps = defaultDeps) {
|
|
|
165
160
|
runtime = apiNodes.length >= classifiable && classifiable > 0 ? "api" : "mixed";
|
|
166
161
|
usesApiNodes = true;
|
|
167
162
|
}
|
|
168
|
-
else if (unknownNodes.length > 0) {
|
|
163
|
+
else if (unknownNodes.length > 0 && !opts.bundledLocalPack) {
|
|
169
164
|
// No recognized API nodes, but some class_types aren't in /object_info — they
|
|
170
165
|
// COULD be paid API/partner nodes the server doesn't expose. Don't claim free.
|
|
171
166
|
runtime = "unknown";
|
|
172
167
|
usesApiNodes = null;
|
|
173
168
|
}
|
|
174
169
|
else {
|
|
170
|
+
// Either everything classified as local, OR this is a bundled pack (declared
|
|
171
|
+
// local/free) whose only unclassifiable nodes are its own uninstalled custom
|
|
172
|
+
// nodes — never API nodes. Trust the pack's local guarantee (#464).
|
|
175
173
|
runtime = "local";
|
|
176
174
|
usesApiNodes = false;
|
|
177
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-nodes.js","sourceRoot":"","sources":["../../src/services/api-nodes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-nodes.js","sourceRoot":"","sources":["../../src/services/api-nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -709,7 +709,13 @@ onResume,
|
|
|
709
709
|
* validated as a real model — an HTML/JSON auth/error body is rejected rather
|
|
710
710
|
* than finalized as a corrupt model under a false success (#473). Empty ⇒ no
|
|
711
711
|
* payload validation (unknown/non-model destination). */
|
|
712
|
-
modelExt = ""
|
|
712
|
+
modelExt = "",
|
|
713
|
+
/** Per-download abort signal (#515): passed to fetch AND the write pipeline so a
|
|
714
|
+
* cancel aborts the in-flight transfer promptly; the partial is left on disk. */
|
|
715
|
+
signal) {
|
|
716
|
+
// Fail fast if we were cancelled before any bytes moved — no request, no partial.
|
|
717
|
+
if (signal?.aborted)
|
|
718
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
713
719
|
if (supportsCloudDownload(url)) {
|
|
714
720
|
// Cloud downloaders (S3/Azure) don't range-resume — they overwrite the target.
|
|
715
721
|
// If a partial exists it's being discarded; surface that (#467) instead of a
|
|
@@ -730,7 +736,14 @@ modelExt = "") {
|
|
|
730
736
|
`re-downloading in full.`, { url: logUrl, discardedBytes: resumeFromBytes });
|
|
731
737
|
onResume?.({ outcome: "declined:full-response", discardedBytes: resumeFromBytes, discarded: true });
|
|
732
738
|
}
|
|
733
|
-
await downloadCloudUrlToFile(url, targetPath, storageAuth);
|
|
739
|
+
await downloadCloudUrlToFile(url, targetPath, storageAuth, signal);
|
|
740
|
+
// INTEGRITY BACKSTOP (#515): the S3/Azure SDKs may not honor the abort promptly
|
|
741
|
+
// (or at all), so a cancel that arrived mid-transfer could let the cloud download
|
|
742
|
+
// run to completion. If we were cancelled, throw BEFORE the size/payload checks
|
|
743
|
+
// and the caller's rename/materialize — so a cancelled cloud transfer is NEVER
|
|
744
|
+
// finalized as a complete file (the partial is left in the cache dir, unrenamed).
|
|
745
|
+
if (signal?.aborted)
|
|
746
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
734
747
|
// #343 edge: the S3/Azure path bypasses the HTTP size gate below. The cloud
|
|
735
748
|
// downloaders verify their own Content-Length (truncation), but a stream
|
|
736
749
|
// that yielded ZERO bytes can still resolve cleanly — backstop it here so a
|
|
@@ -855,7 +868,7 @@ modelExt = "") {
|
|
|
855
868
|
let redirectSize;
|
|
856
869
|
let res;
|
|
857
870
|
for (let redirectCount = 0;; redirectCount += 1) {
|
|
858
|
-
res = await fetchOrThrow(currentUrl, { headers: currentHeaders, redirect: "manual" }, currentUrl === url ? logUrl : redactUrlForLogs(currentUrl));
|
|
871
|
+
res = await fetchOrThrow(currentUrl, { headers: currentHeaders, redirect: "manual", signal }, currentUrl === url ? logUrl : redactUrlForLogs(currentUrl));
|
|
859
872
|
if (res.status < 300 || res.status >= 400)
|
|
860
873
|
break;
|
|
861
874
|
// Capture the content-addressed resume validator off the redirect itself.
|
|
@@ -1235,7 +1248,7 @@ modelExt = "") {
|
|
|
1235
1248
|
});
|
|
1236
1249
|
// No progress wanted (internal/cache caller, or not under the panel) → straight pipe.
|
|
1237
1250
|
if (!progress) {
|
|
1238
|
-
await pipeline(nodeStream, fileStream);
|
|
1251
|
+
await pipeline(nodeStream, fileStream, { signal });
|
|
1239
1252
|
await assertComplete();
|
|
1240
1253
|
await assertModelPayload();
|
|
1241
1254
|
// Complete: the validator sidecar is only needed to guard a resume, so drop it.
|
|
@@ -1266,7 +1279,7 @@ modelExt = "") {
|
|
|
1266
1279
|
},
|
|
1267
1280
|
});
|
|
1268
1281
|
try {
|
|
1269
|
-
await pipeline(nodeStream, counter, fileStream);
|
|
1282
|
+
await pipeline(nodeStream, counter, fileStream, { signal });
|
|
1270
1283
|
await assertComplete();
|
|
1271
1284
|
await assertModelPayload();
|
|
1272
1285
|
if (resumable)
|
|
@@ -1276,11 +1289,16 @@ modelExt = "") {
|
|
|
1276
1289
|
return responseContentType;
|
|
1277
1290
|
}
|
|
1278
1291
|
catch (err) {
|
|
1279
|
-
|
|
1292
|
+
// On a user cancel (#515) the abort left a resumable .partial on disk. Do NOT emit
|
|
1293
|
+
// an "error" row for it, and do NOT clear the row here: this cache layer has no
|
|
1294
|
+
// registry context, and a coalesced sibling may share this progress row. The JOB
|
|
1295
|
+
// layer (finalizeCancelled) clears it registry-aware. Only a genuine failure emits.
|
|
1296
|
+
if (!signal?.aborted)
|
|
1297
|
+
emit("error", true);
|
|
1280
1298
|
throw err;
|
|
1281
1299
|
}
|
|
1282
1300
|
}
|
|
1283
|
-
async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progress, onResume, modelExt = "") {
|
|
1301
|
+
async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progress, onResume, modelExt = "", signal) {
|
|
1284
1302
|
// Representation-aware identity (#467): a same-URL download with different HTTP
|
|
1285
1303
|
// auth headers OR different cloud (S3/Azure) credentials gets its OWN cache file,
|
|
1286
1304
|
// partial and in-flight slot — never coalesced onto another caller's stream.
|
|
@@ -1291,6 +1309,21 @@ async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progres
|
|
|
1291
1309
|
// of its own — the decision is reported to the job that actually runs the
|
|
1292
1310
|
// stream (#467). This is inherent to the callback model: onResume is not passed
|
|
1293
1311
|
// to the shared promise, so a coalesced caller simply awaits the same result.
|
|
1312
|
+
//
|
|
1313
|
+
// CANCEL SEMANTICS across coalescing (#515): two DIFFERENT-destination jobs for the
|
|
1314
|
+
// same URL+auth are distinct jobs (distinct AbortControllers) but share ONE physical
|
|
1315
|
+
// stream here (the first caller's, keyed by cache identity). This shared stream binds
|
|
1316
|
+
// the FIRST caller's signal. Integrity is preserved in every case:
|
|
1317
|
+
// - Cancelling the stream OWNER aborts the shared stream; the other (uncancelled)
|
|
1318
|
+
// caller's promise rejects, and since ITS signal is not aborted, downloadWithCache
|
|
1319
|
+
// falls back to a fresh direct download and still completes correctly.
|
|
1320
|
+
// - Cancelling a COALESCED caller does not abort the shared stream (it keeps running
|
|
1321
|
+
// for the owner), but that caller's own commit guard (its aborted signal, checked
|
|
1322
|
+
// in downloadModel before the done row / return) refuses to finalize — so it is
|
|
1323
|
+
// never reported as complete.
|
|
1324
|
+
// The deliberate trade-off is prompt stream-abort for the common SOLE-caller case at
|
|
1325
|
+
// the cost of a rare redundant re-download when a shared owner is cancelled; no caller
|
|
1326
|
+
// can ever false-complete or be corrupted by another's cancel.
|
|
1294
1327
|
if (existing)
|
|
1295
1328
|
return existing;
|
|
1296
1329
|
const promise = (async () => {
|
|
@@ -1386,7 +1419,7 @@ async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progres
|
|
|
1386
1419
|
}
|
|
1387
1420
|
try {
|
|
1388
1421
|
const contentType = await streamUrlToFile(url, partial, headers, logUrl, storageAuth, resumeFromBytes, progress, true, // resumable: cache partials use the .partial + If-Range resume handshake
|
|
1389
|
-
onResume, modelExt);
|
|
1422
|
+
onResume, modelExt, signal);
|
|
1390
1423
|
await downloadCacheFs.rename(partial, target);
|
|
1391
1424
|
await touch(target);
|
|
1392
1425
|
// Persist the response Content-Type beside the cache file so a later cache-HIT /
|
|
@@ -1470,9 +1503,24 @@ function isHardlinkUnsupported(code) {
|
|
|
1470
1503
|
* EEXIST — ONLY then do we move the destination ASIDE and swap. Any OTHER rename
|
|
1471
1504
|
* error (ENOENT, EIO, EXDEV, …) must NOT touch a valid existing destination (#467):
|
|
1472
1505
|
* clean our temp and propagate. */
|
|
1473
|
-
async function renameTempOverDestination(tmp, targetPath
|
|
1506
|
+
async function renameTempOverDestination(tmp, targetPath,
|
|
1507
|
+
/** Fired SYNCHRONOUSLY the instant the destination rename succeeds — BEFORE any
|
|
1508
|
+
* further await (e.g. Windows backup cleanup) — so the job can commit "done" with no
|
|
1509
|
+
* window where the file is at its destination yet the job still reads "downloading"
|
|
1510
|
+
* and a cancel could falsely mark it cancelled (#515). */
|
|
1511
|
+
onLanded,
|
|
1512
|
+
/** Abort signal (#515). Checked before the atomic replace AND (Windows path) after the
|
|
1513
|
+
* destination is moved aside but before the swap — so a cancel that lands during the
|
|
1514
|
+
* backup move restores the original and bails instead of swapping the temp in. */
|
|
1515
|
+
signal) {
|
|
1516
|
+
// Cancelled before the swap — leave the destination untouched (the temp is cleaned up).
|
|
1517
|
+
if (signal?.aborted) {
|
|
1518
|
+
await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
|
|
1519
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
1520
|
+
}
|
|
1474
1521
|
try {
|
|
1475
1522
|
await downloadCacheFs.rename(tmp, targetPath);
|
|
1523
|
+
onLanded?.(targetPath); // landed (POSIX atomic replace) — commit done before returning
|
|
1476
1524
|
return;
|
|
1477
1525
|
}
|
|
1478
1526
|
catch (err) {
|
|
@@ -1496,8 +1544,29 @@ async function renameTempOverDestination(tmp, targetPath) {
|
|
|
1496
1544
|
catch {
|
|
1497
1545
|
/* destination may not exist — nothing to move aside */
|
|
1498
1546
|
}
|
|
1547
|
+
// A cancel that landed WHILE we moved the old destination aside must NOT swap the
|
|
1548
|
+
// temp in — restore the original and bail, so a cancelled download never lands its
|
|
1549
|
+
// file over the destination (#515). The temp is cleaned up.
|
|
1550
|
+
if (signal?.aborted) {
|
|
1551
|
+
await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
|
|
1552
|
+
if (backedUp) {
|
|
1553
|
+
const restored = await downloadCacheFs
|
|
1554
|
+
.rename(backup, targetPath)
|
|
1555
|
+
.then(() => true)
|
|
1556
|
+
.catch(() => false);
|
|
1557
|
+
if (!restored) {
|
|
1558
|
+
throw new ModelError(`Download cancelled but the previous file could not be restored — it is PRESERVED at ` +
|
|
1559
|
+
`"${backup}"; move it back to "${targetPath}" manually.`, { url: targetPath });
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
1563
|
+
}
|
|
1499
1564
|
try {
|
|
1500
1565
|
await downloadCacheFs.rename(tmp, targetPath);
|
|
1566
|
+
// Swapped in — the file is at its destination. Commit done NOW, before the backup
|
|
1567
|
+
// cleanup await, so a cancel during that await can't falsely mark a landed file
|
|
1568
|
+
// cancelled (#515).
|
|
1569
|
+
onLanded?.(targetPath);
|
|
1501
1570
|
if (backedUp)
|
|
1502
1571
|
await downloadCacheFs.rm(backup, { force: true }).catch(() => undefined);
|
|
1503
1572
|
}
|
|
@@ -1519,9 +1588,13 @@ async function renameTempOverDestination(tmp, targetPath) {
|
|
|
1519
1588
|
}
|
|
1520
1589
|
}
|
|
1521
1590
|
const MATERIALIZE_TEMP_ATTEMPTS = 5;
|
|
1522
|
-
async function materializeCacheFile(cachePath, targetPath) {
|
|
1523
|
-
if (resolve(cachePath) === resolve(targetPath))
|
|
1591
|
+
async function materializeCacheFile(cachePath, targetPath, signal, onLanded) {
|
|
1592
|
+
if (resolve(cachePath) === resolve(targetPath)) {
|
|
1593
|
+
// The download streamed directly to the destination (cache === target) — it is
|
|
1594
|
+
// already on disk; commit "done" synchronously (#515).
|
|
1595
|
+
onLanded?.(targetPath);
|
|
1524
1596
|
return "hardlink";
|
|
1597
|
+
}
|
|
1525
1598
|
// Materialize ATOMICALLY into an UNGUESSABLE, EXCLUSIVELY-created temp, then
|
|
1526
1599
|
// rename over targetPath — never write directly at targetPath, and never reuse a
|
|
1527
1600
|
// possibly-stale temp name (#467 P1-A). Two jobs materializing DIFFERENT
|
|
@@ -1561,7 +1634,19 @@ async function materializeCacheFile(cachePath, targetPath) {
|
|
|
1561
1634
|
}
|
|
1562
1635
|
mode = "copy";
|
|
1563
1636
|
}
|
|
1564
|
-
|
|
1637
|
+
// FINAL CANCEL GUARD (#515): the temp is built but NOT yet swapped in. If this
|
|
1638
|
+
// caller was cancelled, remove the temp and bail WITHOUT replacing the destination
|
|
1639
|
+
// — so a cancelled download never lands its target even if the abort arrived during
|
|
1640
|
+
// materialization. (The cache entry itself is untouched — the temp was our own.)
|
|
1641
|
+
if (signal?.aborted) {
|
|
1642
|
+
await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
|
|
1643
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
1644
|
+
}
|
|
1645
|
+
// onLanded fires INSIDE renameTempOverDestination the instant the destination rename
|
|
1646
|
+
// succeeds (before any Windows backup cleanup await), closing the landed→return
|
|
1647
|
+
// window entirely; the signal lets it also abort the Windows swap after the backup
|
|
1648
|
+
// move (#515).
|
|
1649
|
+
await renameTempOverDestination(tmp, targetPath, onLanded, signal);
|
|
1565
1650
|
return mode;
|
|
1566
1651
|
}
|
|
1567
1652
|
}
|
|
@@ -1595,8 +1680,8 @@ async function evictLruIfNeeded() {
|
|
|
1595
1680
|
break;
|
|
1596
1681
|
}
|
|
1597
1682
|
}
|
|
1598
|
-
export async function downloadUrlToFile(url, targetPath, headers, logUrl, storageAuth = {}, progress, modelExt = extname(targetPath)) {
|
|
1599
|
-
await streamUrlToFile(url, targetPath, headers, logUrl, storageAuth, 0, progress, false, undefined, modelExt);
|
|
1683
|
+
export async function downloadUrlToFile(url, targetPath, headers, logUrl, storageAuth = {}, progress, modelExt = extname(targetPath), signal) {
|
|
1684
|
+
await streamUrlToFile(url, targetPath, headers, logUrl, storageAuth, 0, progress, false, undefined, modelExt, signal);
|
|
1600
1685
|
}
|
|
1601
1686
|
export async function downloadWithCache(options) {
|
|
1602
1687
|
const logUrl = options.logUrl ?? redactUrlForLogs(options.url);
|
|
@@ -1606,7 +1691,14 @@ export async function downloadWithCache(options) {
|
|
|
1606
1691
|
// body is checked against what the destination IS (a `.safetensors` etc.).
|
|
1607
1692
|
const modelExt = extname(options.targetPath);
|
|
1608
1693
|
try {
|
|
1609
|
-
const cachePath = await downloadIntoCache(options.url, options.headers, logUrl, options.storageAuth, options.progress, options.onResume, modelExt);
|
|
1694
|
+
const cachePath = await downloadIntoCache(options.url, options.headers, logUrl, options.storageAuth, options.progress, options.onResume, modelExt, options.signal);
|
|
1695
|
+
// CANCEL GUARD (#515): a COALESCED caller (or a CACHE HIT) reaches here without
|
|
1696
|
+
// ever streaming — it awaited another job's shared physical download. If THIS
|
|
1697
|
+
// caller was cancelled meanwhile, it must NOT materialize its destination: bail
|
|
1698
|
+
// BEFORE validation/materialization so a cancelled download never lands a completed
|
|
1699
|
+
// file at its models path (which we'd then misreport as "cancelled, partial left").
|
|
1700
|
+
if (options.signal?.aborted)
|
|
1701
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
1610
1702
|
// Validate the CACHE FILE itself before materializing it to this destination —
|
|
1611
1703
|
// this is the authoritative per-caller gate (#473). It covers four cases the
|
|
1612
1704
|
// stream-time check can't: (1) a CACHE HIT that skipped streaming entirely,
|
|
@@ -1639,7 +1731,7 @@ export async function downloadWithCache(options) {
|
|
|
1639
1731
|
await safeRm(cacheCtSidecar(cachePath));
|
|
1640
1732
|
},
|
|
1641
1733
|
});
|
|
1642
|
-
const materializedBy = await materializeCacheFile(cachePath, options.targetPath);
|
|
1734
|
+
const materializedBy = await materializeCacheFile(cachePath, options.targetPath, options.signal, options.onLanded);
|
|
1643
1735
|
await evictLruIfNeeded();
|
|
1644
1736
|
return {
|
|
1645
1737
|
targetPath: options.targetPath,
|
|
@@ -1651,6 +1743,11 @@ export async function downloadWithCache(options) {
|
|
|
1651
1743
|
catch (err) {
|
|
1652
1744
|
if (err instanceof ModelError)
|
|
1653
1745
|
throw err;
|
|
1746
|
+
// A user cancel (#515) aborted the transfer — do NOT fall back to a direct
|
|
1747
|
+
// download (it would immediately re-abort). Propagate so the job records a
|
|
1748
|
+
// clean cancellation; the resumable .partial is left in the cache dir.
|
|
1749
|
+
if (options.signal?.aborted)
|
|
1750
|
+
throw err;
|
|
1654
1751
|
logger.warn("Download cache unavailable; falling back to direct download", {
|
|
1655
1752
|
url: logUrl,
|
|
1656
1753
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -1665,8 +1762,19 @@ export async function downloadWithCache(options) {
|
|
|
1665
1762
|
// leaves the destination untouched.
|
|
1666
1763
|
const tmp = await reserveExclusiveTemp(options.targetPath, "dl");
|
|
1667
1764
|
try {
|
|
1668
|
-
await downloadUrlToFile(options.url, tmp, options.headers, logUrl, options.storageAuth, options.progress, modelExt);
|
|
1669
|
-
|
|
1765
|
+
await downloadUrlToFile(options.url, tmp, options.headers, logUrl, options.storageAuth, options.progress, modelExt, options.signal);
|
|
1766
|
+
// PRE-RENAME CANCEL GUARD (#515), mirroring the cache-path materialize guard: a
|
|
1767
|
+
// cancel that arrived during the post-stream validation lets the stream return
|
|
1768
|
+
// normally, but we must NOT swap the temp into the destination — bail so a
|
|
1769
|
+
// cancelled download never lands its target here either. (An abort DURING the
|
|
1770
|
+
// un-interruptible rename lands a complete, validated file → the job reports done,
|
|
1771
|
+
// consistent with the invariant.) The temp is removed by the catch below.
|
|
1772
|
+
if (options.signal?.aborted)
|
|
1773
|
+
throw new DOMException("The download was cancelled.", "AbortError");
|
|
1774
|
+
// onLanded fires inside renameTempOverDestination at the successful rename (before
|
|
1775
|
+
// any backup-cleanup await) — commits "done" with no landed→return window; the
|
|
1776
|
+
// signal also aborts the Windows swap after the backup move (#515).
|
|
1777
|
+
await renameTempOverDestination(tmp, options.targetPath, options.onLanded, options.signal);
|
|
1670
1778
|
}
|
|
1671
1779
|
catch (e) {
|
|
1672
1780
|
await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
|