25 Commits
Author SHA1 Message Date
Matteo Benedetto a0f94c8811 feat(images): direct Antigravity image API for image tools with CLI fallback
Replace the agent/CLI image path with a direct call to the Antigravity
Cloud Code gateway (same OAuth token and project discovery already used by
the provider), keeping the CLI as an automatic fallback.

Protocol validated with 15 live probes on 2026-09-13:
- POST v1internal:generateContent (non-streaming), requestType "image_gen",
  responseModalities ["IMAGE"], imageConfig {aspectRatio, imageSize}
- image returned as candidates[0].content.parts[].inlineData (base64, jpeg);
  parts with thought=true are intermediate images and must be skipped
- 512/2K/4K verified (512x512 .. 5504x3072, 7-25s, 1.1-2.9K output tokens)
- image input works (single, multiple) and editing honours the input when
  imageConfig.aspectRatio is supplied; HTTP 200 without images carries a
  finishMessage explaining the refusal
- gemini-3-pro-image is not entitled on this account (HTTP 404)
- the image model quota is shared and can be exhausted (429 QUOTA_EXHAUSTED
  with a "reset after" delay)

Changes:
- add antgGenerateImages(): direct client with token refresh retry, image
  part parsing and finishMessage surfacing
- add antgSaveImages() and agyImageTask(): direct-first runner with automatic
  CLI fallback, reporting engine, imagePaths, usage and fallback reason
- add antgParseQuotaDelayMs() + blocked-until guard so an exhausted image
  quota skips the direct attempt instead of retrying it every time
- route agy_generate, agy_edit, agy_inpaint, agy_style_transfer, agy_compose
  and agy_character through agyImageTask; add imageSize to agy_generate
- fix extractImagePath(): it matched the IMAGE_PATH placeholder echoed from
  the prompt and returned a bogus path on CLI failures; now only existing
  absolute image paths are accepted

Verified: module loads, tools invoke agy_generate through the direct engine
(8.6s, 1199 output tokens, file saved to outputDir), the CLI fallback fires
with an explicit reason on 429, and extractImagePath passes 5/5 cases tested
against the real function extracted from this file.
2026-09-13 19:49:18 +02:00
Matteo Benedetto 16fba66723 feat: persist Antigravity model list across restarts
The antigravity provider list lived only in a module-scoped variable
initialized from ANTG_PROVIDER_MODELS, so /agy:refresh-models updated the
running process but the list silently reset to the static defaults on
/reload or restart.

- add ~/.config/agy-pi/models-cache.json (mode 0600, atomic write) storing
  version, refreshedAt, project and the fetched model definitions
- load the cache at startup; fall back to ANTG_PROVIDER_MODELS when the file
  is missing, unreadable, corrupt or has an incompatible version
- persist the live catalog in /agy:refresh-models and report the file path
- add /agy:models-reset to drop the cache and restore the defaults

Verified: extension loads with no cache (11 defaults), a valid cache is
honored and registered, corrupt/invalid/version-mismatched caches fall back
silently, and /agy:models-reset deletes the cache and re-registers the
defaults end-to-end over RPC.
2026-09-13 18:53:10 +02:00
enne2 4920c4c0ba feat: add multimodal audio analysis 2026-09-08 11:11:06 +02:00
enne2 4a88084b2b refactor: remove direct Gemini API integrations
Route F12 and audio transcription exclusively through Antigravity OAuth, and preserve cross-model history without reusing incompatible signatures.\n\nRemove direct Gemini API keys, web grounding, internal TTS, verified image generation, obsolete commands and configuration. Update documentation and restore the local voice workflow helpers required at runtime.
2026-09-03 12:52:13 +02:00
enne2 cde5aaa9b7 feat: add verified image programmatic edits 2026-08-28 18:51:37 +02:00
Matteo Benedetto ace461ff59 feat: abilita di default la pipeline multimodale diretta Gemini per l'audio indipendentemente dal modello attivo in sessione 2026-08-21 21:51:57 +02:00
Matteo Benedetto 49e6269626 feat: pipeline multimodale diretta per F12 con modelli Gemini 2026-08-21 18:24:34 +02:00
Matteo Benedetto c9290e9329 fix(provider): robust validation of Gemini thought_signature rejecting reasoning_content and ASCII strings 2026-08-21 17:14:33 +02:00
Matteo Benedetto 99a7ff4b1a fix(provider): validate Base64 thought signatures and strip foreign reasoning JSON (DeepSeek/OpenAI) 2026-08-21 17:10:49 +02:00
Matteo Benedetto d42fa69e1a fix(provider): handle Gemini thought_signature in multi-turn tool calling and cross-model history 2026-08-21 17:06:40 +02:00
Matteo Benedetto e3362606fd Fix keybinding annulla registrazione: ctrl+escape → ctrl+alt+c (in legacy ctrl+escape invia lo stesso byte di Esc, non distinguibile) 2026-08-13 16:41:25 +02:00
Matteo Benedetto e1acad4a27 fix: rimappa shortcut annulla registrazione da Esc a Ctrl+Esc
Esc è riservato alla built-in app.interrupt di pi: la shortcut veniva
scartata con warning 'conflicts with built-in shortcut'. Rimossa anche
la registrazione ridondante 'esc' (stesso tasto fisico). Aggiornati
messaggi di stato e documentazione.
2026-08-11 22:33:07 +02:00
Matteo Benedetto aa888fe9cc feat(vocale): interpretazione come analista inter-agent in JSON + guida Perplexity
L'interpretazione del prompt vocale ora usa un framing inter-agent: Gemini è un
analista tecnico/middleware che scrive un briefing per l'orchestratore (NON
risponde all'utente), in JSON strutturato.
- Nuovo prompt: ruolo analista, destinatario = solo l'agente orchestratore,
  nessun testo rivolto all'utente, plan-first (nessuna esecuzione).
