exec e wait.
Questa pagina documenta la modalità codice di OpenClaw. Non è la modalità Codex Code. Le due
funzionalità condividono un nome, ma sono implementate da runtime diversi ed espongono
contratti exec diversi:
- Codex Code Mode è abilitata per i thread del server app Codex, a meno che una policy
degli strumenti restrittiva disabiliti la modalità codice nativa. Viene eseguita nell’harness di codifica Codex,
dove il modello scrive comandi shell tramite un contratto
exec.command. - La modalità codice di OpenClaw è disabilitata a meno che non sia configurato
tools.codeMode.enabled: true. Viene eseguita nel runtime generico degli agenti di OpenClaw, dove il modello scrive programmi JavaScript o TypeScript tramite un contrattoexec.code.
quickjs-wasi, un catalogo
nascosto degli strumenti OpenClaw e il normale esecutore di strumenti OpenClaw.
Che cos’è?
La modalità codice di OpenClaw consente al modello di scrivere un piccolo programma JavaScript o TypeScript invece di scegliere direttamente da un lungo elenco di strumenti. Quando la modalità codice è attiva:- L’elenco di strumenti visibile al modello è esattamente
execewait. execvaluta JavaScript o TypeScript generato dal modello in un worker QuickJS-WASI vincolato.- I normali strumenti OpenClaw sono nascosti dal prompt del modello ed esposti all’interno del
programma guest tramite
ALL_TOOLSetools. - Il codice guest può cercare nel catalogo nascosto, descrivere uno strumento e chiamare uno strumento tramite lo stesso percorso di esecuzione OpenClaw usato dai normali turni dell’agente.
- Gli strumenti MCP sono raggruppati nello spazio dei nomi
MCP. In modalità codice, questo spazio dei nomi è l’unico modo supportato per chiamare gli strumenti MCP. waitriprende un’esecuzione in modalità codice sospesa quando le chiamate a strumenti annidate sono ancora in sospeso.
Perché è utile?
La modalità codice rende i grandi cataloghi di strumenti più facili da usare per i modelli.- Superficie di prompt più piccola: i provider ricevono due strumenti di controllo invece di decine o centinaia di schemi completi di strumenti.
- Orchestrazione migliore: il modello può usare cicli, join, piccole trasformazioni, logica condizionale e chiamate a strumenti annidate parallele all’interno di una singola cella di codice.
- Neutrale rispetto al provider: funziona per strumenti OpenClaw, Plugin, MCP e client senza dipendere dall’esecuzione di codice nativa del provider.
- Le policy esistenti restano in vigore: le chiamate a strumenti annidate passano comunque attraverso le policy, le approvazioni, gli hook, il contesto di sessione e i percorsi di audit di OpenClaw.
- Modalità di errore chiara: quando la modalità codice è abilitata esplicitamente e il runtime non è disponibile, OpenClaw fallisce in modo chiuso invece di ripiegare su un’ampia esposizione diretta degli strumenti.
Come abilitarla
Aggiungitools.codeMode.enabled: true alla configurazione dell’agente o del runtime:
tools.codeMode è omesso, false o un oggetto
senza enabled: true.
Quando usi agenti in sandbox con server MCP configurati, assicurati anche che la
policy degli strumenti della sandbox consenta il Plugin MCP in bundle, per esempio con
tools.sandbox.tools.alsoAllow: ["bundle-mcp"]. Vedi
Configurazione - strumenti e provider personalizzati.
Usa limiti espliciti quando vuoi vincoli più stretti:
exec e
wait. Se ti serve il payload del provider redatto, aggiungi
OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted per una breve sessione di debug.
Tour tecnico
Il resto di questa pagina descrive il contratto del runtime e i dettagli di implementazione. È destinato ai manutentori, agli autori di Plugin che eseguono il debug dell’esposizione degli strumenti e agli operatori che convalidano distribuzioni ad alto rischio.Stato del runtime
- Runtime:
quickjs-wasi. - Stato predefinito: disabilitato.
- Stabilità: superficie sperimentale di OpenClaw; Codex Code mode è una superficie stabile separata dell’harness Codex.
- Superficie di destinazione: esecuzioni generiche di agenti OpenClaw.
- Postura di sicurezza: il codice del modello è ostile.
- Promessa rivolta all’utente: abilitare la modalità codice non ripiega mai silenziosamente su un’ampia esposizione diretta degli strumenti.
Ambito
La modalità codice possiede la forma di orchestrazione rivolta al modello per un’esecuzione preparata. Non possiede la selezione del modello, il comportamento dei canali, l’autenticazione, la policy degli strumenti o le implementazioni degli strumenti. Incluso nell’ambito:- definizioni degli strumenti
execewaitvisibili al modello - costruzione del catalogo nascosto degli strumenti
- esecuzione guest JavaScript e TypeScript
- runtime worker QuickJS-WASI
- callback host per ricerca nel catalogo, descrizione degli schemi e chiamata di strumenti
- stato riprendibile per programmi guest sospesi
- limiti di output, timeout, memoria, chiamate in sospeso e snapshot
- telemetria e proiezione della traiettoria per chiamate a strumenti annidate
- esecuzione remota di codice nativa del provider
- semantica di esecuzione shell
- modifica dell’autorizzazione esistente degli strumenti
- script persistenti creati dall’utente
- accesso a package manager, file, rete o moduli nel codice guest
- riuso diretto degli internals di Codex Code mode
Termini
Modalità codice è la modalità del runtime OpenClaw che nasconde i normali strumenti del modello ed espone soloexec e wait.
Runtime guest è la VM JavaScript QuickJS-WASI che valuta il codice del modello.
Bridge host è la superficie ristretta di callback compatibile con JSON dal codice guest
verso OpenClaw.
Catalogo è l’elenco con ambito di esecuzione degli strumenti effettivi dopo la normale policy degli strumenti,
la risoluzione di Plugin, MCP e strumenti client.
Chiamata a strumento annidata è una chiamata a strumento effettuata dal codice guest tramite il bridge host.
Snapshot è lo stato serializzato della VM QuickJS-WASI salvato affinché wait possa continuare un’
esecuzione in modalità codice sospesa.
Configurazione
tools.codeMode.enabled è il gate di attivazione. Impostare altri campi della modalità codice
non abilita la funzionalità.
Campi supportati:
enabled: boolean. Predefinitofalse. Abilita la modalità codice solo quando ètrue.runtime:"quickjs-wasi". Unico runtime supportato.mode:"only". Esponeexecewait, nasconde i normali strumenti del modello.languages: array di"javascript"e"typescript". Il valore predefinito include entrambi.timeoutMs: limite in tempo reale per un singoloexecowait. Predefinito10000. Clamp del runtime: da100a60000.memoryLimitBytes: limite heap QuickJS. Predefinito67108864. Clamp del runtime: da1048576a1073741824.maxOutputBytes: limite per testo, JSON e log restituiti. Predefinito65536. Clamp del runtime: da1024a10485760.maxSnapshotBytes: limite per gli snapshot serializzati della VM. Predefinito10485760. Clamp del runtime: da1024a268435456.maxPendingToolCalls: limite per le chiamate a strumenti annidate concorrenti. Predefinito16. Clamp del runtime: da1a128.snapshotTtlSeconds: per quanto tempo una VM sospesa può essere ripresa. Predefinito900. Clamp del runtime: da1a86400.searchDefaultLimit: numero predefinito di risultati della ricerca nel catalogo nascosto. Predefinito8. Il runtime lo limita amaxSearchLimit.maxSearchLimit: numero massimo di risultati della ricerca nel catalogo nascosto. Predefinito50. Clamp del runtime: da1a50.
Attivazione
La modalità codice viene valutata dopo che la policy effettiva degli strumenti è nota e prima che la richiesta finale al modello venga assemblata. Ordine di attivazione:- Risolvi agente, modello, provider, sandbox, canale, mittente e policy di esecuzione.
- Costruisci l’elenco effettivo degli strumenti OpenClaw.
- Aggiungi gli strumenti Plugin, MCP e client idonei.
- Applica la policy di allow e deny.
- Se
tools.codeMode.enabledè false, continua con la normale esposizione degli strumenti. - Se è abilitata e gli strumenti sono attivi per l’esecuzione, registra gli strumenti effettivi nel catalogo della modalità codice.
- Rimuovi tutti i normali strumenti dall’elenco di strumenti visibile al modello.
- Aggiungi
execewaitdella modalità codice.
disableTools
o una allowlist vuota, non attivano la superficie della modalità codice anche se la configurazione
contiene tools.codeMode.enabled: true.
Il catalogo della modalità codice ha ambito di esecuzione. Non deve far trapelare strumenti da un altro agente,
sessione, mittente o esecuzione.
Strumenti visibili al modello
Quando la modalità codice è attiva, il modello vede esattamente questi strumenti di primo livello:execwait
exec per orchestrazione degli strumenti, join di dati, cicli,
chiamate annidate parallele e trasformazioni strutturate. Il modello dovrebbe usare
wait solo quando exec restituisce un risultato waiting riprendibile.
exec
exec avvia una cella in modalità codice e restituisce un risultato. Il codice di input è generato dal modello
e deve essere trattato come ostile.
Input:
- Uno tra
codeocommanddeve essere non vuoto. codeè il campo documentato rivolto al modello.commandè accettato come alias compatibile con exec per policy degli hook e riscritture fidate; quando entrambi sono presenti, i valori devono corrispondere.- Gli eventi hook
execesterni della modalità codice includonotoolKind: "code_mode_exec"e includonotoolInputKind: "javascript" | "typescript"quando il linguaggio di input è noto, così le policy possono distinguere le celle in modalità codice dalle chiamateexecin stile shell che condividono lo stesso nome dello strumento. languageusa"javascript"come impostazione predefinita.- Se
languageè"typescript", OpenClaw transpila prima della valutazione. execrifiutaimport,require, import dinamico e pattern di module-loader in v1.execnon espone ricorsivamente la normale implementazione shell diexec.
exec restituisce waiting quando la VM QuickJS si sospende con stato riprendibile che
richiede ancora una continuazione visibile al modello. Il risultato include un runId per
wait. Le chiamate al bridge degli spazi dei nomi, incluse le chiamate allo spazio dei nomi MCP, vengono svuotate automaticamente
all’interno della stessa chiamata exec/wait mentre sono pronte, così un blocco di codice compatto
può ispezionare $api() e chiamare uno strumento MCP senza forzare una chiamata a strumento del modello per
ogni await dello spazio dei nomi.
exec restituisce completed solo quando la VM guest non ha lavoro in sospeso e il
valore finale è compatibile con JSON dopo l’esecuzione dell’adattatore di output di OpenClaw.
wait
wait continua una VM in modalità codice sospesa.
Input:
CodeModeResult restituita da exec.
wait esiste perché gli strumenti OpenClaw annidati possono essere lenti, interattivi, soggetti ad approvazione
o trasmettere aggiornamenti parziali. Il modello non dovrebbe dover mantenere aperta una lunga chiamata
exec mentre l’host attende lavoro esterno.
Snapshot e ripristino di QuickJS-WASI sono il meccanismo di ripresa v1:
execvaluta il codice fino al completamento, al fallimento o alla sospensione.- In caso di sospensione, OpenClaw crea uno snapshot della VM QuickJS e registra il lavoro host in sospeso.
- Quando il lavoro in sospeso si risolve,
waitripristina lo snapshot della VM. - OpenClaw registra nuovamente i callback host tramite nomi stabili.
- OpenClaw consegna i risultati degli strumenti annidati nella VM ripristinata.
- OpenClaw svuota i job QuickJS in sospeso.
waitrestituiscecompleted,failedo un altro risultatowaiting.
wait fallisce quando:
runIdè sconosciuto.- lo snapshot è scaduto.
- l’esecuzione o la sessione padre è stata interrotta.
- il chiamante non si trova nello stesso ambito di esecuzione/sessione.
- il ripristino QuickJS-WASI fallisce.
- il ripristino supererebbe i limiti configurati.
API runtime guest
Il runtime guest espone una piccola API globale:ALL_TOOLS è metadati compatti per il catalogo con ambito dell’esecuzione. Per impostazione predefinita
non contiene schemi completi.
tools.call(...) o funzioni di utilità
in modalità codice. Sono esposte solo tramite il namespace MCP generato.
I file di dichiarazione in stile TypeScript sono disponibili tramite la superficie di file virtuale
API di sola lettura, così gli agenti possono ispezionare le firme MCP
senza aggiungere schemi MCP al prompt:
API.read("mcp/<server>.d.ts") restituisce dichiarazioni compatte inferite dai metadati
degli strumenti MCP:
exec in modalità codice, OpenClaw costruisce il catalogo strumenti
con ambito dell’esecuzione, mantiene le voci MCP visibili, renderizza mcp/index.d.ts più una
dichiarazione mcp/<server>.d.ts per ogni server visibile e inserisce quella piccola
tabella di sola lettura nel worker QuickJS. Il codice guest vede solo l’oggetto API:
API.list(prefix?) restituisce i metadati dei file e API.read(path) restituisce il
contenuto della dichiarazione selezionata. I percorsi sconosciuti e i segmenti . / .. vengono rifiutati.
Questo mantiene gli schemi MCP di grandi dimensioni fuori dal prompt del modello. L’agente apprende che
l’API virtuale esiste dalla descrizione dello strumento exec, legge solo il file di
dichiarazione necessario e poi chiama MCP.<server>.<tool>() con un unico argomento oggetto.
MCP.<server>.$api() resta disponibile come fallback inline quando l’agente
ha bisogno di una risposta schema per un singolo strumento all’interno del programma.
Il runtime guest non deve esporre direttamente oggetti host. Input e output attraversano
il bridge come valori compatibili con JSON con limiti di dimensione espliciti.
Namespace interni
I namespace interni forniscono alla modalità codice un’API di dominio concisa senza aggiungere altri strumenti visibili al modello. Un’integrazione di proprietà del loader può registrare un namespace comeIssues, Fictions o Calendar; il codice guest quindi chiama quel namespace
all’interno del programma QuickJS mentre OpenClaw mostra ancora solo exec e wait al
modello.
Per ora i namespace sono interni. Non esiste un’API namespace pubblica dell’SDK Plugin:
i namespace dei Plugin esterni hanno bisogno di un contratto di proprietà del loader affinché identità del Plugin,
manifest installati, stato di autenticazione e descrittori di catalogo memorizzati in cache non possano divergere
dagli strumenti Plugin che supportano il namespace. La modalità codice core possiede solo
sandbox, serializzazione, gating del catalogo e dispatch del bridge.
Il codice guest può quindi usare il globale diretto o la mappa namespaces:
Ciclo di vita del registry
Il registry dei namespace è locale al processo e indicizzato per id del namespace. Una tipica esecuzione segue questo percorso:- Un loader attendibile chiama
registerCodeModeNamespaceForPlugin(pluginId, registration). - La modalità codice crea il
ToolSearchRuntimenascosto per l’esecuzione e legge il suo catalogo con ambito dell’esecuzione. createCodeModeNamespaceRuntime(ctx, catalog)mantiene solo le registrazioni i cuirequiredToolNamessono tutti visibili e di proprietà dello stessopluginId.- Ogni namespace visibile chiama
createScope(ctx)per l’esecuzione corrente. Lo scope riceve il contesto di esecuzione comeagentId,sessionKey,sessionId,runId, configurazione e stato di interruzione. - I dati dello scope vengono serializzati in un descrittore semplice e iniettati in QuickJS come
globali diretti e
namespaces.<globalName>. - Le chiamate guest vengono sospese tramite il bridge del worker, risolvono il percorso del namespace sull’
host, mappano la chiamata a uno strumento di catalogo dichiarato di proprietà del Plugin ed eseguono
quello strumento tramite
ToolSearchRuntime.call. - OpenClaw svuota automaticamente le chiamate bridge namespace pronte all’interno della chiamata strumento
exec/waitattiva. Se il lavoro del namespace è ancora in sospeso al timeout o il guest cede esplicitamente il controllo,waitriprende lo stesso runtime namespace in seguito. - Il rollback o la disinstallazione del Plugin chiama
clearCodeModeNamespacesForPlugin(pluginId)così i globali obsoleti non sopravvivono a un caricamento Plugin fallito.
tools.call(...).
Forma della registrazione
Registra i namespace dall’integrazione che possiede gli strumenti di supporto. Mantieni lo scope piccolo ed esponi solo verbi di dominio che mappano a strumenti di catalogo dichiarati.createCodeModeNamespaceTool(toolName, inputMapper) marca un membro dello scope come
funzione namespace chiamabile. L’inputMapper facoltativo riceve gli argomenti guest
e restituisce l’oggetto input per lo strumento di catalogo di supporto. Senza un
input mapper, viene usato il primo argomento guest, oppure {} quando omesso.
Le funzioni host grezze vengono rifiutate prima dell’esecuzione del codice guest:
Proprietà e visibilità
La proprietà del namespace è vincolata alpluginId del chiamante della registrazione.
requiredToolNames è sia un gate di visibilità sia un controllo di proprietà:
- ogni strumento richiesto deve esistere nel catalogo dell’esecuzione
- ogni strumento richiesto deve avere
sourceName === pluginId - il namespace è nascosto quando uno strumento richiesto è assente o di proprietà di un altro Plugin
- ogni percorso chiamabile può puntare solo a uno strumento nominato in
requiredToolNames
Regole di serializzazione dello scope
createScope(ctx) può restituire un oggetto semplice contenente valori compatibili con JSON,
array, oggetti annidati e marker di chiamata createCodeModeNamespaceTool(...).
Gli oggetti host non entrano mai direttamente in QuickJS.
Il serializzatore rifiuta:
- funzioni grezze
- grafi di oggetti circolari
- segmenti di percorso non sicuri:
__proto__,constructor,prototype, chiavi vuote o chiavi contenenti il separatore di percorso interno - valori
globalNameche non sono identificatori JavaScript - collisioni di
globalNamecon globali integrati della modalità codice cometools,namespaces,text,json,yield_controlo__openclaw*
Prompt
Ladescription del namespace e il prompt facoltativo vengono aggiunti allo schema exec
visibile al modello solo quando il namespace è visibile per quell’esecuzione. Usali
per insegnare la superficie utile più piccola:
Pulizia
Gli spazi dei nomi sono registrazioni locali al processo. Rimuovili quando il Plugin proprietario viene disabilitato, disinstallato o ripristinato a una versione precedente:clearCodeModeNamespacesForTest() per evitare perdite di registrazioni tra i casi.
Checklist dei test
Le modifiche agli spazi dei nomi devono coprire il confine di sicurezza e il comportamento guest:- il testo del prompt dello spazio dei nomi appare solo quando gli strumenti sottostanti sono visibili
- strumenti con lo stesso nome da un altro
sourceNamenon espongono lo spazio dei nomi - le funzioni di ambito grezze vengono rifiutate
- gli ID di spazio dei nomi contraffatti e i percorsi contraffatti vengono rifiutati
- i percorsi invocabili non possono puntare a strumenti non dichiarati
- gli oggetti annidati e i riferimenti condivisi vengono serializzati correttamente
- le chiamate allo spazio dei nomi vengono eseguite tramite gli strumenti del catalogo e restituiscono dettagli sicuri per JSON
- gli errori possono essere intercettati dal codice guest
- le chiamate sospese allo spazio dei nomi riprendono tramite
wait - il rollback del Plugin cancella le registrazioni degli spazi dei nomi di proprietà
tools.search / tools.call. Usa il
catalogo per strumenti OpenClaw, Plugin e client abilitati arbitrari; usa MCP per
gli strumenti MCP; usa altri spazi dei nomi per API di dominio documentate e di proprietà
del Plugin, dove il codice conciso è più affidabile di ricerche ripetute negli schemi.
API di output
text(value) aggiunge output leggibile dall’uomo all’array output.
json(value) aggiunge un elemento di output strutturato dopo una serializzazione
compatibile con JSON.
Il valore restituito finale del codice guest diventa value in un risultato completed.
Elemento di output:
- l’ordine dell’output corrisponde alle chiamate guest
- l’output è limitato da
maxOutputBytes - i valori non serializzabili vengono convertiti in stringhe semplici o errori
- i valori binari non sono supportati nella v1
- immagini e file passano attraverso i normali strumenti OpenClaw, non attraverso il bridge della modalità codice
Catalogo degli strumenti
Il catalogo nascosto include gli strumenti dopo il filtro delle policy effettive:- Strumenti core di OpenClaw.
- Strumenti dei Plugin inclusi.
- Strumenti dei Plugin esterni.
- Strumenti MCP.
- Strumenti forniti dal client per l’esecuzione corrente.
execwaittool_search_codetool_searchtool_describetool_call
ALL_TOOLS, tools.search(...),
tools.describe(...) e tools.call(...) omettono le voci MCP. Lo spazio dei nomi
generato MCP.<server>.<tool>({ ...input }) viene risolto di nuovo nell’ID esatto del
catalogo e poi inviato tramite lo stesso percorso dell’esecutore.
Interazione con Ricerca strumenti
La modalità codice sostituisce la superficie del modello Ricerca strumenti di OpenClaw per le esecuzioni in cui è attiva. Quandotools.codeMode.enabled è true e la modalità codice si attiva:
- OpenClaw non espone
tool_search_code,tool_search,tool_describeotool_callcome strumenti visibili al modello. - La stessa idea di catalogazione si sposta all’interno del runtime guest.
- Il runtime guest riceve metadati compatti
ALL_TOOLSe helper di ricerca, descrizione e chiamata per strumenti non MCP. - Le chiamate MCP usano lo spazio dei nomi
MCPgenerato e le sue intestazioni$api()invece ditools.call(...). - Le chiamate annidate vengono inviate attraverso lo stesso percorso dell’esecutore OpenClaw usato da Ricerca strumenti.
exec e wait.
Nomi degli strumenti e collisioni
Lo strumentoexec visibile al modello è lo strumento della modalità codice. Se il normale strumento
shell exec di OpenClaw è abilitato, viene nascosto al modello e catalogato come qualsiasi
altro strumento.
All’interno del runtime guest:
tools.call("openclaw:core:exec", input)può chiamare lo strumento shell exec se la policy lo consente.tools.exec(...)viene installato solo se la voce di catalogo shell exec ha un nome sicuro non ambiguo.- lo strumento
execdella modalità codice non è mai disponibile ricorsivamente tramitetools.
tools.call(id, input).
Esecuzione annidata degli strumenti
Ogni chiamata annidata a uno strumento attraversa il bridge host e rientra in OpenClaw. L’esecuzione annidata preserva:- ID agente attivo
- ID sessione e chiave sessione
- contesto del mittente e del canale
- policy sandbox
- policy di approvazione
- hook
before_tool_calldel Plugin - segnale di annullamento
- aggiornamenti in streaming dove disponibili
- eventi di traiettoria e audit
maxPendingToolCalls.
Stato del runtime
Ogni esecuzione in modalità codice ha una macchina a stati:running: la VM è in esecuzione o ci sono chiamate annidate in corso.waiting: esiste uno snapshot della VM e può essere ripreso conwait.completed: valore finale restituito; snapshot eliminato.failed: errore restituito; snapshot eliminato.expired: snapshot o stato in sospeso ha superato la conservazione; impossibile riprendere.aborted: esecuzione/sessione padre annullata; snapshot eliminato.
wait da
un’esecuzione o sessione diversa fallisce.
L’archiviazione degli snapshot è limitata:
- byte massimi di snapshot per esecuzione
- snapshot live massimi per processo
- TTL degli snapshot
- pulizia alla fine dell’esecuzione
- pulizia allo spegnimento del Gateway dove la persistenza non è supportata
Runtime QuickJS-WASI
OpenClaw caricaquickjs-wasi come dipendenza diretta nel package proprietario. Il
runtime non si affida a una copia transitiva installata per proxy, PAC o altre
dipendenze non correlate.
Responsabilità del runtime:
- compilare o caricare il modulo WebAssembly QuickJS-WASI
- creare una VM isolata per ogni esecuzione o ripresa della modalità codice
- registrare callback host con nomi stabili
- impostare limiti di memoria e interruzione
- valutare JavaScript
- svuotare i job in sospeso
- creare snapshot dello stato sospeso della VM
- ripristinare snapshot per
wait - rilasciare handle della VM e snapshot dopo stati terminali
TypeScript
Il supporto TypeScript è solo una trasformazione sorgente:- input accettato: una stringa di codice TypeScript
- output: stringa JavaScript valutata da QuickJS-WASI
- nessun typechecking
- nessuna risoluzione dei moduli
- nessun
importorequirenella v1 - le diagnostiche vengono restituite come risultati
failed
Confine di sicurezza
Il codice del modello è ostile. Il runtime usa difesa in profondità:- eseguire QuickJS-WASI fuori dal ciclo eventi principale
- caricare
quickjs-wasicome dipendenza diretta, non tramite Codex o un package transitivo - niente filesystem, rete, sottoprocessi, importazione di moduli, variabili d’ambiente o oggetti globali host nel guest
- usare limiti di memoria e interruzione di QuickJS
- applicare timeout wall-clock del processo padre
- applicare limiti a output, snapshot, log e chiamate in sospeso
- serializzare i valori del bridge host tramite un adapter JSON ristretto
- convertire gli errori host in errori guest semplici, mai oggetti del realm host
- eliminare gli snapshot in caso di timeout, annullamento, fine sessione o scadenza
- rifiutare l’accesso ricorsivo a
exec,waite agli strumenti di controllo di Ricerca strumenti - impedire che collisioni nei nomi di utilità oscurino gli helper del catalogo
Codici di errore
Error, gli oggetti stack,
i prototipi e le funzioni host non entrano in QuickJS.
Telemetria
La modalità codice segnala:- nomi degli strumenti visibili inviati al modello
- dimensione del catalogo nascosto e scomposizione per sorgente
- conteggi di
execewait - conteggi di ricerca, descrizione e chiamata annidate
- ID degli strumenti annidati chiamati
- errori di timeout, memoria, snapshot e limite di output
- eventi del ciclo di vita degli snapshot
Debug
Usa logging mirato del trasporto del modello quando la modalità codice si comporta diversamente da una normale esecuzione di strumento:OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted.
Questo registra uno snapshot JSON limitato e redatto della richiesta al modello; dovrebbe essere usato solo
durante il debug perché prompt e testo dei messaggi possono comunque apparire.
Per il debug dello stream, usa OPENCLAW_DEBUG_SSE=peek per registrare i primi cinque
eventi SSE redatti. La modalità codice fallisce anche in modo chiuso se il payload finale del provider
non contiene esattamente exec e wait dopo che la superficie della modalità codice si è
attivata.
Layout di implementazione
Unità di implementazione:- contratto di configurazione:
tools.codeMode - builder del catalogo: strumenti effettivi in voci compatte e mappa degli ID
- adapter della superficie del modello: sostituire gli strumenti visibili con
execewait - adapter runtime QuickJS-WASI: caricare, valutare, creare snapshot, ripristinare, rilasciare
- supervisore worker: timeout, annullamento, isolamento dai crash
- adapter bridge: callback host sicure per JSON e consegna dei risultati
- adapter di trasformazione TypeScript
- archivio snapshot: TTL, limiti di dimensione, ambito esecuzione/sessione
- proiezione della traiettoria per chiamate annidate a strumenti
- contatori di telemetria e diagnostiche
node:vm come sandbox.
Checklist di validazione
La copertura della modalità codice dovrebbe dimostrare:- la configurazione disabilitata lascia invariata l’esposizione degli strumenti esistenti
- la configurazione a oggetto senza
enabled: truelascia disabilitata la modalità codice - la configurazione abilitata espone al modello solo
execewaitquando gli strumenti sono attivi per l’esecuzione - le esecuzioni grezze senza strumenti,
disableToolse le allowlist vuote non attivano l’applicazione del payload della modalità codice - tutti gli strumenti non MCP effettivi compaiono in
ALL_TOOLS - gli strumenti negati non compaiono in
ALL_TOOLS tools.search,tools.describeetools.callfunzionano per gli strumenti OpenClawAPI.list("mcp")eAPI.read("mcp/<server>.d.ts")espongono dichiarazioni MCP in stile TypeScript senza una chiamata bridge/strumento- lo spazio dei nomi MCP
$api()rimane disponibile come fallback inline per gli schemi - le chiamate allo spazio dei nomi MCP funzionano per gli strumenti MCP visibili con un input oggetto, mentre
le voci dirette del catalogo MCP sono assenti da
tools.* - gli strumenti di controllo di Ricerca strumenti sono nascosti sia dalla superficie del modello sia dal catalogo nascosto
- le chiamate annidate preservano il comportamento di approvazione e degli hook
execdella shell è nascosto al modello ma richiamabile tramite id catalogo quando consentitoexecewaitricorsivi della modalità codice non sono richiamabili dal codice guest- l’input TypeScript viene trasformato e valutato senza caricare TypeScript nei percorsi disabilitati o solo JavaScript
import,require, filesystem, rete e accesso all’ambiente falliscono- i loop infiniti vanno in timeout e non possono bloccare il Gateway
- gli errori del limite di memoria terminano la VM guest
- i limiti di output e snapshot vengono applicati per le chiamate completate e sospese
waitriprende uno snapshot sospeso e restituisce il valore finale- i valori
runIdscaduti, interrotti, di sessione errata e sconosciuti falliscono - la riproduzione e la persistenza della trascrizione preservano le chiamate di controllo della modalità codice
- trascrizione e telemetria mostrano chiaramente le chiamate agli strumenti annidate
Piano di test E2E
Esegui questi test come integrazione o end-to-end quando modifichi il runtime:- Avvia un Gateway con
tools.codeMode.enabled: false. - Invia un turno agente con un piccolo insieme di strumenti diretti.
- Verifica che gli strumenti visibili al modello siano invariati.
- Riavvia con
tools.codeMode.enabled: true. - Invia un turno agente con strumenti di test OpenClaw, Plugin, MCP e client.
- Verifica che l’elenco degli strumenti visibili al modello sia esattamente
exec,wait. - In
exec, leggiALL_TOOLSe verifica che gli strumenti di test effettivi siano presenti. - In
exec, chiama strumenti OpenClaw/Plugin/client tramitetools.search,tools.describeetools.call. - In
exec, chiamaAPI.list("mcp")eAPI.read("mcp/<server>.d.ts")e verifica che i file di dichiarazione descrivano gli strumenti MCP visibili. - In
exec, chiama strumenti MCP tramiteMCP.<server>.<tool>({ ...input })e verifica che le voci dirette del catalogo MCP siano assenti daALL_TOOLSetools.*. - Verifica che gli strumenti negati siano assenti e non possano essere chiamati con un id indovinato.
- Avvia una chiamata a uno strumento annidata che si risolve dopo che
execrestituiscewaiting. - Chiama
waite verifica che la VM ripristinata riceva il risultato dello strumento. - Verifica che la risposta finale contenga l’output prodotto dopo il ripristino.
- Verifica che timeout, interruzione e scadenza dello snapshot ripuliscano lo stato del runtime.
- Esporta la traiettoria e verifica che le chiamate annidate siano visibili sotto la chiamata padre della modalità codice.
pnpm check:docs.