claudemon 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -58,7 +58,7 @@ Config file: `~/.config/claudemon/config.toml`
58
58
  | Key | Type | Default | Description |
59
59
  |-----|------|---------|-------------|
60
60
  | `plan_type` | string | `"pro"` | Claude plan type (`pro` or `max`) |
61
- | `refresh_interval` | number | `5` | Auto-refresh interval in seconds |
61
+ | `refresh_interval` | number | `30` | Auto-refresh interval in seconds |
62
62
 
63
63
  <details>
64
64
  <summary>Advanced OAuth settings (usually no need to change)</summary>
package/dist/api.d.ts CHANGED
@@ -8,6 +8,10 @@ export declare class QuotaFetchError extends Error {
8
8
  export declare class AuthenticationError extends QuotaFetchError {
9
9
  constructor(message: string);
10
10
  }
11
+ export declare class RateLimitError extends QuotaFetchError {
12
+ retryAfterMs: number;
13
+ constructor(retryAfterMs: number);
14
+ }
11
15
  export declare function fetchQuota(oauthToken: string): Promise<QuotaData>;
12
16
  /**
13
17
  * Quick health-check: verifies that an OAuth token exists and is accepted
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,SAAS,EAAmB,MAAM,aAAa,CAAC;AAG/E,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuCvE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAC5C;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAC7C,CAmDA"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,SAAS,EAAmB,MAAM,aAAa,CAAC;AAG/E,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,cAAe,SAAQ,eAAe;IACjD,YAAY,EAAE,MAAM,CAAC;gBACT,YAAY,EAAE,MAAM;CAOjC;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA8CvE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAC5C;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAC7C,CAmDA"}
package/dist/api.js CHANGED
@@ -15,6 +15,14 @@ export class AuthenticationError extends QuotaFetchError {
15
15
  this.name = "AuthenticationError";
16
16
  }
17
17
  }
18
+ export class RateLimitError extends QuotaFetchError {
19
+ retryAfterMs;
20
+ constructor(retryAfterMs) {
21
+ super(`Rate limited. Retry after ${Math.ceil(retryAfterMs / 1000)} seconds.`);
22
+ this.name = "RateLimitError";
23
+ this.retryAfterMs = retryAfterMs;
24
+ }
25
+ }
18
26
  export async function fetchQuota(oauthToken) {
19
27
  const config = loadConfig();
20
28
  const usageUrl = config["oauth_usage_url"];
@@ -39,6 +47,13 @@ export async function fetchQuota(oauthToken) {
39
47
  if (resp.status === 403) {
40
48
  throw new AuthenticationError("Access denied. Your token may lack the required permissions.");
41
49
  }
50
+ if (resp.status === 429) {
51
+ const retryAfter = resp.headers.get("retry-after");
52
+ const retryMs = retryAfter
53
+ ? Number(retryAfter) * 1000
54
+ : 60_000; // default 60s if no header
55
+ throw new RateLimitError(retryMs);
56
+ }
42
57
  if (resp.status !== 200) {
43
58
  const text = await resp.text();
44
59
  throw new QuotaFetchError(`API returned status ${resp.status}: ${text}`);
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAaxE,UAAU,QAAQ;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,GAAG,CAAC,EAAE,OAAY,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,YAAY,CA6KlE"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAaxE,UAAU,QAAQ;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,GAAG,CAAC,EAAE,OAAY,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,YAAY,CAoLlE"}
package/dist/app.js CHANGED
@@ -4,7 +4,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  */
5
5
  import { useCallback, useEffect, useRef, useState } from "react";
6
6
  import { Box, Text, useApp, useInput, useStdout } from "ink";
7
- import { fetchQuota, AuthenticationError, QuotaFetchError } from "./api.js";
7
+ import { fetchQuota, AuthenticationError, QuotaFetchError, RateLimitError } from "./api.js";
8
8
  import { getValidOAuthToken, isAuthenticated } from "./auth.js";
9
9
  import { loadConfig } from "./config.js";
10
10
  import { HeaderBar } from "./components/HeaderBar.js";
@@ -13,7 +13,8 @@ const WEEKLY_REFRESH_INTERVAL = 300; // 5 minutes in seconds
13
13
  export function App({ version = "" }) {
14
14
  const { exit } = useApp();
15
15
  const config = useRef(loadConfig());
16
- const refreshInterval = Number(config.current["refresh_interval"] ?? 5);
16
+ const baseRefreshInterval = Number(config.current["refresh_interval"] ?? 30);
17
+ const [refreshInterval, setRefreshInterval] = useState(baseRefreshInterval);
17
18
  const [quotaData, setQuotaData] = useState(null);
18
19
  const [planType, setPlanType] = useState(String(config.current["plan_type"] ?? "pro"));
19
20
  const [lastRefreshAgo, setLastRefreshAgo] = useState(0);
@@ -42,10 +43,17 @@ export function App({ version = "" }) {
42
43
  lastRefreshTime.current = Date.now();
43
44
  setLastRefreshAgo(0);
44
45
  setIsLoading(false);
46
+ // Restore normal interval on success
47
+ setRefreshInterval(baseRefreshInterval);
45
48
  }
46
49
  catch (e) {
47
50
  setIsLoading(false);
48
- if (e instanceof AuthenticationError) {
51
+ if (e instanceof RateLimitError) {
52
+ const backoffSec = Math.ceil(e.retryAfterMs / 1000);
53
+ setRefreshInterval(backoffSec);
54
+ setErrorMessage(`Rate limited — backing off ${backoffSec}s`);
55
+ }
56
+ else if (e instanceof AuthenticationError) {
49
57
  setErrorMessage(e.message);
50
58
  }
51
59
  else if (e instanceof QuotaFetchError) {
@@ -55,7 +63,7 @@ export function App({ version = "" }) {
55
63
  setErrorMessage(`Error: ${e}`);
56
64
  }
57
65
  }
58
- }, []);
66
+ }, [baseRefreshInterval]);
59
67
  // Initial fetch
