OSVauco/scripts/opax.sh

202 lines
7.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# opax.sh — Gemini 2.5 Pro TUI starter (Vertex AI us-central1)
#
# Bruk: source ~/OSVauco/scripts/opax.sh
# Alias: opax (settes av scripts/boot.sh)
#
# Modell og region er låst i docs/AGENT_RULEBOOK.md.
# =============================================================================
OSVAUCO_DIR="${OSVAUCO_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
OPAX_GEMINI_MODEL_WAS_SET=0
if [[ -n "${GEMINI_MODEL:-}" ]]; then
OPAX_GEMINI_MODEL_WAS_SET=1
fi
# --- Configurable environment variables ---
# Set defaults only if variables are unset or empty. Allows user overrides.
: "${GOOGLE_CLOUD_PROJECT:=propane-will-491900-m5}"
export GOOGLE_CLOUD_PROJECT
: "${GOOGLE_CLOUD_LOCATION:=us-central1}"
export GOOGLE_CLOUD_LOCATION
: "${VERTEX_AI_LOCATION:=${GOOGLE_CLOUD_LOCATION}}"
export VERTEX_AI_LOCATION
: "${GEMINI_MODEL:=gemini-2.5-pro}"
export GEMINI_MODEL
: "${GOOGLE_GENAI_USE_VERTEXAI:=true}"
export GOOGLE_GENAI_USE_VERTEXAI
HANDOFF="$OSVAUCO_DIR/docs/HANDOFF.md"
MASTERPLAN="$OSVAUCO_DIR/docs/MASTERPLAN.md"
ROADMAP="$OSVAUCO_DIR/docs/ROADMAP.md"
RULEBOOK="$OSVAUCO_DIR/docs/AGENT_RULEBOOK.md"
SESSION_LOG="$OSVAUCO_DIR/docs/OSVAUCO_OPAX_SESSION_LOG.md"
GREEN="$(tput setaf 2 2>/dev/null || printf '\033[0;32m')"
RED="$(tput setaf 1 2>/dev/null || printf '\033[0;31m')"
YELLOW="$(tput setaf 3 2>/dev/null || printf '\033[1;33m')"
CYAN="$(tput setaf 6 2>/dev/null || printf '\033[0;36m')"
WHITE="$(tput setaf 7 2>/dev/null || printf '\033[1;37m')"
DIM="$(tput dim 2>/dev/null || printf '\033[2m')"
BOLD="$(tput bold 2>/dev/null || printf '\033[1m')"
NC="$(tput sgr0 2>/dev/null || printf '\033[0m')"
OK="✔"
FAIL="✗"
select_gemini_model() {
if [[ "$OPAX_GEMINI_MODEL_WAS_SET" -eq 1 ]]; then
return 0
fi
if [[ ! -t 0 || ! -t 1 ]]; then
return 0
fi
printf "\n${BOLD}${WHITE}Velg Gemini-modell${NC}\n"
printf " 1) Gemini 3.1 Pro Preview ${DIM}(gemini-3.1-pro-preview)${NC}\n"
printf " 2) Gemini 3.1 Flash-Lite ${DIM}(gemini-3.1-flash-lite)${NC}\n"
printf " 3) Gemini 2.5 Pro ${DIM}(fallback/default)${NC}\n"
printf " 4) Custom Gemini model ID\n"
printf " 5) Custom / Model Garden model ID ${DIM}(advanced/unvalidated)${NC}\n"
local choice custom_model
read -r -p "Velg [1-5, Enter=3]: " choice || return 0
case "${choice:-3}" in
1)
GEMINI_MODEL="gemini-3.1-pro-preview"
;;
2)
GEMINI_MODEL="gemini-3.1-flash-lite"
;;
3)
GEMINI_MODEL="gemini-2.5-pro"
;;
4)
read -r -p "Oppgi Gemini model ID: " custom_model || return 1
if [[ -z "$custom_model" ]]; then
printf "${RED}Model ID kan ikke være tom.${NC}\n"
return 1
fi
GEMINI_MODEL="$custom_model"
;;
5)
printf "${YELLOW}Merk: Denne verdien sendes direkte til Gemini CLI som --model. OPAX konfigurerer ikke Vertex-endpoint, deployer ikke Gemma og verifiserer ikke kompatibilitet.${NC}\n"
read -r -p "Oppgi model ID som støttes av installert Gemini CLI: " custom_model || return 1
if [[ -z "$custom_model" ]]; then
printf "${RED}Model ID kan ikke være tom.${NC}\n"
return 1
fi
GEMINI_MODEL="$custom_model"
;;
*)
printf "${YELLOW}Ugyldig valg; bruker Gemini 2.5 Pro.${NC}\n"
GEMINI_MODEL="gemini-2.5-pro"
;;
esac
export GEMINI_MODEL
}
run_check() {
local desc="$1" cmd="$2" err="$3" critical="${4:-false}"
printf " %-42s" "$desc"
if eval "$cmd" &>/dev/null; then
printf "${GREEN}${OK} OK${NC}
"
else
printf "${RED}${FAIL} FAIL${NC}
"
if [[ "$critical" == "true" ]]; then
printf "
${RED}${BOLD}KRITISK:${NC} ${err}
"
printf " ${YELLOW}Avbryter opax-oppstart.${NC}
"
return 1
else
printf " ${YELLOW}${NC} ${err}
"
fi
fi
}
select_gemini_model || return 1
clear
printf "${CYAN}${BOLD}"
cat << 'LOGO'
___ ____ __ __ _ _ _ ____ ___
/ _ \/ ___| \ \ / /_ _| | | | | |/ ___|/ _
| | | \___ \ \ \ / / _` | | | | | | | | | | |
| |_| |___) | \ V / (_| | |__| |_| | |___| |_| |
\___/|____/ \_/ \__,_|____|\___/ \____|\___/
LOGO
printf "${NC}${BOLD}${CYAN} OS VAUCO / OPAX${NC}${DIM} · Gemini CLI / Vertex AI${NC}\n"
printf "${DIM} ─────────────────────────────────────────────${NC}
"
printf " ${CYAN}project=${NC}%s ${CYAN}region=${NC}%s
" "$GOOGLE_CLOUD_PROJECT" "$GOOGLE_CLOUD_LOCATION"
printf " ${CYAN}model =${NC}%s
" "$GEMINI_MODEL"
printf "${DIM} ─────────────────────────────────────────────${NC}
"
printf "${BOLD}${WHITE}Preflight${NC}
"
run_check "Vertex AI ADC" "gcloud auth application-default print-access-token" "ADC not found. On GCE, attach service account. Locally, run: gcloud auth application-default login" true || return 1
run_check "gcloud CLI (optional)" "gcloud auth print-access-token" "CLI not logged in. Needed for deploy commands." false
run_check "project = $GOOGLE_CLOUD_PROJECT" "[[ "$(gcloud config get-value project 2>/dev/null)" == "$GOOGLE_CLOUD_PROJECT" ]]" "Kjør: gcloud config set project $GOOGLE_CLOUD_PROJECT" false
run_check "HANDOFF.md finnes" "[[ -f '$HANDOFF' ]]" "Mangler: $HANDOFF" false
run_check "MASTERPLAN.md finnes" "[[ -f '$MASTERPLAN' ]]" "Mangler MASTERPLAN" false
run_check "ROADMAP.md finnes" "[[ -f '$ROADMAP' ]]" "Mangler ROADMAP" false
run_check "AGENT_RULEBOOK.md finnes" "[[ -f '$RULEBOOK' ]]" "Mangler RULEBOOK" false
run_check "gemini CLI installert" "command -v gemini" "Installer: npm i -g @google/generative-ai-cli" true || return 1
run_check "gh CLI auth" "gh auth status" "Kjør: gh auth login" false
run_check "Vertex AI API enabled" "true # Skipped due to VPC SC" "N/A" false
printf "
${BOLD}${CYAN}NESTE OPPGAVE${NC}
"
if [[ -f "$HANDOFF" ]]; then
sed -n '/^##.*[Nn]este [Oo]ppgave/,/^## /p' "$HANDOFF" | sed '1d;$d' | sed '/^$/d' | head -12
fi
printf "
${DIM}Tips:${NC} 'ho' = HANDOFF · 'sol' = avslutt+commit · 'pf' = re-preflight · 'gh pr list' = aktive PRs
"
cd "$OSVAUCO_DIR"
printf "
${GREEN}${BOLD}→ Starter gemini...${NC} (laster kontekst fra .gemini/GEMINI.md)
"
gemini --model "$GEMINI_MODEL"
GEMINI_EXIT=$?
# =============================================================================
# EXIT-HOOK: spør om sesjons-logg etter at gemini avsluttes
# =============================================================================
printf "
${DIM}── opax-sesjon avsluttet (exit=$GEMINI_EXIT) ──${NC}
"
printf "${BOLD}${CYAN}Vil du logge sesjonen nå?${NC} [Y/n]: "
read -r LOGG_ANSWER
case "${LOGG_ANSWER:-y}" in
n|N) printf " ${DIM}OK — kjør 'sol' senere når du vil logge + commit.${NC}
" ;;
*)
if declare -f sol >/dev/null; then sol; else bash "$OSVAUCO_DIR/scripts/opax-logg-slutt.sh"; fi
;;
esac