Pi Coding Agent non funziona su Windows 11

Provando ad eseguire “Pi Coding Agent” su Windows 11 mi usciva questo errore:

pi exiting due to uncaughtException:
TypeError: zlib.createZstdDecompress is not a function
    at Object.onResponseStart (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:268:70392)
    at Request.onResponseStart (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:141:145989)
    at Parser2.onHeadersComplete (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:152:15221)
    at wasm_on_headers_complete (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:152:6943)
    at wasm://wasm/00034eea:wasm-function[10]:0x571
    at wasm://wasm/00034eea:wasm-function[20]:0x845f
    at Parser2.execute (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:152:9713)
    at Parser2.readMore (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:152:9059)
    at TLSSocket.onHttpSocketReadable (file:///C:/Users/andrea.orlando/AppData/Roaming/npm/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:152:19492)
    at TLSSocket.emit (node:events:518:28)
Error: exit status 1

Ho provato a sistemare con questo comando:

npm install -g @earendil-works/pi-coding-agent@latest

Che auspicabilmente doveva aggiornare l’installazione di Pi Coding Agent, ma per tutta risposta ricevevo:

npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE   package: '@earendil-works/pi-coding-agent@0.84.4',
npm warn EBADENGINE   required: { node: '>=22.19.0' },
npm warn EBADENGINE   current: { node: 'v22.14.0', npm: '11.12.1' }
npm warn EBADENGINE }
npm warn deprecated node-domexception@1.0.0: Use your platform's native DOMException instead

changed 136 packages in 11s

15 packages are looking for funding
  run `npm fund` for details

Ho quindi cercato di capire come NodeJs fosse stato installato con:

Get-Command node | Select-Object -ExpandProperty Source

E la risposta è stata: C:\Program Files\nodejs\node.exe

Da qui ho tentato l’aggiornamento tramite winget upgrade OpenJS.NodeJS ma, ancora, ottenevo un altro errore:

Prima di usare l'origine `msstore`, è necessario visualizzare i contratti seguenti.
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
L'origine richiede che l'area geografica di 2 lettere del computer corrente venga inviata al servizio back-end per funzionare correttamente ,ad esempio "STATI Uniti".

Accetti tutte le condizioni dei contratti di origine?
[Y] Sì  [N] No:
[Y] Sì  [N] No: y
Non è stato trovato alcun pacchetto installato corrispondente ai criteri di input.

Per sistemare anche questo ho usato: winget upgrade --query Node.js e finalmente è partito “pi” usando il comando ollama launch pi.

Pi Coding Agent su Windows 11

Tentando di eseguirlo su Windows 11 in una PowerShell mi è uscito questo messaggio di errore:

pi : Impossibile caricare il file C:\Users\Utente\AppData\Roaming\npm\pi.ps1. L'esecuzione di script è disabilitata nel sistema in uso. Per ulteriori informazioni, vedere about_Execution_Policies
all'indirizzo https://go.microsoft.com/fwlink/?LinkID=135170.
In riga:1 car:1
+ pi
+ ~~
    + CategoryInfo          : Errore di protezione: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Per risolvere il problema ho usato questo comando:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Dopodiché, usando il comando pi è partito come previsto.

Eseguire un bat che si “auto-invoca” per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.

Il comando di esempio che propongo come soluzione è questo:
powershell -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin" -Command "$p = Start-Process cmd.exe -ArgumentList '/c', 'C:\percorso\raggiungibile\da\admin\script.bat', '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3' -Verb RunAs -Wait -PassThru; exit $p.ExitCode"

Leggi tutto: Eseguire un bat che si “auto-invoca” per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.

Scenario: ho un file bat che deve eseguire delle operazioni con privilegi elevati (nel mio caso specifico, giusto per dare un esempio: registrare una DLL che rappresenta un Add-in del CAD SolidWorks) e – se non trovati – auto-invocarsi dopo aver chiesto le credenziali di amministratore, attendere che la “propria copia” eseguita nel “cmd.exe” appositamente creato faccia il suo lavoro e termini con un codice di uscita, il quale, deve poi essere catturato dal processo iniziale e gestito.

Lo so, scritta così, è un po’ “arzigogolata” la cosa; una AI la scriverebbe così:

