Files
PozzettiAndrea 4888e4886e Vendor viewer JS, drop comfy-3d-viewers
Vendor the viewer JavaScript into javascript/ and drop the
comfy-3d-viewers dependency. The viewers were previously copied into web/ at
every startup by prestartup_script.py, which made the served frontend depend on
a second package resolving at runtime.

Bundles are vendored as .mjs so ComfyUI's **/*.js auto-import glob skips them:
they are iframe-only and must never enter the shared main browser realm. Only
the widget entry points stay .js.

Also replace comfy_env.copy_files with a local helper. Its two extra features
(frame-derived source dir, silent no-op on a missing source) were unused here,
and the asset seeding now resolves the input directory through
folder_paths.get_input_directory() so it follows ComfyUI Desktop and
--input-directory instead of writing into the code tree.

comfy-test.toml moves to the current schema: [test.workflows] cuda (there is no
"gpu" key -- the accelerator is named by backend, and the old spelling parsed to
an empty list, so CUDA runners silently ran the full unfiltered set), an
explicit [test.platforms] platforms allowlist (per-platform booleans are no
longer supported), and the javascript level.

Namespace every registerExtension name under sam3. and inline the spinner
styles: the stylesheet used to be injected into document.head, which is shared
state every other pack inherits and nobody can clean up. It is now inline on the
element with the rotation driven by the Web Animations API.
2026-08-22 19:44:03 +02:00

48 lines
1.4 KiB
Python

"""ComfyUI-SAM3 Prestartup Script."""
import logging
import shutil
from pathlib import Path
import folder_paths
from comfy_env import setup_env
log = logging.getLogger("sam3")
setup_env()
# The CONFIGURED input directory, never the code-tree one. ComfyUI Desktop
# (--base-directory) and --input-directory both relocate it, and the load
# nodes only ever scan folder_paths.get_input_directory(). main.py runs
# apply_custom_paths() before prestartup scripts, so this is already resolved.
INPUT = Path(folder_paths.get_input_directory())
def copy_files(src: Path, dst: Path, pattern: str = "*") -> int:
"""Copy bundled assets into a directory. Returns files written.
Seeds rather than syncs: an existing file is left alone, so a user's
edited demo asset survives every relaunch. Raises if `src` is missing --
a typo'd asset directory is a packaging bug, and silence is how it stays
one.
"""
src, dst = Path(src), Path(dst)
if not src.is_dir():
raise FileNotFoundError(f"asset directory not found: {src}")
written = 0
for f in src.glob(pattern):
if not f.is_file():
continue
target = dst / f.relative_to(src)
if target.exists():
continue
target.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(f, target)
written += 1
return written
SCRIPT_DIR = Path(__file__).resolve().parent
# Copy assets
copy_files(SCRIPT_DIR / "assets", INPUT)