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

Система инструментов

Система инструментов TinyElf управляется через ToolRegistry, отвечающий за регистрацию и выполнение инструментов. Компонент TinyElfToolRegistryBuilder отвечает за сборку полного набора инструментов при запуске сессии. Каждый инструмент реализует интерфейс ITool.

Процесс регистрации инструментов

graph TB
Builder["TinyElfToolRegistryBuilder<br/>buildToolRegistry()"] --> Reg["ToolRegistry"]

Builder -->|"1. FileSystem"| FS["createFileSystemTools()<br/>Read, Write, Edit, ListDir, Glob, Grep"]
Builder -->|"2. Shell"| Shell["ShellTool<br/>Bash"]
Builder -->|"3. Web Search"| WS["setupWebSearch()<br/>WebSearch / NativeSearch"]
Builder -->|"4. Web Fetch"| WF["createWebFetchTool()<br/>WebFetch + summarizer"]
Builder -->|"5. Skills"| SK["SkillsTool + ReadSkillTool<br/>list_skills, read_skill"]
Builder -->|"6. SkillHub"| SH["SkillHubSearchTool + InstallTool<br/>skillhub_search, skillhub_install"]
Builder -->|"7. Sub-Agent"| SA["SpawnTool<br/>spawn_agent"]
Builder -->|"8. Sub-Agent Query"| SAQ["SubagentListTool + StatusTool"]
Builder -->|"9. Slash Command"| CMD["SlashCommandTool<br/>slash_command"]
Builder -->|"10. MCP"| MCP["loadMcpTools() + loadDirectMcpTools()<br/>mcp__*"]
Builder -->|"11. Session"| SS["SessionsSpawn/List/Send/History"]
Builder -->|"12. Control"| Ctrl["NotifyTool + SessionsYieldTool"]

FS --> Reg
Shell --> Reg
WS --> Reg
WF --> Reg
SK --> Reg
SH --> Reg
SA --> Reg
SAQ --> Reg
CMD --> Reg
MCP --> Reg
SS --> Reg
Ctrl --> Reg

Интерфейс ITool

interface ITool {
readonly name: string; // уникальное имя инструмента (используется при function_calling)
readonly description: string; // описание, читаемое LLM
readonly parameters: JsonSchema; // определение параметров в формате JSON Schema
execute(params: Record<string, unknown>): Promise<string>;
}

ToolRegistry

class ToolRegistry {
register(tool: ITool): void;
registerAll(tools: ITool[]): void;
unregister(name: string): boolean;
get(name: string): ITool | undefined;
has(name: string): boolean;
getAll(): ITool[];
getNames(): string[];
getDefinitions(): ToolDefinition[]; // формат OpenAI function_calling
createFiltered(allowedNames: string[]): ToolRegistry;
execute(toolCallId, toolName, params): Promise<ToolCallResult>;
}

Процесс выполнения

  1. Поиск инструмента → возврат ошибки, если не найден (с перечнем доступных инструментов)
  2. Преобразование типов параметров → обработка распространённых ошибок типов LLM (string → number и т.д.)
  3. Проверка обязательных параметров → возврат ошибки при отсутствии
  4. Вызов tool.execute(params)
  5. Усечение вывода → обрезка при превышении maxChars (по умолчанию 50 КБ) с добавлением метки (truncated)
  6. Добавление подсказки к выводу ошибки → [Analyze the error above and try a different approach.]

Фильтрация инструментов

createFiltered() создаёт новый экземпляр ToolRegistry, содержащий только разрешённые инструменты. Используется для:

  • Режима plan, ограниченного инструментами только для чтения
  • Поля allowedTools в конфигурации агента
  • Метаданных allowed-tools у Slash-команд

Полная таблица инструментов

Инструменты файловой системы

ИнструментКлассЧувствительностьПараметрыОписание
ReadReadFileToolБезопасныйpath, offset?, limit?Чтение содержимого файла, поддерживает частичное чтение
WriteWriteFileToolЧувствительныйpath, contentЗапись файла (создание или перезапись)
EditEditFileToolЧувствительныйpath, old_string, new_string, replace_all?Точная замена строки
ListDirListDirToolБезопасныйpathПросмотр содержимого директории
GlobGlobToolБезопасныйpattern, path?Поиск файлов по шаблону имени
GrepGrepToolБезопасныйpattern, path?, include?Поиск по содержимому файлов

