@metyatech/ai-quota 0.4.0 → 0.9.3

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 CHANGED
@@ -21,24 +21,75 @@ npx @metyatech/ai-quota
21
21
  ### Commands
22
22
 
23
23
  ```
24
- ai-quota [agent] Show quota for all agents, or a single named agent
25
- ai-quota --json Machine-readable JSON output
26
- ai-quota --quiet Suppress non-error output (useful in scripts)
27
- ai-quota --verbose Print debug info to stderr
28
- ai-quota --help Show usage information
29
- ai-quota --version Show version
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
  ```
37
- claude: 5h: 8% (resets in 1h 39m), 7d: 22% (resets in 140h 39m)
38
- gemini: Pro: 4% (resets in 14h 14m), Flash: 40% (resets in 14h 18m)
86
+ claude: 5h: 8% used (resets in 1h 39m), 7d: 22% used (resets in 5d 20h 39m)
87
+ gemini: pro: 4% used (resets in 14h 14m), flash: 40% used (resets in 14h 18m)
39
88
  copilot: 72% used (resets in 9d 11h)
40
- amazon-q: 0/50 requests used
41
- codex: 5h: 65% (resets in 3h), Weekly: 21% (resets in 6d)
89
+ amazon-q: 0/50 requests used (0% used, resets in 9d 14h)
90
+ codex: 5h: 65% used (resets in 3h), 7d: 21% used (resets in 6d)
91
+
92
+ Status: HEALTHY — All agents are within limits.
42
93
  ```
43
94
 
44
95
  ### JSON output example
@@ -59,39 +110,53 @@ ai-quota --json
59
110
 
60
111
  ### Credential lookup
61
112
 
62
- | Agent | Source |
63
- |-----------|------------------------------------------------------------------------|
64
- | Claude | `~/.claude/.credentials.json` |
65
- | Gemini | `~/.gemini/oauth_creds.json` |
66
- | Copilot | `GITHUB_TOKEN` env var, `gh auth token` CLI, or `hosts.yml` |
67
- | Amazon Q | `AMAZON_Q_STATE_PATH` env var (defaults to `~/agent-runner/state/`) |
68
- | Codex | `~/.codex/sessions/` JSONL files, or `~/.codex/auth.json` |
113
+ | Agent | Source |
114
+ | -------- | ------------------------------------------------------------------- |
115
+ | Claude | `~/.claude/.credentials.json` |
116
+ | Gemini | `~/.gemini/oauth_creds.json` |
117
+ | Copilot | `GITHUB_TOKEN` env var, `gh auth token` CLI, or `hosts.yml` |
118
+ | Amazon Q | `AMAZON_Q_STATE_PATH` env var (defaults to `~/agent-runner/state/`) |
119
+ | Codex | `~/.codex/sessions/` JSONL files, or `~/.codex/auth.json` |
69
120
 
70
121
  Exit code is `0` on success. Exit code `1` if any agent fetch fails.
71
122
 
72
123
  ### Advanced usage (SDK)
73
124
 
74
- To fetch quota for all agents at once in your TypeScript/JavaScript project:
125
+ To fetch quota for all agents at once:
75
126
 
76
127
  ```typescript
77
128
  import { fetchAllRateLimits } from "@metyatech/ai-quota";
78
129
 
79
130
  const all = await fetchAllRateLimits();
80
-
131
+ console.log("Overall status:", all.summary.status); // "healthy", "warning", or "critical"
132
+ console.log("Summary message:", all.summary.message);
81
133
  console.log("Claude status:", all.claude.display);
