Чтение ComfyUI
Как приложение узнаёт, какие ноды и модели есть в ComfyUI, никогда его не меняя.
Пути
| Путь | Код | Что читается |
|---|---|---|
| Сам ComfyUI по сохранённому адресу (основной путь) | src/main/comfy/direct.ts через src/main/comfy/gate.ts | /object_info (типы нод, устаревшие удаляются), /system_stats (его командная строка не сохраняется), папки и файлы моделей с размерами из /experiment/models (или /models), заголовки .safetensors через /view_metadata фоновыми порциями (404 значит «метаданных нет»), превью модели и паки из /customnode/installed ComfyUI-Manager, если он отвечает, иначе из python_module каждой ноды. |
| MCP-сервер (необязательно, Streamable HTTP) | src/main/mcp/, вид определяет src/main/mcp/profiles.ts | По виду: catalog (всё, плюс файлы рядом с моделями, файлы паков и отпечатки), modelList (только list_local_models {action:'list'}), checkpointList (только list_models {}); ноды для двух последних берутся из ComfyUI. Незнакомый сервер не вызывается. |
| Файл | «Файл ▸ Загрузить список нод из файла…» | Ответ object_info, сохранённый как JSON. |
Пути Windows в списках сервера или ComfyUI (буквы дисков, обратные косые черты) принимаются
(src/shared/mcp/serverPaths.ts).
Проверка для ComfyUI
src/main/comfy/gate.ts: только GET, redirect: 'manual', предел размера и времени на каждый адрес. Адреса
собираются только конструкторами COMFY_ROUTES, а второй список шаблонов проверяет каждый запрос; имена папок и
файлов проверяются и кодируются. Через неё проходит каждый запрос к ComfyUI, включая пробы портов «Найти на этом
компьютере». tests/unit/comfyGate.test.ts доказывает, что /prompt, /queue, /interrupt, /free, /history,
/upload/*, /userdata, /settings и адреса установки и перезапуска Manager отклоняются, что поддельный адрес не
доходит до fetch и что ни один модуль в src/main/comfy не вызывает fetch сам.
Что ещё не проверено на настоящей установке, перечислено в Выпуск версии.
Проверка для MCP
Каждый вызов MCP проходит через readOnlySession (src/main/mcp/readOnly.ts):
READ_ONLY_SCHEMASперечисляет инструменты, которые приложению можно вызывать, и точную форму их аргументов, каждая с.strict(), так что лишнее поле отклоняется, а не передаётся дальше.- Инструменту, который умеет и писать (
workspace_files), разрешено только действиеread, только для файла рядом с моделью илиpyproject.toml/README.mdпака, и действиеhashтолько для файла модели. - Всё остальное бросает
McpRefusedError, не выйдя из приложения, и попадает в журнал. - Шлюз, который добавляет приставку к именам инструментов (
gateway_comfy-models), распознаётся (detectToolPrefix), и приставка снимается до проверки.
Тесты: tests/unit/mcpCatalogSafety.test.ts и тесты синхронизации пробуют все прочие инструменты и формы аргументов.
Синхронизация
src/main/mcp/sync.ts:
- При запуске, если включена автосинхронизация (с любым из адресов), затем по интервалу или когда человек выбирает «Синхронизация ▸ Синхронизировать сейчас».
- Читает типы нод и паки, затем каждую папку моделей; папка, которая не прочиталась, сохраняет прежний список.
- Кладёт их в
node_catalog,node_packsиmodel_catalog; вид каталога кэшируется (cachedCatalogвsrc/main/commands/commit.ts). - Читает метаданные моделей в фоне порциями с паузами («Настройки ▸ Синхронизация»), останавливается после повторяющихся сбоев и выжидает.
- Записывает итог в
sync_stateпостоянными английскими предложениями, которые окно переводит.
Состояние синхронизации и её ошибки доходят до окна через IPC знаний (src/main/ipc/knowledgeIpc.ts).
Каталог
src/main/catalog/repository.ts и src/main/knowledge/repository.ts отвечают остальному приложению: типы нод с
полями (src/shared/catalog/fieldSpec.ts), модели с семейством и видом (src/shared/knowledge/baseModel.ts,
modelKind.ts), какой загрузчик читает какую папку (src/shared/catalog/modelFolders.ts) и поиск
(src/shared/knowledge/search.ts).