- Contratto JSON: {trascrizione_corretta, intent_analisi, note_per_agent,
  azioni_raccomandate, prompt_utente_pulito, ricerca_necessaria, suggerimenti_ricerca}.
- extractVoiceBriefing(): estrae prompt_utente_pulito (-> finalText) e se
  ricerca_necessaria=true aggiunge al prompt finale la nota di usare la ricerca
  web (Perplexity) per best practices/versioni/documentazione.
- Testato: parser JSON (valido, con markdown attorno, fallback su testo grezzo).
- docs/vocal-workflow.md aggiornato.
2026-08-11 20:26:59 +02:00
Matteo Benedetto f9a8648c86 fix: stage file esterni in /tmp con nome univoco (niente --add-dir)
Su richiesta: invece di copiare i file esterni in ~/.agy-scratch con --add-dir,
ora vengono copiati in /tmp (cartella nativamente accessibile da agy, verificato)
con nome univoco casuale (agy_stage_<timestamp>_<random><ext>) per evitare
sovrascritture. Rimosso --add-dir in executeAgy: /tmp è già accessibile.
Testato: file /tmp analizzato da agy senza --add-dir.
2026-08-11 01:00:01 +02:00
Matteo Benedetto 7fa1f028d9 fix: workaround accesso agy a file esterni al workspace
Quando un file da analizzare è FUORI dalla cartella di lavoro corrente, agy può
fallire a leggerlo per mancanza di competenze/permessi sul workspace. Workaround:
- stageExternalFiles(): copia automaticamente i file esterni in ~/.agy-scratch/
  e riscrive i riferimenti del prompt con il nuovo percorso accessibile.
- executeAgy: applica lo staging prima di costruire gli argomenti, aggiunge
  ~/.agy-scratch via --add-dir.
- I file già sotto la cwd non vengono toccati (nessun overhead).
- Testato: immagine in /tmp copiata in scratch e analizzata correttamente da agy.
2026-08-11 00:54:14 +02:00
Matteo Benedetto 2137150da3 docs: documentazione MkDocs completa + fix build + verifica OpenCV dinamica
- Aggiunti docs/ (9 pagine MkDocs, tema Material) + mkdocs.yml
- Fix mkdocs.yml: repo_url -> git.enne2.net, tasklist (era taskbuttons),
  fence Mermaid via helper locale mermaid_fence.py (def_fence_mermaid
  rimosso da pymdown-extensions moderne)
