#!/usr/bin/env bash # ============================================================================= # agy-chat.sh — pi <-> agy multi-turn conversation wrapper # # Permette a pi (agente principale) di conversare avanti e indietro con agy # (subagent), mantenendo la memoria della conversazione tra i turni. # # USO: # ./agy-chat.sh "prompt" # avvia o continua la conversazione # ./agy-chat.sh --new "prompt" # forza una nuova conversazione # ./agy-chat.sh --model "Gemini 3.1 Pro (High)" "prompt" # ./agy-chat.sh --effort high "prompt" # ./agy-chat.sh --id # stampa l'ID conversazione corrente # ./agy-chat.sh --list # elenca le conversazioni recenti # ./agy-chat.sh --resume "prompt" # riprende una conversazione specifica # ./agy-chat.sh --reset # azzera lo stato (parte da zero) # # VARIABILI: # AGY_CHAT_STATE cartella di stato (default ~/.agy-chat) # AGY_BIN percorso del binario agy (default: agy su PATH) # ============================================================================= set -uo pipefail STATE_DIR="${AGY_CHAT_STATE:-$HOME/.agy-chat}" STATE_FILE="$STATE_DIR/conversation_id" DB="${AGY_CHAT_DB:-$HOME/.gemini/antigravity-cli/conversation_summaries.db}" CONV_DIR="${AGY_CHAT_CONV_DIR:-$HOME/.gemini/antigravity-cli/conversations}" AGY_BIN="${AGY_BIN:-agy}" mkdir -p "$STATE_DIR" # --- helper: ultimo conversation_id (dal file .db più recente in conversations/) --- latest_id() { # il nome del file .db nella cartella conversations è l'ID conversazione ls -t "$CONV_DIR"/*.db 2>/dev/null | head -1 | xargs -r -n1 basename 2>/dev/null | sed 's/\.db$//' } # --- helper: elenca conversazioni recenti ------------------------------------ list_convs() { if [[ ! -d "$CONV_DIR" ]] || [[ -z "$(ls -A "$CONV_DIR"/*.db 2>/dev/null)" ]]; then echo "(nessuna conversazione trovata)" return 0 fi for f in $(ls -t "$CONV_DIR"/*.db 2>/dev/null); do id="$(basename "$f" .db)" mtime="$(stat -c '%y' "$f" 2>/dev/null | cut -d. -f1)" echo "$id\t$mtime" done } # --- parse argomenti ---------------------------------------------------------- NEW=0 MODEL="" EFFORT="" RESUME_ID="" PROMPT="" ADD_DIRS=() YOLO=0 while [[ $# -gt 0 ]]; do case "$1" in --new) NEW=1; shift ;; --reset) rm -f "$STATE_FILE"; echo "stato azzerato"; exit 0 ;; --id) if [[ -f "$STATE_FILE" ]]; then cat "$STATE_FILE"; else echo "(nessuna conversazione attiva)"; fi; exit 0 ;; --list) list_convs; exit 0 ;; --model) MODEL="$2"; shift 2 ;; --effort) EFFORT="$2"; shift 2 ;; --resume) RESUME_ID="$2"; shift 2 ;; --add-dir) ADD_DIRS+=("$2"); shift 2 ;; --yolo) YOLO=1; shift ;; *) PROMPT="$PROMPT $1"; shift ;; esac done PROMPT="$(echo "$PROMPT" | sed 's/^ *//;s/ *$//')" if [[ -z "$PROMPT" ]]; then echo "uso: ./agy-chat.sh [--new] [--model NOME] [--effort low|medium|high] \"prompt\"" >&2 exit 1 fi # --- determina conversation_id da usare --------------------------------------- CONV_ID="" if [[ $NEW -eq 0 && -z "$RESUME_ID" && -f "$STATE_FILE" ]]; then CONV_ID="$(cat "$STATE_FILE")" elif [[ -n "$RESUME_ID" ]]; then CONV_ID="$RESUME_ID" fi # --- costruisci comando ------------------------------------------------------- CMD=("$AGY_BIN" -p "$PROMPT") for d in "${ADD_DIRS[@]}"; do CMD+=(--add-dir "$d") done if [[ -n "$CONV_ID" ]]; then CMD+=(--conversation "$CONV_ID") fi if [[ -n "$MODEL" ]]; then CMD+=(--model "$MODEL") fi if [[ -n "$EFFORT" ]]; then CMD+=(--effort "$EFFORT") fi if [[ $YOLO -eq 1 ]]; then CMD+=(--dangerously-skip-permissions) fi echo ">>> agy (conversation: ${CONV_ID:-nuova})" >&2 OUTPUT="$("${CMD[@]}" 2>&1)" RC=$? # --- stampa output ------------------------------------------------------------ if [[ -n "$OUTPUT" ]]; then echo "$OUTPUT" fi # --- aggiorna stato con l'ultimo conversation_id ------------------------------ if [[ $RC -eq 0 ]]; then NEW_ID="$(latest_id)" if [[ -n "$NEW_ID" ]]; then echo "$NEW_ID" > "$STATE_FILE" fi else # se fallisce per mancato login, avvisa if echo "$OUTPUT" | grep -qiE "sign in|signin|authenticate|login|Authentication required|visit the URL"; then echo "" >&2 echo "⚠️ agy NON è autenticato. Devi fare il login UNA volta:" >&2 echo " 1) apri un terminale e lancia: agy" >&2 echo " 2) visita l'URL stampato, fai login con l'account Antigravity" >&2 echo " 3) incolla il codice di autorizzazione nel terminale" >&2 echo " Poi torna qui e riprova il wrapper." >&2 fi fi exit $RC