Ho un file batch che deve eseguire operazioni con privilegi elevati (ad esempio, registrare una DLL che funge da add‑in per SolidWorks). Se la DLL non è presente, il batch deve:

  1. Richiedere le credenziali di amministratore.
  2. Ri‑eseguire se stesso in una nuova istanza di cmd.exe con i privilegi ottenuti.
  3. Attendere che la copia “eseguita” completi il lavoro e termini con un codice di uscita.
  4. Catturare quel codice di uscita nella sessione originale e gestirlo di conseguenza.

Forse sono io che ho posto male la domanda all’AI quando gli ho chiesto di realizzare la cosa ma, avendo tribolato molto per ottenere un risultato funzionante, magari l’esempio sopra può servire a qualche disperato come me.

Per quanto riguarda il comando di esempio, espongo la relativa descrizione (sempre fatta da AI):

Spiegazione dettagliata del comando

powershell `
  -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin" `
  -Command "$p = Start-Process cmd.exe `
              -ArgumentList '/c', `
                           'C:\percorso\raggiungibile\da\admin\script.bat', `
                           '/comando1', `
                           '\"C:\un percorso con spazi\giusto\di\esempio\"', `
                           'PARAMETRO3' `
              -Verb RunAs `
              -Wait `
              -PassThru; `
          exit $p.ExitCode"

1. powershell – avvio di PowerShell

Il comando è eseguito da un prompt di comando (cmd.exe) o da un altro script batch.
powershell lancia una nuova istanza di PowerShell in modalità interattiva (o in modalità script, a seconda del contesto).


2. -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin"

Imposta la cartella di lavoro corrente della sessione PowerShell.
Tutto ciò che viene eseguito all’interno di PowerShell (ad esempio i file batch o i comandi) verrà cercato in questa directory se non viene specificato un percorso assoluto.


3. -Command "<script>"

Il parametro -Command indica a PowerShell di eseguire immediatamente la stringa di script che segue.
La stringa è racchiusa tra virgolette doppie ("), quindi è interpretata come un unico argomento per PowerShell.


4. $p = Start-Process cmd.exe ...

a. $p =

La variabile $p conterrà l’oggetto Process restituito da Start-Process.
Questo oggetto fornisce, tra le altre cose, la proprietà ExitCode che verrà usata alla fine.

b. Start-Process cmd.exe

Avvia un nuovo processo cmd.exe.
Questo è il motivo per cui il comando è avvolto in PowerShell: Start-Process è un cmdlet nativo di PowerShell, non di cmd.exe.

c. -ArgumentList '/c', 'C:\percorso\raggiungibile\da\admin\script.bat', '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3'

-ArgumentList specifica gli argomenti che verranno passati a cmd.exe.

  • '/c' dice a cmd.exe di eseguire il comando che segue e poi chiudersi.
  • 'C:\percorso\raggiungibile\da\admin\script.bat' è il file batch da eseguire.
  • '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3' sono gli argomenti che il batch riceverà.
  • L’argomento con spazi è racchiuso tra virgolette doppie (\"...\") per garantire che venga passato come un singolo parametro a cmd.exe.
  • Le virgolette doppie sono escape (\") perché la stringa è già racchiusa tra virgolette doppie di PowerShell.

d. -Verb RunAs

Chiede a Windows di eseguire il processo con privilegi elevati (prompt UAC).
Se l’utente non è già amministratore, verrà mostrata la finestra di dialogo “Richiesta di credenziali”.

e. -Wait

Il comando PowerShell attende che il processo cmd.exe termini prima di continuare.
Ciò garantisce che il batch abbia finito di lavorare prima di procedere.

f. -PassThru

Restituisce l’oggetto Process (che viene assegnato a $p).
Se non fosse presente, $p sarebbe null e non si potrebbe leggere ExitCode.


5. exit $p.ExitCode

Dopo che cmd.exe è terminato, PowerShell esce con lo stesso codice di uscita del processo avviato.
Questo è fondamentale se il batch viene chiamato da un altro script o da un sistema di automazione: il valore di ritorno indica se l’operazione è andata a buon fine o se è stato riscontrato un errore.


Riepilogo in un unico flusso

  1. PowerShell viene lanciata con una cartella di lavoro specificata.
  2. All’interno di PowerShell, si avvia cmd.exe con:
    • cmd.exe /c script.bat … (il batch e i suoi argomenti)
    • privilegi elevati (RunAs)
    • attesa della terminazione (-Wait)
    • restituzione dell’oggetto processo (-PassThru)
  3. Una volta terminato il batch, PowerShell termina con lo stesso codice di uscita del batch.