Перейти к основному содержимому

Проектирование Main Process

Main process — ядро Elftia, отвечающее за всю бизнес-логику, внешние API-вызовы, операции с базой данных и средства контроля безопасности. Входной файл — packages/desktop/app/main/index.ts.

Обзор сервисных модулей

Main process содержит более 45 сервисных модулей, организованных по функциональным областям в packages/desktop/app/main/services/:

graph LR
subgraph "Core Infrastructure"
Core[core/]
Config[config/]
Settings[settings/]
end

subgraph "Auth & Accounts"
Auth[auth/]
Account[account/]
OAuth[oauth/]
end

subgraph "AI Engines"
Engine[engine/]
Completion[completion/]
LLM[llm/]
Prompt[prompt/]
end

subgraph "Agent Orchestration"
Magi[magi/]
Agent[agent/]
Plugin[plugin/]
end

subgraph "Messaging Channels"
Channel[channel/]
Security[security/]
end

subgraph "Media & Content"
Media[media/]
Project[project/]
Search[search/]
end

Core --> Engine
Core --> Channel
Engine --> Magi
LLM --> Completion
Completion --> Engine
Magi --> Agent
Channel --> Security

Список сервисов по областям

ОбластьСервисОписание
Core (core/)LoggerServiceЛогирование Winston + daily-rotate-file
AppPathsРазрешение путей приложения (userData, dbPath, configDir и т. д.)
RuntimeServiceИнформация о среде выполнения (версия, канал, платформа)
CacheServiceКэш общего назначения (очистка по истечении TTL)
ConfigManagerУправление конфигурационными файлами
SecurityServiceСервис шифрования AES-256-GCM
CryptoServiceВывод ключа PBKDF2 + encrypt/decrypt
PerformanceMonitorМониторинг производительности и оповещения
ErrorHandlerГлобальная обработка ошибок
PluginManagerУправление жизненным циклом плагинов
DatabaseOptimizerОптимизация SQLite (VACUUM, ANALYZE)
CommandServiceСервис выполнения команд
Auth (auth/)AuthServiceПроверка токена аутентификации IPC
AuthSessionServiceСессия входа + обработка Deep Link
AuthTokenStoreПостоянное хранение auth-токенов
TokenRefreshServiceАвтоматическое обновление токенов
Account (account/)AccountServiceУправление учетными данными пользователя
AccountTokensServiceУправление OAuth-токенами
LimitsServiceПроверки лимитов подписки
LLM (llm/)LLMConfigServiceCRUD конфигурации провайдеров/моделей
TransformerServiceЦепочка преобразования формата запроса
Completion (completion/)CompletionServiceТочка входа для LLM API-вызовов
ApiKeyPoolServiceRound-robin для нескольких ключей + привязка к сессии
Engine (engine/)EngineDispatcherРегистрация и маршрутизация движков
ApiEngineДвижок Media API
ChatEngineДвижок общего чата
ClaudeSdkEngineДвижок Claude Agent SDK
TinyElfEngineВстроенный Agent-движок
CliRunnerEngineДвижок CLI-подпроцессов
STChatEngineДвижок RP chat pipeline
Magi Orchestration (magi/)MagiServiceОсновной сервис обработки сообщений (включает assembleMagiMcps, который собирает MCP-набор Clawia через реестр services/capabilities/tools/mcp-builtin/; buildTinyElfDirectMcpServers — точка входа TinyElf)
MagiSessionServiceУправление постоянным хранением сессий
MagiWorkspaceServiceУправление рабочими директориями
MagiSdkOptionsBuilderСборка промптов (V1-V4) + внедрение пользовательских MCP (setUserMcpServers / getMcpServers(allowedUserMcpNames) / getDirectMcpServers) + проба Channel; сборка встроенных MCP вынесена в mcp-providers/ начиная с Phase 5.9
AgentOrchestratorДиспетчеризация и оркестрация Agent
AgentDiscoveryСписок Agent, доступных для планирования
MessageRouterДвухрежимная маршрутизация сообщений
ChannelMagiBridgeМост от Channel к Magi
SessionEventBusШина событий сессий
SessionDispatcherImplРеализация межсессионной диспетчеризации
SubagentRegistryОтслеживание состояния субагентов
Built-in MCP Registry (mcp-providers/)McpProviderRegistry12 встроенных провайдеров + фабрика динамических провайдеров ScriptPlugin. Все встроенные MCP-обработчики работают in-process; SDK вызывает напрямую / TinyElf регистрирует как ITool / CLI получает доступ через центральный HTTP-мост BuiltinMcpHttpServer. HTTP-мосты DispatchServer / ChannelServer / VisionAssistServer были удалены в cleanup-legacy-mcp (2026-05-19)
BuiltinMcpHttpServerЦентральный HTTP MCP-мост (область видимости — сессия); через него все in-process MCP доступны CLI-движку
assembleMcpForSession(ctx)Единая точка сборки (SDK + TinyElf; возвращает McpAssembly, содержащий sdkServers / tinyElfServers / promptFragments / allowedTools / cleanups)
applyAssembly.tsapplyAssemblyToSdkOptions / applyAssemblyToTinyElfConfig — объединяет McpAssembly с параметрами движка
contextBuilders.tsbuildAssemblyContextFor{Clawia,Agent} — строит AssemblyContext с точки зрения вызывающей стороны
registerBuiltinMcpProviders.tsОдноразовая точка сборки при запуске (включая обработку одноименных alias для ScriptPlugin)
builtin/<Name>Provider.tsПо одному модулю Provider на каждый встроенный MCP (12 статических + фабрика динамических ScriptPlugin)
Channel (channel/)ChannelPluginLoaderОбнаружение и загрузка плагинов
ChannelPluginRegistryРегистрация плагинов и управление экземплярами
ChannelMessageRouterМаршрутизация триггеров сообщений
ChannelMarketplaceServiceMarketplace плагинов
Security (security/)ExecutionFirewallФайрвол путей к файлам
GuardianAgentПроверка вызовов AI-инструментов
PromptGuardianОбнаружение prompt injection
RateLimiterОграничение частоты запросов
InputSanitizerСанитизация ввода
UserPermissionServiceУправление разрешениями пользователя
ChannelPermissionGateПодтверждение разрешений Channel
AuditLoggerАудит-лог безопасности
Media (media/)ImageGenerationServiceГенерация изображений
MusicGenerationServiceГенерация музыки
MediaStorageServiceХранение медиафайлов
MediaResourceServiceХранилище ресурсов с content-addressing
MediaConfigServiceКонфигурация Media-провайдеров
AsrService / TtsServiceРаспознавание/синтез речи
Project (project/)ProjectServiceCRUD проектов
FileIndexServiceСервис файлового индекса
GitServiceОперации Git
Search (search/)WebSearchServiceЕдиная точка входа поиска
JinaProvider / TavilyProvider / SearxngProviderАдаптеры поисковых движков
UI (ui/)ThemeServiceУправление темой
WindowControlsServiceУправление окнами
TrayServiceСистемный трей
NotificationServiceDesktop-уведомления
Config (config/)ConfigStoreelectron-store + hot-reload через fs.watch
Cron (cron/)CronServiceДиспетчеризация запланированных задач Cron
MCP (mcp/)McpServiceУправление MCP-серверами
Plugins (plugin/)ScriptPluginLoaderЗагрузка script-плагинов
ScriptPluginRegistryРеестр script-плагинов
ScriptPluginBridgeManagerУправление мостами плагинов

