## Summary
This PR adds host-integrated helper APIs for `js_repl` and updates model
guidance so the agent can use them reliably.
### What’s included
- Add `codex.tool(name, args?)` in the JS kernel so `js_repl` can call
normal Codex tools.
- Keep persistent JS state and scratch-path helpers available:
- `codex.state`
- `codex.tmpDir`
- Wire `js_repl` tool calls through the standard tool router path.
- Add/align `js_repl` execution completion/end event behavior with
existing tool logging patterns.
- Update dynamic prompt injection (`project_doc`) to document:
- how to call `codex.tool(...)`
- raw output behavior
- image flow via `view_image` (`codex.tmpDir` +
`codex.tool("view_image", ...)`)
- stdio safety guidance (`console.log` / `codex.tool`, avoid direct
`process.std*`)
## Why
- Standardize JS-side tool usage on `codex.tool(...)`
- Make `js_repl` behavior more consistent with existing tool execution
and event/logging patterns.
- Give the model enough runtime guidance to use `js_repl` safely and
effectively.
## Testing
- Added/updated unit and runtime tests for:
- `codex.tool` calls from `js_repl` (including shell/MCP paths)
- image handoff flow via `view_image`
- prompt-injection text for `js_repl` guidance
- execution/end event behavior and related regression coverage
#### [git stack](https://github.com/magus/git-stack-cli)
- ✅ `1` https://github.com/openai/codex/pull/10674
- 👉 `2` https://github.com/openai/codex/pull/10672
- ⏳ `3` https://github.com/openai/codex/pull/10671
- ⏳ `4` https://github.com/openai/codex/pull/10673
- ⏳ `5` https://github.com/openai/codex/pull/10670
2.6 KiB
2.6 KiB
JavaScript REPL (js_repl)
js_repl runs JavaScript in a persistent Node-backed kernel with top-level await.
Feature gate
js_repl is disabled by default and only appears when:
[features]
js_repl = true
Node runtime
js_repl requires a Node version that meets or exceeds codex-rs/node-version.txt.
Runtime resolution order:
CODEX_JS_REPL_NODE_PATHenvironment variablejs_repl_node_pathin config/profilenodediscovered onPATH
You can configure an explicit runtime path:
js_repl_node_path = "/absolute/path/to/node"
Usage
js_replis a freeform tool: send raw JavaScript source text.- Optional first-line pragma:
// codex-js-repl: timeout_ms=15000
- Top-level bindings persist across calls.
- Top-level static import declarations (for example
import x from "pkg") are currently unsupported; use dynamic imports withawait import("pkg"). - Use
js_repl_resetto clear the kernel state.
Helper APIs inside the kernel
js_repl exposes these globals:
codex.state: mutable object persisted for the current kernel session.codex.tmpDir: per-session scratch directory path.codex.tool(name, args?): executes a normal Codex tool call from insidejs_repl(including shell tools likeshell/shell_commandwhen available).- To share generated images with the model, write a file under
codex.tmpDir, callawait codex.tool("view_image", { path: "/absolute/path" }), then delete the file.
Avoid writing directly to process.stdout / process.stderr / process.stdin; the kernel uses a JSON-line transport over stdio.
Vendored parser asset (meriyah.umd.min.js)
The kernel embeds a vendored Meriyah bundle at:
codex-rs/core/src/tools/js_repl/meriyah.umd.min.js
Current source is meriyah@7.0.0 from npm (dist/meriyah.umd.min.js).
Licensing is tracked in:
third_party/meriyah/LICENSENOTICE
How this file was sourced
From a clean temp directory:
tmp="$(mktemp -d)"
cd "$tmp"
npm pack meriyah@7.0.0
tar -xzf meriyah-7.0.0.tgz
cp package/dist/meriyah.umd.min.js /path/to/repo/codex-rs/core/src/tools/js_repl/meriyah.umd.min.js
cp package/LICENSE.md /path/to/repo/third_party/meriyah/LICENSE
How to update to a newer version
- Replace
7.0.0in the commands above with the target version. - Copy the new
dist/meriyah.umd.min.jsintocodex-rs/core/src/tools/js_repl/meriyah.umd.min.js. - Copy the package license into
third_party/meriyah/LICENSE. - Update the version string in the header comment at the top of
meriyah.umd.min.js. - Update
NOTICEif the upstream copyright notice changed. - Run the relevant
js_repltests.