@slkiser/opencode-quota 2.14.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 +59 -20
- 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/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.map +1 -1
- package/dist/lib/quota-stats-format.js +10 -13
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-stats.d.ts +2 -7
- package/dist/lib/quota-stats.d.ts.map +1 -1
- package/dist/lib/quota-stats.js +17 -43
- 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 +18 -27
- 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
|
@@ -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 | OpenCode auth
|
|
88
|
-
| **Chutes AI** | Usually | OpenCode auth
|
|
89
|
-
| **
|
|
90
|
-
| **
|
|
91
|
-
| **
|
|
92
|
-
| **MiniMax Coding Plan** | Yes | OpenCode auth
|
|
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>
|
|
@@ -257,7 +257,7 @@ Example `copilot-quota-token.json`:
|
|
|
257
257
|
<details>
|
|
258
258
|
<summary><strong>Cursor</strong></summary>
|
|
259
259
|
|
|
260
|
-
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.
|
|
261
261
|
|
|
262
262
|
- Detects Cursor usage when the provider is `cursor` or the stored/current model id is `cursor/*`.
|
|
263
263
|
- `/tokens_*` maps Cursor API-pool models to official pricing and uses bundled static pricing for `auto` and `composer*`.
|
|
@@ -280,6 +280,18 @@ Example override:
|
|
|
280
280
|
|
|
281
281
|
</details>
|
|
282
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
|
+
|
|
283
295
|
<a id="qwen-code-notes"></a>
|
|
284
296
|
<details>
|
|
285
297
|
<summary><strong>Qwen Code</strong></summary>
|
|
@@ -287,9 +299,10 @@ Example override:
|
|
|
287
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.
|
|
288
300
|
|
|
289
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.
|
|
290
303
|
- Counters increment on successful question-tool completions while the current model is `qwen-code/*`.
|
|
291
304
|
- State file: `.../opencode/opencode-quota/qwen-local-quota.json`.
|
|
292
|
-
- 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.
|
|
293
306
|
|
|
294
307
|
</details>
|
|
295
308
|
|
|
@@ -297,10 +310,11 @@ See [Qwen Code quick setup](#qwen-code-quick-setup) for auth. Usage is local-onl
|
|
|
297
310
|
<details>
|
|
298
311
|
<summary><strong>Alibaba Coding Plan</strong></summary>
|
|
299
312
|
|
|
300
|
-
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.
|
|
301
314
|
|
|
302
315
|
- `lite`: `1200 / 5h`, `9000 / week`, `18000 / month`
|
|
303
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.
|
|
304
318
|
- If auth omits `tier`, the plugin uses `experimental.quotaToast.alibabaCodingPlanTier`, which defaults to `lite`.
|
|
305
319
|
- Counters increment on successful question-tool completions while the current model is `alibaba/*` or `alibaba-cn/*`.
|
|
306
320
|
- State file: `.../opencode/opencode-quota/alibaba-coding-plan-local-quota.json`.
|
|
@@ -327,7 +341,7 @@ Example fallback tier:
|
|
|
327
341
|
|
|
328
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.
|
|
329
343
|
|
|
330
|
-
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.
|
|
331
345
|
|
|
332
346
|
Example `auth.json` entry:
|
|
333
347
|
|
|
@@ -345,6 +359,30 @@ Example `auth.json` entry:
|
|
|
345
359
|
|
|
346
360
|
</details>
|
|
347
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
|
+
|
|
348
386
|
<a id="firmware-ai-notes"></a>
|
|
349
387
|
<details>
|
|
350
388
|
<summary><strong>Firmware AI</strong></summary>
|
|
@@ -401,9 +439,10 @@ Example user/global config (`~/.config/opencode/opencode.jsonc` on Linux/macOS):
|
|
|
401
439
|
<details>
|
|
402
440
|
<summary><strong>Google Antigravity</strong></summary>
|
|
403
441
|
|
|
404
|
-
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.
|
|
405
443
|
|
|
406
|
-
|
|
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`.
|
|
407
446
|
|
|
408
447
|
</details>
|
|
409
448
|
|
|
@@ -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"}
|
|
@@ -5,7 +5,8 @@ import { join } from "path";
|
|
|
5
5
|
import { parseJsonOrJsonc } from "./jsonc.js";
|
|
6
6
|
import { getAuthPaths } from "./opencode-auth.js";
|
|
7
7
|
import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
|
|
8
|
-
import {
|
|
8
|
+
import { getQuotaProviderRuntimeIds } from "./provider-metadata.js";
|
|
9
|
+
import { CURSOR_LEGACY_PROVIDER_ID, } from "./cursor-pricing.js";
|
|
9
10
|
function dedupe(list) {
|
|
10
11
|
return [...new Set(list.filter(Boolean))];
|
|
11
12
|
}
|
|
@@ -127,8 +128,7 @@ function pluginIncludesCursor(value) {
|
|
|
127
128
|
function providerConfigIncludesCursor(value) {
|
|
128
129
|
if (!value || typeof value !== "object")
|
|
129
130
|
return false;
|
|
130
|
-
return (Object.prototype.hasOwnProperty.call(value,
|
|
131
|
-
Object.prototype.hasOwnProperty.call(value, CURSOR_LEGACY_PROVIDER_ID));
|
|
131
|
+
return getQuotaProviderRuntimeIds("cursor").some((id) => Object.prototype.hasOwnProperty.call(value, id));
|
|
132
132
|
}
|
|
133
133
|
export async function inspectCursorOpenCodeIntegration() {
|
|
134
134
|
const { configDirs } = getOpencodeRuntimeDirCandidates();
|