exec і wait.
Ця сторінка документує режим коду OpenClaw. Це не режим коду Codex. Ці дві
функції мають спільну назву, але реалізовані різними середовищами виконання та
надають різні контракти exec:
- Codex Code Mode увімкнено для потоків сервера застосунку Codex, якщо
обмежувальна політика інструментів не вимикає нативний режим коду. Він працює
в середовищі програмування Codex, де модель записує команди оболонки через
контракт
exec.command. - Режим коду OpenClaw вимкнено, якщо не налаштовано
tools.codeMode.enabled: true. Він працює в загальному середовищі виконання агентів OpenClaw, де модель записує програми JavaScript або TypeScript через контрактexec.code.
quickjs-wasi, прихований каталог інструментів OpenClaw і
звичайний виконавець інструментів OpenClaw.
Що це?
Режим коду OpenClaw дає моделі змогу писати невелику програму JavaScript або TypeScript замість прямого вибору з довгого списку інструментів. Коли режим коду активний:- Список інструментів, видимий моделі, містить рівно
execіwait. execоцінює згенерований моделлю JavaScript або TypeScript в обмеженому воркері QuickJS-WASI.- Звичайні інструменти OpenClaw приховано з підказки моделі та надано всередині
гостьової програми через
ALL_TOOLSіtools. - Гостьовий код може шукати в прихованому каталозі, описувати інструмент і викликати інструмент через той самий шлях виконання OpenClaw, який використовується звичайними ходами агента.
- Інструменти MCP згруповано в просторі імен
MCP. У режимі коду цей простір імен є єдиним підтримуваним способом викликати інструменти MCP. waitвідновлює призупинений запуск у режимі коду, коли вкладені виклики інструментів усе ще очікують виконання.
Чому це добре?
Режим коду спрощує використання великих каталогів інструментів для моделей.- Менша поверхня підказки: провайдери отримують два керівні інструменти замість десятків або сотень повних схем інструментів.
- Краща оркестрація: модель може використовувати цикли, об’єднання, невеликі перетворення, умовну логіку та паралельні вкладені виклики інструментів в одній комірці коду.
- Нейтральність щодо провайдера: це працює для OpenClaw, Plugin, MCP та клієнтських інструментів без залежності від нативного виконання коду провайдером.
- Наявна політика залишається чинною: вкладені виклики інструментів і далі проходять через політики OpenClaw, схвалення, хуки, контекст сеансу та шляхи аудиту.
- Зрозумілий режим відмови: коли режим коду явно ввімкнено, а середовище виконання недоступне, OpenClaw завершує запуск із закритою відмовою замість повернення до широкого прямого показу інструментів.
Як його ввімкнути
Додайтеtools.codeMode.enabled: true до конфігурації агента або середовища
виконання:
tools.codeMode пропущено, має значення
false або є об’єктом без enabled: true.
Коли ви використовуєте ізольованих агентів із налаштованими серверами MCP, також
переконайтеся, що політика інструментів пісочниці дозволяє вбудований Plugin
MCP, наприклад через tools.sandbox.tools.alsoAllow: ["bundle-mcp"]. Див.
Конфігурація - інструменти та власні провайдери.
Використовуйте явні обмеження, коли потрібні жорсткіші межі:
exec і wait. Якщо потрібне відредаговане корисне
навантаження провайдера, додайте OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted на
короткий сеанс налагодження.
Технічний огляд
Решта цієї сторінки описує контракт середовища виконання та деталі реалізації. Вона призначена для супровідників, авторів Plugin, які налагоджують показ інструментів, і операторів, що перевіряють розгортання з високим ризиком.Стан середовища виконання
- Середовище виконання:
quickjs-wasi. - Стан за замовчуванням: вимкнено.
- Стабільність: експериментальна поверхня OpenClaw; Codex Code mode є окремою стабільною поверхнею середовища Codex.
- Цільова поверхня: загальні запуски агентів OpenClaw.
- Позиція щодо безпеки: код моделі є ворожим.
- Обіцянка для користувача: увімкнення режиму коду ніколи безшумно не повертається до широкого прямого показу інструментів.
Область дії
Режим коду відповідає за форму оркестрації, звернену до моделі, для підготовленого запуску. Він не відповідає за вибір моделі, поведінку каналів, автентифікацію, політику інструментів або реалізації інструментів. Входить до області дії:- видимі моделі визначення інструментів
execіwait - побудова прихованого каталогу інструментів
- виконання гостьового JavaScript і TypeScript
- середовище виконання воркера QuickJS-WASI
- зворотні виклики хоста для пошуку в каталозі, опису схеми та виклику інструмента
- відновлюваний стан для призупинених гостьових програм
- обмеження виводу, часу очікування, пам’яті, очікуваних викликів і знімків
- телеметрія та проєкція траєкторії для вкладених викликів інструментів
- нативне для провайдера віддалене виконання коду
- семантика виконання оболонки
- зміна наявної авторизації інструментів
- постійні скрипти, написані користувачем
- доступ до менеджера пакетів, файлів, мережі або модулів у гостьовому коді
- пряме повторне використання внутрішніх компонентів Codex Code mode
Терміни
Режим коду — це режим середовища виконання OpenClaw, який приховує звичайні інструменти моделі та надає лишеexec і wait.
Гостьове середовище виконання — це VM JavaScript QuickJS-WASI, яка оцінює
код моделі.
Міст хоста — це вузька JSON-сумісна поверхня зворотних викликів із
гостьового коду назад в OpenClaw.
Каталог — це обмежений запуском список ефективних інструментів після
звичайної політики інструментів і розв’язання Plugin, MCP та клієнтських
інструментів.
Вкладений виклик інструмента — це виклик інструмента, зроблений із
гостьового коду через міст хоста.
Знімок — це серіалізований стан VM QuickJS-WASI, збережений, щоб wait міг
продовжити призупинений запуск у режимі коду.
Конфігурація
tools.codeMode.enabled — це перемикач активації. Налаштування інших полів
режиму коду не вмикає функцію.
Підтримувані поля:
enabled: булеве значення. За замовчуваннямfalse. Вмикає режим коду лише коли значенняtrue.runtime:"quickjs-wasi". Єдине підтримуване середовище виконання.mode:"only". Надаєexecіwait, приховує звичайні інструменти моделі.languages: масив"javascript"і"typescript". За замовчуванням містить обидві мови.timeoutMs: обмеження за реальним часом для одногоexecабоwait. За замовчуванням10000. Обмеження середовища виконання: від100до60000.memoryLimitBytes: обмеження купи QuickJS. За замовчуванням67108864. Обмеження середовища виконання: від1048576до1073741824.maxOutputBytes: обмеження для повернутого тексту, JSON і журналів. За замовчуванням65536. Обмеження середовища виконання: від1024до10485760.maxSnapshotBytes: обмеження для серіалізованих знімків VM. За замовчуванням10485760. Обмеження середовища виконання: від1024до268435456.maxPendingToolCalls: обмеження для одночасних вкладених викликів інструментів. За замовчуванням16. Обмеження середовища виконання: від1до128.snapshotTtlSeconds: як довго призупинену VM можна відновити. За замовчуванням900. Обмеження середовища виконання: від1до86400.searchDefaultLimit: кількість результатів пошуку в прихованому каталозі за замовчуванням. За замовчуванням8. Середовище виконання обмежує це значення доmaxSearchLimit.maxSearchLimit: максимальна кількість результатів пошуку в прихованому каталозі. За замовчуванням50. Обмеження середовища виконання: від1до50.
Активація
Режим коду оцінюється після визначення ефективної політики інструментів і перед складанням остаточного запиту до моделі. Порядок активації:- Розв’язати агента, модель, провайдера, пісочницю, канал, відправника та політику запуску.
- Побудувати ефективний список інструментів OpenClaw.
- Додати придатні інструменти Plugin, MCP і клієнтські інструменти.
- Застосувати політики дозволу та заборони.
- Якщо
tools.codeMode.enabledмає значення false, продовжити зі звичайним показом інструментів. - Якщо ввімкнено і для запуску активні інструменти, зареєструвати ефективні інструменти в каталозі режиму коду.
- Видалити всі звичайні інструменти зі списку інструментів, видимого моделі.
- Додати
execіwaitрежиму коду.
disableTools або порожній список дозволених, не активують поверхню режиму
коду, навіть якщо конфігурація містить tools.codeMode.enabled: true.
Каталог режиму коду обмежений запуском. Він не повинен пропускати інструменти з
іншого агента, сеансу, відправника або запуску.
Інструменти, видимі моделі
Коли режим коду активний, модель бачить рівно ці інструменти верхнього рівня:execwait
exec для оркестрації інструментів, об’єднання
даних, циклів, паралельних вкладених викликів і структурованих перетворень.
Модель має використовувати wait лише тоді, коли exec повертає відновлюваний
результат waiting.
exec
exec запускає комірку режиму коду та повертає один результат. Вхідний код
генерується моделлю і має вважатися ворожим.
Вхід:
- Одне з
codeабоcommandмає бути непорожнім. code— задокументоване поле, звернене до моделі.commandприймається як сумісний з exec псевдонім для політик хуків і довірених переписувань; коли присутні обидва поля, значення мають збігатися.- Зовнішні події хуків
execрежиму коду містятьtoolKind: "code_mode_exec"і містятьtoolInputKind: "javascript" | "typescript", коли мова входу відома, щоб політики могли відрізняти комірки режиму коду від викликівexecу стилі оболонки, які мають таку саму назву інструмента. languageза замовчуванням має значення"javascript".- Якщо
languageмає значення"typescript", OpenClaw транспілює перед оцінюванням. execвідхиляєimport,require, динамічний import і шаблони завантажувача модулів у v1.execне надає звичайну реалізацію оболонкиexecрекурсивно.
exec повертає waiting, коли VM QuickJS призупиняється з відновлюваним
станом, який усе ще потребує видимого моделі продовження. Результат містить
runId для wait. Виклики мосту простору імен, включно з викликами простору
імен MCP, автоматично вичерпуються всередині того самого виклику exec/wait,
поки вони готові, тож компактний блок коду може перевірити $api() і викликати
інструмент MCP без примусу до одного виклику інструмента моделі на кожне
очікування простору імен.
exec повертає completed лише тоді, коли гостьова VM не має незавершеної роботи, а
фінальне значення є JSON-сумісним після виконання адаптера виводу OpenClaw.
wait
wait продовжує призупинену VM режиму коду.
Вхідні дані:
CodeModeResult, яке повертає exec.
wait існує тому, що вкладені інструменти OpenClaw можуть бути повільними,
інтерактивними, обмеженими схваленням або транслювати часткові оновлення.
Модель не повинна тримати один довгий виклик exec відкритим, поки хост чекає
на зовнішню роботу.
Знімок і відновлення QuickJS-WASI є механізмом відновлення v1:
execвиконує код до завершення, помилки або призупинення.- Під час призупинення OpenClaw створює знімок QuickJS VM і записує очікувану роботу хоста.
- Коли очікувана робота завершується,
waitвідновлює знімок VM. - OpenClaw повторно реєструє callback-и хоста за стабільними іменами.
- OpenClaw передає результати вкладених інструментів у відновлену VM.
- OpenClaw вичерпує очікувані завдання QuickJS.
waitповертаєcompleted,failedабо інший результатwaiting.
wait завершується помилкою, коли:
runIdневідомий.- строк дії знімка минув.
- батьківський запуск або сесію було перервано.
- викликач не перебуває в тій самій області запуску/сесії.
- відновлення QuickJS-WASI завершується помилкою.
- відновлення перевищило б налаштовані ліміти.
API гостьового runtime
Гостьовий runtime надає невеликий глобальний API:ALL_TOOLS — це компактні метадані для каталогу в межах запуску. За
замовчуванням вони не містять повних схем.
tools.call(...) або зручні
функції в режимі коду. Вони доступні лише через згенерований простір імен MCP.
Файли декларацій у стилі TypeScript доступні через віртуальну поверхню файлів
лише для читання API, тож агенти можуть перевіряти сигнатури MCP без додавання
схем MCP до prompt:
API.read("mcp/<server>.d.ts") повертає компактні декларації, виведені з
метаданих інструментів MCP:
exec у режимі коду OpenClaw будує каталог
інструментів у межах запуску, зберігає видимі записи MCP, рендерить
mcp/index.d.ts плюс одну декларацію mcp/<server>.d.ts для кожного видимого
сервера та вводить цю невелику таблицю лише для читання у worker QuickJS.
Гостьовий код бачить лише об’єкт API: API.list(prefix?) повертає метадані
файлів, а API.read(path) повертає вміст вибраної декларації. Невідомі шляхи та
сегменти . / .. відхиляються.
Це не допускає великі схеми MCP до prompt моделі. Агент дізнається, що
віртуальний API існує, з опису інструмента exec, читає лише потрібний файл
декларації, а потім викликає MCP.<server>.<tool>() з одним об’єктним
аргументом. MCP.<server>.$api() залишається доступним як вбудований запасний
варіант, коли агенту потрібна відповідь зі схемою одного інструмента всередині
програми.
Гостьовий runtime не повинен напряму відкривати об’єкти хоста. Вхідні та вихідні
дані перетинають міст як JSON-сумісні значення з явними обмеженнями розміру.
Внутрішні простори імен
Внутрішні простори імен дають режиму коду стислий доменний API без додавання більшої кількості видимих для моделі інструментів. Інтеграція, якою володіє завантажувач, може зареєструвати простір імен, як-отIssues, Fictions або
Calendar; гостьовий код тоді викликає цей простір імен усередині програми
QuickJS, тоді як OpenClaw усе ще показує моделі лише exec і wait.
Простори імен наразі є внутрішніми. Публічного API простору імен у plugin SDK
немає: зовнішнім просторам імен Plugin потрібен контракт, яким володіє
завантажувач, щоб ідентичність Plugin, установлені маніфести, стан автентифікації
та кешовані дескриптори каталогу не розходилися з інструментами Plugin, які
підтримують простір імен. Основний режим коду володіє лише пісочницею,
серіалізацією, обмеженням каталогу та диспетчеризацією мосту.
Гостьовий код тоді може використовувати або прямий глобальний об’єкт, або мапу
namespaces:
Життєвий цикл реєстру
Реєстр просторів імен є локальним для процесу та ключується за id простору імен. Типовий запуск проходить таким шляхом:- Довірений завантажувач викликає
registerCodeModeNamespaceForPlugin(pluginId, registration). - Режим коду створює прихований
ToolSearchRuntimeдля запуску та читає його каталог у межах запуску. createCodeModeNamespaceRuntime(ctx, catalog)залишає лише реєстрації, у яких усіrequiredToolNamesвидимі та належать тому самомуpluginId.- Кожен видимий простір імен викликає
createScope(ctx)для поточного запуску. Область отримує контекст запуску, як-отagentId,sessionKey,sessionId,runId, конфігурацію та стан переривання. - Дані області серіалізуються у простий дескриптор і вводяться в QuickJS як
прямі глобальні об’єкти та
namespaces.<globalName>. - Гостьові виклики призупиняються через міст worker, визначають шлях простору
імен на хості, зіставляють виклик із оголошеним інструментом каталогу, яким
володіє Plugin, і виконують цей інструмент через
ToolSearchRuntime.call. - OpenClaw автоматично вичерпує готові виклики мосту простору імен усередині
активного виклику інструмента
exec/wait. Якщо робота простору імен усе ще очікує на момент тайм-ауту або гість явно поступається керуванням,waitпізніше відновлює той самий runtime простору імен. - Відкат або видалення Plugin викликає
clearCodeModeNamespacesForPlugin(pluginId), щоб застарілі глобальні об’єкти не пережили невдале завантаження Plugin.
tools.call(...).
Форма реєстрації
Реєструйте простори імен з інтеграції, яка володіє базовими інструментами. Тримайте область малою та відкривайте лише доменні дієслова, які зіставляються з оголошеними інструментами каталогу.createCodeModeNamespaceTool(toolName, inputMapper) позначає член області як
викличну функцію простору імен. Необов’язковий inputMapper отримує гостьові
аргументи та повертає об’єкт вхідних даних для базового інструмента каталогу. Без
мапера вхідних даних використовується перший гостьовий аргумент або {}, якщо
його пропущено.
Сирі функції хоста відхиляються до запуску гостьового коду:
Володіння та видимість
Володіння простором імен прив’язане доpluginId викликача реєстрації.
requiredToolNames є одночасно шлюзом видимості та перевіркою володіння:
- кожен потрібний інструмент має існувати в каталозі запуску
- кожен потрібний інструмент має мати
sourceName === pluginId - простір імен приховується, коли будь-який потрібний інструмент відсутній або належить іншому Plugin
- кожен викличний шлях може націлюватися лише на інструмент, названий у
requiredToolNames
Правила серіалізації області
createScope(ctx) може повертати простий об’єкт, що містить JSON-сумісні
значення, масиви, вкладені об’єкти та маркери виклику
createCodeModeNamespaceTool(...). Об’єкти хоста ніколи не потрапляють
безпосередньо в QuickJS.
Серіалізатор відхиляє:
- сирі функції
- циклічні графи об’єктів
- небезпечні сегменти шляху:
__proto__,constructor,prototype, порожні ключі або ключі, що містять внутрішній розділювач шляху - значення
globalName, які не є ідентифікаторами JavaScript - конфлікти
globalNameз вбудованими глобальними об’єктами режиму коду, як-отtools,namespaces,text,json,yield_controlабо__openclaw*
Prompts
description простору імен і необов’язковий prompt додаються до видимої для
моделі схеми exec лише тоді, коли простір імен видимий для цього запуску.
Використовуйте їх, щоб навчити найменшій корисній поверхні:
Очищення
Namespaces є локальними для процесу реєстраціями. Видаляйте їх, коли Plugin-власник вимкнено, видалено або відкочено:clearCodeModeNamespacesForTest(),
щоб уникнути витоку реєстрацій між випадками.
Контрольний список тестування
Зміни просторів імен мають покривати межу безпеки та поведінку гостьового коду:- текст підказки простору імен з’являється лише тоді, коли базові інструменти видимі
- інструменти з такою самою назвою з іншого
sourceNameне відкривають простір імен - необроблені функції області дії відхиляються
- підроблені ідентифікатори просторів імен і підроблені шляхи відхиляються
- викличні шляхи не можуть націлюватися на неоголошені інструменти
- вкладені об’єкти та спільні посилання серіалізуються правильно
- виклики простору імен виконуються через інструменти каталогу й повертають JSON-безпечні деталі
- помилки може перехоплювати гостьовий код
- призупинені виклики простору імен відновлюються через
wait - відкат Plugin очищає реєстрації простору імен, що йому належать
tools.search / tools.call. Використовуйте
каталог для довільних увімкнених інструментів OpenClaw, Plugin і клієнта; використовуйте MCP для
інструментів MCP; використовуйте інші простори імен для належних Plugin задокументованих доменних API, де
лаконічний код надійніший за повторні пошуки схем.
API виводу
text(value) додає читабельний для людини вивід до масиву output.
json(value) додає структурований елемент виводу після JSON-сумісної
серіалізації.
Кінцеве повернене значення гостьового коду стає value у результаті completed.
Елемент виводу:
- порядок виводу відповідає викликам гостьового коду
- вивід обмежено
maxOutputBytes - несеріалізовані значення перетворюються на звичайні рядки або помилки
- двійкові значення не підтримуються у v1
- зображення та файли передаються через звичайні інструменти OpenClaw, а не через міст режиму коду
Каталог інструментів
Прихований каталог містить інструменти після ефективної фільтрації політик:- Основні інструменти OpenClaw.
- Інструменти вбудованих Plugin.
- Інструменти зовнішніх Plugin.
- Інструменти MCP.
- Інструменти, надані клієнтом, для поточного запуску.
execwaittool_search_codetool_searchtool_describetool_call
ALL_TOOLS, tools.search(...),
tools.describe(...) і tools.call(...), видимі гостьовому коду, не містять записів MCP. Згенерований
простір імен MCP.<server>.<tool>({ ...input }) зіставляється назад із точним ідентифікатором
каталогу, а потім диспетчеризується через той самий шлях виконавця.
Взаємодія з пошуком інструментів
Режим коду замінює поверхню моделі OpenClaw для пошуку інструментів у запусках, де він активний. Колиtools.codeMode.enabled дорівнює true і режим коду активується:
- OpenClaw не відкриває
tool_search_code,tool_search,tool_describeабоtool_callяк інструменти, видимі моделі. - Та сама ідея каталогізації переходить усередину гостьового середовища виконання.
- Гостьове середовище виконання отримує компактні метадані
ALL_TOOLSі помічники пошуку, опису та виклику для інструментів не-MCP. - Виклики MCP використовують згенерований простір імен
MCPта його заголовки$api()замістьtools.call(...). - Вкладені виклики диспетчеризуються через той самий шлях виконавця OpenClaw, який використовує пошук інструментів.
exec і wait.
Назви інструментів і колізії
Видимий моделі інструментexec є інструментом режиму коду. Якщо звичайний інструмент оболонки OpenClaw
exec увімкнено, він прихований від моделі й каталогізується як будь-який
інший інструмент.
Усередині гостьового середовища виконання:
tools.call("openclaw:core:exec", input)може викликати інструмент оболонки exec, якщо політика це дозволяє.tools.exec(...)встановлюється лише тоді, коли запис каталогу оболонки exec має однозначну безпечну назву.- інструмент режиму коду
execніколи не доступний рекурсивно черезtools.
tools.call(id, input).
Вкладене виконання інструментів
Кожен вкладений виклик інструмента перетинає міст хоста й повторно входить в OpenClaw. Вкладене виконання зберігає:- ідентифікатор активного агента
- ідентифікатор сеансу та ключ сеансу
- контекст відправника й каналу
- політику пісочниці
- політику затверджень
- хуки Plugin
before_tool_call - сигнал переривання
- потокові оновлення, де вони доступні
- події траєкторії та аудиту
maxPendingToolCalls.
Стан середовища виконання
Кожен запуск режиму коду має машину станів:running: VM виконується або вкладені виклики ще тривають.waiting: знімок VM існує й може бути відновлений черезwait.completed: кінцеве значення повернено; знімок видалено.failed: помилку повернено; знімок видалено.expired: знімок або очікуваний стан перевищив строк зберігання; відновлення неможливе.aborted: батьківський запуск/сеанс скасовано; знімок видалено.
wait з
іншого запуску або сеансу завершується помилкою.
Сховище знімків обмежене:
- максимальна кількість байтів знімка на запуск
- максимальна кількість активних знімків на процес
- TTL знімка
- очищення після завершення запуску
- очищення під час вимкнення Gateway, де сталість не підтримується
Середовище виконання QuickJS-WASI
OpenClaw завантажуєquickjs-wasi як пряму залежність у пакеті-власнику. Середовище
виконання не покладається на транзитивну копію, встановлену для proxy, PAC або інших
непов’язаних залежностей.
Обов’язки середовища виконання:
- компілювати або завантажувати WebAssembly-модуль QuickJS-WASI
- створювати одну ізольовану VM для кожного запуску або відновлення режиму коду
- реєструвати зворотні виклики хоста за стабільними назвами
- встановлювати обмеження пам’яті та переривань
- оцінювати JavaScript
- спорожнювати очікувані завдання
- створювати знімок призупиненого стану VM
- відновлювати знімки для
wait - звільняти дескриптори VM і знімки після термінальних станів
TypeScript
Підтримка TypeScript є лише перетворенням джерела:- прийнятий вхід: один рядок коду TypeScript
- вихід: рядок JavaScript, який оцінюється QuickJS-WASI
- без перевірки типів
- без розв’язання модулів
- без
importабоrequireу v1 - діагностика повертається як результати
failed
Межа безпеки
Код моделі є ворожим. Середовище виконання використовує багаторівневий захист:- запускати QuickJS-WASI поза головним циклом подій
- завантажувати
quickjs-wasiяк пряму залежність, а не через Codex або транзитивний пакет - без файлової системи, мережі, підпроцесів, імпорту модулів, змінних середовища або глобальних об’єктів хоста в гостьовому коді
- використовувати обмеження пам’яті та переривань QuickJS
- застосовувати таймаут настінного часу батьківського процесу
- застосовувати ліміти виводу, знімків, журналів і очікуваних викликів
- серіалізувати значення мосту хоста через вузький JSON-адаптер
- перетворювати помилки хоста на звичайні помилки гостьового коду, ніколи не на об’єкти realm хоста
- відкидати знімки під час таймауту, переривання, завершення сеансу або закінчення строку дії
- відхиляти рекурсивний доступ до
exec,waitі керівних інструментів пошуку інструментів - запобігати тому, щоб колізії зручних назв затіняли помічники каталогу
Коди помилок
Error хоста, об’єкти
стека, прототипи та функції хоста не переходять у QuickJS.
Телеметрія
Режим коду повідомляє:- видимі назви інструментів, надіслані моделі
- розмір прихованого каталогу та розподіл за джерелами
- кількість
execіwait - кількість вкладених пошуків, описів і викликів
- ідентифікатори викликаних вкладених інструментів
- збої через таймаут, пам’ять, знімки та ліміти виводу
- події життєвого циклу знімків
Налагодження
Використовуйте цільове журналювання транспорту моделі, коли режим коду поводиться інакше, ніж звичайний запуск інструмента:OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted.
Це журналює обмежений, відредагований JSON-знімок запиту моделі; його слід
використовувати лише під час налагодження, тому що підказки й текст повідомлень усе ще можуть з’являтися.
Для налагодження потоку використовуйте OPENCLAW_DEBUG_SSE=peek, щоб журналювати перші п’ять
відредагованих подій SSE. Режим коду також закривається з помилкою, якщо кінцевий payload провайдера
не містить рівно exec і wait після активації поверхні режиму коду.
Схема реалізації
Одиниці реалізації:- контракт конфігурації:
tools.codeMode - побудовник каталогу: ефективні інструменти в компактні записи та карту ідентифікаторів
- адаптер поверхні моделі: замінює видимі інструменти на
execіwait - адаптер середовища виконання QuickJS-WASI: завантаження, eval, знімок, відновлення, звільнення
- supervisor worker: таймаут, переривання, ізоляція аварій
- адаптер мосту: JSON-безпечні зворотні виклики хоста та доставка результатів
- адаптер перетворення TypeScript
- сховище знімків: TTL, ліміти розміру, обмеження запуском/сеансом
- проєкція траєкторії для вкладених викликів інструментів
- лічильники телеметрії та діагностика
node:vm як пісочницю.
Контрольний список валідації
Покриття режиму коду має довести:- вимкнена конфігурація залишає наявну експозицію інструментів без змін
- об’єктна конфігурація без
enabled: trueзалишає режим коду вимкненим - увімкнена конфігурація відкриває моделі лише
execіwait, коли інструменти активні для запуску - сирі запуски без інструментів,
disableToolsі порожні allowlist не запускають примусове застосування payload режиму коду - усі ефективні інструменти не-MCP з’являються в
ALL_TOOLS - заборонені інструменти не з’являються в
ALL_TOOLS tools.search,tools.describeіtools.callпрацюють для інструментів OpenClawAPI.list("mcp")іAPI.read("mcp/<server>.d.ts")відкривають оголошення MCP у стилі TypeScript без виклику мосту/інструмента- простір імен MCP
$api()залишається доступним як вбудований fallback для схем - виклики простору імен MCP працюють для видимих інструментів MCP з одним об’єктним вводом, тоді як
прямі записи каталогу MCP відсутні в
tools.* - керівні інструменти Tool Search приховані і від поверхні моделі, і від прихованого каталогу
- вкладені виклики зберігають поведінку затверджень і хуків
- shell
execприхований від моделі, але його можна викликати за ідентифікатором каталогу, коли це дозволено - рекурсивні
execіwaitрежиму коду не можна викликати з гостьового коду - ввід TypeScript трансформується та оцінюється без завантаження TypeScript на вимкнених шляхах або шляхах лише JavaScript
- доступ до
import,require, файлової системи, мережі та середовища завершується невдачею - нескінченні цикли завершуються за тайм-аутом і не можуть блокувати Gateway
- збої через обмеження пам’яті завершують роботу гостьової VM
- обмеження виводу та snapshot застосовуються для завершених і призупинених викликів
waitвідновлює призупинений snapshot і повертає фінальне значення- прострочені, перервані, неправильні для сеансу та невідомі значення
runIdзавершуються невдачею - відтворення transcript і persistence зберігають керівні виклики режиму коду
- transcript і telemetry чітко показують вкладені виклики інструментів
План E2E-тестування
Запускайте їх як інтеграційні або наскрізні тести під час зміни runtime:- Запустіть Gateway з
tools.codeMode.enabled: false. - Надішліть хід агента з невеликим прямим набором інструментів.
- Переконайтеся, що видимі для моделі інструменти не змінилися.
- Перезапустіть із
tools.codeMode.enabled: true. - Надішліть хід агента з тестовими інструментами OpenClaw, Plugin, MCP і клієнта.
- Переконайтеся, що видимий для моделі список інструментів точно дорівнює
exec,wait. - У
execпрочитайтеALL_TOOLSі переконайтеся, що ефективні тестові інструменти присутні. - У
execвикличте інструменти OpenClaw/Plugin/клієнта черезtools.search,tools.describeіtools.call. - У
execвикличтеAPI.list("mcp")іAPI.read("mcp/<server>.d.ts")та переконайтеся, що файли оголошень описують видимі інструменти MCP. - У
execвикличте інструменти MCP черезMCP.<server>.<tool>({ ...input })і переконайтеся, що прямі записи каталогу MCP відсутні вALL_TOOLSіtools.*. - Переконайтеся, що заборонені інструменти відсутні та їх не можна викликати за вгаданим ідентифікатором.
- Запустіть вкладений виклик інструмента, який завершується після того, як
execповертаєwaiting. - Викличте
waitі переконайтеся, що відновлена VM отримує результат інструмента. - Переконайтеся, що фінальна відповідь містить вивід, створений після відновлення.
- Переконайтеся, що тайм-аут, переривання та завершення строку дії snapshot очищають стан runtime.
- Експортуйте trajectory і переконайтеся, що вкладені виклики видимі під батьківським викликом режиму коду.
pnpm check:docs.