- Documentate le nuove funzionalità: agy_create_verified (generazione
  verificata con verifica OpenCV DINAMICA generata dall'LLM), workflow
  vocale a 2 fasi (vocalPlanningMode), chiavi config context/webSearch
- tools.md ora documenta 14 tool; vocal-workflow.md include l'overlay di
  conferma piano; configuration.md include vocalPlanningMode
- .gitignore: esclusi site/ e __pycache__/
- Build MkDocs verificata (site/ generato correttamente)
2026-08-11 00:47:23 +02:00
Matteo Benedetto a81000912a feat: verifica OpenCV DINAMICA — script generato dall'LLM per ogni requisito
La verifica OpenCV in agy_create_verified non è più hardcodata: l'LLM genera a
runtime uno script Python/OpenCV specifico per i requisiti dell'immagine.
- geminiText: chiamata Gemini generica (solo testo, no tool)
- generateOpenCVScript: genera lo script OpenCV ad hoc dai requisiti
- runOpenCVScript: esegue lo script e restituisce il JSON su stdout
- Contratto JSON: {pass, score, findings, errors}
- Il tool genera lo script UNA volta (i requisiti sono fissi) e lo riusa nel loop
- La decisione di conformità combina visione PASS + OpenCV PASS; se OpenCV rileva
  non conformità, le aggiunge alle issue per guidare la rigenerazione
- Testato: script generato per 'quadrato rosso' ha rilevato correttamente
  forma/4 vertici/simmetria/riempimento/sfondo bianco (pass=true, score=1.0)
2026-08-11 00:30:56 +02:00
Matteo Benedetto b2f3cbafb6 feat: agy_create_verified — generazione immagine iterativa con verifica
Loop self-contained per la generazione di immagini conformi a requisiti:
1. Genera immagine con agy (mode image)
2. Analizza con visione testuale (giudice PASS/FAIL vs requisiti)
3. Verifica oggettiva con script Python/OpenCV (dimensioni, aspect ratio,
   luminosità, densità bordi, colori dominanti)
4. Rigenera con prompt di correzione (ri-attaccando l'immagine base) se FAIL

Ripete fino al soddisfacimento o al limite maxIterations (default 3, max 5).
Restituisce immagine finale + report di verifica (verdetto + metriche per
iterazione). Ideale quando l'orchestratore pi non ha visione.
Aggiunto helper runOpenCV. README aggiornato.
2026-08-11 00:24:13 +02:00
Matteo Benedetto db36e78555 feat(Opzione4): workflow vocale a 2 fasi con overlay TUI + vocalPlanningMode
- Dopo la trascrizione F12, agy genera un PIANO (direttiva plan-first: 'produci
  solo il piano, NON eseguire nulla, attendi conferma') invece di avviare un
  loop agentico autonomo.
- Con vocalPlanningMode=true (default) un overlay TUI (ctx.ui.custom) mostra
  trascrizione + piano proposto e attende la conferma dell'utente:
    Enter esegui | Esc annulla | E modifica | F12 registra di nuovo
- E entra in modalità modifica del testo del piano; F12 ri-avvia la registrazione.
- vocalPlanningMode=false ripristina l'esecuzione diretta (autonomia piena).
- Nuova chiave config vocalPlanningMode (bool).
- README aggiornato.
2026-08-11 00:08:09 +02:00
Matteo Benedetto d357bc58f5 feat: combina il testo del campo editor con la trascrizione audio (F12)
Quando l'utente scrive testo nel campo input prima di avviare la registrazione,
il flusso /agy:record ora legge il testo via ctx.ui.getEditorText() e lo include
nel prompt di interpretazione inviato a Gemini, insieme alla trascrizione audio.
Il testo viene svuotato dopo (setEditorText('')) per evitare reinvii duplicati.
Nessun testo nel campo = comportamento invariato.
2026-08-10 16:27:40 +02:00
Matteo Benedetto 2cf9079ac8 feat(Fase2): euristica webSearch=auto rifinita — filtri, trigger e anti-ridondanza
- webSearch=auto: euristica robusta con filtri negativi (immagini, analisi
  locale, task di codice, comandi) e trigger positivi (recency, versioni,
  confronti, definizioni, news).
- webSearch non si attiva per mode image/analyze.
- Cache anti-ridondanza: evita ricerche ripetute dello stesso topic entro 60s.
- Test: 10/10 casi passano.
2026-08-10 15:31:19 +02:00
Matteo Benedetto 854b3d8a47 feat(Fase2): context injection pi→agy — environment, session_state, durable_memory, web_context
Best practice context engineering (Lost in the Middle, TACL 2024; tag XML Gemini):
- Tool agy inietta automaticamente un blocco di contesto prima della richiesta
  utente (che resta SEMPRE per ultima, anti lost-in-the-middle).
- <environment_snapshot>: cwd, OS, data/ora, git branch + file modificati.
- <session_state>: ultimi messaggi utente pi compatti (non il transcript grezzo).
- <durable_memory>: archivio memory.json auto-aggiornato oltre una soglia di turni.
- <web_context>: ricerca web Strada A via Gemini API (googleSearch grounding)
  con webSearch=auto|on.
- Token cap ~1500 (contextTokens), configurabile.
- Nuovi parametri tool agy: injectContext (default true), webSearch (override).
- Nuove chiavi config: contextInject, contextTokens, webSearch.
- README aggiornato.
2026-08-10 15:21:21 +02:00
Matteo Benedetto 28b2cceefa feat: /agy:status — diagnostica estensione in overlay TUI
- Overlay TUI (ctx.ui.custom) che mostra: binario agy + versione, chiave
  Gemini (valida/mancante, mascherata), modello attivo, backend STT,
  notifiche TTS e ultimo errore significativo dal log di agy.
- Parsing log migliorato: filtra il rumore di glog e cattura errori reali
  (permission denied, quota, 404, timeout).
- Chiusura con Enter o Esc. README aggiornato.
2026-08-10 15:01:34 +02:00
Matteo Benedetto f7cc237294 feat: /agy:key — dialog overlay TUI mascherato per la chiave API Gemini
- Comando /agy:key che apre un overlay TUI (ctx.ui.custom overlay) con campo
  mascherato per inserire la chiave API Gemini senza digitarla in chiaro.
- Enter conferma: salva in config.json e ~/.agy-chat/gemini-key + suona chime.
- Esc annulla, Backspace cancella, filtra caratteri consentiti per chiave API.
- Import dinamico dei componenti pi-tui (Container, Text, DynamicBorder) per non
  rompere il load dell'estensione se pi-tui non fosse disponibile.
- Aggiunto tsconfig.json per il typecheck con mapping ai moduli pi.
- README: documentato il nuovo comando.
2026-08-10 14:37:07 +02:00
Matteo Benedetto c7388dc91d feat: timer registrazione, tasto Esc per annullare e nascondi output ffmpeg 2026-08-10 13:25:18 +02:00