Echolot
Справочник

Файлы рабочего пространства

Формат рабочего пространства по файлам и по ключам — чтобы читать диффы, писать файлы вручную и генерировать их.

Рабочее пространство — это папка с расширением .echolot с обычными файлами TOML внутри: по одному на запрос, окружение, MCP-сервер, мок и сценарий. В Finder оно выглядит как один документ; в Терминале, Git и вашем редакторе это обычная папка. Echolot каждый раз записывает каждый файл одинаково (ключи в фиксированном порядке, значения по умолчанию не пишутся), поэтому изменение в приложении даёт небольшое изменение в диффе. См. Git и команды.

Alpenglow.echolot/
  workspace.toml                     рабочее пространство: ID, название, переменные, авторизация, агенты, прокси, сертификаты
  environments/
    staging.toml                     одно окружение
  requests/
    _folder.toml                     порядок верхнего уровня
    _folder.pre.js                   скрипт рабочего пространства перед запросом (и _folder.test.js)
    auth/
      _folder.toml                   папка: название, порядок, документация, переменные, авторизация
      sign-in.req.toml               HTTP-запрос
      sign-in.body.json              его тело
      sign-in.pre.js                 его скрипт перед запросом
      sign-in.test.js                его тестовый скрипт
    catalog/
      search-products.gql.toml       запрос GraphQL
      search-products.graphql        его запрос на языке GraphQL
  mcp-servers/
    alpenglow-mcp.toml               MCP-сервер
  specs/
    alpenglow.yaml                   документ OpenAPI
    shop.graphql                     схема GraphQL
    inventory.proto                  файл protobuf
  mocks/
    shop.toml                        мок-сервер: настройки и маршруты
    shop.js                          его маршруты на JavaScript
  flows/
    place-test-order.flow.toml       сценарий
  assistant/
    checking-orders.md               общий разговор с Ассистентом, для чтения
    checking-orders.json             он же, чтобы открыть в приложении

Правила для каждого файла

  • Файлы — TOML 1.0 в кодировке UTF-8.
  • Каждый начинается с echolot = 1 — версии формата. Файл с большим номером сохранён более новым Echolot; об этом Echolot сообщает вместо того, чтобы открыть его.
  • Имена файлов — slug: строчные буквы, цифры и дефисы, не более 80 символов, составленные из названия элемента (Sign in превращается в sign-in). Само название хранится в ключе name.
  • Пути между элементами — это их slug, соединённые через /, относительно requests/: auth/sign-in, orders.
  • Текстовые поля могут содержать {{variables}} и динамические значения.
  • Списки сущностей — массивы таблиц TOML ([[headers]]). Всё, у чего enabled = false, сохраняется, но выключено; без этого ключа включено.

Что никогда не попадает в файлы

  • Секретные значения. Секретная переменная записывается по имени с secret = true и без значения; значение хранится в Связке ключей на вашем Mac. В полях, где нужен секрет (пароль, пароль прокси, секрет клиента), должна стоять {{variable}}, которая является секретом. Echolot предлагает перенести введённый вами пароль в Связку ключей, а при импорте делает это сам. См. секреты.
  • Токены OAuth и входы в MCP: в Связке ключей.
  • Значения, которые скрипты задают через pm.environment.set и подобное: они живут, пока открыто окно или выполняется команда.
  • История и ответы: в Application Support на вашем Mac, по одной истории на рабочее пространство. См. историю.
  • Ваша собственная раскладка: расположение областей и их размеры, открытые вкладки, выбранное вами окружение.

Поэтому рабочее пространство можно безопасно коммитить и передавать. Каждый участник команды задаёт свои секретные значения сам.

workspace.toml

# Echolot workspace. Requests live in requests/, one file each.
echolot = 1
id = "0b7d4c1e-2f6a-4e38-9c51-7a1e3d9b5f20"
name = "Alpenglow"

[[variables]]
name = "baseURL"
value = "https://demo.echolot.dev/v1"

[[variables]]
name = "token"
secret = true
КлючЧто значит
idID рабочего пространства. Секреты в Связке ключей принадлежат ему, поэтому копии с тем же ID используют их совместно. Экспортированная копия получает новый ID.
nameНазвание рабочего пространства.
[[variables]]Переменные рабочего пространства. См. переменные.
[auth]Авторизация для каждого запроса, который её наследует. См. авторизацию. По умолчанию её нет.
[agents]Правила для ИИ-агентов. См. агентов.
[proxy]Собственный прокси рабочего пространства вместо прокси приложения.
[[certificates]]Сертификаты CA, которым нужно доверять, и клиентские сертификаты, которые нужно отправлять, по хостам.

