#!/usr/bin/env bash # ============================================================================= # OPAX2.SH — Claude 4.7 session starter # # Bruk: source ~/OSVauco/scripts/opax2.sh # Alias: opax2 # # Forskjell fra opax: # - Bruker Claude Opus 4.7 via Vertex AI EU endpoint # - Mater inn handoff til claude automatisk ved oppstart # - Region: europe-west1 # ============================================================================= OSVAUCO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" export GOOGLE_CLOUD_PROJECT="propane-will-491900-m5" export GOOGLE_CLOUD_LOCATION="europe-west1" export VERTEX_AI_ENDPOINT="eu" export CLAUDE_MODEL="claude-opus-4-7@20260301" HANDOFF_FILE="$OSVAUCO_DIR/docs/HANDOFF_20260531_claude47.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')" MAGENTA="$(tput setaf 5 2>/dev/null || printf '\033[0;35m')" 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="✗" SKIP="▷" run_check() { local description="$1" local command_to_run="$2" local error_message="$3" local is_critical="${4:-false}" printf " %-42s" "$description" if eval "$command_to_run" &>/dev/null; then printf "${GREEN}${OK} OK${NC}\n" else printf "${RED}${FAIL} FAIL${NC}\n" if [[ "$is_critical" == "true" ]]; then printf "\n ${RED}${BOLD}KRITISK:${NC} ${error_message}\n" printf " ${YELLOW}Avbryter opax2-oppstart.${NC}\n\n" return 1 else printf " ${YELLOW}⚠${NC} ${error_message}\n" fi fi } clear printf "${MAGENTA}" cat << 'LOGO' ___ _____ _ _ _ _ ___ / _ \| _ || | | || \ | ||_ | | | | | |_) || |__| || \| | | | | | | | __/ | __ || . ` | | | | |_| | | | | | || |\ | _| |_ \___/|_| |_| |_||_| \_||_____| LOGO printf "${NC}" printf "${DIM} --------------------------------------------------${NC}\n" printf " ${MAGENTA}OPAX2${NC} ${DIM}Claude 4.7 · Vertex AI EU · ${GOOGLE_CLOUD_PROJECT}${NC}\n" printf "${DIM} --------------------------------------------------${NC}\n\n" printf "${BOLD}${WHITE} Preflight...${NC}\n" run_check "gcloud user authenticated" \ "gcloud auth list --filter=status:ACTIVE --format='value(account)' | grep -q @" \ "Kjør: gcloud auth login" \ true run_check "ADC tilgjengelig" \ "gcloud auth application-default print-access-token --quiet" \ "Kjør: gcloud auth application-default login" \ true run_check "GCP project = $GOOGLE_CLOUD_PROJECT" \ "[[ \$(gcloud config get-value project 2>/dev/null) == '$GOOGLE_CLOUD_PROJECT' ]]" \ "Kjør: gcloud config set project $GOOGLE_CLOUD_PROJECT" \ true run_check "GitHub remote tilgjengelig" \ "git -C '$OSVAUCO_DIR' ls-remote --exit-code origin" \ "Kan ikke nå git remote" \ true # Vertex AI EU endpoint sjekk TOKEN=$(gcloud auth print-access-token 2>/dev/null || echo "") run_check "Vertex AI EU endpoint nåbar" \ "curl -sf -o /dev/null -H 'Authorization: Bearer ${TOKEN}' \ 'https://eu-aiplatform.googleapis.com/v1/projects/${GOOGLE_CLOUD_PROJECT}/locations/eu/publishers/anthropic/models'" \ "Sjekk Vertex AI EU tillatelser / Model Garden aktivering" # Cloud Run sjekk (europe-west1) CR_URL="https://osvauco-agent-357036551735.europe-west1.run.app" IT=$(gcloud auth print-identity-token 2>/dev/null || echo "") CR_HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer $IT" \ "$CR_URL/health" 2>/dev/null || echo "000") if [[ "$CR_HTTP" == "200" ]]; then printf " %-42s${GREEN}${OK} OK${NC} (HTTP $CR_HTTP)\n" "Cloud Run osvauco-agent" else printf " %-42s${YELLOW}⚠ HTTP $CR_HTTP${NC}\n" "Cloud Run osvauco-agent" printf " ${DIM}Direkte URL: $CR_URL${NC}\n" fi # opax.vauco.no IAP sjekk DOMAIN_HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer $IT" \ "https://opax.vauco.no/health" 2>/dev/null || echo "000") if [[ "$DOMAIN_HTTP" == "200" ]]; then printf " %-42s${GREEN}${OK} OK${NC} (HTTP $DOMAIN_HTTP)\n" "opax.vauco.no (IAP)" else printf " %-42s${YELLOW}▷ HTTP $DOMAIN_HTTP${NC} ${DIM}(Fase 8: verifiser IAP)${NC}\n" "opax.vauco.no (IAP)" fi printf "\n${MAGENTA}${BOLD}✦ OPAX2 klar — Claude 4.7 · europe-west1${NC}\n\n" # --- Handoff-prompt --- printf "${DIM} --------------------------------------------------${NC}\n" printf "${BOLD} HANDOFF\n${NC}" if [[ -f "$HANDOFF_FILE" ]]; then printf " ${GREEN}${OK}${NC} ${DIM}$HANDOFF_FILE${NC}\n" printf " Sende handoff til Claude nå? [Y/n]: " read -r ANSWER case "$ANSWER" in n|N) printf " ${DIM}Hopper over — kjør manuelt: claude < $HANDOFF_FILE${NC}\n\n" ;; *) printf " ${DIM}Starter Claude 4.7 med handoff...${NC}\n\n" if command -v claude &>/dev/null; then cd "$OSVAUCO_DIR" # Sender handoff som første melding, så Claude leser kontekst før du skriver noe BOOT_MSG=$(cat "$HANDOFF_FILE") cat << EOF | claude $BOOT_MSG --- Du har nå lest handoff. Print en kort oppsummering (maks 5 linjer) av hva du forstår er status og neste steg. Ikke gjør noe annet. Vent på Chris sin godkjenning. EOF else printf " ${RED}${FAIL}${NC} claude CLI ikke funnet.\n" printf " ${DIM}Installer: npm install -g @anthropic-ai/claude-code${NC}\n\n" fi ;; esac else printf " ${YELLOW}⚠${NC} Handoff ikke funnet: $HANDOFF_FILE\n\n" fi # --- Miljø og prompt --- cd "$OSVAUCO_DIR" 2>/dev/null || true export PS1="\[${MAGENTA}\]┌──(\[${CYAN}\]OPAX2:\[${BOLD}\]\w\[${NC}\])\[${NC}\]\n\[${MAGENTA}\]└─▪\[${NC}\] " export OPAX2_LOADED=true printf "${BOLD}${WHITE}QUICK COMMANDS${NC}\n" printf " ${MAGENTA}%-8s${NC} %s\n" "hc" "health-check" printf " ${MAGENTA}%-8s${NC} %s\n" "st" "smoke-test" printf " ${MAGENTA}%-8s${NC} %s\n" "ca" "cost-audit" printf " ${MAGENTA}%-8s${NC} %s\n" "sol" "avslutt + logg" printf "\n"