# `CodexWrapper.Runner.Port`
[🔗](https://github.com/genagent/codex_wrapper_ex/blob/v0.5.3/lib/codex_wrapper/runner/port.ex#L1)

Default runner: a `/bin/sh` `Port` with stdin redirected from
`/dev/null` (Codex CLI hangs if stdin is inherited from the parent),
wrapped in a `Task` for timeout enforcement.

This is the execution path the library has always used. On a timeout it
brutal-kills the `Task`, which closes the port but sends no signal to the
OS process group. `codex` and any subprocess it spawned (stdio MCP
servers, tool helpers) may keep running until they next touch a closed
pipe. For strict termination, use `CodexWrapper.Runner.Forcola` (see
`CodexWrapper.Runner` and #48).

`stream_lines/4` uses the same `/bin/sh` wrapper in `:line` mode, and
treats `timeout` as an *idle* bound: the wait for the next line, not
for the whole run. That is what the streaming paths have always done.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