Архитектура IPC Router

Вся коммуникация от frontend к backend проходит через слой IPC Router; сейчас зарегистрировано более 68 модулей маршрутизаторов.

Паттерн secureHandle

Каждый IPC-канал оборачивается в secureHandle, который принудительно проверяет токен аутентификации:

{/* packages/desktop/app/main/ipc/safe-handle.ts */}
function secureHandle(
channel: string,
handler: (event: IpcMainInvokeEvent, params: unknown) => Promise<unknown>,
validateToken: (token: string) => boolean,
): void;

Поток:

sequenceDiagram
participant R as Renderer
participant P as Preload
participant S as secureHandle
participant H as Router Handler

R->>P: window.api.someMethod(params)
P->>S: ipcRenderer.invoke(channel, {token, ...params})
S->>S: validateToken(token)
alt token invalid
S-->>P: throw AuthError
else token valid
S->>H: handler(event, params)
H-->>S: result
S-->>P: result
P-->>R: result
end

Регистрация маршрутов

Все маршруты централизованно регистрируются в registerAllRouters(). Каждый класс Router наследует BaseRouter и регистрирует свои каналы в методе register():

{/* Simplified Router structure */}
class SomeRouter extends BaseRouter {
register() {
secureHandle('domain:action', async (_event, params) => {
const validated = SomeSchema.parse(params);
return this.service.doSomething(validated);
}, this.validate);
}
}

Категории и количество маршрутов

Директория/файл RouterПрефикс каналаКоличество основных каналов
auth/auth:*5+
account/accounts:*, accountTokens:*8+
session/sessions:*, sessionOrganizer:*10+
chat/chatMessages:*, chatAssistants:*, chatControl:*, mediaSession:*15+
completion/completion:*5+
capabilities/llm/llmProviders:*, llmModels:*, apiKeys:*, transformers:*15+
project/projects:*, files:*, git:*10+
media/media:*, imageProviders:*, musicProviders:*, videoProviders:*, asr:*, tts:*20+
settings/settings:*, appPreferences:*8+
ui/theme:*, window:*6+
MagiRoutermagi:*10+
ChannelPluginRouterchannels:*8+
sillytavern/characterCards:*, worldInfo:*, regexScripts:*, groupChat:*, etc.25+
Прочиеmcp:*, webSearch:*, todo:*, tasks:*, notes:*, tags:*, cron:*, elfi:*, etc.30+

