@slkiser/opencode-quota 2.9.0 → 2.9.1

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 (49) hide show
  1. package/README.md +24 -60
  2. package/dist/lib/api-key-resolver.d.ts +11 -0
  3. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  4. package/dist/lib/api-key-resolver.js +17 -2
  5. package/dist/lib/api-key-resolver.js.map +1 -1
  6. package/dist/lib/chutes-config.d.ts +3 -3
  7. package/dist/lib/chutes-config.d.ts.map +1 -1
  8. package/dist/lib/chutes-config.js +9 -6
  9. package/dist/lib/chutes-config.js.map +1 -1
  10. package/dist/lib/chutes.d.ts.map +1 -1
  11. package/dist/lib/chutes.js +3 -2
  12. package/dist/lib/chutes.js.map +1 -1
  13. package/dist/lib/config.d.ts +7 -3
  14. package/dist/lib/config.d.ts.map +1 -1
  15. package/dist/lib/config.js +66 -28
  16. package/dist/lib/config.js.map +1 -1
  17. package/dist/lib/copilot.d.ts.map +1 -1
  18. package/dist/lib/copilot.js +4 -3
  19. package/dist/lib/copilot.js.map +1 -1
  20. package/dist/lib/cursor-pricing.d.ts.map +1 -1
  21. package/dist/lib/cursor-pricing.js +3 -0
  22. package/dist/lib/cursor-pricing.js.map +1 -1
  23. package/dist/lib/display-sanitize.d.ts +10 -0
  24. package/dist/lib/display-sanitize.d.ts.map +1 -0
  25. package/dist/lib/display-sanitize.js +17 -0
  26. package/dist/lib/display-sanitize.js.map +1 -0
  27. package/dist/lib/env-template.d.ts +3 -2
  28. package/dist/lib/env-template.d.ts.map +1 -1
  29. package/dist/lib/env-template.js +6 -2
  30. package/dist/lib/env-template.js.map +1 -1
  31. package/dist/lib/firmware-config.d.ts +3 -3
  32. package/dist/lib/firmware-config.d.ts.map +1 -1
  33. package/dist/lib/firmware-config.js +9 -6
  34. package/dist/lib/firmware-config.js.map +1 -1
  35. package/dist/lib/firmware.d.ts.map +1 -1
  36. package/dist/lib/firmware.js +3 -11
  37. package/dist/lib/firmware.js.map +1 -1
  38. package/dist/lib/google-token-cache.js +2 -2
  39. package/dist/lib/google-token-cache.js.map +1 -1
  40. package/dist/lib/openai.d.ts.map +1 -1
  41. package/dist/lib/openai.js +3 -2
  42. package/dist/lib/openai.js.map +1 -1
  43. package/dist/lib/zai.d.ts.map +1 -1
  44. package/dist/lib/zai.js +3 -2
  45. package/dist/lib/zai.js.map +1 -1
  46. package/dist/plugin.d.ts.map +1 -1
  47. package/dist/plugin.js +3 -2
  48. package/dist/plugin.js.map +1 -1
  49. 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.png" alt="Image of opencode-quota toast" />
19
+ <img src="https://github.com/slkiser/opencode-quota/blob/main/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.png" alt="Image of opencode-quota /tokens_weekly output" />
22
+ <img src="https://github.com/slkiser/opencode-quota/blob/main/tokens.webp" alt="Image of opencode-quota /tokens_weekly output" />
23
23
  </td>
24
24
  </tr>
25
25
  </table>
@@ -78,15 +78,15 @@ That is enough for most installs. Providers are auto-detected from your existing
78
78
 
79
79
  | Provider | Auto setup | How it works |
80
80
  | --- | --- | --- |
