attachany
Только для живых сессий: директива привязки навигации, например {match:'origin', reload:false} - привязывает совпавшую открытую вкладку БЕЗ навигации (сохраняет живое состояние страницы).
digestany
Live: осмотри привязанную страницу за ОДИН вызов. Каждый видимый интерактивный элемент возвращается как {i, role, name, selector, inViewport, x/y/w/h, suggested_op (i = порядок сканирования документа; сначала viewport, максимум 120)}.
suggested_op это ГОТОВЫЙ op-payload, который можно вызывать напрямую (меняй только значение или передавай без изменений для операций вроде клика).
Поля форм добавляют field:{type, required, filled, value (пароль маскируется), checked, invalid, hint (browser validationMessage + aria-describedby), options/option_count, maxlength}.
Текст с [role=alert] на уровне страницы попадает в alerts.
Так что ОДИН вызов отвечает: что можно заполнить, что уже заполнено, что обязательно и отсутствует, что не прошло валидацию и почему.
Открытые DOM-модалки показываются как dialogs:[{title,selector}]. Закрылась модалка или нет, видно с одного взгляда.
Элементы это готовые цели для ввода: {role, name} работает напрямую как target.
НАЧИНАЙ С ЭТОГО вместо того, чтобы пробовать через eval.
Комбинируется с op/ops: digest:true запускает осмотр ПОСЛЕ действий в ТОМ ЖЕ ответе. Заполни всю форму одним батчем ops, прочитай ответ валидации и исправь только то, что не прошло.
v2: digest:{walk:N} дополнительно нажимает доверенный Tab N раз и возвращает focus_ring. Это собственный обход фокуса браузера, который ЗАХОДИТ в закрытые теневые корни, куда querySelector не видит (элементы с shadow:'closed': активируемые хэндлы: фокус + Enter).
v3: digest:{ax:true} подключает CDP-дерево доступности (ax: role+name+coords для КАЖДОГО отрисованного узла, включая закрытый shadow, без мутаций фокуса). Это самый зоркий вариант. Сопоставляй элементы с координатными кликами trusted:true.
op:ax также можно вызывать напрямую из плана.
draftboolean
Live: предпросмотр того, что вернула бы операция freeze на основе успешных операций этой сессии — возвращает {draft, freeze_call:{site,name}}, ничего не сохраняется, сессия остаётся активной. Изучи результат, затем сохрани через freeze (site/name можно свободно переименовать). Если в сессии есть мутирующие операции, draft будет null, а reason укажет на отсутствующий key. Работает с любым незамороженным session id — включая прошлые сессии, которые всплывают как session_hits на этапе begin/capture (уже выполненная работа; draft вместо повторного вычисления).
freezeobject
Live: материализуйте успешные операции сессии в сохранённый Flow {site, name, key?, description?, ops?, return?, must?, accept_candidates?, lessons?}. Поле post_act must обязательно, когда селекция мутирует — либо создайте его, либо установите accept_candidates: true, чтобы использовать производное от движка φ, показанное в freeze_nudge.freeze_call.must_candidate (оно поднимает read-only хвост сессии в фазу подтверждения и утверждает поле, которое было наблюдаемо истинным при захвате, либо откатывается к записанному оракулу записи; candidate_provenance указывает, какой источник использован). Авторское must всегда имеет приоритет. lessons: string[] — постоянные заметки автора для хоста (что эта сессия вам показала), объединяются с подсказками вашей среды и всплывают при каждом последующем begin/capture на этом хосте. Архивирует сессию. Если ответ несёт предупреждение capture-tab-completeness (на странице были группы вкладок, которые ваша сессия не посещала — перечислены в groups), непосещённые вкладки часто содержат нужную конфигурацию (например, ключ был задан, но переключатель разрешений находится на другой вкладке): вернитесь к ним и повторите заморозку, либо проигнорируйте предупреждение, если эти вкладки действительно не относятся к потоку.
intentstring
Описание на естественном языке того, что пользователь хочет извлечь. Настоятельно рекомендуется - улучшает качество захвата и открывает возможность запасного варианта компиляции ИИ.
liveboolean
true + url: начать LIVE-сессию — привязать вкладку и вернуть live_session для диспетчеризации одной операции в реальном времени (каждая операция записывается). Комбинируйте с attach, чтобы привязать открытую вкладку пользователя без её перезагрузки.
live_sessionstring
Идентификатор live-сессии из начального вызова. Объедините с op или freeze.
namestring
Обязательно для сохранения (например, "trending")
opobject
Живой: ОДНА операция для отправки сейчас на вкладке сессии (~1с обратной связи). Те же правила линтера, что и для авторских потоков. Результат возвращается напрямую; операция добавляется в запись сессии.
save:"x" привязывает значение для КАЖДОЙ последующей операции в этой сессии — обращайтесь к нему как {{observe.x}} (scope_bound в ответе перечисляет точные написания), и оно разрешается одинаково при повторном выполнении. Никогда не вставляйте значение, которое вы только что прочитали, как литерал в следующую операцию: это замораживает константу на момент захвата там, где должна быть ссылка.
**Операция — это РАЗМЕЧЕННОЕ ОБЪЕДИНЕНИЕ — каждая операция несёт op:<строка>; допустимые 18 значений: fetch, nav, wait, input, cookies, extract, tap, foreach, if, parallel, bookmark, eval, pdf, screenshot, ax, notify, host. **Большинство интерактивных кликов/заполнений/прокруток используют op:input + kind:<10 подтипов> — остальные 17 операций несут прямое назначение. 8 ФОРМ находятся в code types.ts:OP_NAMES_V2, но ОБЫЧНЫЕ операции перечислены ниже с примерами литералов (скопируйте пример и замените селекторы/URL).
Обычные операции (копируй и вставляй):
- Перейти: {"op":"nav","url":"https://example.com"}
- Кликнуть элемент: {"op":"input","kind":"click","target":{"selector":"button.submit"}}
- Заполнить поле: {"op":"input","kind":"fill","target":{"selector":"#email"},"value":"me@x.com"}
- Ввести текст (отправляет нажатия клавиш, вызывает события ввода): {"op":"input","kind":"type","target":{"selector":"input"},"value":"hello"}
- Прокрутить страницу: {"op":"input","kind":"scroll","value":"page"} ← value ∈ {"page","-page","pageup","pagedown","top","bottom","-element"} или строка-пиксели.
- Подождать: {"op":"wait","ms":1500} (или {"op":"wait","selector":"#ready"})
- HTTP-запрос (без вкладки): {"op":"fetch","url":"https://api.x.com/v","format":"json","save":"resp"}
- Извлечь данные со страницы: {"op":"extract","fields":{"title":{"selector":"h1","kind":"text"}}}
- Выполнить JS на странице (только извлечение значения, БЕЗ побочных эффектов — в движке эвалы только возвращают значения): {"op":"eval","src":"document.title"}
- Навести курсор:…
opsobject[]
Живая последовательность коротких операций, отправляемая одним вызовом, — последовательная, с быстрым отказом (останавливается при первой ошибке; хвост не выполняется). Все операции проверяются заранее. Каждая операция записывается отдельно. ПРЕДПОЧТИТЕЛЬНЕЕ поштучных вызовов, когда следующие шаги уже известны (открыть → выбрать → дождаться → подтвердить): один往返 вместо N.
Значения возвращаются: ответ содержит results:[{seq, ok, value|error, anomalies?}] в порядке отправки — тот же формат, что и у одиночного op, по одной записи на операцию. Так что пакет может заканчиваться чтениями (extract/eval/fetch), и вы получаете их данные в этом ответе; пакетирование НЕ ограничено слепыми действиями.
Значения также передаются ВПЕРЁД: save:"x" в любой операции связывает его со всеми последующими операциями в сессии (в пакете или нет) — обращайтесь к нему как {{observe.x}} (или {{act.x}} после того, как сессия изменилась; scope_bound в ответе перечисляет точные написания). op:extract без from читает значение предыдущей операции. Атрибуция фазы — собственное правило материализатора заморозки, поэтому то, что разрешается в живом режиме, разрешается так же и при повторном воспроизведении. Ссылайтесь, а не вставляйте: запись значения, которое вы только что ПРОЧИТАЛИ, как литерала в следующую операцию закрепляет константу на момент снимка (токен, ID строки, дату), которая при повторном воспроизведении остаётся зелёной даже против устаревших данных.
Каждый элемент следует той же форме операции, что описана в поле op (размеченное объединение, 18 значений, op:input с kind для интерактивности).
sitestring
{
"translation": "Требуется для сохранения (например, 'github'); также позволяет повторный захват, когда URL не указан."
}
urlstring
URL источника для проверки