@vidiemme/copilot-proxy 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,73 +1,468 @@
1
1
  # @vidiemme/copilot-proxy
2
2
 
3
- Proxy locale che misura il consumo di token di GitHub Copilot e lo attribuisce
4
- al progetto su cui si sta lavorando.
3
+ [![npm](https://img.shields.io/npm/v/@vidiemme/copilot-proxy)](https://www.npmjs.com/package/@vidiemme/copilot-proxy)
4
+ [![Node.js](https://img.shields.io/node/v/@vidiemme/copilot-proxy)](https://nodejs.org/)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-black)](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/LICENSE)
5
6
 
6
- Le statistiche native di Copilot sono per persona. Questo strumento risponde a
7
- un'altra domanda: **quanto e' costato il progetto X**, sommando il lavoro di
8
- tutte le persone che ci hanno messo mano.
7
+ **Misura i token di GitHub Copilot e attribuiscili al progetto, non solo alla persona.**
8
+
9
+ Un proxy locale per chat e agenti: inoltra le richieste a Copilot, estrae i contatori
10
+ dalle risposte e invia gli eventi a un collector centrale. Il collector applica il
11
+ listino e conserva i dati, permettendo di aggregare il consumo di un progetto tra
12
+ piu' developer.
13
+
14
+ Non e' un'estensione da installare nel marketplace, non fornisce un abbonamento
15
+ Copilot e non calcola prezzi sul client. Serve un **collector compatibile**:
16
+ il pacchetto contiene i default aziendali Vidiemme, ma puo' usare un altro endpoint.
17
+
18
+ ## Indice
19
+
20
+ - [Requisiti e compatibilita'](#requisiti-e-compatibilita)
21
+ - [Installazione rapida](#installazione-rapida)
22
+ - [Come funziona](#come-funziona)
23
+ - [Attribuzione al progetto e al developer](#attribuzione-al-progetto-e-al-developer)
24
+ - [Configurare editor, CLI e harness](#configurare-editor-cli-e-harness)
25
+ - [Comandi e configurazione](#comandi-e-configurazione)
26
+ - [Dati, privacy e limiti](#dati-privacy-e-limiti)
27
+ - [Diagnostica](#diagnostica)
28
+ - [Aggiornamento e rimozione](#aggiornamento-e-rimozione)
29
+ - [Sorgenti e licenza](#sorgenti-e-licenza)
30
+
31
+ ## Requisiti e compatibilita'
32
+
33
+ - **Node.js >= 22.19** (richiesto da Undici 8) e npm.
34
+ - Accesso a GitHub Copilot gia' funzionante nel client utilizzato.
35
+ - URL di ingest e token del collector. Per Vidiemme chiedi il token a chi
36
+ amministra il servizio; non e' il token GitHub o Copilot.
37
+ - Per il rilevamento automatico, il proxy deve poter leggere i repository locali
38
+ e i loro metadati Git sulla macchina che contiene i path nelle richieste.
39
+
40
+ | Ambiente | Supporto |
41
+ | --- | --- |
42
+ | VS Code, Insiders, VSCodium, Cursor, Windsurf, Antigravity | Configurazione automatica delle impostazioni utente per l'estensione GitHub Copilot, dove presente. Non misura gli altri provider AI dell'editor. |
43
+ | CLI e harness con base URL o header configurabili | Integrazione manuale; il protocollo e l'autenticazione devono essere compatibili con l'upstream. |
44
+ | Proxy intermedi verso Copilot | Supportati se permettono di cambiare l'URL del provider Copilot. |
45
+ | JetBrains / Android Studio, Eclipse, Xcode, Visual Studio | Non supportati: nessuna intercettazione TLS / `CONNECT` implementata. |
46
+ | macOS | Avvio automatico tramite LaunchAgent `launchd` dell'utente. |
47
+ | Linux | Avvio automatico tramite servizio utente `systemd`. |
48
+ | Windows | Percorsi e impostazioni editor previsti; `--autostart` non implementato. Rilevamento dei path coperto dai test, da verificare su una postazione reale. |
49
+
50
+ > Le impostazioni di override di Copilot sono opzioni di **debug non supportate**:
51
+ > possono cambiare con gli aggiornamenti dell'estensione. Verifica periodicamente
52
+ > il traffico con `status` e `doctor`. Non vengono misurate le code completions
53
+ > instradate su endpoint diversi da quello di chat.
54
+
55
+ ## Installazione rapida
56
+
57
+ ### Servizio persistente (consigliato su macOS e Linux)
58
+
59
+ ```bash
60
+ npm install -g @vidiemme/copilot-proxy@latest
61
+ copilot-proxy setup --vscode --autostart
62
+ ```
63
+
64
+ Il setup:
65
+
66
+ 1. chiede il **token di raccolta** senza mostrarlo nel terminale;
67
+ 2. propone la porta locale `8787` e controlla che sia disponibile;
68
+ 3. propone nome ed email da `git config`, per riconoscersi nella dashboard;
69
+ 4. salva la configurazione e aggiorna gli editor installati con `--vscode`;
70
+ 5. registra e avvia il servizio dell'utente con `--autostart`.
71
+
72
+ **Riavvia gli editor** dopo il setup. Poi invia una richiesta a Copilot Chat e verifica:
73
+
74
+ ```bash
75
+ copilot-proxy status
76
+ copilot-proxy doctor
77
+ ```
78
+
79
+ Per non inviare nome ed email aggiungi `--anonymous` al setup. Questo mantiene
80
+ lo pseudonimo tecnico: non rende anonimo l'intero evento.
81
+
82
+ L'installazione globale mantiene stabile il percorso del servizio. Il setup con
83
+ `npx --autostart` e' possibile, ma il servizio punterebbe alla cache npm:
84
+ svuotarla potrebbe impedirne il riavvio. Anche eliminare una versione Node
85
+ gestita da nvm, fnm, mise o simili richiede di registrare nuovamente il servizio.
86
+
87
+ ### Senza installazione globale o senza avvio automatico
88
+
89
+ ```bash
90
+ npx @vidiemme/copilot-proxy@latest setup --vscode
91
+ npx @vidiemme/copilot-proxy@latest start
92
+ ```
93
+
94
+ `start` resta in primo piano: lascia il terminale aperto e usa `Ctrl+C` per fermarlo.
95
+ Con questa modalita' il proxy va avviato prima di usare gli editor configurati.
96
+ Su Windows usa questa modalita' o configura autonomamente l'avvio del processo.
97
+
98
+ ### Un collector diverso da quello aziendale
99
+
100
+ ```bash
101
+ copilot-proxy setup --vscode --autostart \
102
+ --collector-url https://collector.example.com/v1/usage \
103
+ --workspace-roots /percorso/ai/repository
104
+ ```
105
+
106
+ Il collector deve implementare il contratto pubblico
107
+ [`@vidiemme/copilot-usage-contract`](https://www.npmjs.com/package/@vidiemme/copilot-usage-contract).
108
+ Non e' incluso in questo pacchetto. Il default Vidiemme e'
109
+ `https://copilot-collector.swarm.vidiemme.it/v1/usage`; la ricerca dei repository
110
+ e' limitata per default alla home dell'utente.
111
+
112
+ Per un rollout non interattivo fornisci `COLLECTOR_TOKEN` tramite l'ambiente di
113
+ esecuzione o un secret manager. **Non esiste un'opzione `--token`**: evita di
114
+ incollare segreti nei comandi, nella cronologia della shell o nei file versionati.
9
115
 
10
116
  ## Come funziona
11
117
 
12
- VS Code parla con il proxy invece che direttamente con Copilot. Il proxy inoltra
13
- la richiesta cosi' com'e', legge dalla risposta i contatori di token e li manda
14
- a un servizio di raccolta aziendale, che applica il listino e li salva.
118
+ ![Architettura: editor e CLI usano il proxy locale per raggiungere Copilot; al collector arrivano eventi di consumo separati dal traffico delle conversazioni.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/architecture.png)
119
+
120
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/architecture.html)
121
+
122
+ 1. L'editor o il CLI invia la richiesta al proxy, in ascolto su `127.0.0.1:8787`.
123
+ 2. Il proxy determina progetto e developer e inoltra la richiesta all'upstream,
124
+ per default `https://api.githubcopilot.com`.
125
+ 3. La risposta viene inoltrata al client mentre un parser estrae l'usage.
126
+ 4. I contatori normalizzati vengono accodati e inviati al collector in batch.
127
+ Il collector, non il proxy, applica prezzi, deduplicazione e persistenza.
128
+
129
+ Il token Copilot e la conversazione vanno all'upstream, **non al collector**.
130
+ Il proxy non effettua login o rinnovo delle credenziali Copilot: se ne occupa
131
+ il client o il proxy intermedio gia' utilizzato.
132
+
133
+ ### Protocolli e contatori
134
+
135
+ | Formato di risposta | Origine dei contatori |
136
+ | --- | --- |
137
+ | Anthropic Messages | `message_start` e `message_delta`, inclusi cache read e cache write. |
138
+ | OpenAI / Copilot Chat Completions | Oggetto `usage` nella risposta JSON o nel chunk finale dello stream. |
139
+ | OpenAI Responses API | `response.usage`, anche negli eventi `response.completed`, `response.incomplete` e `response.failed`. |
140
+
141
+ Per le richieste streaming a `/chat/completions`, il proxy aggiunge
142
+ `stream_options: { "include_usage": true }` **solo se `stream_options` e' assente**.
143
+ Se il client lo specifica gia', deve richiedere l'usage correttamente.
144
+ La Responses API non riceve questo parametro.
15
145
 
16
- Il progetto viene riconosciuto dal repository git su cui si sta lavorando: nessun
17
- profilo da cambiare quando si passa da un progetto all'altro.
146
+ Ogni evento distingue `inputTokens`, `cachedInputTokens`, `cacheWriteTokens` e
147
+ `outputTokens`, evitando doppi conteggi quando i dettagli del provider lo permettono.
148
+ Le risposte senza contatori, per esempio le chiamate a `/models`, non generano eventi.
149
+ Se uno stream si interrompe vengono registrati i contatori disponibili: il risultato
150
+ puo' essere parziale.
18
151
 
19
- Non vengono mai salvati prompt ne' risposte: solo contatori. L'identita' della
20
- persona e' uno pseudonimo, cioe' un hash con salt non invertibile; il setup
21
- propone di affiancargli il nome di `git config`, per riconoscersi nella dashboard
22
- (`--anonymous` per non farlo).
152
+ ## Attribuzione al progetto e al developer
23
153
 
24
- ## Uso
154
+ ![Attribuzione del progetto: prima i segnali espliciti, poi i path dei repository locali, poi il progetto della sessione e infine unassigned.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/attribution.png)
155
+
156
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/attribution.html)
157
+
158
+ Il progetto viene risolto con questa precedenza:
159
+
160
+ | Priorita' | Segnale | `projectSource` |
161
+ | --- | --- | --- |
162
+ | 1 | Prefisso URL `/p/<progetto>` | `path` |
163
+ | 2 | Header `X-Project-Id` (nome personalizzabile) | `header` |
164
+ | 3 | Username di `Proxy-Authorization: Basic ...`, se inviato dal client | `proxy-auth` |
165
+ | 4 | Mappa statica `ATTRIBUTION_TOKENS` | `token` |
166
+ | 5 | Path locali citati nella richiesta, dentro `WORKSPACE_ROOTS` | `workspace` |
167
+ | 6 | Ultimo progetto rilevato per la stessa sessione, entro il TTL | `session` |
168
+ | 7 | `UNASSIGNED_PROJECT`, per default `unassigned` | `fallback` |
169
+
170
+ Il rilevamento risale dai path al marker piu' vicino (`.git`, `.hg` o `.svn`).
171
+ Tra piu' progetti prevale quello con piu' path candidati distinti.
172
+ Per Git l'identita' deriva dal remote `origin`, poi `upstream`, poi dal primo
173
+ disponibile, non dal nome scelto per la cartella di clone:
174
+
175
+ | Remote | ID progetto |
176
+ | --- | --- |
177
+ | `git@github.com:acme/portal.git` | `acme/portal` |
178
+ | `https://gitlab.com/acme/web/portal.git` | `acme/web/portal` |
179
+ | Nessun remote utilizzabile, oppure progetto non Git | Nome normalizzato della cartella |
180
+
181
+ Sono gestiti anche worktree e submodule Git. La cache path/repository dura 10 minuti.
182
+ L'ID derivato dal remote non include l'host: percorsi uguali su host Git diversi
183
+ possono quindi coincidere.
184
+
185
+ Le richieste senza path riutilizzano il progetto dell'ultima rilevazione della
186
+ sessione per **30 minuti**. La sessione usa gli header `vscode-sessionid`,
187
+ `x-vscode-session-id`, `x-session-id`, oppure l'ID estratto da `metadata.user_id`.
188
+ In loro assenza la chiave e' il developer: in quel caso progetti paralleli
189
+ possono condividere il fallback. Il rilevamento ispeziona al massimo i primi
190
+ 4 MiB del corpo della richiesta.
191
+
192
+ Il developer viene risolto da `/u/<developer>`, `X-Developer-Id`, credenziali
193
+ mappate oppure da un hash SHA-256 con salt, troncato a 16 caratteri esadecimali,
194
+ dell'identita' stabile estratta dal token upstream (o del token intero per altri
195
+ formati). Senza un segnale utilizzabile risulta `unknown`.
196
+ Il salt deve rimanere uguale sulle postazioni per mantenere coerenti gli pseudonimi;
197
+ cambiarlo interrompe la continuita' degli ID.
198
+
199
+ ## Configurare editor, CLI e harness
200
+
201
+ ### VS Code e derivati
202
+
203
+ `setup --vscode` imposta queste due chiavi nelle **impostazioni utente**:
204
+
205
+ ```json
206
+ {
207
+ "github.copilot.advanced.debug.overrideCapiUrl": "http://127.0.0.1:8787",
208
+ "github.copilot.advanced.debug.overrideAuthType": "token"
209
+ }
210
+ ```
211
+
212
+ `"token"` e' una modalita' di autenticazione, non un segreto da sostituire.
213
+ Non serve un'impostazione per repository. Non impostare `overrideProxyUrl`:
214
+ riguarda un altro endpoint, quello delle code completions.
215
+
216
+ Il setup salva un backup con suffisso `.bak` prima di modificare un file esistente.
217
+ Se il file contiene commenti, virgole finali o non e' JSON valido, non lo riscrive
218
+ e stampa lo snippet da inserire manualmente. Poi riavvia l'editor.
219
+
220
+ ### CLI: attribuzione esplicita
221
+
222
+ Per un client compatibile con l'upstream e con base URL configurabile:
223
+
224
+ ```text
225
+ http://127.0.0.1:8787/p/acme-portal
226
+ http://127.0.0.1:8787/u/developer-id/p/acme-portal
227
+ ```
228
+
229
+ Il client aggiunge il path API, per esempio `/chat/completions` o `/v1/messages`.
230
+ I prefissi `/u/` e `/p/` sono opzionali, accettati in qualsiasi ordine e rimossi
231
+ prima dell'inoltro. Gli ID espliciti accettano fino a 64 caratteri:
232
+ lettere, numeri, punti, trattini e underscore, con primo carattere alfanumerico.
233
+ Per un ID che rappresenta un remote con sottogruppi usa uno slug come `acme-portal`,
234
+ non slash aggiuntivi nel prefisso.
235
+
236
+ In alternativa invia gli header `X-Project-Id` e, se serve, `X-Developer-Id`.
237
+ Gli header di attribuzione e `Proxy-Authorization` non vengono inoltrati all'upstream.
238
+ Il supporto al formato Anthropic **non** traduce automaticamente i protocolli:
239
+ un client Anthropic richiede un upstream che esponga Messages, o un traduttore.
240
+
241
+ ### Harness con proxy intermedio
242
+
243
+ Se usi Claude Code, Codex o altri harness tramite un traduttore/provider Copilot,
244
+ la disposizione consigliata e':
245
+
246
+ ```text
247
+ harness -> proxy intermedio -> copilot-proxy -> api.githubcopilot.com
248
+ ```
249
+
250
+ Nel proxy intermedio cambia l'URL del provider Copilot in `http://127.0.0.1:8787`.
251
+ Lascia `UPSTREAM_BASE_URL` del proxy di misura al suo default Copilot.
252
+ Il proxy intermedio continua a gestire login, rinnovo token e traduzione;
253
+ deve conservare path di contesto o segnali espliciti per attribuire il progetto.
254
+ Questa disposizione permette alla stessa istanza di misurare anche VS Code.
255
+
256
+ `copilot-proxy` e' un **reverse proxy HTTP**, non un forward proxy generico:
257
+ impostare soltanto `HTTP_PROXY` / `HTTPS_PROXY` non garantisce il funzionamento.
258
+
259
+ ## Comandi e configurazione
260
+
261
+ Gli esempi usano il comando globale; in alternativa sostituisci `copilot-proxy`
262
+ con `npx @vidiemme/copilot-proxy@latest`.
263
+
264
+ | Comando | Funzione |
265
+ | --- | --- |
266
+ | `setup` | Crea la configurazione della postazione. |
267
+ | `start` | Avvia il proxy in primo piano (comando predefinito se non ne indichi uno). |
268
+ | `status` | Mostra versione installata e in esecuzione, contatori e spool. |
269
+ | `doctor` | Controlla configurazione, cartelle, collector, editor, spool e processo. |
270
+ | `restart` | Riavvia il servizio automatico gia' registrato. |
271
+ | `uninstall` | Rimuove l'avvio automatico; lascia configurazione e impostazioni editor. |
272
+ | `--version` | Mostra la versione del CLI. |
273
+ | `--help` | Mostra comandi e opzioni. |
274
+
275
+ ### Opzioni di setup
276
+
277
+ | Opzione | Uso |
278
+ | --- | --- |
279
+ | `--vscode` | Configura VS Code e derivati installati. |
280
+ | `--autostart` | Registra e avvia il servizio utente su macOS/Linux. |
281
+ | `--port <n>` | Porta locale, default `8787`. |
282
+ | `--workspace-roots <a,b>` | Directory assolute in cui risolvere i progetti. |
283
+ | `--collector-url <url>` | Endpoint di ingest, incluso il path `/v1/usage`. |
284
+ | `--upstream <url>` | Base URL upstream, default `https://api.githubcopilot.com`. |
285
+ | `--name <nome>`, `--email <email>` | Identita' facoltativa per la dashboard. |
286
+ | `--anonymous` | Non invia nome ed email. |
287
+ | `--salt <valore>` | Sovrascrive il salt aziendale; mantienilo coerente nel team. |
288
+ | `--force` | Ripete il setup partendo dal file esistente, token compreso. |
289
+
290
+ Per cambiare porta senza reinserire il token:
25
291
 
26
292
  ```bash
27
- # una volta sola, e poi basta
28
- npx @vidiemme/copilot-proxy@latest setup --vscode --autostart
293
+ copilot-proxy setup --force --port 9000 --vscode --autostart
294
+ ```
295
+
296
+ ### File e variabili d'ambiente
297
+
298
+ Il file `config.json` usa le stesse chiavi delle variabili d'ambiente.
299
+ La precedenza di **`start`** e': opzioni CLI > ambiente non vuoto > file > default
300
+ del pacchetto. `start` accetta `--port`, `--log-level`, `--collector-url` e
301
+ `--workspace-roots`. Il setup salva le proprie opzioni: non e' un import
302
+ generico di tutte le variabili d'ambiente nel file.
303
+
304
+ | Chiave | Default / significato |
305
+ | --- | --- |
306
+ | `COLLECTOR_TOKEN` | Obbligatorio; token di ingest, salvato dal setup. |
307
+ | `COLLECTOR_URL` | Endpoint Vidiemme indicato sopra; HTTPS obbligatorio fuori da localhost. |
308
+ | `HOST`, `PORT` | `127.0.0.1`, `8787`. Mantieni il bind locale. |
309
+ | `UPSTREAM_BASE_URL` | `https://api.githubcopilot.com`. |
310
+ | `UPSTREAM_AUTH_TOKEN` | Assente; se impostato sostituisce il token inoltrato all'upstream. |
311
+ | `WORKSPACE_ROOTS` | Home utente; lista di directory separate da virgole. |
312
+ | `PROJECT_MARKERS` | `.git,.hg,.svn`. |
313
+ | `PROJECT_HEADER`, `UNASSIGNED_PROJECT` | `x-project-id`, `unassigned`. |
314
+ | `PROJECT_STICKY_TTL_MS` | `1800000` (30 minuti). |
315
+ | `DEVELOPER_ID_SALT` | Salt aziendale incluso nel pacchetto; non e' una credenziale segreta. |
316
+ | `DEVELOPER_NAME`, `DEVELOPER_EMAIL` | Facoltativi; il nome abilita l'invio dell'identita' al collector. |
317
+ | `ATTRIBUTION_TOKENS` | `{}`; oggetto JSON token -> `{ "projectId": "...", "developerId": "..." }`. Contiene credenziali: non versionarlo. |
318
+ | `FLUSH_INTERVAL_MS`, `FLUSH_MAX_BATCH` | `5000`, `100` (massimo 500 eventi per batch). |
319
+ | `COLLECTOR_TIMEOUT_MS` | `10000`. |
320
+ | `SPOOL_PATH` | `spool.jsonl` nella directory di configurazione. |
321
+ | `LOG_LEVEL` | `info`. |
322
+ | `TLS_KEY_PATH`, `TLS_CERT_PATH` | Assenti; impostali entrambi per abilitare HTTPS in ingresso. |
323
+
324
+ La directory di configurazione e':
325
+
326
+ - macOS/Linux: `~/.config/copilot-proxy`, oppure `$XDG_CONFIG_HOME/copilot-proxy`;
327
+ - Windows: `%APPDATA%/copilot-proxy`, quando `APPDATA` e' definita;
328
+ - tutte le piattaforme: `COPILOT_PROXY_HOME`, se impostata nell'ambiente,
329
+ sostituisce l'intera directory.
29
330
 
30
- # se qualcosa non torna
31
- npx @vidiemme/copilot-proxy@latest doctor
331
+ Il setup crea la directory con permessi `0700` e il file con `0600` su sistemi POSIX.
332
+ Non condividere il file: contiene il token di raccolta.
333
+ Il servizio automatico legge il file, non eredita in generale l'ambiente della shell;
334
+ `COPILOT_PROXY_HOME` viene invece riportata nella definizione del servizio.
335
+ Per impostazioni persistenti del servizio usa il file di configurazione.
32
336
 
33
- # versione, eventi misurati e consegnati, spool in attesa
34
- npx @vidiemme/copilot-proxy@latest status
337
+ ## Dati, privacy e limiti
338
+
339
+ **Non vengono persistiti prompt o risposte dal proxy.** Il corpo viene comunque
340
+ letto in memoria per inoltro, ispezione e attribuzione. Al collector arrivano:
341
+
342
+ - ID richiesta e timestamp, progetto e fonte dell'attribuzione;
343
+ - identita' del repository rilevato: host, gruppi, nome e URL del remote;
344
+ - pseudonimo/ID developer e sua fonte, user agent e ID sessione se disponibile;
345
+ - endpoint, modello, contatori di token, durata e indicazione streaming;
346
+ - nome ed email facoltativi, negli header di invio, salvo `--anonymous`.
347
+
348
+ Non vengono inviati al collector il token Copilot, i path di lavoro rilevati o il
349
+ contenuto della conversazione. Gli URL dei remote sono invece metadati inviati:
350
+ non inserirvi credenziali. Il collector ha una propria gestione dei dati e della
351
+ conservazione. Lo pseudonimo e' un identificatore tecnico, **non una garanzia
352
+ di anonimato**; il salt distribuito nel pacchetto e' pubblico.
353
+
354
+ Il token di ingest e' condiviso nell'organizzazione: chi lo possiede puo'
355
+ dichiarare progetto e developer. E' uno strumento di contabilita' analitica
356
+ interna, non un sistema di attribuzione non ripudiabile o una fattura ufficiale.
357
+
358
+ ### Collector non disponibile
359
+
360
+ La disponibilita' del collector non blocca le richieste Copilot. Errori di rete,
361
+ timeout, errori server e HTTP `401`, `403`, `408`, `429` fanno conservare gli eventi
362
+ in uno spool JSONL locale, ritentato ai flush successivi e al riavvio.
363
+ La deduplicazione richiede il collector compatibile e usa `requestId`.
364
+
365
+ La consegna e' **best effort, non senza perdite**:
366
+
367
+ - coda in memoria fino a 10.000 eventi; quelli nuovi in eccesso sono scartati;
368
+ - spool fino a 50.000 eventi, conservando i piu' recenti;
369
+ - gli altri errori HTTP 4xx sono definitivi e causano lo scarto del batch;
370
+ - gli eventi rifiutati singolarmente dal collector vengono segnalati nei log;
371
+ - un arresto improvviso puo' perdere gli eventi ancora soltanto in memoria.
372
+
373
+ Tieni sotto controllo spool, errori e contatore `dropped`. Il proxy non ha
374
+ autenticazione locale propria: non esporre `HOST=0.0.0.0` senza protezioni adeguate.
375
+ Se il traffico attraversa la rete, proteggi anche l'ingresso con TLS e controlli
376
+ di accesso; non disabilitare la verifica dei certificati.
377
+
378
+ ## Diagnostica
379
+
380
+ ```bash
381
+ copilot-proxy --version
382
+ copilot-proxy status
383
+ copilot-proxy doctor
384
+ curl http://127.0.0.1:8787/_health
35
385
  ```
36
386
 
37
- Con l'avvio automatico, dopo un aggiornamento (`npm i -g @vidiemme/copilot-proxy@latest`)
38
- serve `copilot-proxy restart`; per toglierlo, `copilot-proxy uninstall`.
387
+ `/_health` restituisce versione, avvio, URL upstream/collector, stato del rilevamento,
388
+ statistiche `usage` e `spoolBytes`. I contatori sono **del processo corrente**,
389
+ non uno storico completo; `ok: true` non dimostra che il collector sia raggiungibile.
39
390
 
40
- Non c'e' nulla da configurare a mano: endpoint di raccolta, salt e cartelle dove
41
- cercare i progetti sono gia' nel pacchetto. L'unica cosa da procurarsi e' il
42
- token di raccolta, che il comando chiede in modo nascosto.
391
+ `doctor` esce con codice non zero in presenza di `FAIL`. Un `WARN` da solo non
392
+ fa fallire il comando: versione del processo diversa dal CLI, editor non tutti
393
+ configurati o assenza prolungata di traffico richiedono comunque attenzione.
394
+ Il controllo degli editor resta attivo anche se usi esclusivamente CLI:
395
+ in quel caso un `FAIL` sugli editor non dimostra un errore dell'inoltro CLI.
43
396
 
44
- `--vscode` scrive le impostazioni utente di VS Code e dei derivati installati
45
- (Insiders, VSCodium, Cursor, Windsurf, Antigravity), `--autostart` registra il
46
- proxy fra i servizi dell'utente: parte subito e a ogni accesso, senza che nessuno
47
- debba ricordarsi di lanciarlo. Con entrambe, dopo questo comando non c'e' piu'
48
- nulla da fare. Il comando stampa come disattivarlo.
397
+ | Sintomo | Verifica / azione |
398
+ | --- | --- |
399
+ | Copilot non risponde dopo il setup | Verifica che il proxy sia avviato; se devi tornare al collegamento diretto rimuovi le due chiavi di override e riavvia l'editor. |
400
+ | Porta occupata | Ripeti il setup con `--force --port 9000 --vscode` e, se usato, `--autostart`. |
401
+ | Nessun evento misurato | Riavvia l'editor, controlla gli override e il protocollo di usage; le risposte senza contatori non sono misurabili. |
402
+ | Progetti `unassigned` | Controlla `WORKSPACE_ROOTS`, path visibili sulla macchina del proxy e marker; per i CLI usa un prefisso o un header esplicito. |
403
+ | Spool in crescita / collector `unreachable` | Controlla rete, URL del collector e log. |
404
+ | Collector `401` / `403` | Token ruotato: vedi [Cambiare il token](#cambiare-il-token). Gli eventi restano in attesa entro i limiti dello spool. |
405
+ | Processo con versione precedente | Dopo l'aggiornamento del pacchetto esegui `restart`. |
406
+ | Servizio non riparte dopo pulizia cache o cambio Node | Reinstalla globalmente e ripeti `setup --force --autostart`. |
49
407
 
50
- Il setup chiede la porta locale (default 8787) e controlla che sia libera. Per
51
- cambiarla dopo: `setup --force --port 9000 --vscode --autostart`, senza
52
- reinserire il token.
408
+ Su macOS il servizio scrive stdout e stderr in `proxy.log` nella directory
409
+ di configurazione. Su Linux usa `journalctl --user -u copilot-proxy.service`.
410
+ In primo piano i log sono nel terminale.
53
411
 
54
- JetBrains, Eclipse, Xcode e Visual Studio non si possono indirizzare al proxy:
55
- il loro consumo non viene misurato.
412
+ ## Aggiornamento e rimozione
56
413
 
57
- Senza `--autostart` il proxy si avvia a mano:
414
+ ### Aggiornare
58
415
 
59
416
  ```bash
60
- npx @vidiemme/copilot-proxy@latest start
417
+ npm install -g @vidiemme/copilot-proxy@latest
418
+ copilot-proxy restart
419
+ copilot-proxy doctor
61
420
  ```
62
421
 
63
- Il token di raccolta non si passa come opzione: finirebbe nella cronologia della
64
- shell e nella lista dei processi. Lo chiede il comando in modo nascosto, oppure
65
- si mette nella variabile `COLLECTOR_TOKEN`.
422
+ `restart` richiede un servizio gia' installato. Se usi `start` in primo piano,
423
+ ferma e rilancia il processo. Se passi da `npx` all'installazione globale,
424
+ o cambia il percorso di Node, registra nuovamente il servizio:
425
+
426
+ ```bash
427
+ copilot-proxy setup --force --vscode --autostart
428
+ ```
429
+
430
+ ### Cambiare il token
431
+
432
+ `setup --force` riusa il token gia' salvato e non lo richiede. Per sostituirlo,
433
+ impostalo nell'ambiente senza scriverlo nella cronologia della shell:
434
+
435
+ ```bash
436
+ read -rs COLLECTOR_TOKEN && export COLLECTOR_TOKEN
437
+ copilot-proxy setup --force --vscode --autostart
438
+ unset COLLECTOR_TOKEN
439
+ ```
440
+
441
+ Senza avvio automatico, ometti `--autostart` e riavvia il processo `start`.
442
+
443
+ ### Disattivare e rimuovere
444
+
445
+ 1. Rimuovi dalle impostazioni utente degli editor
446
+ `github.copilot.advanced.debug.overrideCapiUrl` e
447
+ `github.copilot.advanced.debug.overrideAuthType`, poi riavvia gli editor.
448
+ 2. Rimuovi anche le base URL e gli header del proxy configurati nei CLI/harness.
449
+ 3. Esegui `copilot-proxy uninstall` per rimuovere il servizio automatico,
450
+ oppure ferma con `Ctrl+C` il processo avviato a mano.
451
+ 4. Se installato globalmente: `npm uninstall -g @vidiemme/copilot-proxy`.
452
+
453
+ `uninstall` **non** elimina configurazione, token, log o spool e non ripristina
454
+ le impostazioni editor. Prima di cancellare manualmente i dati locali verifica
455
+ che gli eventi in attesa siano stati consegnati. Non fermare semplicemente
456
+ il proxy lasciando gli editor configurati: Copilot non raggiungerebbe l'upstream.
66
457
 
67
- La configurazione finisce in `~/.config/copilot-proxy/config.json` con permessi
68
- `0600`.
458
+ ## Sorgenti e licenza
69
459
 
70
- ## Requisiti
460
+ - [Codice sorgente e documentazione del progetto](https://github.com/vidiemme/copilot-usage)
461
+ - [Segnalazioni e richieste](https://github.com/vidiemme/copilot-usage/issues)
462
+ - [Contratto degli eventi](https://github.com/vidiemme/copilot-usage/tree/main/packages/shared)
463
+ - [Licenza MIT](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/LICENSE)
71
464
 
72
- Node.js >= 22.9 e il token di ingest del servizio di raccolta: chiedilo a chi lo
73
- amministra, e' lo stesso per tutta l'organizzazione.
465
+ I diagrammi sono creati con `diagram-design`, con palette ispirata a
466
+ [BIP RED](https://www.bip.red/). PolySans non e' incluso: i sorgenti HTML usano
467
+ Instrument Serif, Geist e Geist Mono come fallback dichiarati; i PNG incorporano
468
+ la resa dei font per essere leggibili anche su npm senza dipendenze esterne.
package/dist/autostart.js CHANGED
@@ -133,7 +133,18 @@ ${envBlock} <key>StandardOutPath</key><string>${escapeXml(log)}</string>
133
133
  catch {
134
134
  /* non era caricato */
135
135
  }
136
- execFileSync('launchctl', ['bootstrap', domain, file], { stdio: 'pipe' });
136
+ // `bootout` e' asincrono: finche' launchd non ha finito, `bootstrap` fallisce con EIO (5).
137
+ for (let attempt = 1;; attempt++) {
138
+ try {
139
+ execFileSync('launchctl', ['bootstrap', domain, file], { stdio: 'pipe' });
140
+ break;
141
+ }
142
+ catch (error) {
143
+ if (attempt >= 10)
144
+ throw error;
145
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 500);
146
+ }
147
+ }
137
148
  return { file, removeHint: `launchctl bootout ${domain}/${LABEL} && rm ${file}` };
138
149
  }
139
150
  function installSystemd(file, entry) {
@@ -1 +1 @@
1
- {"version":3,"file":"autostart.js","sourceRoot":"","sources":["../src/autostart.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autostart.js","sourceRoot":"","sources":["../src/autostart.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vidiemme/copilot-proxy",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "Proxy locale: misura il consumo di token di GitHub Copilot e lo attribuisce al progetto",
6
6
  "license": "MIT",
@@ -26,7 +26,7 @@
26
26
  "access": "public"
27
27
  },
28
28
  "engines": {
29
- "node": ">=22.9"
29
+ "node": ">=22.19"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc -b",
@@ -39,11 +39,11 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@vidiemme/copilot-usage-contract": "^0.1.0",
42
- "fastify": "^5.12.5",
43
- "undici": "^7.30.0"
42
+ "fastify": "^5.12.7",
43
+ "undici": "^8.12.3"
44
44
  },
45
45
  "devDependencies": {
46
- "@types/node": "^22.10.7",
46
+ "@types/node": "^22.20.5",
47
47
  "tsx": "^4.19.2",
48
48
  "typescript": "^7.0.2"
49
49
  }