60
68
  useEffect(() => {
61
69
  if (authenticated.current) {
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"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"}
@@ -9,66 +9,16 @@
9
9
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
10
10
  import { Type } from "@sinclair/typebox";
11
11
  import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
12
- import { execFileSync } from "node:child_process";
13
- import { existsSync, readFileSync } from "node:fs";
14
- import { homedir, platform } from "node:os";
15
- import { join } from "node:path";
16
12
 
17
13
  // ---------------------------------------------------------------------------
18
- // Token resolution (same logic as claudemon's auth.ts)
14
+ // Token resolution uses pi's native auth via modelRegistry
19
15
  // ---------------------------------------------------------------------------
20
16
 
21
- function readKeychainCredentials(): Record<string, unknown> | null {
22
- if (platform() !== "darwin") return null;
23
- try {
24
- const raw = execFileSync(
25
- "/usr/bin/security",
26
- ["find-generic-password", "-s", "Claude Code-credentials", "-w"],
27
- { timeout: 5000, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] },
28
- );
29
- if (!raw.trim()) return null;
30
- return JSON.parse(raw.trim()) as Record<string, unknown>;
31
- } catch {
32
- return null;
33
- }
34
- }
35
-
36
- function readFileCredentials(): Record<string, unknown> | null {
37
- const credFile = join(homedir(), ".claude", ".credentials.json");
38
- if (!existsSync(credFile)) return null;
39
- try {
40
- return JSON.parse(readFileSync(credFile, "utf-8")) as Record<string, unknown>;
41
- } catch {
42
- return null;
43
- }
44
- }
45
-
46
- function readClaudemonToken(): string | null {
47
- const tokenFile = join(homedir(), ".config", "claudemon", "token.json");
48
- if (!existsSync(tokenFile)) return null;
49
- try {
50
- const data = JSON.parse(readFileSync(tokenFile, "utf-8"));
51
- if (data.expires_at && data.expires_at < Date.now()) return null;
52
- return data.oauth_token ?? null;
53
- } catch {
54
- return null;
55
- }
56
- }
17
+ type ModelRegistryCtx = { modelRegistry: { getApiKeyForProvider(p: string): Promise<string | undefined> } };
57
18
 
58
- function getOAuthToken(): string | null {
59
- // Prefer Claude Code's live credentials
60
- for (const reader of [readKeychainCredentials, readFileCredentials]) {
61
- const data = reader();
62
- if (data) {
63
- const oauth = data["claudeAiOauth"] as { accessToken?: string; expiresAt?: number } | undefined;
64
- if (oauth?.accessToken) {
65
- if (oauth.expiresAt && oauth.expiresAt < Date.now()) continue;
66
- return oauth.accessToken;
67
- }
68
- }
69
- }
70
- // Fallback to claudemon's own stored token
71
- return readClaudemonToken();
19
+ async function getOAuthTokenFromCtx(ctx: ModelRegistryCtx): Promise<string | null> {
20
+ const apiKey = await ctx.modelRegistry.getApiKeyForProvider("anthropic");
21
+ return apiKey ?? null;
72
22
  }
73
23
 
74
24
  // ---------------------------------------------------------------------------
@@ -99,7 +49,12 @@ async function fetchQuota(token: string): Promise<QuotaData> {
99
49
  });
100
50
 
101
51
  if (resp.status === 401 || resp.status === 403) {
102
- throw new Error("OAuth token expired. Run `claudemon setup` to re-authenticate.");
52
+ throw new Error("OAuth token expired or invalid. Try `/login` to re-authenticate.");
53
+ }
54
+ if (resp.status === 429) {
55
+ const retryAfter = resp.headers.get("retry-after");
56
+ const retrySec = retryAfter ? Number(retryAfter) : 60;
57
+ throw new Error(`Rate limited. Retry after ${retrySec} seconds.`);
103
58
  }
104
59
  if (resp.status !== 200) {
105
60
  throw new Error(`API returned status ${resp.status}`);
@@ -516,10 +471,10 @@ export default function (pi: ExtensionAPI) {
516
471
 
517
472
  // --tui flag: launch the native pi TUI dashboard
518
473
  if (trimmed === "--tui" || trimmed === "-t") {
519
- const token = getOAuthToken();
474
+ const token = await getOAuthTokenFromCtx(ctx);
520
475
  if (!token) {
521
476
  ctx.ui.notify(
522
- "Not authenticated. Run `claudemon setup` or `npx claudemon setup` first.",
477
+ "Not authenticated. Make sure you're logged in (`/login`).",
523
478
  "error",
524
479
  );
525
480
  return;
@@ -538,10 +493,10 @@ export default function (pi: ExtensionAPI) {
538
493
  }
539
494
 
540
495
  // Default: fetch and display inline
541
- const token = getOAuthToken();
496
+ const token = await getOAuthTokenFromCtx(ctx);
542
497
  if (!token) {
543
498
  ctx.ui.notify(
544
- "Not authenticated. Run `claudemon setup` or `npx claudemon setup` first.",
499
+ "Not authenticated. Make sure you're logged in (`/login`).",
545
500
  "error",
546
501
  );
547
502
  return;
@@ -566,14 +521,14 @@ export default function (pi: ExtensionAPI) {
566
521
  description:
567
522
  "Check the user's Claude Pro/Max plan quota usage including 5-hour and 7-day windows and per-model breakdown. Use when the user asks about their Claude usage, quota, or remaining capacity.",
568
523
  parameters: Type.Object({}),
569
- async execute(_toolCallId, _params, signal) {
570
- const token = getOAuthToken();
524
+ async execute(_toolCallId, _params, signal, _onUpdate, ctx) {
525
+ const token = await getOAuthTokenFromCtx(ctx as ModelRegistryCtx);
571
526
  if (!token) {
572
527
  return {
573
528
  content: [
574
529
  {
575
530
  type: "text" as const,
576
- text: "Not authenticated. The user needs to run `claudemon setup` or `npx claudemon setup` to authenticate first.",
531
+ text: "Not authenticated. The user needs to log in first (`/login`).",
577
532
  },
578
533
  ],
579
534
  isError: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudemon",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "Claude Usage Monitor TUI - monitor your Claude usage in real-time",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",