Прокси

КлючЧто значит
modemanual (по умолчанию), system, environment (семейство HTTPS_PROXY) или none.
urlПрокси: http://host:port, https://… или socks5://host:port.
username, passwordУчётные данные для прокси. Пароль записывайте как секретную {{variable}}.
bypassХосты, к которым обращаться напрямую, массивом.

Сертификаты

Каждая таблица [[certificates]] — правило для одного хоста:

КлючЧто значит
hostХост, для которого это правило.
trustФайлы PEM с сертификатами CA, которым нужно доверять, массивом.
certificateКлиентский сертификат: файл PEM или файл .p12/.pfx.
keyКлюч PEM клиентского сертификата, если в файле сертификата его нет.
passphraseПарольная фраза ключа или файла PKCS#12. Записывайте её как секретную {{variable}}.

Агенты

[agents] задаёт, что ИИ-агентам разрешено делать в этом рабочем пространстве через MCP-сервер Echolot и Ассистента. См. агентов.

[agents]
allowed-hosts = ["demo.echolot.dev"]
max-requests = 200
max-requests-per-minute = 30

[agents.rules]
unsafe-send = "ask"
destructive = "refuse"
КлючЧто значит
enabledfalse отключает агентов для рабочего пространства: они ничего из него не получают. По умолчанию true.
allowed-hostsХосты, которые считаются собственными для рабочего пространства, помимо тех, что используют его запросы.
max-requestsСколько запросов всего может отправить один сеанс агента.
max-requests-per-minuteСколько запросов в минуту может отправить один сеанс агента.
[agents.rules]Правило для каждого вида действий: allow, ask или refuse.

Виды действий: read, safe-send, unsafe-send, protected-send, new-host, workspace-write и destructive. Более строгое правило действует всегда. Более мягкое действует, только когда вы ему доверитесь (приложение спросит; командной строке нужен --trust-workspace-policy). Для protected-send и new-host нельзя задать allow.

environments/

По одному файлу на окружение; имя файла — его slug, который используется в --env.

echolot = 1
name = "Production"
protected = true

[[variables]]
name = "baseURL"
value = "https://api.alpenglow.example/v1"

[[variables]]
name = "password"
secret = true
КлючЧто значит
nameНазвание окружения.
protectedtrue делает его защищённым окружением: каждая отправка сначала спрашивает разрешения.
[[variables]]Его переменные.

Переменные

Одинаково в workspace.toml, окружениях, папках и запросах:

КлючЧто значит
nameИмя переменной, используется как {{name}}.
valueЕё значение. У секрета не пишется.
secrettrue для секрета: значение хранится в Связке ключей.
enabledfalse отключает её.

requests/

В папке requests лежит дерево, которое вы видите в боковой панели. Каждая вложенная папка — папка дерева, каждый файл запроса — запрос. Вид запроса определяется суффиксом файла:

СуффиксВид
.req.tomlHTTP, включая Server-Sent Events
.gql.tomlGraphQL
.grpc.tomlgRPC
.ws.tomlWebSocket
.sio.tomlSocket.IO
.mqtt.tomlMQTT
.mcp.tomlВызов MCP-сервера

Рядом с запросом, с тем же slug:

ФайлЧто в нём
<slug>.body.<ext>Тело запроса в его собственном формате: .json, .xml, .txt, .html, .graphql или .form.txt.
<slug>.graphqlЗапрос GraphQL-запроса.
<slug>.pre.jsСкрипт перед запросом.
<slug>.test.jsТестовый скрипт.

_folder.toml

Он есть у каждой папки, а также у самой requests/ — для верхнего уровня.

echolot = 1
name = "Auth"
order = ["sign-in", "who-am-i", "client-credentials"]
docs = "Send \"Sign in\" first: it captures the access token into {{token}}."
КлючЧто значит
nameНазвание папки. В requests/_folder.toml его нет.
orderSlug содержимого папки в том порядке, который используют боковая панель и прогоны. Всё, что не перечислено, идёт следом, по slug.
docsДокументация папки в Markdown.
specСпецификация, которой следует папка, например specs/alpenglow.yaml.
spec-urlОткуда эта спецификация загружается, если она пришла по URL.
agent-toolstrue предлагает запросы папки агентам как инструменты.
[[variables]]Переменные папки, для всего, что в ней.
[auth]Авторизация папки для всего, что в ней и наследует её. По умолчанию — наследовать.

