feat: Enhance MCP HAL9002 with command tracking and GUI integration
- Added support for command start and end markers in the terminal GUI.
- Implemented command event logging with timestamps and exit codes.
- Introduced manual submission handling for commands in the terminal.
- Enhanced the GUI to manage command execution status and results.
- Added new RPC methods for querying command results and statuses.
- Updated the pyproject.toml to include pycairo as a dependency.
- Created configuration files for VS Code to streamline development.
- Added usage rules for MCP in the GitHub repository.
- When this workspace MCP server `mcpHal9002` is available in the tool runtime, use its tools directly instead of calling the local Python module as a fallback.
- Only fall back to local Python entrypoints when the required MCP capability is not exposed in the current tool runtime.
- If a behavior looks inconsistent with the current source code after changes, suspect a stale VS Code MCP process or cached tool schema first.
- In that case, explicitly warn the user that the issue might be caused by VS Code not having restarted or refreshed the MCP server yet.
- Prefer asking the user to run `MCP: List Servers`, restart `mcpHal9002`, or `MCP: Reset Cached Tools` before diagnosing deeper runtime mismatches.
@ -32,18 +32,18 @@ Il progetto evita di dipendere da API non ufficiali di GNOME Terminal. Invece es
Il server MCP lancia automaticamente la GUI se non e gia in esecuzione.
La GUI e considerata una finestra gestita dal server MCP: il flusso previsto e aprirla, portarla in primo piano e chiuderla tramite tool MCP, non tramite una CLI separata.
Il workspace include una configurazione [ .vscode/mcp.json ] che registra `mcp-hal9002` come server MCP `stdio` per GitHub Copilot usando il Python del virtualenv locale e `PYTHONPATH=${workspaceFolder}/src`.
Nel workspace e presente anche [ .vscode/settings.json ] con `chat.mcp.autostart=true`, cosi VS Code puo riavviare automaticamente il server quando la configurazione cambia.
Per usarlo in Copilot:
1. apri questo workspace in VS Code
2. assicurati che `.venv` esista e contenga le dipendenze del progetto
3. apri Chat e conferma la trust prompt del server MCP quando VS Code la mostra
4. se i tool non compaiono subito, esegui `MCP: List Servers` oppure `MCP: Reset Cached Tools`
## Requisiti
Nel sistema devono essere disponibili:
- Python 3.12+
- package Python `pycairo`
- PyGObject (`gi`)
- GTK4
- VTE con binding GI (`Vte 3.91`)
@ -64,7 +78,9 @@ Nel sistema devono essere disponibili:
In questa macchina il runtime necessario risulta disponibile.
## Avvio locale della GUI
## Debug locale della GUI
La GUI continua ad avere un modulo eseguibile per debug e sviluppo, ma il percorso normale e pilotarla dal server MCP con `open_gui()` e chiuderla con `close_gui()`.
```bash
PYTHONPATH=src python3 -m gnome_vte_mcp.gui
@ -92,13 +108,37 @@ La variabile legacy `GNOME_VTE_MCP_SOCKET` resta accettata per compatibilita.
- `open_gui()` avvia la GUI se manca e porta in primo piano la finestra condivisa
- `gui_status()` restituisce lo stato senza creare nuove istanze
- `close_gui()` chiude la finestra condivisa se e in esecuzione
- tutti gli altri tool che richiedono la GUI continuano a riusare la stessa istanza attraverso il socket locale
Per la lettura testuale dei comandi:
- `read_tab(...)` restituisce lo scrollback recente, utile per debugging grezzo
- `exec_command(...)` scrive il testo nel terminale, poi resta bloccato indefinitamente finche l'utente non preme `Enter` manualmente nella GUI; il parametro `newline` resta ignorato per compatibilita
- dopo eventuali modifiche manuali nella GUI, premi `Enter` tu per sbloccare davvero `exec_command(...)` e inviare il comando alla shell
- per comandi che aprono una sessione interattiva delegata come `ssh`, `arca` o una subshell, la tab non viene trattata come bloccata: puoi continuare a scrivere nuovi comandi nella stessa sessione senza aspettare il ritorno della shell locale
- `wait_for_running_command(...)` aspetta il completamento del comando che e gia in esecuzione nella tab quando il terminale e occupato e non puoi ancora inviare un nuovo comando
- se la tab e dentro una sessione interattiva delegata, `wait_for_running_command(...)` fallisce esplicitamente perche il completamento tracciato tornera disponibile solo quando esci da quella sessione
- `wait_for_command_result(...)` aspetta in modo bloccante il completamento del comando dopo l'`after_sequence` restituito da `exec_command(...)` e restituisce `command`, `cwd`, `cwd_after`, `started_at`, `finished_at`, `duration_seconds`, `exit_code` e `text`; se `timeout` e omesso o `<= 0`, l'attesa e indefinita
- `read_last_command_result(tab_id)` restituisce l'ultimo comando completato con gli stessi metadati temporali e di path
Per `capture_screenshot`:
@ -108,7 +148,7 @@ Per `capture_screenshot`:
- `path` permette di scegliere il file PNG di destinazione
- `diagnostic_overlay=True` annota lo screenshot con una griglia e i bounds del target per `window`, `tab` e `tab-container`
Il tool restituisce contenuto MCP di tipo testo + immagine, seguendo lo stesso approccio di `local-image-mcp`, quindi l'agente puo ispezionare direttamente lo screenshot senza passare da un path locale separato.
Il tool restituisce un payload JSON serializzabile con path, dimensioni e metadati del capture, cosi il bridge MCP non dipende da tipi immagine custom.
Per ogni screenshot viene salvato anche un file JSON sidecar con metadati di debug UI, tra cui:
@ -125,7 +165,7 @@ La prima tab mostra un piccolo pannello di onboarding centrato sopra il terminal
Il pannello sparisce automaticamente:
- alla prima pressione di tasto dentro il terminale
- al primo `exec_command(...)` inviato via MCP
- al primo `exec_command(...)` inviato via MCP oppure al primo comando eseguito manualmente
"Could not find a Python interpreter with GTK/VTE bindings available. Install PyGObject/VTE for a system Python or run the server in an environment where gi and cairo are importable."
f"tab_id={tab_id} is inside an interactive delegated session ({status.get('command')}); tracked command completion is unavailable until that session exits"