chore(i18n): refresh uk translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-23 17:55:39 +00:00
parent 60d6d9d0e7
commit 922330cdf5
2 changed files with 338 additions and 322 deletions

View File

@ -2,100 +2,109 @@
read_when:
- Вам потрібно зрозуміти, чому завдання CI запустилося або не запустилося
- Ви налагоджуєте збої перевірок GitHub Actions
summary: Граф завдань CI, обмеження області дії та локальні еквіваленти команд
summary: Граф завдань CI, гейти за областю змін і локальні еквіваленти команд
title: Конвеєр CI
x-i18n:
generated_at: "2026-04-23T15:01:12Z"
generated_at: "2026-04-23T17:53:34Z"
model: gpt-5.4
provider: openai
source_hash: e9a03440ae28a15167fc08d9c66bb1fd719ddfa1517aaecb119c80f2ad826c0d
source_hash: 1de796d57e79eda0328f20172f9029af485a57a3996bc8615e3a7bce281b7d85
source_path: ci.md
workflow: 15
---
# Конвеєр CI
CI запускається для кожного push у `main` і для кожного pull request. Він використовує розумне обмеження області дії, щоб пропускати дорогі завдання, коли змінено лише не пов’язані ділянки.
CI запускається під час кожного push у `main` і для кожного pull request. Він використовує розумне визначення області змін, щоб пропускати дорогі завдання, коли змінено лише непов’язані ділянки.
QA Lab має окремі смуги CI поза основним робочим процесом із розумним обмеженням області. Робочий процес `Parity gate` запускається для відповідних змін у PR і через ручний запуск; він збирає приватне середовище виконання QA та порівнює агентні пакети mock GPT-5.4 і Opus 4.6. Робочий процес `QA-Lab - All Lanes` запускається щоночі на `main` і через ручний запуск; він розгалужує mock parity gate, live Matrix lane і live Telegram lane як паралельні завдання. Live-завдання використовують середовище `qa-live-shared`, а смуга Telegram використовує Convex leases. `OpenClaw Release Checks` також запускає ті самі смуги QA Lab перед погодженням релізу.
QA Lab має окремі гілки CI поза основним workflow з розумним визначенням області змін. Workflow `Parity gate` запускається для відповідних змін у PR і через ручний запуск; він збирає приватний runtime QA і порівнює агентні пакети mock GPT-5.4 та Opus 4.6. Workflow `QA-Lab - All Lanes` запускається щоночі на `main` і через ручний запуск; він розгалужує mock parity gate, live lane Matrix і live lane Telegram як паралельні завдання. Live-завдання використовують середовище `qa-live-shared`, а lane Telegram використовує оренди Convex. `OpenClaw Release Checks` також запускає ті самі lane QA Lab перед погодженням релізу.
Workflow `Duplicate PRs After Merge` — це ручний workflow для мейнтейнерів для очищення дублікатів після злиття. За замовчуванням він працює в режимі dry-run і закриває лише явно вказані PR, коли `apply=true`. Перед внесенням змін у GitHub він перевіряє, що злитий PR справді об’єднано і що кожен дублікат має або спільну згадану issue, або перекривні змінені hunks.
```bash
gh workflow run duplicate-after-merge.yml \
-f landed_pr=70532 \
-f duplicate_prs='70530,70592' \
-f apply=true
```
## Огляд завдань
| Завдання | Призначення | Коли запускається |
| -------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------ |
| `preflight` | Визначення змін лише в документації, змінених областей, змінених розширень і побудова маніфесту CI | Завжди для push і PR, що не є draft |
| `security-scm-fast` | Виявлення приватних ключів і аудит workflow через `zizmor` | Завжди для push і PR, що не є draft |
| `security-dependency-audit` | Аудит production lockfile без залежностей щодо advisory npm | Завжди для push і PR, що не є draft |
| `security-fast` | Обов’язковий агрегатор для швидких завдань безпеки | Завжди для push і PR, що не є draft |
| `build-artifacts` | Збірка `dist/`, Control UI, перевірки built-artifact і багаторазово використовуваних downstream-артефактів | Зміни, релевантні Node |
| `checks-fast-core` | Швидкі Linux-смуги коректності, як-от перевірки bundled/plugin-contract/protocol | Зміни, релевантні Node |
| `checks-fast-contracts-channels` | Шардовані перевірки контрактів каналів зі стабільним агрегованим результатом перевірки | Зміни, релевантні Node |
| `checks-node-extensions` | Повні шарди тестів bundled-plugin для всього набору extension | Зміни, релевантні Node |
| `checks-node-core-test` | Шарди тестів core Node, без смуг каналів, bundled, contract і extension | Зміни, релевантні Node |
| `extension-fast` | Цільові тести лише для змінених bundled plugins | Pull request зі змінами в extension |
| `check` | Шардований еквівалент основного локального gate: production types, lint, guards, test types і strict smoke | Зміни, релевантні Node |
| `check-additional` | Шарди architecture, boundary, extension-surface guards, package-boundary і gateway-watch | Зміни, релевантні Node |
| `build-smoke` | Smoke-тести built-CLI і smoke перевірка пам’яті під час запуску | Зміни, релевантні Node |
| `checks` | Верифікатор для channel-тестів built-artifact плюс сумісність Node 22 лише для push | Зміни, релевантні Node |
| `check-docs` | Форматування документації, lint і перевірки зламаних посилань | Документацію змінено |
| `skills-python` | Ruff + pytest для Skills на основі Python | Зміни, релевантні Python Skills |
| `checks-windows` | Windows-специфічні тестові смуги | Зміни, релевантні Windows |
| `macos-node` | Смуга тестів TypeScript на macOS з використанням спільних built artifacts | Зміни, релевантні macOS |
| `macos-swift` | Lint, збірка та тести Swift для застосунку macOS | Зміни, релевантні macOS |
| `android` | Юніт-тести Android для обох flavor плюс одна збірка debug APK | Зміни, релевантні Android |
| Завдання | Призначення | Коли запускається |
| -------------------------------- | -------------------------------------------------------------------------------------------- | ----------------------------------- |
| `preflight` | Визначає зміни лише в документації, області змін, змінені extensions і будує CI-маніфест | Завжди для push і PR не в draft |
| `security-scm-fast` | Виявлення приватних ключів і аудит workflow через `zizmor` | Завжди для push і PR не в draft |
| `security-dependency-audit` | Аудит production lockfile без залежностей щодо advisory npm | Завжди для push і PR не в draft |
| `security-fast` | Обов’язковий агрегатор для швидких завдань безпеки | Завжди для push і PR не в draft |
| `build-artifacts` | Збирає `dist/`, Control UI, перевірки built-artifact і перевикористовувані downstream-артефакти | Зміни, релевантні для Node |
| `checks-fast-core` | Швидкі Linux lane коректності, як-от bundled/plugin-contract/protocol перевірки | Зміни, релевантні для Node |
| `checks-fast-contracts-channels` | Шардовані перевірки контрактів каналів зі стабільним агрегованим результатом | Зміни, релевантні для Node |
| `checks-node-extensions` | Повні шарди тестів bundled plugin у всьому наборі extensions | Зміни, релевантні для Node |
| `checks-node-core-test` | Шарди core Node тестів, окрім lane каналів, bundled, контрактів і extensions | Зміни, релевантні для Node |
| `extension-fast` | Сфокусовані тести лише для змінених bundled plugin | Pull request зі змінами в extensions |
| `check` | Шардований еквівалент основного локального gate: prod types, lint, guards, test types і strict smoke | Зміни, релевантні для Node |
| `check-additional` | Архітектурні, boundary, guards поверхні extensions, package-boundary і shard gateway-watch | Зміни, релевантні для Node |
| `build-smoke` | Smoke-тести зібраного CLI і smoke перевірка пам’яті під час старту | Зміни, релевантні для Node |
| `checks` | Верифікатор для built-artifact тестів каналів плюс lane сумісності Node 22 лише для push | Зміни, релевантні для Node |
| `check-docs` | Форматування документації, lint і перевірки зламаних посилань | Змінено docs |
| `skills-python` | Ruff + pytest для Skills на основі Python | Зміни, релевантні для Python Skills |
| `checks-windows` | Специфічні для Windows lane тестів | Зміни, релевантні для Windows |
| `macos-node` | Lane TypeScript тестів на macOS з використанням спільних built artifacts | Зміни, релевантні для macOS |
| `macos-swift` | Swift lint, build і тести для застосунку macOS | Зміни, релевантні для macOS |
| `android` | Android unit-тести для обох flavor плюс одна debug APK збірка | Зміни, релевантні для Android |
## Порядок fail-fast
Завдання впорядковано так, щоб дешеві перевірки завершувалися з помилкою раніше, ніж запустяться дорогі:
Завдання впорядковано так, щоб дешеві перевірки падали раніше, ніж запустяться дорогі:
1. `preflight` вирішує, які смуги взагалі існують. Логіка `docs-scope` і `changed-scope` — це кроки всередині цього завдання, а не окремі завдання.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` і `skills-python` завершуються швидко, не чекаючи важчих матричних завдань артефактів і платформ.
3. `build-artifacts` виконується паралельно зі швидкими Linux-смугами, щоб downstream-споживачі могли стартувати, щойно спільна збірка буде готова.
4. Після цього розгалужуються важчі платформні та runtime-смуги: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, PR-only `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift` і `android`.
1. `preflight` вирішує, які lane взагалі існують. Логіка `docs-scope` і `changed-scope` — це кроки всередині цього завдання, а не окремі завдання.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` і `skills-python` падають швидко, не чекаючи важчих artifact- і platform-matrix-завдань.
3. `build-artifacts` виконується паралельно зі швидкими Linux lane, щоб downstream-споживачі могли почати роботу, щойно спільна збірка буде готова.
4. Після цього розгалужуються важчі platform і runtime lane: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, лише для PR `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift` і `android`.
Логіка області дії міститься в `scripts/ci-changed-scope.mjs` і покрита юніт-тестами в `src/scripts/ci-changed-scope.test.ts`.
Зміни в workflow CI перевіряють граф Node CI плюс lint workflow, але самі по собі не примушують виконувати нативні збірки Windows, Android або macOS; ці платформні смуги залишаються прив’язаними до змін у вихідному коді відповідних платформ.
Перевірки Windows Node обмежені специфічними для Windows обгортками процесів/шляхів, допоміжними засобами запуску npm/pnpm/UI runner, конфігурацією менеджера пакунків і поверхнями workflow CI, які виконують цю смугу; не пов’язані зміни у вихідному коді, plugin, install-smoke і зміни лише в тестах залишаються в Linux Node lanes, щоб не резервувати Windows worker на 16 vCPU для покриття, яке вже виконується звичайними тестовими шардами.
Окремий workflow `install-smoke` повторно використовує той самий скрипт області дії через власне завдання `preflight`. Він обчислює `run_install_smoke` на основі вужчого сигналу changed-smoke, тому Docker/install smoke запускається для змін, релевантних встановленню, пакуванню, контейнерам, production changes у bundled extension, а також для поверхонь core plugin/channel/gateway/Plugin SDK, які використовують Docker smoke jobs. Зміни лише в тестах і лише в документації не резервують Docker workers. Його smoke для QR package примушує Docker-шар `pnpm install` виконатися повторно, зберігаючи кеш BuildKit pnpm store, тому інсталяція все одно перевіряється без повторного завантаження залежностей під час кожного запуску. Його gateway-network e2e повторно використовує runtime image, зібраний раніше в межах цього завдання, тому додає реальне покриття WebSocket між контейнерами без додавання ще однієї Docker-збірки. Локальна команда `test:docker:all` попередньо збирає один спільний live-test image і один спільний built-app image `scripts/e2e/Dockerfile`, а потім паралельно запускає live/E2E smoke lanes з `OPENCLAW_SKIP_DOCKER_BUILD=1`; налаштуйте типову паралельність 4 через `OPENCLAW_DOCKER_ALL_PARALLELISM`. Локальний агрегатор типово припиняє планувати нові pooled lanes після першої помилки, а кожна смуга має тайм-аут 120 хвилин, який можна перевизначити через `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Смуги, чутливі до запуску або провайдера, виконуються ексклюзивно після паралельного пулу. Багаторазово використовуваний workflow live/E2E відтворює шаблон shared-image: спочатку збирає і публікує один Docker E2E image із тегом SHA у GHCR перед матрицею Docker, а потім запускає матрицю з `OPENCLAW_SKIP_DOCKER_BUILD=1`. Запланований workflow live/E2E щодня запускає повний Docker-набір для release-path. Тести QR та installer Docker зберігають власні Dockerfile, орієнтовані на встановлення. Окреме завдання `docker-e2e-fast` запускає обмежений Docker-профіль bundled-plugin з тайм-аутом команди 120 секунд: repair залежностей setup-entry плюс ізоляція синтетичної помилки bundled-loader. Повна матриця bundled update/channel залишається ручною/для повного набору, оскільки вона виконує повторні реальні проходи npm update і doctor repair.
Логіка області змін живе в `scripts/ci-changed-scope.mjs` і покрита unit-тестами в `src/scripts/ci-changed-scope.test.ts`.
Редагування CI workflow перевіряє Node CI graph разом із lint перевіркою workflow, але саме по собі не примушує запускати нативні збірки Windows, Android або macOS; ці platform lane залишаються прив’язаними до змін у platform source.
Перевірки Windows Node прив’язані до специфічних для Windows обгорток process/path, helper-ів npm/pnpm/UI runner, конфігурації package manager і поверхонь CI workflow, які запускають цей lane; непов’язані зміни в source, plugin, install-smoke і лише тестові зміни залишаються в Linux Node lane, щоб не резервувати Windows worker із 16 vCPU для покриття, яке вже забезпечують звичайні шарди тестів.
Окремий workflow `install-smoke` повторно використовує той самий скрипт області змін через власне завдання `preflight`. Він обчислює `run_install_smoke` з вужчого сигналу changed-smoke, тому Docker/install smoke запускається для змін, пов’язаних з install, packaging, контейнерами, production changes у bundled extension, а також для поверхонь core plugin/channel/gateway/Plugin SDK, які перевіряють Docker smoke jobs. Лише тестові та лише docs-редагування не резервують Docker workers. Його QR package smoke примушує шар Docker `pnpm install` виконатися повторно, зберігаючи cache сховища BuildKit pnpm, тому інсталяція все одно перевіряється без повторного завантаження залежностей під час кожного запуску. Його gateway-network e2e повторно використовує runtime image, зібраний раніше в межах цього завдання, тож додає реальне покриття WebSocket між контейнерами без додавання ще однієї Docker-збірки. Локально `test:docker:all` попередньо збирає один спільний live-test image і один спільний built-app image з `scripts/e2e/Dockerfile`, а потім запускає live/E2E smoke lane паралельно з `OPENCLAW_SKIP_DOCKER_BUILD=1`; стандартний рівень паралелізму 4 можна налаштувати через `OPENCLAW_DOCKER_ALL_PARALLELISM`. Локальний агрегатор за замовчуванням припиняє планувати нові pooled lane після першої помилки, а кожен lane має таймаут 120 хвилин, який можна перевизначити через `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS`. Lane, чутливі до startup або provider, запускаються ексклюзивно після паралельного пулу. Повторно використовуваний workflow live/E2E віддзеркалює шаблон shared-image: він збирає і пушить один Docker E2E image у GHCR з тегом SHA перед Docker matrix, а потім запускає matrix з `OPENCLAW_SKIP_DOCKER_BUILD=1`. Запланований workflow live/E2E щодня запускає повний релізний Docker suite. Docker-тести QR та installer зберігають власні install-орієнтовані Dockerfile. Окреме завдання `docker-e2e-fast` запускає обмежений Docker profile для bundled plugin з таймаутом команди 120 секунд: repair залежностей setup-entry плюс синтетична ізоляція збоїв bundled-loader. Повна matrix оновлення bundled і каналів залишається manual/full-suite, тому що вона виконує повторні реальні проходи npm update і doctor repair.
Локальна логіка changed-lane міститься в `scripts/changed-lanes.mjs` і виконується через `scripts/check-changed.mjs`. Цей локальний gate суворіший щодо архітектурних меж, ніж широка платформа області дії CI: зміни production у core запускають перевірку типів core prod плюс тести core, зміни лише в тестах core запускають лише перевірку типів/тести core test, зміни production у extension запускають перевірку типів extension prod плюс тести extension, а зміни лише в тестах extension запускають лише перевірку типів/тести extension test. Зміни в публічному Plugin SDK або plugin-contract розширюють перевірку до extension, оскільки extension залежать від цих контрактів core. Зміни лише в метаданих релізу з оновленням версій запускають цільові перевірки version/config/root-dependency. Невідомі зміни в root/config безпечно призводять до запуску всіх смуг.
Локальна логіка changed-lane живе в `scripts/changed-lanes.mjs` і виконується через `scripts/check-changed.mjs`. Цей локальний gate суворіший щодо архітектурних boundary, ніж широка CI-область платформ: зміни в core production запускають core prod typecheck плюс core тести, лише зміни в core tests запускають лише core test typecheck/tests, зміни в extension production запускають extension prod typecheck плюс extension тести, а лише зміни в extension tests запускають лише extension test typecheck/tests. Зміни в публічному Plugin SDK або plugin-contract розширюють перевірку на extensions, тому що extensions залежать від цих core-контрактів. Зміни лише в release metadata для version bump запускають точкові перевірки version/config/root-dependency. Невідомі зміни в root/config безпечно призводять до запуску всіх lane.
Для push матриця `checks` додає смугу `compat-node22`, яка запускається лише для push. Для pull request ця смуга пропускається, і матриця зосереджується на звичайних test/channel lanes.
Для push matrix `checks` додає lane `compat-node22`, який запускається лише для push. Для pull request цей lane пропускається, а matrix залишається зосередженою на звичайних test/channel lane.
Найповільніші сімейства тестів Node розділено або збалансовано так, щоб кожне завдання залишалося невеликим без надмірного резервування runner-ів: контракти каналів запускаються як три зважені шарди, тести bundled plugin балансуються між шістьма workers extension, малі core unit lanes об’єднані в пари, auto-reply виконується на трьох збалансованих workers замість шести малих workers, а agentic gateway/plugin configs розподілено між наявними agentic Node jobs лише для вихідного коду, замість очікування built artifacts. Широкі browser, QA, media і miscellaneous plugin tests використовують свої спеціалізовані конфігурації Vitest замість спільного універсального набору plugin. Широка смуга agents використовує спільний планувальник file-parallel Vitest, оскільки в ній домінують імпорти/планування, а не один повільний тестовий файл. `runtime-config` запускається разом із shard infra core-runtime, щоб спільний runtime shard не утримував хвіст виконання. `check-additional` тримає compile/canary роботу package-boundary разом і відокремлює runtime topology architecture від покриття gateway watch; shard boundary guard виконує свої малі незалежні guards паралельно в межах одного завдання. Gateway watch, channel tests і shard core support-boundary виконуються паралельно всередині `build-artifacts` після того, як `dist/` і `dist-runtime/` уже зібрано, зберігаючи їхні старі назви перевірок як легкі завдання-верифікатори та уникаючи двох додаткових Blacksmith workers і другої черги споживачів артефактів.
Android CI запускає і `testPlayDebugUnitTest`, і `testThirdPartyDebugUnitTest`, а потім збирає Play debug APK. Варіант third-party не має окремого source set або manifest; його смуга юніт-тестів усе одно компілює цей flavor із прапорцями BuildConfig для SMS/call-log, водночас уникаючи дубльованого завдання пакування debug APK для кожного push, релевантного Android.
`extension-fast` є лише для PR, оскільки push-запуски вже виконують повні шарди bundled plugin. Це зберігає швидкий зворотний зв’язок щодо змінених plugin для рев’ю, не резервуючи додатковий Blacksmith worker на `main` для покриття, яке вже є в `checks-node-extensions`.
Найповільніші сімейства Node тестів розділено або збалансовано так, щоб кожне завдання залишалося невеликим без надмірного резервування runner-ів: контракти каналів запускаються у трьох зважених shard, тести bundled plugin збалансовані між шістьма workers для extensions, невеликі core unit lane об’єднано попарно, auto-reply запускається в трьох збалансованих workers замість шести дрібних, а agentic gateway/plugin configs розподілено між наявними source-only agentic Node jobs замість очікування built artifacts. Широкі browser, QA, media і miscellaneous plugin тести використовують свої окремі конфігурації Vitest замість спільного універсального plugin-набору. Широкий lane agents використовує спільний file-parallel scheduler Vitest, тому що в ньому домінують імпорт і планування, а не один повільний тестовий файл. `runtime-config` запускається разом із shard infra core-runtime, щоб спільний runtime shard не залишався найдовшим. `check-additional` тримає разом роботу package-boundary compile/canary і відокремлює архітектуру runtime topology від покриття gateway watch; shard boundary guard запускає свої невеликі незалежні guards паралельно всередині одного завдання. Gateway watch, тести каналів і shard core support-boundary виконуються паралельно всередині `build-artifacts` після того, як `dist/` і `dist-runtime/` уже зібрано, зберігаючи їхні попередні назви перевірок як легкі завдання-верифікатори, водночас уникаючи двох додаткових Blacksmith worker-ів і другої черги споживачів артефактів.
Android CI запускає і `testPlayDebugUnitTest`, і `testThirdPartyDebugUnitTest`, а потім збирає Play debug APK. Flavor third-party не має окремого source set або manifest; його lane unit-тестів усе одно компілює цей flavor з прапорами SMS/call-log у BuildConfig, водночас уникаючи дубльованого завдання пакування debug APK під час кожного Android-релевантного push.
`extension-fast` запускається лише для PR, тому що push-запуски вже виконують повні шарди bundled plugin. Це зберігає швидкий зворотний зв’язок щодо змінених plugin для review, не резервуючи додатковий Blacksmith worker на `main` для покриття, яке вже є в `checks-node-extensions`.
GitHub може позначати застарілі завдання як `cancelled`, коли новіший push потрапляє в той самий PR або ref `main`. Вважайте це шумом CI, якщо лише найновіший запуск для того самого ref також не завершується помилкою. Агреговані shard-перевірки використовують `!cancelled() && always()`, щоб і далі повідомляти про звичайні помилки shard, але не ставали в чергу після того, як увесь workflow уже було витіснено новішим запуском.
Ключ конкурентності CI має версію (`CI-v7-*`), щоб zombie-процес на боці GitHub у старій групі черги не міг безстроково блокувати новіші запуски main.
GitHub може позначати замінені новішими запусками завдання як `cancelled`, коли новіший push потрапляє в той самий PR або ref `main`. Вважайте це шумом CI, якщо тільки найновіший запуск для того самого ref теж не падає. Агреговані shard checks використовують `!cancelled() && always()`, тож вони все одно повідомляють про звичайні помилки shard, але не стають у чергу після того, як увесь workflow уже було замінено новішим.
Ключ concurrency у CI має версію (`CI-v7-*`), щоб zombie-процес на боці GitHub у старій групі черги не міг безкінечно блокувати новіші запуски main.
## Runners
## Виконавці
| Runner | Завдання |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ubuntu-24.04` | `preflight`, швидкі завдання безпеки та агрегатори (`security-scm-fast`, `security-dependency-audit`, `security-fast`), швидкі перевірки protocol/contract/bundled, шардовані перевірки контрактів каналів, шарди `check`, окрім lint, шарди й агрегатори `check-additional`, агрегатори-верифікатори тестів Node, перевірки документації, Python Skills, workflow-sanity, labeler, auto-response; preflight для install-smoke також використовує Ubuntu на GitHub-hosted, щоб матриця Blacksmith могла стати в чергу раніше |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, шарди тестів Linux Node, шарди тестів bundled plugin, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, який залишається достатньо чутливим до CPU, так що 8 vCPU коштували дорожче, ніж дали виграш; Docker-збірки install-smoke, де час очікування в черзі для 32 vCPU коштував дорожче, ніж давав виграш |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` у `openclaw/openclaw`; для fork використовується резервний варіант `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` у `openclaw/openclaw`; для fork використовується резервний варіант `macos-latest` |
| Виконавець | Завдання |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, швидкі завдання безпеки та агрегати (`security-scm-fast`, `security-dependency-audit`, `security-fast`), швидкі перевірки protocol/contract/bundled, шардовані перевірки контрактів каналів, shard `check`, окрім lint, shard `check-additional` і агрегати, aggregate verifier-и Node тестів, перевірки docs, Python Skills, workflow-sanity, labeler, auto-response; `preflight` для install-smoke також використовує GitHub-hosted Ubuntu, щоб matrix Blacksmith могла стати в чергу раніше |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard Node тестів на Linux, shard тестів bundled plugin, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, який залишається достатньо чутливим до CPU, тож 8 vCPU коштували дорожче, ніж заощаджували; Docker-збірки install-smoke, де час очікування в черзі для 32 vCPU коштував дорожче, ніж заощаджував |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` у `openclaw/openclaw`; для fork використовується резервний `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` у `openclaw/openclaw`; для fork використовується резервний `macos-latest` |
## Локальні еквіваленти
```bash
pnpm changed:lanes # переглянути локальний класифікатор changed-lane для origin/main...HEAD
pnpm check:changed # розумний локальний gate: changed typecheck/lint/tests за boundary lane
pnpm check # швидкий локальний gate: production tsgo + шардований lint + паралельні fast guards
pnpm check:changed # розумний локальний gate: typecheck/lint/tests для змін за boundary lane
pnpm check # швидкий локальний gate: production tsgo + шардований lint + паралельні швидкі guards
pnpm check:test-types
pnpm check:timed # той самий gate із таймінгами для кожного етапу
pnpm check:timed # той самий gate з таймінгами для кожного етапу
pnpm build:strict-smoke
pnpm check:architecture
pnpm test:gateway:watch-regression
pnpm test # тести vitest
pnpm test:channels
pnpm test:contracts:channels
pnpm check:docs # форматування документації + lint + зламані посилання
pnpm build # збирає dist, коли важливі смуги CI artifact/build-smoke
node scripts/ci-run-timings.mjs <run-id> # підсумувати wall time, час у черзі та найповільніші завдання
node scripts/ci-run-timings.mjs --recent 10 # порівняти нещодавні успішні запуски main CI
pnpm check:docs # форматування docs + lint + биті посилання
pnpm build # зібрати dist, коли важливі CI lane artifact/build-smoke
node scripts/ci-run-timings.mjs <run-id> # підсумувати загальний час, час очікування в черзі та найповільніші завдання
node scripts/ci-run-timings.mjs --recent 10 # порівняти останні успішні запуски main CI
```