Рядом _folder.pre.js и _folder.test.js — скрипты папки; в requests/ это скрипты рабочего пространства. Они выполняются для каждого запроса внутри, от скрипта рабочего пространства вниз до собственного скрипта запроса. У папки, которая следует спецификации, есть ещё _spec-lock.json — то, что она в последний раз взяла из спецификации; пусть им занимается Echolot.

Ключи любого запроса

echolot = 1
name = "Sign in"
method = "POST"
url = "{{baseURL}}/auth/token"

[body]
syntax = "json"
file = "sign-in.body.json"

[[headers]]
name = "Content-Type"
value = "application/json"

[[assertions]]
target = "status"
check = "equals"
expected = "200"

[[captures]]
variable = "token"
from = "json"
path = "$.access_token"
scope = "workspace"
secret = true
КлючЧто значит
nameНазвание запроса.
urlURL вместе со строкой запроса. Есть у всех видов, кроме вызовов MCP.
docsДокументация запроса в Markdown.
spec-operationОперация спецификации, из которой он создан, например POST /auth/token.
[[headers]]name, value и enabled = false для выключенного заголовка.
[[disabled-params]]Выключенные параметры запроса: name, value. Включённые находятся в URL.
[[disabled-form-fields]]Выключенные поля формы: name, value.
[[variables]]Собственные переменные запроса.
[[assertions]]Его проверки.
[[captures]]Значения, которые он сохраняет в переменные после каждого ответа.
[auth]Его авторизация. По умолчанию наследуется от папки.
[settings]Настройки, отличающиеся от настроек приложения.

HTTP-запросы (.req.toml)

КлючЧто значит
methodМетод: GET, POST или любой токен. По умолчанию GET.
[body]Тело; если не указано, тела нет.

Таблица [body] принимает одну из трёх форм:

ФормаКлючи
Текстsyntax: json, xml, text, html, graphql или form (поля формы в URL-кодировке). file: файл тела рядом с запросом.
Файл, передаваемый потоком с дискаstream-from: путь к файлу.
Multipartsyntax = "multipart" и таблица [[body.parts]] на каждую часть: name, затем value (текст) или file (путь), content-type, enabled.

Запросы GraphQL (.gql.toml)

echolot = 1
name = "Search products"
url = "{{baseURL}}/graphql"
operation = "SearchProducts"
schema = "specs/shop.graphql"
query-file = "search-products.graphql"
graphql-variables = """
{
  "text": "ultralight"
}"""
КлючЧто значит
query-fileФайл с запросом рядом с запросом, <slug>.graphql.
operationОперация, которую нужно выполнить, если в запросе их несколько.
graphql-variablesПеременные GraphQL в виде текста JSON. В старых файлах называется variables.
schemaСхема, по которой запрос проверяется и дополняется: файл в specs/.
transportpost (по умолчанию), get или websocket для подписок.
persisted-queriestrue сначала отправляет только SHA-256 запроса, а сам запрос — если сервер его не знает (автоматические сохранённые запросы).
batchtrue отправляет документ с несколькими операциями одним массивом, по записи на операцию.
[[uploads]]Загрузки файлов: variable (переменная, в которую попадает файл) и path.

Запросы gRPC (.grpc.toml)

КлючЧто значит
protoФайл .proto с описанием сервиса, например specs/inventory.proto.
reflectiontrue вместо этого запрашивает рефлексию сервера.
serviceСервис, например alpenglow.inventory.v1.Inventory.
rpcМетод, например Reserve.
messageСообщение в виде текста JSON; для метода с потоком от клиента — массив сообщений.
deadline-msКрайний срок в миллисекундах.
compressiongzip или deflate для отправляемых сообщений.

Запросы WebSocket (.ws.toml)

КлючЧто значит
subprotocolsСубпротоколы, которые нужно предложить, массивом.
[[messages]]Сохранённые сообщения: name, text, enabled.

Запросы Socket.IO (.sio.toml)

КлючЧто значит
versionВерсия Socket.IO на сервере: 4 (по умолчанию), 3 или 2.
pathГде сервер слушает. По умолчанию /socket.io/.
namespaceПространство имён, к которому нужно подключиться, например /support.
socket-authДанные авторизации в виде текста JSON.
[[emits]]Сохранённые события: name, event, arguments (текст JSON), ack = true, чтобы запросить подтверждение, enabled.

Запросы MQTT (.mqtt.toml)

КлючЧто значит
version5 (по умолчанию) или 3.1.1.
client-idID клиента; если пусто, случайный.
clean-startfalse просит брокера сохранить сеанс. По умолчанию true.
keep-aliveСекунд между пингами. По умолчанию 60.
[will]Последняя воля: topic, payload, qos, retain.
[[subscriptions]]filter, qos (по умолчанию 0), no-local, enabled.
[[messages]]Сохранённые сообщения для публикации: name, topic, payload, qos, retain, content-type, enabled.

