@metyatech/ai-quota 0.2.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.
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/amazon-q.d.ts +54 -0
- package/dist/amazon-q.d.ts.map +1 -0
- package/dist/amazon-q.js +103 -0
- package/dist/amazon-q.js.map +1 -0
- package/dist/claude.d.ts +10 -0
- package/dist/claude.d.ts.map +1 -0
- package/dist/claude.js +105 -0
- package/dist/claude.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +378 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex.d.ts +38 -0
- package/dist/codex.d.ts.map +1 -0
- package/dist/codex.js +321 -0
- package/dist/codex.js.map +1 -0
- package/dist/copilot.d.ts +30 -0
- package/dist/copilot.d.ts.map +1 -0
- package/dist/copilot.js +148 -0
- package/dist/copilot.js.map +1 -0
- package/dist/gemini.d.ts +14 -0
- package/dist/gemini.d.ts.map +1 -0
- package/dist/gemini.js +235 -0
- package/dist/gemini.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +64 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ai-quota CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* ai-quota [agent] Show quota for all agents, or a specific agent
|
|
7
|
+
* ai-quota --json Output machine-readable JSON
|
|
8
|
+
* ai-quota --help Show help
|
|
9
|
+
* ai-quota --version Show version
|
|
10
|
+
*
|
|
11
|
+
* Agents: claude, gemini, copilot, amazon-q, codex
|
|
12
|
+
*/
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { createRequire } from "node:module";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
import { fetchClaudeRateLimits } from "./claude.js";
|
|
19
|
+
import { fetchGeminiRateLimits } from "./gemini.js";
|
|
20
|
+
import { fetchCopilotRateLimits } from "./copilot.js";
|
|
21
|
+
import { fetchAmazonQRateLimits, resolveAmazonQUsageStatePath } from "./amazon-q.js";
|
|
22
|
+
import { fetchCodexRateLimits, rateLimitSnapshotToStatus } from "./codex.js";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Version
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function getVersion() {
|
|
27
|
+
try {
|
|
28
|
+
const require = createRequire(import.meta.url);
|
|
29
|
+
const dir = path.dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const pkgPath = path.resolve(dir, "..", "package.json");
|
|
31
|
+
const pkg = require(pkgPath);
|
|
32
|
+
return pkg.version ?? "0.0.0";
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return "0.0.0";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Time formatting helpers
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function formatResetIn(resetAt) {
|
|
42
|
+
const diffMs = resetAt.getTime() - Date.now();
|
|
43
|
+
if (diffMs <= 0)
|
|
44
|
+
return "already reset";
|
|
45
|
+
const totalMinutes = Math.floor(diffMs / 60000);
|
|
46
|
+
const hours = Math.floor(totalMinutes / 60);
|
|
47
|
+
const minutes = totalMinutes % 60;
|
|
48
|
+
if (hours === 0)
|
|
49
|
+
return `${minutes}m`;
|
|
50
|
+
if (minutes === 0)
|
|
51
|
+
return `${hours}h`;
|
|
52
|
+
return `${hours}h ${minutes}m`;
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Copilot: resolve token from env or gh CLI hosts.yml
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
function getCopilotToken() {
|
|
58
|
+
if (process.env.GITHUB_TOKEN)
|
|
59
|
+
return process.env.GITHUB_TOKEN;
|
|
60
|
+
const candidates = [
|
|
61
|
+
path.join(os.homedir(), ".config", "gh", "hosts.yml"),
|
|
62
|
+
path.join(os.homedir(), "AppData", "Roaming", "GitHub CLI", "hosts.yml")
|
|
63
|
+
];
|
|
64
|
+
for (const p of candidates) {
|
|
65
|
+
try {
|
|
66
|
+
if (!fs.existsSync(p))
|
|
67
|
+
continue;
|
|
68
|
+
const content = fs.readFileSync(p, "utf8");
|
|
69
|
+
// Simple line-by-line search for oauth_token under github.com
|
|
70
|
+
const match = content.match(/oauth_token:\s*(\S+)/);
|
|
71
|
+
if (match?.[1])
|
|
72
|
+
return match[1];
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// ignore
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Per-agent fetchers
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
async function fetchClaude(verbose) {
|
|
84
|
+
try {
|
|
85
|
+
const data = await fetchClaudeRateLimits(10000);
|
|
86
|
+
if (!data) {
|
|
87
|
+
return {
|
|
88
|
+
status: "no-data",
|
|
89
|
+
display: "no data",
|
|
90
|
+
json: { error: null, data: null }
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Use the five_hour bucket as primary display metric
|
|
94
|
+
const bucket = data.five_hour ?? data.seven_day;
|
|
95
|
+
if (!bucket) {
|
|
96
|
+
return {
|
|
97
|
+
status: "no-data",
|
|
98
|
+
display: "no data",
|
|
99
|
+
json: { data }
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const usedPercent = Math.round(bucket.utilization);
|
|
103
|
+
const resetAt = new Date(bucket.resets_at);
|
|
104
|
+
const resetIn = formatResetIn(resetAt);
|
|
105
|
+
const display = `${usedPercent}% used (resets in ${resetIn})`;
|
|
106
|
+
if (verbose) {
|
|
107
|
+
process.stderr.write(`[verbose] claude: five_hour=${JSON.stringify(data.five_hour)} seven_day=${JSON.stringify(data.seven_day)}\n`);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
status: "ok",
|
|
111
|
+
display,
|
|
112
|
+
json: {
|
|
113
|
+
usedPercent,
|
|
114
|
+
resetsAt: resetAt.toISOString(),
|
|
115
|
+
five_hour: data.five_hour,
|
|
116
|
+
seven_day: data.seven_day,
|
|
117
|
+
seven_day_sonnet: data.seven_day_sonnet,
|
|
118
|
+
extra_usage: data.extra_usage
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
124
|
+
return { status: "error", display: `error: ${msg}`, json: { error: msg } };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function fetchGemini(verbose) {
|
|
128
|
+
try {
|
|
129
|
+
const data = await fetchGeminiRateLimits();
|
|
130
|
+
if (!data) {
|
|
131
|
+
return { status: "no-data", display: "no data", json: { error: null, data: null } };
|
|
132
|
+
}
|
|
133
|
+
const pro = data["gemini-3-pro-preview"];
|
|
134
|
+
const flash = data["gemini-3-flash-preview"];
|
|
135
|
+
const primary = pro ?? flash;
|
|
136
|
+
if (!primary) {
|
|
137
|
+
return { status: "no-data", display: "no data", json: { data } };
|
|
138
|
+
}
|
|
139
|
+
const usedPercent = Math.round(primary.usage);
|
|
140
|
+
const resetAt = primary.resetAt;
|
|
141
|
+
const resetIn = formatResetIn(resetAt);
|
|
142
|
+
const display = `${usedPercent}% used (resets in ${resetIn})`;
|
|
143
|
+
if (verbose) {
|
|
144
|
+
process.stderr.write(`[verbose] gemini: pro=${JSON.stringify(pro)} flash=${JSON.stringify(flash)}\n`);
|
|
145
|
+
}
|
|
146
|
+
const jsonData = { usedPercent, resetsAt: resetAt.toISOString() };
|
|
147
|
+
if (pro) {
|
|
148
|
+
jsonData["gemini-3-pro-preview"] = {
|
|
149
|
+
usedPercent: Math.round(pro.usage),
|
|
150
|
+
resetsAt: pro.resetAt.toISOString()
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (flash) {
|
|
154
|
+
jsonData["gemini-3-flash-preview"] = {
|
|
155
|
+
usedPercent: Math.round(flash.usage),
|
|
156
|
+
resetsAt: flash.resetAt.toISOString()
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return { status: "ok", display, json: jsonData };
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
163
|
+
return { status: "error", display: `error: ${msg}`, json: { error: msg } };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function fetchCopilot(verbose) {
|
|
167
|
+
try {
|
|
168
|
+
const token = getCopilotToken();
|
|
169
|
+
if (!token) {
|
|
170
|
+
return {
|
|
171
|
+
status: "no-data",
|
|
172
|
+
display: "no data (set GITHUB_TOKEN or sign in with gh CLI)",
|
|
173
|
+
json: { error: null, data: null }
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const data = await fetchCopilotRateLimits({ token, timeoutSeconds: 10 });
|
|
177
|
+
if (!data) {
|
|
178
|
+
return { status: "no-data", display: "no data", json: { error: null, data: null } };
|
|
179
|
+
}
|
|
180
|
+
const usedPercent = Math.round(100 - data.percentRemaining);
|
|
181
|
+
const resetIn = formatResetIn(data.resetAt);
|
|
182
|
+
const display = `${usedPercent}% used (resets in ${resetIn})`;
|
|
183
|
+
if (verbose) {
|
|
184
|
+
process.stderr.write(`[verbose] copilot: percentRemaining=${data.percentRemaining} entitlement=${data.entitlement} resetAt=${data.resetAt.toISOString()}\n`);
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
status: "ok",
|
|
188
|
+
display,
|
|
189
|
+
json: {
|
|
190
|
+
usedPercent,
|
|
191
|
+
resetsAt: data.resetAt.toISOString(),
|
|
192
|
+
percentRemaining: data.percentRemaining,
|
|
193
|
+
entitlement: data.entitlement,
|
|
194
|
+
overageUsed: data.overageUsed,
|
|
195
|
+
overageEnabled: data.overageEnabled
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
201
|
+
return { status: "error", display: `error: ${msg}`, json: { error: msg } };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function fetchAmazonQ(verbose) {
|
|
205
|
+
try {
|
|
206
|
+
const statePathEnv = process.env.AMAZON_Q_STATE_PATH;
|
|
207
|
+
const statePath = statePathEnv
|
|
208
|
+
? statePathEnv
|
|
209
|
+
: resolveAmazonQUsageStatePath(os.homedir());
|
|
210
|
+
const monthlyLimit = 50;
|
|
211
|
+
const snapshot = fetchAmazonQRateLimits(statePath, monthlyLimit);
|
|
212
|
+
const display = `${snapshot.used}/${snapshot.limit} requests used`;
|
|
213
|
+
if (verbose) {
|
|
214
|
+
process.stderr.write(`[verbose] amazon-q: statePath=${statePath} used=${snapshot.used} limit=${snapshot.limit} period=${snapshot.periodKey}\n`);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
status: "ok",
|
|
218
|
+
display,
|
|
219
|
+
json: {
|
|
220
|
+
used: snapshot.used,
|
|
221
|
+
limit: snapshot.limit,
|
|
222
|
+
percentRemaining: snapshot.percentRemaining,
|
|
223
|
+
resetsAt: snapshot.resetAt.toISOString(),
|
|
224
|
+
periodKey: snapshot.periodKey
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
230
|
+
return { status: "error", display: `error: ${msg}`, json: { error: msg } };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function fetchCodex(verbose) {
|
|
234
|
+
try {
|
|
235
|
+
const snapshot = await fetchCodexRateLimits({ timeoutSeconds: 10 });
|
|
236
|
+
if (!snapshot) {
|
|
237
|
+
return { status: "no-data", display: "no data", json: { error: null, data: null } };
|
|
238
|
+
}
|
|
239
|
+
const status = rateLimitSnapshotToStatus(snapshot);
|
|
240
|
+
if (!status || status.windows.length === 0) {
|
|
241
|
+
return { status: "no-data", display: "no data", json: { error: null, data: null } };
|
|
242
|
+
}
|
|
243
|
+
// Use the shortest window (five-hour) as primary display metric
|
|
244
|
+
const win = status.windows.find((w) => w.key === "fiveHour") ?? status.windows[0];
|
|
245
|
+
if (!win) {
|
|
246
|
+
return { status: "no-data", display: "no data", json: { error: null, data: null } };
|
|
247
|
+
}
|
|
248
|
+
const usedPercent = Math.round(100 - win.percentLeft);
|
|
249
|
+
const resetIn = formatResetIn(win.resetAt);
|
|
250
|
+
const display = `${usedPercent}% used (resets in ${resetIn})`;
|
|
251
|
+
if (verbose) {
|
|
252
|
+
process.stderr.write(`[verbose] codex: windows=${JSON.stringify(status.windows)}\n`);
|
|
253
|
+
}
|
|
254
|
+
const jsonData = {
|
|
255
|
+
usedPercent,
|
|
256
|
+
resetsAt: win.resetAt.toISOString()
|
|
257
|
+
};
|
|
258
|
+
for (const w of status.windows) {
|
|
259
|
+
jsonData[w.key] = {
|
|
260
|
+
usedPercent: Math.round(100 - w.percentLeft),
|
|
261
|
+
resetsAt: w.resetAt.toISOString()
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return { status: "ok", display, json: jsonData };
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
268
|
+
return { status: "error", display: `error: ${msg}`, json: { error: msg } };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// All agents registry
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
const ALL_AGENTS = ["claude", "gemini", "copilot", "amazon-q", "codex"];
|
|
275
|
+
async function runAgent(name, verbose) {
|
|
276
|
+
switch (name) {
|
|
277
|
+
case "claude":
|
|
278
|
+
return fetchClaude(verbose);
|
|
279
|
+
case "gemini":
|
|
280
|
+
return fetchGemini(verbose);
|
|
281
|
+
case "copilot":
|
|
282
|
+
return fetchCopilot(verbose);
|
|
283
|
+
case "amazon-q":
|
|
284
|
+
return fetchAmazonQ(verbose);
|
|
285
|
+
case "codex":
|
|
286
|
+
return fetchCodex(verbose);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
// Output helpers
|
|
291
|
+
// ---------------------------------------------------------------------------
|
|
292
|
+
function padName(name) {
|
|
293
|
+
// Align to the longest agent name ("amazon-q") + colon = 9 chars, then 2 spaces
|
|
294
|
+
return (name + ":").padEnd(11);
|
|
295
|
+
}
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
// Main entry point
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
async function main() {
|
|
300
|
+
const args = process.argv.slice(2);
|
|
301
|
+
// --help / -h
|
|
302
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
303
|
+
const version = getVersion();
|
|
304
|
+
process.stdout.write(`ai-quota v${version}\n\n` +
|
|
305
|
+
"Usage:\n" +
|
|
306
|
+
" ai-quota [agent] Show quota for all agents, or a specific agent\n" +
|
|
307
|
+
" ai-quota --json Output machine-readable JSON\n" +
|
|
308
|
+
" ai-quota --quiet Suppress non-error output\n" +
|
|
309
|
+
" ai-quota --verbose Show extra debug info on stderr\n" +
|
|
310
|
+
" ai-quota --help Show this help message\n" +
|
|
311
|
+
" ai-quota --version Show version\n\n" +
|
|
312
|
+
"Agents: claude, gemini, copilot, amazon-q, codex\n\n" +
|
|
313
|
+
"Credentials:\n" +
|
|
314
|
+
" Claude: ~/.claude/.credentials.json\n" +
|
|
315
|
+
" Gemini: ~/.gemini/oauth_creds.json\n" +
|
|
316
|
+
" Copilot: GITHUB_TOKEN env var or gh CLI (~/.config/gh/hosts.yml)\n" +
|
|
317
|
+
" Amazon Q: AMAZON_Q_STATE_PATH env var (defaults to ~/agent-runner/state/)\n" +
|
|
318
|
+
" Codex: ~/.codex/sessions/ or ~/.codex/auth.json\n\n" +
|
|
319
|
+
"Examples:\n" +
|
|
320
|
+
" ai-quota\n" +
|
|
321
|
+
" ai-quota claude\n" +
|
|
322
|
+
" ai-quota --json\n" +
|
|
323
|
+
" ai-quota copilot --json\n");
|
|
324
|
+
process.exit(0);
|
|
325
|
+
}
|
|
326
|
+
// --version / -V
|
|
327
|
+
if (args.includes("--version") || args.includes("-V")) {
|
|
328
|
+
process.stdout.write(`${getVersion()}\n`);
|
|
329
|
+
process.exit(0);
|
|
330
|
+
}
|
|
331
|
+
const jsonMode = args.includes("--json");
|
|
332
|
+
const quiet = args.includes("--quiet");
|
|
333
|
+
const verbose = args.includes("--verbose");
|
|
334
|
+
// Collect positional agent names (everything not a flag)
|
|
335
|
+
const positional = args.filter((a) => !a.startsWith("--") && a !== "-h" && a !== "-V");
|
|
336
|
+
// Validate agent names
|
|
337
|
+
const requested = [];
|
|
338
|
+
for (const a of positional) {
|
|
339
|
+
if (!ALL_AGENTS.includes(a)) {
|
|
340
|
+
process.stderr.write(`ai-quota: unknown agent '${a}'. Valid agents: ${ALL_AGENTS.join(", ")}\n`);
|
|
341
|
+
process.exit(1);
|
|
342
|
+
}
|
|
343
|
+
requested.push(a);
|
|
344
|
+
}
|
|
345
|
+
const agentsToRun = requested.length > 0 ? requested : [...ALL_AGENTS];
|
|
346
|
+
// Run all fetchers in parallel
|
|
347
|
+
const results = await Promise.all(agentsToRun.map(async (name) => ({
|
|
348
|
+
name,
|
|
349
|
+
result: await runAgent(name, verbose)
|
|
350
|
+
})));
|
|
351
|
+
let anyError = false;
|
|
352
|
+
if (jsonMode) {
|
|
353
|
+
const out = {};
|
|
354
|
+
for (const { name, result } of results) {
|
|
355
|
+
out[name] = result.json;
|
|
356
|
+
if (result.status === "error")
|
|
357
|
+
anyError = true;
|
|
358
|
+
}
|
|
359
|
+
if (!quiet) {
|
|
360
|
+
process.stdout.write(JSON.stringify(out, null, 2) + "\n");
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
for (const { name, result } of results) {
|
|
365
|
+
if (result.status === "error")
|
|
366
|
+
anyError = true;
|
|
367
|
+
if (!quiet) {
|
|
368
|
+
process.stdout.write(`${padName(name)} ${result.display}\n`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
process.exit(anyError ? 1 : 0);
|
|
373
|
+
}
|
|
374
|
+
main().catch((err) => {
|
|
375
|
+
process.stderr.write(`ai-quota: fatal error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
376
|
+
process.exit(1);
|
|
377
|
+
});
|
|
378
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/codex.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RateLimitSnapshot } from "./types.js";
|
|
2
|
+
export type { RateLimitSnapshot, RateLimitWindow } from "./types.js";
|
|
3
|
+
export type UsageWindowKey = "fiveHour" | "weekly";
|
|
4
|
+
export type UsageWindow = {
|
|
5
|
+
key: UsageWindowKey;
|
|
6
|
+
label: string;
|
|
7
|
+
percentLeft: number;
|
|
8
|
+
resetAt: Date;
|
|
9
|
+
resetText: string;
|
|
10
|
+
};
|
|
11
|
+
export type CodexStatus = {
|
|
12
|
+
windows: UsageWindow[];
|
|
13
|
+
credits: number | null;
|
|
14
|
+
raw: string;
|
|
15
|
+
};
|
|
16
|
+
export type FetchCodexRateLimitsOptions = {
|
|
17
|
+
codexHome?: string;
|
|
18
|
+
timeoutSeconds?: number;
|
|
19
|
+
timingSink?: (phase: string, durationMs: number) => void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Converts a raw `RateLimitSnapshot` (from JSONL session files or the HTTP
|
|
23
|
+
* API) into a structured `CodexStatus` with labelled usage windows.
|
|
24
|
+
*/
|
|
25
|
+
export declare function rateLimitSnapshotToStatus(snapshot: RateLimitSnapshot, now?: Date): CodexStatus | null;
|
|
26
|
+
/**
|
|
27
|
+
* Fetches Codex (ChatGPT) rate limit data.
|
|
28
|
+
*
|
|
29
|
+
* Strategy (in order):
|
|
30
|
+
* 1. Read rate_limits from the most recent JSONL session file in
|
|
31
|
+
* `~/.codex/sessions/YYYY/MM/DD/*.jsonl` (last 7 days).
|
|
32
|
+
* 2. If no session data is found, call the ChatGPT backend API using the
|
|
33
|
+
* access token from `~/.codex/auth.json`.
|
|
34
|
+
*
|
|
35
|
+
* Returns null when no data source is available or all requests fail.
|
|
36
|
+
*/
|
|
37
|
+
export declare function fetchCodexRateLimits(options?: FetchCodexRateLimitsOptions): Promise<RateLimitSnapshot | null>;
|
|
38
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../src/codex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAErE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D,CAAC;AA4DF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,GAAE,IAAiB,GACrB,WAAW,GAAG,IAAI,CAwEpB;AAwND;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA6BnC"}
|