82
- console.log("Gemini Pro data:", all.gemini.data?.["gemini-3-pro-preview"]);
83
- console.log("Copilot status:", all.copilot.status); // "ok", "no-data", or "error"
134
+ ```
135
+
136
+ To fetch only specific agents (more efficient):
137
+
138
+ ```typescript
139
+ import { fetchAllRateLimits } from "@metyatech/ai-quota";
140
+
141
+ // Only fetch Claude and Copilot
142
+ const results = await fetchAllRateLimits({
143
+ agents: ["claude", "copilot"]
144
+ });
145
+
146
+ console.log(results.claude.display);
147
+ console.log(results.copilot.display);
148
+ console.log(results.gemini.display); // "skipped"
84
149
  ```
85
150
 
86
151
  ## Supported agents
87
152
 
88
- | Agent | Source | API type |
89
- |-----------|---------------------------------------------|-----------------------|
90
- | Claude | `~/.claude/.credentials.json` | REST (Anthropic OAuth)|
91
- | Gemini | `~/.gemini/oauth_creds.json` | REST (Google OAuth) |
92
- | Copilot | GitHub token (caller-provided) | REST (GitHub API) |
93
- | Amazon Q | Local JSON counter file | Local state (see note)|
94
- | Codex | JSONL session files / ChatGPT backend API | Local files + REST |
153
+ | Agent | Source | API type |
154
+ | -------- | ----------------------------------------- | ---------------------- |
155
+ | Claude | `~/.claude/.credentials.json` | REST (Anthropic OAuth) |
156
+ | Gemini | `~/.gemini/oauth_creds.json` | REST (Google OAuth) |
157
+ | Copilot | GitHub token (caller-provided) | REST (GitHub API) |
158
+ | Amazon Q | Local JSON counter file | Local state (see note) |
159
+ | Codex | JSONL session files / ChatGPT backend API | Local files + REST |
95
160
 
96
161
  > **Amazon Q limitation:** Amazon Q Developer (free tier) does not provide a public API for
97
162
  > querying usage or quota programmatically as of February 2026. There is no official AWS SDK
@@ -154,12 +219,12 @@ if (usage) {
154
219
 
155
220
  Options:
156
221
 
157
- | Option | Type | Default | Description |
158
- |------------------|----------|----------------------------|------------------------------------------|
159
- | `token` | `string` | required | GitHub personal access token |
160
- | `timeoutSeconds` | `number` | `20` | Request timeout in seconds |
161
- | `apiBaseUrl` | `string` | `https://api.github.com` | Override GitHub API base URL |
162
- | `apiVersion` | `string` | `2025-05-01` | GitHub API version header |
222
+ | Option | Type | Default | Description |
223
+ | ---------------- | -------- | ------------------------ | ---------------------------- |
224
+ | `token` | `string` | required | GitHub personal access token |
225
+ | `timeoutSeconds` | `number` | `20` | Request timeout in seconds |
226
+ | `apiBaseUrl` | `string` | `https://api.github.com` | Override GitHub API base URL |
227
+ | `apiVersion` | `string` | `2025-05-01` | GitHub API version header |
163
228
 
164
229
  ### Amazon Q
165
230
 