Особенности инструментов файловой системы:

  • Песочница путей: все пути разрешаются относительно корня рабочего пространства
  • Параметр restrictToWorkspace управляет доступом за пределами рабочего пространства
  • Read автоматически усекает большие файлы (>128 КБ); для файлов >10 МБ требуется указать offset/limit

Инструмент командной оболочки

ИнструментКлассЧувствительностьПараметрыОписание
BashShellToolЧувствительныйcommandВыполнение команды оболочки

Функции безопасности инструмента Shell:

  • Чёрный список команд (критически запрещённые шаблоны): rm -rf /, format, mkfs, diskpart и др.
  • Предупреждения о высокорисковых командах: sudo, curl | sh, изменение прав доступа
  • Обнаружение путей за пределами рабочего пространства
  • Ограничение вывода: 100 КБ
  • Тайм-аут: по умолчанию 2 минуты, настраивается через execTimeout

Веб-инструменты

ИнструментКлассЧувствительностьПараметрыОписание
WebSearchWebSearchServiceToolБезопасныйquery, count?Веб-поиск
WebFetchWebFetchToolБезопасныйurl, prompt?, raw?Получение веб-содержимого

Особенности WebFetch:

  • Используется Readability для извлечения текста статьи
  • Преобразование HTML → Markdown (Turndown)
  • Содержимое объёмом более 4 КБ автоматически суммируется с помощью фоновой модели
  • Тайм-аут 30 секунд, максимальный ответ 5 МБ

Трёхуровневый резерв веб-поиска:

  1. Нативный поиск (встроенный в Anthropic/OpenAI/Gemini/xAI)
  2. WebSearchService (Tavily/Jina/Searxng)
  3. Недоступен

Инструменты суб-агентов

ИнструментКлассЧувствительностьПараметрыОписание
spawn_agentSpawnToolЧувствительныйprompt, agent?, model?, background?, maxIterations?, permissionMode?, tools?Запуск суб-агента
subagent_listSubagentListToolБезопасныйНетСписок активных суб-агентов
subagent_statusSubagentStatusToolБезопасныйrunIdЗапрос статуса суб-агента

Инструменты сессий

ИнструментКлассЧувствительностьПараметрыОписание
SessionsSpawnSessionsSpawnToolЧувствительныйprompt, agentId?, title?Создание новой сессии
SessionsListSessionsListToolБезопасныйlimit?, offset?Список сессий
SessionsSendSessionsSendToolЧувствительныйsessionId, messageОтправка сообщения в сессию
SessionsHistorySessionsHistoryToolБезопасныйsessionId, limit?Просмотр истории сессии
SessionsYieldSessionsYieldToolБезопасныйmessageЗавершение цикла агента и возврат сообщения

Инструменты Skills

ИнструментКлассЧувствительностьПараметрыОписание
list_skillsSkillsToolБезопасныйНетСписок всех доступных навыков
read_skillReadSkillToolБезопасныйnameЧтение содержимого навыка
skillhub_searchSkillHubSearchToolБезопасныйqueryПоиск навыков сообщества
skillhub_installSkillHubInstallToolБезопасныйskillIdУстановка навыка из сообщества

MCP-инструменты

ИнструментКлассЧувствительностьПараметрыОписание
mcp__<server>__<tool>Генерируется динамическиЧувствительныйОпределяются MCP-серверомВнешние MCP-инструменты

