#!/usr/bin/env bash
# sophia-bot launcher: TUI by default; subcommands pass through.
# Self-install marker: the upgrade loop writes .sophia-bot-reload after a
# merged cycle; the next launch prints a reload notice (relaunch = install).
set -euo pipefail
# New bot state must remain private even on systems whose shell uses 0002.
# Existing directories retain their permissions and still face authority checks.
umask 077
# resolve symlinks so the installed ~/.local/bin entry works from any cwd
_SOURCE="${BASH_SOURCE[0]}"
while [ -L "$_SOURCE" ]; do
  _DIR="$(cd -P "$(dirname "$_SOURCE")" && pwd)"
  _SOURCE="$(readlink "$_SOURCE")"
  [[ $_SOURCE != /* ]] && _SOURCE="$_DIR/$_SOURCE"
done
ROOT="$(cd -P "$(dirname "$_SOURCE")/.." && pwd)"
if [[ -z "${SOPHIA_BOT_RELEASE_ROOT:-}" && -f "$ROOT/.sophia-bot-reload" ]]; then
  echo "sophia-bot: new self-merged version detected — running fresh code" >&2
  rm -f "$ROOT/.sophia-bot-reload"
fi
export PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}"
# Pin reviewer identity to the launcher tree: python -m would otherwise
# let the operator's cwd shadow sophiabot (audit 2026-08-28 judge runs).
export SOPHIA_BOT_LAUNCHER_ROOT="$ROOT"
_SOPHIA_BOT_PYTHON="${SOPHIA_PYTHON:-python3}"
if [[ -n "${SOPHIA_BOT_RELEASE_ROOT:-}" ]]; then
  "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.product_runtime check-command "${1:-tui}" || exit $?
fi
# Remember whether an apply goal came from the invoking process. The env-file
# loader below may supply ordinary defaults, but a persistent .env value must
# never silently preauthorize a governed write. Use Bash-3.2-compatible
# parameter-presence syntax (macOS still ships Bash 3.2).
if [[ -n "${GOVERNED_BOT_GOAL:-}" ]]; then
  _SOPHIA_GROK_GOAL_EXPLICIT_AT_INVOKE=1
else
  _SOPHIA_GROK_GOAL_EXPLICIT_AT_INVOKE=0
fi
# Origin process env: existing exports win; files fill gaps; then defaults.
_sophia_bot_load_env() {
  local f key value
  for f in "$ROOT/.env" "$HOME/.config/sophia/sophia-bot.env"; do
    [[ -f "$f" ]] || continue
    while IFS= read -r line || [[ -n "$line" ]]; do
      [[ "$line" =~ ^[[:space:]]*# ]] && continue
      [[ "$line" =~ ^[[:space:]]*$ ]] && continue
      line="${line#export }"
      key="${line%%=*}"
      value="${line#*=}"
      value="${value%\"}"
      value="${value#\"}"
      value="${value%\'}"
      value="${value#\'}"
      if [[ -n "$key" && -z "${!key:-}" ]]; then
        export "$key=$value"
      fi
    done < "$f"
  done
}
_sophia_bot_load_env
export SOPHIA_GROK_GOAL_EXPLICIT_AT_INVOKE="$_SOPHIA_GROK_GOAL_EXPLICIT_AT_INVOKE"
unset _SOPHIA_GROK_GOAL_EXPLICIT_AT_INVOKE
: "${SOPHIA_BOT_TARGET_REPO:=$HOME/Documents/GitHub/sophia-agi}"
: "${SOPHIA_BOT_SOPHIA_ROOT:=$SOPHIA_BOT_TARGET_REPO}"
export SOPHIA_BOT_TARGET_REPO SOPHIA_BOT_SOPHIA_ROOT
# SOPHIA_BOT_TARGET_REMOTE is left unset unless the user/file set it so
# promote.py can auto-prefer cursor-origin when that remote exists.
# Cross-repo freshness notices (TUI pin staleness, staged promotions) —
# read-only, one line each, never block the launch.
"$_SOPHIA_BOT_PYTHON" -P -m sophiabot.notices 2>/dev/null || true
# Default LLM backends: grok proposes, codex verifies (read-only, single-turn).
# Override with SOPHIA_BOT_LLM_CMD / SOPHIA_BOT_VERIFIER_CMD; use "{prompt}"
# anywhere in the override to pass the prompt as an argument instead of stdin.
# Keep literal prompt braces outside the parameter-expansion grammar.
_SOPHIA_BOT_LLM_DEFAULT='grok -p {prompt}'
_SOPHIA_BOT_VERIFIER_DEFAULT='codex exec --skip-git-repo-check --sandbox read-only {prompt}'
export SOPHIA_BOT_LLM_CMD="${SOPHIA_BOT_LLM_CMD:-$_SOPHIA_BOT_LLM_DEFAULT}"
export SOPHIA_BOT_VERIFIER_CMD="${SOPHIA_BOT_VERIFIER_CMD:-$_SOPHIA_BOT_VERIFIER_DEFAULT}"
unset _SOPHIA_BOT_LLM_DEFAULT _SOPHIA_BOT_VERIFIER_DEFAULT
if [[ $# -eq 0 ]]; then
  exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui "$@"
fi
case "$1" in
  upgrade) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.upgrade "${@:2}" ;;
  loop) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.upgrade --loop "${@:2}" ;;
  daemon) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.daemon "${@:2}" ;;
  doctor) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.upgrade --doctor "${@:2}" ;;
  pin-tui) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui_pin "${@:2}" ;;
  origin-setup) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.origin_setup "${@:2}" ;;
  smoke) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui_smoke "${@:2}" ;;
  smoke-self) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.self_improve_smoke "${@:2}" ;;
  smoke-judge) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.judge_smoke "${@:2}" ;;
  smoke-all) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.acceptance_smoke "${@:2}" ;;
  bench) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.capability_bench "${@:2}" ;;
  grok-review) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.grok_review "${@:2}" ;;
  selfreview) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.selfreview "${@:2}" ;;
  decompose) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.decompose "${@:2}" ;;
  tasks|task) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tasks "${@:2}" ;;
  workspace) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.workspace "${@:2}" ;;
  smoke-workspace) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.workspace_smoke "${@:2}" ;;
  train|trainer) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.trainer "${@:2}" ;;
  tui-vendor) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui_vendor "${@:2}" ;;
  tui-sync)
    # bare `tui-sync` aligns (repin); an explicit mode flag passes through
    case "${2:-}" in
      --check|--sync) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui_sync "${@:2}" ;;
      *) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui_sync --sync "${@:2}" ;;
    esac ;;
  tui) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui "${@:2}" ;;
  --mini|--headless|--herdr) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.tui "$@" ;;   # flags target the TUI, not the CLI agent
  cli) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.cli "${@:2}" ;;
  -p|--prompt|--json|--streaming-json|--continue|-c|--version|--max-steps)
     exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.cli "$@" ;;
  -h|--help)
     echo 'usage: sophia-bot [tui|workspace|smoke-workspace|upgrade|loop|daemon|doctor|pin-tui|origin-setup|smoke|smoke-self|smoke-judge|smoke-all|bench|grok-review|selfreview|decompose|tasks|train|tui-sync|cli] | <goal> | -p PROMPT [--json]'
     echo 'TUI: /bot workspace · /bot task TASK :: [criteria JSON] · /feedback correct RUN-ID :: CORRECTION · /refine help'
     exit 0 ;;
  -*) echo 'usage: sophia-bot --help' >&2; exit 2 ;;
  *) exec "$_SOPHIA_BOT_PYTHON" -P -m sophiabot.cli "$@" ;;   # one-shot goal, same shape as `sophia "<goal>"`
esac
