exec dan wait.
Halaman ini mendokumentasikan mode kode OpenClaw. Ini bukan mode Codex Code. Kedua
fitur memiliki nama yang sama, tetapi diimplementasikan oleh runtime yang berbeda dan mengekspos
kontrak exec yang berbeda:
- Codex Code Mode diaktifkan untuk thread app-server Codex kecuali kebijakan tool
terbatas menonaktifkan mode kode native. Fitur ini berjalan di harness coding Codex,
tempat model menulis perintah shell melalui kontrak
exec.command. - Mode kode OpenClaw dinonaktifkan kecuali
tools.codeMode.enabled: truedikonfigurasi. Fitur ini berjalan di runtime agen generik OpenClaw, tempat model menulis program JavaScript atau TypeScript melalui kontrakexec.code.
quickjs-wasi, katalog tool OpenClaw
tersembunyi, dan eksekutor tool OpenClaw normal.
Apa ini?
Mode kode OpenClaw memungkinkan model menulis program JavaScript atau TypeScript kecil alih-alih memilih langsung dari daftar tool yang panjang. Saat mode kode aktif:- Daftar tool yang terlihat oleh model persis
execdanwait. execmengevaluasi JavaScript atau TypeScript yang dihasilkan model di dalam worker QuickJS-WASI yang dibatasi.- Tool OpenClaw normal disembunyikan dari prompt model dan diekspos di dalam
program tamu melalui
ALL_TOOLSdantools. - Kode tamu dapat mencari katalog tersembunyi, mendeskripsikan tool, dan memanggil tool melalui jalur eksekusi OpenClaw yang sama yang digunakan oleh giliran agen normal.
- Tool MCP dikelompokkan di bawah namespace
MCP. Dalam mode kode, namespace ini adalah satu-satunya cara yang didukung untuk memanggil tool MCP. waitmelanjutkan run mode kode yang ditangguhkan saat panggilan tool bersarang masih tertunda.
Mengapa ini bagus?
Mode kode membuat katalog tool besar lebih mudah digunakan oleh model.- Surface prompt lebih kecil: provider menerima dua tool kontrol alih-alih puluhan atau ratusan skema tool lengkap.
- Orkestrasi yang lebih baik: model dapat menggunakan loop, join, transformasi kecil, logika bersyarat, dan panggilan tool bersarang paralel di dalam satu sel kode.
- Netral provider: fitur ini bekerja untuk OpenClaw, Plugin, MCP, dan tool klien tanpa bergantung pada eksekusi kode native provider.
- Kebijakan yang ada tetap berlaku: panggilan tool bersarang tetap melewati kebijakan, persetujuan, hook, konteks sesi, dan jalur audit OpenClaw.
- Mode kegagalan jelas: saat mode kode diaktifkan secara eksplisit dan runtime tidak tersedia, OpenClaw gagal tertutup alih-alih fallback ke eksposur tool langsung yang luas.
Cara mengaktifkannya
Tambahkantools.codeMode.enabled: true ke config agen atau runtime:
tools.codeMode dihilangkan, false, atau berupa objek
tanpa enabled: true.
Saat Anda menggunakan agen tersandbox dengan server MCP yang dikonfigurasi, pastikan juga
kebijakan tool sandbox mengizinkan Plugin MCP bawaan, misalnya dengan
tools.sandbox.tools.alsoAllow: ["bundle-mcp"]. Lihat
Konfigurasi - tool dan provider kustom.
Gunakan batas eksplisit saat Anda menginginkan batas yang lebih ketat:
exec dan
wait. Jika Anda memerlukan payload provider yang telah disunting, tambahkan
OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted untuk sesi debugging singkat.
Tur teknis
Sisa halaman ini menjelaskan kontrak runtime dan detail implementasi. Ini ditujukan untuk maintainer, penulis Plugin yang men-debug eksposur tool, dan operator yang memvalidasi deployment berisiko tinggi.Status runtime
- Runtime:
quickjs-wasi. - Status default: dinonaktifkan.
- Stabilitas: surface OpenClaw eksperimental; mode Codex Code adalah surface harness Codex stabil yang terpisah.
- Surface target: run agen OpenClaw generik.
- Postur keamanan: kode model bersifat hostile.
- Janji yang menghadap pengguna: mengaktifkan mode kode tidak pernah diam-diam fallback ke eksposur tool langsung yang luas.
Cakupan
Mode kode memiliki bentuk orkestrasi yang menghadap model untuk run yang sudah disiapkan. Fitur ini tidak memiliki pemilihan model, perilaku channel, auth, kebijakan tool, atau implementasi tool. Dalam cakupan:- definisi tool
execdanwaityang terlihat oleh model - konstruksi katalog tool tersembunyi
- eksekusi tamu JavaScript dan TypeScript
- runtime worker QuickJS-WASI
- callback host untuk pencarian katalog, deskripsi skema, dan panggilan tool
- state yang dapat dilanjutkan untuk program tamu yang ditangguhkan
- batas output, timeout, memori, panggilan tertunda, dan snapshot
- telemetri dan proyeksi trajectory untuk panggilan tool bersarang
- eksekusi kode jarak jauh native provider
- semantik eksekusi shell
- mengubah otorisasi tool yang ada
- skrip persisten yang ditulis pengguna
- akses package manager, file, jaringan, atau modul dalam kode tamu
- penggunaan ulang langsung internal mode Codex Code
Istilah
Mode kode adalah mode runtime OpenClaw yang menyembunyikan tool model normal dan hanya mengeksposexec dan wait.
Runtime tamu adalah VM JavaScript QuickJS-WASI yang mengevaluasi kode model.
Bridge host adalah surface callback sempit yang kompatibel JSON dari kode tamu
kembali ke OpenClaw.
Katalog adalah daftar tool efektif berskop run setelah kebijakan tool normal,
resolusi Plugin, MCP, dan tool klien.
Panggilan tool bersarang adalah panggilan tool yang dibuat dari kode tamu melalui bridge host.
Snapshot adalah state VM QuickJS-WASI yang diserialisasi dan disimpan agar wait dapat melanjutkan
run mode kode yang ditangguhkan.
Konfigurasi
tools.codeMode.enabled adalah gerbang aktivasi. Mengatur field mode kode lain
tidak mengaktifkan fitur ini.
Field yang didukung:
enabled: boolean. Defaultfalse. Mengaktifkan mode kode hanya saattrue.runtime:"quickjs-wasi". Satu-satunya runtime yang didukung.mode:"only". Mengeksposexecdanwait, menyembunyikan tool model normal.languages: array berisi"javascript"dan"typescript". Default mencakup keduanya.timeoutMs: batas wall-clock untuk satuexecatauwait. Default10000. Clamp runtime:100hingga60000.memoryLimitBytes: batas heap QuickJS. Default67108864. Clamp runtime:1048576hingga1073741824.maxOutputBytes: batas untuk teks, JSON, dan log yang dikembalikan. Default65536. Clamp runtime:1024hingga10485760.maxSnapshotBytes: batas untuk snapshot VM yang diserialisasi. Default10485760. Clamp runtime:1024hingga268435456.maxPendingToolCalls: batas untuk panggilan tool bersarang konkuren. Default16. Clamp runtime:1hingga128.snapshotTtlSeconds: berapa lama VM yang ditangguhkan dapat dilanjutkan. Default900. Clamp runtime:1hingga86400.searchDefaultLimit: jumlah hasil pencarian katalog tersembunyi default. Default8. Runtime meng-clamp ini kemaxSearchLimit.maxSearchLimit: jumlah maksimum hasil pencarian katalog tersembunyi. Default50. Clamp runtime:1hingga50.
Aktivasi
Mode kode dievaluasi setelah kebijakan tool efektif diketahui dan sebelum permintaan model final disusun. Urutan aktivasi:- Resolve agen, model, provider, sandbox, channel, pengirim, dan kebijakan run.
- Bangun daftar tool OpenClaw efektif.
- Tambahkan tool Plugin, MCP, dan klien yang memenuhi syarat.
- Terapkan kebijakan allow dan deny.
- Jika
tools.codeMode.enabledfalse, lanjutkan dengan eksposur tool normal. - Jika diaktifkan dan tool aktif untuk run, daftarkan tool efektif dalam katalog mode kode.
- Hapus semua tool normal dari daftar tool yang terlihat oleh model.
- Tambahkan
execdanwaitmode kode.
disableTools,
atau allowlist kosong, tidak mengaktifkan surface mode kode walaupun config
berisi tools.codeMode.enabled: true.
Katalog mode kode berskop run. Katalog ini tidak boleh membocorkan tool dari agen,
sesi, pengirim, atau run lain.
Tool yang terlihat oleh model
Saat mode kode aktif, model melihat persis tool tingkat atas berikut:execwait
exec untuk orkestrasi tool, penggabungan data, loop,
panggilan bersarang paralel, dan transformasi terstruktur. Model sebaiknya menggunakan
wait hanya saat exec mengembalikan hasil waiting yang dapat dilanjutkan.
exec
exec memulai sel mode kode dan mengembalikan satu hasil. Kode input dihasilkan model
dan harus diperlakukan sebagai hostile.
Input:
- Salah satu dari
codeataucommandharus tidak kosong. codeadalah field terdokumentasi yang menghadap model.commandditerima sebagai alias yang kompatibel dengan exec untuk kebijakan hook dan rewrite tepercaya; saat keduanya ada, nilainya harus cocok.- Event hook
execmode kode luar menyertakantoolKind: "code_mode_exec"dan menyertakantoolInputKind: "javascript" | "typescript"saat bahasa input diketahui, sehingga kebijakan dapat membedakan sel mode kode dari panggilanexecbergaya shell yang berbagi nama tool yang sama. languagedefault ke"javascript".- Jika
languageadalah"typescript", OpenClaw mentranspilasi sebelum evaluasi. execmenolakimport,require, import dinamis, dan pola module-loader di v1.exectidak mengekspos implementasiexecshell normal secara rekursif.
exec mengembalikan waiting saat VM QuickJS ditangguhkan dengan state yang dapat dilanjutkan yang
masih memerlukan kelanjutan yang terlihat oleh model. Hasilnya menyertakan runId untuk
wait. Panggilan bridge namespace, termasuk panggilan namespace MCP, dikuras otomatis
di dalam panggilan exec/wait yang sama selama siap, sehingga blok kode yang ringkas
dapat memeriksa $api() dan memanggil tool MCP tanpa memaksa satu panggilan tool model per
await namespace.
exec mengembalikan completed hanya ketika VM tamu tidak memiliki pekerjaan tertunda dan nilai akhir kompatibel dengan JSON setelah adapter output OpenClaw berjalan.
wait
wait melanjutkan VM mode kode yang ditangguhkan.
Input:
CodeModeResult yang sama seperti yang dikembalikan oleh exec.
wait ada karena alat OpenClaw bertingkat dapat lambat, interaktif, dibatasi persetujuan, atau mengalirkan pembaruan parsial. Model tidak perlu mempertahankan satu panggilan exec yang panjang terbuka sementara host menunggu pekerjaan eksternal.
Snapshot dan pemulihan QuickJS-WASI adalah mekanisme lanjutkan v1:
execmengevaluasi kode hingga selesai, gagal, atau ditangguhkan.- Saat penangguhan, OpenClaw mengambil snapshot VM QuickJS dan mencatat pekerjaan host yang tertunda.
- Ketika pekerjaan tertunda selesai,
waitmemulihkan snapshot VM. - OpenClaw mendaftarkan ulang callback host dengan nama stabil.
- OpenClaw mengirimkan hasil alat bertingkat ke VM yang dipulihkan.
- OpenClaw menguras pekerjaan QuickJS yang tertunda.
waitmengembalikan hasilcompleted,failed, atauwaitinglainnya.
wait gagal ketika:
runIdtidak dikenal.- snapshot kedaluwarsa.
- run atau sesi induk dibatalkan.
- pemanggil tidak berada dalam cakupan run/sesi yang sama.
- pemulihan QuickJS-WASI gagal.
- pemulihan akan melampaui batas yang dikonfigurasi.
API runtime tamu
Runtime tamu mengekspos API global kecil:ALL_TOOLS adalah metadata ringkas untuk katalog bercakupan run. Secara default, ini tidak berisi skema lengkap.
tools.call(...) atau fungsi praktis dalam mode kode. Entri tersebut hanya diekspos melalui namespace MCP yang dihasilkan. File deklarasi bergaya TypeScript tersedia melalui permukaan file virtual API hanya-baca, sehingga agen dapat memeriksa tanda tangan MCP tanpa menambahkan skema MCP ke prompt:
API.read("mcp/<server>.d.ts") mengembalikan deklarasi ringkas yang disimpulkan dari metadata alat MCP:
exec mode kode, OpenClaw membangun katalog alat bercakupan run, mempertahankan entri MCP yang terlihat, merender mcp/index.d.ts ditambah satu deklarasi mcp/<server>.d.ts per server yang terlihat, dan menyuntikkan tabel kecil hanya-baca itu ke worker QuickJS. Kode tamu hanya melihat objek API: API.list(prefix?) mengembalikan metadata file dan API.read(path) mengembalikan konten deklarasi yang dipilih. Jalur yang tidak dikenal serta segmen . / .. ditolak.
Ini menjaga skema MCP besar tetap di luar prompt model. Agen mengetahui bahwa API virtual ada dari deskripsi alat exec, hanya membaca file deklarasi yang diperlukan, lalu memanggil MCP.<server>.<tool>() dengan satu argumen objek. MCP.<server>.$api() tetap tersedia sebagai fallback inline ketika agen memerlukan respons skema satu alat di dalam program.
Runtime tamu tidak boleh mengekspos objek host secara langsung. Input dan output melintasi bridge sebagai nilai yang kompatibel dengan JSON dengan batas ukuran eksplisit.
Namespace internal
Namespace internal memberi mode kode API domain yang ringkas tanpa menambahkan lebih banyak alat yang terlihat oleh model. Integrasi milik loader dapat mendaftarkan namespace sepertiIssues, Fictions, atau Calendar; kode tamu kemudian memanggil namespace tersebut di dalam program QuickJS sementara OpenClaw tetap hanya menampilkan exec dan wait kepada model.
Namespace bersifat internal untuk saat ini. Tidak ada API namespace SDK Plugin publik: namespace plugin eksternal memerlukan kontrak milik loader agar identitas plugin, manifes terpasang, status autentikasi, dan deskriptor katalog cache tidak menyimpang dari alat plugin yang mendukung namespace. Mode kode inti hanya memiliki sandbox, serialisasi, gating katalog, dan pengiriman bridge.
Kode tamu kemudian dapat menggunakan global langsung atau peta namespaces:
Siklus hidup registry
Registry namespace bersifat lokal proses dan dikunci berdasarkan id namespace. Run umum mengikuti jalur ini:- Loader tepercaya memanggil
registerCodeModeNamespaceForPlugin(pluginId, registration). - Mode kode membuat
ToolSearchRuntimetersembunyi untuk run dan membaca katalog bercakupan run-nya. createCodeModeNamespaceRuntime(ctx, catalog)hanya mempertahankan pendaftaran yang semuarequiredToolNames-nya terlihat dan dimiliki olehpluginIdyang sama.- Setiap namespace yang terlihat memanggil
createScope(ctx)untuk run saat ini. Scope menerima konteks run sepertiagentId,sessionKey,sessionId,runId, config, dan status abort. - Data scope diserialisasi menjadi deskriptor polos dan disuntikkan ke QuickJS sebagai global langsung dan
namespaces.<globalName>. - Panggilan tamu ditangguhkan melalui bridge worker, menyelesaikan jalur namespace pada host, memetakan panggilan ke alat katalog milik plugin yang dideklarasikan, dan mengeksekusi alat tersebut melalui
ToolSearchRuntime.call. - OpenClaw otomatis menguras panggilan bridge namespace yang siap di dalam panggilan alat
exec/waitaktif. Jika pekerjaan namespace masih tertunda saat timeout atau tamu secara eksplisit yield,waitmelanjutkan runtime namespace yang sama nanti. - Rollback atau pencopotan plugin memanggil
clearCodeModeNamespacesForPlugin(pluginId)sehingga global usang tidak bertahan dari pemuatan plugin yang gagal.
tools.call(...).
Bentuk pendaftaran
Daftarkan namespace dari integrasi yang memiliki alat pendukung. Jaga scope tetap kecil dan hanya ekspos verba domain yang memetakan ke alat katalog yang dideklarasikan.createCodeModeNamespaceTool(toolName, inputMapper) menandai anggota scope sebagai fungsi namespace yang dapat dipanggil. inputMapper opsional menerima argumen tamu dan mengembalikan objek input untuk alat katalog pendukung. Tanpa mapper input, argumen tamu pertama digunakan, atau {} ketika dihilangkan.
Fungsi host mentah ditolak sebelum kode tamu berjalan:
Kepemilikan dan visibilitas
Kepemilikan namespace terikat kepluginId milik pemanggil pendaftaran. requiredToolNames adalah gate visibilitas sekaligus pemeriksaan kepemilikan:
- setiap alat wajib harus ada dalam katalog run
- setiap alat wajib harus memiliki
sourceName === pluginId - namespace disembunyikan ketika ada alat wajib yang tidak ada atau dimiliki oleh plugin lain
- setiap jalur yang dapat dipanggil hanya boleh menargetkan alat yang disebutkan dalam
requiredToolNames
Aturan serialisasi scope
createScope(ctx) dapat mengembalikan objek polos yang berisi nilai kompatibel JSON, array, objek bertingkat, dan penanda panggilan createCodeModeNamespaceTool(...). Objek host tidak pernah masuk ke QuickJS secara langsung.
Serializer menolak:
- fungsi mentah
- grafik objek sirkular
- segmen jalur tidak aman:
__proto__,constructor,prototype, kunci kosong, atau kunci yang berisi pemisah jalur internal - nilai
globalNameyang bukan identifier JavaScript - tabrakan
globalNamedengan global mode kode bawaan sepertitools,namespaces,text,json,yield_control, atau__openclaw*
Prompt
description namespace dan prompt opsional ditambahkan ke skema exec yang terlihat oleh model hanya ketika namespace terlihat untuk run tersebut. Gunakan keduanya untuk mengajarkan permukaan berguna terkecil:
Pembersihan
Namespace adalah registrasi lokal proses. Hapus saat Plugin pemiliknya dinonaktifkan, dihapus instalasinya, atau di-rollback:clearCodeModeNamespacesForTest() untuk menghindari kebocoran registrasi
antar kasus.
Daftar periksa pengujian
Perubahan namespace harus mencakup batas keamanan dan perilaku tamu:- teks prompt namespace hanya muncul saat alat pendukung terlihat
- alat bernama sama dari
sourceNamelain tidak mengekspos namespace - fungsi scope mentah ditolak
- id namespace palsu dan path palsu ditolak
- path yang dapat dipanggil tidak dapat menargetkan alat yang tidak dideklarasikan
- objek bersarang dan referensi bersama diserialisasi dengan benar
- panggilan namespace dieksekusi melalui alat katalog dan mengembalikan detail yang aman untuk JSON
- kegagalan dapat ditangkap oleh kode tamu
- panggilan namespace yang ditangguhkan dilanjutkan melalui
wait - rollback Plugin menghapus registrasi namespace pemilik
tools.search / tools.call. Gunakan
katalog untuk alat OpenClaw, Plugin, dan klien arbitrer yang diaktifkan; gunakan MCP untuk
alat MCP; gunakan namespace lain untuk API domain terdokumentasi milik Plugin ketika
kode ringkas lebih andal daripada lookup skema berulang.
API output
text(value) menambahkan output yang dapat dibaca manusia ke array output.
json(value) menambahkan item output terstruktur setelah serialisasi yang kompatibel
dengan JSON.
Nilai akhir yang dikembalikan oleh kode tamu menjadi value dalam hasil completed.
Item output:
- urutan output cocok dengan panggilan tamu
- output dibatasi oleh
maxOutputBytes - nilai yang tidak dapat diserialisasi dikonversi menjadi string biasa atau error
- nilai biner tidak didukung di v1
- gambar dan file melewati alat OpenClaw biasa, bukan melalui bridge mode kode
Katalog alat
Katalog tersembunyi menyertakan alat setelah pemfilteran kebijakan efektif:- Alat inti OpenClaw.
- Alat Plugin bawaan.
- Alat Plugin eksternal.
- Alat MCP.
- Alat yang disediakan klien untuk run saat ini.
execwaittool_search_codetool_searchtool_describetool_call
ALL_TOOLS, tools.search(...),
tools.describe(...), dan tools.call(...) menghilangkan entri MCP. Namespace
MCP.<server>.<tool>({ ...input }) yang dihasilkan di-resolve kembali ke
id katalog persis lalu dikirim melalui path executor yang sama.
Interaksi Tool Search
Mode kode menggantikan permukaan model OpenClaw Tool Search untuk run saat aktif. Saattools.codeMode.enabled bernilai true dan mode kode aktif:
- OpenClaw tidak mengekspos
tool_search_code,tool_search,tool_describe, atautool_callsebagai alat yang terlihat model. - Ide pengatalogan yang sama berpindah ke dalam runtime tamu.
- Runtime tamu menerima metadata
ALL_TOOLSyang ringkas serta helper pencarian, deskripsi, dan panggilan untuk alat non-MCP. - Panggilan MCP menggunakan namespace
MCPyang dihasilkan dan header$api()-nya alih-alihtools.call(...). - Panggilan bersarang dikirim melalui path executor OpenClaw yang sama dengan yang digunakan Tool Search.
exec dan wait.
Nama alat dan tabrakan
Alatexec yang terlihat model adalah alat mode kode. Jika alat shell OpenClaw
normal exec diaktifkan, alat itu disembunyikan dari model dan dikatalogkan seperti
alat lainnya.
Di dalam runtime tamu:
tools.call("openclaw:core:exec", input)dapat memanggil alat shell exec jika kebijakan mengizinkannya.tools.exec(...)hanya dipasang jika entri katalog shell exec memiliki nama aman yang tidak ambigu.- alat mode kode
exectidak pernah tersedia secara rekursif melaluitools.
tools.call(id, input).
Eksekusi alat bersarang
Setiap panggilan alat bersarang melintasi bridge host dan masuk kembali ke OpenClaw. Eksekusi bersarang mempertahankan:- id agen aktif
- id sesi dan kunci sesi
- konteks pengirim dan channel
- kebijakan sandbox
- kebijakan persetujuan
- hook Plugin
before_tool_call - sinyal abort
- pembaruan streaming jika tersedia
- event trajectory dan audit
maxPendingToolCalls.
State runtime
Setiap run mode kode memiliki mesin state:running: VM sedang mengeksekusi atau panggilan bersarang sedang berjalan.waiting: snapshot VM ada dan dapat dilanjutkan denganwait.completed: nilai akhir dikembalikan; snapshot dihapus.failed: error dikembalikan; snapshot dihapus.expired: snapshot atau state tertunda melampaui retensi; tidak dapat dilanjutkan.aborted: run/sesi induk dibatalkan; snapshot dihapus.
wait dari
run atau sesi berbeda gagal.
Penyimpanan snapshot dibatasi:
- byte snapshot maksimum per run
- snapshot live maksimum per proses
- TTL snapshot
- pembersihan saat run berakhir
- pembersihan saat Gateway dimatikan jika persistensi tidak didukung
Runtime QuickJS-WASI
OpenClaw memuatquickjs-wasi sebagai dependensi langsung dalam paket pemilik. Runtime
tidak bergantung pada salinan transitif yang dipasang untuk proxy, PAC, atau dependensi
tidak terkait lainnya.
Tanggung jawab runtime:
- mengompilasi atau memuat modul WebAssembly QuickJS-WASI
- membuat satu VM terisolasi per run mode kode atau resume
- mendaftarkan callback host dengan nama stabil
- mengatur batas memori dan interupsi
- mengevaluasi JavaScript
- menguras job tertunda
- membuat snapshot state VM yang ditangguhkan
- memulihkan snapshot untuk
wait - membuang handle VM dan snapshot setelah state terminal
TypeScript
Dukungan TypeScript hanya berupa transformasi sumber:- input yang diterima: satu string kode TypeScript
- output: string JavaScript yang dievaluasi oleh QuickJS-WASI
- tanpa typechecking
- tanpa resolusi modul
- tanpa
importataurequiredi v1 - diagnostik dikembalikan sebagai hasil
failed
Batas keamanan
Kode model bersifat hostile. Runtime menggunakan defense in depth:- menjalankan QuickJS-WASI di luar event loop utama
- memuat
quickjs-wasisebagai dependensi langsung, bukan melalui Codex atau paket transitif - tidak ada filesystem, jaringan, subprocess, impor modul, variabel lingkungan, atau objek global host di tamu
- menggunakan batas memori dan interupsi QuickJS
- menegakkan timeout wall-clock proses induk
- menegakkan batas output, snapshot, log, dan panggilan tertunda
- menserialisasi nilai bridge host melalui adapter JSON sempit
- mengonversi error host menjadi error tamu biasa, tidak pernah objek realm host
- membuang snapshot saat timeout, abort, sesi berakhir, atau kedaluwarsa
- menolak akses rekursif ke
exec,wait, dan alat kontrol Tool Search - mencegah tabrakan nama kemudahan menutupi helper katalog
Kode error
Error host, objek stack,
prototipe, dan fungsi host tidak menyeberang ke QuickJS.
Telemetri
Mode kode melaporkan:- nama alat terlihat yang dikirim ke model
- ukuran katalog tersembunyi dan rincian sumber
- jumlah
execdanwait - jumlah pencarian, deskripsi, dan panggilan bersarang
- id alat bersarang yang dipanggil
- kegagalan batas timeout, memori, snapshot, dan output
- event siklus hidup snapshot
Debugging
Gunakan logging transport model yang ditargetkan saat mode kode berperilaku berbeda dari run alat normal:OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted.
Ini mencatat snapshot JSON permintaan model yang dibatasi dan diredaksi; ini hanya boleh
digunakan saat debugging karena prompt dan teks pesan masih dapat muncul.
Untuk debugging stream, gunakan OPENCLAW_DEBUG_SSE=peek untuk mencatat lima event SSE
teredaksi pertama. Mode kode juga fail closed jika payload provider akhir
tidak berisi tepat exec dan wait setelah permukaan mode kode
diaktifkan.
Tata letak implementasi
Unit implementasi:- kontrak config:
tools.codeMode - pembuat katalog: alat efektif menjadi entri ringkas dan peta id
- adapter permukaan model: mengganti alat terlihat dengan
execdanwait - adapter runtime QuickJS-WASI: load, eval, snapshot, restore, dispose
- supervisor worker: timeout, abort, isolasi crash
- adapter bridge: callback host yang aman untuk JSON dan pengiriman hasil
- adapter transformasi TypeScript
- penyimpanan snapshot: TTL, batas ukuran, scope run/sesi
- proyeksi trajectory untuk panggilan alat bersarang
- penghitung telemetri dan diagnostik
node:vm sebagai sandbox.
Daftar periksa validasi
Cakupan mode kode harus membuktikan:- konfigurasi yang dinonaktifkan membiarkan eksposur tool yang ada tetap tidak berubah
- konfigurasi objek tanpa
enabled: truemembiarkan mode kode tetap dinonaktifkan - konfigurasi yang diaktifkan hanya mengekspos
execdanwaitke model ketika tool aktif untuk proses berjalan tersebut - proses berjalan mentah tanpa tool,
disableTools, dan allowlist kosong tidak memicu penegakan payload mode kode - semua tool non-MCP yang efektif muncul di
ALL_TOOLS - tool yang ditolak tidak muncul di
ALL_TOOLS tools.search,tools.describe, dantools.callberfungsi untuk tool OpenClawAPI.list("mcp")danAPI.read("mcp/<server>.d.ts")mengekspos deklarasi MCP bergaya TypeScript tanpa panggilan bridge/tool- namespace MCP
$api()tetap tersedia sebagai fallback sebaris untuk skema - panggilan namespace MCP berfungsi untuk tool MCP yang terlihat dengan satu input objek, sementara
entri katalog MCP langsung tidak ada dari
tools.* - tool kontrol Tool Search disembunyikan dari permukaan model maupun katalog tersembunyi
- panggilan bertingkat mempertahankan perilaku persetujuan dan hook
- shell
execdisembunyikan dari model tetapi dapat dipanggil berdasarkan id katalog saat diizinkan execdanwaitmode kode rekursif tidak dapat dipanggil dari kode tamu- input TypeScript ditransformasikan dan dievaluasi tanpa memuat TypeScript pada jalur yang dinonaktifkan atau khusus JavaScript
- akses
import,require, sistem berkas, jaringan, dan lingkungan gagal - loop tak terbatas mengalami timeout dan tidak dapat memblokir Gateway
- kegagalan batas memori menghentikan VM tamu
- batas output dan snapshot diberlakukan untuk panggilan yang selesai dan ditangguhkan
waitmelanjutkan snapshot yang ditangguhkan dan mengembalikan nilai akhir- nilai
runIdyang kedaluwarsa, dibatalkan, salah sesi, dan tidak dikenal gagal - pemutaran ulang dan persistensi transkrip mempertahankan panggilan kontrol mode kode
- transkrip dan telemetri menampilkan panggilan tool bertingkat dengan jelas
Rencana pengujian E2E
Jalankan ini sebagai pengujian integrasi atau end-to-end saat mengubah runtime:- Mulai Gateway dengan
tools.codeMode.enabled: false. - Kirim satu giliran agen dengan set tool langsung yang kecil.
- Pastikan tool yang terlihat oleh model tidak berubah.
- Mulai ulang dengan
tools.codeMode.enabled: true. - Kirim satu giliran agen dengan OpenClaw, plugin, MCP, dan tool uji klien.
- Pastikan daftar tool yang terlihat oleh model persis
exec,wait. - Di
exec, bacaALL_TOOLSdan pastikan tool uji efektif ada. - Di
exec, panggil tool OpenClaw/plugin/klien melaluitools.search,tools.describe, dantools.call. - Di
exec, panggilAPI.list("mcp")danAPI.read("mcp/<server>.d.ts")dan pastikan file deklarasi mendeskripsikan tool MCP yang terlihat. - Di
exec, panggil tool MCP melaluiMCP.<server>.<tool>({ ...input })dan pastikan entri katalog MCP langsung tidak ada dariALL_TOOLSdantools.*. - Pastikan tool yang ditolak tidak ada dan tidak dapat dipanggil dengan id yang ditebak.
- Mulai panggilan tool bertingkat yang diselesaikan setelah
execmengembalikanwaiting. - Panggil
waitdan pastikan VM yang dipulihkan menerima hasil tool. - Pastikan jawaban akhir berisi output yang dihasilkan setelah pemulihan.
- Pastikan timeout, pembatalan, dan kedaluwarsa snapshot membersihkan status runtime.
- Ekspor trajectory dan pastikan panggilan bertingkat terlihat di bawah panggilan mode kode induk.
pnpm check:docs.