Имя пользователя и пароль — это авторизация Basic запроса.

Вызовы MCP (.mcp.toml)

echolot = 1
name = "search_catalog"
server = "alpenglow-mcp"
tool = "search_catalog"
arguments = """
{
  "query": "ultralight tent",
  "limit": 3
}"""
КлючЧто значит
serverSlug сервера в mcp-servers/.
tool, resource, prompt или methodЧто вызывать: инструмент по имени, ресурс по URI, промпт по имени или метод JSON-RPC напрямую. Один из них.
argumentsАргументы в виде текста JSON.

Проверки

КлючЧто значит
targetЧто проверяется: status, header, json, body, time (миллисекунды), size (байты), schema (JSON Schema), graphql-errors, mcp-error, mcp-output-schema, openapi, grpc-status.
nameДля header: имя заголовка.
pathДля json: JSONPath, например $.items.length.
checkequals, not-equals, contains, not-contains, less-than, at-most, greater-than, at-least, exists, not-exists, matches (регулярное выражение), is-type, is-one-of, matches-schema.
expectedЗначение для сравнения; для проверок, которым оно не нужно, не пишется.
enabledfalse отключает её.

О том, какие проверки доступны для каждого объекта, см. скрипты и тесты.

Захваты

КлючЧто значит
variableПеременная, в которую сохраняется значение.
fromjson, form, msgpack, xml, header, cookie, status или body.
pathГде находится значение: JSONPath, XPath, имя заголовка или cookie. Не используется для status и body.
scopeenvironment (по умолчанию: активное окружение) или workspace.
secrettrue сохраняет значение как секрет, в Связке ключей.
enabledfalse отключает его.

Ответ с кодом 400 и выше или отсутствующее значение оставляют переменную как была. См. захваты.

Настройки

КлючЧто значит
timeoutСекунд на весь обмен.
rawtrue не отправляет автоматические заголовки.
verify-tlsfalse пропускает проверку сертификата.
follow-redirectsfalse останавливается на перенаправлении.
max-redirectsСколько перенаправлений выполнять.
decompressfalse оставляет тело в том виде, в каком его закодировал сервер.
cookiesfalse не отправляет и не сохраняет cookie.
http-versionautomatic, http1, http2 или http3.
stream-limitСекунд слушать поток событий или сеанс.

См. настройки запроса.

Авторизация

У [auth] есть type и ключи этого типа. Запрос или папка без [auth] наследуют авторизацию; по умолчанию в рабочем пространстве её нет.

typeКлючи
inheritНет: взять авторизацию папки.
noneНет: без авторизации, даже если она есть у папки.
basic, digestusername, password
bearertoken; prefix, если не Bearer
api-keyname, value, in (header или query)
oauth2grant (authorization-code, client-credentials, device-code), authorization-url, token-url, device-authorization-url, client-id, client-secret, scope, audience, redirect-uri; pkce = false, чтобы выключить PKCE; client-authentication = "body", чтобы отправлять учётные данные клиента в теле, а не через Basic; header-prefix, если не Bearer
aws-signatureaccess-key-id, secret-access-key, session-token, region, service
jwtalgorithm (HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384), secret, secret-base64, payload, header, issued-at = false, чтобы не включать iat, expires-in (секунды, по умолчанию 300), in (header или query), prefix, query-name (по умолчанию token)
hawkid, key, algorithm (sha256 или sha1), ext, payload-hash
edgegridclient-token, client-secret, access-token, max-body (по умолчанию 131072), headers-to-sign
ntlmusername, password, domain, workstation

Записывайте каждый пароль, токен и ключ как секретную {{variable}}. См. авторизацию.

mcp-servers/

По одному файлу на MCP-сервер; имя файла — slug, на который ссылаются вызовы MCP.

echolot = 1
name = "Alpenglow MCP"
transport = "http"
url = "https://demo.echolot.dev/mcp"
КлючЧто значит
nameНазвание сервера.
transporthttp (Streamable HTTP) или stdio (программа, которую запускает Echolot).
urlДля http: конечная точка.
[[headers]]Для http: name, value, enabled.
commandДля stdio: программа, которую нужно запустить.
argumentsДля stdio: её аргументы массивом.
working-directoryДля stdio: папка, в которой она запускается.
[[environment]]Для stdio: переменные окружения, name, value, enabled.
[oauth]Настройки клиента для сервера, где вход выполняется через OAuth: client-id, client-secret, scope, redirect-uri.

См. добавление серверов.

