# Запуск и триггеры (/ru/docs/flows/running-and-triggers)

Сценарий запускается, когда что-то его начинает: вы кнопкой **Запустить**; ИИ-агент, когда вы предлагаете сценарий как
инструмент; расписание; вебхук; или `echolot flow run` в терминале или CI. Что бы ни запускало сценарий, каждый запрос
идёт тем же путём, что и отправка со страницы запроса.

## Запуск вручную [#run-by-hand]

1. Откройте сценарий на странице «Сценарии».
2. Нажмите **Запустить** на панели инструментов или <kbd>⌘</kbd><kbd>R</kbd>.
3. Если у сценария есть [входы](/docs/flows#inputs-and-outputs), лист **Запустить** с именем сценария запрашивает их.
   В каждом поле показаны имя входа, тип и обязательность, а начальное значение — это значение по умолчанию. Оставьте
   поле пустым, чтобы использовать значение по умолчанию, и нажмите **Запустить**.

Сначала сценарий сохраняется, так что запуск использует то, что на холсте. Он выполняется с активным
[окружением](/docs/workspaces/environments) окна. **Запустить** недоступна, пока в сценарии есть ошибки; её подсказка
говорит «Сначала исправьте проблемы сценария».

Когда активно [защищённое окружение](/docs/workspaces/protected-environments), кнопка называется
**Запустить (Production)…** (с именем этого окружения), и Echolot один раз спрашивает подтверждение перед запуском. Запросы внутри
запуска больше не спрашивают.

### Вид запуска [#the-run-view]

Пока сценарий выполняется, его блоки показывают своё состояние на холсте, а под ним открывается журнал запуска:

| На холсте | Значение |
| --- | --- |
| Рамка акцентного цвета | Блок выполняется или ждёт вас. |
| Зелёная рамка | Блок завершился. |
| Красная рамка | Блок завершился с ошибкой. |

В журнале запуска по порядку перечислено:

- каждый блок по мере завершения, с его временем;
- строки из блоков «Журнал» и `console.log` в блоках «Вычислить»;
- результаты тестов из блоков «Проверить» и `pm.test`, с числом пройденных и всех тестов (**Тесты**) в заголовке;
- ошибки красным;
- чем закончился запуск: `Finished in 1.2 s`, `Stopped in …` или `Failed in …` с причиной.

Нажмите на строку, чтобы выбрать её блок. Выберите любой блок, чтобы увидеть его **Последний запуск** в инспекторе с
его значениями **Входные данные** и **Результат** по портам. **Очистить** очищает журнал и состояния на холсте; кнопка
закрытия скрывает журнал, а **Журнал запусков** на панели инструментов показывает его снова.

**Остановить** (<kbd>⌘</kbd><kbd>.</kbd>) занимает место **Запустить**, пока идёт запуск. Она завершает запуск, закрывает
запрос, находящийся в пути, и убирает любой вопрос с экрана.

Если запуск завершился с ошибкой и доступна встроенная модель Mac, кнопка в заголовке журнала объясняет сбой по журналу.

### Прежние запуски [#earlier-runs]

Окно хранит последние 20 запусков открытого сценария, включая запуски, начатые расписанием или вебхуком. Они перечислены
в **Запуски** на боковой панели (с тем, чем закончился каждый, когда начался и сколько длился) и в меню **Запуски** на
панели инструментов. Нажмите на один из них, чтобы снова показать его на холсте: состояния блоков и
**Последний запуск** каждого блока. **Очистить холст** в меню **Запуски** убирает их с холста.

Записи о запусках остаются в окне. Запросы, которые отправляет сценарий, попадают в [историю](/docs/workspaces/history)
рабочего пространства, как любая другая отправка.

## Триггеры [#triggers]

Выберите блок **Старт**, чтобы увидеть **Триггеры** сценария в инспекторе. **Кнопка «Запустить» и `echolot flow run`**
включена всегда. Отметьте остальные, чтобы добавить их:

- **Агенты (MCP-инструмент)**
- **Расписание**
- **Вебхук**

На блоке «Старт» отображается небольшой значок для каждого включённого триггера, а боковая панель показывает их под
именем сценария.

<Shot id="flows-triggers-start" alt="Инспектор блока «Старт» сценария Order status on webhook: раздел «Триггеры» с отмеченным «Вебхук», метод POST и путь /order-status, локальный адрес с «Скопировать URL» и «Скопировать токен», а также «Разрешено» с «Отозвать»" />

### Разрешение триггера [#allow-a-trigger]

Агенты, расписания и вебхуки запускают сценарии, когда вас нет у холста, поэтому каждому из них нужно ещё и ваше
разрешение для этого сценария. Под каждым отмеченным триггером нажмите **Разрешить**. Тогда триггер показывает
**Разрешено** и кнопку **Отозвать**.

Разрешение выдаётся на сценарий в его нынешнем виде: сам сценарий, запросы, которые он отправляет, вместе с папками над
ними, переменные, авторизация, прокси и сертификаты рабочего пространства и сценарии, которые он запускает. Измените
что-либо из этого, на холсте, в Git или с помощью агента, и триггер перестаёт работать, пока вы не разрешите его снова.
Тогда он пишет «Сценарий изменился с тех пор, как вы его разрешили.» и предлагает **Разрешить снова**. Сценарий не может
разрешить сам себя: разрешение хранится в Echolot на вашем Mac, а не в рабочем пространстве. Сценарий с ошибками никогда
не запускается от триггера.

Изменения значений окружения (например, свежий токен) разрешение не отзывают.

### Агенты: сценарий как MCP-инструмент [#agents-a-flow-as-an-mcp-tool]

Предложите сценарий ИИ-агентам, и он станет одним инструментом MCP-сервера Echolot: агент вызывает один инструмент,
сценарий выполняет запросы, а секреты остаются в Echolot.

1. Выберите блок «Старт» и отметьте **Агенты (MCP-инструмент)**.
2. **Имя инструмента** — это `flow_` и имя файла сценария с подчёркиваниями (`flow_place_test_order`), пока вы не
   введёте другое: до 64 букв, цифр, `_` и `-`.
3. Напишите **Что делает инструмент** — для модели. Сначала там стоит описание сценария.
4. Нажмите **Разрешить**.
5. Включите **Настройки › Агенты** и подключите своего клиента. См. [ИИ-агенты](/docs/ai/agents).

Аргументы инструмента — это входы сценария, а его результат — то, что получил блок «Результат». **Place a test order**
предложен как `place_test_order`. Сценарий появляется в списке инструментов, пока включён набор инструментов
**Сценарии** (по умолчанию он включён). Агенты могут запускать только сценарии, которые предложены и разрешены.

Когда агент запускает сценарий, Echolot один раз спрашивает вас перед запуском и показывает, что сценарий сделает: какие
запросы отправит на какие адреса, какие переменные и секреты сохранит, какие файлы запишет, какие инструменты и
сценарии запустит и где спросит человека. Внутри запуска то, что вы одобрили, выполняется без повторных вопросов;
защищённые окружения, новые хосты и удаления всё равно спрашивают, как и всё, что отклоняют собственные правила агента.

Блоки группы «Люди» в сценарии, который запустил агент, обращаются к клиенту агента: он показывает сообщение, код и
ссылку или запрашивает значения. Блок «Одобрить» всегда за вами: когда агент отвечает на него, Echolot сначала
спрашивает вас.

[Ассистент](/docs/ai/assistant) запускает сценарии так же.

### Расписание [#schedule]

Запускайте сценарий сам, каждые столько-то минут или по календарю.

1. Выберите блок «Старт» и отметьте **Расписание**. Начальное значение — каждые 60 минут.
2. Выберите **Интервал** и заполните **Каждые** … **мин** либо выберите **Задать время (cron)** и введите строку cron
   (минута, час, день, месяц, день недели). Расписание бывает либо одно, либо другое и запускается не чаще раза в
   минуту.
3. Нажмите **Разрешить**.

После разрешения инспектор показывает **Следующий запуск** с датой и временем. Запуски по расписанию происходят, пока
открыто окно рабочего пространства, с активным окружением окна на момент запуска и начинаются со значений входов по
умолчанию. Запуск, пропущенный, пока Mac спал или окно было закрыто, выполняется один раз, когда Echolot в следующий раз
посмотрит; сценарий, который ещё выполняется, повторно не запускается. Неудавшийся запуск по расписанию показывает
уведомление. Чтобы выполнять расписания без приложения, используйте [`echolot flow serve`](#run-from-the-command-line).

Строки cron состоят из пяти полей в часовом поясе вашего Mac: минута (0–59), час (0–23), день месяца (1–31), месяц (1–12
или `jan`–`dec`) и день недели (0–7 или `sun`–`sat`; 0 и 7 — воскресенье). В каждом поле допустимы `*`, числа, диапазоны
(`1-5`), списки (`1,15`) и шаги (`*/15`, `8-18/2`). Если ограничены и день, и день недели, достаточно совпадения любого
из них.

| Строка cron | Когда запускается |
| --- | --- |
| `0 6 * * *` | Каждый день в 6:00 (**Morning stock check**). |
| `0 7 * * 1-5` | По будням в 7:00. |
| `*/15 8-18 * * *` | Каждые 15 минут с 8:00 до 18:45. |
| `0 9 1 * *` | Первого числа каждого месяца в 9:00. |

Блоки группы «Люди» не могут никого спросить во время запуска по расписанию, поэтому там они завершаются ошибкой.

### Вебхук [#webhook]

Запускайте сценарий, когда что-то отправляет запрос на локальный адрес.

1. Выберите блок «Старт» и отметьте **Вебхук**.
2. Выберите метод (`GET`, `POST`, `PUT`, `PATCH` или `DELETE`; по умолчанию `POST`) и путь, начинающийся с `/`. Сначала
   путь — это `/` и имя файла сценария.
3. Нажмите **Разрешить**.

После разрешения инспектор показывает адрес, например `POST http://127.0.0.1:52817/order-status`, с кнопками
**Скопировать URL** и **Скопировать токен**. Echolot слушает только на этом Mac (127.0.0.1), пока окно открыто. Порт
выбирается один раз для рабочего пространства и сохраняется.

Вызывающие должны отправлять токен рабочего пространства, который Echolot создаёт при первом включении и хранит в связке
ключей. Подойдёт любой из вариантов:

- заголовок `Authorization: Bearer <token>`;
- заголовок `X-Echolot-Token: <token>`;
- параметр запроса `?token=<token>`.

```sh
curl -X POST http://127.0.0.1:52817/order-status \
  -H "Authorization: Bearer <token>"
```

**Order status on webhook** входит в систему, получает заказ и отвечает им. Запрос и ключи JSON-тела заполняют входы
сценария с теми же именами; другие ключи отбрасываются. Вход с именем `body` получает всё тело. Так сценарий со входом
`order` принимает `?order=ord_7Hk2Lw` или `{"order": "ord_7Hk2Lw"}`. Запуск использует активное окружение окна.

| Ответ | Когда |
| --- | --- |
| `200` с результатом в JSON | Запуск пройден. Тело — то, что получил блок «Результат», или `null`. |
| `401` | Токен отсутствует или неверен. |
| `404` | Ни один разрешённый сценарий не отвечает на этот метод и путь; в ошибке перечислены те, что отвечают. |
| `413` | Тело больше 8 МБ. Сценарий не запускается. |
| `500` | Запуск завершился ошибкой. В теле есть `error` и ID запуска. |
| `503` | Запуск был остановлен. |

Запуск по вебхуку останавливается через две минуты. Блоки группы «Люди» не могут там никого спросить, поэтому
завершаются ошибкой.

## Фоновые запуски [#background-runs]

Запуски, которые начинают расписания и вебхуки в приложении, появляются в **Запуски** сценария, пока он открыт, а
неудавшийся показывает уведомление macOS с именем сценария и ошибкой. Они выполняются с вашими полномочиями, как запуск,
который вы начинаете сами, но только для сценариев, которые вы разрешили.

## Запуск из командной строки [#run-from-the-command-line]

Команда `echolot` запускает те же сценарии без приложения. В CI именно так сценарий становится условием выпуска.

```sh
# List the flows, their inputs and problems
echolot flow list -w Alpenglow.echolot

# Run one; exits with an error when the run or one of its tests fails
echolot flow run morning-stock-check -w Alpenglow.echolot --env staging --no-input

# Pass inputs as name=value (a flow made from the Paginate and export template)
echolot flow run export-products -w Alpenglow.echolot --input pages=5

# Run schedules and answer webhooks until Ctrl-C
echolot flow serve -w Alpenglow.echolot --port 4100
```

- `flow run` печатает каждый блок по мере завершения, затем результат. `--json` вместо этого печатает запись о запуске.
  Блоки группы «Люди» спрашивают в терминале; с `--no-input` они завершают запуск ошибкой, что и нужно CI. Блоки
  «Уведомить» печатают свой текст.
- `flow serve` запускает сценарии по расписанию, когда подходит время, и отвечает на вебхуки на порту 4100 (`--port 0`
  выбирает свободный). `--share` слушает на всех сетевых интерфейсах, для контейнеров. Токен берётся из `--token`, иначе
  из `ECHOLOT_WEBHOOK_TOKEN`, иначе создаётся новый и печатается.
- В командной строке вы запускаете сами, так что сценариям не нужно **Разрешить**: `flow serve` выполняет каждый сценарий
  с расписанием или вебхуком и без ошибок.

Все параметры описаны в [echolot flow](/docs/cli/flow).

<Edition only="direct">
  Инструмент командной строки входит в загрузку с сайта (**Echolot › Установить инструмент командной строки…**). В
  редакции для App Store установите его отдельно из архива на странице релизов.
</Edition>
