@slkiser/opencode-quota 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +64 -48
  2. package/dist/bin/opencode-quota.d.ts.map +1 -1
  3. package/dist/bin/opencode-quota.js +15 -3
  4. package/dist/bin/opencode-quota.js.map +1 -1
  5. package/dist/lib/cli-show.d.ts +8 -0
  6. package/dist/lib/cli-show.d.ts.map +1 -0
  7. package/dist/lib/cli-show.js +178 -0
  8. package/dist/lib/cli-show.js.map +1 -0
  9. package/dist/lib/config-file-utils.d.ts +1 -0
  10. package/dist/lib/config-file-utils.d.ts.map +1 -1
  11. package/dist/lib/config-file-utils.js +10 -0
  12. package/dist/lib/config-file-utils.js.map +1 -1
  13. package/dist/lib/config.d.ts +3 -1
  14. package/dist/lib/config.d.ts.map +1 -1
  15. package/dist/lib/config.js +82 -17
  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 +42 -1
  19. package/dist/lib/copilot.js.map +1 -1
  20. package/dist/lib/entries.d.ts +3 -2
  21. package/dist/lib/entries.d.ts.map +1 -1
  22. package/dist/lib/format-utils.d.ts +7 -0
  23. package/dist/lib/format-utils.d.ts.map +1 -1
  24. package/dist/lib/format-utils.js +7 -0
  25. package/dist/lib/format-utils.js.map +1 -1
  26. package/dist/lib/format.d.ts.map +1 -1
  27. package/dist/lib/format.js +49 -3
  28. package/dist/lib/format.js.map +1 -1
  29. package/dist/lib/google-gemini-cli.d.ts.map +1 -1
  30. package/dist/lib/google-gemini-cli.js +44 -1
  31. package/dist/lib/google-gemini-cli.js.map +1 -1
  32. package/dist/lib/grouped-entry-normalization.js +1 -1
  33. package/dist/lib/grouped-entry-normalization.js.map +1 -1
  34. package/dist/lib/init-installer.d.ts +4 -1
  35. package/dist/lib/init-installer.d.ts.map +1 -1
  36. package/dist/lib/init-installer.js +115 -26
  37. package/dist/lib/init-installer.js.map +1 -1
  38. package/dist/lib/opencode-config-providers.d.ts +6 -0
  39. package/dist/lib/opencode-config-providers.d.ts.map +1 -0
  40. package/dist/lib/opencode-config-providers.js +79 -0
  41. package/dist/lib/opencode-config-providers.js.map +1 -0
  42. package/dist/lib/opencode-go.d.ts +5 -4
  43. package/dist/lib/opencode-go.d.ts.map +1 -1
  44. package/dist/lib/opencode-go.js +32 -18
  45. package/dist/lib/opencode-go.js.map +1 -1
  46. package/dist/lib/provider-model-matching.d.ts +12 -0
  47. package/dist/lib/provider-model-matching.d.ts.map +1 -0
  48. package/dist/lib/provider-model-matching.js +23 -0
  49. package/dist/lib/provider-model-matching.js.map +1 -0
  50. package/dist/lib/quota-render-data.d.ts +3 -0
  51. package/dist/lib/quota-render-data.d.ts.map +1 -1
  52. package/dist/lib/quota-render-data.js +64 -6
  53. package/dist/lib/quota-render-data.js.map +1 -1
  54. package/dist/lib/quota-runtime-context.d.ts.map +1 -1
  55. package/dist/lib/quota-runtime-context.js +1 -0
  56. package/dist/lib/quota-runtime-context.js.map +1 -1
  57. package/dist/lib/quota-state.d.ts +1 -0
  58. package/dist/lib/quota-state.d.ts.map +1 -1
  59. package/dist/lib/quota-state.js +18 -4
  60. package/dist/lib/quota-state.js.map +1 -1
  61. package/dist/lib/quota-status.d.ts +2 -1
  62. package/dist/lib/quota-status.d.ts.map +1 -1
  63. package/dist/lib/quota-status.js +43 -5
  64. package/dist/lib/quota-status.js.map +1 -1
  65. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  66. package/dist/lib/toast-format-grouped.js +45 -9
  67. package/dist/lib/toast-format-grouped.js.map +1 -1
  68. package/dist/lib/tui-runtime.d.ts.map +1 -1
  69. package/dist/lib/tui-runtime.js +14 -2
  70. package/dist/lib/tui-runtime.js.map +1 -1
  71. package/dist/lib/types.d.ts +21 -5
  72. package/dist/lib/types.d.ts.map +1 -1
  73. package/dist/lib/types.js +2 -1
  74. package/dist/lib/types.js.map +1 -1
  75. package/dist/plugin.d.ts.map +1 -1
  76. package/dist/plugin.js +4 -0
  77. package/dist/plugin.js.map +1 -1
  78. package/dist/providers/anthropic.js +3 -3
  79. package/dist/providers/anthropic.js.map +1 -1
  80. package/dist/providers/chutes.d.ts.map +1 -1
  81. package/dist/providers/chutes.js +2 -4
  82. package/dist/providers/chutes.js.map +1 -1
  83. package/dist/providers/copilot.d.ts.map +1 -1
  84. package/dist/providers/copilot.js +17 -10
  85. package/dist/providers/copilot.js.map +1 -1
  86. package/dist/providers/google-account-format.d.ts +6 -0
  87. package/dist/providers/google-account-format.d.ts.map +1 -0
  88. package/dist/providers/google-account-format.js +21 -0
  89. package/dist/providers/google-account-format.js.map +1 -0
  90. package/dist/providers/google-antigravity.d.ts.map +1 -1
  91. package/dist/providers/google-antigravity.js +7 -29
  92. package/dist/providers/google-antigravity.js.map +1 -1
  93. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  94. package/dist/providers/google-gemini-cli.js +12 -32
  95. package/dist/providers/google-gemini-cli.js.map +1 -1
  96. package/dist/providers/nanogpt.d.ts.map +1 -1
  97. package/dist/providers/nanogpt.js +2 -2
  98. package/dist/providers/nanogpt.js.map +1 -1
  99. package/dist/providers/openai.d.ts.map +1 -1
  100. package/dist/providers/openai.js +4 -6
  101. package/dist/providers/openai.js.map +1 -1
  102. package/dist/providers/opencode-go.d.ts +2 -2
  103. package/dist/providers/opencode-go.d.ts.map +1 -1
  104. package/dist/providers/opencode-go.js +60 -11
  105. package/dist/providers/opencode-go.js.map +1 -1
  106. package/dist/providers/synthetic.d.ts.map +1 -1
  107. package/dist/providers/synthetic.js +2 -4
  108. package/dist/providers/synthetic.js.map +1 -1
  109. package/package.json +1 -1