specs/

Файлы спецификаций как есть: документы OpenAPI (.yaml, .yml, .json), схемы GraphQL (SDL в .graphql или результат интроспекции в JSON) и файлы protobuf (.proto). Echolot правит их на месте и сохраняет ваше форматирование. Запросы и моки называют их по пути, например specs/alpenglow.yaml. См. спецификации.

mocks/

По одному файлу на мок-сервер, а рядом с ним — его маршруты на JavaScript.

echolot = 1
name = "Shop"
spec = "specs/alpenglow.yaml"
port = 4010
delay = 200

[[scenarios]]
operation = "GET /products/{sku}"
status = "404"

[[routes]]
id = "e5f6a7b8"
method = "GET"
path = "/users/{id}"
summary = "One user"

[[routes.responses]]
name = "OK"
status = 200
content-type = "application/json"
headers = [{ name = "X-Request-Id", value = "{{$randomUUID}}" }]
body = """
{
  "id": "{{request.params.id}}",
  "name": "{{$randomFullName}}"
}"""

[[routes.responses]]
name = "Not found"
status = 404
content-type = "application/json"
rules = [{ source = "path", name = "id", value = "0" }]
body = """{ "error": "no user {{request.params.id}}" }"""
КлючЧто значит
nameНазвание мока.
specСпецификация, которую он обслуживает. Без неё отвечают только маршруты мока.
portПорт. По умолчанию 4010.
share-on-networktrue отвечает на всех сетевых интерфейсах, а не только на этом Mac.
delayМиллисекунд перед каждым ответом.
failure-rateПроцент запросов, на которые подставляется ответ 500, от 0 до 100.
validate-requestsfalse отвечает на запросы, нарушающие спецификацию. По умолчанию true.
[[scenarios]]Ответ, выбранный для операции спецификации: operation (например, GET /pets), status, example (имя примера).
[[routes]]Маршрут, созданный вручную: id (не меняется, пока меняется маршрут), method (или ANY), path ({id} для параметра), summary, enabled = false для выключенного маршрута, response (имя ответа по умолчанию; если не указано, первый), request-content-type и request-body (что отправляют созданные из него запросы).
[[routes.responses]]Один ответ маршрута выше: name, status, content-type, headers (name и value), rules (source — path, query, header или body; name; value, где * означает любое, а пустое — отсутствие) и body.

В mocks/<slug>.js хранятся маршруты мока на JavaScript, которые отвечают раньше маршрутов, созданных вручную, и спецификации. Для операций спецификации ответы в моке никогда не хранятся: примеры попадают в спецификацию. См. моки, маршруты и тестовые данные и маршруты на JavaScript.

flows/

По одному файлу на сценарий, <slug>.flow.toml. Echolot записывает блоки, связи и заметки в фиксированном порядке, поэтому перемещение блока меняет две строки.

echolot = 1
name = "Place a test order"
description = "Places an order, then asks a person whether to keep it."

[mcp]
tool = "place_test_order"
description = "Places a test order on the demo shop, asking a person before keeping it."

[[blocks]]
id = "signin"
kind = "request"
title = "Sign in"
position = [330, 250]

[blocks.settings]
request = "auth/sign-in"

[[wires]]
from = "start.run"
to = "signin.run"
КлючЧто значит
name, descriptionНазвание сценария и то, что он делает.
[mcp]Предлагает сценарий агентам как инструмент: tool (его имя) и description.
[schedule]Запускает его по расписанию: every-minutes или cron (например, "0 6 * * *").
[webhook]Запускает его, когда приходит запрос: method (по умолчанию POST) и path.
[[inputs]]Его входные данные: name, type (any, text, number, bool, object, list, secret), description, default, required.
[[blocks]]Его блоки: id, kind, title, position ([x, y] на холсте), paused, color и [blocks.settings] с настройками этого вида.
[[wires]]Связи: from и to, каждая в виде block.port.
[[groups]]Группы блоков: title, blocks (их ID), color.
[[notes]]Заметки на холсте: text, frame ([x, y, width, height]).

Виды блоков и их настройки описаны на странице блоки.

assistant/

Разговоры с Ассистентом, которыми вы делитесь в рабочем пространстве: <slug>.md — для чтения в любом редакторе, <slug>.json — чтобы Echolot мог открыть их снова.

Другие файлы

Файлы, которых Echolot не знает, остаются нетронутыми, так что в рабочем пространстве могут лежать README, .gitignore или файлы с данными. Данные, которые сохраняет агент или сценарий (например, exports/products.csv), попадают туда, куда их попросили записать, внутри рабочего пространства.

На этой странице