Инструменты

sequenceDiagram
    participant A as Agent
    participant Bus
    participant TUI
    participant T as Tool

    A->>Bus: ToolCall{id, name, args}
    Bus->>TUI: ToolCallMsg
    Note over TUI: карточка инструмента в чате

    alt Требует approval (не YOLO)
        A->>Bus: ToolApprovalRequest{corrID, name, args}
        Bus->>TUI: ApprovalRequestMsg
        TUI->>TUI: очередь аппрувов
        TUI->>Bus: ToolApprovalResponse{corrID, approved, scope}
        Bus->>A: ответ
    end

    alt Долгая операция (terminal)
        A->>Bus: ToolStatus{running}
        T->>Bus: TerminalNewRunning{cmd}
        Bus->>TUI: TerminalNewRunningMsg
        loop Вывод
            T->>Bus: TerminalAppendString{delta}
            Bus->>TUI: TerminalAppendStringMsg
        end
        T->>Bus: TerminalCompleted{exitCode}
    end

    T-->>A: Result
    A->>Bus: ToolResult{id, name, display}
    Bus->>TUI: ToolResultMsg
    Note over TUI: карточка → done с результатом

Карточка инструмента появляется в чате. display — человекочитаемое описание ("read path: foo.go").

Результат выполнения инструмента. Карточка помечается как done.

Изменение состояния: pendingrunningdone / error.

Запрос подтверждения пользователя. Блокирует выполнение инструмента до ответа.

subagentSessionID — если запрос от сабагента, relay переотправляет с parentSessionID чтобы TUI увидел его.

Ответ пользователя. scope определяет длительность решения:

Scope Действует
"" (one-shot) Только этот вызов
"session" Вся сессия
"subagent" Все вызовы этого сабагента
"server" Все вызовы этого MCP-сервера

Команда запущена. TUI открывает окно терминала в сайдбаре.

Инкрементальный вывод команды. Текст накапливается в окне терминала.

Команда завершена. Окно терминала помечается как done.

Все три публикуются в TopicTerminalStream.