| #!/usr/bin/env bash |
|
|
| set -euo pipefail |
|
|
| repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" |
| cargo_root="$repo_root/codex-rs" |
| listen_url="${CODEX_EXEC_SERVER_LISTEN_URL:-ws://127.0.0.1:0}" |
| start_timeout_seconds="${CODEX_EXEC_SERVER_START_TIMEOUT_SECONDS:-120}" |
| tmp_dir="$(mktemp -d "${TMPDIR:-/tmp}/codex-tui-with-exec-server.XXXXXX")" |
| stdout_log="$tmp_dir/exec-server.stdout" |
| stderr_log="$tmp_dir/exec-server.stderr" |
| server_pid="" |
| exec_server_url="" |
|
|
| cleanup() { |
| if [[ -n "$server_pid" ]]; then |
| kill "$server_pid" >/dev/null 2>&1 || true |
| wait "$server_pid" >/dev/null 2>&1 || true |
| fi |
| rm -rf "$tmp_dir" |
| } |
|
|
| trap cleanup EXIT INT TERM HUP |
|
|
| ( |
| cd "$cargo_root" |
| cargo run -p codex-cli --bin codex -- exec-server --listen "$listen_url" |
| ) >"$stdout_log" 2>"$stderr_log" & |
| server_pid="$!" |
|
|
| |
| for _ in $(seq 1 "$((start_timeout_seconds * 20))"); do |
| if [[ -s "$stdout_log" ]]; then |
| exec_server_url="$(head -n 1 "$stdout_log" | tr -d '\r')" |
| if [[ "$exec_server_url" == ws://* ]]; then |
| break |
| fi |
| fi |
|
|
| if ! kill -0 "$server_pid" >/dev/null 2>&1; then |
| cat "$stderr_log" >&2 || true |
| cat "$stdout_log" >&2 || true |
| echo "failed to start codex exec-server" >&2 |
| exit 1 |
| fi |
|
|
| sleep 0.05 |
| done |
|
|
| if [[ -z "$exec_server_url" ]]; then |
| cat "$stderr_log" >&2 || true |
| cat "$stdout_log" >&2 || true |
| echo "timed out waiting ${start_timeout_seconds}s for codex exec-server to report its websocket URL" >&2 |
| exit 1 |
| fi |
|
|
| export CODEX_EXEC_SERVER_URL="$exec_server_url" |
| echo "Starting codex-tui with CODEX_EXEC_SERVER_URL=$CODEX_EXEC_SERVER_URL" >&2 |
|
|
| cd "$cargo_root" |
| cargo run -p codex-tui --bin codex-tui -- -c mcp_oauth_credentials_store=file "$@" |
|
|