@metyatech/ai-quota 0.4.0 → 0.9.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 +102 -39
- package/dist/amazon-q.d.ts +13 -4
- package/dist/amazon-q.d.ts.map +1 -1
- package/dist/amazon-q.js +16 -5
- package/dist/amazon-q.js.map +1 -1
- package/dist/claude.d.ts +6 -2
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +6 -2
- package/dist/claude.js.map +1 -1
- package/dist/cli.js +57 -33
- package/dist/cli.js.map +1 -1
- package/dist/codex.d.ts +7 -6
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +13 -8
- package/dist/codex.js.map +1 -1
- package/dist/copilot.d.ts +15 -3
- package/dist/copilot.d.ts.map +1 -1
- package/dist/copilot.js +15 -3
- package/dist/copilot.js.map +1 -1
- package/dist/gemini.d.ts +7 -5
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +26 -23
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts +24 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -67
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +25 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +134 -0
- package/dist/mcp.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +12 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +39 -0
- package/dist/utils.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -21,16 +21,65 @@ npx @metyatech/ai-quota
|
|
|
21
21
|
### Commands
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
ai-quota [agent]
|
|
25
|
-
ai-quota
|
|
26
|
-
ai-quota --
|
|
27
|
-
ai-quota --
|
|
28
|
-
ai-quota --
|
|
29
|
-
ai-quota --
|
|
24
|
+
ai-quota [agent] Show quota for all agents, or a single named agent
|
|
25
|
+
ai-quota record [agent] Record usage for agents with local tracking (e.g. amazon-q)
|
|
26
|
+
ai-quota --json Machine-readable JSON output
|
|
27
|
+
ai-quota --mcp Start as an MCP server
|
|
28
|
+
ai-quota --quiet Suppress non-error output (useful in scripts)
|
|
29
|
+
ai-quota --verbose Print debug info to stderr
|
|
30
|
+
ai-quota --help Show usage information
|
|
31
|
+
ai-quota --version Show version
|
|
30
32
|
```
|
|
31
33
|
|
|
32
34
|
Supported agent names: `claude`, `gemini`, `copilot`, `amazon-q`, `codex`
|
|
33
35
|
|
|
36
|
+
### Usage Examples
|
|
37
|
+
|
|
38
|
+
**Check all quotas:**
|
|
39
|
+
```bash
|
|
40
|
+
ai-quota
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Record Amazon Q usage (+1 request):**
|
|
44
|
+
```bash
|
|
45
|
+
ai-quota record amazon-q
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Model Context Protocol (MCP)
|
|
49
|
+
|
|
50
|
+
`ai-quota` can act as an MCP server, allowing AI agents (like Claude Desktop) to check your
|
|
51
|
+
remaining quota automatically.
|
|
52
|
+
|
|
53
|
+
### Setup for Claude Desktop
|
|
54
|
+
|
|
55
|
+
Add the following to your `claude_desktop_config.json`:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"mcpServers": {
|
|
60
|
+
"ai-quota": {
|
|
61
|
+
"command": "npx",
|
|
62
|
+
"args": ["-y", "@metyatech/ai-quota", "--mcp"]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
This exposes the `get_quota` tool to Claude, which it can use to stay aware of its own usage
|
|
69
|
+
limits across different models and providers.
|
|
70
|
+
|
|
71
|
+
### MCP Resources
|
|
72
|
+
|
|
73
|
+
`ai-quota` also provides an MCP resource:
|
|
74
|
+
- **URI:** `quota://current`
|
|
75
|
+
- **Description:** A live, auto-updating Markdown table of all current AI agent quotas.
|
|
76
|
+
|
|
77
|
+
AI agents can "subscribe" to this resource to keep the quota information in their context
|
|
78
|
+
without needing to explicitly call a tool.
|
|
79
|
+
|
|
80
|
+
**Tool: `get_quota`**
|
|
81
|
+
- `agent` (optional): Specific agent to check (`claude`, `gemini`, etc.). If omitted, returns quota for all agents in a Markdown table.
|
|
82
|
+
|
|
34
83
|
### Human-readable output example
|
|
35
84
|
|
|
36
85
|
```
|
|
@@ -59,39 +108,53 @@ ai-quota --json
|
|
|
59
108
|
|
|
60
109
|
### Credential lookup
|
|
61
110
|
|
|
62
|
-
| Agent
|
|
63
|
-
|
|
64
|
-
| Claude
|
|
65
|
-
| Gemini
|
|
66
|
-
| Copilot
|
|
67
|
-
| Amazon Q
|
|
68
|
-
| Codex
|
|
111
|
+
| Agent | Source |
|
|
112
|
+
| -------- | ------------------------------------------------------------------- |
|
|
113
|
+
| Claude | `~/.claude/.credentials.json` |
|
|
114
|
+
| Gemini | `~/.gemini/oauth_creds.json` |
|
|
115
|
+
| Copilot | `GITHUB_TOKEN` env var, `gh auth token` CLI, or `hosts.yml` |
|
|
116
|
+
| Amazon Q | `AMAZON_Q_STATE_PATH` env var (defaults to `~/agent-runner/state/`) |
|
|
117
|
+
| Codex | `~/.codex/sessions/` JSONL files, or `~/.codex/auth.json` |
|
|
69
118
|
|
|
70
119
|
Exit code is `0` on success. Exit code `1` if any agent fetch fails.
|
|
71
120
|
|
|
72
121
|
### Advanced usage (SDK)
|
|
73
122
|
|
|
74
|
-
To fetch quota for all agents at once
|
|
123
|
+
To fetch quota for all agents at once:
|
|
75
124
|
|
|
76
125
|
```typescript
|
|
77
126
|
import { fetchAllRateLimits } from "@metyatech/ai-quota";
|
|
78
127
|
|
|
79
128
|
const all = await fetchAllRateLimits();
|
|
80
|
-
|
|
129
|
+
console.log("Overall status:", all.summary.status); // "healthy", "warning", or "critical"
|
|
130
|
+
console.log("Summary message:", all.summary.message);
|
|
81
131
|
console.log("Claude status:", all.claude.display);
|
|
82
|
-
|
|
83
|
-
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
To fetch only specific agents (more efficient):
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { fetchAllRateLimits } from "@metyatech/ai-quota";
|
|
138
|
+
|
|
139
|
+
// Only fetch Claude and Copilot
|
|
140
|
+
const results = await fetchAllRateLimits({
|
|
141
|
+
agents: ["claude", "copilot"]
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
console.log(results.claude.display);
|
|
145
|
+
console.log(results.copilot.display);
|
|
146
|
+
console.log(results.gemini.display); // "skipped"
|
|
84
147
|
```
|
|
85
148
|
|
|
86
149
|
## Supported agents
|
|
87
150
|
|
|
88
|
-
| Agent
|
|
89
|
-
|
|
90
|
-
| Claude
|
|
91
|
-
| Gemini
|
|
92
|
-
| Copilot
|
|
93
|
-
| Amazon Q
|
|
94
|
-
| Codex
|
|
151
|
+
| Agent | Source | API type |
|
|
152
|
+
| -------- | ----------------------------------------- | ---------------------- |
|
|
153
|
+
| Claude | `~/.claude/.credentials.json` | REST (Anthropic OAuth) |
|
|
154
|
+
| Gemini | `~/.gemini/oauth_creds.json` | REST (Google OAuth) |
|
|
155
|
+
| Copilot | GitHub token (caller-provided) | REST (GitHub API) |
|
|
156
|
+
| Amazon Q | Local JSON counter file | Local state (see note) |
|
|
157
|
+
| Codex | JSONL session files / ChatGPT backend API | Local files + REST |
|
|
95
158
|
|
|
96
159
|
> **Amazon Q limitation:** Amazon Q Developer (free tier) does not provide a public API for
|
|
97
160
|
> querying usage or quota programmatically as of February 2026. There is no official AWS SDK
|
|
@@ -154,12 +217,12 @@ if (usage) {
|
|
|
154
217
|
|
|
155
218
|
Options:
|
|
156
219
|
|
|
157
|
-
| Option | Type | Default
|
|
158
|
-
|
|
159
|
-
| `token` | `string` | required
|
|
160
|
-
| `timeoutSeconds` | `number` | `20`
|
|
161
|
-
| `apiBaseUrl` | `string` | `https://api.github.com`
|
|
162
|
-
| `apiVersion` | `string` | `2025-05-01`
|
|
220
|
+
| Option | Type | Default | Description |
|
|
221
|
+
| ---------------- | -------- | ------------------------ | ---------------------------- |
|
|
222
|
+
| `token` | `string` | required | GitHub personal access token |
|
|
223
|
+
| `timeoutSeconds` | `number` | `20` | Request timeout in seconds |
|
|
224
|
+
| `apiBaseUrl` | `string` | `https://api.github.com` | Override GitHub API base URL |
|
|
225
|
+
| `apiVersion` | `string` | `2025-05-01` | GitHub API version header |
|
|
163
226
|
|
|
164
227
|
### Amazon Q
|
|
165
228
|
|
|
@@ -196,11 +259,11 @@ if (snapshot) {
|
|
|
196
259
|
|
|
197
260
|
Options for `fetchCodexRateLimits`:
|
|
198
261
|
|
|
199
|
-
| Option | Type | Default
|
|
200
|
-
|
|
201
|
-
| `codexHome` | `string` | `~/.codex`
|
|
202
|
-
| `timeoutSeconds` | `number` | `20`
|
|
203
|
-
| `timingSink` | `function` | none
|
|
262
|
+
| Option | Type | Default | Description |
|
|
263
|
+
| ---------------- | ---------- | ---------- | ------------------------------------ |
|
|
264
|
+
| `codexHome` | `string` | `~/.codex` | Path to the Codex home directory |
|
|
265
|
+
| `timeoutSeconds` | `number` | `20` | HTTP API fallback timeout in seconds |
|
|
266
|
+
| `timingSink` | `function` | none | Callback for per-phase timing (ms) |
|
|
204
267
|
|
|
205
268
|
## Dev commands
|
|
206
269
|
|
|
@@ -215,10 +278,10 @@ npm run verify # lint + test + build (full CI suite)
|
|
|
215
278
|
|
|
216
279
|
## Environment variables
|
|
217
280
|
|
|
218
|
-
| Variable
|
|
219
|
-
|
|
220
|
-
| `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_ID`
|
|
221
|
-
| `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_SECRET` | Gemini
|
|
281
|
+
| Variable | Used by | Purpose |
|
|
282
|
+
| ----------------------------------------- | ------- | ----------------------------------------------- |
|
|
283
|
+
| `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_ID` | Gemini | Override OAuth client ID when Gemini CLI absent |
|
|
284
|
+
| `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_SECRET` | Gemini | Override OAuth client secret |
|
|
222
285
|
|
|
223
286
|
## SemVer policy
|
|
224
287
|
|
package/dist/amazon-q.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { AmazonQUsageSnapshot } from "./types.js";
|
|
2
2
|
export type { AmazonQUsageSnapshot } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Default monthly request limit for the Amazon Q Developer free tier.
|
|
5
|
+
* As of February 2026, this is 50 requests per month.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_AMAZON_Q_MONTHLY_LIMIT = 50;
|
|
3
8
|
/**
|
|
4
9
|
* NOTE: Amazon Q Developer (free tier) does not provide a public API for
|
|
5
10
|
* querying usage or quota programmatically (as of February 2026). There is
|
|
@@ -44,11 +49,15 @@ export declare function saveAmazonQUsageState(statePath: string, state: AmazonQU
|
|
|
44
49
|
*/
|
|
45
50
|
export declare function recordAmazonQUsage(statePath: string, count?: number, now?: Date): AmazonQUsageState;
|
|
46
51
|
/**
|
|
47
|
-
* Reads the local counter and returns a quota snapshot.
|
|
52
|
+
* Reads the local counter and returns a quota snapshot for Amazon Q Developer.
|
|
53
|
+
*
|
|
54
|
+
* Since Amazon Q does not provide a public usage API, this function relies
|
|
55
|
+
* on a local JSON state file updated by the calling application.
|
|
48
56
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
57
|
+
* @param statePath - Path to the local usage state JSON file
|
|
58
|
+
* @param monthlyLimit - The configured monthly request limit (e.g., 50)
|
|
59
|
+
* @param now - Reference date for parsing (default: current system time)
|
|
60
|
+
* @returns A snapshot of the current local usage counter
|
|
52
61
|
*/
|
|
53
62
|
export declare function fetchAmazonQRateLimits(statePath: string, monthlyLimit: number, now?: Date): AmazonQUsageSnapshot;
|
|
54
63
|
//# sourceMappingURL=amazon-q.d.ts.map
|
package/dist/amazon-q.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amazon-q.d.ts","sourceRoot":"","sources":["../src/amazon-q.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AAEH,KAAK,iBAAiB,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAiBF;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,IAAiB,GACrB,iBAAiB,CAkCnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAGvF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAU,EACjB,GAAG,GAAE,IAAiB,GACrB,iBAAiB,CAUnB;AAED
|
|
1
|
+
{"version":3,"file":"amazon-q.d.ts","sourceRoot":"","sources":["../src/amazon-q.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AAEH,KAAK,iBAAiB,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAiBF;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,IAAiB,GACrB,iBAAiB,CAkCnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAGvF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAU,EACjB,GAAG,GAAE,IAAiB,GACrB,iBAAiB,CAUnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,IAAiB,GACrB,oBAAoB,CAetB"}
|
package/dist/amazon-q.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Default monthly request limit for the Amazon Q Developer free tier.
|
|
5
|
+
* As of February 2026, this is 50 requests per month.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_AMAZON_Q_MONTHLY_LIMIT = 50;
|
|
3
8
|
function resolveMonthlyPeriodKey(now) {
|
|
4
9
|
const year = now.getUTCFullYear();
|
|
5
10
|
const month = now.getUTCMonth() + 1;
|
|
@@ -82,16 +87,22 @@ export function recordAmazonQUsage(statePath, count = 1, now = new Date()) {
|
|
|
82
87
|
return updated;
|
|
83
88
|
}
|
|
84
89
|
/**
|
|
85
|
-
* Reads the local counter and returns a quota snapshot.
|
|
90
|
+
* Reads the local counter and returns a quota snapshot for Amazon Q Developer.
|
|
91
|
+
*
|
|
92
|
+
* Since Amazon Q does not provide a public usage API, this function relies
|
|
93
|
+
* on a local JSON state file updated by the calling application.
|
|
86
94
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
95
|
+
* @param statePath - Path to the local usage state JSON file
|
|
96
|
+
* @param monthlyLimit - The configured monthly request limit (e.g., 50)
|
|
97
|
+
* @param now - Reference date for parsing (default: current system time)
|
|
98
|
+
* @returns A snapshot of the current local usage counter
|
|
90
99
|
*/
|
|
91
100
|
export function fetchAmazonQRateLimits(statePath, monthlyLimit, now = new Date()) {
|
|
92
101
|
const state = loadAmazonQUsageState(statePath, now);
|
|
93
102
|
const used = Math.max(0, state.used);
|
|
94
|
-
const percentRemaining = monthlyLimit <= 0
|
|
103
|
+
const percentRemaining = monthlyLimit <= 0
|
|
104
|
+
? 0
|
|
105
|
+
: Math.min(100, Math.max(0, ((monthlyLimit - used) / monthlyLimit) * 100));
|
|
95
106
|
return {
|
|
96
107
|
used,
|
|
97
108
|
limit: monthlyLimit,
|
package/dist/amazon-q.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amazon-q.js","sourceRoot":"","sources":["../src/amazon-q.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"amazon-q.js","sourceRoot":"","sources":["../src/amazon-q.ts"],"names":[],"mappings":"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"}
|
package/dist/claude.d.ts
CHANGED
|
@@ -3,8 +3,12 @@ export type { ClaudeUsageData, ClaudeUsageBucket } from "./types.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Fetches Claude usage data from the Anthropic OAuth usage API.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* This function attempts to read credentials from the Claude desktop application's
|
|
7
|
+
* local storage (`~/.claude/.credentials.json`) and calls the Anthropic usage API.
|
|
8
|
+
*
|
|
9
|
+
* @param timeoutMs - Request timeout in milliseconds (default: 5000ms)
|
|
10
|
+
* @returns A promise resolving to ClaudeUsageData or null if credentials are
|
|
11
|
+
* missing, expired, or the API request fails.
|
|
8
12
|
*/
|
|
9
13
|
export declare function fetchClaudeRateLimits(timeoutMs?: number): Promise<ClaudeUsageData | null>;
|
|
10
14
|
//# sourceMappingURL=claude.d.ts.map
|
package/dist/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAiCrE
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAiCrE;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkEjC"}
|
package/dist/claude.js
CHANGED
|
@@ -35,8 +35,12 @@ function readClaudeCredentials() {
|
|
|
35
35
|
/**
|
|
36
36
|
* Fetches Claude usage data from the Anthropic OAuth usage API.
|
|
37
37
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
38
|
+
* This function attempts to read credentials from the Claude desktop application's
|
|
39
|
+
* local storage (`~/.claude/.credentials.json`) and calls the Anthropic usage API.
|
|
40
|
+
*
|
|
41
|
+
* @param timeoutMs - Request timeout in milliseconds (default: 5000ms)
|
|
42
|
+
* @returns A promise resolving to ClaudeUsageData or null if credentials are
|
|
43
|
+
* missing, expired, or the API request fails.
|
|
40
44
|
*/
|
|
41
45
|
export async function fetchClaudeRateLimits(timeoutMs = 5000) {
|
|
42
46
|
try {
|
package/dist/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,mBAAmB,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,WAAW,GAAG,KAAgC,CAAC;QACrD,MAAM,WAAW,GACf,OAAO,WAAW,CAAC,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC/E,CAAC,CAAC,WAAW,CAAC,WAAW;YACzB,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,SAAS,GACb,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;YACjF,CAAC,CAAC,WAAW,CAAC,SAAS;YACvB,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,WAAW,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -3,62 +3,86 @@
|
|
|
3
3
|
* ai-quota CLI
|
|
4
4
|
*/
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
const require = createRequire(import.meta.url);
|
|
12
|
-
const dir = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
-
const pkgPath = path.resolve(dir, "..", "package.json");
|
|
14
|
-
const pkg = require(pkgPath);
|
|
15
|
-
return pkg.version ?? "0.0.0";
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return "0.0.0";
|
|
19
|
-
}
|
|
20
|
-
}
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import { fetchAllRateLimits, runMcpServer, SUPPORTED_AGENTS, agentToSdkKey, recordAmazonQUsage, resolveAmazonQUsageStatePath } from "./index.js";
|
|
8
|
+
import { getVersion } from "./utils.js";
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
21
10
|
function padName(name) {
|
|
22
11
|
return (name + ":").padEnd(11);
|
|
23
12
|
}
|
|
13
|
+
function showHelp() {
|
|
14
|
+
process.stdout.write(`ai-quota v${getVersion()}\n\n` +
|
|
15
|
+
"Usage:\n" +
|
|
16
|
+
" ai-quota [agent] Show quota for all agents, or a specific agent\n" +
|
|
17
|
+
" ai-quota record [agent] Record usage for agents that require local tracking (e.g. amazon-q)\n" +
|
|
18
|
+
" ai-quota --json Output machine-readable JSON\n" +
|
|
19
|
+
" ai-quota --mcp Start as an MCP server\n" +
|
|
20
|
+
" ai-quota --quiet Suppress non-error output\n" +
|
|
21
|
+
" ai-quota --verbose Show extra debug info on stderr\n" +
|
|
22
|
+
" ai-quota --help Show this help message\n" +
|
|
23
|
+
" ai-quota --version Show version\n\n" +
|
|
24
|
+
"Agents: " + SUPPORTED_AGENTS.join(", ") + "\n");
|
|
25
|
+
}
|
|
26
|
+
async function handleRecord(args) {
|
|
27
|
+
const target = args[0];
|
|
28
|
+
if (!target) {
|
|
29
|
+
process.stderr.write("Error: 'record' requires an agent name (e.g. 'ai-quota record amazon-q')\n");
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (target === "amazon-q") {
|
|
34
|
+
const statePath = resolveAmazonQUsageStatePath(os.homedir());
|
|
35
|
+
const newState = recordAmazonQUsage(statePath);
|
|
36
|
+
process.stdout.write(`Recorded usage for ${target}. Current total: ${newState.used} for ${newState.periodKey}\n`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
process.stderr.write(`Error: Agent '${target}' does not support manual usage recording.\n`);
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
24
43
|
async function main() {
|
|
25
44
|
const args = process.argv.slice(2);
|
|
26
45
|
if (args.includes("--help") || args.includes("-h")) {
|
|
27
|
-
|
|
28
|
-
"Usage:\n" +
|
|
29
|
-
" ai-quota [agent] Show quota for all agents, or a specific agent\n" +
|
|
30
|
-
" ai-quota --json Output machine-readable JSON\n" +
|
|
31
|
-
" ai-quota --quiet Suppress non-error output\n" +
|
|
32
|
-
" ai-quota --verbose Show extra debug info on stderr\n" +
|
|
33
|
-
" ai-quota --help Show this help message\n" +
|
|
34
|
-
" ai-quota --version Show version\n");
|
|
46
|
+
showHelp();
|
|
35
47
|
return;
|
|
36
48
|
}
|
|
37
49
|
if (args.includes("--version") || args.includes("-V")) {
|
|
38
50
|
process.stdout.write(`${getVersion()}\n`);
|
|
39
51
|
return;
|
|
40
52
|
}
|
|
53
|
+
// Handle 'record' subcommand
|
|
54
|
+
if (args[0] === "record") {
|
|
55
|
+
await handleRecord(args.slice(1));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (args.includes("--mcp")) {
|
|
59
|
+
await runMcpServer();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
41
62
|
const jsonMode = args.includes("--json");
|
|
42
63
|
const quiet = args.includes("--quiet");
|
|
43
64
|
const verbose = args.includes("--verbose");
|
|
44
|
-
const requestedAgents = args.filter(a => !a.startsWith("-"));
|
|
45
|
-
const allResults = await fetchAllRateLimits({
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
:
|
|
65
|
+
const requestedAgents = args.filter((a) => !a.startsWith("-"));
|
|
66
|
+
const allResults = await fetchAllRateLimits({
|
|
67
|
+
agents: requestedAgents.length > 0 ? requestedAgents : undefined,
|
|
68
|
+
verbose,
|
|
69
|
+
timeoutSeconds: 10
|
|
70
|
+
});
|
|
71
|
+
const agentsToDisplay = (requestedAgents.length > 0 ? requestedAgents : [...SUPPORTED_AGENTS]);
|
|
49
72
|
let anyError = false;
|
|
50
73
|
const outputJson = {};
|
|
51
|
-
for (const
|
|
52
|
-
const
|
|
74
|
+
for (const agent of agentsToDisplay) {
|
|
75
|
+
const sdkKey = agentToSdkKey(agent);
|
|
76
|
+
const res = allResults[sdkKey];
|
|
53
77
|
if (!res)
|
|
54
78
|
continue;
|
|
55
79
|
if (res.status === "error")
|
|
56
80
|
anyError = true;
|
|
57
81
|
if (jsonMode) {
|
|
58
|
-
outputJson[
|
|
82
|
+
outputJson[agent] = res.data || { error: res.error };
|
|
59
83
|
}
|
|
60
84
|
else if (!quiet) {
|
|
61
|
-
process.stdout.write(`${padName(
|
|
85
|
+
process.stdout.write(`${padName(agent)} ${res.display}\n`);
|
|
62
86
|
}
|
|
63
87
|
}
|
|
64
88
|
if (jsonMode && !quiet) {
|
|
@@ -67,7 +91,7 @@ async function main() {
|
|
|
67
91
|
if (anyError)
|
|
68
92
|
process.exitCode = 1;
|
|
69
93
|
}
|
|
70
|
-
main().catch(err => {
|
|
94
|
+
main().catch((err) => {
|
|
71
95
|
process.stderr.write(`ai-quota: fatal error: ${err}\n`);
|
|
72
96
|
process.exitCode = 1;
|
|
73
97
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/codex.d.ts
CHANGED
|
@@ -26,13 +26,14 @@ export declare function rateLimitSnapshotToStatus(snapshot: RateLimitSnapshot, n
|
|
|
26
26
|
/**
|
|
27
27
|
* Fetches Codex (ChatGPT) rate limit data.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
* 1.
|
|
31
|
-
*
|
|
32
|
-
* 2. If no session data is found, call the ChatGPT backend API
|
|
33
|
-
* access token
|
|
29
|
+
* This function uses a prioritized strategy to find usage data:
|
|
30
|
+
* 1. Reads the most recent JSONL session file from `~/.codex/sessions/`.
|
|
31
|
+
* This is the fastest method and handles both modern and legacy log formats.
|
|
32
|
+
* 2. If no session data is found, it attempts to call the ChatGPT backend API
|
|
33
|
+
* using the access token found in `~/.codex/auth.json`.
|
|
34
34
|
*
|
|
35
|
-
*
|
|
35
|
+
* @param options - Configuration for file paths and timeouts
|
|
36
|
+
* @returns A promise resolving to a RateLimitSnapshot or null if no source is available
|
|
36
37
|
*/
|
|
37
38
|
export declare function fetchCodexRateLimits(options?: FetchCodexRateLimitsOptions): Promise<RateLimitSnapshot | null>;
|
|
38
39
|
//# sourceMappingURL=codex.d.ts.map
|
package/dist/codex.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAiND;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAyBnC"}
|
package/dist/codex.js
CHANGED
|
@@ -130,7 +130,11 @@ function convertJsonlRateLimits(entry, now) {
|
|
|
130
130
|
return {
|
|
131
131
|
used_percent: used,
|
|
132
132
|
window_minutes: w.window_minutes ?? w.window_duration_minutes ?? w.windowDurationMins ?? null,
|
|
133
|
-
resets_at: w.resets_at ??
|
|
133
|
+
resets_at: w.resets_at ??
|
|
134
|
+
w.resetsAt ??
|
|
135
|
+
(typeof w.resets_in_seconds === "number"
|
|
136
|
+
? Math.floor(now.getTime() / 1000) + w.resets_in_seconds
|
|
137
|
+
: null)
|
|
134
138
|
};
|
|
135
139
|
};
|
|
136
140
|
return {
|
|
@@ -188,7 +192,7 @@ async function readCodexRateLimitsFromSessions(codexHome, now) {
|
|
|
188
192
|
const payload = obj.payload;
|
|
189
193
|
if (!payload || payload.type !== "token_count")
|
|
190
194
|
continue;
|
|
191
|
-
const rateLimits = payload.info?.rate_limits;
|
|
195
|
+
const rateLimits = payload.rate_limits ?? payload.info?.rate_limits;
|
|
192
196
|
if (!rateLimits)
|
|
193
197
|
continue;
|
|
194
198
|
const result = convertJsonlRateLimits(rateLimits, now);
|
|
@@ -281,13 +285,14 @@ async function fetchCodexRateLimitsFromApi(codexHome, timeoutMs, timingSink) {
|
|
|
281
285
|
/**
|
|
282
286
|
* Fetches Codex (ChatGPT) rate limit data.
|
|
283
287
|
*
|
|
284
|
-
*
|
|
285
|
-
* 1.
|
|
286
|
-
*
|
|
287
|
-
* 2. If no session data is found, call the ChatGPT backend API
|
|
288
|
-
* access token
|
|
288
|
+
* This function uses a prioritized strategy to find usage data:
|
|
289
|
+
* 1. Reads the most recent JSONL session file from `~/.codex/sessions/`.
|
|
290
|
+
* This is the fastest method and handles both modern and legacy log formats.
|
|
291
|
+
* 2. If no session data is found, it attempts to call the ChatGPT backend API
|
|
292
|
+
* using the access token found in `~/.codex/auth.json`.
|
|
289
293
|
*
|
|
290
|
-
*
|
|
294
|
+
* @param options - Configuration for file paths and timeouts
|
|
295
|
+
* @returns A promise resolving to a RateLimitSnapshot or null if no source is available
|
|
291
296
|
*/
|
|
292
297
|
export async function fetchCodexRateLimits(options) {
|
|
293
298
|
const totalStart = Date.now();
|