MCP-инструменты загружаются тремя способами:

  1. User MCP (mcpServerIds) — подключение пользовательских stdio/http/sse серверов из Настройки → MCP через McpService
  2. Built-in MCP (автосборка через McpProviderRegistry) — все встроенные MCP-обработчики выполняются в процессе, обёрнуты SDK через createSdkMcpServer, TinyElf регистрирует их как ITool, CLI обращается через центральный HTTP-мост BuiltinMcpHttpServer. Видимые MCP каждого агента определяются методом isEligible(ctx) провайдера (поле builtinMcpServers в конфигурации агента удалено в cleanup-legacy-mcp (2026-05-19))
  3. Direct MCP (directMcpServers) — предварительно разобранные stdio MCP, объявленные в конфигурации агента (пользовательские сценарии, например вызов локальных Python-инструментов)

Управляющие инструменты

ИнструментКлассЧувствительностьПараметрыОписание
NotifyNotifyToolБезопасныйtitle, body?Отправка десктопного уведомления
slash_commandSlashCommandToolБезопасныйcommand, args?Выполнение Slash-команды

Классификация инструментов по чувствительности

private static readonly SAFE_TOOLS = new Set([
'Read', 'ListDir', 'Glob', 'Grep',
'WebSearch', 'WebFetch',
'list_skills', 'read_skill',
'Notify', 'SessionsYield', 'SessionsHistory',
]);

Правила классификации:

  • Присутствует в SAFE_TOOLS → никогда не требует подтверждения
  • В режиме acceptEdits инструменты Write и Edit тоже не требуют подтверждения
  • Все остальные инструменты (включая MCP) → требуют подтверждения

Наследование инструментов

Суб-агенты могут наследовать часть инструментов от родительского агента:

const inheritableToolNames = new Set([
'list_skills', 'read_skill', 'slash_command'
]);
// + все MCP-инструменты, имя которых начинается с mcp__

Ключевые файлы

ФайлПутьОписание
Интерфейс ITooltinyelf/tools/ToolInterface.tsБазовый интерфейс инструмента
ToolRegistrytinyelf/tools/ToolRegistry.tsРеестр инструментов
ToolRegistryBuildertinyelf/TinyElfToolRegistryBuilder.tsСтроитель инструментов
FileSystemToolstinyelf/tools/FileSystemTools.tsИнструменты файловой системы
ShellTooltinyelf/tools/ShellTool.tsИнструмент командной оболочки
WebToolstinyelf/tools/WebTools.tsWebFetch
WebSearchServiceTooltinyelf/tools/WebSearchServiceTool.tsWebSearch
SpawnTooltinyelf/tools/SpawnTool.tsИнструмент суб-агента
SessionToolstinyelf/tools/SessionTools.tsИнструменты управления сессиями
SkillsTooltinyelf/tools/SkillsTool.tsИнструмент навыков
SkillHubToolstinyelf/tools/SkillHubTools.tsИнструменты SkillHub
McpToolAdaptertinyelf/tools/McpToolAdapter.tsАдаптер MCP-инструментов
NotifyTooltinyelf/tools/NotifyTool.tsИнструмент уведомлений
YieldTooltinyelf/tools/YieldTool.tsИнструмент завершения цикла
SubagentToolstinyelf/tools/SubagentTools.tsИнструменты запроса суб-агентов
SlashCommandTooltinyelf/tools/SlashCommandTool.tsSlash-команды

Все пути указаны относительно packages/desktop/app/main/services/agent-core/engine/.

Точки расширения

  • Новый инструмент: реализовать интерфейс ITool → зарегистрировать в TinyElfToolRegistryBuilder
  • Изменить чувствительность: добавить/удалить из набора TinyElfAgentLoop.SAFE_TOOLS
  • Пользовательское наследование инструментов: изменить набор inheritableToolNames
  • Загрузка MCP-инструментов: адаптировать новый транспорт MCP через McpToolAdapter

Связанные модули

МодульПутьСвязь
TinyElfAgentLooptinyelf/TinyElfAgentLoop.tsВызывает выполнение инструментов
ExecutionFirewallplatform/security/ExecutionFirewall.tsПроверка путей инструментов файловой системы
McpServicecapabilities/tools/mcp-users/McpService.tsИсточник MCP-инструментов
SkillsLoadertinyelf/skills/SkillsLoader.tsЗависимость инструмента навыков
SubagentManagertinyelf/tools/SpawnTool.tsЗависимость spawn_agent