Skip to content

fix(js_repl): surface uncaught kernel errors and reset cleanly#12636

Merged
fjord-oai merged 1 commit intomainfrom
fjord/js_repl_err_handle
Feb 25, 2026
Merged

fix(js_repl): surface uncaught kernel errors and reset cleanly#12636
fjord-oai merged 1 commit intomainfrom
fjord/js_repl_err_handle

Conversation

@fjord-oai
Copy link
Copy Markdown
Contributor

Summary

Improve js_repl behavior when the Node kernel hits a process-level failure (for example, an uncaught exception or unhandled Promise rejection).

Instead of only surfacing a generic js_repl kernel exited unexpectedly after stdout EOF, js_repl now returns a clearer exec error for the active request, then resets the kernel cleanly.

Why

Some sandbox-denied operations can trigger Node errors that become process-level failures (for example, an unhandled EventEmitter 'error' event). In that case:

  • the kernel process exits,
  • the host sees stdout EOF,
  • the user gets a generic kernel-exit error,
  • and the next request can briefly race with stale kernel state.

This change improves that failure mode without monkeypatching Node APIs.

Changes

Kernel-side (js_repl Node process)

  • Add process-level handlers for:
    • uncaughtException
    • unhandledRejection
  • When one of these fires:
    • best-effort emit a normal exec_result error for the active exec
    • include actionable guidance to catch/handle async errors (including Promise rejections and EventEmitter 'error' events)
    • exit intentionally so the host can reset/restart the kernel

Host-side (JsReplManager)

  • Clear dead kernel state as soon as the stdout reader observes unexpected kernel exit/EOF.
  • This lets the next js_repl exec start a fresh kernel instead of hitting a stale broken-pipe path.

Tests

  • Add regression coverage for:
    • uncaught async exception -> exec error + kernel recovery on next exec
  • Update forced-kernel-exit test to validate recovery behavior (next exec restarts cleanly)

Impact

  • Better user-facing error for kernel crashes caused by uncaught/unhandled async failures.
  • Cleaner recovery behavior after kernel exit.

Validation

  • cargo test -p codex-core --lib tools::js_repl::tests::js_repl_uncaught_exception_returns_exec_error_and_recovers -- --exact
  • cargo test -p codex-core --lib tools::js_repl::tests::js_repl_forced_kernel_exit_recovers_on_next_exec -- --exact
  • just fmt

@fjord-oai fjord-oai merged commit 63c2ac9 into main Feb 25, 2026
33 checks passed
@fjord-oai fjord-oai deleted the fjord/js_repl_err_handle branch February 25, 2026 01:12
@github-actions github-actions bot locked and limited conversation to collaborators Feb 25, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants