diff --git a/ag-debug.json b/ag-debug.json new file mode 100644 index 0000000..04206ce --- /dev/null +++ b/ag-debug.json @@ -0,0 +1,49 @@ +{ + "response": { + "groups": [ + { + "displayName": "Gemini Models", + "description": "Models within this group: Gemini Flash, Gemini Pro", + "buckets": [ + { + "bucketId": "gemini-weekly", + "displayName": "Weekly Limit Remaining", + "description": "You have used some of your weekly limit, it will fully refresh in 12 hours, 30 minutes.", + "window": "weekly", + "remainingFraction": 0.21547645, + "resetTime": "2026-08-29T09:20:06Z" + }, + { + "bucketId": "gemini-5h", + "displayName": "Five Hour Limit Remaining", + "description": "You have used some of your 5-hour limit, it will fully refresh in 2 hours, 21 minutes.", + "window": "5h", + "remainingFraction": 0.5744839, + "resetTime": "2026-08-28T23:11:19Z" + } + ] + }, + { + "displayName": "Claude and GPT models", + "description": "Models within this group: Claude Opus, Claude Sonnet, GPT-OSS", + "buckets": [ + { + "bucketId": "3p-weekly", + "displayName": "Weekly Limit Remaining", + "window": "weekly", + "remainingFraction": 1, + "resetTime": "2026-09-04T20:49:50Z" + }, + { + "bucketId": "3p-5h", + "displayName": "Five Hour Limit Remaining", + "window": "5h", + "remainingFraction": 1, + "resetTime": "2026-08-29T01:49:50Z" + } + ] + } + ], + "description": "Within each group, models share a weekly limit and a 5-hour limit. Quota is consumed proportionally to the cost of the tokens. Thus, limits will last longer with shorter tasks or using more cost-effective models. The 5-hour limit smooths out aggregate demand to fairly distribute global capacity across all users, while your weekly limit is tied directly to your individual tier." + } +} \ No newline at end of file diff --git a/dist/services/providers.js b/dist/services/providers.js index 2dc18d3..b405cb5 100644 --- a/dist/services/providers.js +++ b/dist/services/providers.js @@ -28,28 +28,28 @@ function updateAntigravityQuota(data) { used: gemini5hUsed, total: 100, percentage: gemini5hUsed, - meta: { resetStr: data.gemini_reset || 'Unknown' } + meta: { resetStr: data.gemini_5h_reset || 'Unknown' } }, { provider: 'AG Gemini (Weekly)', used: geminiWeeklyUsed, total: 100, percentage: geminiWeeklyUsed, - meta: { resetStr: data.gemini_reset || 'Unknown' } + meta: { resetStr: data.gemini_weekly_reset || 'Unknown' } }, { provider: 'AG Claude (5h)', used: claude5hUsed, total: 100, percentage: claude5hUsed, - meta: { resetStr: data.claude_reset || 'Unknown' } + meta: { resetStr: data.claude_5h_reset || 'Unknown' } }, { provider: 'AG Claude (Weekly)', used: claudeWeeklyUsed, total: 100, percentage: claudeWeeklyUsed, - meta: { resetStr: data.claude_reset || 'Unknown' } + meta: { resetStr: data.claude_weekly_reset || 'Unknown' } } ]; } diff --git a/dist/services/providers.js.map b/dist/services/providers.js.map index fb07eaf..7bad351 100644 --- a/dist/services/providers.js.map +++ b/dist/services/providers.js.map @@ -1 +1 @@ -{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/services/providers.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/services/providers.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,kDAA0B;AAC1B,oDAA4B;AAG5B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,IAAI,gBAAgB,GAAiB;IACjC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IAClE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IACtE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IAClE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;CACzE,CAAC;AAEF,gCAAuC,IAAS;IAC5C,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAC;IAErE,gBAAgB,GAAG;QACf;YACI,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE;SACxD;QACD;YACI,QAAQ,EAAE,oBAAoB;YAC9B,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,gBAAgB;YAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,IAAI,SAAS,EAAE;SAC5D;QACD;YACI,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE;SACxD;QACD;YACI,QAAQ,EAAE,oBAAoB;YAC9B,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,gBAAgB;YAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,IAAI,SAAS,EAAE;SAC5D;KACJ,CAAC;AACN,CAAC;AAED;IACI,OAAO,gBAAgB,CAAC;AAC5B,CAAC;AAEM,KAAK;IACR,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,2CAA2C,EAAE;YACrE,OAAO,EAAE;gBACL,eAAe,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;aACvD;SACJ,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;QAE7C,MAAM,YAAY,GAAG,KAAK,CAAC;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC;QAEpE,MAAM,IAAI,GAAG;YACT,SAAS;YACT,YAAY;YACZ,cAAc;YACd,YAAY;SACf,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACvE,CAAC;AACL,CAAC;AAEM,KAAK;IACR,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,gEAAgE,EAAE;YAC1F,OAAO,EAAE;gBACL,eAAe,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;aAC3D;SACJ,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7D,OAAO;YACH;gBACI,QAAQ,EAAE,cAAc;gBACxB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,GAAG;gBACV,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;aACjC;YACD;gBACI,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,GAAG;gBACV,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;aAC/B;SACJ,CAAC;IACN,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO;YACH,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;YAChE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;SACvE,CAAC;IACN,CAAC;AACL,CAAC;AAEM,KAAK;IACR,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEhD,OAAO,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAC;AACrD,CAAC"} \ No newline at end of file diff --git a/src/services/providers.ts b/src/services/providers.ts index a4a5261..f2b52c5 100644 --- a/src/services/providers.ts +++ b/src/services/providers.ts @@ -23,28 +23,28 @@ export function updateAntigravityQuota(data: any) { used: gemini5hUsed, total: 100, percentage: gemini5hUsed, - meta: { resetStr: data.gemini_reset || 'Unknown' } + meta: { resetStr: data.gemini_5h_reset || 'Unknown' } }, { provider: 'AG Gemini (Weekly)', used: geminiWeeklyUsed, total: 100, percentage: geminiWeeklyUsed, - meta: { resetStr: data.gemini_reset || 'Unknown' } + meta: { resetStr: data.gemini_weekly_reset || 'Unknown' } }, { provider: 'AG Claude (5h)', used: claude5hUsed, total: 100, percentage: claude5hUsed, - meta: { resetStr: data.claude_reset || 'Unknown' } + meta: { resetStr: data.claude_5h_reset || 'Unknown' } }, { provider: 'AG Claude (Weekly)', used: claudeWeeklyUsed, total: 100, percentage: claudeWeeklyUsed, - meta: { resetStr: data.claude_reset || 'Unknown' } + meta: { resetStr: data.claude_weekly_reset || 'Unknown' } } ]; } diff --git a/test-ag.js b/test-ag.js new file mode 100644 index 0000000..637b454 --- /dev/null +++ b/test-ag.js @@ -0,0 +1,64 @@ +const fs = require('fs'); +const http = require('http'); +const https = require('https'); +const { execSync } = require('child_process'); + +function extractArgument(commandLine, argumentName) { + const escapedName = argumentName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const pattern = new RegExp(`--${escapedName}(?:=|\\s+)(?:"([^"]*)"|'([^']*)'|([^\\s]+))`, 'i'); + const match = commandLine.match(pattern); + return match ? (match[1] ?? match[2] ?? match[3] ?? null) : null; +} + +try { + const stdout = execSync('powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"name like \'language_server%\'\\" | Select-Object ProcessId,CommandLine | ConvertTo-Json -Depth 2"').toString(); + const processes = JSON.parse(stdout); + const processInfo = Array.isArray(processes) ? processes.find(p => extractArgument(p.CommandLine, 'csrf_token')) : processes; + if (!processInfo) { console.log('No LS found'); process.exit(0); } + + const csrfToken = extractArgument(processInfo.CommandLine, 'csrf_token'); + const pid = processInfo.ProcessId; + + const netstat = execSync('netstat -ano').toString(); + const ports = []; + for (const line of netstat.split(/\r?\n/)) { + if (!/(LISTEN|ABH)/i.test(line) || !new RegExp(`\\s${pid}\\s*$`).test(line)) continue; + for (const match of line.matchAll(/(?:127\.0\.0\.1|\[?::1\]?):(\d{2,5})/g)) { + ports.push(Number(match[1])); + } + } + + const requestBody = JSON.stringify({ metadata: { ideName: 'antigravity', extensionName: 'ag-usage', locale: 'en' } }); + + for (const port of [...new Set(ports)]) { + ['http', 'https'].forEach(protocol => { + const client = protocol === 'https' ? https : http; + const req = client.request({ + hostname: '127.0.0.1', port, path: '/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary', method: 'POST', + ...(protocol === 'https' ? { rejectUnauthorized: false } : {}), + headers: { + 'X-Codeium-Csrf-Token': csrfToken, + 'Connect-Protocol-Version': '1', + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(requestBody) + } + }, res => { + let body = ''; + res.on('data', chunk => body += chunk); + res.on('end', () => { + console.log('Port', port, protocol, res.statusCode); + if (res.statusCode === 200) { + try { + fs.writeFileSync('ag-debug.json', JSON.stringify(JSON.parse(body), null, 2)); + } catch(e) {} + } + }); + }); + req.on('error', () => {}); + req.write(requestBody); + req.end(); + }); + } +} catch (e) { + console.error(e); +} diff --git a/tokenwatch-sync.js b/tokenwatch-sync.js index db4895d..d3132f4 100644 --- a/tokenwatch-sync.js +++ b/tokenwatch-sync.js @@ -49,8 +49,8 @@ function extractArgument(commandLine, argumentName) { return match ? (match[1] ?? match[2] ?? match[3] ?? null) : null; } -const API_PATH = '/exa.language_server_pb.LanguageServerService/GetUserStatus'; -const requestBody = JSON.stringify({ metadata: { ideName: 'antigravity', extensionName: 'antigravity', locale: 'en' } }); +const API_PATH = '/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary'; +const requestBody = JSON.stringify({ metadata: { ideName: 'antigravity', extensionName: 'ag-usage', locale: 'en' } }); function tryPort(port, csrfToken, protocol) { return new Promise(resolve => { @@ -152,52 +152,53 @@ async function main() { } const actualData = Array.isArray(rawData) ? rawData[0] : rawData; - const modelConfigs = actualData?.userStatus?.cascadeModelConfigData?.clientModelConfigs || actualData?.userStatus?.modelConfigs; + const groups = actualData?.response?.groups; - if (!modelConfigs) { - console.error('Fehler: Konnte keine JSON-Antwort mit Quota auslesen.'); + if (!groups) { + console.error('Fehler: Konnte keine JSON-Antwort mit Quota auslesen.', rawData); return; } - // Wir filtern die Gemini und Claude Modelle heraus - const geminiModels = modelConfigs.filter(m => m.label && m.label.includes('Gemini')); - const claudeModels = modelConfigs.filter(m => m.label && m.label.includes('Claude')); + let gemini5h = 1, geminiWeekly = 1, gemini5hReset = 'Unknown', geminiWeeklyReset = 'Unknown'; + let claude5h = 1, claudeWeekly = 1, claude5hReset = 'Unknown', claudeWeeklyReset = 'Unknown'; - let geminiMinRemaining = 1; - let geminiResetTime = 'Unknown'; - let claudeMinRemaining = 1; - let claudeResetTime = 'Unknown'; + const formatTime = (ts) => { + if (!ts) return 'Unknown'; + return new Date(ts).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); + }; - for (const m of geminiModels) { - if (m.quotaInfo && m.quotaInfo.remainingFraction !== undefined) { - if (m.quotaInfo.remainingFraction < geminiMinRemaining) { - geminiMinRemaining = m.quotaInfo.remainingFraction; - const d = new Date(m.quotaInfo.resetTime); - geminiResetTime = d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); + for (const group of groups) { + const isGemini = group.displayName && group.displayName.toLowerCase().includes('gemini'); + for (const bucket of group.buckets || []) { + if (isGemini) { + if (bucket.window === '5h') { + gemini5h = bucket.remainingFraction ?? 1; + gemini5hReset = formatTime(bucket.resetTime); + } else if (bucket.window === 'weekly') { + geminiWeekly = bucket.remainingFraction ?? 1; + geminiWeeklyReset = formatTime(bucket.resetTime); + } + } else { + if (bucket.window === '5h') { + claude5h = bucket.remainingFraction ?? 1; + claude5hReset = formatTime(bucket.resetTime); + } else if (bucket.window === 'weekly') { + claudeWeekly = bucket.remainingFraction ?? 1; + claudeWeeklyReset = formatTime(bucket.resetTime); + } } } } - - for (const m of claudeModels) { - if (m.quotaInfo && m.quotaInfo.remainingFraction !== undefined) { - if (m.quotaInfo.remainingFraction < claudeMinRemaining) { - claudeMinRemaining = m.quotaInfo.remainingFraction; - const d = new Date(m.quotaInfo.resetTime); - claudeResetTime = d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); - } - } - } - - const geminiRemainingPercent = Math.round(geminiMinRemaining * 100); - const claudeRemainingPercent = Math.round(claudeMinRemaining * 100); const payload = { - gemini_5h_remaining: geminiRemainingPercent, - gemini_weekly_remaining: geminiRemainingPercent, // Duplicate since API doesn't distinguish - claude_5h_remaining: claudeRemainingPercent, - claude_weekly_remaining: claudeRemainingPercent, // Duplicate since API doesn't distinguish - gemini_reset: `in ${geminiResetTime}`, - claude_reset: `in ${claudeResetTime}` + gemini_5h_remaining: Math.round(gemini5h * 100), + gemini_weekly_remaining: Math.round(geminiWeekly * 100), + claude_5h_remaining: Math.round(claude5h * 100), + claude_weekly_remaining: Math.round(claudeWeekly * 100), + gemini_5h_reset: `in ${gemini5hReset}`, + gemini_weekly_reset: `in ${geminiWeeklyReset}`, + claude_5h_reset: `in ${claude5hReset}`, + claude_weekly_reset: `in ${claudeWeeklyReset}` }; console.log('Gefundene Live-Daten:', payload);