@slkiser/opencode-quota 2.13.0 → 2.15.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.
Files changed (137) hide show
  1. package/README.md +64 -25
  2. package/dist/lib/alibaba-auth.d.ts +20 -0
  3. package/dist/lib/alibaba-auth.d.ts.map +1 -1
  4. package/dist/lib/alibaba-auth.js +36 -6
  5. package/dist/lib/alibaba-auth.js.map +1 -1
  6. package/dist/lib/api-key-resolver.d.ts +7 -0
  7. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  8. package/dist/lib/api-key-resolver.js +46 -0
  9. package/dist/lib/api-key-resolver.js.map +1 -1
  10. package/dist/lib/atomic-json.d.ts +5 -0
  11. package/dist/lib/atomic-json.d.ts.map +1 -0
  12. package/dist/lib/atomic-json.js +33 -0
  13. package/dist/lib/atomic-json.js.map +1 -0
  14. package/dist/lib/chutes-config.d.ts.map +1 -1
  15. package/dist/lib/chutes-config.js +7 -39
  16. package/dist/lib/chutes-config.js.map +1 -1
  17. package/dist/lib/chutes.d.ts +1 -2
  18. package/dist/lib/chutes.d.ts.map +1 -1
  19. package/dist/lib/chutes.js +5 -14
  20. package/dist/lib/chutes.js.map +1 -1
  21. package/dist/lib/cursor-detection.d.ts.map +1 -1
  22. package/dist/lib/cursor-detection.js +3 -3
  23. package/dist/lib/cursor-detection.js.map +1 -1
  24. package/dist/lib/cursor-pricing.d.ts.map +1 -1
  25. package/dist/lib/cursor-pricing.js +2 -2
  26. package/dist/lib/cursor-pricing.js.map +1 -1
  27. package/dist/lib/cursor-usage.d.ts.map +1 -1
  28. package/dist/lib/cursor-usage.js +6 -29
  29. package/dist/lib/cursor-usage.js.map +1 -1
  30. package/dist/lib/firmware-config.d.ts.map +1 -1
  31. package/dist/lib/firmware-config.js +7 -40
  32. package/dist/lib/firmware-config.js.map +1 -1
  33. package/dist/lib/firmware.d.ts +1 -2
  34. package/dist/lib/firmware.d.ts.map +1 -1
  35. package/dist/lib/firmware.js +7 -16
  36. package/dist/lib/firmware.js.map +1 -1
  37. package/dist/lib/google.d.ts +10 -0
  38. package/dist/lib/google.d.ts.map +1 -1
  39. package/dist/lib/google.js +82 -16
  40. package/dist/lib/google.js.map +1 -1
  41. package/dist/lib/minimax-auth.d.ts +17 -0
  42. package/dist/lib/minimax-auth.d.ts.map +1 -1
  43. package/dist/lib/minimax-auth.js +30 -3
  44. package/dist/lib/minimax-auth.js.map +1 -1
  45. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  46. package/dist/lib/modelsdev-pricing.js +8 -36
  47. package/dist/lib/modelsdev-pricing.js.map +1 -1
  48. package/dist/lib/nanogpt-config.d.ts.map +1 -1
  49. package/dist/lib/nanogpt-config.js +7 -36
  50. package/dist/lib/nanogpt-config.js.map +1 -1
  51. package/dist/lib/nanogpt.d.ts +1 -2
  52. package/dist/lib/nanogpt.d.ts.map +1 -1
  53. package/dist/lib/nanogpt.js +5 -14
  54. package/dist/lib/nanogpt.js.map +1 -1
  55. package/dist/lib/openai.d.ts +21 -2
  56. package/dist/lib/openai.d.ts.map +1 -1
  57. package/dist/lib/openai.js +53 -15
  58. package/dist/lib/openai.js.map +1 -1
  59. package/dist/lib/opencode-storage.d.ts +8 -0
  60. package/dist/lib/opencode-storage.d.ts.map +1 -1
  61. package/dist/lib/opencode-storage.js +86 -19
  62. package/dist/lib/opencode-storage.js.map +1 -1
  63. package/dist/lib/provider-availability.d.ts +6 -0
  64. package/dist/lib/provider-availability.d.ts.map +1 -1
  65. package/dist/lib/provider-availability.js +9 -0
  66. package/dist/lib/provider-availability.js.map +1 -1
  67. package/dist/lib/provider-metadata.d.ts +18 -0
  68. package/dist/lib/provider-metadata.d.ts.map +1 -1
  69. package/dist/lib/provider-metadata.js +107 -1
  70. package/dist/lib/provider-metadata.js.map +1 -1
  71. package/dist/lib/quota-command-format.d.ts +0 -5
  72. package/dist/lib/quota-command-format.d.ts.map +1 -1
  73. package/dist/lib/quota-command-format.js +1 -1
  74. package/dist/lib/quota-command-format.js.map +1 -1
  75. package/dist/lib/quota-stats-format.d.ts +8 -1
  76. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  77. package/dist/lib/quota-stats-format.js +69 -14
  78. package/dist/lib/quota-stats-format.js.map +1 -1
  79. package/dist/lib/quota-stats.d.ts +10 -7
  80. package/dist/lib/quota-stats.d.ts.map +1 -1
  81. package/dist/lib/quota-stats.js +100 -58
  82. package/dist/lib/quota-stats.js.map +1 -1
  83. package/dist/lib/quota-status.d.ts.map +1 -1
  84. package/dist/lib/quota-status.js +162 -91
  85. package/dist/lib/quota-status.js.map +1 -1
  86. package/dist/lib/qwen-auth.d.ts +4 -0
  87. package/dist/lib/qwen-auth.d.ts.map +1 -1
  88. package/dist/lib/qwen-auth.js +6 -6
  89. package/dist/lib/qwen-auth.js.map +1 -1
  90. package/dist/lib/qwen-local-quota.d.ts.map +1 -1
  91. package/dist/lib/qwen-local-quota.js +5 -33
  92. package/dist/lib/qwen-local-quota.js.map +1 -1
  93. package/dist/lib/token-buckets.d.ts +24 -0
  94. package/dist/lib/token-buckets.d.ts.map +1 -0
  95. package/dist/lib/token-buckets.js +32 -0
  96. package/dist/lib/token-buckets.js.map +1 -0
  97. package/dist/lib/types.d.ts +13 -26
  98. package/dist/lib/types.d.ts.map +1 -1
  99. package/dist/lib/types.js.map +1 -1
  100. package/dist/lib/zai-auth.d.ts +33 -0
  101. package/dist/lib/zai-auth.d.ts.map +1 -0
  102. package/dist/lib/zai-auth.js +68 -0
  103. package/dist/lib/zai-auth.js.map +1 -0
  104. package/dist/lib/zai.d.ts.map +1 -1
  105. package/dist/lib/zai.js +17 -17
  106. package/dist/lib/zai.js.map +1 -1
  107. package/dist/plugin.d.ts.map +1 -1
  108. package/dist/plugin.js +111 -69
  109. package/dist/plugin.js.map +1 -1
  110. package/dist/providers/anthropic.js +3 -3
  111. package/dist/providers/anthropic.js.map +1 -1
  112. package/dist/providers/chutes.d.ts.map +1 -1
  113. package/dist/providers/chutes.js +8 -10
  114. package/dist/providers/chutes.js.map +1 -1
  115. package/dist/providers/copilot.d.ts.map +1 -1
  116. package/dist/providers/copilot.js +6 -8
  117. package/dist/providers/copilot.js.map +1 -1
  118. package/dist/providers/cursor.js +3 -3
  119. package/dist/providers/cursor.js.map +1 -1
  120. package/dist/providers/firmware.d.ts.map +1 -1
  121. package/dist/providers/firmware.js +8 -11
  122. package/dist/providers/firmware.js.map +1 -1
  123. package/dist/providers/google-antigravity.d.ts.map +1 -1
  124. package/dist/providers/google-antigravity.js +4 -14
  125. package/dist/providers/google-antigravity.js.map +1 -1
  126. package/dist/providers/minimax-coding-plan.js +3 -3
  127. package/dist/providers/minimax-coding-plan.js.map +1 -1
  128. package/dist/providers/nanogpt.d.ts.map +1 -1
  129. package/dist/providers/nanogpt.js +2 -13
  130. package/dist/providers/nanogpt.js.map +1 -1
  131. package/dist/providers/openai.d.ts.map +1 -1
  132. package/dist/providers/openai.js +8 -4
  133. package/dist/providers/openai.js.map +1 -1
  134. package/dist/providers/zai.d.ts.map +1 -1
  135. package/dist/providers/zai.js +19 -12
  136. package/dist/providers/zai.js.map +1 -1
  137. package/package.json +1 -1
