@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.
- package/README.md +64 -25
- package/dist/lib/alibaba-auth.d.ts +20 -0
- package/dist/lib/alibaba-auth.d.ts.map +1 -1
- package/dist/lib/alibaba-auth.js +36 -6
- package/dist/lib/alibaba-auth.js.map +1 -1
- package/dist/lib/api-key-resolver.d.ts +7 -0
- package/dist/lib/api-key-resolver.d.ts.map +1 -1
- package/dist/lib/api-key-resolver.js +46 -0
- package/dist/lib/api-key-resolver.js.map +1 -1
- package/dist/lib/atomic-json.d.ts +5 -0
- package/dist/lib/atomic-json.d.ts.map +1 -0
- package/dist/lib/atomic-json.js +33 -0
- package/dist/lib/atomic-json.js.map +1 -0
- package/dist/lib/chutes-config.d.ts.map +1 -1
- package/dist/lib/chutes-config.js +7 -39
- package/dist/lib/chutes-config.js.map +1 -1
- package/dist/lib/chutes.d.ts +1 -2
- package/dist/lib/chutes.d.ts.map +1 -1
- package/dist/lib/chutes.js +5 -14
- package/dist/lib/chutes.js.map +1 -1
- package/dist/lib/cursor-detection.d.ts.map +1 -1
- package/dist/lib/cursor-detection.js +3 -3
- package/dist/lib/cursor-detection.js.map +1 -1
- package/dist/lib/cursor-pricing.d.ts.map +1 -1
- package/dist/lib/cursor-pricing.js +2 -2
- package/dist/lib/cursor-pricing.js.map +1 -1
- package/dist/lib/cursor-usage.d.ts.map +1 -1
- package/dist/lib/cursor-usage.js +6 -29
- package/dist/lib/cursor-usage.js.map +1 -1
- package/dist/lib/firmware-config.d.ts.map +1 -1
- package/dist/lib/firmware-config.js +7 -40
- package/dist/lib/firmware-config.js.map +1 -1
- package/dist/lib/firmware.d.ts +1 -2
- package/dist/lib/firmware.d.ts.map +1 -1
- package/dist/lib/firmware.js +7 -16
- package/dist/lib/firmware.js.map +1 -1
- package/dist/lib/google.d.ts +10 -0
- package/dist/lib/google.d.ts.map +1 -1
- package/dist/lib/google.js +82 -16
- package/dist/lib/google.js.map +1 -1
- package/dist/lib/minimax-auth.d.ts +17 -0
- package/dist/lib/minimax-auth.d.ts.map +1 -1
- package/dist/lib/minimax-auth.js +30 -3
- package/dist/lib/minimax-auth.js.map +1 -1
- package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
- package/dist/lib/modelsdev-pricing.js +8 -36
- package/dist/lib/modelsdev-pricing.js.map +1 -1
- package/dist/lib/nanogpt-config.d.ts.map +1 -1
- package/dist/lib/nanogpt-config.js +7 -36
- package/dist/lib/nanogpt-config.js.map +1 -1
- package/dist/lib/nanogpt.d.ts +1 -2
- package/dist/lib/nanogpt.d.ts.map +1 -1
- package/dist/lib/nanogpt.js +5 -14
- package/dist/lib/nanogpt.js.map +1 -1
- package/dist/lib/openai.d.ts +21 -2
- package/dist/lib/openai.d.ts.map +1 -1
- package/dist/lib/openai.js +53 -15
- package/dist/lib/openai.js.map +1 -1
- package/dist/lib/opencode-storage.d.ts +8 -0
- package/dist/lib/opencode-storage.d.ts.map +1 -1
- package/dist/lib/opencode-storage.js +86 -19
- package/dist/lib/opencode-storage.js.map +1 -1
- package/dist/lib/provider-availability.d.ts +6 -0
- package/dist/lib/provider-availability.d.ts.map +1 -1
- package/dist/lib/provider-availability.js +9 -0
- package/dist/lib/provider-availability.js.map +1 -1
- package/dist/lib/provider-metadata.d.ts +18 -0
- package/dist/lib/provider-metadata.d.ts.map +1 -1
- package/dist/lib/provider-metadata.js +107 -1
- package/dist/lib/provider-metadata.js.map +1 -1
- package/dist/lib/quota-command-format.d.ts +0 -5
- package/dist/lib/quota-command-format.d.ts.map +1 -1
- package/dist/lib/quota-command-format.js +1 -1
- package/dist/lib/quota-command-format.js.map +1 -1
- package/dist/lib/quota-stats-format.d.ts +8 -1
- package/dist/lib/quota-stats-format.d.ts.map +1 -1
- package/dist/lib/quota-stats-format.js +69 -14
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-stats.d.ts +10 -7
- package/dist/lib/quota-stats.d.ts.map +1 -1
- package/dist/lib/quota-stats.js +100 -58
- package/dist/lib/quota-stats.js.map +1 -1
- package/dist/lib/quota-status.d.ts.map +1 -1
- package/dist/lib/quota-status.js +162 -91
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/qwen-auth.d.ts +4 -0
- package/dist/lib/qwen-auth.d.ts.map +1 -1
- package/dist/lib/qwen-auth.js +6 -6
- package/dist/lib/qwen-auth.js.map +1 -1
- package/dist/lib/qwen-local-quota.d.ts.map +1 -1
- package/dist/lib/qwen-local-quota.js +5 -33
- package/dist/lib/qwen-local-quota.js.map +1 -1
- package/dist/lib/token-buckets.d.ts +24 -0
- package/dist/lib/token-buckets.d.ts.map +1 -0
- package/dist/lib/token-buckets.js +32 -0
- package/dist/lib/token-buckets.js.map +1 -0
- package/dist/lib/types.d.ts +13 -26
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/zai-auth.d.ts +33 -0
- package/dist/lib/zai-auth.d.ts.map +1 -0
- package/dist/lib/zai-auth.js +68 -0
- package/dist/lib/zai-auth.js.map +1 -0
- package/dist/lib/zai.d.ts.map +1 -1
- package/dist/lib/zai.js +17 -17
- package/dist/lib/zai.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +111 -69
- package/dist/plugin.js.map +1 -1
- package/dist/providers/anthropic.js +3 -3
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/chutes.d.ts.map +1 -1
- package/dist/providers/chutes.js +8 -10
- package/dist/providers/chutes.js.map +1 -1
- package/dist/providers/copilot.d.ts.map +1 -1
- package/dist/providers/copilot.js +6 -8
- package/dist/providers/copilot.js.map +1 -1
- package/dist/providers/cursor.js +3 -3
- package/dist/providers/cursor.js.map +1 -1
- package/dist/providers/firmware.d.ts.map +1 -1
- package/dist/providers/firmware.js +8 -11
- package/dist/providers/firmware.js.map +1 -1
- package/dist/providers/google-antigravity.d.ts.map +1 -1
- package/dist/providers/google-antigravity.js +4 -14
- package/dist/providers/google-antigravity.js.map +1 -1
- package/dist/providers/minimax-coding-plan.js +3 -3
- package/dist/providers/minimax-coding-plan.js.map +1 -1
- package/dist/providers/nanogpt.d.ts.map +1 -1
- package/dist/providers/nanogpt.js +2 -13
- package/dist/providers/nanogpt.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +8 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/zai.d.ts.map +1 -1
- package/dist/providers/zai.js +19 -12
- package/dist/providers/zai.js.map +1 -1
- 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://
|
|
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://
|
|
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 |
|
|
80
|
-
| --- | --- | --- |
|
|
81
|
-
| **Anthropic (Claude)** | Needs [quick setup](#anthropic-quick-setup) | Local
|
|
82
|
-
| **GitHub Copilot** | Usually |
|
|
83
|
-
| **OpenAI** | Yes | OpenCode auth
|
|
84
|
-
| **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth
|
|
85
|
-
| **Qwen Code** | Needs [quick setup](#qwen-code-quick-setup) | Companion auth
|
|
86
|
-
| **Alibaba Coding Plan** | Yes | OpenCode auth
|
|
87
|
-
| **Firmware AI** | Usually |
|
|
88
|
-
| **Chutes AI** | Usually |
|
|
89
|
-
| **
|
|
90
|
-
| **
|
|
91
|
-
| **
|
|
92
|
-
| **MiniMax Coding Plan** | Yes |
|
|
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
|
|
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).
|
|
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
|
-
|
|
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":"
|
|
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"}
|
package/dist/lib/alibaba-auth.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
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
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
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
|
|
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":"
|
|
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;
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ9C;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,+BAA+B,EAAE,CAAC;IAEzD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;QACpD,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;QACpD,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qCAAqC;IACnD,MAAM,EAAE,UAAU,EAAE,GAAG,+BAA+B,EAAE,CAAC;IAEzD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,OAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;
|
|
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 @@
|
|
|
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;
|
|
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 {
|
|
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:
|
|
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:
|
|
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,
|
|
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"}
|
package/dist/lib/chutes.d.ts
CHANGED
|
@@ -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
|
|
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
|
package/dist/lib/chutes.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/lib/chutes.js
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
|
29
|
-
if (!
|
|
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 ${
|
|
26
|
+
Authorization: `Bearer ${resolved.key}`,
|
|
36
27
|
"User-Agent": "OpenCode-Quota-Toast/1.0",
|
|
37
28
|
},
|
|
38
29
|
});
|
package/dist/lib/chutes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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;
|
|
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"}
|