@vidiemme/copilot-proxy 0.3.0 → 0.3.2
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 +471 -46
- package/dist/agentRuntime.d.ts +43 -0
- package/dist/agentRuntime.js +204 -0
- package/dist/agentRuntime.js.map +1 -0
- package/dist/autostart.js +12 -1
- package/dist/autostart.js.map +1 -1
- package/dist/cli.js +75 -5
- package/dist/cli.js.map +1 -1
- package/dist/collector/forwarder.d.ts +8 -0
- package/dist/collector/forwarder.js +8 -1
- package/dist/collector/forwarder.js.map +1 -1
- package/dist/editors.d.ts +6 -1
- package/dist/editors.js +18 -5
- package/dist/editors.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,73 +1,498 @@
|
|
|
1
1
|
# @vidiemme/copilot-proxy
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@vidiemme/copilot-proxy)
|
|
4
|
+
[](https://nodejs.org/)
|
|
5
|
+
[](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/LICENSE)
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
118
|
+

|
|
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.
|
|
145
|
+
|
|
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.
|
|
151
|
+
|
|
152
|
+
## Attribuzione al progetto e al developer
|
|
153
|
+
|
|
154
|
+

|
|
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
|
+
### Copilot CLI e sessioni agentiche in VS Code
|
|
221
|
+
|
|
222
|
+
Copilot CLI e le sessioni "Copilot CLI" dentro VS Code girano nel runtime
|
|
223
|
+
agentico di Copilot (`copilot-runtime`), un processo separato che **ignora**
|
|
224
|
+
`overrideCapiUrl` e parla direttamente con GitHub. Si indirizza al proxy con la
|
|
225
|
+
variabile d'ambiente `COPILOT_API_URL`, che il runtime eredita dall'editor.
|
|
226
|
+
|
|
227
|
+
`setup --vscode` la imposta a livello di sessione utente, in modo persistente:
|
|
228
|
+
|
|
229
|
+
| Sistema | Dove |
|
|
230
|
+
| --- | --- |
|
|
231
|
+
| macOS | `launchctl setenv` + LaunchAgent `~/Library/LaunchAgents/com.vidiemme.copilot-proxy.env.plist` |
|
|
232
|
+
| Linux | `~/.config/environment.d/copilot-proxy.conf` |
|
|
233
|
+
| Windows | variabile utente (`setx`) |
|
|
234
|
+
|
|
235
|
+
Vale per le applicazioni avviate dopo il setup: **chiudi e riapri VS Code** (non
|
|
236
|
+
basta ricaricare la finestra) e i terminali. `doctor` verifica che sia impostata.
|
|
237
|
+
`uninstall` la rimuove, altrimenti senza proxy il runtime non raggiungerebbe Copilot.
|
|
238
|
+
|
|
239
|
+
### CLI: attribuzione esplicita
|
|
240
|
+
|
|
241
|
+
Per un client compatibile con l'upstream e con base URL configurabile:
|
|
242
|
+
|
|
243
|
+
```text
|
|
244
|
+
http://127.0.0.1:8787/p/acme-portal
|
|
245
|
+
http://127.0.0.1:8787/u/developer-id/p/acme-portal
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Il client aggiunge il path API, per esempio `/chat/completions` o `/v1/messages`.
|
|
249
|
+
I prefissi `/u/` e `/p/` sono opzionali, accettati in qualsiasi ordine e rimossi
|
|
250
|
+
prima dell'inoltro. Gli ID espliciti accettano fino a 64 caratteri:
|
|
251
|
+
lettere, numeri, punti, trattini e underscore, con primo carattere alfanumerico.
|
|
252
|
+
Per un ID che rappresenta un remote con sottogruppi usa uno slug come `acme-portal`,
|
|
253
|
+
non slash aggiuntivi nel prefisso.
|
|
254
|
+
|
|
255
|
+
In alternativa invia gli header `X-Project-Id` e, se serve, `X-Developer-Id`.
|
|
256
|
+
Gli header di attribuzione e `Proxy-Authorization` non vengono inoltrati all'upstream.
|
|
257
|
+
Il supporto al formato Anthropic **non** traduce automaticamente i protocolli:
|
|
258
|
+
un client Anthropic richiede un upstream che esponga Messages, o un traduttore.
|
|
259
|
+
|
|
260
|
+
### Harness con proxy intermedio
|
|
15
261
|
|
|
16
|
-
|
|
17
|
-
|
|
262
|
+
Se usi Claude Code, Codex o altri harness tramite un traduttore/provider Copilot,
|
|
263
|
+
la disposizione consigliata e':
|
|
18
264
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
265
|
+
```text
|
|
266
|
+
harness -> proxy intermedio -> copilot-proxy -> api.githubcopilot.com
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Nel proxy intermedio cambia l'URL del provider Copilot in `http://127.0.0.1:8787`.
|
|
270
|
+
Lascia `UPSTREAM_BASE_URL` del proxy di misura al suo default Copilot.
|
|
271
|
+
Il proxy intermedio continua a gestire login, rinnovo token e traduzione;
|
|
272
|
+
deve conservare path di contesto o segnali espliciti per attribuire il progetto.
|
|
273
|
+
Questa disposizione permette alla stessa istanza di misurare anche VS Code.
|
|
274
|
+
|
|
275
|
+
`copilot-proxy` e' un **reverse proxy HTTP**, non un forward proxy generico:
|
|
276
|
+
impostare soltanto `HTTP_PROXY` / `HTTPS_PROXY` non garantisce il funzionamento.
|
|
277
|
+
|
|
278
|
+
## Comandi e configurazione
|
|
279
|
+
|
|
280
|
+
Gli esempi usano il comando globale; in alternativa sostituisci `copilot-proxy`
|
|
281
|
+
con `npx @vidiemme/copilot-proxy@latest`.
|
|
282
|
+
|
|
283
|
+
| Comando | Funzione |
|
|
284
|
+
| --- | --- |
|
|
285
|
+
| `setup` | Crea la configurazione della postazione. |
|
|
286
|
+
| `start` | Avvia il proxy in primo piano (comando predefinito se non ne indichi uno). |
|
|
287
|
+
| `status` | Mostra versione installata e in esecuzione, instradamento di editor e Copilot CLI, contatori per client e spool. |
|
|
288
|
+
| `doctor` | Controlla configurazione, cartelle, collector, editor (anche override commentati), `COPILOT_API_URL` e runtime da riavviare, spool e processo. |
|
|
289
|
+
| `restart` | Riavvia il servizio automatico gia' registrato. |
|
|
290
|
+
| `uninstall` | Rimuove l'avvio automatico e `COPILOT_API_URL`; lascia configurazione e impostazioni editor. |
|
|
291
|
+
| `--version` | Mostra la versione del CLI. |
|
|
292
|
+
| `--help` | Mostra comandi e opzioni. |
|
|
293
|
+
|
|
294
|
+
### Opzioni di setup
|
|
23
295
|
|
|
24
|
-
|
|
296
|
+
| Opzione | Uso |
|
|
297
|
+
| --- | --- |
|
|
298
|
+
| `--vscode` | Configura VS Code e derivati installati, e `COPILOT_API_URL` per Copilot CLI e sessioni agentiche. |
|
|
299
|
+
| `--autostart` | Registra e avvia il servizio utente su macOS/Linux. |
|
|
300
|
+
| `--port <n>` | Porta locale, default `8787`. |
|
|
301
|
+
| `--workspace-roots <a,b>` | Directory assolute in cui risolvere i progetti. |
|
|
302
|
+
| `--collector-url <url>` | Endpoint di ingest, incluso il path `/v1/usage`. |
|
|
303
|
+
| `--upstream <url>` | Base URL upstream, default `https://api.githubcopilot.com`. |
|
|
304
|
+
| `--name <nome>`, `--email <email>` | Identita' facoltativa per la dashboard. |
|
|
305
|
+
| `--anonymous` | Non invia nome ed email. |
|
|
306
|
+
| `--salt <valore>` | Sovrascrive il salt aziendale; mantienilo coerente nel team. |
|
|
307
|
+
| `--force` | Ripete il setup partendo dal file esistente, token compreso. |
|
|
308
|
+
|
|
309
|
+
Per cambiare porta senza reinserire il token:
|
|
25
310
|
|
|
26
311
|
```bash
|
|
27
|
-
|
|
28
|
-
|
|
312
|
+
copilot-proxy setup --force --port 9000 --vscode --autostart
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### File e variabili d'ambiente
|
|
316
|
+
|
|
317
|
+
Il file `config.json` usa le stesse chiavi delle variabili d'ambiente.
|
|
318
|
+
La precedenza di **`start`** e': opzioni CLI > ambiente non vuoto > file > default
|
|
319
|
+
del pacchetto. `start` accetta `--port`, `--log-level`, `--collector-url` e
|
|
320
|
+
`--workspace-roots`. Il setup salva le proprie opzioni: non e' un import
|
|
321
|
+
generico di tutte le variabili d'ambiente nel file.
|
|
322
|
+
|
|
323
|
+
| Chiave | Default / significato |
|
|
324
|
+
| --- | --- |
|
|
325
|
+
| `COLLECTOR_TOKEN` | Obbligatorio; token di ingest, salvato dal setup. |
|
|
326
|
+
| `COLLECTOR_URL` | Endpoint Vidiemme indicato sopra; HTTPS obbligatorio fuori da localhost. |
|
|
327
|
+
| `HOST`, `PORT` | `127.0.0.1`, `8787`. Mantieni il bind locale. |
|
|
328
|
+
| `UPSTREAM_BASE_URL` | `https://api.githubcopilot.com`. |
|
|
329
|
+
| `UPSTREAM_AUTH_TOKEN` | Assente; se impostato sostituisce il token inoltrato all'upstream. |
|
|
330
|
+
| `WORKSPACE_ROOTS` | Home utente; lista di directory separate da virgole. |
|
|
331
|
+
| `PROJECT_MARKERS` | `.git,.hg,.svn`. |
|
|
332
|
+
| `PROJECT_HEADER`, `UNASSIGNED_PROJECT` | `x-project-id`, `unassigned`. |
|
|
333
|
+
| `PROJECT_STICKY_TTL_MS` | `1800000` (30 minuti). |
|
|
334
|
+
| `DEVELOPER_ID_SALT` | Salt aziendale incluso nel pacchetto; non e' una credenziale segreta. |
|
|
335
|
+
| `DEVELOPER_NAME`, `DEVELOPER_EMAIL` | Facoltativi; il nome abilita l'invio dell'identita' al collector. |
|
|
336
|
+
| `ATTRIBUTION_TOKENS` | `{}`; oggetto JSON token -> `{ "projectId": "...", "developerId": "..." }`. Contiene credenziali: non versionarlo. |
|
|
337
|
+
| `FLUSH_INTERVAL_MS`, `FLUSH_MAX_BATCH` | `5000`, `100` (massimo 500 eventi per batch). |
|
|
338
|
+
| `COLLECTOR_TIMEOUT_MS` | `10000`. |
|
|
339
|
+
| `SPOOL_PATH` | `spool.jsonl` nella directory di configurazione. |
|
|
340
|
+
| `LOG_LEVEL` | `info`. |
|
|
341
|
+
| `TLS_KEY_PATH`, `TLS_CERT_PATH` | Assenti; impostali entrambi per abilitare HTTPS in ingresso. |
|
|
342
|
+
|
|
343
|
+
La directory di configurazione e':
|
|
344
|
+
|
|
345
|
+
- macOS/Linux: `~/.config/copilot-proxy`, oppure `$XDG_CONFIG_HOME/copilot-proxy`;
|
|
346
|
+
- Windows: `%APPDATA%/copilot-proxy`, quando `APPDATA` e' definita;
|
|
347
|
+
- tutte le piattaforme: `COPILOT_PROXY_HOME`, se impostata nell'ambiente,
|
|
348
|
+
sostituisce l'intera directory.
|
|
29
349
|
|
|
30
|
-
|
|
31
|
-
|
|
350
|
+
Il setup crea la directory con permessi `0700` e il file con `0600` su sistemi POSIX.
|
|
351
|
+
Non condividere il file: contiene il token di raccolta.
|
|
352
|
+
Il servizio automatico legge il file, non eredita in generale l'ambiente della shell;
|
|
353
|
+
`COPILOT_PROXY_HOME` viene invece riportata nella definizione del servizio.
|
|
354
|
+
Per impostazioni persistenti del servizio usa il file di configurazione.
|
|
32
355
|
|
|
33
|
-
|
|
34
|
-
|
|
356
|
+
## Dati, privacy e limiti
|
|
357
|
+
|
|
358
|
+
**Non vengono persistiti prompt o risposte dal proxy.** Il corpo viene comunque
|
|
359
|
+
letto in memoria per inoltro, ispezione e attribuzione. Al collector arrivano:
|
|
360
|
+
|
|
361
|
+
- ID richiesta e timestamp, progetto e fonte dell'attribuzione;
|
|
362
|
+
- identita' del repository rilevato: host, gruppi, nome e URL del remote;
|
|
363
|
+
- pseudonimo/ID developer e sua fonte, user agent e ID sessione se disponibile;
|
|
364
|
+
- endpoint, modello, contatori di token, durata e indicazione streaming;
|
|
365
|
+
- nome ed email facoltativi, negli header di invio, salvo `--anonymous`.
|
|
366
|
+
|
|
367
|
+
Non vengono inviati al collector il token Copilot, i path di lavoro rilevati o il
|
|
368
|
+
contenuto della conversazione. Gli URL dei remote sono invece metadati inviati:
|
|
369
|
+
non inserirvi credenziali. Il collector ha una propria gestione dei dati e della
|
|
370
|
+
conservazione. Lo pseudonimo e' un identificatore tecnico, **non una garanzia
|
|
371
|
+
di anonimato**; il salt distribuito nel pacchetto e' pubblico.
|
|
372
|
+
|
|
373
|
+
Il token di ingest e' condiviso nell'organizzazione: chi lo possiede puo'
|
|
374
|
+
dichiarare progetto e developer. E' uno strumento di contabilita' analitica
|
|
375
|
+
interna, non un sistema di attribuzione non ripudiabile o una fattura ufficiale.
|
|
376
|
+
|
|
377
|
+
### Collector non disponibile
|
|
378
|
+
|
|
379
|
+
La disponibilita' del collector non blocca le richieste Copilot. Errori di rete,
|
|
380
|
+
timeout, errori server e HTTP `401`, `403`, `408`, `429` fanno conservare gli eventi
|
|
381
|
+
in uno spool JSONL locale, ritentato ai flush successivi e al riavvio.
|
|
382
|
+
La deduplicazione richiede il collector compatibile e usa `requestId`.
|
|
383
|
+
|
|
384
|
+
La consegna e' **best effort, non senza perdite**:
|
|
385
|
+
|
|
386
|
+
- coda in memoria fino a 10.000 eventi; quelli nuovi in eccesso sono scartati;
|
|
387
|
+
- spool fino a 50.000 eventi, conservando i piu' recenti;
|
|
388
|
+
- gli altri errori HTTP 4xx sono definitivi e causano lo scarto del batch;
|
|
389
|
+
- gli eventi rifiutati singolarmente dal collector vengono segnalati nei log;
|
|
390
|
+
- un arresto improvviso puo' perdere gli eventi ancora soltanto in memoria.
|
|
391
|
+
|
|
392
|
+
Tieni sotto controllo spool, errori e contatore `dropped`. Il proxy non ha
|
|
393
|
+
autenticazione locale propria: non esporre `HOST=0.0.0.0` senza protezioni adeguate.
|
|
394
|
+
Se il traffico attraversa la rete, proteggi anche l'ingresso con TLS e controlli
|
|
395
|
+
di accesso; non disabilitare la verifica dei certificati.
|
|
396
|
+
|
|
397
|
+
## Diagnostica
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
copilot-proxy --version
|
|
401
|
+
copilot-proxy status
|
|
402
|
+
copilot-proxy doctor
|
|
403
|
+
curl http://127.0.0.1:8787/_health
|
|
35
404
|
```
|
|
36
405
|
|
|
37
|
-
|
|
38
|
-
|
|
406
|
+
`/_health` restituisce versione, avvio, URL upstream/collector, stato del rilevamento,
|
|
407
|
+
statistiche `usage` (con `lastEventByClient`, l'ultimo evento per tipo di client) e
|
|
408
|
+
`spoolBytes`. I contatori sono **del processo corrente**,
|
|
409
|
+
non uno storico completo; `ok: true` non dimostra che il collector sia raggiungibile.
|
|
410
|
+
|
|
411
|
+
`status` mostra anche l'instradamento: per ogni editor se passa dal proxy (o se
|
|
412
|
+
l'override e' commentato), se `COPILOT_API_URL` e' impostata, e l'ultimo evento
|
|
413
|
+
dell'estensione Copilot Chat e di Copilot CLI / runtime agentico.
|
|
39
414
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
415
|
+
`doctor` esce con codice non zero in presenza di `FAIL`. Un `WARN` da solo non
|
|
416
|
+
fa fallire il comando: versione del processo diversa dal CLI, editor non tutti
|
|
417
|
+
configurati, `COPILOT_API_URL` mancante, runtime agentici avviati prima del setup
|
|
418
|
+
o assenza prolungata di traffico richiedono comunque attenzione.
|
|
419
|
+
Il controllo degli editor resta attivo anche se usi esclusivamente CLI:
|
|
420
|
+
in quel caso un `FAIL` sugli editor non dimostra un errore dell'inoltro CLI.
|
|
43
421
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
proxy
|
|
47
|
-
|
|
48
|
-
|
|
422
|
+
| Sintomo | Verifica / azione |
|
|
423
|
+
| --- | --- |
|
|
424
|
+
| Copilot non risponde dopo il setup | Verifica che il proxy sia avviato; se devi tornare al collegamento diretto esegui `uninstall` (toglie anche `COPILOT_API_URL`), rimuovi le due chiavi di override e riavvia l'editor. |
|
|
425
|
+
| Porta occupata | Ripeti il setup con `--force --port 9000 --vscode` e, se usato, `--autostart`. |
|
|
426
|
+
| Nessun evento misurato | Riavvia l'editor, controlla gli override (non devono essere commentati) e il protocollo di usage; le risposte senza contatori non sono misurabili. |
|
|
427
|
+
| Solo eventi `gpt-4o-mini` a costo zero | Le chat girano nelle sessioni Copilot CLI / agentiche, che ignorano l'override dell'editor: esegui `setup --vscode --force`, poi chiudi e riapri l'editor. `doctor` segnala i runtime avviati senza `COPILOT_API_URL`. |
|
|
428
|
+
| Progetti `unassigned` | Controlla `WORKSPACE_ROOTS`, path visibili sulla macchina del proxy e marker; per i CLI usa un prefisso o un header esplicito. |
|
|
429
|
+
| Spool in crescita / collector `unreachable` | Controlla rete, URL del collector e log. |
|
|
430
|
+
| Collector `401` / `403` | Token ruotato: vedi [Cambiare il token](#cambiare-il-token). Gli eventi restano in attesa entro i limiti dello spool. |
|
|
431
|
+
| Processo con versione precedente | Dopo l'aggiornamento del pacchetto esegui `restart`. |
|
|
432
|
+
| Servizio non riparte dopo pulizia cache o cambio Node | Reinstalla globalmente e ripeti `setup --force --autostart`. |
|
|
49
433
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
434
|
+
Su macOS il servizio scrive stdout e stderr in `proxy.log` nella directory
|
|
435
|
+
di configurazione. Su Linux usa `journalctl --user -u copilot-proxy.service`.
|
|
436
|
+
In primo piano i log sono nel terminale.
|
|
53
437
|
|
|
54
|
-
|
|
55
|
-
il loro consumo non viene misurato.
|
|
438
|
+
## Aggiornamento e rimozione
|
|
56
439
|
|
|
57
|
-
|
|
440
|
+
### Aggiornare
|
|
58
441
|
|
|
59
442
|
```bash
|
|
60
|
-
|
|
443
|
+
npm install -g @vidiemme/copilot-proxy@latest
|
|
444
|
+
copilot-proxy restart
|
|
445
|
+
copilot-proxy doctor
|
|
61
446
|
```
|
|
62
447
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
448
|
+
`restart` richiede un servizio gia' installato. Se usi `start` in primo piano,
|
|
449
|
+
ferma e rilancia il processo. Se passi da `npx` all'installazione globale,
|
|
450
|
+
o cambia il percorso di Node, registra nuovamente il servizio:
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
copilot-proxy setup --force --vscode --autostart
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
Dalla versione che introduce `COPILOT_API_URL`, le postazioni gia' configurate
|
|
457
|
+
vanno aggiornate con lo stesso comando (l'aggiornamento del pacchetto da solo non
|
|
458
|
+
la imposta), poi chiudendo e riaprendo l'editor. `doctor` segnala se manca.
|
|
459
|
+
|
|
460
|
+
### Cambiare il token
|
|
461
|
+
|
|
462
|
+
`setup --force` riusa il token gia' salvato e non lo richiede. Per sostituirlo,
|
|
463
|
+
impostalo nell'ambiente senza scriverlo nella cronologia della shell:
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
read -rs COLLECTOR_TOKEN && export COLLECTOR_TOKEN
|
|
467
|
+
copilot-proxy setup --force --vscode --autostart
|
|
468
|
+
unset COLLECTOR_TOKEN
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Senza avvio automatico, ometti `--autostart` e riavvia il processo `start`.
|
|
472
|
+
|
|
473
|
+
### Disattivare e rimuovere
|
|
474
|
+
|
|
475
|
+
1. Rimuovi dalle impostazioni utente degli editor
|
|
476
|
+
`github.copilot.advanced.debug.overrideCapiUrl` e
|
|
477
|
+
`github.copilot.advanced.debug.overrideAuthType`, poi riavvia gli editor.
|
|
478
|
+
2. Rimuovi anche le base URL e gli header del proxy configurati nei CLI/harness.
|
|
479
|
+
3. Esegui `copilot-proxy uninstall` per rimuovere il servizio automatico,
|
|
480
|
+
oppure ferma con `Ctrl+C` il processo avviato a mano.
|
|
481
|
+
4. Se installato globalmente: `npm uninstall -g @vidiemme/copilot-proxy`.
|
|
482
|
+
|
|
483
|
+
`uninstall` **non** elimina configurazione, token, log o spool e non ripristina
|
|
484
|
+
le impostazioni editor. Prima di cancellare manualmente i dati locali verifica
|
|
485
|
+
che gli eventi in attesa siano stati consegnati. Non fermare semplicemente
|
|
486
|
+
il proxy lasciando gli editor configurati: Copilot non raggiungerebbe l'upstream.
|
|
66
487
|
|
|
67
|
-
|
|
68
|
-
`0600`.
|
|
488
|
+
## Sorgenti e licenza
|
|
69
489
|
|
|
70
|
-
|
|
490
|
+
- [Codice sorgente e documentazione del progetto](https://github.com/vidiemme/copilot-usage)
|
|
491
|
+
- [Segnalazioni e richieste](https://github.com/vidiemme/copilot-usage/issues)
|
|
492
|
+
- [Contratto degli eventi](https://github.com/vidiemme/copilot-usage/tree/main/packages/shared)
|
|
493
|
+
- [Licenza MIT](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/LICENSE)
|
|
71
494
|
|
|
72
|
-
|
|
73
|
-
|
|
495
|
+
I diagrammi sono creati con `diagram-design`, con palette ispirata a
|
|
496
|
+
[BIP RED](https://www.bip.red/). PolySans non e' incluso: i sorgenti HTML usano
|
|
497
|
+
Instrument Serif, Geist e Geist Mono come fallback dichiarati; i PNG incorporano
|
|
498
|
+
la resa dei font per essere leggibili anche su npm senza dipendenze esterne.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Variabile con cui il runtime agentico di Copilot (Copilot CLI e le sessioni
|
|
3
|
+
* "Copilot CLI" / Copilot SDK dentro VS Code) sceglie l'endpoint. Quel runtime
|
|
4
|
+
* e' un processo a se': ignora `github.copilot.advanced.debug.overrideCapiUrl`
|
|
5
|
+
* e, senza questa variabile, parla direttamente con GitHub saltando il proxy.
|
|
6
|
+
* Lo eredita dall'ambiente dell'editor, quindi va impostata a livello di
|
|
7
|
+
* sessione utente, non solo nella shell.
|
|
8
|
+
*/
|
|
9
|
+
export declare const API_URL_VAR = "COPILOT_API_URL";
|
|
10
|
+
export declare function proxyUrl(port: number): string;
|
|
11
|
+
export interface RuntimeRoutingResult {
|
|
12
|
+
/** Dove e' stata resa persistente la variabile. */
|
|
13
|
+
persistedIn: string;
|
|
14
|
+
removeHint: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Indirizza il runtime agentico al proxy per tutte le applicazioni avviate da
|
|
18
|
+
* qui in avanti, e anche dopo un riavvio della macchina.
|
|
19
|
+
*/
|
|
20
|
+
export declare function installRuntimeRouting(port: number): RuntimeRoutingResult;
|
|
21
|
+
/** Rimuove l'instradamento; `false` se non era attivo. */
|
|
22
|
+
export declare function uninstallRuntimeRouting(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Valore che riceveranno le applicazioni avviate d'ora in poi; `undefined` se
|
|
25
|
+
* non impostato. La shell corrente non fa testo: puo' essere stata aperta prima.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readRuntimeRouting(): string | undefined;
|
|
28
|
+
export interface RuntimeProcess {
|
|
29
|
+
pid: number;
|
|
30
|
+
/** Valore di `COPILOT_API_URL` con cui il processo e' partito, se presente. */
|
|
31
|
+
apiUrl: string | undefined;
|
|
32
|
+
}
|
|
33
|
+
/** Runtime agentico dentro l'editor (`copilot-runtime`) o binario nativo di Copilot CLI. */
|
|
34
|
+
export declare function isRuntimeCommand(command: string): boolean;
|
|
35
|
+
/** Estrae `COPILOT_API_URL` dall'output di `ps eww`, dove l'ambiente segue gli argomenti. */
|
|
36
|
+
export declare function apiUrlFromPsLine(line: string): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Processi del runtime agentico gia' in esecuzione, con l'URL che hanno
|
|
39
|
+
* ereditato. L'ambiente si legge solo all'avvio: un processo partito prima del
|
|
40
|
+
* setup resta fuori dal proxy finche' non si riavvia l'editor.
|
|
41
|
+
* `undefined` dove non si sa leggere l'ambiente degli altri processi.
|
|
42
|
+
*/
|
|
43
|
+
export declare function runningRuntimes(): RuntimeProcess[] | undefined;
|