package/README.md CHANGED
@@ -19,17 +19,16 @@
19
19
 
20
20
  ---
21
21
 
22
- ### Installation
22
+ ### Installation (automatic setup)
23
23
 
24
24
  ```bash
25
- # Automatic setup
26
25
  npx @slkiser/opencode-quota init
27
26
  ```
28
27
 
29
28
  > [!IMPORTANT]
30
29
  > OpenCode `>= 1.4.3` and Node.js `>= 18` are required.
31
30
 
32
- The installer is append-only and preserves existing config values. It asks where to install, which quota UI to enable, whether providers should be auto-detected, which quota display style to use, how percentages should be labeled, and whether session input/output tokens should appear in quota displays.
31
+ The installer is append-only and preserves existing config values. It asks where to install, which quota UI to enable, whether providers should be auto-detected, which quota display style to use, how percentages should be labeled, and whether session input/output tokens should appear in quota displays. By default it writes quota settings to `opencode-quota/quota-toast.json` only; if you also need the legacy OpenCode `experimental.quotaToast` block, run `npx @slkiser/opencode-quota init --sync-legacy-config`.
33
32
 
34
33
  After install:
35
34
 
@@ -38,7 +37,17 @@ After install:
38
37
  3. Run `/quota`.
39
38
  4. If you enabled the sidebar, open the session sidebar and confirm the `Quota` panel appears.
40
39
 
41
- ### Manual Setup
40
+ For a terminal-only quota glance:
41
+
42
+ ```bash
43
+ npx @slkiser/opencode-quota show
44
+ # or, if installed/on PATH:
45
+ opencode-quota show --provider copilot
46
+ ```
47
+
48
+ `show` is quota-only: no token/cost reports or `models.dev` refresh. Installer `None (commands and terminal only)` disables toast/sidebar but keeps `/quota`, `/tokens_*`, and terminal `show`.
49
+
50
+ ### Manual setup
42
51
 
43
52
  Add the server plugin to `opencode.json` or `opencode.jsonc`:
44
53
 
@@ -58,15 +67,16 @@ If you also want the sidebar, add the same package to the `tui.json` or `tui.jso
58
67
  }
59
68
  ```
60
69
 
61
- All quota settings live in `opencode.json` or `opencode.jsonc`, not `tui.json`.
70
+ Quota settings live in `opencode-quota/quota-toast.json` next to the OpenCode config file chosen by the installer (project or global). On load, OpenCode Quota reads that sidecar first and falls back to existing `experimental.quotaToast` settings in `opencode.json` / `opencode.jsonc` only when the sidecar is absent. Normal runtime/load does not create, re-add, or migrate `experimental.quotaToast`; use `init --sync-legacy-config` when you explicitly want the installer to also write/sync that legacy block. Quota settings do not live in `tui.json`.
62
71
 
63
- ### What It Adds
72
+ ### What plugin adds
64
73
 
65
74
  - TUI sidebar panel with quota rows
66
75
  - Popup quota toasts after assistant responses
67
76
  - Manual `/quota`, `/quota_status`, and `/tokens_*` commands
77
+ - Terminal `opencode-quota show` command for a quota-only quick glance
68
78
  - Local token reports using bundled and runtime `models.dev` pricing
69
- - Cursor Auto/Composer and Cursor alias pricing that stays deterministic locally
79
+ - Custom quota tracking for companion plugins
70
80
 
71
81
  <table>
72
82
  <tr>
@@ -108,50 +118,47 @@ For companion auth providers, put the companion plugin first and `@slkiser/openc
108
118
  Providers are auto-detected by default. To choose providers explicitly:
109
119
 
110
120
  ```jsonc