Паттерн Worker Thread

Длительные операции ввода-вывода выполняются в Worker Threads, чтобы не блокировать main thread.

DbClient — Database Worker

DbClient — самый критичный Worker, инкапсулирующий все взаимодействия с базой данных SQLite:

sequenceDiagram
participant S as Service
participant C as DbClient
participant W as db.worker.ts
participant D as SQLite (WAL)

S->>C: db.someMethod(params)
C->>C: seq++, create Promise
C->>W: postMessage({id: seq, method, params})
W->>D: Execute SQL query
D-->>W: Result
W-->>C: postMessage({id: seq, result})
C->>C: resolve(pending[seq])
C-->>S: Promise<result>
{/* Simplified DbClient RPC pattern */}
class DbClient extends EventEmitter implements DbRpc {
private worker: Worker;
private seq = 0;
private pending = Map<number, {resolve, reject}>;

async send(method: string, params: unknown): Promise<unknown> {
const id = ++this.seq;
return new Promise((resolve, reject) => {
this.pending.set(id, { resolve, reject });
this.worker.postMessage({ id, method, params });
});
}

async ready(): Promise<void>;
}

Ключевые проектные моменты:

  • Async RPC: каждому вызову назначается уникальный порядковый номер; запросы отправляются через postMessage
  • Ожидание готовности: await db.ready() гарантирует, что Worker завершил инициализацию (создание схемы) перед использованием
  • Проброс ошибок: ошибки Worker всплывают через EventEmitter

Список Worker Threads

Файл WorkerНазначениеКоммуникация
db.worker.tsЧтение/запись базы данных SQLite (100+ RPC-методов)DbClient RPC
fileSearch.worker.tsПоиск файлов (fuzzy match)MessagePort
fileWatcher.worker.tsНаблюдение за файловой системой (chokidar)MessagePort
mcp.worker.tsУправление процессами MCP-серверовMessagePort
diagnostics.worker.tsСбор системных диагностических данныхMessagePort
project.worker.tsПостроение индекса файлов проектаMessagePort
fileSnapshot.worker.tsСравнение снимков файловMessagePort

Ключевая инфраструктура

LoggerService

Основан на Winston, поддерживает фильтрацию по уровню логирования и автоматическую ротацию лог-файлов:

{/* Simplified LoggerService interface */}
class LoggerService {
info(message: string, meta?: Record<string, unknown>): void;
warn(message: string, err?: Error, meta?: Record<string, unknown>): void;
error(message: string, err?: unknown, meta?: Record<string, unknown>): void;
debug(message: string, meta?: Record<string, unknown>): void;
}
  • Расположение логов: {userData}/logs/
  • Политика ротации: daily-rotate-file, хранение 14 дней
  • Формат: JSON + timestamp

SecurityService / CryptoService

{/* Core encryption service interface */}
class SecurityService {
encrypt(plaintext: string): string;
decrypt(ciphertext: string): string;
}

class CryptoService {
deriveKey(password: string, salt: Buffer): Buffer;
encrypt(data: string, key: Buffer): EncryptedData;
decrypt(data: EncryptedData, key: Buffer): string;
}

AppPaths

Централизованно управляет всеми путями директорий приложения:

СвойствоПутьНазначение
userData{appData}/elftia/Корень данных приложения
dbPath{userData}/elftia.dbБаза данных SQLite
configDir{userData}/config/Директория конфигурационных файлов
resourcesDir{userData}/resources/Media-ресурсы
diagnosticsDir{userData}/diagnostics/Диагностические данные
logsDir{userData}/logs/Лог-файлы

Связанные файлы

ФайлОписание
packages/desktop/app/main/index.tsВход main process; создание и запуск всех сервисов
packages/desktop/app/main/services/routers/index.tsЦентр регистрации маршрутов, registerAllRouters()
packages/desktop/app/main/services/routers/BaseRouter.tsБазовый класс Router
packages/desktop/app/main/ipc/safe-handle.tsЗащитная IPC-обертка secureHandle
packages/desktop/app/main/workers/DbClient.tsКлиент Database Worker
packages/desktop/app/main/workers/db.worker.tsРеализация Database Worker
packages/desktop/app/main/workers/types.tsОпределения типов Worker RPC
packages/desktop/app/main/services/infra/logger/LoggerService.tsСервис логирования
packages/desktop/app/main/services/platform/security/SecurityService.tsСервис шифрования
packages/desktop/app/main/services/infra/paths/paths.tsУправление путями
packages/desktop/app/main/services/agent-core/engine/EngineDispatcher.tsДиспетчер движков