@vidiemme/copilot-proxy 0.3.2 → 0.4.0

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.
@@ -0,0 +1,89 @@
1
+ const TOKENS_PER_UNIT = 1_000_000;
2
+ /** Stessa scelta di fascia del collector: per totale di input della singola chiamata. */
3
+ export function selectTier(tiers, inputTokens) {
4
+ const ordered = [...tiers].sort((a, b) => {
5
+ if (a.maxInputTokens === null)
6
+ return 1;
7
+ if (b.maxInputTokens === null)
8
+ return -1;
9
+ return a.maxInputTokens - b.maxInputTokens;
10
+ });
11
+ return (ordered.find((tier) => tier.maxInputTokens === null || inputTokens <= tier.maxInputTokens) ??
12
+ ordered[ordered.length - 1]);
13
+ }
14
+ /**
15
+ * Divide il budget di input fra letture dalla cache e token a prezzo pieno.
16
+ *
17
+ * Si assume che ogni round rilegga un contesto vicino a quello finale: e' cio'
18
+ * che accade in una sessione agentica, dove storia e risultati degli strumenti
19
+ * dominano il prompt. Quanto il budget eccede quelle letture e' contesto nuovo,
20
+ * pagato alla tariffa piena. Se il budget non basta nemmeno per le letture, il
21
+ * contesto riletto era piu' corto e si riduce di conseguenza.
22
+ */
23
+ function splitInput(budgetUsd, estimatedTotal, cheap, expensive) {
24
+ if (budgetUsd <= 0)
25
+ return { total: 0, expensive: 0 };
26
+ if (cheap <= 0 && expensive <= 0)
27
+ return { total: estimatedTotal, expensive: 0 };
28
+ const units = budgetUsd * TOKENS_PER_UNIT;
29
+ if (cheap * estimatedTotal >= units) {
30
+ return { total: cheap > 0 ? Math.round(units / cheap) : estimatedTotal, expensive: 0 };
31
+ }
32
+ if (expensive <= cheap)
33
+ return { total: estimatedTotal, expensive: 0 };
34
+ const premium = (units - cheap * estimatedTotal) / (expensive - cheap);
35
+ if (premium <= estimatedTotal)
36
+ return { total: estimatedTotal, expensive: Math.round(premium) };
37
+ // Neanche un contesto tutto a prezzo pieno spiega l'addebito: era piu' lungo.
38
+ const total = Math.round(units / expensive);
39
+ return { total, expensive: total };
40
+ }
41
+ function share(total, parts, index) {
42
+ const base = Math.floor(total / parts);
43
+ return index === parts - 1 ? total - base * (parts - 1) : base;
44
+ }
45
+ /**
46
+ * Ricostruisce i contatori dei singoli round di una richiesta di Copilot Chat.
47
+ *
48
+ * VS Code conserva per ogni richiesta i crediti addebitati, l'output totale e
49
+ * il contesto dell'ultimo round, ma non quanto ciascun round abbia letto dalla
50
+ * cache o scritto. La ripartizione si ricostruisce quindi in modo che, prezzata
51
+ * con il listino del collector, dia esattamente l'addebito: i token sono una
52
+ * stima, il costo no.
53
+ *
54
+ * Si producono contatori per round, non uno per richiesta, perche' la fascia
55
+ * tariffaria dipende dall'input della singola chiamata: sommare decine di round
56
+ * in un evento lo spingerebbe nella fascia long context.
57
+ */
58
+ export function reconstructRounds(request, tiers, creditUsd) {
59
+ const rounds = Math.max(1, Math.floor(request.rounds));
60
+ const prompt = Math.max(0, request.promptTokens);
61
+ const output = Math.max(0, request.completionTokens);
62
+ const budgetUsd = request.credits * creditUsd;
63
+ let tier = selectTier(tiers, prompt);
64
+ if (!tier)
65
+ return undefined;
66
+ let split = { total: 0, expensive: 0 };
67
+ // Una seconda passata basta: la fascia cambia solo se la stima del contesto si sposta.
68
+ for (let attempt = 0; attempt < 2; attempt += 1) {
69
+ const premiumRate = Math.max(tier.cacheWrite, tier.input);
70
+ const inputBudget = budgetUsd - (output * tier.output) / TOKENS_PER_UNIT;
71
+ split = splitInput(inputBudget, rounds * prompt, tier.cachedInput, premiumRate);
72
+ const next = selectTier(tiers, Math.ceil(split.total / rounds));
73
+ if (!next || next === tier)
74
+ break;
75
+ tier = next;
76
+ }
77
+ const premiumIsWrite = tier.cacheWrite >= tier.input;
78
+ return Array.from({ length: rounds }, (_, index) => {
79
+ const total = share(split.total, rounds, index);
80
+ const expensive = Math.min(total, share(split.expensive, rounds, index));
81
+ return {
82
+ inputTokens: premiumIsWrite ? 0 : expensive,
83
+ cachedInputTokens: total - expensive,
84
+ cacheWriteTokens: premiumIsWrite ? expensive : 0,
85
+ outputTokens: share(output, rounds, index),
86
+ };
87
+ });
88
+ }
89
+ //# sourceMappingURL=reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../../src/reload/reconstruct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /** Una richiesta di Copilot Chat come la conserva l'editor. */
2
+ export interface ChatRequest {
3
+ requestId: string;
4
+ /** Inizio di ciascun round, in ordine. */
5
+ roundTimes: Date[];
6
+ /** Cartelle del workspace in cui e' avvenuta la conversazione. */
7
+ folders: string[];
8
+ sessionId: string;
9
+ model: string | null;
10
+ promptTokens: number | null;
11
+ completionTokens: number | null;
12
+ credits: number | null;
13
+ editor: string;
14
+ }
15
+ type Json = Record<string, unknown>;
16
+ /**
17
+ * Riapplica il log delle modifiche con cui VS Code salva una sessione.
18
+ *
19
+ * Le versioni recenti non riscrivono il file a ogni messaggio: aggiungono righe
20
+ * `{kind, k, v}` — 0 stato iniziale, 1 assegnazione al percorso `k`, 2 aggiunta
21
+ * in coda (da `i` in poi, se presente), 3 rimozione. Le versioni piu' vecchie
22
+ * salvano invece in `.json` un unico oggetto con lo stato completo.
23
+ */
24
+ export declare function replaySession(content: string): Json | undefined;
25
+ /** Radici degli storage di workspace degli editor della famiglia VS Code. */
26
+ export declare function defaultStorageRoots(): {
27
+ editor: string;
28
+ path: string;
29
+ }[];
30
+ /**
31
+ * Legge le richieste di Copilot Chat salvate dagli editor.
32
+ *
33
+ * Una stessa richiesta compare in piu' file quando una sessione viene
34
+ * biforcata: si tiene una sola copia, con l'orario piu' antico.
35
+ */
36
+ export declare function readChatRequests(roots?: {
37
+ editor: string;
38
+ path: string;
39
+ }[], modifiedSince?: Date): ChatRequest[];
40
+ export {};
@@ -0,0 +1,203 @@
1
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { knownEditors } from '../editors.js';
5
+ function asObject(value) {
6
+ return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : undefined;
7
+ }
8
+ function asNumber(value) {
9
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
10
+ }
11
+ /**
12
+ * Riapplica il log delle modifiche con cui VS Code salva una sessione.
13
+ *
14
+ * Le versioni recenti non riscrivono il file a ogni messaggio: aggiungono righe
15
+ * `{kind, k, v}` — 0 stato iniziale, 1 assegnazione al percorso `k`, 2 aggiunta
16
+ * in coda (da `i` in poi, se presente), 3 rimozione. Le versioni piu' vecchie
17
+ * salvano invece in `.json` un unico oggetto con lo stato completo.
18
+ */
19
+ export function replaySession(content) {
20
+ let state;
21
+ for (const line of content.split('\n')) {
22
+ if (line.trim().length === 0)
23
+ continue;
24
+ let entry;
25
+ try {
26
+ entry = asObject(JSON.parse(line));
27
+ }
28
+ catch {
29
+ continue;
30
+ }
31
+ if (!entry)
32
+ continue;
33
+ if (entry.kind === 0) {
34
+ state = entry.v;
35
+ continue;
36
+ }
37
+ const path = Array.isArray(entry.k) ? entry.k : undefined;
38
+ if (!path || path.length === 0 || state === undefined)
39
+ continue;
40
+ let target = state;
41
+ let valid = true;
42
+ for (const key of path.slice(0, -1)) {
43
+ const next = target[key];
44
+ if (typeof next !== 'object' || next === null) {
45
+ valid = false;
46
+ break;
47
+ }
48
+ target = next;
49
+ }
50
+ if (!valid)
51
+ continue;
52
+ const last = path[path.length - 1];
53
+ if (entry.kind === 1)
54
+ target[last] = entry.v;
55
+ else if (entry.kind === 3)
56
+ delete target[last];
57
+ else if (entry.kind === 2) {
58
+ const list = target[last];
59
+ if (!Array.isArray(list))
60
+ continue;
61
+ if (typeof entry.i === 'number')
62
+ list.splice(entry.i);
63
+ list.push(...(Array.isArray(entry.v) ? entry.v : [entry.v]));
64
+ }
65
+ }
66
+ return asObject(state);
67
+ }
68
+ function uriToPath(uri) {
69
+ if (!uri.startsWith('file://'))
70
+ return undefined;
71
+ try {
72
+ return fileURLToPath(uri);
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ }
78
+ /**
79
+ * Cartelle di un workspace multi-root. Il file ammette commenti e virgole
80
+ * finali, quindi non si passa da `JSON.parse`: bastano le voci `path`.
81
+ */
82
+ function workspaceFolders(file) {
83
+ let content;
84
+ try {
85
+ content = readFileSync(file, 'utf-8');
86
+ }
87
+ catch {
88
+ return [];
89
+ }
90
+ const folders = [];
91
+ for (const match of content.matchAll(/"path"\s*:\s*"((?:[^"\\]|\\.)*)"/g)) {
92
+ const raw = JSON.parse(`"${match[1]}"`);
93
+ folders.push(isAbsolute(raw) ? raw : resolve(dirname(file), raw));
94
+ }
95
+ return folders;
96
+ }
97
+ /** Cartelle aperte nella finestra a cui appartiene uno storage di workspace. */
98
+ function storageFolders(storageDir) {
99
+ let descriptor;
100
+ try {
101
+ descriptor = asObject(JSON.parse(readFileSync(join(storageDir, 'workspace.json'), 'utf-8')));
102
+ }
103
+ catch {
104
+ return [];
105
+ }
106
+ if (typeof descriptor?.folder === 'string') {
107
+ const folder = uriToPath(descriptor.folder);
108
+ return folder ? [folder] : [];
109
+ }
110
+ if (typeof descriptor?.workspace === 'string') {
111
+ const file = uriToPath(descriptor.workspace);
112
+ return file ? workspaceFolders(file) : [];
113
+ }
114
+ return [];
115
+ }
116
+ function listDir(path) {
117
+ try {
118
+ return readdirSync(path);
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ }
124
+ function chatRequest(raw, sessionId, folders, editor) {
125
+ const request = asObject(raw);
126
+ if (!request || typeof request.requestId !== 'string')
127
+ return undefined;
128
+ const metadata = asObject(asObject(request.result)?.metadata) ?? {};
129
+ const rounds = Array.isArray(metadata.toolCallRounds) ? metadata.toolCallRounds : [];
130
+ // In una sessione biforcata le richieste copiate prendono come timestamp il
131
+ // momento del fork: l'orario vero sopravvive solo nei round.
132
+ const started = asNumber(request.timestamp);
133
+ const roundTimes = rounds.map((round) => asNumber(asObject(round)?.timestamp));
134
+ const first = roundTimes.find((time) => time !== null) ?? started;
135
+ if (first === null)
136
+ return undefined;
137
+ const times = (roundTimes.length > 0 ? roundTimes : [first]).map((time, index) => new Date(time ?? first + index));
138
+ const resolved = typeof metadata.resolvedModel === 'string' ? metadata.resolvedModel : undefined;
139
+ const selected = typeof request.modelId === 'string' ? request.modelId : undefined;
140
+ return {
141
+ requestId: request.requestId,
142
+ roundTimes: times,
143
+ folders,
144
+ sessionId,
145
+ model: resolved ?? selected ?? null,
146
+ promptTokens: asNumber(request.promptTokens) ?? asNumber(metadata.promptTokens),
147
+ completionTokens: asNumber(request.completionTokens) ?? asNumber(metadata.outputTokens),
148
+ credits: asNumber(request.copilotCredits),
149
+ editor,
150
+ };
151
+ }
152
+ /** Radici degli storage di workspace degli editor della famiglia VS Code. */
153
+ export function defaultStorageRoots() {
154
+ return knownEditors().map((editor) => ({
155
+ editor: editor.name,
156
+ path: join(dirname(editor.settingsFile), 'workspaceStorage'),
157
+ }));
158
+ }
159
+ /**
160
+ * Legge le richieste di Copilot Chat salvate dagli editor.
161
+ *
162
+ * Una stessa richiesta compare in piu' file quando una sessione viene
163
+ * biforcata: si tiene una sola copia, con l'orario piu' antico.
164
+ */
165
+ export function readChatRequests(roots = defaultStorageRoots(), modifiedSince) {
166
+ const byId = new Map();
167
+ for (const root of roots) {
168
+ for (const storage of listDir(root.path)) {
169
+ const storageDir = join(root.path, storage);
170
+ const sessionsDir = join(storageDir, 'chatSessions');
171
+ const files = listDir(sessionsDir).filter((name) => name.endsWith('.json') || name.endsWith('.jsonl'));
172
+ if (files.length === 0)
173
+ continue;
174
+ const folders = storageFolders(storageDir);
175
+ for (const name of files) {
176
+ const file = join(sessionsDir, name);
177
+ // Un file non toccato dall'inizio del periodo non puo' contenerne richieste.
178
+ if (modifiedSince && statSync(file).mtime < modifiedSince)
179
+ continue;
180
+ let session;
181
+ try {
182
+ const content = readFileSync(file, 'utf-8');
183
+ session = name.endsWith('.jsonl') ? replaySession(content) : asObject(JSON.parse(content));
184
+ }
185
+ catch {
186
+ continue;
187
+ }
188
+ const requests = Array.isArray(session?.requests) ? session.requests : [];
189
+ const sessionId = typeof session?.sessionId === 'string' ? session.sessionId : name.replace(/\.jsonl?$/, '');
190
+ for (const raw of requests) {
191
+ const request = chatRequest(raw, sessionId, folders, root.editor);
192
+ if (!request)
193
+ continue;
194
+ const known = byId.get(request.requestId);
195
+ if (!known || request.roundTimes[0] < known.roundTimes[0])
196
+ byId.set(request.requestId, request);
197
+ }
198
+ }
199
+ }
200
+ }
201
+ return [...byId.values()];
202
+ }
203
+ //# sourceMappingURL=vscodeChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscodeChat.js","sourceRoot":"","sources":["../../src/reload/vscodeChat.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.2",
3
+ "version": "0.4.0",
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",