#!/usr/bin/env bash set -euo pipefail if [[ $# -ne 3 ]]; then echo "Usage: bash scripts/orchestrate-codex-worker.sh " >&2 exit 1 fi task_file="$1" handoff_file="$2" status_file="$3" timestamp() { date -u +"%Y-%m-%dT%H:%M:%SZ" } write_status() { local state="$1" local details="$2" cat > "$status_file" < "$handoff_file" exit 1 fi write_status "running" "- Task file: \`$task_file\`" # SECURITY: never auto-approve agent tool execution. The worker prompt is built # from a task file that may contain LLM-generated or third-party content # (indirect prompt injection). `codex exec -p yolo` would execute # rm -rf / exfiltration commands without confirmation. # Default to the most restrictive approval mode; allow an explicit operator # override only via env (e.g. ECC_CODEX_APPROVAL_MODE=on-request for trusted runs). APPROVAL_MODE="${ECC_CODEX_APPROVAL_MODE:-never}" case "$APPROVAL_MODE" in never|on-request|on-failure) ;; *) echo "[ECC worker] Refusing to run: unsupported ECC_CODEX_APPROVAL_MODE='$APPROVAL_MODE' (expected never|on-request|on-failure)" >&2 write_status "failed" "- Error: unsupported approval mode" exit 1 ;; esac # Contain the task file to the current worktree so a malicious launcher cannot # point the worker at /etc/passwd or a sibling checkout. task_real="$(realpath -m "$task_file" 2>/dev/null || readlink -f "$task_file" 2>/dev/null || printf '%s' "$task_file")" work_real="$(pwd -P 2>/dev/null || pwd)" case "$task_real" in "$work_real"/*) ;; *) echo "[ECC worker] Refusing to run: task file outside worktree: $task_file" >&2 write_status "failed" "- Error: task file outside worktree" exit 1 ;; esac prompt_file="$(mktemp)" output_file="$(mktemp)" cleanup() { rm -f "$prompt_file" "$output_file" } trap cleanup EXIT cat > "$prompt_file" < "$handoff_file" write_status "completed" "- Handoff file: \`$handoff_file\`" else { echo "# Handoff" echo echo "- Failed: $(timestamp)" echo "- Branch: \`$(git rev-parse --abbrev-ref HEAD)\`" echo "- Worktree: \`$(pwd)\`" echo echo "The Codex worker exited with a non-zero status." } > "$handoff_file" write_status "failed" "- Handoff file: \`$handoff_file\`" exit 1 fi