Устройство приложения
NodeWise Studio это приложение Electron: один главный процесс, одно окно и небольшой скрипт preload между ними. На этой странице показано, как они делят работу и как одно изменение проходит от щелчка до базы и обратно.
Три части
| Часть | Где работает | Что делает | Где лежит |
|---|---|---|---|
| Main | Node.js | Владеет базой, файлами, сетью и всеми секретами. Применяет команды, ведёт ходы помощника, читает ComfyUI. | src/main/ |
| Preload | в окне, до страницы | Даёт странице один объект window.electronAPI с постоянным списком вызовов. Больше ничего из Node и Electron до страницы не доходит. | src/preload/index.ts |
| Renderer | Chromium, в песочнице | Рисует всё: холст (React Flow), панели, чат, настройки. Держит отражение графа, но не сам граф. | src/renderer/ |
| Shared | в обоих | Типы, схемы, кодек workflow, каталог текстов, уроки и встроенные знания. Чистый код без Electron. | src/shared/ |
Правила, которые действуют везде:
- Пишет только main. Renderer просит; main проверяет, применяет и отвечает новым состоянием.
- Секреты не доходят до renderer. Ключи и токены живут в main; окно знает только, есть ли ключ и где он. Безопасность
- ComfyUI только читается. Каждый вызов ComfyUI или MCP-сервера проходит одну проверку «только чтение». ComfyUI только читается
- Каждый вызов IPC проверяется: отправитель должен быть собственной страницей приложения, а входные данные должны подходить под схему. IPC между окном и main
Как проходит изменение
Пусть человек перетаскивает ноду:
- Renderer. Холст собирает команду:
actionId(новый id),expectedRevisionId(версия, которую показывает окно),actor: 'manual'и содержимое, например{ type: 'move-node', … }. Каждая правка холста идёт черезsrc/renderer/components/graph/commit.tsвsubmitManualизsrc/renderer/services/commands/projection.ts. - Preload.
window.electronAPI.commitCommandотправляет её по каналуcommand:commit. - Main, проверка.
src/main/ipc/guard.tsотклоняет отправителя, который не страница приложения. - Main, движок.
commitCommandизsrc/main/commands/commit.tsсверяет запрос со схемой и в одной транзакции SQLite: отклоняет версию, которая уже не текущая (конфликт), применяет содержимое к текущему графу, пишет новую строку вgraph_revisions, переводит проект на неё, записывает команду вapplied_commands(поэтому повтор того жеactionIdполучает ответ из записи, а не применяется дважды) и обновляет объяснения и открытые предложения. - Обратно. Main отвечает
applied,historical,conflictилиrejected, всегда вместе с текущей проекцией: графом, его версией и открытым ходом. - Renderer. Хранилища (
src/renderer/state/) принимают проекцию; React перерисовывает.
Отмена проходит тот же путь с содержимым restore-revision. Изменения помощника идут тем же путём из самого main, с
actor: 'ai' и id его хода. Подробнее: Движок команд и история.
Как проходит ответ помощника
- Renderer начинает ход (
startRun) и открывает поток поllm:stream-chat(src/renderer/services/llm/chatService.ts). - Main собирает запрос из графа, каталога и последних действий и вызывает выбранную модель через AI SDK
(
src/main/agent/turn.ts,src/main/llmService.ts). - Каждый вызов инструмента моделью проверяется и выполняется в main: чтение каталога, поиск в интернете, предложение черновика или, при сборке, команда, как выше.
- Main передаёт обратно текст, шаги и новые проекции; чат и холст рисуют их по мере прихода.
- Ход заканчивается, встаёт на паузу на лимите шагов или останавливается человеком.
Подробнее: Как устроен помощник.
Как читается ComfyUI
Синхронизация (src/main/mcp/sync.ts) читает типы нод, паки нод и файлы моделей через инструменты MCP только для
чтения или /object_info прямо из ComfyUI и кладёт их в таблицы каталога. Метаданные моделей читаются в фоне
порциями. Подробнее: Чтение ComfyUI.
Рецепты
| Что добавить | Где читать |
|---|---|
| Инструмент помощника | Как добавить инструмент помощнику |
| Настройку | Как добавить настройку |
| Канал IPC | IPC между окном и main |
| Миграцию базы | База данных и миграции |
| Урок | Как написать урок |
| Встроенные знания | Как написать встроенное знание |
| Язык | Тексты и языки |
| Ссылку из приложения на страницу вики | Ссылки на справку из приложения |