121
+ // opencode-quota/quota-toast.json
111
122
  {
112
- "experimental": {
113
- "quotaToast": {
114
- "enabledProviders": ["copilot", "openai", "google-gemini-cli"],
115
- },
116
- },
123
+ "enabledProviders": ["copilot", "openai", "google-gemini-cli"],
117
124
  }
118
125
  ```
119
126
 
120
- ### Display Options
127
+ ### Display options
121
128
 
122
129
  Show every quota window instead of the default most-constrained window:
123
130
 
124
131
  ```jsonc
132
+ // opencode-quota/quota-toast.json
133
+ {
134
+ "formatStyle": "allWindows",
135
+ }
136
+ ```
137
+
138
+ Choose which OpenCode Go usage windows to display (default is all three; `rolling` displays as `5h`):
139
+
140
+ ```jsonc
141
+ // opencode-quota/quota-toast.json
125
142
  {
126
- "experimental": {
127
- "quotaToast": {
128
- "formatStyle": "allWindows",
129
- },
130
- },
143
+ "opencodeGoWindows": ["rolling", "weekly", "monthly"],
131
144
  }
132
145
  ```
133
146
 
134
147
  Show percentages as used instead of remaining in toasts and the sidebar:
135
148
 
136
149
  ```jsonc
150
+ // opencode-quota/quota-toast.json
137
151
  {
138
- "experimental": {
139
- "quotaToast": {
140
- "percentDisplayMode": "used",
141
- },
142
- },
152
+ "percentDisplayMode": "used",
143
153
  }
144
154
  ```
145
155
 
146
156
  Turn off popup toasts while keeping `/quota` and the sidebar:
147
157
 
148
158
  ```jsonc
159
+ // opencode-quota/quota-toast.json
149
160
  {
150
- "experimental": {
151
- "quotaToast": {
152
- "enableToast": false,
153
- },
154
- },
161
+ "enableToast": false,
155
162
  }
156
163
  ```
157
164
 
@@ -159,6 +166,7 @@ Turn off popup toasts while keeping `/quota` and the sidebar:
159
166
 
160
167
  | Command | What it shows |
161
168
  | --------------------- | -------------------------------------------------- |
169
+ | `opencode-quota show` | Terminal quota-only quick glance |
162
170
  | `/quota` | Detailed quota report |
163
171
  | `/quota_status` | Config, provider, auth, pricing, and live probes |
164
172
  | `/pricing_refresh` | Refresh local runtime pricing from `models.dev` |
@@ -173,7 +181,7 @@ Turn off popup toasts while keeping `/quota` and the sidebar:
173
181
 
174
182
  <a id="anthropic-claude-quick-setup"></a>
175
183
 
176
- ### Anthropic Quick Setup
184
+ ### Anthropic quick setup
177
185
 
178
186
  Anthropic does not use a companion OpenCode plugin. Install Claude Code, authenticate it, and make sure `claude` is available on your `PATH`:
179
187
 
@@ -182,9 +190,9 @@ claude auth login
182
190
  claude auth status
183
191
  ```
184
192
 
185
- If Claude lives at a custom path, set `experimental.quotaToast.anthropicBinaryPath` in `opencode.json`.
193
+ If Claude lives at a custom path, set `anthropicBinaryPath` in `opencode-quota/quota-toast.json`.
186
194
 
187
- ### Companion Providers
195
+ ### Companion providers
188
196
 
189
197
  Some providers need an auth companion plugin installed separately. Add the companion plugin first and `@slkiser/opencode-quota` second in `opencode.json` or `opencode.jsonc`.
190
198
 
@@ -192,7 +200,7 @@ Some providers need an auth companion plugin installed separately. Add the compa
192
200
 
193
201
  #### Cursor
194
202
 
