agy-pi: estensione pi per Antigravity CLI (agy) subagent multimodale
This commit is contained in:
Executable
+133
@@ -0,0 +1,133 @@
|
||||
#!/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 <id> "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
|
||||
Reference in New Issue
Block a user