@slkiser/opencode-quota 2.9.1 → 2.10.1-beta.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
@@ -5,7 +5,7 @@
5
5
  - Automatic quota toasts after assistant responses
6
6
  - Manual `/quota`, `/pricing_refresh`, and `/tokens_*` commands for deeper local reporting with zero context window pollution
7
7
 
8
- **Quota providers**: GitHub Copilot, OpenAI (Plus/Pro), Cursor, Qwen Code, Alibaba Coding Plan, Chutes AI, Firmware AI, Google Antigravity, and Z.ai coding plan.
8
+ **Quota providers**: GitHub Copilot, OpenAI (Plus/Pro), Cursor, Qwen Code, Alibaba Coding Plan, Chutes AI, Firmware AI, Google Antigravity, Z.ai coding plan, and NanoGPT.
9
9
 
10
10
  **Token reports**: All models and providers in [models.dev](https://models.dev), plus deterministic local pricing for Cursor Auto/Composer and Cursor model aliases that are not on models.dev.
11
11
 
@@ -24,7 +24,7 @@
24
24
  </tr>
25
25
  </table>
26
26
 
27
- Quota and `/tokens_*` output are computed from local OpenCode session history.
27
+ `/tokens_*` output is computed from local OpenCode session history. Quota rows use each provider's existing local auth plus deterministic local state or live provider quota endpoints, depending on the provider.
28
28
 
29
29
  ## Quick Start
30
30
 
@@ -85,6 +85,7 @@ That is enough for most installs. Providers are auto-detected from your existing
85
85
  | **Alibaba Coding Plan** | Yes | OpenCode auth + local request estimation. |
86
86
  | **Firmware AI** | Usually | User/global OpenCode config or env; repo-local secrets ignored. |
87
87
  | **Chutes AI** | Usually | User/global OpenCode config or env; repo-local secrets ignored. |
88
+ | **NanoGPT** | Usually | User/global OpenCode config, env, or auth.json; repo-local secrets ignored. |
88
89
  | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth plugin. |
89
90
  | **Z.ai** | Yes | OpenCode auth. |
90
91
 
@@ -336,6 +337,36 @@ If detection looks wrong, `/quota_status` prints the candidate paths checked for
336
337
 
337
338
  </details>
338
339
 
340
+ <a id="nanogpt-notes"></a>
341
+ <details>
342
+ <summary><strong>NanoGPT</strong></summary>
343
+
344
+ NanoGPT uses the live NanoGPT subscription usage endpoint, so `/quota`, grouped/classic toasts, and `/quota_status` show weekly input token usage as the primary quota, daily image usage, and daily input token usage only when the API returns it.
345
+
346
+ - Canonical provider id is `nanogpt`. Alias `nano-gpt` also normalizes in `enabledProviders`.
347
+ - Optional API key: `provider.nanogpt.options.apiKey` or `provider["nano-gpt"].options.apiKey`.
348
+ - For security, provider secrets are read from `NANOGPT_API_KEY`, `NANO_GPT_API_KEY`, your user/global OpenCode config, or `auth.json`. Repo-local `opencode.json` / `opencode.jsonc` is ignored for NanoGPT secrets.
349
+ - Allowed env templates are limited to `{env:NANOGPT_API_KEY}` and `{env:NANO_GPT_API_KEY}`.
350
+ - `/quota_status` prints a `nanogpt` section with API-key diagnostics, auth candidate paths, live subscription state, weekly token usage, daily image usage, and optional daily token usage.
351
+ - Balance is intentionally not used for `/quota`, grouped/classic toasts, or `/quota_status`.
352
+ - NanoGPT quota reflects subscription usage windows and is not token-priced in `/tokens_*`.
353
+
354
+ Example user/global config (`~/.config/opencode/opencode.jsonc` on Linux/macOS):
355
+
356
+ ```jsonc
357
+ {
358
+ "provider": {
359
+ "nanogpt": {
360
+ "options": {
361
+ "apiKey": "{env:NANOGPT_API_KEY}"
362
+ }
363
+ }
364
+ }
365
+ }
366
+ ```
367
+
368
+ </details>
369
+
339
370
  ## Configuration Reference
340
371
 
341
372
  All plugin settings live under `experimental.quotaToast`.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_meta": {
3
- "generatedAt": 1773949200336,
3
+ "generatedAt": 1774268550053,
4
4
  "providers": [
5
5
  "anthropic",
6
6
  "google",
@@ -647,17 +647,17 @@
647
647
  "output": 0.5,
648
648
  "cache_read": 0.05
649
649
  },
650
- "grok-4.20-beta-latest-non-reasoning": {
650
+ "grok-4.20-0309-non-reasoning": {
651
651
  "input": 2,
652
652
  "output": 6,
653
653
  "cache_read": 0.2
654
654
  },
655
- "grok-4.20-beta-latest-reasoning": {
655
+ "grok-4.20-0309-reasoning": {
656
656
  "input": 2,
657
657
  "output": 6,
658
658
  "cache_read": 0.2
659
659
  },
660
- "grok-4.20-multi-agent-beta-latest": {
660
+ "grok-4.20-multi-agent-0309": {
661
661
  "input": 2,
662
662
  "output": 6,
663
663
  "cache_read": 0.2
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-pricing.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAC3C,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,2BAA2B,eAA4B,CAAC;AAErE,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAItG,CAAC;AA8CF,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAClD,MAAM,CAAC,MAAM,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAW7E;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IACvD,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,GAAG,SAAS,CAMrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAEvE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAqB3E"}
1
+ {"version":3,"file":"cursor-pricing.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAC3C,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,2BAA2B,eAA4B,CAAC;AAErE,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAItG,CAAC;AA8CF,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAClD,MAAM,CAAC,MAAM,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAW7E;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IACvD,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,GAAG,SAAS,CAMrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAEvE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAqB3E"}
@@ -49,17 +49,22 @@ const CURSOR_LOCAL_MODEL_ALIASES = {
49
49
  };
50
50
  export const CURSOR_OFFICIAL_MODEL_ALIASES = {
51
51
  "claude-4.5-sonnet": { providerHint: "anthropic", modelHint: "claude-sonnet-4-5" },
52
+ "claude-4.6-opus-high": { providerHint: "anthropic", modelHint: "claude-opus-4-6" },
52
53
  "claude-4.6-opus": { providerHint: "anthropic", modelHint: "claude-opus-4-6" },
54
+ "claude-4.6-sonnet-medium": { providerHint: "anthropic", modelHint: "claude-sonnet-4-6" },
53
55
  "claude-4.6-sonnet": { providerHint: "anthropic", modelHint: "claude-sonnet-4-6" },
54
56
  "gemini-3-flash": { providerHint: "google", modelHint: "gemini-3-flash-preview" },
55
57
  "gemini-3-pro": { providerHint: "google", modelHint: "gemini-3-pro-preview" },
56
58
  "gemini-3.1-pro": { providerHint: "google", modelHint: "gemini-3.1-pro-preview" },
57
59
  "gpt-5.2": { providerHint: "openai", modelHint: "gpt-5.2" },
60
+ "gpt-5.2-codex": { providerHint: "openai", modelHint: "gpt-5.2-codex" },
58
61
  "gpt-5.3-codex": { providerHint: "openai", modelHint: "gpt-5.3-codex" },
62
+ "gpt-5.3-codex-spark-preview": { providerHint: "openai", modelHint: "gpt-5.3-codex-spark" },
59
63
  "gpt-5.4": { providerHint: "openai", modelHint: "gpt-5.4" },
60
64
  "gpt-5.4-high": { providerHint: "openai", modelHint: "gpt-5.4" },
61
65
  "gpt-5.4-medium": { providerHint: "openai", modelHint: "gpt-5.4" },
62
66
  grok: { providerHint: "xai", modelHint: "grok-code-fast-1" },
67
+ "grok-code-fast-1": { providerHint: "xai", modelHint: "grok-code-fast-1" },
63
68
  "kimi-k2.5": { providerHint: "moonshotai", modelHint: "kimi-k2.5" },
64
69
  "opus-4.5": { providerHint: "anthropic", modelHint: "claude-opus-4-5" },
65
70
  "opus-4.5-thinking": { providerHint: "anthropic", modelHint: "claude-opus-4-5" },
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-pricing.js","sourceRoot":"","sources":["../../src/lib/cursor-pricing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor-pricing.js","sourceRoot":"","sources":["../../src/lib/cursor-pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * NanoGPT API key configuration resolver.
3
+ *
4
+ * Resolution priority (first wins):
5
+ * 1. Environment variable: NANOGPT_API_KEY or NANO_GPT_API_KEY
6
+ * 2. User/global opencode.json/opencode.jsonc: provider.nanogpt.options.apiKey
7
+ * or provider["nano-gpt"].options.apiKey
8
+ * 3. auth.json: nanogpt.key or nano-gpt.key
9
+ */
10
+ /** Result of NanoGPT API key resolution */
11
+ export interface NanoGptApiKeyResult {
12
+ key: string;
13
+ source: NanoGptKeySource;
14
+ }
15
+ /** Source of the resolved API key */
16
+ export type NanoGptKeySource = "env:NANOGPT_API_KEY" | "env:NANO_GPT_API_KEY" | "opencode.json" | "opencode.jsonc" | "auth.json";
17
+ export { getGlobalOpencodeConfigCandidatePaths as getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
18
+ export declare function resolveNanoGptApiKey(): Promise<NanoGptApiKeyResult | null>;
19
+ export declare function hasNanoGptApiKey(): Promise<boolean>;
20
+ export declare function getNanoGptKeyDiagnostics(): Promise<{
21
+ configured: boolean;
22
+ source: NanoGptKeySource | null;
23
+ checkedPaths: string[];
24
+ authPaths: string[];
25
+ }>;
26
+ //# sourceMappingURL=nanogpt-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanogpt-config.d.ts","sourceRoot":"","sources":["../../src/lib/nanogpt-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAID,qCAAqC;AACrC,MAAM,MAAM,gBAAgB,GACxB,qBAAqB,GACrB,sBAAsB,GACtB,eAAe,GACf,gBAAgB,GAChB,WAAW,CAAC;AA+ChB,OAAO,EAAE,qCAAqC,IAAI,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAEjH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAgBhF;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAGzD;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC;IACxD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CAYD"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * NanoGPT API key configuration resolver.
3
+ *
4
+ * Resolution priority (first wins):
5
+ * 1. Environment variable: NANOGPT_API_KEY or NANO_GPT_API_KEY
6
+ * 2. User/global opencode.json/opencode.jsonc: provider.nanogpt.options.apiKey
7
+ * or provider["nano-gpt"].options.apiKey
8
+ * 3. auth.json: nanogpt.key or nano-gpt.key
9
+ */
10
+ import { resolveEnvTemplate } from "./env-template.js";
11
+ import { getAuthPaths, readAuthFile } from "./opencode-auth.js";
12
+ import { getApiKeyDiagnostics, getGlobalOpencodeConfigCandidatePaths, resolveApiKey, } from "./api-key-resolver.js";
13
+ const ALLOWED_NANOGPT_ENV_VARS = ["NANOGPT_API_KEY", "NANO_GPT_API_KEY"];
14
+ function extractNanoGptKeyFromProviderConfig(providerKey, config) {
15
+ if (!config || typeof config !== "object")
16
+ return null;
17
+ const root = config;
18
+ const provider = root.provider;
19
+ if (!provider || typeof provider !== "object")
20
+ return null;
21
+ const entry = provider[providerKey];
22
+ if (!entry || typeof entry !== "object")
23
+ return null;
24
+ const options = entry.options;
25
+ if (!options || typeof options !== "object")
26
+ return null;
27
+ const apiKey = options.apiKey;
28
+ if (typeof apiKey !== "string" || apiKey.trim().length === 0)
29
+ return null;
30
+ return resolveEnvTemplate(apiKey.trim(), ALLOWED_NANOGPT_ENV_VARS);
31
+ }
32
+ function extractNanoGptKeyFromConfig(config) {
33
+ return (extractNanoGptKeyFromProviderConfig("nanogpt", config) ??
34
+ extractNanoGptKeyFromProviderConfig("nano-gpt", config));
35
+ }
36
+ function extractNanoGptKeyFromAuth(auth) {
37
+ if (!auth || typeof auth !== "object")
38
+ return null;
39
+ const root = auth;
40
+ const nanoGpt = (root.nanogpt ?? root["nano-gpt"]);
41
+ if (nanoGpt && nanoGpt.type === "api" && nanoGpt.key && nanoGpt.key.trim().length > 0) {
42
+ return nanoGpt.key.trim();
43
+ }
44
+ return null;
45
+ }
46
+ // Re-export for consumers that need path info
47
+ export { getGlobalOpencodeConfigCandidatePaths as getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
48
+ export async function resolveNanoGptApiKey() {
49
+ return resolveApiKey({
50
+ envVars: [
51
+ { name: "NANOGPT_API_KEY", source: "env:NANOGPT_API_KEY" },
52
+ { name: "NANO_GPT_API_KEY", source: "env:NANO_GPT_API_KEY" },
53
+ ],
54
+ extractFromConfig: extractNanoGptKeyFromConfig,
55
+ configJsonSource: "opencode.json",
56
+ configJsoncSource: "opencode.jsonc",
57
+ extractFromAuth: extractNanoGptKeyFromAuth,
58
+ authSource: "auth.json",
59
+ getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
60
+ }, readAuthFile);
61
+ }
62
+ export async function hasNanoGptApiKey() {
63
+ const result = await resolveNanoGptApiKey();
64
+ return result !== null;
65
+ }
66
+ export async function getNanoGptKeyDiagnostics() {
67
+ const authPaths = getAuthPaths();
68
+ const diagnostics = await getApiKeyDiagnostics({
69
+ envVarNames: ["NANOGPT_API_KEY", "NANO_GPT_API_KEY"],
70
+ resolve: resolveNanoGptApiKey,
71
+ getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
72
+ });
73
+ return {
74
+ ...diagnostics,
75
+ authPaths,
76
+ };
77
+ }
78
+ //# sourceMappingURL=nanogpt-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanogpt-config.js","sourceRoot":"","sources":["../../src/lib/nanogpt-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * NanoGPT live quota fetcher.
3
+ *
4
+ * Queries:
5
+ * - https://nano-gpt.com/api/subscription/v1/usage
6
+ */
7
+ import type { QuotaError } from "./types.js";
8
+ export type NanoGptUsageWindow = {
9
+ used: number;
10
+ limit: number;
11
+ remaining: number;
12
+ percentRemaining: number;
13
+ resetTimeIso?: string;
14
+ };
15
+ export interface NanoGptSubscription {
16
+ active: boolean;
17
+ state: string;
18
+ enforceDailyLimit: boolean;
19
+ weeklyInputTokens?: NanoGptUsageWindow;
20
+ dailyImages?: NanoGptUsageWindow;
21
+ dailyInputTokens?: NanoGptUsageWindow;
22
+ graceUntilIso?: string;
23
+ }
24
+ export type NanoGptResult = {
25
+ success: true;
26
+ subscription: NanoGptSubscription;
27
+ } | QuotaError | null;
28
+ export declare function hasNanoGptApiKeyConfigured(): Promise<boolean>;
29
+ export { getNanoGptKeyDiagnostics, type NanoGptKeySource } from "./nanogpt-config.js";
30
+ export declare function queryNanoGptQuota(): Promise<NanoGptResult>;
31
+ //# sourceMappingURL=nanogpt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanogpt.d.ts","sourceRoot":"","sources":["../../src/lib/nanogpt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmB7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,GACrB;IACE,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;CACnC,GACD,UAAU,GACV,IAAI,CAAC;AAmKT,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED,OAAO,EAAE,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAqBhE"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * NanoGPT live quota fetcher.
3
+ *
4
+ * Queries:
5
+ * - https://nano-gpt.com/api/subscription/v1/usage
6
+ */
7
+ import { sanitizeDisplaySnippet, sanitizeDisplayText } from "./display-sanitize.js";
8
+ import { clampPercent } from "./format-utils.js";
9
+ import { fetchWithTimeout } from "./http.js";
10
+ import { hasNanoGptApiKey, resolveNanoGptApiKey, } from "./nanogpt-config.js";
11
+ const USER_AGENT = "OpenCode-Quota-Toast/1.0";
12
+ const NANOGPT_USAGE_URL = "https://nano-gpt.com/api/subscription/v1/usage";
13
+ function isRecord(value) {
14
+ return Boolean(value) && typeof value === "object";
15
+ }
16
+ function getFiniteNumber(value) {
17
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
18
+ }
19
+ function getFinitePositiveNumber(value) {
20
+ const n = getFiniteNumber(value);
21
+ return n !== undefined && n > 0 ? n : undefined;
22
+ }
23
+ function getNonEmptyString(value) {
24
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
25
+ }
26
+ function getIsoString(value) {
27
+ const raw = getNonEmptyString(value);
28
+ if (!raw)
29
+ return undefined;
30
+ const ms = Date.parse(raw);
31
+ if (!Number.isFinite(ms))
32
+ return undefined;
33
+ return new Date(ms).toISOString();
34
+ }
35
+ function getIsoFromEpochMs(value) {
36
+ const ms = getFinitePositiveNumber(value);
37
+ if (ms === undefined)
38
+ return undefined;
39
+ return new Date(Math.round(ms)).toISOString();
40
+ }
41
+ function normalizeUsageWindow(value, limitValue) {
42
+ if (!isRecord(value))
43
+ return undefined;
44
+ const used = getFiniteNumber(value.used);
45
+ const remainingRaw = getFiniteNumber(value.remaining);
46
+ const limitFromResponse = getFinitePositiveNumber(limitValue);
47
+ const percentUsed = getFiniteNumber(value.percentUsed);
48
+ const derivedLimit = limitFromResponse ??
49
+ (used !== undefined && remainingRaw !== undefined ? used + remainingRaw : undefined);
50
+ if (derivedLimit === undefined || derivedLimit <= 0)
51
+ return undefined;
52
+ const safeUsed = used ?? 0;
53
+ const safeRemaining = remainingRaw ??
54
+ (percentUsed !== undefined ? Math.max(0, derivedLimit * (1 - percentUsed)) : derivedLimit);
55
+ const percentRemaining = safeRemaining >= 0
56
+ ? clampPercent((safeRemaining / derivedLimit) * 100)
57
+ : clampPercent(percentUsed !== undefined ? (1 - percentUsed) * 100 : 0);
58
+ return {
59
+ used: safeUsed,
60
+ limit: derivedLimit,
61
+ remaining: Math.max(0, safeRemaining),
62
+ percentRemaining,
63
+ resetTimeIso: getIsoFromEpochMs(value.resetAt),
64
+ };
65
+ }
66
+ function parseNanoGptUsage(payload) {
67
+ if (!isRecord(payload)) {
68
+ throw new Error("NanoGPT usage response returned an unexpected response shape");
69
+ }
70
+ const data = payload;
71
+ const weeklyInputTokens = normalizeUsageWindow(data.weeklyInputTokens, data.limits?.weeklyInputTokens);
72
+ const dailyImages = normalizeUsageWindow(data.dailyImages, data.limits?.dailyImages);
73
+ const dailyInputTokens = normalizeUsageWindow(data.dailyInputTokens, data.limits?.dailyInputTokens);
74
+ const hasSubscriptionShape = typeof data.active === "boolean" ||
75
+ typeof data.enforceDailyLimit === "boolean" ||
76
+ Boolean(getNonEmptyString(data.state)) ||
77
+ weeklyInputTokens !== undefined ||
78
+ dailyImages !== undefined ||
79
+ dailyInputTokens !== undefined;
80
+ if (!hasSubscriptionShape) {
81
+ throw new Error("NanoGPT usage response returned an unexpected response shape");
82
+ }
83
+ return {
84
+ active: typeof data.active === "boolean" ? data.active : false,
85
+ state: getNonEmptyString(data.state) ?? (data.active ? "active" : "unknown"),
86
+ enforceDailyLimit: typeof data.enforceDailyLimit === "boolean" ? data.enforceDailyLimit : false,
87
+ weeklyInputTokens,
88
+ dailyImages,
89
+ dailyInputTokens,
90
+ graceUntilIso: getIsoString(data.graceUntil),
91
+ };
92
+ }
93
+ async function readNanoGptAuth() {
94
+ const result = await resolveNanoGptApiKey();
95
+ if (!result)
96
+ return null;
97
+ return { type: "api", key: result.key, source: result.source };
98
+ }
99
+ async function fetchNanoGptUsage(headers) {
100
+ try {
101
+ const response = await fetchWithTimeout(NANOGPT_USAGE_URL, {
102
+ method: "GET",
103
+ headers,
104
+ });
105
+ if (!response.ok) {
106
+ const text = await response.text();
107
+ return {
108
+ success: false,
109
+ message: `NanoGPT API error ${response.status}: ${sanitizeDisplaySnippet(text, 120)}`,
110
+ };
111
+ }
112
+ return {
113
+ success: true,
114
+ subscription: parseNanoGptUsage(await response.json()),
115
+ };
116
+ }
117
+ catch (err) {
118
+ return {
119
+ success: false,
120
+ message: sanitizeDisplayText(err instanceof Error ? err.message : String(err)),
121
+ };
122
+ }
123
+ }
124
+ export async function hasNanoGptApiKeyConfigured() {
125
+ return await hasNanoGptApiKey();
126
+ }
127
+ export { getNanoGptKeyDiagnostics } from "./nanogpt-config.js";
128
+ export async function queryNanoGptQuota() {
129
+ const auth = await readNanoGptAuth();
130
+ if (!auth)
131
+ return null;
132
+ const headers = {
133
+ "x-api-key": auth.key,
134
+ "User-Agent": USER_AGENT,
135
+ };
136
+ const usageResult = await fetchNanoGptUsage(headers);
137
+ if (!usageResult.success) {
138
+ return {
139
+ success: false,
140
+ error: usageResult.message,
141
+ };
142
+ }
143
+ return {
144
+ success: true,
145
+ subscription: usageResult.subscription,
146
+ };
147
+ }
148
+ //# sourceMappingURL=nanogpt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanogpt.js","sourceRoot":"","sources":["../../src/lib/nanogpt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUlE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASvE,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/D"}
1
+ {"version":3,"file":"provider-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWlE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUvE,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -8,6 +8,7 @@ export const QUOTA_PROVIDER_LABELS = {
8
8
  "qwen-code": "Qwen",
9
9
  "alibaba-coding-plan": "Alibaba Coding Plan",
10
10
  zai: "Z.ai",
11
+ nanogpt: "NanoGPT",
11
12
  };
12
13
  export const QUOTA_PROVIDER_ID_SYNONYMS = {
13
14
  "github-copilot": "copilot",
@@ -18,6 +19,7 @@ export const QUOTA_PROVIDER_ID_SYNONYMS = {
18
19
  "@rama_nigg/open-cursor": "cursor",
19
20
  qwen: "qwen-code",
20
21
  alibaba: "alibaba-coding-plan",
22
+ "nano-gpt": "nanogpt",
21
23
  };
22
24
  export function normalizeQuotaProviderId(id) {
23
25
  const normalized = id.trim().toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"provider-metadata.js","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAqC;IACrE,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,QAAQ;IAC9B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,MAAM;IACnB,qBAAqB,EAAE,qBAAqB;IAC5C,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAChC,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,qBAAqB;CAC/B,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,OAAO,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"provider-metadata.js","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAqC;IACrE,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,QAAQ;IAC9B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,MAAM;IACnB,qBAAqB,EAAE,qBAAqB;IAC5C,GAAG,EAAE,MAAM;IACX,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAChC,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,SAAS;CACtB,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,OAAO,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEzE,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+KD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACpC,qBAAqB,EAAE,MAAM,GAAG,KAAK,CAAC;IACtC,UAAU,EAAE,eAAe,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC;IACvD,oBAAoB,EAAE,KAAK,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,CAAC,CAAC;IACH,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC;IACF,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkclB"}
1
+ {"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"AAkDA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEzE,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyMD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACpC,qBAAqB,EAAE,MAAM,GAAG,KAAK,CAAC;IACtC,UAAU,EAAE,eAAe,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC;IACvD,oBAAoB,EAAE,KAAK,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,CAAC,CAAC;IACH,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC;IACF,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqflB"}
@@ -5,6 +5,7 @@ import { getGoogleTokenCachePath } from "./google-token-cache.js";
5
5
  import { getAntigravityAccountsCandidatePaths, readAntigravityAccounts } from "./google.js";
6
6
  import { getFirmwareKeyDiagnostics } from "./firmware.js";
7
7
  import { getChutesKeyDiagnostics } from "./chutes.js";
8
+ import { getNanoGptKeyDiagnostics, queryNanoGptQuota } from "./nanogpt.js";
8
9
  import { getCopilotQuotaAuthDiagnostics } from "./copilot.js";
9
10
  import { computeAlibabaCodingPlanQuota, computeQwenQuota, getAlibabaCodingPlanQuotaPath, getQwenLocalQuotaPath, readAlibabaCodingPlanQuotaState, readQwenLocalQuotaState, } from "./qwen-local-quota.js";
10
11
  import { hasAlibabaAuth, resolveAlibabaCodingPlanAuth, } from "./alibaba-auth.js";
@@ -37,6 +38,18 @@ const STATUS_SAMPLE_LIMIT = 5;
37
38
  function joinOrNone(values) {
38
39
  return values.length > 0 ? values.join(" | ") : "(none)";
39
40
  }
41
+ function fmtNanoGptMetric(value) {
42
+ if (!Number.isFinite(value))
43
+ return "0";
44
+ if (Number.isInteger(value))
45
+ return String(Math.trunc(value));
46
+ return value.toFixed(2).replace(/\.?0+$/, "");
47
+ }
48
+ function fmtNanoGptUsageWindow(window) {
49
+ if (!window)
50
+ return "(none)";
51
+ return `${fmtNanoGptMetric(window.used)}/${fmtNanoGptMetric(window.limit)} remaining=${fmtNanoGptMetric(window.remaining)} percent_remaining=${window.percentRemaining} reset_at=${window.resetTimeIso ?? "(none)"}`;
52
+ }
40
53
  function computePricingCoverageFromAgg(agg) {
41
54
  const byProvider = new Map();
42
55
  let pricedKeysSeen = 0;
@@ -112,6 +125,13 @@ function supportedProviderPricingRow(params) {
112
125
  notes: "API-pool models map to official pricing; Auto/Composer use bundled static Cursor rates",
113
126
  };
114
127
  }
128
+ if (id === "nanogpt") {
129
+ return {
130
+ id,
131
+ pricing: "no",
132
+ notes: "subscription usage windows (weekly tokens, daily images, optional daily tokens; not token-priced)",
133
+ };
134
+ }
115
135
  // Providers that correspond directly to models.dev providers.
116
136
  if (params.snapshotProviders.includes(id)) {
117
137
  return { id, pricing: "yes", notes: "models.dev snapshot provider" };
@@ -308,6 +328,51 @@ export async function buildQuotaStatusReport(params) {
308
328
  // ignore
309
329
  }
310
330
  lines.push(`- chutes api key: configured=${chutesDiag.configured ? "true" : "false"}${chutesDiag.source ? ` source=${chutesDiag.source}` : ""}${chutesDiag.checkedPaths.length > 0 ? ` checked=${chutesDiag.checkedPaths.join(" | ")}` : ""}`);
331
+ lines.push("");
332
+ lines.push("nanogpt:");
333
+ let nanoGptDiag = {
334
+ configured: false,
335
+ source: null,
336
+ checkedPaths: [],
337
+ authPaths: [],
338
+ };
339
+ try {
340
+ nanoGptDiag = await getNanoGptKeyDiagnostics();
341
+ }
342
+ catch {
343
+ // ignore
344
+ }
345
+ lines.push(`- api_key_configured: ${nanoGptDiag.configured ? "true" : "false"}`);
346
+ lines.push(`- api_key_source: ${nanoGptDiag.source ?? "(none)"}`);
347
+ lines.push(`- api_key_checked_paths: ${joinOrNone(nanoGptDiag.checkedPaths)}`);
348
+ lines.push(`- api_key_auth_paths: ${joinOrNone(nanoGptDiag.authPaths)}`);
349
+ if (nanoGptDiag.configured) {
350
+ try {
351
+ const nanoGptQuota = await queryNanoGptQuota();
352
+ if (!nanoGptQuota) {
353
+ lines.push("- live_fetch_error: NanoGPT API key became unavailable before fetch");
354
+ }
355
+ else if (!nanoGptQuota.success) {
356
+ lines.push(`- live_fetch_error: ${nanoGptQuota.error}`);
357
+ }
358
+ else {
359
+ const subscription = nanoGptQuota.subscription;
360
+ lines.push(`- subscription_active: ${subscription.active ? "true" : "false"}`);
361
+ lines.push(`- subscription_state: ${subscription.state}`);
362
+ lines.push(`- enforce_daily_limit: ${subscription.enforceDailyLimit ? "true" : "false"}`);
363
+ lines.push(`- weekly_input_tokens_usage: ${fmtNanoGptUsageWindow(subscription.weeklyInputTokens)}`);
364
+ lines.push(`- daily_images_usage: ${fmtNanoGptUsageWindow(subscription.dailyImages)}`);
365
+ lines.push(`- daily_input_tokens_usage: ${fmtNanoGptUsageWindow(subscription.dailyInputTokens)}`);
366
+ if (subscription.graceUntilIso) {
367
+ lines.push(`- grace_until: ${subscription.graceUntilIso}`);
368
+ }
369
+ }
370
+ }
371
+ catch (err) {
372
+ const msg = err instanceof Error ? err.message : String(err);
373
+ lines.push(`- live_fetch_error: ${msg}`);
374
+ }
375
+ }
311
376
  const copilotDiag = getCopilotQuotaAuthDiagnostics(authData);
312
377
  lines.push("");
313
378
  lines.push("copilot_quota_auth:");