195
- Companion plugin: `@playwo/opencode-cursor-oauth`
203
+ Companion plugin: [`@playwo/opencode-cursor-oauth`](https://github.com/PoolPirate/opencode-cursor#readme)
196
204
 
197
205
  Add both plugins to `opencode.json`, with the Cursor auth plugin first:
198
206
 
@@ -218,7 +226,7 @@ opencode auth login --provider cursor
218
226
 
219
227
  #### Qwen Code
220
228
 
221
- Companion plugin: `opencode-qwencode-auth`
229
+ Companion plugin: [`opencode-qwencode-auth`](https://github.com/gustavodiasdev/opencode-qwencode-auth#readme)
222
230
 
223
231
  Add both plugins to `opencode.json`, with the Qwen auth plugin first:
224
232
 
@@ -233,7 +241,7 @@ Add both plugins to `opencode.json`, with the Qwen auth plugin first:
233
241
 
234
242
  #### Google Antigravity
235
243
 
236
- Companion plugin: `opencode-antigravity-auth`
244
+ Companion plugin: [`opencode-antigravity-auth`](https://github.com/NoeFabris/opencode-antigravity-auth#readme)
237
245
 
238
246
  Add both plugins to `opencode.json`, with the Antigravity auth plugin first:
239
247
 
@@ -248,19 +256,22 @@ Add both plugins to `opencode.json`, with the Antigravity auth plugin first:
248
256
 
249
257
  #### Gemini CLI
250
258
 
251
- Companion plugin: `opencode-gemini-auth`
259
+ Companion plugin: [`opencode-gemini-auth`](https://github.com/jenslys/opencode-gemini-auth#readme)
252
260
 
253
- Add both plugins to `opencode.json`, with the Gemini auth plugin first. If you manually choose providers, include `google-gemini-cli`:
261
+ Add both plugins to `opencode.json`, with the Gemini auth plugin first. If you manually choose providers, include `google-gemini-cli` in `opencode-quota/quota-toast.json`:
254
262
 
255
263
  ```jsonc
264
+ // opencode.json
256
265
  {
257
266
  "$schema": "https://opencode.ai/config.json",
258
- "plugin": ["opencode-gemini-auth", "@slkiser/opencode-quota"],
259
- "experimental": {
260
- "quotaToast": {
261
- "enabledProviders": ["google-gemini-cli"]
262
- }
263
- }
267
+ "plugin": ["opencode-gemini-auth", "@slkiser/opencode-quota"]
268
+ }
269
+ ```
270
+
271
+ ```jsonc
272
+ // opencode-quota/quota-toast.json
273
+ {
274
+ "enabledProviders": ["google-gemini-cli"]
264
275
  }
265
276
  ```
266
277
 
@@ -281,6 +292,8 @@ export OPENCODE_GO_WORKSPACE_ID="your-workspace-id"
281
292
  export OPENCODE_GO_AUTH_COOKIE="your-auth-cookie"
282
293
  ```
283
294
 
295
+ The provider can report three usage windows — **5h** rolling, **Weekly**, and **Monthly** — and emits whichever dashboard windows are available in that order. Filter displayed windows with `opencodeGoWindows` in `opencode-quota/quota-toast.json` (`rolling`, `weekly`, `monthly`); non-default subsets report missing selected dashboard fields, while default/all-windows mode shows available windows and diagnostics indicate what was found.
296
+
284
297
  Environment variables take precedence over the optional `opencode-go.json` config file. Run `/quota_status` to see the exact paths checked on your machine.
285
298
 
286
299
  ### Troubleshooting
@@ -303,7 +316,7 @@ Run `/quota_status` and check the Anthropic section.
303
316
  | Symptom | Fix |
304
317
  | --- | --- |
305
318
  | `claude` not found | Install Claude Code and make sure `claude` is on your `PATH`. |
306
- | Claude is installed at a custom path | Set `experimental.quotaToast.anthropicBinaryPath` in `opencode.json`. |
319
+ | Claude is installed at a custom path | Set `anthropicBinaryPath` in `opencode-quota/quota-toast.json`. |
307
320
  | Not authenticated | Run `claude auth login`, then confirm `claude auth status` works. |
308
321
  | Auth works but no quota rows appear | Check `quota_source` and `message` in `/quota_status`; re-authenticate Claude if the OAuth credential fallback is missing or stale. |
309
322
  | Provider not detected | Confirm OpenCode is configured to use the `anthropic` provider. |
@@ -315,6 +328,8 @@ Run `/quota_status` and check the Anthropic section.
315
328
 
316
329
  Run `/quota_status` and check `copilot_quota_auth`, `billing_mode`, `billing_scope`, and `quota_api`.
317
330
 
331
+ For personal Copilot OAuth quota, the plugin uses GitHub's reported premium-interaction quota fields when available. If that specific quota payload marks premium interactions as unlimited, quota output renders `Unlimited` instead of a synthetic used/total ratio.
332
+
318
333
  | Symptom | Fix |
319
334
  | --- | --- |
320
335
  | Personal quota missing | Confirm OpenCode Copilot auth works. The plugin can read OpenCode's Copilot OAuth token. |
@@ -346,8 +361,8 @@ Run `/quota_status` and check the Cursor section.
346
361
  | --- | --- |
347
362
  | Cursor not detected | Put `@playwo/opencode-cursor-oauth` before `@slkiser/opencode-quota` in `opencode.json`. |
348
363
  | Cursor auth missing | Run `opencode auth login --provider cursor`. |
349
- | Quota appears but no remaining percentage | Set `experimental.quotaToast.cursorPlan` or `experimental.quotaToast.cursorIncludedApiUsd`. |
350
- | Billing cycle looks wrong | Set `experimental.quotaToast.cursorBillingCycleStartDay` to your local billing anchor day. |
364
+ | Quota appears but no remaining percentage | Set `cursorPlan` or `cursorIncludedApiUsd` in `opencode-quota/quota-toast.json`. |
365
+ | Billing cycle looks wrong | Set `cursorBillingCycleStartDay` in `opencode-quota/quota-toast.json` to your local billing anchor day. |
351
366
  | Unknown Cursor pricing | Run `/pricing_refresh`; if still unknown, check `/quota_status` for unknown model ids. |
352
367
 
353
368
  </details>
@@ -374,7 +389,7 @@ Run `/quota_status` and check the Alibaba auth, resolved tier, state-file path,
374
389
  | Symptom | Fix |
375
390
  | --- | --- |
376
391
  | API key not detected | Use `ALIBABA_CODING_PLAN_API_KEY`, `ALIBABA_API_KEY`, trusted user/global OpenCode config, or OpenCode auth. Repo-local provider secrets are ignored. |
377
- | Wrong tier | Set `experimental.quotaToast.alibabaCodingPlanTier` to `lite` or `pro`. |
392
+ | Wrong tier | Set `alibabaCodingPlanTier` to `lite` or `pro` in `opencode-quota/quota-toast.json`. |
378
393
  | Counters do not move | Confirm the current model is `alibaba/*` or `alibaba-cn/*`. |
379
394
  | Quota seems stale | Check the state-file path shown in `/quota_status`. |
380
395
 
@@ -420,7 +435,7 @@ Run `/quota_status` and check the Gemini CLI live probe rows.
420
435
  | Symptom | Fix |
421
436
  | --- | --- |
422
437
  | Companion missing | Put `opencode-gemini-auth` before `@slkiser/opencode-quota` in `opencode.json`. |
423
- | Provider not enabled in manual mode | Include `google-gemini-cli` in `experimental.quotaToast.enabledProviders`. |
438
+ | Provider not enabled in manual mode | Include `google-gemini-cli` in `enabledProviders` in `opencode-quota/quota-toast.json`. |
424
439
  | Auth missing | Run `opencode auth login --provider google`. |
425
440
  | Project missing | Set `provider.google.options.projectId`, `OPENCODE_GEMINI_PROJECT_ID`, `GOOGLE_CLOUD_PROJECT`, or `GOOGLE_CLOUD_PROJECT_ID`. |
426
441
 
@@ -436,6 +451,7 @@ Run `/quota_status` and check the `opencode_go` section.
436
451
  | Config not detected | Set both `OPENCODE_GO_WORKSPACE_ID` and `OPENCODE_GO_AUTH_COOKIE`, then rerun `/quota_status`. |
437
452
  | Incomplete config | `workspaceId` and `authCookie` must come from the same source. |
438
453
  | Scrape returns no data | Refresh the browser `auth` cookie from `opencode.ai`. |
454
+ | Selected window missing | Check `/quota_status` for `selected_windows` and `live_fetch_error`; remove unavailable windows from `opencodeGoWindows` in `opencode-quota/quota-toast.json` or refresh the dashboard cookie. |
439
455
  | Dashboard format changed | This integration scrapes the dashboard, so it can break if the dashboard markup changes. |
440
456
 
441
457
  </details>
@@ -449,7 +465,7 @@ Run `/quota_status` and check pricing snapshot health plus OpenCode database pat
449
465
  | --- | --- |
450
466
  | `/tokens_*` is empty | Start OpenCode once so it creates `opencode.db`, then run a session with model usage. |
451
467
  | Pricing looks stale | Run `/pricing_refresh`. |
452
- | Runtime pricing does not change output | Check `experimental.quotaToast.pricingSnapshot.source`; `bundled` keeps packaged pricing active. |
468
+ | Runtime pricing does not change output | Check `pricingSnapshot.source` in `opencode-quota/quota-toast.json`; `bundled` keeps packaged pricing active. |
453
469
  | Cursor model has unknown pricing | Run `/pricing_refresh`; Cursor `auto` and `composer*` use bundled deterministic pricing. |
454
470
 
455
471
  </details>
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-quota.d.ts","sourceRoot":"","sources":["../../src/bin/opencode-quota.ts"],"names":[],"mappings":";AA6BA,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,MAAM,GAAG,SAA2B,EAC3C,UAAU,GAAE,MAAuC,EACnD,WAAW,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAuB,GACzD,OAAO,CAMT;AAED,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBxE"}
1
+ {"version":3,"file":"opencode-quota.d.ts","sourceRoot":"","sources":["../../src/bin/opencode-quota.ts"],"names":[],"mappings":";AAgCA,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,MAAM,GAAG,SAA2B,EAC3C,UAAU,GAAE,MAAuC,EACnD,WAAW,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAuB,GACzD,OAAO,CAMT;AAED,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BxE"}
@@ -5,11 +5,14 @@ import { fileURLToPath } from "node:url";
5
5
  import { runInitInstaller } from "../lib/init-installer.js";
6
6
  const USAGE = [
7
7
  "Usage:",
8
- " npx @slkiser/opencode-quota init",
8
+ " npx @slkiser/opencode-quota init [--sync-legacy-config]",
9
+ " npx @slkiser/opencode-quota show [--provider <provider-id>]",
9
10
  " npx @slkiser/opencode-quota --help",
10
11
  "",
11
12
  "Commands:",
12
13
  " init Run the interactive quota installer",
14
+ " --sync-legacy-config also writes experimental.quotaToast",
15
+ " show Print a quick quota glance",
13
16
  ].join("\n");
14
17
  function printUsage() {
15
18
  console.log(USAGE);
@@ -38,8 +41,17 @@ export async function main(argv = process.argv.slice(2)) {
38
41
  printUsage();
39
42
  return 0;
40
43
  }
41
- if (command === "init" && rest.length === 0) {
42
- return await runInitInstaller();
44
+ if (command === "init") {
45
+ if (rest.length === 0) {
46
+ return await runInitInstaller();
47
+ }
48
+ if (rest.length === 1 && rest[0] === "--sync-legacy-config") {
49
+ return await runInitInstaller({ syncLegacyConfig: true });
50
+ }
51
+ }
52
+ if (command === "show") {
53
+ const { runCliShowCommand } = await import("../lib/cli-show.js");
54
+ return await runCliShowCommand({ argv: rest });
43
55
  }
44
56
  printUsage();
45
57
  return 1;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-quota.js","sourceRoot":"","sources":["../../src/bin/opencode-quota.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,KAAK,GAAG;IACZ,QAAQ;IACR,oCAAoC;IACpC,sCAAsC;IACtC,EAAE;IACF,WAAW;IACX,+CAA+C;CAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAC3C,aAAqB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EACnD,cAA4C,cAAc;IAE1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACnE,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,MAAM,gBAAgB,EAAE,CAAC;IAClC,CAAC;IAED,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,gBAAgB,EAAE,EAAE,CAAC;IACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"opencode-quota.js","sourceRoot":"","sources":["../../src/bin/opencode-quota.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,KAAK,GAAG;IACZ,QAAQ;IACR,2DAA2D;IAC3D,+DAA+D;IAC/D,sCAAsC;IACtC,EAAE;IACF,WAAW;IACX,+CAA+C;IAC/C,oEAAoE;IACpE,sCAAsC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAC3C,aAAqB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EACnD,cAA4C,cAAc;IAE1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACnE,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,gBAAgB,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,sBAAsB,EAAE,CAAC;YAC5D,OAAO,MAAM,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACjE,OAAO,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,gBAAgB,EAAE,EAAE,CAAC;IACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface RunCliShowCommandOptions {
2
+ argv?: string[];
3
+ cwd?: string;
4
+ stdout?: Pick<NodeJS.WriteStream, "write">;
5
+ stderr?: Pick<NodeJS.WriteStream, "write">;
6
+ }
7
+ export declare function runCliShowCommand(options?: RunCliShowCommandOptions): Promise<number>;
8
+ //# sourceMappingURL=cli-show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-show.d.ts","sourceRoot":"","sources":["../../src/lib/cli-show.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC5C;AAwHD,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,CA+E/F"}
@@ -0,0 +1,178 @@
1
+ import { resolve } from "path";
2
+ import { formatQuotaRows } from "./format.js";
3
+ import { getQuotaProviderShape } from "./provider-metadata.js";
4
+ import { findGitWorktreeRoot } from "./config-file-utils.js";
5
+ import { loadConfiguredOpenCodeConfig, loadConfiguredProviderIds, } from "./opencode-config-providers.js";
6
+ import { resolveQuotaFormatStyle } from "./quota-format-style.js";
7
+ import { getPackageVersion } from "./version.js";
8
+ import { collectQuotaRenderData } from "./quota-render-data.js";
9
+ import { sanitizeQuotaRenderData } from "./display-sanitize.js";
10
+ import { createQuotaRuntimeRequestContext, resolveQuotaRuntimeContext, } from "./quota-runtime-context.js";
11
+ const SHOW_USAGE = [
12
+ "Usage:",
13
+ " npx @slkiser/opencode-quota show [--provider <provider-id>]",
14
+ "",
15
+ "Options:",
16
+ " --provider <provider-id> Show quota for one provider",
17
+ " --help, -h Show help",
18
+ ].join("\n");
19
+ function parseShowArgs(argv) {
20
+ let providerId;
21
+ for (let index = 0; index < argv.length; index++) {
22
+ const arg = argv[index];
23
+ if (arg === "--help" || arg === "-h") {
24
+ return { ok: true, help: true };
25
+ }
26
+ if (arg === "--provider") {
27
+ const value = argv[index + 1];
28
+ if (!value || value.startsWith("-")) {
29
+ return { ok: false, error: "Missing value for --provider." };
30
+ }
31
+ if (providerId) {
32
+ return { ok: false, error: "Specify --provider only once." };
33
+ }
34
+ providerId = value;
35
+ index += 1;
36
+ continue;
37
+ }
38
+ if (arg.startsWith("--provider=")) {
39
+ const value = arg.slice("--provider=".length).trim();
40
+ if (!value) {
41
+ return { ok: false, error: "Missing value for --provider." };
42
+ }
43
+ if (providerId) {
44
+ return { ok: false, error: "Specify --provider only once." };
45
+ }
46
+ providerId = value;
47
+ continue;
48
+ }
49
+ if (arg.startsWith("-")) {
50
+ return { ok: false, error: `Unknown option: ${arg}` };
51
+ }
52
+ return { ok: false, error: `Unexpected argument: ${arg}` };
53
+ }
54
+ return { ok: true, providerId, help: false };
55
+ }
56
+ function cloneCliConfig(config) {
57
+ return {
58
+ ...config,
59
+ enabledProviders: Array.isArray(config.enabledProviders)
60
+ ? [...config.enabledProviders]
61
+ : config.enabledProviders,
62
+ googleModels: [...config.googleModels],
63
+ opencodeGoWindows: [...config.opencodeGoWindows],
64
+ pricingSnapshot: { ...config.pricingSnapshot },
65
+ layout: { ...config.layout },
66
+ showSessionTokens: false,
67
+ };
68
+ }
69
+ function resolveCliRoots(cwd) {
70
+ const fallbackDirectory = resolve(cwd);
71
+ const worktreeRoot = findGitWorktreeRoot(fallbackDirectory) ?? fallbackDirectory;
72
+ return {
73
+ workspaceRoot: worktreeRoot,
74
+ configRoot: worktreeRoot,
75
+ fallbackDirectory,
76
+ };
77
+ }
78
+ function createCliQuotaClient(params) {
79
+ let configPromise;
80
+ let providerIdsPromise;
81
+ return {
82
+ config: {
83
+ get: async () => {
84
+ configPromise ??= loadConfiguredOpenCodeConfig({
85
+ configRootDir: params.configRootDir,
86
+ });
87
+ return {
88
+ data: (await configPromise),
89
+ };
90
+ },
91
+ providers: async () => {
92
+ providerIdsPromise ??= loadConfiguredProviderIds({
93
+ configRootDir: params.configRootDir,
94
+ });
95
+ const ids = await providerIdsPromise;
96
+ return {
97
+ data: {
98
+ providers: ids.map((id) => ({ id })),
99
+ },
100
+ };
101
+ },
102
+ },
103
+ };
104
+ }
105
+ function writeLine(stream, message) {
106
+ stream.write(message.endsWith("\n") ? message : `${message}\n`);
107
+ }
108
+ export async function runCliShowCommand(options = {}) {
109
+ const argv = options.argv ?? process.argv.slice(3);
110
+ const stdout = options.stdout ?? process.stdout;
111
+ const stderr = options.stderr ?? process.stderr;
112
+ const parsed = parseShowArgs(argv);
113
+ if (!parsed.ok) {
114
+ writeLine(stderr, parsed.error);
115
+ writeLine(stderr, SHOW_USAGE);
116
+ return 1;
117
+ }
118
+ if (parsed.help) {
119
+ writeLine(stdout, SHOW_USAGE);
120
+ return 0;
121
+ }
122
+ const providerId = parsed.providerId ? getQuotaProviderShape(parsed.providerId)?.id : undefined;
123
+ if (parsed.providerId && !providerId) {
124
+ writeLine(stderr, `Unknown provider: ${parsed.providerId}`);
125
+ return 1;
126
+ }
127
+ try {
128
+ const roots = resolveCliRoots(options.cwd ?? process.cwd());
129
+ const client = createCliQuotaClient({ configRootDir: roots.configRoot });
130
+ const runtime = await resolveQuotaRuntimeContext({
131
+ client,
132
+ roots,
133
+ includeSessionMeta: false,
134
+ });
135
+ if (!runtime.config.enabled) {
136
+ writeLine(stderr, "Quota disabled in config (enabled: false).");
137
+ return 1;
138
+ }
139
+ const config = cloneCliConfig(runtime.config);
140
+ if (providerId) {
141
+ config.enabledProviders = [providerId];
142
+ }
143
+ const result = await collectQuotaRenderData({
144
+ client: runtime.client,
145
+ config,
146
+ request: createQuotaRuntimeRequestContext(runtime),
147
+ surfaceExplicitProviderIssues: true,
148
+ formatStyle: resolveQuotaFormatStyle(config.formatStyle),
149
+ providers: runtime.providers,
150
+ });
151
+ if (!result.data) {
152
+ writeLine(stderr, "No quota data available.");
153
+ return 1;
154
+ }
155
+ const data = sanitizeQuotaRenderData(result.data);
156
+ const version = (await getPackageVersion()) ?? "";
157
+ const output = formatQuotaRows({
158
+ version,
159
+ layout: config.layout,
160
+ entries: data.entries,
161
+ errors: data.errors,
162
+ style: resolveQuotaFormatStyle(config.formatStyle),
163
+ percentDisplayMode: config.percentDisplayMode,
164
+ });
165
+ if (!output.trim()) {
166
+ writeLine(stderr, "No quota data available.");
167
+ return 1;
168
+ }
169
+ writeLine(stdout, output);
170
+ return data.entries.length > 0 ? 0 : 1;
171
+ }
172
+ catch (error) {
173
+ const message = error instanceof Error ? error.message : String(error);
174
+ writeLine(stderr, `Failed to show quota: ${message}`);
175
+ return 1;
176
+ }
177
+ }
178
+ //# sourceMappingURL=cli-show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-show.js","sourceRoot":"","sources":["../../src/lib/cli-show.ts"],"names":[],"mappings":"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"}
@@ -26,5 +26,6 @@ export declare function resolveEditableConfigPath(params: {
26
26
  }): EditableConfigPath;
27
27
  export declare function getPluginSpecFromEntry(entry: unknown): string | null;
28
28
  export declare function extractPluginSpecsFromParsedConfig(parsed: unknown): string[];
29
+ export declare function extractProviderIdsFromParsedConfig(parsed: unknown): string[];
29
30
  export declare function isQuotaPluginSpec(spec: string, kind: ConfigFileKind): boolean;
30
31
  //# sourceMappingURL=config-file-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-file-utils.d.ts","sourceRoot":"","sources":["../../src/lib/config-file-utils.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,KAAK,CAAC;AAChD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE/D;AAiBD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,uBAAuB,GAAG,mBAAmB,CAa/F;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,EAAE,CAEvF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;CACtB,GAAG,kBAAkB,CAwBrB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAcpE;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAwB5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAc7E"}
1
+ {"version":3,"file":"config-file-utils.d.ts","sourceRoot":"","sources":["../../src/lib/config-file-utils.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,KAAK,CAAC;AAChD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE/D;AAiBD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,uBAAuB,GAAG,mBAAmB,CAa/F;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,EAAE,CAEvF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;CACtB,GAAG,kBAAkB,CAwBrB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAcpE;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAwB5E;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAW5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAc7E"}
@@ -96,6 +96,16 @@ export function extractPluginSpecsFromParsedConfig(parsed) {
96
96
  .map((entry) => getPluginSpecFromEntry(entry))
97
97
  .filter((entry) => typeof entry === "string"));
98
98
  }
99
+ export function extractProviderIdsFromParsedConfig(parsed) {
100
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
101
+ return [];
102
+ }
103
+ const root = parsed;
104
+ if (!root.provider || typeof root.provider !== "object" || Array.isArray(root.provider)) {
105
+ return [];
106
+ }
107
+ return dedupeNonEmptyStrings(Object.keys(root.provider));
108
+ }
99
109
  export function isQuotaPluginSpec(spec, kind) {
100
110
  const normalized = spec.replace(/\\/g, "/").toLowerCase();
101
111
  if (normalized.includes("@slkiser/opencode-quota")) {
@@ -1 +1 @@
1
- {"version":3,"file":"config-file-utils.js","sourceRoot":"","sources":["../../src/lib/config-file-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-file-utils.js","sourceRoot":"","sources":["../../src/lib/config-file-utils.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,8 @@
7
7
  * - SDK config is used only as a fallback when no file-backed config exists.
8
8
  */
9
9
  import type { QuotaToastConfig } from "./types.js";
10
- export declare const QUOTA_TOAST_SETTING_SOURCE_KEYS: readonly ["enabled", "enableToast", "formatStyle", "percentDisplayMode", "minIntervalMs", "debug", "enabledProviders", "anthropicBinaryPath", "googleModels", "alibabaCodingPlanTier", "cursorPlan", "cursorIncludedApiUsd", "cursorBillingCycleStartDay", "pricingSnapshot.source", "pricingSnapshot.autoRefresh", "showOnIdle", "showOnQuestion", "showOnCompact", "showOnBothFail", "toastDurationMs", "onlyCurrentModel", "showSessionTokens", "layout.maxWidth", "layout.narrowAt", "layout.tinyAt"];
10
+ export declare const QUOTA_TOAST_CONFIG_RELATIVE_PATH = "opencode-quota/quota-toast.json";
11
+ export declare const QUOTA_TOAST_SETTING_SOURCE_KEYS: readonly ["enabled", "enableToast", "formatStyle", "percentDisplayMode", "minIntervalMs", "debug", "enabledProviders", "anthropicBinaryPath", "googleModels", "alibabaCodingPlanTier", "cursorPlan", "cursorIncludedApiUsd", "cursorBillingCycleStartDay", "opencodeGoWindows", "pricingSnapshot.source", "pricingSnapshot.autoRefresh", "showOnIdle", "showOnQuestion", "showOnCompact", "showOnBothFail", "toastDurationMs", "onlyCurrentModel", "showSessionTokens", "layout.maxWidth", "layout.narrowAt", "layout.tinyAt"];
11
12
  export type QuotaToastSettingSourceKey = (typeof QUOTA_TOAST_SETTING_SOURCE_KEYS)[number];
12
13
  export type QuotaToastSettingSources = Partial<Record<QuotaToastSettingSourceKey, string>>;
13
14
  export interface LoadConfigIssue {
@@ -30,6 +31,7 @@ export interface LoadConfigOptions {
30
31
  configRootDir?: string;
31
32
  }
32
33
  export declare function createLoadConfigMeta(): LoadConfigMeta;
34
+ export declare function getQuotaToastConfigPath(configRootDir: string): string;
33
35
  /**
34
36
  * Load plugin configuration from OpenCode config
35
37
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAEV,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AAYpB,eAAO,MAAM,+BAA+B,2eA0BlC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,+BAA+B,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1F,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,wBAAwB,CAAC;IACzC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAUrD;AAkkBD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EACF;IACE,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,OAAO,CAAC;YACjB,IAAI,CAAC,EAAE;gBAAE,YAAY,CAAC,EAAE;oBAAE,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;iBAAE,CAAA;aAAE,CAAC;SACtE,CAAC,CAAC;KACJ,CAAC;CACH,GACD,SAAS,EACb,IAAI,CAAC,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAkJ3B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAEV,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AAYpB,eAAO,MAAM,gCAAgC,oCAAoC,CAAC;AAElF,eAAO,MAAM,+BAA+B,ggBA2BlC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,+BAA+B,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1F,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,wBAAwB,CAAC;IACzC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAUrD;AAuDD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAErE;AAukBD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EACF;IACE,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,OAAO,CAAC;YACjB,IAAI,CAAC,EAAE;gBAAE,YAAY,CAAC,EAAE;oBAAE,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;iBAAE,CAAA;aAAE,CAAC;SACtE,CAAC,CAAC;KACJ,CAAC;CACH,GACD,SAAS,EACb,IAAI,CAAC,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAyK3B"}