81
- | **GitHub Copilot** | Usually | OpenCode auth; PAT only for managed billing. [**Notes**](#github-copilot-notes) |
82
- | **OpenAI** | Yes | OpenCode auth. [**Notes**](#openai-notes) |
83
- | **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth plugin + `provider.cursor`. [**Notes**](#cursor-notes) |
84
- | **Qwen Code** | Needs [quick setup](#qwen-code-quick-setup) | Companion auth plugin. [**Notes**](#qwen-code-notes) |
85
- | **Alibaba Coding Plan** | Yes | Native OpenCode auth with local request estimation. [**Notes**](#alibaba-coding-plan-notes) |
86
- | **Firmware AI** | Usually | OpenCode config; API key optional. [**Notes**](#firmware-ai-notes) |
87
- | **Chutes AI** | Usually | OpenCode config; API key optional. [**Notes**](#chutes-ai-notes) |
88
- | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth plugin. [**Notes**](#google-antigravity-notes) |
89
- | **Z.ai** | Yes | OpenCode auth. [**Notes**](#zai-notes) |
81
+ | **GitHub Copilot** | Usually | OpenCode auth; PAT only for managed billing. |
82
+ | **OpenAI** | Yes | OpenCode auth. |
83
+ | **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth plugin + `provider.cursor`. |
84
+ | **Qwen Code** | Needs [quick setup](#qwen-code-quick-setup) | Companion auth plugin. |
85
+ | **Alibaba Coding Plan** | Yes | OpenCode auth + local request estimation. |
86
+ | **Firmware AI** | Usually | User/global OpenCode config or env; repo-local secrets ignored. |
87
+ | **Chutes AI** | Usually | User/global OpenCode config or env; repo-local secrets ignored. |
88
+ | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth plugin. |
89
+ | **Z.ai** | Yes | OpenCode auth. |
90
90
 
91
91
  <a id="cursor-quick-setup"></a>
92
92
  <details>
@@ -207,14 +207,6 @@ Example `copilot-quota-token.json`:
207
207
 
208
208
  </details>
209
209
 
210
- <a id="openai-notes"></a>
211
- <details>
212
- <summary><strong>OpenAI</strong></summary>
213
-
214
- No extra setup is required if OpenCode already has OpenAI or ChatGPT auth configured.
215
-
216
- </details>
217
-
218
210
  <a id="cursor-notes"></a>
219
211
  <details>
220
212
  <summary><strong>Cursor</strong></summary>
@@ -288,7 +280,11 @@ Example fallback tier:
288
280
 
289
281
  If OpenCode already has Firmware configured, it usually works automatically. Optional API key: `provider.firmware.options.apiKey`.
290
282
 
291
- `{env:FIRMWARE_API_KEY}` and literal values are both supported.
283
+ For security, provider secrets are read from environment variables or your user/global OpenCode config only. Repo-local `opencode.json` / `opencode.jsonc` is ignored for `provider.firmware.options.apiKey`.
284
+
285
+ Allowed env templates are limited to `{env:FIRMWARE_AI_API_KEY}` and `{env:FIRMWARE_API_KEY}`.
286
+
287
+ Example user/global config (`~/.config/opencode/opencode.jsonc` on Linux/macOS):
292
288
 
293
289
  ```jsonc
294
290
  {
@@ -310,7 +306,11 @@ If OpenCode already has Firmware configured, it usually works automatically. Opt
310
306
 
311
307
  If OpenCode already has Chutes configured, it usually works automatically. Optional API key: `provider.chutes.options.apiKey`.
312
308
 
313
- `{env:CHUTES_API_KEY}` and literal values are both supported.
309
+ For security, provider secrets are read from environment variables or your user/global OpenCode config only. Repo-local `opencode.json` / `opencode.jsonc` is ignored for `provider.chutes.options.apiKey`.
310
+
311
+ Allowed env templates are limited to `{env:CHUTES_API_KEY}`.
312
+
313
+ Example user/global config (`~/.config/opencode/opencode.jsonc` on Linux/macOS):
314
314
 
315
315
  ```jsonc
316
316
  {
@@ -336,18 +336,12 @@ If detection looks wrong, `/quota_status` prints the candidate paths checked for
336
336
 
337
337
  </details>
338
338
 
339
- <a id="zai-notes"></a>
340
- <details>
341
- <summary><strong>Z.ai</strong></summary>
342
-
343
- No extra setup is required if OpenCode already has Z.ai configured.
344
-
345
- </details>
346
-
347
339
  ## Configuration Reference
348
340
 
349
341
  All plugin settings live under `experimental.quotaToast`.
350
342
 
343
+ Workspace-local config can still customize display/report behavior, but user/global config is authoritative for network-affecting settings such as `enabled`, `enabledProviders`, `minIntervalMs`, `pricingSnapshot`, `showOnIdle`, `showOnQuestion`, and `showOnCompact`.
344
+
351
345
  | Option | Default | Meaning |
352
346
  | --- | --- | --- |
353
347
  | `enabled` | `true` | Master switch for the plugin. When `false`, `/quota`, `/quota_status`, `/pricing_refresh`, and `/tokens_*` are no-ops. |
@@ -403,37 +397,7 @@ If something is missing or looks wrong:
403
397
 
404
398
  If `opencode.db` is missing, start OpenCode once and let its local migration complete.
405
399
 
406
- ## Development
407
-
408
- ```sh
409
- npm install
410
- npm run typecheck
411
- npm test
412
- npm run build
413
- ```
414
-
415
- Maintainer workflow for tracked upstream companion plugins:
416
-
417
- ```sh
418
- npm run upstream:check
419
- npm run upstream:prepare-review
420
- npm run upstream:sync
421
- ```
422
-
423
- - `npm run upstream:check` compares the committed references in `references/upstream-plugins/lock.json` with the latest npm releases for `opencode-qwencode-auth`, `opencode-antigravity-auth`, and `opencode-cursor-oauth`.
424
- - `.github/workflows/upstream-plugin-update-check.yml` runs that check daily and keeps at most one open `[check] <plugin> had update` issue per plugin. If a newer npm release arrives before you act, that same issue is updated and gets a comment instead of piling up more issues.
425
- - `npm run upstream:prepare-review` is the normal maintainer command. It syncs the latest published package copies, runs `npm test`, runs `npm run typecheck`, and prints a ready-to-paste prompt for another agent with changed relative paths and diff previews.
426
- - `npm run upstream:sync` downloads the latest published package contents into `references/upstream-plugins/<plugin>/` and rewrites `references/upstream-plugins/lock.json`.
427
- - Known embedded upstream credentials are redacted deterministically during sync before the reference copies are committed. Update issues still come from `references/upstream-plugins/lock.json` version comparisons.
428
- - Syncing does not close the GitHub issue. The issue stays open until you finish review/fix/release work and close it manually.
429
- - These reference copies are committed for maintainer review only. They are not published in this package because `package.json` ships only `dist`, `README.md`, and `LICENSE`.
430
-
431
- If you maintain this repo through an agentic `/command` workflow, keep your normal-language maintainer prompt rules in local `AGENTS.md`. The current local prompt patterns are:
432
-
433
- - `please help me add feature: <short description>`
434
- - `please handle bug issue #<number>`
435
- - `please handle feature request issue #<number>`
436
- - `please sync our plugin updates`
400
+ ## Contribution
437
401
 
438
402
  See [CONTRIBUTING.md](./CONTRIBUTING.md) for contribution workflow and repository policy.
439
403
 
@@ -16,6 +16,13 @@ export interface ConfigCandidate {
16
16
  * Within each location, .jsonc takes precedence over .json.
17
17
  */
18
18
  export declare function getOpencodeConfigCandidatePaths(): ConfigCandidate[];
19
+ /**
20
+ * Get trusted global-only candidate paths for opencode.json/opencode.jsonc files.
21
+ *
22
+ * Provider secrets must not be sourced from repo-local config because the
23
+ * current workspace may be untrusted.
24
+ */
25
+ export declare function getGlobalOpencodeConfigCandidatePaths(): ConfigCandidate[];
19
26
  /**
20
27
  * Read and parse an opencode config file.
21
28
  *
@@ -50,6 +57,8 @@ export interface ResolveApiKeyConfig<Source extends string> {
50
57
  extractFromAuth: (auth: unknown) => string | null;
51
58
  /** Source label for auth.json */
52
59
  authSource: Source;
60
+ /** Candidate config file paths to trust for provider-secret lookup. */
61
+ getConfigCandidates?: () => ConfigCandidate[];
53
62
  }
54
63
  /**
55
64
  * Resolve an API key from multiple sources with consistent priority.
@@ -68,6 +77,8 @@ export interface DiagnosticsConfig<Source extends string> {
68
77
  envVarNames: string[];
69
78
  /** Resolver function to get the current key result */
70
79
  resolve: () => Promise<ApiKeyResult<Source> | null>;
80
+ /** Candidate config file paths to report for provider-secret lookup. */
81
+ getConfigCandidates?: () => ConfigCandidate[];
71
82
  }
72
83
  /**
73
84
  * Get diagnostic info about API key configuration.
@@ -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;;;;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;CACpB;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;CACrD;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":"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"}
@@ -29,6 +29,21 @@ export function getOpencodeConfigCandidatePaths() {
29
29
  ...global,
30
30
  ];
31
31
  }
32
+ /**
33
+ * Get trusted global-only candidate paths for opencode.json/opencode.jsonc files.
34
+ *
35
+ * Provider secrets must not be sourced from repo-local config because the
36
+ * current workspace may be untrusted.
37
+ */
38
+ export function getGlobalOpencodeConfigCandidatePaths() {
39
+ const { configDirs } = getOpencodeRuntimeDirCandidates();
40
+ const global = [];
41
+ for (const dir of configDirs) {
42
+ global.push({ path: join(dir, "opencode.jsonc"), isJsonc: true });
43
+ global.push({ path: join(dir, "opencode.json"), isJsonc: false });
44
+ }
45
+ return global;
46
+ }
32
47
  /**
33
48
  * Read and parse an opencode config file.
34
49
  *
@@ -65,7 +80,7 @@ export async function resolveApiKey(config, readAuth) {
65
80
  }
66
81
  }
67
82
  // 2. Check opencode.json/opencode.jsonc files
68
- const candidates = getOpencodeConfigCandidatePaths();
83
+ const candidates = config.getConfigCandidates?.() ?? getOpencodeConfigCandidatePaths();
69
84
  for (const candidate of candidates) {
70
85
  const result = await readOpencodeConfig(candidate.path, candidate.isJsonc);
71
86
  if (!result)
@@ -101,7 +116,7 @@ export async function getApiKeyDiagnostics(config) {
101
116
  }
102
117
  }
103
118
  // Track config files checked (only if they exist)
104
- const candidates = getOpencodeConfigCandidatePaths();
119
+ const candidates = config.getConfigCandidates?.() ?? getOpencodeConfigCandidatePaths();
105
120
  for (const candidate of candidates) {
106
121
  if (existsSync(candidate.path)) {
107
122
  checkedPaths.push(candidate.path);
@@ -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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"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Resolution priority (first wins):
5
5
  * 1. Environment variable: CHUTES_API_KEY
6
- * 2. opencode.json/opencode.jsonc: provider.chutes.options.apiKey
6
+ * 2. User/global opencode.json/opencode.jsonc: provider.chutes.options.apiKey
7
7
  * - Supports {env:VAR_NAME} syntax for environment variable references
8
8
  * 3. auth.json: chutes.key (legacy/fallback)
9
9
  */
@@ -14,13 +14,13 @@ export interface ChutesApiKeyResult {
14
14
  }
15
15
  /** Source of the resolved API key */
16
16
  export type ChutesKeySource = "env:CHUTES_API_KEY" | "opencode.json" | "opencode.jsonc" | "auth.json";
17
- export { getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
17
+ export { getGlobalOpencodeConfigCandidatePaths as getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
18
18
  /**
19
19
  * Resolve Chutes API key from all available sources.
20
20
  *
21
21
  * Priority (first wins):
22
22
  * 1. Environment variable: CHUTES_API_KEY
23
- * 2. opencode.json/opencode.jsonc: provider.chutes.options.apiKey
23
+ * 2. User/global opencode.json/opencode.jsonc: provider.chutes.options.apiKey
24
24
  * 3. auth.json: chutes.key
25
25
  *
26
26
  * @returns API key and source, or null if not found
@@ -1 +1 @@
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;AAED,qCAAqC;AACrC,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,eAAe,GACf,gBAAgB,GAChB,WAAW,CAAC;AAyChB,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAY9E;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,CAKD"}
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"}
@@ -3,15 +3,16 @@
3
3
  *
4
4
  * Resolution priority (first wins):
5
5
  * 1. Environment variable: CHUTES_API_KEY
6
- * 2. opencode.json/opencode.jsonc: provider.chutes.options.apiKey
6
+ * 2. User/global opencode.json/opencode.jsonc: provider.chutes.options.apiKey
7
7
  * - Supports {env:VAR_NAME} syntax for environment variable references
8
8
  * 3. auth.json: chutes.key (legacy/fallback)
9
9
  */
10
10
  import { resolveEnvTemplate } from "./env-template.js";
11
11
  import { readAuthFile } from "./opencode-auth.js";
12
- import { resolveApiKey, getApiKeyDiagnostics, } from "./api-key-resolver.js";
12
+ import { resolveApiKey, getApiKeyDiagnostics, getGlobalOpencodeConfigCandidatePaths, } from "./api-key-resolver.js";
13
+ const ALLOWED_CHUTES_ENV_VARS = ["CHUTES_API_KEY"];
13
14
  /**
14
- * Extract Chutes API key from opencode config object
15
+ * Extract Chutes API key from trusted opencode config object
15
16
  *
16
17
  * Looks for: provider.chutes.options.apiKey
17
18
  */
@@ -31,7 +32,7 @@ function extractChutesKeyFromConfig(config) {
31
32
  const apiKey = options.apiKey;
32
33
  if (typeof apiKey !== "string" || apiKey.trim().length === 0)
33
34
  return null;
34
- return resolveEnvTemplate(apiKey.trim());
35
+ return resolveEnvTemplate(apiKey.trim(), ALLOWED_CHUTES_ENV_VARS);
35
36
  }
36
37
  /**
37
38
  * Extract Chutes API key from auth.json
@@ -46,13 +47,13 @@ function extractChutesKeyFromAuth(auth) {
46
47
  return null;
47
48
  }
48
49
  // Re-export for consumers that need path info
49
- export { getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
50
+ export { getGlobalOpencodeConfigCandidatePaths as getOpencodeConfigCandidatePaths } from "./api-key-resolver.js";
50
51
  /**
51
52
  * Resolve Chutes API key from all available sources.
52
53
  *
53
54
  * Priority (first wins):
54
55
  * 1. Environment variable: CHUTES_API_KEY
55
- * 2. opencode.json/opencode.jsonc: provider.chutes.options.apiKey
56
+ * 2. User/global opencode.json/opencode.jsonc: provider.chutes.options.apiKey
56
57
  * 3. auth.json: chutes.key
57
58
  *
58
59
  * @returns API key and source, or null if not found
@@ -65,6 +66,7 @@ export async function resolveChutesApiKey() {
65
66
  configJsoncSource: "opencode.jsonc",
66
67
  extractFromAuth: extractChutesKeyFromAuth,
67
68
  authSource: "auth.json",
69
+ getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
68
70
  }, readAuthFile);
69
71
  }
70
72
  /**
@@ -81,6 +83,7 @@ export async function getChutesKeyDiagnostics() {
81
83
  return getApiKeyDiagnostics({
82
84
  envVarNames: ["CHUTES_API_KEY"],
83
85
  resolve: resolveChutesApiKey,
86
+ getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
84
87
  });
85
88
  }
86
89
  //# sourceMappingURL=chutes-config.js.map
@@ -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,GAGrB,MAAM,uBAAuB,CAAC;AAe/B;;;;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,CAAC,CAAC;AAC3C,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,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;;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;KACxB,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;KAC7B,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,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 +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;AAqC/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;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"}
@@ -4,6 +4,7 @@
4
4
  * Resolves API key from multiple sources and queries:
5
5
  * https://api.chutes.ai/users/me/quota_usage/me
6
6
  */
7
+ import { sanitizeDisplaySnippet, sanitizeDisplayText } from "./display-sanitize.js";
7
8
  import { fetchWithTimeout } from "./http.js";
8
9
  import { clampPercent } from "./format-utils.js";
9
10
  import { resolveChutesApiKey, hasChutesApiKey, } from "./chutes-config.js";
@@ -39,7 +40,7 @@ export async function queryChutesQuota() {
39
40
  const text = await resp.text();
40
41
  return {
41
42
  success: false,
42
- error: `Chutes API error ${resp.status}: ${text.slice(0, 120)}`,
43
+ error: `Chutes API error ${resp.status}: ${sanitizeDisplaySnippet(text, 120)}`,
43
44
  };
44
45
  }
45
46
  const data = (await resp.json());
@@ -56,7 +57,7 @@ export async function queryChutesQuota() {
56
57
  catch (err) {
57
58
  return {
58
59
  success: false,
59
- error: err instanceof Error ? err.message : String(err),
60
+ error: sanitizeDisplayText(err instanceof Error ? err.message : String(err)),
60
61
  };
61
62
  }
62
63
  }
@@ -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":"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"}
@@ -1,8 +1,12 @@
1
1
  /**
2
- * Configuration loader for opencode-quota plugin
2
+ * Configuration loader for opencode-quota plugin.
3
3
  *
4
- * Primary: reads configuration from OpenCode's merged config via the SDK client.
5
- * Fallback: reads local config files directly.
4
+ * Security model:
5
+ * - Config is loaded from opencode.json/opencode.jsonc files directly so we can
6
+ * enforce precedence for network-affecting fields.
7
+ * - User/global config is authoritative for fields that control whether the
8
+ * plugin performs automatic network-backed quota fetches.
9
+ * - SDK config is used only as a fallback when no config files are found.
6
10
  */
7
11
  import type { QuotaToastConfig } from "./types.js";
8
12
  export interface LoadConfigMeta {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAWpB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAErD;AA+BD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE;IACN,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,YAAY,CAAC,EAAE;oBAAE,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;iBAAE,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;KAC9F,CAAC;CACH,EACD,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA4M3B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAEV,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAWpB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAErD;AA6CD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE;IACN,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,YAAY,CAAC,EAAE;oBAAE,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;iBAAE,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;KAC9F,CAAC;CACH,EACD,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAwO3B"}
@@ -1,8 +1,12 @@
1
1
  /**
2
- * Configuration loader for opencode-quota plugin
2
+ * Configuration loader for opencode-quota plugin.
3
3
  *
4
- * Primary: reads configuration from OpenCode's merged config via the SDK client.
5
- * Fallback: reads local config files directly.
4
+ * Security model:
5
+ * - Config is loaded from opencode.json/opencode.jsonc files directly so we can
6
+ * enforce precedence for network-affecting fields.
7
+ * - User/global config is authoritative for fields that control whether the
8
+ * plugin performs automatic network-backed quota fetches.
9
+ * - SDK config is used only as a fallback when no config files are found.
6
10
  */
7
11
  import { DEFAULT_CONFIG } from "./types.js";
8
12
  import { parseJsonOrJsonc } from "./jsonc.js";
@@ -14,6 +18,18 @@ import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
14
18
  export function createLoadConfigMeta() {
15
19
  return { source: "defaults", paths: [] };
16
20
  }
21
+ const NETWORK_AFFECTING_KEYS = [
22
+ "enabled",
23
+ "enabledProviders",
24
+ "minIntervalMs",
25
+ "pricingSnapshot",
26
+ "showOnIdle",
27
+ "showOnQuestion",
28
+ "showOnCompact",
29
+ ];
30
+ function hasOwnKey(value, key) {
31
+ return Object.prototype.hasOwnProperty.call(value, key);
32
+ }
17
33
  /**
18
34
  * Validates and normalizes a Google model ID
19
35
  */
@@ -148,13 +164,7 @@ export async function loadConfig(client, meta) {
148
164
  return null;
149
165
  }
150
166
  }
151
- async function loadFromFiles() {
152
- const cwd = process.cwd();
153
- const { configDirs } = getOpencodeRuntimeDirCandidates();
154
- // Order: global first, then local overrides.
155
- // Within each location, load .json first, then .jsonc so that
156
- // .jsonc takes precedence on key collisions (matching the documented intent).
157
- const locations = [...configDirs, cwd];
167
+ async function loadQuotaToastFromLocations(locations) {
158
168
  const quota = {};
159
169
  const usedPaths = [];
160
170
  for (const dir of locations) {
@@ -166,26 +176,50 @@ export async function loadConfig(client, meta) {
166
176
  if (!parsed || typeof parsed !== "object")
167
177
  continue;
168
178
  const root = parsed;
169
- const picks = [
170
- { key: "experimental.quotaToast", value: root?.experimental?.quotaToast },
171
- ];
172
- const usedKeys = [];
173
- for (const pick of picks) {
174
- if (!pick.value || typeof pick.value !== "object")
175
- continue;
176
- Object.assign(quota, pick.value);
177
- usedKeys.push(pick.key);
178
- }
179
- if (usedKeys.length > 0) {
180
- usedPaths.push(`${p} (${usedKeys.join(", ")})`);
181
- }
179
+ const rawQuotaToast = root?.experimental?.quotaToast;
180
+ if (!rawQuotaToast || typeof rawQuotaToast !== "object")
181
+ continue;
182
+ Object.assign(quota, rawQuotaToast);
183
+ usedPaths.push(`${p} (experimental.quotaToast)`);
182
184
  }
183
185
  }
186
+ return { quota, usedPaths };
187
+ }
188
+ async function loadFromFiles() {
189
+ const cwd = process.cwd();
190
+ const { configDirs } = getOpencodeRuntimeDirCandidates();
191
+ const globalConfig = await loadQuotaToastFromLocations(configDirs);
192
+ const localConfig = await loadQuotaToastFromLocations([cwd]);
193
+ const usedPaths = [...globalConfig.usedPaths, ...localConfig.usedPaths];
194
+ if (usedPaths.length === 0) {
195
+ return { config: null, usedPaths: [] };
196
+ }
197
+ const quota = {
198
+ ...globalConfig.quota,
199
+ ...localConfig.quota,
200
+ };
201
+ // Repo-local config may customize display/formatting, but user/global config
202
+ // remains authoritative for settings that trigger or shape automatic network activity.
203
+ for (const key of NETWORK_AFFECTING_KEYS) {
204
+ if (hasOwnKey(globalConfig.quota, key)) {
205
+ quota[key] = globalConfig.quota[key];
206
+ }
207
+ else if (hasOwnKey(localConfig.quota, key)) {
208
+ quota[key] = localConfig.quota[key];
209
+ }
210
+ }
211
+ return {
212
+ config: normalize(quota),
213
+ usedPaths,
214
+ };
215
+ }
216
+ const fileConfig = await loadFromFiles();
217
+ if (fileConfig.config) {
184
218
  if (meta) {
185
- meta.source = usedPaths.length > 0 ? "files" : "defaults";
186
- meta.paths = usedPaths;
219
+ meta.source = "files";
220
+ meta.paths = fileConfig.usedPaths;
187
221
  }
188
- return normalize(Object.keys(quota).length > 0 ? quota : null);
222
+ return fileConfig.config;
189
223
  }
190
224
  try {
191
225
  const response = await client.config.get();
@@ -199,10 +233,14 @@ export async function loadConfig(client, meta) {
199
233
  }
200
234
  return normalize(quotaToastConfig);
201
235
  }
202
- return await loadFromFiles();
203
236
  }
204
237
  catch {
205
- return await loadFromFiles();
238
+ // ignore; fall back to defaults below
239
+ }
240
+ if (meta) {
241
+ meta.source = "defaults";
242
+ meta.paths = [];
206
243
  }
244
+ return DEFAULT_CONFIG;
207
245
  }
208
246
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/lib/copilot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,QAAQ,EAIR,kBAAkB,EAElB,aAAa,EAGd,MAAM,YAAY,CAAC;AAYpB,KAAK,kBAAkB,GACnB,gBAAgB,GAChB,SAAS,GACT,cAAc,GACd,qBAAqB,CAAC;AAC1B,KAAK,mBAAmB,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAC1E,KAAK,0BAA0B,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAC3D,KAAK,eAAe,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,MAAM,CAAC;AAC/E,KAAK,kBAAkB,GAAG,YAAY,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAC5F,KAAK,2BAA2B,GAC5B,WAAW,GACX,8BAA8B,GAC9B,qCAAqC,GACrC,aAAa,CAAC;AA4BlB,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,oBAAoB,CAAC;IAC1B,KAAK,EAAE;QACL,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;QACnC,eAAe,EAAE,OAAO,CAAC;QACzB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,eAAe,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACzC,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,kBAAkB,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC;IAC9D,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,2BAA2B,CAAC;IAClD,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAqSD,wBAAgB,iCAAiC,IAAI,MAAM,EAAE,CAK5D;AA6DD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAsC9D;AA0BD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,2BAA2B,CA0DrG;AAoaD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyEhE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA0BvE"}
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/lib/copilot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,QAAQ,EAIR,kBAAkB,EAElB,aAAa,EAGd,MAAM,YAAY,CAAC;AAapB,KAAK,kBAAkB,GACnB,gBAAgB,GAChB,SAAS,GACT,cAAc,GACd,qBAAqB,CAAC;AAC1B,KAAK,mBAAmB,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAC1E,KAAK,0BAA0B,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAC3D,KAAK,eAAe,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,MAAM,CAAC;AAC/E,KAAK,kBAAkB,GAAG,YAAY,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAC5F,KAAK,2BAA2B,GAC5B,WAAW,GACX,8BAA8B,GAC9B,qCAAqC,GACrC,aAAa,CAAC;AA4BlB,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,oBAAoB,CAAC;IAC1B,KAAK,EAAE;QACL,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;QACnC,eAAe,EAAE,OAAO,CAAC;QACzB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,eAAe,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACzC,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,kBAAkB,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC;IAC9D,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,2BAA2B,CAAC;IAClD,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAqSD,wBAAgB,iCAAiC,IAAI,MAAM,EAAE,CAK5D;AA6DD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAsC9D;AA0BD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,2BAA2B,CA0DrG;AAoaD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyEhE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA0BvE"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { existsSync, readFileSync } from "fs";
8
8
  import { join } from "path";
9
+ import { sanitizeDisplaySnippet, sanitizeDisplayText } from "./display-sanitize.js";
9
10
  import { fetchWithTimeout } from "./http.js";
10
11
  import { readAuthFile } from "./opencode-auth.js";
11
12
  import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
@@ -410,16 +411,16 @@ async function readGitHubRestErrorMessage(response) {
410
411
  const message = typeof parsed.message === "string" ? parsed.message : null;
411
412
  const documentationUrl = typeof parsed.documentation_url === "string" ? parsed.documentation_url : null;
412
413
  if (message && documentationUrl) {
413
- return `${message} (${documentationUrl})`;
414
+ return sanitizeDisplayText(`${message} (${documentationUrl})`);
414
415
  }
415
416
  if (message) {
416
- return message;
417
+ return sanitizeDisplayText(message);
417
418
  }
418
419
  }
419
420
  catch {
420
421
  // ignore parse failures
421
422
  }
422
- return text.slice(0, 160);
423
+ return sanitizeDisplaySnippet(text, 160);
423
424
  }
424
425
  async function fetchGitHubRestJsonOnce(url, token, scheme) {
425
426
  const response = await fetchWithTimeout(url, {