Use nonblocking POSIX PTY reads and buffered, cooperative writes so a full terminal or stale readiness notification cannot stall other chats. Discard a shell on cancellation only while command bytes remain unsent, preserving shell state after a fully drained send. Use best-effort synchronous destruction instead of reentering asyncio; explicit close retains the existing awaited cleanup and signal escalation. Add isolated regression checks for payload integrity, loop responsiveness, partial and complete-send cancellation, descriptor reuse, cross-thread cleanup, and destruction. Document the terminal lifecycle contracts. Validation: 28 focused terminal, parallel-lifetime, and pager tests passed. Four real Codex II chats also completed concurrent Linux terminal, Python, and Node workloads with 29.87 seconds of overlap and intact shell state.
2.6 KiB
Code Execution Plugin DOX
Purpose
- Own terminal, Python, and Node.js code execution through persistent local or SSH-backed sessions.
Ownership
tools/owns the code execution and input tools.helpers/owns local shell, SSH shell, and TTY session management.prompts/owns execution prompt and runtime response fragments.default_config.yaml,plugin.yaml,extensions/, andwebui/own settings, metadata, hooks, and UI config.
Local Contracts
-
extensions/webui/get_process_step_types/code-exe-types.jsregisterscode_exeas a process-step type so raw-log grouping matches the plugin's message renderer. -
Keep session concurrency, timeout, streaming, and reset behavior predictable.
-
A direct parallel code job retains its worker and loop-bound shell until the command ends or is cancelled. Output timeouts publish model-facing progress to the registered job and continue polling; callers use parallel job IDs. Close parallel shells explicitly on that worker loop on completion or cancellation, including partially connected shells. Top-level sessions retain their ordinary timeout/output/reset behavior.
-
Execute multi-line terminal input as one current-shell compound so intermediate prompts cannot mark queued work complete; preserve
cd, exports, and other shell state. -
Treat local process exit and SSH channel termination as definitive command completion even when no final prompt is emitted; recreate terminated sessions before their next command.
-
Terminal reset/close must not hang on foreground commands or shells that ignore SIGTERM.
-
POSIX PTY I/O is nonblocking. The existing write/drain interface buffers partial writes and yields while the terminal is full; cancellation discards the shell only while POSIX input bytes remain unsent. Fully drained sends retain the shell and its state.
-
TTY destruction uses best-effort kill, never nested event-loop execution; explicit close retains awaited cleanup.
-
Local and SSH session wrappers must synchronously release their owned process or connection resources when discarded.
-
Explicitly target local versus SSH execution runtimes.
-
The tool's
allow_runningflag is framework-set (for example by theinputtool's terminal dispatch); it is not a model-facing arg and stays undocumented in prompts. -
Do not hardcode secrets, SSH credentials, or local user paths.
Work Guidance
- Preserve long-running command output retrieval and busy-session guards when changing execution flow.
Verification
- Smoke-test terminal, Python, Node.js, output polling, and reset paths after tool changes.
Child DOX Index
No child DOX files.