@@ -196,11 +261,11 @@ if (snapshot) {
196
261
 
197
262
  Options for `fetchCodexRateLimits`:
198
263
 
199
- | Option | Type | Default | Description |
200
- |------------------|------------|----------------|------------------------------------------|
201
- | `codexHome` | `string` | `~/.codex` | Path to the Codex home directory |
202
- | `timeoutSeconds` | `number` | `20` | HTTP API fallback timeout in seconds |
203
- | `timingSink` | `function` | none | Callback for per-phase timing (ms) |
264
+ | Option | Type | Default | Description |
265
+ | ---------------- | ---------- | ---------- | ------------------------------------ |
266
+ | `codexHome` | `string` | `~/.codex` | Path to the Codex home directory |
267
+ | `timeoutSeconds` | `number` | `20` | HTTP API fallback timeout in seconds |
268
+ | `timingSink` | `function` | none | Callback for per-phase timing (ms) |
204
269
 
205
270
  ## Dev commands
206
271
 
@@ -215,10 +280,10 @@ npm run verify # lint + test + build (full CI suite)
215
280
 
216
281
  ## Environment variables
217
282
 
218
- | Variable | Used by | Purpose |
219
- |---------------------------------------|---------|-------------------------------------------------|
220
- | `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_ID` | Gemini | Override OAuth client ID when Gemini CLI absent |
221
- | `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_SECRET` | Gemini | Override OAuth client secret |
283
+ | Variable | Used by | Purpose |
284
+ | ----------------------------------------- | ------- | ----------------------------------------------- |
285
+ | `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_ID` | Gemini | Override OAuth client ID when Gemini CLI absent |
286
+ | `AGENT_RUNNER_GEMINI_OAUTH_CLIENT_SECRET` | Gemini | Override OAuth client secret |
222
287
 
223
288
  ## SemVer policy
224
289
 
@@ -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
- * The `monthlyLimit` parameter is the configured monthly request limit
50
- * (e.g. 50 for the free tier). The snapshot's `percentRemaining` is
51
- * computed from `(limit - used) / limit * 100`.
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
@@ -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;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,IAAiB,GACrB,oBAAoB,CAatB"}
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
- * The `monthlyLimit` parameter is the configured monthly request limit
88
- * (e.g. 50 for the free tier). The snapshot's `percentRemaining` is
89
- * computed from `(limit - used) / limit * 100`.
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 ? 0 : Math.min(100, Math.max(0, ((monthlyLimit - used) / monthlyLimit) * 100));
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,
@@ -1 +1 @@
1
- {"version":3,"file":"amazon-q.js","sourceRoot":"","sources":["../src/amazon-q.ts"],"names":[],"mappings":"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"}
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
- * Returns null when credentials are unavailable, expired, or the request fails.
7
- * Credentials are read from `~/.claude/.credentials.json` (Claude desktop app format).
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
@@ -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;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkErG"}
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
- * Returns null when credentials are unavailable, expired, or the request fails.
39
- * Credentials are read from `~/.claude/.credentials.json` (Claude desktop app format).
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -3,71 +3,101 @@
3
3
  * ai-quota CLI
4
4
  */
5
5
  import { createRequire } from "node:module";
6
- import { fileURLToPath } from "node:url";
7
- import path from "node:path";
8
- import { fetchAllRateLimits } from "./index.js";
9
- function getVersion() {
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
+ "Output: {window}: {N}% used (resets in {time})\n" +
26
+ "Note: Percents are utilization (used), not remaining. Use --json for scripts.\n");
27
+ }
28
+ async function handleRecord(args) {
29
+ const target = args[0];
30
+ if (!target) {
31
+ process.stderr.write("Error: 'record' requires an agent name (e.g. 'ai-quota record amazon-q')\n");
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ if (target === "amazon-q") {
36
+ const statePath = resolveAmazonQUsageStatePath(os.homedir());
37
+ const newState = recordAmazonQUsage(statePath);
38
+ process.stdout.write(`Recorded usage for ${target}. Current total: ${newState.used} for ${newState.periodKey}\n`);
39
+ }
40
+ else {
41
+ process.stderr.write(`Error: Agent '${target}' does not support manual usage recording.\n`);
42
+ process.exitCode = 1;
43
+ }
44
+ }
24
45
  async function main() {
25
46
  const args = process.argv.slice(2);
26
47
  if (args.includes("--help") || args.includes("-h")) {
27
- process.stdout.write(`ai-quota v${getVersion()}\n\n` +
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");
48
+ showHelp();
35
49
  return;
36
50
  }
37
51
  if (args.includes("--version") || args.includes("-V")) {
38
52
  process.stdout.write(`${getVersion()}\n`);
39
53
  return;
40
54
  }
55
+ // Handle 'record' subcommand
56
+ if (args[0] === "record") {
57
+ await handleRecord(args.slice(1));
58
+ return;
59
+ }
60
+ if (args.includes("--mcp")) {
61
+ await runMcpServer();
62
+ return;
63
+ }
41
64
  const jsonMode = args.includes("--json");
42
65
  const quiet = args.includes("--quiet");
43
66
  const verbose = args.includes("--verbose");
44
- const requestedAgents = args.filter(a => !a.startsWith("-"));
45
- const allResults = await fetchAllRateLimits({ verbose, timeoutSeconds: 10 });
46
- const agentsToDisplay = (requestedAgents.length > 0
47
- ? requestedAgents
48
- : ["claude", "gemini", "copilot", "amazon-q", "codex"]);
67
+ const requestedAgents = args.filter((a) => !a.startsWith("-"));
68
+ const allResults = await fetchAllRateLimits({
69
+ agents: requestedAgents.length > 0 ? requestedAgents : undefined,
70
+ verbose,
71
+ timeoutSeconds: 10
72
+ });
73
+ const agentsToDisplay = (requestedAgents.length > 0 ? requestedAgents : [...SUPPORTED_AGENTS]);
49
74
  let anyError = false;
50
75
  const outputJson = {};
51
- for (const key of agentsToDisplay) {
52
- const res = allResults[key === "amazon-q" ? "amazonQ" : key];
76
+ for (const agent of agentsToDisplay) {
77
+ const sdkKey = agentToSdkKey(agent);
78
+ const res = allResults[sdkKey];
53
79
  if (!res)
54
80
  continue;
55
81
  if (res.status === "error")
56
82
  anyError = true;
57
83
  if (jsonMode) {
58
- outputJson[key] = res.data || { error: res.error };
84
+ outputJson[agent] = res.data || { error: res.error };
59
85
  }
60
86
  else if (!quiet) {
61
- process.stdout.write(`${padName(key)} ${res.display}\n`);
87
+ process.stdout.write(`${padName(agent)} ${res.display}\n`);
62
88
  }
63
89
  }
90
+ if (!jsonMode && !quiet) {
91
+ const status = allResults.summary.status.toUpperCase();
92
+ process.stdout.write(`\nStatus: ${status} — ${allResults.summary.message}\n`);
93
+ }
64
94
  if (jsonMode && !quiet) {
65
95
  process.stdout.write(JSON.stringify(outputJson, null, 2) + "\n");
66
96
  }
67
97
  if (anyError)
68
98
  process.exitCode = 1;
69
99
  }
70
- main().catch(err => {
100
+ main().catch((err) => {
71
101
  process.stderr.write(`ai-quota: fatal error: ${err}\n`);
72
102
  process.exitCode = 1;
73
103
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
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
- * 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`.
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
- * Returns null when no data source is available or all requests fail.
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
@@ -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;AA6MD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA6BnC"}
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
@@ -106,7 +106,7 @@ export function rateLimitSnapshotToStatus(snapshot, now = new Date()) {
106
106
  if (weeklyCandidate?.data.resetAt) {
107
107
  windows.push({
108
108
  key: "weekly",
109
- label: "Weekly",
109
+ label: "7d",
110
110
  percentLeft: clampPercent(100 - weeklyCandidate.data.usedPercent),
111
111
  resetAt: weeklyCandidate.data.resetAt,
112
112
  resetText: weeklyCandidate.data.resetAt.toISOString()
@@ -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 ?? w.resetsAt ?? (typeof w.resets_in_seconds === "number" ? Math.floor(now.getTime() / 1000) + w.resets_in_seconds : null)
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
- * Strategy (in order):
285
- * 1. Read rate_limits from the most recent JSONL session file in
286
- * `~/.codex/sessions/YYYY/MM/DD/*.jsonl` (last 7 days).
287
- * 2. If no session data is found, call the ChatGPT backend API using the
288
- * access token from `~/.codex/auth.json`.
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
- * Returns null when no data source is available or all requests fail.
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();