The frontend directory is declared once, in pyproject.toml as
`[tool.comfy] web = "javascript"`. This `WEB_DIRECTORY = "./web"` pointed at
a directory that no longer exists -- it was left behind when the JS moved to
javascript/ -- so it is dead today. It is also a trap.
ComfyUI registers the web folder in TWO independent code paths, and they key
the same dict differently (nodes.py):
pyproject [tool.comfy] web -> EXTENSION_WEB_DIRS[project.name] (:2280)
WEB_DIRECTORY -> EXTENSION_WEB_DIRS[module_name] (:2289)
They are separate `if` blocks guarded by os.path.isdir(), not a fallback
chain, and project.name is rarely the directory name. So the moment a `web/`
directory exists again -- a revert, a merge, a stray file -- BOTH paths
register the same folder under two different keys. GET /extensions then lists
every file twice, the browser imports each twice, and app.registerExtension
runs twice with the same name: the collision the javascript test level exists
to catch, and invisible to it, because the duplication is in registration
rather than in source.
Removing the stale declaration makes that unreachable instead of dormant.
The server.py endpoints (/sam3d/save_glb, /sam3d/export_posed_fbx) were
never called by the frontend. Importing PromptServer at module level
triggered model_management → torch.cuda.current_device() → access
violation on CPU-only machines during instantiation tests.