package/README.md CHANGED
@@ -16,10 +16,10 @@
16
16
  </tr>
17
17
  <tr>
18
18
  <td width="50%">
19
- <img src="https://github.com/slkiser/opencode-quota/blob/main/toasts.webp" alt="Image of opencode-quota toast" />
19
+ <img src="https://shawnkiser.com/opencode-quota/toasts.webp" alt="Image of opencode-quota toast" />
20
20
  </td>
21
21
  <td width="50%">
22
- <img src="https://github.com/slkiser/opencode-quota/blob/main/tokens.webp" alt="Image of opencode-quota /tokens_weekly output" />
22
+ <img src="https://shawnkiser.com/opencode-quota/tokens.webp" alt="Image of opencode-quota /tokens_weekly output" />
23
23
  </td>
24
24
  </tr>
25
25
  </table>
@@ -76,20 +76,20 @@ That is enough for most installs. Providers are auto-detected from your existing
76
76
 
77
77
  ### Provider Setup At A Glance
78
78
 
79
- | Provider | Auto setup | How it works |
80
- | --- | --- | --- |
81
- | **Anthropic (Claude)** | Needs [quick setup](#anthropic-quick-setup) | Local Claude CLI auth/status probe. |
82
- | **GitHub Copilot** | Usually | OpenCode auth; PAT only for managed billing. |
83
- | **OpenAI** | Yes | OpenCode auth. |
84
- | **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth plugin + `provider.cursor`. |
85
- | **Qwen Code** | Needs [quick setup](#qwen-code-quick-setup) | Companion auth plugin. |
86
- | **Alibaba Coding Plan** | Yes | OpenCode auth + local request estimation. |
87
- | **Firmware AI** | Usually | User/global OpenCode config or env. |
88
- | **Chutes AI** | Usually | User/global OpenCode config or env. |
89
- | **NanoGPT** | Usually | User/global OpenCode config, env, or auth.json. |
90
- | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth plugin. |
91
- | **Z.ai** | Yes | OpenCode auth. |
92
- | **MiniMax Coding Plan** | Yes | Existing OpenCode provider config + auth.json `minimax-coding-plan` section. |
79
+ | Provider | Auto setup | Authentication | Quota |
80
+ | --- | --- | --- | --- |
81
+ | **Anthropic (Claude)** | Needs [quick setup](#anthropic-quick-setup) | Local CLI auth | Local CLI report |
82
+ | **GitHub Copilot** | Usually | GitHub OAuth or PAT | Remote API |
83
+ | **OpenAI** | Yes | OpenCode auth (OAuth token) | Remote API |
84
+ | **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth (OAuth token) | Local runtime accounting |
85
+ | **Qwen Code** | Needs [quick setup](#qwen-code-quick-setup) | Companion auth (OAuth token) | Local estimation |
86
+ | **Alibaba Coding Plan** | Yes | OpenCode auth (API key) | Local estimation |
87
+ | **Firmware AI** | Usually | OpenCode auth (API key; env/global config fallback) | Remote API |
88
+ | **Chutes AI** | Usually | OpenCode auth (API key; env/global config fallback) | Remote API |
89
+ | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth (OAuth token) | Remote API |
90
+ | **Z.ai** | Yes | OpenCode auth (API key) | Remote API |
91
+ | **NanoGPT** | Usually | OpenCode auth (API key; env/global config fallback) | Remote API |
92
+ | **MiniMax Coding Plan** | Yes | OpenCode auth (API key) | Remote API |
93
93
 
94
94
  <a id="anthropic-quick-setup"></a>
95
95
  <details>
@@ -190,10 +190,12 @@ For behavior details and troubleshooting, see [Qwen Code notes](#qwen-code-notes
190
190
  | `/tokens_weekly` | Tokens used in the last 7 days |
191
191
  | `/tokens_monthly` | Tokens used in the last 30 days, including pricing sections |
192
192
  | `/tokens_all` | Tokens used across all local history |
193
- | `/tokens_session` | Tokens used in the current session |
193
+ | `/tokens_session` | Tokens used in the current session only |
194
+ | `/tokens_session_all` | Tokens used in the current session plus all descendant child/subagent sessions |
194
195
  | `/tokens_between` | Tokens used between two dates: `YYYY-MM-DD YYYY-MM-DD` |
195
196
 
196
197
  There is no `/token` command. The reporting commands are the `/tokens_*` family.
198
+ Use `/tokens_session` for strict per-session accounting, and `/tokens_session_all` when you want the selected parent session plus every nested child session linked by `parent_id`.
197
199
 
198
200
  ## Provider-Specific Notes
199
201
 
@@ -255,7 +257,7 @@ Example `copilot-quota-token.json`:
255
257
  <details>
256
258
  <summary><strong>Cursor</strong></summary>
257
259
 
258
- See [Cursor quick setup](#cursor-quick-setup) for auth. Quota and token reporting stays local to OpenCode history and local pricing data.
260
+ See [Cursor quick setup](#cursor-quick-setup) for companion-plugin OAuth auth. Quota and token reporting stays local to OpenCode history and local pricing data.
259
261
 
260
262
  - Detects Cursor usage when the provider is `cursor` or the stored/current model id is `cursor/*`.
261
263
  - `/tokens_*` maps Cursor API-pool models to official pricing and uses bundled static pricing for `auto` and `composer*`.
@@ -278,6 +280,18 @@ Example override:
278
280
 
279
281
  </details>
280
282
 
283
+ <a id="openai-notes"></a>
284
+ <details>
285
+ <summary><strong>OpenAI</strong></summary>
286
+
287
+ OpenAI uses native OpenCode OAuth from `auth.json`. The canonical auth family is OpenCode auth, not companion-plugin auth.
288
+
289
+ - Quota is fetched from the OpenAI usage API using the native OpenCode OAuth token stored under `openai` in `auth.json`.
290
+ - Older OpenCode installs may still have compatible OpenAI OAuth entries under `codex`, `chatgpt`, or `opencode`. Those remain supported for backward compatibility.
291
+ - `/quota_status` includes an `openai` section with the detected auth source, token status, expiry, and account details derived from the token when available.
292
+
293
+ </details>
294
+
281
295
  <a id="qwen-code-notes"></a>
282
296
  <details>
283
297
  <summary><strong>Qwen Code</strong></summary>
@@ -285,9 +299,10 @@ Example override:
285
299
  See [Qwen Code quick setup](#qwen-code-quick-setup) for auth. Usage is local-only estimation for the free plan; the plugin does not call an Alibaba quota API.
286
300
 
287
301
  - Free tier limits: `1000` requests per UTC day and `60` requests per rolling minute.
302
+ - The canonical companion auth key is `qwen-code`. Older installs may still use `opencode-qwencode-auth`, which remains a supported fallback.
288
303
  - Counters increment on successful question-tool completions while the current model is `qwen-code/*`.
289
304
  - State file: `.../opencode/opencode-quota/qwen-local-quota.json`.
290
- - Check `/quota_status` for auth detection, `qwen_local_plan`, and local counter state.
305
+ - Check `/quota_status` for auth detection, `qwen_oauth_source`, `qwen_local_plan`, and local counter state.
291
306
 
292
307
  </details>
293
308
 
@@ -295,10 +310,11 @@ See [Qwen Code quick setup](#qwen-code-quick-setup) for auth. Usage is local-onl
295
310
  <details>
296
311
  <summary><strong>Alibaba Coding Plan</strong></summary>
297
312
 
298
- Uses native OpenCode auth from `alibaba` or `alibaba-coding-plan`. Quota is local request-count estimation with rolling windows.
313
+ Uses native OpenCode auth from `alibaba-coding-plan` or `alibaba` in `auth.json`. Quota is local request-count estimation with rolling windows.
299
314
 
300
315
  - `lite`: `1200 / 5h`, `9000 / week`, `18000 / month`
301
316
  - `pro`: `6000 / 5h`, `45000 / week`, `90000 / month`
317
+ - Auth is read from OpenCode `auth.json` only. There is no env-var or user/global `opencode.json` fallback for Alibaba Coding Plan.
302
318
  - If auth omits `tier`, the plugin uses `experimental.quotaToast.alibabaCodingPlanTier`, which defaults to `lite`.
303
319
  - Counters increment on successful question-tool completions while the current model is `alibaba/*` or `alibaba-cn/*`.
304
320
  - State file: `.../opencode/opencode-quota/alibaba-coding-plan-local-quota.json`.
@@ -325,7 +341,7 @@ Example fallback tier:
325
341
 
326
342
  If OpenCode is already configured with the `minimax-coding-plan` provider and your `auth.json` has a `minimax-coding-plan` entry, quota detection works automatically. No additional plugin is required.
327
343
 
328
- The plugin reads `key` first and falls back to `access` from that auth entry. Quota is fetched from the MiniMax API using those stored credentials.
344
+ The plugin reads `key` first and falls back to `access` from that auth entry. Quota is fetched from the MiniMax API using those stored credentials. There is no env-var or user/global `opencode.json` fallback for MiniMax Coding Plan auth.
329
345
 
330
346
  Example `auth.json` entry:
331
347
 
@@ -343,6 +359,30 @@ Example `auth.json` entry:
343
359
 
344
360
  </details>
345
361
 
362
+ <a id="zai-notes"></a>
363
+ <details>
364
+ <summary><strong>Z.ai</strong></summary>
365
+
366
+ If OpenCode is already configured with the `zai`, `glm`, or `zai-coding-plan` provider and your `auth.json` has a `zai-coding-plan` entry, quota detection works automatically.
367
+
368
+ The plugin reads `auth.json["zai-coding-plan"]` only. There is no env-var or user/global `opencode.json` fallback for Z.ai auth.
369
+
370
+ Example `auth.json` entry:
371
+
372
+ ```json
373
+ {
374
+ "zai-coding-plan": {
375
+ "type": "api",
376
+ "key": "YOUR_ZAI_API_KEY"
377
+ }
378
+ }
379
+ ```
380
+
381
+ - `/quota_status` shows auth diagnostics plus live 5-hour, weekly, and MCP quota windows when the Z.ai API reports them.
382
+ - Malformed `zai-coding-plan` auth is surfaced as an auth error instead of being silently treated as missing.
383
+
384
+ </details>
385
+
346
386
  <a id="firmware-ai-notes"></a>
347
387
  <details>
348
388
  <summary><strong>Firmware AI</strong></summary>
@@ -399,9 +439,10 @@ Example user/global config (`~/.config/opencode/opencode.jsonc` on Linux/macOS):
399
439
  <details>
400
440
  <summary><strong>Google Antigravity</strong></summary>
401
441
 
402
- See [Google Antigravity quick setup](#google-antigravity-quick-setup). Credentials live under the OpenCode runtime config directory.
442
+ See [Google Antigravity quick setup](#google-antigravity-quick-setup). This companion auth flow does not use `auth.json`; it reads `antigravity-accounts.json` from the OpenCode runtime directories.
403
443
 
404
- If detection looks wrong, `/quota_status` prints the candidate paths checked for `antigravity-accounts.json`.
444
+ - `/quota_status` includes a `google_antigravity` section with the selected accounts path, all present/candidate paths, account counts, valid refresh-token counts, and the Google token-cache path.
445
+ - If detection looks wrong, start with the `google_antigravity` section in `/quota_status`.
405
446
 
406
447
  </details>
407
448
 
@@ -508,8 +549,6 @@ MIT
508
549
 
509
550
  OpenCode Quota is not built by the OpenCode team and is not affiliated with OpenCode or any provider listed above.
510
551
 
511
- Anthropic quota detection is delegated to the local Claude CLI/runtime. OpenCode Anthropic API-key usage is unaffected, but this plugin only surfaces Anthropic quota rows when the local Claude CLI exposes them.
512
-
513
552
  ## Star History
514
553
 
515
554
  <a href="https://www.star-history.com/?repos=slkiser%2Fopencode-quota&type=date&legend=bottom-right">
@@ -11,11 +11,31 @@ export type ResolvedAlibabaCodingPlanAuth = {
11
11
  error: string;
12
12
  rawTier?: string;
13
13
  };
14
+ export type AlibabaCodingPlanAuthDiagnostics = {
15
+ state: "none";
16
+ source: null;
17
+ checkedPaths: string[];
18
+ } | {
19
+ state: "configured";
20
+ source: "auth.json";
21
+ checkedPaths: string[];
22
+ tier: AlibabaCodingPlanTier;
23
+ } | {
24
+ state: "invalid";
25
+ source: "auth.json";
26
+ checkedPaths: string[];
27
+ error: string;
28
+ rawTier?: string;
29
+ };
14
30
  export declare function resolveAlibabaCodingPlanAuth(auth: AuthData | null | undefined, fallbackTier?: AlibabaCodingPlanTier): ResolvedAlibabaCodingPlanAuth;
15
31
  export declare function resolveAlibabaCodingPlanAuthCached(params?: {
16
32
  maxAgeMs?: number;
17
33
  fallbackTier?: AlibabaCodingPlanTier;
18
34
  }): Promise<ResolvedAlibabaCodingPlanAuth>;
35
+ export declare function getAlibabaCodingPlanAuthDiagnostics(params?: {
36
+ maxAgeMs?: number;
37
+ fallbackTier?: AlibabaCodingPlanTier;
38
+ }): Promise<AlibabaCodingPlanAuthDiagnostics>;
19
39
  export declare function hasAlibabaAuth(auth: AuthData | null | undefined): boolean;
20
40
  export declare function isAlibabaModelId(model?: string): boolean;
21
41
  //# sourceMappingURL=alibaba-auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"alibaba-auth.d.ts","sourceRoot":"","sources":["../../src/lib/alibaba-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,qBAAqB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGnF,eAAO,MAAM,qCAAqC,OAAQ,CAAC;AAE3D,MAAM,MAAM,6BAA6B,GACrC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,qBAAqB,CAAA;CAAE,GACpE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA+C1D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,YAAY,GAAE,qBAAwD,GACrE,6BAA6B,CAkC/B;AAED,wBAAsB,kCAAkC,CAAC,MAAM,CAAC,EAAE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAKzC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAIxD"}
1
+ {"version":3,"file":"alibaba-auth.d.ts","sourceRoot":"","sources":["../../src/lib/alibaba-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,qBAAqB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnF,eAAO,MAAM,qCAAqC,OAAQ,CAAC;AAI3D,MAAM,MAAM,6BAA6B,GACrC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,qBAAqB,CAAA;CAAE,GACpE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,gCAAgC,GACxC;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,IAAI,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GACD;IACE,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,qBAAqB,CAAC;CAC7B,GACD;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA+CN,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,YAAY,GAAE,qBAAwD,GACrE,6BAA6B,CAkC/B;AAED,wBAAsB,kCAAkC,CAAC,MAAM,CAAC,EAAE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAMzC;AAED,wBAAsB,mCAAmC,CAAC,MAAM,CAAC,EAAE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,GAAG,OAAO,CAAC,gCAAgC,CAAC,CA4B5C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAIxD"}
@@ -1,5 +1,8 @@
1
- import { readAuthFileCached } from "./opencode-auth.js";
1
+ import { getFirstAuthEntryRecord } from "./api-key-resolver.js";
2
+ import { getAuthPaths, readAuthFileCached } from "./opencode-auth.js";
2
3
  export const DEFAULT_ALIBABA_AUTH_CACHE_MAX_AGE_MS = 5_000;
4
+ const ALIBABA_AUTH_KEYS = ["alibaba-coding-plan", "alibaba"];
5
+ const DEFAULT_ALIBABA_CODING_PLAN_TIER = "lite";
3
6
  function getFirstString(obj, keys) {
4
7
  for (const key of keys) {
5
8
  const value = obj[key];
@@ -21,12 +24,12 @@ function normalizeAlibabaTier(value) {
21
24
  return "pro";
22
25
  return null;
23
26
  }
24
- const DEFAULT_ALIBABA_CODING_PLAN_TIER = "lite";
25
27
  function getAlibabaAuth(auth) {
26
- for (const key of ["alibaba-coding-plan", "alibaba"]) {
27
- const alibaba = auth?.[key];
28
- if (!alibaba)
28
+ for (const key of ALIBABA_AUTH_KEYS) {
29
+ const entry = getFirstAuthEntryRecord(auth, [key]);
30
+ if (!entry)
29
31
  continue;
32
+ const alibaba = entry;
30
33
  const credential = typeof alibaba.key === "string" && alibaba.key.trim()
31
34
  ? alibaba.key.trim()
32
35
  : typeof alibaba.access === "string" && alibaba.access.trim()
@@ -75,11 +78,38 @@ export function resolveAlibabaCodingPlanAuth(auth, fallbackTier = DEFAULT_ALIBAB
75
78
  };
76
79
  }
77
80
  export async function resolveAlibabaCodingPlanAuthCached(params) {
81
+ const maxAgeMs = Math.max(0, params?.maxAgeMs ?? DEFAULT_ALIBABA_AUTH_CACHE_MAX_AGE_MS);
78
82
  const auth = await readAuthFileCached({
79
- maxAgeMs: Math.max(0, params?.maxAgeMs ?? DEFAULT_ALIBABA_AUTH_CACHE_MAX_AGE_MS),
83
+ maxAgeMs,
80
84
  });
81
85
  return resolveAlibabaCodingPlanAuth(auth, params?.fallbackTier);
82
86
  }
87
+ export async function getAlibabaCodingPlanAuthDiagnostics(params) {
88
+ const auth = await resolveAlibabaCodingPlanAuthCached(params);
89
+ const checkedPaths = getAuthPaths();
90
+ if (auth.state === "none") {
91
+ return {
92
+ state: "none",
93
+ source: null,
94
+ checkedPaths,
95
+ };
96
+ }
97
+ if (auth.state === "invalid") {
98
+ return {
99
+ state: "invalid",
100
+ source: "auth.json",
101
+ checkedPaths,
102
+ error: auth.error,
103
+ rawTier: auth.rawTier,
104
+ };
105
+ }
106
+ return {
107
+ state: "configured",
108
+ source: "auth.json",
109
+ checkedPaths,
110
+ tier: auth.tier,
111
+ };
112
+ }
83
113
  export function hasAlibabaAuth(auth) {
84
114
  return getAlibabaAuth(auth) !== null;
85
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"alibaba-auth.js","sourceRoot":"","sources":["../../src/lib/alibaba-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alibaba-auth.js","sourceRoot":"","sources":["../../src/lib/alibaba-auth.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,13 @@ export interface EnvVarDef<Source extends string> {
43
43
  name: string;
44
44
  source: Source;
45
45
  }
46
+ export declare function getFirstAuthEntryValue(auth: unknown, authKeys: readonly string[]): unknown;
47
+ export declare function getFirstAuthEntryRecord(auth: unknown, authKeys: readonly string[]): Record<string, unknown> | null;
48
+ export declare function extractProviderOptionsApiKey(config: unknown, params: {
49
+ providerKeys: readonly string[];
50
+ allowedEnvVars?: readonly string[];
51
+ }): string | null;
52
+ export declare function extractAuthApiKeyEntry(auth: unknown, authKeys: readonly string[]): string | null;
46
53
  /** Configuration for resolving an API key from multiple sources */
47
54
  export interface ResolveApiKeyConfig<Source extends string> {
48
55
  /** Environment variables to check (in order) */
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/api-key-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,eAAe,EAAE,CAenE;AAED;;;;;GAKG;AACH,wBAAgB,qCAAqC,IAAI,eAAe,EAAE,CAUzE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CASrE;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY,CAAC,MAAM,SAAS,MAAM;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yDAAyD;AACzD,MAAM,WAAW,SAAS,CAAC,MAAM,SAAS,MAAM;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,mEAAmE;AACnE,MAAM,WAAW,mBAAmB,CAAC,MAAM,SAAS,MAAM;IACxD,gDAAgD;IAChD,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IAE7B,4EAA4E;IAC5E,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAEtD,qCAAqC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,sCAAsC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAE1B,sEAAsE;IACtE,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAElD,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IAEnB,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,MAAM,eAAe,EAAE,CAAC;CAC/C;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,MAAM,SAAS,MAAM,EACvD,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,EACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GACtC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAgCtC;AAED,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB,CAAC,MAAM,SAAS,MAAM;IACtD,0CAA0C;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,sDAAsD;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpD,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,MAAM,eAAe,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,SAAS,MAAM,EAC9D,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC;IACT,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAyBD"}
1
+ {"version":3,"file":"api-key-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/api-key-resolver.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  import { existsSync } from "fs";
8
8
  import { readFile } from "fs/promises";
9
9
  import { join } from "path";
10
+ import { resolveEnvTemplate } from "./env-template.js";
10
11
  import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
11
12
  import { parseJsonOrJsonc } from "./jsonc.js";
12
13
  /**
@@ -61,6 +62,51 @@ export async function readOpencodeConfig(filePath, isJsonc) {
61
62
  return null;
62
63
  }
63
64
  }
65
+ function asRecord(value) {
66
+ return value && typeof value === "object" ? value : null;
67
+ }
68
+ export function getFirstAuthEntryValue(auth, authKeys) {
69
+ const root = asRecord(auth);
70
+ if (!root)
71
+ return undefined;
72
+ for (const authKey of authKeys) {
73
+ if (Object.prototype.hasOwnProperty.call(root, authKey)) {
74
+ return root[authKey];
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ export function getFirstAuthEntryRecord(auth, authKeys) {
80
+ return asRecord(getFirstAuthEntryValue(auth, authKeys));
81
+ }
82
+ export function extractProviderOptionsApiKey(config, params) {
83
+ const provider = asRecord(asRecord(config)?.provider);
84
+ if (!provider)
85
+ return null;
86
+ for (const providerKey of params.providerKeys) {
87
+ const options = asRecord(asRecord(provider[providerKey])?.options);
88
+ const apiKey = options?.apiKey;
89
+ if (typeof apiKey !== "string" || apiKey.trim().length === 0)
90
+ continue;
91
+ const trimmed = apiKey.trim();
92
+ if (!params.allowedEnvVars)
93
+ return trimmed;
94
+ const resolved = resolveEnvTemplate(trimmed, params.allowedEnvVars);
95
+ if (resolved)
96
+ return resolved;
97
+ }
98
+ return null;
99
+ }
100
+ export function extractAuthApiKeyEntry(auth, authKeys) {
101
+ for (const authKey of authKeys) {
102
+ const record = getFirstAuthEntryRecord(auth, [authKey]);
103
+ const key = record?.key;
104
+ if (record?.type === "api" && typeof key === "string" && key.trim().length > 0) {
105
+ return key.trim();
106
+ }
107
+ }
108
+ return null;
109
+ }
64
110
  /**
65
111
  * Resolve an API key from multiple sources with consistent priority.
66
112
  *
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-resolver.js","sourceRoot":"","sources":["../../src/lib/api-key-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-key-resolver.js","sourceRoot":"","sources":["../../src/lib/api-key-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface WriteJsonAtomicOptions {
2
+ trailingNewline?: boolean;
3
+ }
4
+ export declare function writeJsonAtomic(path: string, data: unknown, opts?: WriteJsonAtomicOptions): Promise<void>;
5
+ //# sourceMappingURL=atomic-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-json.d.ts","sourceRoot":"","sources":["../../src/lib/atomic-json.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAUD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,33 @@
1
+ import { mkdir, rename, rm, writeFile } from "fs/promises";
2
+ import { dirname } from "path";
3
+ async function safeRm(target) {
4
+ try {
5
+ await rm(target, { force: true });
6
+ }
7
+ catch {
8
+ // best-effort cleanup
9
+ }
10
+ }
11
+ export async function writeJsonAtomic(path, data, opts = {}) {
12
+ const dir = dirname(path);
13
+ const tmp = `${path}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
14
+ const content = JSON.stringify(data, null, 2) + (opts.trailingNewline ? "\n" : "");
15
+ await mkdir(dir, { recursive: true });
16
+ await writeFile(tmp, content, "utf-8");
17
+ try {
18
+ await rename(tmp, path);
19
+ }
20
+ catch (err) {
21
+ const code = err && typeof err === "object" && "code" in err
22
+ ? String(err.code)
23
+ : "";
24
+ const shouldRetryAsReplace = code === "EPERM" || code === "EEXIST" || code === "EACCES" || code === "ENOTEMPTY";
25
+ if (!shouldRetryAsReplace) {
26
+ await safeRm(tmp);
27
+ throw err;
28
+ }
29
+ await safeRm(path);
30
+ await rename(tmp, path);
31
+ }
32
+ }
33
+ //# sourceMappingURL=atomic-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-json.js","sourceRoot":"","sources":["../../src/lib/atomic-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAM/B,KAAK,UAAU,MAAM,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,IAAa,EACb,OAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEnF,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GACR,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;YAC7C,CAAC,CAAC,MAAM,CAAE,GAA0B,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,oBAAoB,GACxB,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW,CAAC;QAErF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chutes-config.d.ts","sourceRoot":"","sources":["../../src/lib/chutes-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,0CAA0C;AAC1C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,eAAe,CAAC;CACzB;AAID,qCAAqC;AACrC,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,eAAe,GACf,gBAAgB,GAChB,WAAW,CAAC;AAyChB,OAAO,EAAE,qCAAqC,IAAI,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAEjH;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAa9E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAGxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAMD"}
1
+ {"version":3,"file":"chutes-config.d.ts","sourceRoot":"","sources":["../../src/lib/chutes-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,0CAA0C;AAC1C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,eAAe,CAAC;CACzB;AAKD,qCAAqC;AACrC,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,eAAe,GACf,gBAAgB,GAChB,WAAW,CAAC;AAGhB,OAAO,EAAE,qCAAqC,IAAI,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAEjH;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiB9E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAGxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAMD"}
@@ -7,45 +7,10 @@
7
7
  * - Supports {env:VAR_NAME} syntax for environment variable references
8
8
  * 3. auth.json: chutes.key (legacy/fallback)
9
9
  */
10
- import { resolveEnvTemplate } from "./env-template.js";
11
10
  import { readAuthFile } from "./opencode-auth.js";
12
- import { resolveApiKey, getApiKeyDiagnostics, getGlobalOpencodeConfigCandidatePaths, } from "./api-key-resolver.js";
11
+ import { extractAuthApiKeyEntry, extractProviderOptionsApiKey, getApiKeyDiagnostics, getGlobalOpencodeConfigCandidatePaths, resolveApiKey, } from "./api-key-resolver.js";
13
12
  const ALLOWED_CHUTES_ENV_VARS = ["CHUTES_API_KEY"];
14
- /**
15
- * Extract Chutes API key from trusted opencode config object
16
- *
17
- * Looks for: provider.chutes.options.apiKey
18
- */
19
- function extractChutesKeyFromConfig(config) {
20
- if (!config || typeof config !== "object")
21
- return null;
22
- const root = config;
23
- const provider = root.provider;
24
- if (!provider || typeof provider !== "object")
25
- return null;
26
- const chutes = provider.chutes;
27
- if (!chutes || typeof chutes !== "object")
28
- return null;
29
- const options = chutes.options;
30
- if (!options || typeof options !== "object")
31
- return null;
32
- const apiKey = options.apiKey;
33
- if (typeof apiKey !== "string" || apiKey.trim().length === 0)
34
- return null;
35
- return resolveEnvTemplate(apiKey.trim(), ALLOWED_CHUTES_ENV_VARS);
36
- }
37
- /**
38
- * Extract Chutes API key from auth.json
39
- */
40
- function extractChutesKeyFromAuth(auth) {
41
- if (!auth || typeof auth !== "object")
42
- return null;
43
- const chutes = auth.chutes;
44
- if (chutes && chutes.type === "api" && chutes.key && chutes.key.trim().length > 0) {
45
- return chutes.key.trim();
46
- }
47
- return null;
48
- }
13
+ const CHUTES_PROVIDER_KEYS = ["chutes"];
49
14
  // Re-export for consumers that need path info
50
15
  export { getGlobalOpencodeConfigCandidatePaths as getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
51
16
  /**
@@ -61,10 +26,13 @@ export { getGlobalOpencodeConfigCandidatePaths as getOpencodeConfigCandidatePath
61
26
  export async function resolveChutesApiKey() {
62
27
  return resolveApiKey({
63
28
  envVars: [{ name: "CHUTES_API_KEY", source: "env:CHUTES_API_KEY" }],
64
- extractFromConfig: extractChutesKeyFromConfig,
29
+ extractFromConfig: (config) => extractProviderOptionsApiKey(config, {
30
+ providerKeys: CHUTES_PROVIDER_KEYS,
31
+ allowedEnvVars: ALLOWED_CHUTES_ENV_VARS,
32
+ }),
65
33
  configJsonSource: "opencode.json",
66
34
  configJsoncSource: "opencode.jsonc",
67
- extractFromAuth: extractChutesKeyFromAuth,
35
+ extractFromAuth: (auth) => extractAuthApiKeyEntry(auth, CHUTES_PROVIDER_KEYS),
68
36
  authSource: "auth.json",
69
37
  getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
70
38
  }, readAuthFile);
@@ -1 +1 @@
1
- {"version":3,"file":"chutes-config.js","sourceRoot":"","sources":["../../src/lib/chutes-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qCAAqC,GACtC,MAAM,uBAAuB,CAAC;AAQ/B,MAAM,uBAAuB,GAAG,CAAC,gBAAgB,CAAU,CAAC;AAS5D;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,MAAe;IACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,MAAM,GAAI,QAAoC,CAAC,MAAM,CAAC;IAC5D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,OAAO,GAAI,MAAkC,CAAC,OAAO,CAAC;IAC5D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEzD,MAAM,MAAM,GAAI,OAAmC,CAAC,MAAM,CAAC;IAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1E,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,IAAa;IAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,MAAM,GAAI,IAAgC,CAAC,MAEpC,CAAC;IACd,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClF,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8CAA8C;AAC9C,OAAO,EAAE,qCAAqC,IAAI,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAEjH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,aAAa,CAClB;QACE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACnE,iBAAiB,EAAE,0BAA0B;QAC7C,gBAAgB,EAAE,eAAe;QACjC,iBAAiB,EAAE,gBAAgB;QACnC,eAAe,EAAE,wBAAwB;QACzC,UAAU,EAAE,WAAW;QACvB,mBAAmB,EAAE,qCAAqC;KAC3D,EACD,YAAY,CACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC3C,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAK3C,OAAO,oBAAoB,CAAkB;QAC3C,WAAW,EAAE,CAAC,gBAAgB,CAAC;QAC/B,OAAO,EAAE,mBAAmB;QAC5B,mBAAmB,EAAE,qCAAqC;KAC3D,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"chutes-config.js","sourceRoot":"","sources":["../../src/lib/chutes-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,oBAAoB,EACpB,qCAAqC,EACrC,aAAa,GACd,MAAM,uBAAuB,CAAC;AAQ/B,MAAM,uBAAuB,GAAG,CAAC,gBAAgB,CAAU,CAAC;AAC5D,MAAM,oBAAoB,GAAG,CAAC,QAAQ,CAAU,CAAC;AASjD,8CAA8C;AAC9C,OAAO,EAAE,qCAAqC,IAAI,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAEjH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,aAAa,CAClB;QACE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACnE,iBAAiB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC5B,4BAA4B,CAAC,MAAM,EAAE;YACnC,YAAY,EAAE,oBAAoB;YAClC,cAAc,EAAE,uBAAuB;SACxC,CAAC;QACJ,gBAAgB,EAAE,eAAe;QACjC,iBAAiB,EAAE,gBAAgB;QACnC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,CAAC;QAC7E,UAAU,EAAE,WAAW;QACvB,mBAAmB,EAAE,qCAAqC;KAC3D,EACD,YAAY,CACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC3C,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAK3C,OAAO,oBAAoB,CAAkB;QAC3C,WAAW,EAAE,CAAC,gBAAgB,CAAC;QAC/B,OAAO,EAAE,mBAAmB;QAC5B,mBAAmB,EAAE,qCAAqC;KAC3D,CAAC,CAAC;AACL,CAAC"}
@@ -5,7 +5,6 @@
5
5
  * https://api.chutes.ai/users/me/quota_usage/me
6
6
  */
7
7
  import type { ChutesResult } from "./types.js";
8
- export declare function hasChutesApiKeyConfigured(): Promise<boolean>;
9
- export { getChutesKeyDiagnostics, type ChutesKeySource } from "./chutes-config.js";
8
+ export { getChutesKeyDiagnostics, hasChutesApiKey as hasChutesApiKeyConfigured, type ChutesKeySource, } from "./chutes-config.js";
10
9
  export declare function queryChutesQuota(): Promise<ChutesResult>;
11
10
  //# sourceMappingURL=chutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chutes.d.ts","sourceRoot":"","sources":["../../src/lib/chutes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsC/C,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAElE;AAED,OAAO,EAAE,uBAAuB,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAwC9D"}
1
+ {"version":3,"file":"chutes.d.ts","sourceRoot":"","sources":["../../src/lib/chutes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0B/C,OAAO,EACL,uBAAuB,EACvB,eAAe,IAAI,yBAAyB,EAC5C,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAE5B,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAwC9D"}
@@ -7,32 +7,23 @@
7
7
  import { sanitizeDisplaySnippet, sanitizeDisplayText } from "./display-sanitize.js";
8
8
  import { fetchWithTimeout } from "./http.js";
9
9
  import { clampPercent } from "./format-utils.js";
10
- import { resolveChutesApiKey, hasChutesApiKey, } from "./chutes-config.js";
10
+ import { resolveChutesApiKey, } from "./chutes-config.js";
11
11
  function getNextDailyResetUtc() {
12
12
  const now = new Date();
13
13
  const reset = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 1, 0, 0, 0, 0));
14
14
  return reset.toISOString();
15
15
  }
16
- async function readChutesAuth() {
17
- const result = await resolveChutesApiKey();
18
- if (!result)
19
- return null;
20
- return { type: "api", key: result.key, source: result.source };
21
- }
22
16
  const CHUTES_QUOTA_URL = "https://api.chutes.ai/users/me/quota_usage/me";
23
- export async function hasChutesApiKeyConfigured() {
24
- return await hasChutesApiKey();
25
- }
26
- export { getChutesKeyDiagnostics } from "./chutes-config.js";
17
+ export { getChutesKeyDiagnostics, hasChutesApiKey as hasChutesApiKeyConfigured, } from "./chutes-config.js";
27
18
  export async function queryChutesQuota() {
28
- const auth = await readChutesAuth();
29
- if (!auth)
19
+ const resolved = await resolveChutesApiKey();
20
+ if (!resolved)
30
21
  return null;
31
22
  try {
32
23
  const resp = await fetchWithTimeout(CHUTES_QUOTA_URL, {
33
24
  method: "GET",
34
25
  headers: {
35
- Authorization: `Bearer ${auth.key}`,
26
+ Authorization: `Bearer ${resolved.key}`,
36
27
  "User-Agent": "OpenCode-Quota-Toast/1.0",
37
28
  },
38
29
  });
@@ -1 +1 @@
1
- {"version":3,"file":"chutes.js","sourceRoot":"","sources":["../../src/lib/chutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chutes.js","sourceRoot":"","sources":["../../src/lib/chutes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,mBAAmB,GAIpB,MAAM,oBAAoB,CAAC;AAO5B,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACpF,CAAC;IACF,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,gBAAgB,GAAG,+CAA+C,CAAC;AAEzE,OAAO,EACL,uBAAuB,EACvB,eAAe,IAAI,yBAAyB,GAE7C,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC7C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,EAAE;YACpD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,QAAQ,CAAC,GAAG,EAAE;gBACvC,YAAY,EAAE,0BAA0B;aACzC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oBAAoB,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;aAC/E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAwB,CAAC;QAExD,iCAAiC;QACjC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,gBAAgB;YAChB,YAAY,EAAE,oBAAoB,EAAE;SACrC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC7E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-detection.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-detection.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAUD,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAoBtD;AAYD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAqE7E;AAyBD,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAwC3F"}
1
+ {"version":3,"file":"cursor-detection.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-detection.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAUD,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAoBtD;AAYD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAqE7E;AAwBD,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAwC3F"}