#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" ENV_FILE="$ROOT/.env" RUN_DIR="$ROOT/run" PID_FILE="$RUN_DIR/codex-app-server.pid" LOG_FILE="$RUN_DIR/codex-app-server.log" STDIN_FIFO="$RUN_DIR/codex-app-server.stdin" read_env_value() { local key="$1" if [[ -f "$ENV_FILE" ]]; then awk -F= -v key="$key" '$1 == key { sub(/^[^=]*=/, ""); print; exit }' "$ENV_FILE" fi } HOST_CODEX_SOCKET="${HOST_CODEX_SOCKET:-$(read_env_value HOST_CODEX_SOCKET)}" HOST_CODEX_SOCKET="${HOST_CODEX_SOCKET:-$RUN_DIR/codex.sock}" mkdir -p "$RUN_DIR" chmod 700 "$RUN_DIR" if [[ -f "$PID_FILE" ]]; then old_pid="$(tr -cd '0-9' < "$PID_FILE" || true)" if [[ -n "$old_pid" ]] && kill -0 "$old_pid" 2>/dev/null; then if [[ -S "$HOST_CODEX_SOCKET" ]]; then echo "codex app-server already running: pid=$old_pid socket=$HOST_CODEX_SOCKET" exit 0 fi echo "pid $old_pid is running but socket is missing; refusing to start a second app-server" >&2 exit 1 fi rm -f "$PID_FILE" fi if [[ -e "$HOST_CODEX_SOCKET" ]]; then if [[ -S "$HOST_CODEX_SOCKET" ]]; then rm -f "$HOST_CODEX_SOCKET" else echo "socket path exists and is not a Unix socket: $HOST_CODEX_SOCKET" >&2 exit 1 fi fi rm -f "$STDIN_FIFO" mkfifo "$STDIN_FIFO" chmod 600 "$STDIN_FIFO" : > "$LOG_FILE" # Codex app-server currently exits if detached with stdin closed. A detached # wrapper keeps a private FIFO writer open and then runs Codex on the host. setsid -f bash -c ' echo "$$" > "$3" tail -f /dev/null > "$1" & writer=$! trap "kill $writer 2>/dev/null || true" EXIT codex app-server --listen "$2" < "$1" ' codex-app-server "$STDIN_FIFO" "unix://$HOST_CODEX_SOCKET" "$PID_FILE" >> "$LOG_FILE" 2>&1 for _ in $(seq 1 50); do if [[ -f "$PID_FILE" ]]; then break fi sleep 0.1 done pid="$(tr -cd '0-9' < "$PID_FILE" 2>/dev/null || true)" if [[ -z "$pid" ]]; then echo "codex app-server did not write a pid file; log follows:" >&2 sed -n '1,120p' "$LOG_FILE" >&2 || true exit 1 fi for _ in $(seq 1 100); do if [[ -S "$HOST_CODEX_SOCKET" ]]; then sleep 0.5 if kill -0 "$pid" 2>/dev/null; then echo "codex app-server started: pid=$pid socket=$HOST_CODEX_SOCKET log=$LOG_FILE" exit 0 fi fi if ! kill -0 "$pid" 2>/dev/null; then echo "codex app-server exited before staying ready; log follows:" >&2 sed -n '1,120p' "$LOG_FILE" >&2 || true rm -f "$PID_FILE" exit 1 fi sleep 0.1 done echo "codex app-server did not create socket within 10 seconds; log follows:" >&2 sed -n '1,120p' "$LOG_FILE" >&2 || true exit 1