View File

@ -1,65 +1,66 @@
---
read_when:
- Налаштування схвалень виконання або списків дозволеного
- Реалізація UX для схвалення виконання в застосунку macOS
- Перегляд підказок щодо виходу з пісочниці та їхніх наслідків
summary: Підказки щодо схвалення виконання, списків дозволеного та виходу з пісочниці
title: Схвалення виконання
- Налаштування підтверджень виконання або списків дозволених елементів
- Реалізація UX підтвердження виконання в застосунку для macOS
- Перегляд запитів на вихід із пісочниці та їхніх наслідків
summary: Підтвердження виконання, списки дозволених елементів і запити на вихід із пісочниці
title: Підтвердження виконання
x-i18n:
generated_at: "2026-04-23T17:31:37Z"
generated_at: "2026-04-23T17:53:33Z"
model: gpt-5.4
provider: openai
source_hash: edfc53f7f343969411f9cda848933e7a1ab80076257e4a0802910a910b3a47ea
source_hash: 942d09665ff9d567361b0c5ee195a5a6b8c893ea1c9412caa33a02acd8e5e5be
source_path: tools/exec-approvals.md
workflow: 15
---
# Схвалення виконання
# Підтвердження виконання
Схвалення виконання — це **захисний механізм companion app / вузлового хоста** для того, щоб дозволити агенту в пісочниці запускати команди на реальному хості (`gateway` або `node`). Це запобіжник безпеки: команди дозволяються лише тоді, коли політика + список дозволеного + (необов’язкове) схвалення користувача збігаються. Схвалення виконання накладаються **поверх** політики інструментів і режиму підвищених прав (крім випадку, коли elevated встановлено в `full`, що пропускає схвалення).
Підтвердження виконання — це **захисний механізм застосунку-компаньйона / хоста node** для надання агенту в пісочниці можливості запускати команди на реальному хості (`gateway` або `node`). Це запобіжник безпеки: команди дозволяються лише тоді, коли збігаються політика + список дозволених елементів + (необов’язково) підтвердження користувача. Підтвердження виконання накладаються **поверх** політики інструментів і підвищеного доступу (окрім випадку, коли elevated встановлено в `full`, що пропускає підтвердження).
<Note>
Ефективна політика **суворіша** з `tools.exec.*` і типових налаштувань схвалень; якщо поле схвалень пропущене, використовується значення `tools.exec`. Виконання на хості також використовує локальний стан схвалень на цій машині — локальне для хоста `ask: "always"` у `~/.openclaw/exec-approvals.json` продовжуватиме запитувати підтвердження, навіть якщо типові значення сесії або конфігурації вказують `ask: "on-miss"`.
Ефективна політика є **суворішою** з `tools.exec.*` і типових значень підтверджень; якщо якесь поле підтверджень пропущене, використовується значення `tools.exec`. Виконання на хості також використовує локальний стан підтверджень на цій машині — локальне для хоста `ask: "always"` у `~/.openclaw/exec-approvals.json` продовжить показувати запити, навіть якщо сеанс або типові значення конфігурації вимагають `ask: "on-miss"`.
</Note>
## Перегляд ефективної політики
- `openclaw approvals get`, `... --gateway`, `... --node <id|name|ip>` — показати запитану політику, джерела політики хоста та ефективний результат.
- `openclaw exec-policy show` — об’єднане подання для локальної машини.
- `openclaw exec-policy set|preset` — синхронізувати локальну запитану політику з локальним файлом схвалень хоста в один крок.
- `openclaw approvals get`, `... --gateway`, `... --node <id|name|ip>` — показують запитану політику, джерела політики хоста та ефективний результат.
- `openclaw exec-policy show` — об’єднане представлення для локальної машини.
- `openclaw exec-policy set|preset` — синхронізує локально запитану політику з локальним файлом підтверджень хоста в один крок.
Коли локальна область запитує `host=node`, `exec-policy show` повідомляє про цю область як керовану вузлом під час виконання, замість того щоб удавати, що локальний файл схвалень є джерелом істини.
Коли локальна область видимості запитує `host=node`, `exec-policy show` повідомляє, що ця область керується node під час виконання, замість того щоб удавати, ніби локальний файл підтверджень є джерелом істини.
Якщо UI companion app **недоступний**, будь-який запит, який зазвичай мав би викликати запит на підтвердження, вирішується через **резервну поведінку ask** (типово: deny).
Якщо UI застосунку-компаньйона **недоступний**, будь-який запит, який зазвичай вимагав би підтвердження, обробляється через **резервний режим ask** (типово: deny).
<Tip>
Нативні клієнти схвалення в чаті можуть наповнювати повідомлення про очікуване схвалення специфічними для каналу елементами керування. Наприклад, Matrix додає ярлики реакцій (`✅` дозволити один раз, `❌` заборонити, `♾️` дозволити завжди), при цьому залишаючи команди `/approve ...` у повідомленні як резервний варіант.
Нативні клієнти підтвердження в чаті можуть додавати специфічні для каналу елементи керування до повідомлення про очікуване підтвердження. Наприклад, Matrix додає швидкі реакції (`✅`
дозволити один раз, `❌` відхилити, `♾️` завжди дозволяти), водночас залишаючи команди `/approve ...` у повідомленні як запасний варіант.
</Tip>
## Де це застосовується
Схвалення виконання примусово застосовуються локально на хості виконання:
Підтвердження виконання застосовуються локально на хості виконання:
- **gateway host** → процес `openclaw` на машині Gateway
- **node host** → виконавець вузла (companion app для macOS або headless-вузловий хост)
- **хост gateway** → процес `openclaw` на машині gateway
- **хост node** → раннер node (застосунок-компаньйон для macOS або безголовий хост node)
Примітка щодо моделі довіри:
- Виклики, автентифіковані через Gateway, вважаються довіреними операторами для цього Gateway.
- Спарені вузли розширюють цю можливість довіреного оператора на вузловий хост.
- Схвалення виконання зменшують ризик випадкового виконання, але не є межею автентифікації на рівні окремого користувача.
- Схвалені запуски на вузловому хості прив’язують канонічний контекст виконання: канонічний cwd, точний argv, прив’язку env за наявності та зафіксований шлях до виконуваного файла, коли це застосовно.
- Для shell-скриптів і прямих викликів інтерпретатора/середовища виконання для файлів OpenClaw також намагається прив’язати один конкретний локальний файловий операнд. Якщо цей прив’язаний файл змінюється після схвалення, але до виконання, запуск забороняється замість виконання зміненого вмісту.
- Ця прив’язка файлів навмисно є best-effort, а не повною семантичною моделлю для кожного шляху завантаження інтерпретатора/середовища виконання. Якщо режим схвалення не може визначити рівно один конкретний локальний файл для прив’язки, він відмовляється створювати запуск, підкріплений схваленням, замість того щоб удавати повне покриття.
- Викликаючі сторони, автентифіковані через Gateway, є довіреними операторами для цього Gateway.
- Прив’язані nodes поширюють цю можливість довіреного оператора на хост node.
- Підтвердження виконання зменшують ризик випадкового виконання, але не є межею автентифікації на рівні користувача.
- Схвалені запуски на хості node прив’язують канонічний контекст виконання: канонічний cwd, точний argv, прив’язку env за наявності та зафіксований шлях до виконуваного файла, де це застосовно.
- Для shell-скриптів і прямих викликів файлів інтерпретатора/середовища виконання OpenClaw також намагається прив’язати один конкретний локальний файловий операнд. Якщо цей прив’язаний файл змінюється після підтвердження, але до виконання, запуск відхиляється замість виконання зміненого вмісту.
- Ця прив’язка файлу навмисно реалізована за принципом максимально можливого наближення, а не як повна семантична модель для кожного шляху завантаження інтерпретатора/середовища виконання. Якщо режим підтвердження не може точно визначити один конкретний локальний файл для прив’язки, він відмовляється створювати запуск, підкріплений підтвердженням, замість того щоб удавати повне покриття.
Поділ для macOS:
Поділ у macOS:
- **сервіс вузлового хоста** пересилає `system.run` до **застосунку macOS** через локальний IPC.
- **застосунок macOS** примусово застосовує схвалення + виконує команду в контексті UI.
- **служба хоста node** пересилає `system.run` до **застосунку macOS** через локальний IPC.
- **застосунок macOS** застосовує підтвердження + виконує команду в контексті UI.
## Налаштування та зберігання
## Налаштування і зберігання
Схвалення зберігаються в локальному JSON-файлі на хості виконання:
Підтвердження зберігаються в локальному JSON-файлі на хості виконання:
`~/.openclaw/exec-approvals.json`
@ -98,30 +99,30 @@ x-i18n:
}
```
## Режим "YOLO" без схвалень
## Режим "YOLO" без підтверджень
Якщо ви хочете, щоб виконання на хості працювало без запитів на схвалення, потрібно відкрити **обидва** шари політики:
Якщо ви хочете, щоб виконання на хості працювало без запитів на підтвердження, потрібно відкрити **обидва** шари політики:
- запитану політику виконання в конфігурації OpenClaw (`tools.exec.*`)
- локальну для хоста політику схвалень у `~/.openclaw/exec-approvals.json`
- локальну політику підтверджень хоста в `~/.openclaw/exec-approvals.json`
Тепер це типова поведінка хоста, якщо ви явно не зробите її суворішою:
- `tools.exec.security`: `full` на `gateway`/`node`
- `tools.exec.ask`: `off`
- host `askFallback`: `full`
- `host askFallback`: `full`
Важлива відмінність:
- `tools.exec.host=auto` вибирає, де виконуватиметься exec: у пісочниці, якщо вона доступна, інакше на gateway.
- YOLO визначає, як схвалюється виконання на хості: `security=full` плюс `ask=off`.
- У режимі YOLO OpenClaw не додає окремий евристичний бар’єр схвалення для обфускації команд або шар відхилення попередньої перевірки скриптів поверх налаштованої політики виконання на хості.
- `auto` не робить маршрутизацію через gateway безкоштовним обходом із сесії в пісочниці. Запит `host=node` для окремого виклику дозволено з `auto`, а `host=gateway` дозволено з `auto` лише коли активне середовище пісочниці відсутнє. Якщо вам потрібне стабільне типове значення не `auto`, установіть `tools.exec.host` або явно використовуйте `/exec host=...`.
- `tools.exec.host=auto` вибирає, де запускається виконання: у пісочниці, якщо вона доступна, інакше на gateway.
- YOLO вибирає, як схвалюється виконання на хості: `security=full` плюс `ask=off`.
- У режимі YOLO OpenClaw не додає окремий евристичний бар’єр підтвердження для обфускації команд або додатковий шар відхилення скриптів перед запуском поверх налаштованої політики виконання на хості.
- `auto` не робить маршрутизацію через gateway вільним обхідним шляхом із сеансу в пісочниці. Запит `host=node` для окремого виклику дозволений із `auto`, а `host=gateway` дозволяється з `auto` лише тоді, коли активного середовища пісочниці немає. Якщо вам потрібне стабільне типове значення не `auto`, встановіть `tools.exec.host` або використовуйте `/exec host=...` явно.
Якщо вам потрібне більш консервативне налаштування, знову зробіть будь-який із шарів суворішим до `allowlist` / `on-miss`
Якщо вам потрібне більш консервативне налаштування, зробіть будь-який із шарів суворішим, повернувши `allowlist` / `on-miss`
або `deny`.
Постійне налаштування gateway-host "ніколи не запитувати":
Постійне налаштування "ніколи не запитувати" для хоста gateway:
```bash
openclaw config set tools.exec.host gateway
@ -130,7 +131,7 @@ openclaw config set tools.exec.ask off
openclaw gateway restart
```
Потім налаштуйте файл схвалень хоста відповідно:
Потім налаштуйте файл підтверджень хоста відповідним чином:
```bash
openclaw approvals set --stdin <<'EOF'
@ -145,22 +146,22 @@ openclaw approvals set --stdin <<'EOF'
EOF
```
Локальний скорочений спосіб для тієї ж політики gateway-host на поточній машині:
Локальний скорочений варіант для тієї ж політики хоста gateway на поточній машині:
```bash
openclaw exec-policy preset yolo
```
Цей локальний скорочений спосіб оновлює обидва:
Цей локальний скорочений варіант оновлює обидва значення:
- локальні `tools.exec.host/security/ask`
- локальні типові значення `~/.openclaw/exec-approvals.json`
- локальні типові значення в `~/.openclaw/exec-approvals.json`
Він навмисно працює лише локально. Якщо вам потрібно змінити схвалення gateway-host або node-host
Він навмисно працює лише локально. Якщо вам потрібно змінити підтвердження хоста gateway або хоста node
віддалено, і надалі використовуйте `openclaw approvals set --gateway` або
`openclaw approvals set --node <id|name|ip>`.
Для вузлового хоста застосуйте той самий файл схвалень на цьому вузлі:
Для хоста node застосуйте той самий файл підтверджень на цьому node:
```bash
openclaw approvals set --node <id|name|ip> --stdin <<'EOF'
@ -175,45 +176,45 @@ openclaw approvals set --node <id|name|ip> --stdin <<'EOF'
EOF
```
Важливе обмеження лише для локальної машини:
Важливе обмеження лише для локального використання:
- `openclaw exec-policy` не синхронізує схвалення вузла
- `openclaw exec-policy` не синхронізує підтвердження node
- `openclaw exec-policy set --host node` відхиляється
- схвалення виконання вузла отримуються з вузла під час виконання, тому оновлення, спрямовані на вузол, мають використовувати `openclaw approvals --node ...`
- підтвердження виконання для node отримуються з node під час виконання, тому оновлення, націлені на node, потрібно виконувати через `openclaw approvals --node ...`
Скорочений спосіб лише для сесії:
Скорочений варіант лише для сеансу:
- `/exec security=full ask=off` змінює лише поточну сесію.
- `/elevated full` — це аварійний shortcut, який також пропускає схвалення виконання для цієї сесії.
- `/exec security=full ask=off` змінює лише поточний сеанс.
- `/elevated full` — це аварійний скорочений варіант, який також пропускає підтвердження виконання для цього сеансу.
Якщо файл схвалень хоста залишається суворішим за конфігурацію, усе одно перемагає суворіша політика хоста.
Якщо файл підтверджень хоста залишається суворішим за конфігурацію, все одно перемагає суворіша політика хоста.
## Параметри політики
## Перемикачі політики
### Безпека (`exec.security`)
### Security (`exec.security`)
- **deny**: блокувати всі запити на виконання на хості.
- **allowlist**: дозволяти лише команди зі списку дозволеного.
- **allowlist**: дозволяти лише команди зі списку дозволених елементів.
- **full**: дозволяти все (еквівалентно elevated).
### Ask (`exec.ask`)
- **off**: ніколи не запитувати.
- **on-miss**: запитувати лише тоді, коли список дозволеного не збігається.
- **on-miss**: запитувати лише тоді, коли список дозволених елементів не збігається.
- **always**: запитувати для кожної команди.
- довірений режим `allow-always` не пригнічує запити, коли ефективний режим ask дорівнює `always`
- довготривала довіра `allow-always` не пригнічує запити, коли ефективний режим ask має значення `always`
### Резервна поведінка ask (`askFallback`)
### Ask fallback (`askFallback`)
Якщо потрібен запит на підтвердження, але жоден UI недоступний, резервна поведінка визначає:
Якщо потрібне підтвердження, але жоден UI недосяжний, резервний режим визначає результат:
- **deny**: блокувати.
- **allowlist**: дозволяти лише якщо є збіг зі списком дозволеного.
- **allowlist**: дозволяти лише за збігу зі списком дозволених елементів.
- **full**: дозволяти.
### Посилення для вбудованого eval інтерпретатора (`tools.exec.strictInlineEval`)
### Посилений режим для inline eval в інтерпретаторах (`tools.exec.strictInlineEval`)
Коли `tools.exec.strictInlineEval=true`, OpenClaw розглядає форми вбудованого виконання коду через eval як такі, що потребують явного схвалення, навіть якщо сам двійковий файл інтерпретатора є в списку дозволеного.
Коли `tools.exec.strictInlineEval=true`, OpenClaw трактує форми inline code-eval як такі, що потребують лише явного підтвердження, навіть якщо сам бінарний файл інтерпретатора додано до списку дозволених елементів.
Приклади:
@ -225,15 +226,15 @@ EOF
- `lua -e`
- `osascript -e`
Це захист у глибину для механізмів завантаження інтерпретатора, які не можна чисто зіставити з одним стабільним файловим операндом. У строгому режимі:
Це захист у глибину для завантажувачів інтерпретаторів, які не зіставляються однозначно з одним стабільним файловим операндом. У строгому режимі:
- ці команди все одно потребують явного схвалення;
- `allow-always` не зберігає для них нові записи списку дозволеного автоматично.
- ці команди все одно потребують явного підтвердження;
- `allow-always` не зберігає автоматично нові записи списку дозволених елементів для них.
## Список дозволеного (для кожного агента)
## Список дозволених елементів (для кожного агента)
Списки дозволеного є **окремими для кожного агента**. Якщо існує кілька агентів, перемикайте агента, який ви редагуєте, у застосунку macOS. Патерни — це **глоб-збіги без урахування регістру**. Патерни мають указувати на **шляхи до двійкових файлів** (записи лише з basename ігноруються). Застарілі записи `agents.default` мігрують до `agents.main` під час завантаження.
Shell-ланцюжки, такі як `echo ok && pwd`, усе одно вимагають, щоб кожен сегмент верхнього рівня відповідав правилам списку дозволеного.
Списки дозволених елементів є **окремими для кожного агента**. Якщо існує кілька агентів, перемкніть агента, який редагується, у застосунку для macOS. Шаблони — це **глоб-збіги без урахування регістру**. Шаблони мають вказувати на **шляхи до бінарних файлів** (записи лише з базовою назвою ігноруються). Застарілі записи `agents.default` мігрують у `agents.main` під час завантаження.
Shell-ланцюжки на кшталт `echo ok && pwd` однаково вимагають, щоб кожен сегмент верхнього рівня відповідав правилам списку дозволених елементів.
Приклади:
@ -241,34 +242,41 @@ Shell-ланцюжки, такі як `echo ok && pwd`, усе одно вима
- `~/.local/bin/*`
- `/opt/homebrew/bin/rg`
Кожен запис списку дозволеного відстежує:
Кожен запис списку дозволених елементів відстежує:
- **id** — стабільний UUID, що використовується для ідентифікації в UI (необов’язково)
- **час останнього використання**
- **id** — стабільний UUID для ідентичності в UI (необов’язково)
- **останнє використання** — часову позначку
- **остання використана команда**
- **останній розпізнаний шлях**
- **останній визначений шлях**
## Автодозвіл для CLI зі Skills
Коли ввімкнено **Автодозвіл для CLI зі Skills**, виконувані файли, на які посилаються відомі Skills,
вважаються такими, що входять до списку дозволеного на вузлах (вузол macOS або headless-вузловий хост). Для цього використовується
`skills.bins` через Gateway RPC, щоб отримати список bin-файлів Skills. Вимкніть це, якщо хочете суворі ручні списки дозволеного.
вважаються такими, що входять до списку дозволених елементів на nodes (macOS node або безголовий хост node). Для цього використовується
`skills.bins` через Gateway RPC, щоб отримати список бінарних файлів Skill. Вимкніть це, якщо вам потрібні суворі ручні списки дозволених елементів.
Важливі примітки щодо довіри:
- Це **неявний список дозволеного для зручності**, окремий від ручних записів списку дозволеного за шляхами.
- Він призначений для середовищ із довіреними операторами, де Gateway і вузол перебувають в одній межі довіри.
- Якщо вам потрібна сувора явна довіра, залиште `autoAllowSkills: false` і використовуйте лише ручні записи списку дозволеного за шляхами.
- Це **неявний зручний список дозволених елементів**, окремий від ручних записів списку шляхів.
- Він призначений для середовищ довірених операторів, де Gateway і node перебувають в одній межі довіри.
- Якщо вам потрібна сувора явна довіра, залиште `autoAllowSkills: false` і використовуйте лише ручні записи списку дозволених шляхів.
## Безпечні bin-файли (лише stdin)
## Safe bins (лише stdin)
`tools.exec.safeBins` визначає невеликий список **bin-файлів лише для stdin** (наприклад `cut`), які можуть працювати в режимі allowlist **без** явних записів у списку дозволеного. Безпечні bin-файли відхиляють позиційні файлові аргументи та токени, схожі на шляхи, тому можуть працювати лише з вхідним потоком. Розглядайте це як вузький швидкий шлях для потокових фільтрів, а не як загальний список довіри.
`tools.exec.safeBins` визначає невеликий список **бінарних файлів лише для stdin** (наприклад,
`cut`), які можуть працювати в режимі allowlist **без** явних записів у списку дозволених елементів. Safe bins відхиляють позиційні файлові аргументи та токени, схожі на шляхи, тож
вони можуть працювати лише з вхідним потоком. Сприймайте це як вузький швидкий шлях для
потокових фільтрів, а не як загальний список довіри.
<Warning>
**Не** додавайте двійкові файли інтерпретаторів або середовищ виконання (наприклад `python3`, `node`, `ruby`, `bash`, `sh`, `zsh`) до `safeBins`. Якщо команда за своєю природою може обчислювати код, виконувати підкоманди або читати файли, надавайте перевагу явним записам списку дозволеного й залишайте запити на схвалення ввімкненими. Користувацькі безпечні bin-файли мають визначати явний профіль у `tools.exec.safeBinProfiles.<bin>`.
**Не** додавайте бінарні файли інтерпретаторів або середовищ виконання (наприклад `python3`, `node`,
`ruby`, `bash`, `sh`, `zsh`) до `safeBins`. Якщо команда може обчислювати код,
виконувати підкоманди або читати файли за своєю природою, надавайте перевагу явним записам у списку дозволених елементів
і залишайте запити на підтвердження ввімкненими. Користувацькі safe bins мають визначати явний
профіль у `tools.exec.safeBinProfiles.<bin>`.
</Warning>
Типові безпечні bin-файли:
Типові safe bins:
[//]: # "SAFE_BIN_DEFAULTS:START"
@ -276,163 +284,162 @@ Shell-ланцюжки, такі як `echo ok && pwd`, усе одно вима
[//]: # "SAFE_BIN_DEFAULTS:END"
`grep` і `sort` не входять до типового списку. Якщо ви вирішите їх увімкнути, зберігайте явні записи списку дозволеного для їхніх сценаріїв, що не обмежуються stdin. Для `grep` у режимі safe-bin
`grep` і `sort` не входять до типового списку. Якщо ви явно вмикаєте їх, зберігайте явні
записи списку дозволених елементів для їхніх робочих сценаріїв, відмінних від stdin. Для `grep` у режимі safe-bin
вказуйте шаблон через `-e`/`--regexp`; позиційна форма шаблону відхиляється,
щоб файлові операнди не можна було замаскувати як неоднозначні позиційні аргументи.
щоб файлові операнди не можна було приховано передати як неоднозначні позиційні аргументи.
<AccordionGroup>
<Accordion title="Перевірка argv і заборонені прапорці">
Перевірка є детермінованою лише за формою argv (без перевірок існування
файлової системи хоста), що запобігає поведінці файлового оракула через
відмінності між дозволом і забороною. Файлоорієнтовані опції заборонені для
типових безпечних bin-файлів; довгі опції перевіряються за принципом fail-closed
(невідомі прапорці та неоднозначні скорочення відхиляються).
файлів у файловій системі хоста), що запобігає поведінці оракула існування файлів через відмінності між
дозволом і відмовою. Для типових safe bins файлово-орієнтовані параметри заборонені; довгі параметри перевіряються за принципом fail-closed (невідомі прапорці й неоднозначні скорочення відхиляються).
Заборонені прапорці за профілем safe-bin:
[//]: # "SAFE_BIN_DENIED_FLAGS:START"
- `grep`: `--dereference-recursive`, `--directories`, `--exclude-from`, `--file`, `--recursive`, `-R`, `-d`, `-f`, `-r`
- `jq`: `--argfile`, `--from-file`, `--library-path`, `--rawfile`, `--slurpfile`, `-L`, `-f`
- `sort`: `--compress-program`, `--files0-from`, `--output`, `--random-source`, `--temporary-directory`, `-T`, `-o`
- `wc`: `--files0-from`
- `grep`: `--dereference-recursive`, `--directories`, `--exclude-from`, `--file`, `--recursive`, `-R`, `-d`, `-f`, `-r`
- `jq`: `--argfile`, `--from-file`, `--library-path`, `--rawfile`, `--slurpfile`, `-L`, `-f`
- `sort`: `--compress-program`, `--files0-from`, `--output`, `--random-source`, `--temporary-directory`, `-T`, `-o`
- `wc`: `--files0-from`
[//]: # "SAFE_BIN_DENIED_FLAGS:END"
Безпечні bin-файли також примусово трактують токени argv як **буквальний текст**
під час виконання (без globbing і без розгортання `$VARS`) для сегментів лише зі stdin,
тож шаблони на кшталт `*` або `$HOME/...` не можуть використовуватися для прихованого читання
файлів.
Safe bins також примусово трактують токени argv як **буквальний текст** під
час виконання (без globbing і без розгортання `$VARS`) для сегментів лише зі stdin,
тому шаблони на кшталт `*` або `$HOME/...` не можна використати для прихованого читання
файлів.
</Accordion>
</Accordion>
<Accordion title="Довірені каталоги двійкових файлів">
Безпечні bin-файли мають визначатися з довірених каталогів двійкових файлів (системні типові
значення плюс необов’язкові `tools.exec.safeBinTrustedDirs`). Записи `PATH` ніколи не
стають довіреними автоматично. Типові довірені каталоги навмисно мінімальні:
`/bin`, `/usr/bin`. Якщо виконуваний файл вашого safe-bin розташований у
шляхах менеджера пакетів/користувача (наприклад `/opt/homebrew/bin`,
`/usr/local/bin`, `/opt/local/bin`, `/snap/bin`), додайте їх явно до
`tools.exec.safeBinTrustedDirs`.
</Accordion>
<Accordion title="Довірені каталоги бінарних файлів">
Safe bins мають визначатися з довірених каталогів бінарних файлів (системні типові
значення плюс необов’язкові `tools.exec.safeBinTrustedDirs`). Записи `PATH` ніколи не
вважаються довіреними автоматично. Типові довірені каталоги навмисно мінімальні:
`/bin`, `/usr/bin`. Якщо ваш виконуваний файл safe-bin розташований у
шляхах менеджера пакетів/користувача (наприклад `/opt/homebrew/bin`,
`/usr/local/bin`, `/opt/local/bin`, `/snap/bin`), додайте їх явно до
`tools.exec.safeBinTrustedDirs`.
</Accordion>
<Accordion title="Ланцюжки shell-команд, обгортки та мультиплексори">
Ланцюжки shell-команд (`&&`, `||`, `;`) дозволені, коли кожен сегмент верхнього рівня
відповідає списку дозволеного (включно з безпечними bin-файлами або автодозволом для Skills).
Переспрямування залишаються непідтримуваними в режимі allowlist. Підстановка команд
(`$()` / зворотні лапки) відхиляється під час розбору allowlist, зокрема всередині
подвійних лапок; використовуйте одинарні лапки, якщо вам потрібен буквальний текст `$()`.
<Accordion title="Shell-ланцюжки, обгортки та мультиплексори">
Shell-ланцюжки (`&&`, `||`, `;`) дозволені, якщо кожен сегмент верхнього рівня
відповідає списку дозволених елементів
(включно з safe bins або автодозволом для Skills).
Перенаправлення в режимі allowlist, як і раніше, не підтримуються. Підстановка команд
(`$()` / зворотні лапки) відхиляється під час аналізу allowlist, зокрема всередині
подвійних лапок; використовуйте одинарні лапки, якщо вам потрібен буквальний текст `$()`.
У схваленнях companion app для macOS необроблений shell-текст, що містить керувальний
або розширювальний синтаксис shell (`&&`, `||`, `;`, `|`, `` ` ``, `$`, `<`, `>`, `(`,
`)`), вважається пропуском allowlist, якщо сам двійковий файл shell не
входить до списку дозволеного.
У підтвердженнях застосунку-компаньйона для macOS необроблений shell-текст, що містить shell-керування
або синтаксис розгортання (`&&`, `||`, `;`, `|`, `` ` ``, `$`, `<`, `>`, `(`,
`)`), вважається промахом allowlist, якщо сам shell-бінарний файл не входить до
списку дозволених елементів.
Для shell-обгорток (`bash|sh|zsh ... -c/-lc`) перевизначення env в межах запиту
зводяться до невеликого явного allowlist (`TERM`, `LANG`,
`LC_*`, `COLORTERM`, `NO_COLOR`, `FORCE_COLOR`).
Для shell-обгорток (`bash|sh|zsh ... -c/-lc`) перевизначення env в межах запиту
зводяться до невеликого явного списку дозволених елементів (`TERM`, `LANG`,
`LC_*`, `COLORTERM`, `NO_COLOR`, `FORCE_COLOR`).
Для рішень `allow-always` у режимі allowlist відомі обгортки-диспетчери
(`env`, `nice`, `nohup`, `stdbuf`, `timeout`) зберігають шлях до внутрішнього виконуваного файла
замість шляху до самої обгортки. Shell-мультиплексори (`busybox`, `toybox`) так само
розгортаються для shell-аплетів (`sh`, `ash` тощо). Якщо
обгортку або мультиплексор не можна безпечно розгорнути, запис allowlist не зберігається автоматично.
Для рішень `allow-always` у режимі allowlist відомі обгортки-диспетчери
(`env`, `nice`, `nohup`, `stdbuf`, `timeout`) зберігають шлях внутрішнього виконуваного файла
замість шляху обгортки. Shell-мультиплексори (`busybox`, `toybox`)
так само розгортаються для shell-аплетів (`sh`, `ash` тощо). Якщо
обгортку або мультиплексор неможливо безпечно розгорнути, запис allowlist не зберігається автоматично.
Якщо ви додаєте інтерпретатори на кшталт `python3` або `node` до allowlist, краще
використовувати `tools.exec.strictInlineEval=true`, щоб вбудований eval усе одно вимагав
явного схвалення. У строгому режимі `allow-always` усе ще може зберігати
нешкідливі виклики інтерпретатора/скрипта, але носії inline-eval не зберігаються
автоматично.
Якщо ви додаєте до allowlist інтерпретатори на кшталт `python3` або `node`, краще
встановити `tools.exec.strictInlineEval=true`, щоб inline eval і далі вимагав
явного підтвердження. У строгому режимі `allow-always` усе ще може зберігати нешкідливі
виклики інтерпретатора/скрипта, але носії inline-eval автоматично не зберігаються.
</Accordion>
</AccordionGroup>
### Безпечні bin-файли проти allowlist
### Safe bins порівняно зі списком allowlist
| Тема | `tools.exec.safeBins` | Allowlist (`exec-approvals.json`) |
| ---------------- | ------------------------------------------------------ | ------------------------------------------------------------ |
| Мета | Автодозвіл для вузьких stdin-фільтрів | Явна довіра до конкретних виконуваних файлів |
| Тип збігу | Назва виконуваного файла + політика argv safe-bin | Глоб-патерн для шляху до визначеного виконуваного файла |
| Область аргументів | Обмежена профілем safe-bin і правилами буквальних токенів | Лише збіг за шляхом; за аргументи в іншому відповідаєте ви |
| Тип збігу | Ім’я виконуваного файла + політика argv safe-bin | Glob-шаблон шляху до визначеного виконуваного файла |
| Обсяг аргументів | Обмежений профілем safe-bin і правилами буквальних токенів | Лише збіг шляху; за аргументи в іншому відповідаєте ви |
| Типові приклади | `head`, `tail`, `tr`, `wc` | `jq`, `python3`, `node`, `ffmpeg`, користувацькі CLI |
| Найкраще застосування | Низькоризикові текстові перетворення в конвеєрах | Будь-який інструмент із ширшою поведінкою або побічними ефектами |
| Найкраще використання | Низькоризикові текстові перетворення в конвеєрах | Будь-який інструмент із ширшою поведінкою або побічними ефектами |
Розташування конфігурації:
- `safeBins` надходить із конфігурації (`tools.exec.safeBins` або `agents.list[].tools.exec.safeBins` для окремого агента).
- `safeBinTrustedDirs` надходить із конфігурації (`tools.exec.safeBinTrustedDirs` або `agents.list[].tools.exec.safeBinTrustedDirs` для окремого агента).
- `safeBinProfiles` надходить із конфігурації (`tools.exec.safeBinProfiles` або `agents.list[].tools.exec.safeBinProfiles` для окремого агента). Ключі профілів окремого агента перевизначають глобальні ключі.
- `safeBins` надходить із конфігурації (`tools.exec.safeBins` або `agents.list[].tools.exec.safeBins` для агента).
- `safeBinTrustedDirs` надходить із конфігурації (`tools.exec.safeBinTrustedDirs` або `agents.list[].tools.exec.safeBinTrustedDirs` для агента).
- `safeBinProfiles` надходить із конфігурації (`tools.exec.safeBinProfiles` або `agents.list[].tools.exec.safeBinProfiles` для агента). Ключі профілю для агента перевизначають глобальні ключі.
- записи allowlist зберігаються в локальному для хоста `~/.openclaw/exec-approvals.json` у `agents.<id>.allowlist` (або через Control UI / `openclaw approvals allowlist ...`).
- `openclaw security audit` попереджає через `tools.exec.safe_bins_interpreter_unprofiled`, коли двійкові файли інтерпретатора/середовища виконання з’являються в `safeBins` без явних профілів.
- `openclaw doctor --fix` може згенерувати відсутні користувацькі записи `safeBinProfiles.<bin>` як `{}` (після цього перегляньте й посильте їх). Двійкові файли інтерпретатора/середовища виконання не генеруються автоматично.
- `openclaw security audit` попереджає за допомогою `tools.exec.safe_bins_interpreter_unprofiled`, коли бінарні файли інтерпретатора/середовища виконання з’являються в `safeBins` без явних профілів.
- `openclaw doctor --fix` може створити відсутні користувацькі записи `safeBinProfiles.<bin>` у вигляді `{}` (після цього перегляньте й посильте їх). Бінарні файли інтерпретатора/середовища виконання автоматично не створюються.
Приклад користувацького профілю:
__OC_I18N_900005__
Якщо ви явно додаєте `jq` до `safeBins`, OpenClaw усе одно відхиляє вбудовану команду `env` у режимі safe-bin,
щоб `jq -n env` не міг вивантажити середовище процесу хоста без явного шляху allowlist
або запиту на схвалення.
або запиту на підтвердження.
## Редагування в Control UI
Використовуйте картку **Control UI → Nodes → Exec approvals** для редагування типових значень, перевизначень
для окремих агентів і allowlist. Виберіть область (Defaults або агент), змініть політику,
додайте/видаліть патерни allowlist, а потім натисніть **Save**. UI показує метадані **last used**
для кожного патерна, щоб вам було простіше підтримувати список у впорядкованому стані.
Використовуйте картку **Control UI → Nodes → Exec approvals**, щоб редагувати типові значення, перевизначення
для окремих агентів і списки allowlist. Виберіть область видимості (типові значення або агент), змініть політику,
додайте/видаліть шаблони allowlist, а потім натисніть **Save**. UI показує метадані **останнього використання**
для кожного шаблону, щоб список було зручно підтримувати в порядку.
Селектор цілі вибирає **Gateway** (локальні схвалення) або **Node**. Вузли
мають оголошувати `system.execApprovals.get/set` (застосунок macOS або headless-вузловий хост).
Якщо вузол ще не оголошує exec approvals, редагуйте його локальний
Селектор цілі вибирає **Gateway** (локальні підтвердження) або **Node**. Nodes
мають оголошувати `system.execApprovals.get/set` (застосунок для macOS або безголовий хост node).
Якщо node ще не оголошує підтримку підтверджень виконання, редагуйте його локальний
`~/.openclaw/exec-approvals.json` безпосередньо.
CLI: `openclaw approvals` підтримує редагування gateway або node (див. [Approvals CLI](/cli/approvals)).
CLI: `openclaw approvals` підтримує редагування для gateway або node (див. [CLI підтверджень](/cli/approvals)).
## Потік схвалення
## Потік підтвердження
Коли потрібен запит на схвалення, gateway транслює `exec.approval.requested` клієнтам-операторам.
Control UI і застосунок macOS обробляють це через `exec.approval.resolve`, після чого gateway пересилає
схвалений запит на вузловий хост.
Коли потрібне підтвердження, gateway транслює `exec.approval.requested` клієнтам-операторам.
Control UI і застосунок для macOS обробляють це через `exec.approval.resolve`, після чого gateway пересилає
схвалений запит до хоста node.
Для `host=node` запити на схвалення містять канонічне корисне навантаження `systemRunPlan`. Gateway використовує
цей план як авторитетний контекст команди/cwd/сесії під час пересилання схвалених запитів `system.run`.
Для `host=node` запити на підтвердження включають канонічне корисне навантаження `systemRunPlan`. Gateway використовує
цей план як авторитетний контекст команди/cwd/сеансу під час пересилання схвалених запитів `system.run`.
Це важливо для затримки асинхронного схвалення:
Це важливо для затримки асинхронного підтвердження:
- шлях виконання node готує один канонічний план заздалегідь
- запис схвалення зберігає цей план і його метадані прив’язки
- після схвалення фінальний пересланий виклик `system.run` повторно використовує збережений план
замість довіри до пізніших змін виклику
- якщо виклик змінює `command`, `rawCommand`, `cwd`, `agentId` або
`sessionKey` після створення запиту на схвалення, gateway відхиляє
пересланий запуск як невідповідність схваленню
- шлях виконання node заздалегідь готує один канонічний план
- запис підтвердження зберігає цей план і його метадані прив’язки
- після схвалення остаточний пересланий виклик `system.run` повторно використовує збережений план,
замість того щоб довіряти пізнішим змінам викликача
- якщо викликач змінює `command`, `rawCommand`, `cwd`, `agentId` або
`sessionKey` після створення запиту на підтвердження, gateway відхиляє
пересланий запуск як невідповідність підтвердженню
## Команди інтерпретатора/середовища виконання
Запуски інтерпретатора/середовища виконання, підкріплені схваленням, навмисно є консервативними:
Запуски інтерпретатора/середовища виконання, підкріплені підтвердженням, навмисно зроблено консервативними:
- Точний контекст argv/cwd/env завжди прив’язується.
- Прямі форми shell-скриптів і прямі форми runtime-файлів best-effort прив’язуються до одного конкретного локального
знімка файлу.
- Поширені форми обгорток менеджерів пакетів, які все ще визначаються в один прямий локальний файл (наприклад
- Форми прямого shell-скрипта і прямого файла середовища виконання прив’язуються за принципом максимально можливого наближення до одного конкретного
знімка локального файла.
- Поширені форми обгорток менеджерів пакетів, які все ще визначаються до одного прямого локального файла (наприклад
`pnpm exec`, `pnpm node`, `npm exec`, `npx`), розгортаються перед прив’язкою.
- Якщо OpenClaw не може визначити рівно один конкретний локальний файл для команди інтерпретатора/середовища виконання
(наприклад package scripts, форми eval, ланцюжки завантажувачів, специфічні для runtime, або неоднозначні багатофайлові
форми), виконання, підкріплене схваленням, відхиляється замість того, щоб заявляти семантичне покриття, якого воно не
має.
- Для таких сценаріїв краще використовувати пісочницю, окрему межу хоста або явний
довірений робочий процес allowlist/full, де оператор приймає ширшу семантику runtime.
(наприклад, для пакетних скриптів, форм eval, специфічних для середовища виконання ланцюжків завантаження або неоднозначних багатофайлових
форм), виконання, підкріплене підтвердженням, відхиляється замість того, щоб заявляти семантичне покриття, якого
насправді немає.
- Для таких сценаріїв краще використовувати пісочницю, окрему межу хоста або явний довірений
процес allowlist/full, де оператор приймає ширшу семантику середовища виконання.
Коли потрібні схвалення, інструмент exec негайно повертає ідентифікатор схвалення. Використовуйте цей ідентифікатор, щоб
зіставляти пізніші системні події (`Exec finished` / `Exec denied`). Якщо до завершення часу очікування
рішення не надходить, запит розглядається як тайм-аут схвалення й відображається як причина відмови.
Коли потрібні підтвердження, інструмент exec відразу повертає id підтвердження. Використовуйте цей id, щоб
зіставляти пізніші системні події (`Exec finished` / `Exec denied`). Якщо до завершення
тайм-ауту не надходить рішення, запит вважається тайм-аутом підтвердження і відображається як причина відмови.
### Поведінка доставки наступного повідомлення
### Поведінка доставки подальших повідомлень
Після завершення схваленого асинхронного exec OpenClaw надсилає наступний хід `agent` у ту саму сесію.
Після завершення схваленого асинхронного виконання OpenClaw надсилає подальший хід `agent` до того самого сеансу.
- Якщо існує коректна зовнішня ціль доставки (канал доставки плюс цільовий `to`), доставка наступного повідомлення використовує цей канал.
- У потоках лише webchat або внутрішніх сесій без зовнішньої цілі доставка наступного повідомлення залишається лише в межах сесії (`deliver: false`).
- Якщо виклик явно запитує сувору зовнішню доставку без жодного визначуваного зовнішнього каналу, запит завершується помилкою `INVALID_REQUEST`.
- Якщо ввімкнено `bestEffortDeliver` і жоден зовнішній канал не може бути визначений, доставка знижується до лише-сесійної замість помилки.
- Якщо існує дійсна зовнішня ціль доставки (канал, який підтримує доставку, плюс ціль `to`), доставка подальших повідомлень використовує цей канал.
- У потоках лише webchat або внутрішнього сеансу без зовнішньої цілі доставка подальших повідомлень залишається лише в межах сеансу (`deliver: false`).
- Якщо викликач явно запитує сувору зовнішню доставку без зовнішнього каналу, який можна визначити, запит завершується помилкою `INVALID_REQUEST`.
- Якщо ввімкнено `bestEffortDeliver` і жоден зовнішній канал не вдається визначити, доставка знижується до лише-сеансової замість помилки.
Діалог підтвердження містить:
@ -440,116 +447,116 @@ Control UI і застосунок macOS обробляють це через `e
- cwd
- id агента
- визначений шлях до виконуваного файла
- метадані хоста + політики
- хост + метадані політики
Дії:
- **Allow once**виконати зараз
- **Always allow** → додати до allowlist + виконати
- **Allow once**запустити зараз
- **Always allow** → додати до allowlist + запустити
- **Deny** → заблокувати
## Пересилання схвалень до чат-каналів
## Пересилання підтверджень до чат-каналів
Ви можете пересилати запити на схвалення exec до будь-якого чат-каналу (включно з каналами Plugin) і схвалювати
їх за допомогою `/approve`. Для цього використовується звичайний конвеєр вихідної доставки.
Ви можете пересилати запити на підтвердження exec до будь-якого чат-каналу (включно з каналами Plugin) і схвалювати
їх через `/approve`. Для цього використовується звичайний конвеєр вихідної доставки.
Конфігурація:
__OC_I18N_900006__
Відповідь у чаті:
__OC_I18N_900007__
Команда `/approve` обробляє як exec approvals, так і схвалення Plugin. Якщо ID не відповідає жодному очікуваному схваленню exec, вона автоматично перевіряє натомість схвалення Plugin.
Команда `/approve` обробляє як підтвердження exec, так і підтвердження Plugin. Якщо ID не збігається з очікуваним підтвердженням exec, вона автоматично перевіряє підтвердження Plugin.
### Пересилання схвалень Plugin
### Пересилання підтверджень Plugin
Пересилання схвалень Plugin використовує той самий конвеєр доставки, що й exec approvals, але має власну
Пересилання підтверджень Plugin використовує той самий конвеєр доставки, що й підтвердження exec, але має власну
незалежну конфігурацію в `approvals.plugin`. Увімкнення або вимкнення одного не впливає на інше.
__OC_I18N_900008__
Форма конфігурації ідентична `approvals.exec`: `enabled`, `mode`, `agentFilter`,
`sessionFilter` і `targets` працюють однаково.
`sessionFilter` і `targets` працюють так само.
Канали, які підтримують спільні інтерактивні відповіді, відображають ті самі кнопки схвалення як для exec, так і для
схвалень Plugin. Канали без спільного інтерактивного UI використовують звичайний текст із
інструкціями `/approve`.
Канали, що підтримують спільні інтерактивні відповіді, відображають однакові кнопки підтвердження як для exec, так і для
підтверджень Plugin. Канали без спільного інтерактивного UI повертаються до звичайного тексту з інструкціями
`/approve`.
### Схвалення в тому самому чаті на будь-якому каналі
### Підтвердження в тому самому чаті на будь-якому каналі
Коли запит на схвалення exec або Plugin походить із чат-поверхні, придатної для доставки, цей самий чат
тепер може схвалити його через `/approve` типово. Це застосовується до таких каналів, як Slack, Matrix і
Microsoft Teams, на додачу до вже наявних потоків Web UI та terminal UI.
Коли запит на підтвердження exec або Plugin походить із чат-поверхні, що підтримує доставку, цей самий чат
тепер типово може схвалити його через `/approve`. Це застосовується до таких каналів, як Slack, Matrix і
Microsoft Teams, на додачу до вже наявних потоків у Web UI та terminal UI.
Цей спільний шлях текстових команд використовує звичайну модель автентифікації каналу для цієї розмови. Якщо
чат-джерело вже може надсилати команди й отримувати відповіді, запитам на схвалення більше не потрібен
окремий нативний адаптер доставки лише для того, щоб залишатися очікуваними.
Цей спільний шлях текстової команди використовує звичайну модель автентифікації каналу для цієї розмови. Якщо
початковий чат уже може надсилати команди й отримувати відповіді, для запитів на підтвердження більше не потрібен
окремий нативний адаптер доставки лише для того, щоб вони залишалися очікуваними.
Discord і Telegram також підтримують `/approve` у тому самому чаті, але ці канали все одно використовують свій
визначений список затверджувачів для авторизації, навіть коли нативну доставку схвалень вимкнено.
Discord і Telegram також підтримують `/approve` у тому самому чаті, але ці канали все ще використовують свій
визначений список затверджувачів для авторизації, навіть коли нативну доставку підтверджень вимкнено.
Для Telegram та інших нативних клієнтів схвалення, які викликають Gateway напряму,
цей резервний механізм навмисно обмежено збоями типу "схвалення не знайдено". Реальна
відмова/помилка схвалення exec не повторюється мовчки як схвалення Plugin.
Для Telegram та інших нативних клієнтів підтвердження, які викликають Gateway безпосередньо,
цей запасний механізм навмисно обмежено помилками типу «підтвердження не знайдено». Справжня
відмова/помилка підтвердження exec не повторюється мовчки як підтвердження Plugin.
### Нативна доставка схвалень
### Нативна доставка підтверджень
Деякі канали також можуть діяти як нативні клієнти схвалення. Нативні клієнти додають DM для затверджувачів, fanout у початковий чат
і специфічний для каналу інтерактивний UX схвалення поверх спільного потоку `/approve`
Деякі канали також можуть діяти як нативні клієнти підтвердження. Нативні клієнти додають DM для затверджувачів, fanout до початкового чату
та специфічний для каналу інтерактивний UX підтвердження поверх спільного потоку `/approve`
у тому самому чаті.
Коли доступні нативні картки/кнопки схвалення, цей нативний UI є основним
шляхом для агента. Агент також не повинен дублювати звичайну чат-команду
`/approve`, якщо тільки результат інструмента не вказує, що чат-схвалення недоступні або
ручне схвалення — єдиний шлях, що залишився.
Коли доступні нативні картки/кнопки підтвердження, цей нативний UI є основним
шляхом, видимим агенту. Агент також не повинен дублювати звичайну чат-команду
`/approve`, якщо результат інструмента не вказує, що чат-підтвердження недоступні або
ручне підтвердження є єдиним шляхом, що залишився.
Загальна модель:
- політика виконання на хості все одно визначає, чи потрібне схвалення exec
- `approvals.exec` керує пересиланням запитів на схвалення до інших чат-цілей
- `channels.<channel>.execApprovals` керує тим, чи діє цей канал як нативний клієнт схвалення
- політика виконання на хості все одно визначає, чи потрібне підтвердження exec
- `approvals.exec` керує пересиланням запитів на підтвердження до інших чат-цілей
- `channels.<channel>.execApprovals` керує тим, чи діє цей канал як нативний клієнт підтвердження
Нативні клієнти схвалення автоматично вмикають доставку спочатку в DM, коли виконуються всі ці умови:
Нативні клієнти підтвердження автоматично вмикають доставку спочатку в DM, коли всі наведені умови істинні:
- канал підтримує нативну доставку схвалень
- затверджувачів можна визначити з явних `execApprovals.approvers` або з
документованих резервних джерел цього каналу
- `channels.<channel>.execApprovals.enabled` не встановлено або дорівнює `"auto"`
- канал підтримує нативну доставку підтверджень
- затверджувачів можна визначити з явних `execApprovals.approvers` або з документованих резервних джерел цього
каналу
- `channels.<channel>.execApprovals.enabled` не встановлено або має значення `"auto"`
Установіть `enabled: false`, щоб явно вимкнути нативний клієнт схвалення. Установіть `enabled: true`, щоб примусово
увімкнути його, коли затверджувачів визначено. Публічна доставка в початковий чат залишається явною через
Установіть `enabled: false`, щоб явно вимкнути нативний клієнт підтвердження. Установіть `enabled: true`, щоб примусово
увімкнути його, коли затверджувачі визначаються. Публічна доставка до початкового чату й надалі явно керується через
`channels.<channel>.execApprovals.target`.
FAQ: [Чому для чат-схвалень існують дві конфігурації схвалення exec?](/help/faq#why-are-there-two-exec-approval-configs-for-chat-approvals)
FAQ: [Чому для підтверджень exec у чаті є дві конфігурації?](/help/faq#why-are-there-two-exec-approval-configs-for-chat-approvals)
- Discord: `channels.discord.execApprovals.*`
- Slack: `channels.slack.execApprovals.*`
- Telegram: `channels.telegram.execApprovals.*`
Ці нативні клієнти схвалення додають маршрутизацію в DM та необов’язковий fanout у канал поверх спільного
потоку `/approve` у тому самому чаті та спільних кнопок схвалення.
Ці нативні клієнти підтвердження додають маршрутизацію в DM і необов’язковий fanout до каналу поверх спільного
потоку `/approve` у тому самому чаті та спільних кнопок підтвердження.
Спільна поведінка:
- Slack, Matrix, Microsoft Teams та подібні чати з можливістю доставки використовують звичайну модель автентифікації каналу
- Slack, Matrix, Microsoft Teams та подібні чати з підтримкою доставки використовують звичайну модель автентифікації каналу
для `/approve` у тому самому чаті
- коли нативний клієнт схвалення вмикається автоматично, типовою нативною ціллю доставки є DM затверджувачів
- для Discord і Telegram лише визначені затверджувачі можуть схвалювати або забороняти
- затверджувачі Discord можуть бути явними (`execApprovals.approvers`) або виведеними з `commands.ownerAllowFrom`
- затверджувачі Telegram можуть бути явними (`execApprovals.approvers`) або виведеними з наявної конфігурації власника (`allowFrom`, плюс `defaultTo` для прямих повідомлень, де це підтримується)
- затверджувачі Slack можуть бути явними (`execApprovals.approvers`) або виведеними з `commands.ownerAllowFrom`
- нативні кнопки Slack зберігають тип id схвалення, тож ідентифікатори `plugin:` можуть визначати схвалення Plugin
- коли нативний клієнт підтвердження вмикається автоматично, типовою нативною ціллю доставки є DM затверджувачів
- для Discord і Telegram лише визначені затверджувачі можуть схвалювати або відхиляти
- затверджувачі Discord можуть бути явними (`execApprovals.approvers`) або виводитися з `commands.ownerAllowFrom`
- затверджувачі Telegram можуть бути явними (`execApprovals.approvers`) або виводитися з наявної конфігурації власника (`allowFrom`, плюс `defaultTo` для direct-message, де це підтримується)
- затверджувачі Slack можуть бути явними (`execApprovals.approvers`) або виводитися з `commands.ownerAllowFrom`
- нативні кнопки Slack зберігають тип id підтвердження, тому id `plugin:` можуть визначати підтвердження Plugin
без другого локального для Slack резервного шару
- нативна маршрутизація Matrix для DM/каналу та ярлики реакцій обробляють і exec, і схвалення Plugin;
авторизація Plugin все одно надходить із `channels.matrix.dm.allowFrom`
- нативна маршрутизація Matrix у DM/канал і швидкі реакції обробляють як підтвердження exec, так і Plugin;
авторизація Plugin і далі надходить із `channels.matrix.dm.allowFrom`
- запитувач не обов’язково має бути затверджувачем
- початковий чат може схвалювати напряму через `/approve`, коли цей чат уже підтримує команди й відповіді
- нативні кнопки схвалення Discord маршрутизуються за типом id схвалення: ідентифікатори `plugin:` переходять
безпосередньо до схвалень Plugin, усе інше переходить до схвалень exec
- нативні кнопки схвалення Telegram дотримуються того самого обмеженого резервного переходу від exec до Plugin, що й `/approve`
- коли нативний `target` вмикає доставку в початковий чат, запити на схвалення містять текст команди
- очікувані схвалення exec типово спливають через 30 хвилин
- якщо жоден UI оператора або налаштований клієнт схвалення не може прийняти запит, запит переходить до `askFallback`
- початковий чат може підтвердити запит безпосередньо через `/approve`, коли цей чат уже підтримує команди та відповіді
- нативні кнопки підтвердження Discord маршрутизують за типом id підтвердження: id `plugin:` переходять
безпосередньо до підтверджень Plugin, усе інше — до підтверджень exec
- нативні кнопки підтвердження Telegram дотримуються того самого обмеженого резервного переходу від exec до Plugin, що й `/approve`
- коли нативний `target` вмикає доставку до початкового чату, запити на підтвердження включають текст команди
- очікувані підтвердження exec типово спливають через 30 хвилин
- якщо жоден UI оператора або налаштований клієнт підтвердження не може прийняти запит, підтвердження переходить до `askFallback`
Telegram типово використовує DM затверджувачів (`target: "dm"`). Ви можете перемкнути на `channel` або `both`, якщо
хочете, щоб запити на схвалення також з’являлися в початковому чаті/темі Telegram. Для тем форуму Telegram
OpenClaw зберігає тему для запиту на схвалення та наступного повідомлення після схвалення.
Для Telegram типовим є DM затверджувачів (`target: "dm"`). Ви можете переключитися на `channel` або `both`, якщо
хочете, щоб запити на підтвердження також з’являлися в початковому чаті/темі Telegram. Для тем форуму Telegram
OpenClaw зберігає тему для запиту на підтвердження і подальшого повідомлення після підтвердження.
Дивіться:
@ -560,9 +567,9 @@ OpenClaw зберігає тему для запиту на схвалення
__OC_I18N_900009__
Примітки щодо безпеки:
- Режим Unix-сокета `0600`, токен зберігається в `exec-approvals.json`.
- Перевірка peer з тим самим UID.
- Challenge/response (nonce + HMAC token + хеш запиту) + короткий TTL.
- Режим Unix socket `0600`, токен зберігається в `exec-approvals.json`.
- Перевірка однотипного UID.
- Challenge/response (nonce + HMAC token + hash запиту) + короткий TTL.
## Системні події
@ -572,34 +579,34 @@ __OC_I18N_900009__
- `Exec finished`
- `Exec denied`
Вони публікуються в сесію агента після того, як вузол повідомляє про подію.
Схвалення exec на gateway-host надсилають ті самі події життєвого циклу, коли команда завершується (і необов’язково коли виконується довше за поріг).
Exec із контролем через схвалення повторно використовують id схвалення як `runId` у цих повідомленнях для зручного зіставлення.
Вони публікуються в сеансі агента після того, як node повідомляє про подію.
Підтвердження exec на хості gateway генерують ті самі події життєвого циклу, коли команда завершується (і, за потреби, під час виконання довше за поріг).
Exec, які проходять через підтвердження, повторно використовують id підтвердження як `runId` у цих повідомленнях для зручного зіставлення.
## Поведінка при відхиленому схваленні
## Поведінка при відхиленні підтвердження
Коли асинхронне схвалення exec відхиляється, OpenClaw не дозволяє агенту повторно використовувати
вивід із будь-якого попереднього запуску тієї самої команди в сесії. Причина відмови
передається з явною вказівкою, що вивід команди недоступний, що зупиняє
агента від тверджень про наявність нового виводу або повторення відхиленої команди зі
Коли асинхронне підтвердження exec відхиляється, OpenClaw не дозволяє агенту повторно використовувати
вивід будь-якого попереднього запуску тієї самої команди в межах сеансу. Причина відмови
передається з явною вказівкою, що жодного виводу команди немає, що зупиняє
агента від заяв про новий вивід або повторення відхиленої команди зі
застарілими результатами попереднього успішного запуску.
## Наслідки
- **full** — потужний режим; за можливості надавайте перевагу allowlist.
- **ask** залишає вас у циклі, водночас даючи змогу швидко схвалювати.
- Списки дозволеного для окремих агентів не дають схваленням одного агента проникати до інших.
- Схвалення застосовуються лише до запитів на виконання на хості від **авторизованих відправників**. Неавторизовані відправники не можуть викликати `/exec`.
- `/exec security=full` — це зручний параметр рівня сесії для авторизованих операторів, і він навмисно пропускає схвалення. Щоб жорстко заблокувати виконання на хості, установіть для безпеки схвалень `deny` або забороніть інструмент `exec` через політику інструментів.
- **full** має широкі повноваження; де можливо, віддавайте перевагу allowlist.
- **ask** тримає вас у контурі, водночас дозволяючи швидкі підтвердження.
- Списки allowlist для окремих агентів не дають підтвердженням одного агента просочуватися до інших.
- Підтвердження застосовуються лише до запитів host exec від **авторизованих відправників**. Неавторизовані відправники не можуть викликати `/exec`.
- `/exec security=full` — це зручний варіант на рівні сеансу для авторизованих операторів, який навмисно пропускає підтвердження. Щоб жорстко заблокувати host exec, установіть для security підтверджень значення `deny` або забороніть інструмент `exec` через політику інструментів.
## Пов’язане
<CardGroup cols={2}>
<Card title="Інструмент exec" href="/uk/tools/exec" icon="terminal">
<Card title="Інструмент Exec" href="/uk/tools/exec" icon="terminal">
Інструмент виконання shell-команд.
</Card>
<Card title="Режим elevated" href="/uk/tools/elevated" icon="shield-exclamation">
Аварійний шлях, який також пропускає схвалення.
Аварійний шлях, який також пропускає підтвердження.
</Card>
<Card title="Пісочниця" href="/uk/gateway/sandboxing" icon="box">
Режими пісочниці та доступ до робочого простору.
@ -607,8 +614,8 @@ Exec із контролем через схвалення повторно ви
<Card title="Безпека" href="/uk/gateway/security" icon="lock">
Модель безпеки та посилення захисту.
</Card>
<Card title="Пісочниця проти політики інструментів проти elevated" href="/uk/gateway/sandbox-vs-tool-policy-vs-elevated" icon="sliders">
Коли варто використовувати кожен із цих механізмів.
<Card title="Пісочниця vs політика інструментів vs elevated" href="/uk/gateway/sandbox-vs-tool-policy-vs-elevated" icon="sliders">
Коли слід використовувати кожен із цих механізмів керування.
</Card>
<Card title="Skills" href="/uk/tools/skills" icon="sparkles">
Поведінка автодозволу на основі Skills.