@slkiser/opencode-quota 1.4.3 → 2.0.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 +68 -52
- package/dist/lib/api-key-resolver.d.ts.map +1 -1
- package/dist/lib/api-key-resolver.js +8 -4
- package/dist/lib/api-key-resolver.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +3 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/entries.d.ts +21 -3
- package/dist/lib/entries.d.ts.map +1 -1
- package/dist/lib/entries.js +6 -1
- package/dist/lib/entries.js.map +1 -1
- package/dist/lib/firmware.d.ts +2 -17
- package/dist/lib/firmware.d.ts.map +1 -1
- package/dist/lib/firmware.js +12 -80
- package/dist/lib/firmware.js.map +1 -1
- package/dist/lib/format-utils.d.ts +1 -0
- package/dist/lib/format-utils.d.ts.map +1 -1
- package/dist/lib/format-utils.js +5 -0
- package/dist/lib/format-utils.js.map +1 -1
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +34 -2
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/google-token-cache.d.ts.map +1 -1
- package/dist/lib/google-token-cache.js +4 -6
- package/dist/lib/google-token-cache.js.map +1 -1
- package/dist/lib/google.d.ts.map +1 -1
- package/dist/lib/google.js +6 -15
- package/dist/lib/google.js.map +1 -1
- package/dist/lib/modelsdev-pricing.d.ts +6 -0
- package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
- package/dist/lib/modelsdev-pricing.js +35 -0
- package/dist/lib/modelsdev-pricing.js.map +1 -1
- package/dist/lib/opencode-auth.d.ts +1 -1
- package/dist/lib/opencode-auth.d.ts.map +1 -1
- package/dist/lib/opencode-auth.js +8 -17
- package/dist/lib/opencode-auth.js.map +1 -1
- package/dist/lib/opencode-runtime-paths.d.ts +23 -0
- package/dist/lib/opencode-runtime-paths.d.ts.map +1 -0
- package/dist/lib/opencode-runtime-paths.js +87 -0
- package/dist/lib/opencode-runtime-paths.js.map +1 -0
- package/dist/lib/opencode-sqlite.d.ts +7 -0
- package/dist/lib/opencode-sqlite.d.ts.map +1 -0
- package/dist/lib/opencode-sqlite.js +44 -0
- package/dist/lib/opencode-sqlite.js.map +1 -0
- package/dist/lib/opencode-storage.d.ts +15 -15
- package/dist/lib/opencode-storage.d.ts.map +1 -1
- package/dist/lib/opencode-storage.js +192 -132
- package/dist/lib/opencode-storage.js.map +1 -1
- package/dist/lib/path-pick.d.ts +2 -0
- package/dist/lib/path-pick.d.ts.map +1 -0
- package/dist/lib/path-pick.js +15 -0
- package/dist/lib/path-pick.js.map +1 -0
- package/dist/lib/quota-command-format.d.ts.map +1 -1
- package/dist/lib/quota-command-format.js +6 -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 +77 -22
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-stats.d.ts +14 -0
- package/dist/lib/quota-stats.d.ts.map +1 -1
- package/dist/lib/quota-stats.js +80 -1
- 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 +159 -14
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/toast-format-grouped.d.ts.map +1 -1
- package/dist/lib/toast-format-grouped.js +31 -1
- package/dist/lib/toast-format-grouped.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +0 -84
- package/dist/plugin.js.map +1 -1
- package/dist/providers/firmware.d.ts.map +1 -1
- package/dist/providers/firmware.js +10 -40
- package/dist/providers/firmware.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -12,9 +12,15 @@ Monitor quota and tokens for OpenCode providers via Toasts and Commands. Zero LL
|
|
|
12
12
|
|
|
13
13
|

|
|
14
14
|
|
|
15
|
+
## Requirements
|
|
16
|
+
|
|
17
|
+
- OpenCode >= 1.2.0 (uses SQLite `opencode.db` for session/message history)
|
|
18
|
+
|
|
19
|
+
This plugin no longer supports the legacy folder-based JSON session storage used by older OpenCode versions.
|
|
20
|
+
|
|
15
21
|
## Installation
|
|
16
22
|
|
|
17
|
-
Add to your `opencode.json
|
|
23
|
+
Add to your `opencode.json` (strict JSON) or `opencode.jsonc` (JSONC with comments/trailing commas):
|
|
18
24
|
|
|
19
25
|
```json
|
|
20
26
|
{
|
|
@@ -26,13 +32,13 @@ That's it. Providers are auto-detected based on your OpenCode configuration. Toa
|
|
|
26
32
|
|
|
27
33
|
**Optional:** To restrict which providers are queried, set `enabledProviders` explicitly:
|
|
28
34
|
|
|
29
|
-
```
|
|
35
|
+
```json
|
|
30
36
|
{
|
|
31
37
|
"experimental": {
|
|
32
38
|
"quotaToast": {
|
|
33
|
-
"enabledProviders": ["copilot", "openai", "google-antigravity"]
|
|
34
|
-
}
|
|
35
|
-
}
|
|
39
|
+
"enabledProviders": ["copilot", "openai", "google-antigravity"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
36
42
|
}
|
|
37
43
|
```
|
|
38
44
|
|
|
@@ -40,20 +46,18 @@ That's it. Providers are auto-detected based on your OpenCode configuration. Toa
|
|
|
40
46
|
|
|
41
47
|
## Commands
|
|
42
48
|
|
|
43
|
-
| Command | Description
|
|
44
|
-
| ------------------------ |
|
|
45
|
-
| `/quota` | Show quota toast (verbose)
|
|
46
|
-
| `/quota_status` | Show diagnostics (config, providers, accounts)
|
|
47
|
-
| |
|
|
48
|
-
| `/tokens_today` | Tokens used today (calendar day)
|
|
49
|
-
| `/tokens_daily` | Tokens used in last 24 hours
|
|
50
|
-
| `/tokens_weekly` | Tokens used in last 7 days
|
|
51
|
-
| `/tokens_monthly` | Tokens used in last 30 days
|
|
52
|
-
| `/tokens_all` | Tokens used all time
|
|
53
|
-
| `/tokens_session` | Tokens used in current session
|
|
54
|
-
| `/tokens_between` | Tokens between two dates (YYYY-MM-DD)
|
|
55
|
-
| | |
|
|
56
|
-
| `/firmware_reset_window` | Resets Firmware 5-hour window (requires confirm) |
|
|
49
|
+
| Command | Description |
|
|
50
|
+
| ------------------------ | --------------------------------------------------------- |
|
|
51
|
+
| `/quota` | Show quota toast (verbose) |
|
|
52
|
+
| `/quota_status` | Show diagnostics (config, providers, accounts) + pricing health |
|
|
53
|
+
| | |
|
|
54
|
+
| `/tokens_today` | Tokens used today (calendar day) |
|
|
55
|
+
| `/tokens_daily` | Tokens used in last 24 hours |
|
|
56
|
+
| `/tokens_weekly` | Tokens used in last 7 days |
|
|
57
|
+
| `/tokens_monthly` | Tokens used in last 30 days (incl. pricing sections) |
|
|
58
|
+
| `/tokens_all` | Tokens used all time |
|
|
59
|
+
| `/tokens_session` | Tokens used in current session |
|
|
60
|
+
| `/tokens_between` | Tokens between two dates (YYYY-MM-DD) |
|
|
57
61
|
|
|
58
62
|
## Supported Providers
|
|
59
63
|
|
|
@@ -75,7 +79,7 @@ Copilot works automatically if OpenCode has Copilot configured and logged in.
|
|
|
75
79
|
**Optional:** For more reliable quota reporting, provide a fine-grained PAT:
|
|
76
80
|
|
|
77
81
|
1. Create a fine-grained PAT at GitHub with **Account permissions > Plan > Read**
|
|
78
|
-
2. Create
|
|
82
|
+
2. Create `copilot-quota-token.json` under OpenCode's runtime config directory (see `opencode debug paths`):
|
|
79
83
|
|
|
80
84
|
```json
|
|
81
85
|
{
|
|
@@ -101,26 +105,26 @@ OpenAI works automatically if OpenCode has OpenAI/ChatGPT configured.
|
|
|
101
105
|
|
|
102
106
|
Works automatically if OpenCode has Firmware configured. Alternatively, provide an API key:
|
|
103
107
|
|
|
104
|
-
```
|
|
108
|
+
```json
|
|
105
109
|
{
|
|
106
110
|
"provider": {
|
|
107
111
|
"firmware": {
|
|
108
112
|
"options": {
|
|
109
|
-
"apiKey": "{env:FIRMWARE_API_KEY}"
|
|
110
|
-
}
|
|
111
|
-
}
|
|
113
|
+
"apiKey": "{env:FIRMWARE_API_KEY}"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
112
116
|
},
|
|
113
117
|
"experimental": {
|
|
114
118
|
"quotaToast": {
|
|
115
|
-
"enabledProviders": ["firmware"]
|
|
116
|
-
}
|
|
117
|
-
}
|
|
119
|
+
"enabledProviders": ["firmware"]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
118
122
|
}
|
|
119
123
|
```
|
|
120
124
|
|
|
121
125
|
The `apiKey` field supports `{env:VAR_NAME}` syntax or a direct key.
|
|
122
126
|
|
|
123
|
-
|
|
127
|
+
|
|
124
128
|
|
|
125
129
|
</details>
|
|
126
130
|
|
|
@@ -129,20 +133,20 @@ The `apiKey` field supports `{env:VAR_NAME}` syntax or a direct key.
|
|
|
129
133
|
|
|
130
134
|
Works automatically if OpenCode has Chutes configured. Alternatively, provide an API key:
|
|
131
135
|
|
|
132
|
-
```
|
|
136
|
+
```json
|
|
133
137
|
{
|
|
134
138
|
"provider": {
|
|
135
139
|
"chutes": {
|
|
136
140
|
"options": {
|
|
137
|
-
"apiKey": "{env:CHUTES_API_KEY}"
|
|
138
|
-
}
|
|
139
|
-
}
|
|
141
|
+
"apiKey": "{env:CHUTES_API_KEY}"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
140
144
|
},
|
|
141
145
|
"experimental": {
|
|
142
146
|
"quotaToast": {
|
|
143
|
-
"enabledProviders": ["chutes"]
|
|
144
|
-
}
|
|
145
|
-
}
|
|
147
|
+
"enabledProviders": ["chutes"]
|
|
148
|
+
}
|
|
149
|
+
}
|
|
146
150
|
}
|
|
147
151
|
```
|
|
148
152
|
|
|
@@ -159,29 +163,41 @@ Requires the `opencode-antigravity-auth` plugin for multi-account support:
|
|
|
159
163
|
}
|
|
160
164
|
```
|
|
161
165
|
|
|
162
|
-
Account credentials are stored
|
|
166
|
+
Account credentials are stored under OpenCode's runtime config directory (see `opencode debug paths`).
|
|
167
|
+
|
|
168
|
+
If you are troubleshooting, `/quota_status` prints the candidate paths checked for `antigravity-accounts.json`.
|
|
163
169
|
|
|
164
170
|
</details>
|
|
165
171
|
|
|
166
172
|
## Configuration Reference
|
|
167
173
|
|
|
168
|
-
All options go under `experimental.quotaToast` in `opencode.json`:
|
|
169
|
-
|
|
170
|
-
| Option | Default | Description
|
|
171
|
-
| ------------------- | ------------ |
|
|
172
|
-
| `enabled` | `true` | Enable/disable plugin
|
|
173
|
-
| `enableToast` | `true` | Show popup toasts
|
|
174
|
-
| `
|
|
175
|
-
| `
|
|
176
|
-
| `
|
|
177
|
-
| `
|
|
178
|
-
| `
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
174
|
+
All options go under `experimental.quotaToast` in `opencode.json` or `opencode.jsonc`:
|
|
175
|
+
|
|
176
|
+
| Option | Default | Description |
|
|
177
|
+
| ------------------- | ------------ | ---------------------------------------------------------------------------- |
|
|
178
|
+
| `enabled` | `true` | Enable/disable plugin |
|
|
179
|
+
| `enableToast` | `true` | Show popup toasts |
|
|
180
|
+
| `toastStyle` | `classic` | Toast layout style: `classic` or `grouped` |
|
|
181
|
+
| `enabledProviders` | `"auto"` | Provider IDs to query, or `"auto"` to detect |
|
|
182
|
+
| `minIntervalMs` | `300000` | Minimum ms between API fetches (default: 5 min) |
|
|
183
|
+
| `toastDurationMs` | `9000` | How long toasts display (ms) |
|
|
184
|
+
| `showOnIdle` | `true` | Show toast on idle trigger |
|
|
185
|
+
| `showOnQuestion` | `true` | Show toast after a question/assistant response |
|
|
186
|
+
| `showOnCompact` | `true` | Show toast after session compaction |
|
|
187
|
+
| `showOnBothFail` | `true` | If providers attempt and fail, show a fallback toast |
|
|
188
|
+
| `onlyCurrentModel` | `false` | Only show quota for the current model (best-effort) |
|
|
189
|
+
| `showSessionTokens` | `true` | Show per-model input/output tokens in toast |
|
|
190
|
+
| `layout.maxWidth` | `50` | Formatting target width |
|
|
191
|
+
| `layout.narrowAt` | `42` | Compact layout breakpoint |
|
|
192
|
+
| `layout.tinyAt` | `32` | Ultra-compact layout breakpoint |
|
|
193
|
+
| `googleModels` | `["CLAUDE"]` | Google models: `CLAUDE`, `G3PRO`, `G3FLASH`, `G3IMAGE` |
|
|
194
|
+
| `debug` | `false` | Show debug info in toasts (and a debug-only toast when otherwise suppressed) |
|
|
181
195
|
|
|
182
196
|
## Troubleshooting
|
|
183
197
|
|
|
184
|
-
Toast not appearing? Run `/quota_status` to check config and
|
|
198
|
+
Toast not appearing? Run `/quota_status` to check config, provider availability, and whether `opencode.db` is detected.
|
|
199
|
+
|
|
200
|
+
If `opencode.db` is missing, run OpenCode once (OpenCode performs a one-time migration into SQLite on first run after upgrade).
|
|
185
201
|
|
|
186
202
|
---
|
|
187
203
|
|
|
@@ -196,13 +212,13 @@ This section provides instructions for LLM agents to install and configure `open
|
|
|
196
212
|
|
|
197
213
|
First, determine what providers the user has connected. You can:
|
|
198
214
|
|
|
199
|
-
1. Read the user's `opencode.json` (typically at `~/.config/opencode
|
|
215
|
+
1. Read the user's `opencode.json` or `opencode.jsonc` (typically at `~/.config/opencode/`)
|
|
200
216
|
2. Run `/connected` in OpenCode to see active providers
|
|
201
217
|
3. Ask the user which providers they use
|
|
202
218
|
|
|
203
219
|
#### Step 2: Install the Plugin
|
|
204
220
|
|
|
205
|
-
Add the plugin to the user's `opencode.json
|
|
221
|
+
Add the plugin to the user's `opencode.json` (or `opencode.jsonc`):
|
|
206
222
|
|
|
207
223
|
```json
|
|
208
224
|
{
|
|
@@ -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":"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"}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { existsSync } from "fs";
|
|
8
8
|
import { readFile } from "fs/promises";
|
|
9
|
-
import { homedir } from "os";
|
|
10
9
|
import { join } from "path";
|
|
10
|
+
import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
|
|
11
11
|
import { parseJsonOrJsonc } from "./jsonc.js";
|
|
12
12
|
/**
|
|
13
13
|
* Get candidate paths for opencode.json/opencode.jsonc files.
|
|
@@ -17,12 +17,16 @@ import { parseJsonOrJsonc } from "./jsonc.js";
|
|
|
17
17
|
*/
|
|
18
18
|
export function getOpencodeConfigCandidatePaths() {
|
|
19
19
|
const cwd = process.cwd();
|
|
20
|
-
const
|
|
20
|
+
const { configDirs } = getOpencodeRuntimeDirCandidates();
|
|
21
|
+
const global = [];
|
|
22
|
+
for (const dir of configDirs) {
|
|
23
|
+
global.push({ path: join(dir, "opencode.jsonc"), isJsonc: true });
|
|
24
|
+
global.push({ path: join(dir, "opencode.json"), isJsonc: false });
|
|
25
|
+
}
|
|
21
26
|
return [
|
|
22
27
|
{ path: join(cwd, "opencode.jsonc"), isJsonc: true },
|
|
23
28
|
{ path: join(cwd, "opencode.json"), isJsonc: false },
|
|
24
|
-
|
|
25
|
-
{ path: join(configBaseDir, "opencode", "opencode.json"), isJsonc: false },
|
|
29
|
+
...global,
|
|
26
30
|
];
|
|
27
31
|
}
|
|
28
32
|
/**
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"api-key-resolver.js","sourceRoot":"","sources":["../../src/lib/api-key-resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAUlE,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;AAiCD;;;;;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,CA+K3B"}
|
package/dist/lib/config.js
CHANGED
|
@@ -8,8 +8,8 @@ import { DEFAULT_CONFIG } from "./types.js";
|
|
|
8
8
|
import { parseJsonOrJsonc } from "./jsonc.js";
|
|
9
9
|
import { existsSync } from "fs";
|
|
10
10
|
import { readFile } from "fs/promises";
|
|
11
|
-
import { homedir } from "os";
|
|
12
11
|
import { join } from "path";
|
|
12
|
+
import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
|
|
13
13
|
export function createLoadConfigMeta() {
|
|
14
14
|
return { source: "defaults", paths: [] };
|
|
15
15
|
}
|
|
@@ -129,11 +129,11 @@ export async function loadConfig(client, meta) {
|
|
|
129
129
|
}
|
|
130
130
|
async function loadFromFiles() {
|
|
131
131
|
const cwd = process.cwd();
|
|
132
|
-
const
|
|
132
|
+
const { configDirs } = getOpencodeRuntimeDirCandidates();
|
|
133
133
|
// Order: global first, then local overrides.
|
|
134
134
|
// Within each location, load .json first, then .jsonc so that
|
|
135
135
|
// .jsonc takes precedence on key collisions (matching the documented intent).
|
|
136
|
-
const locations = [
|
|
136
|
+
const locations = [...configDirs, cwd];
|
|
137
137
|
const quota = {};
|
|
138
138
|
const usedPaths = [];
|
|
139
139
|
for (const dir of locations) {
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/entries.d.ts
CHANGED
|
@@ -4,16 +4,34 @@
|
|
|
4
4
|
* Providers should map their internal quota shapes into these types so that
|
|
5
5
|
* formatting and toast display stays universal across providers.
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
7
|
+
export type QuotaToastEntry = {
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Percent-based entry (default).
|
|
10
|
+
* Note: kind is optional for backwards compatibility.
|
|
10
11
|
*/
|
|
12
|
+
kind?: "percent";
|
|
13
|
+
/** Display label (already human-friendly), e.g. "Copilot" or "Claude (abc..gmail)". */
|
|
11
14
|
name: string;
|
|
12
15
|
/** Remaining quota as a percentage [0..100]. */
|
|
13
16
|
percentRemaining: number;
|
|
14
17
|
/** Optional ISO reset timestamp (shown when percentRemaining is < 100). */
|
|
15
18
|
resetTimeIso?: string;
|
|
16
|
-
}
|
|
19
|
+
} | {
|
|
20
|
+
/** Value-based entry (no percent bar). */
|
|
21
|
+
kind: "value";
|
|
22
|
+
/** Display label (already human-friendly), e.g. "Firmware". */
|
|
23
|
+
name: string;
|
|
24
|
+
/** Human-readable value, e.g. "$42.50". */
|
|
25
|
+
value: string;
|
|
26
|
+
/** Optional ISO reset timestamp (shown when available). */
|
|
27
|
+
resetTimeIso?: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function isValueEntry(e: QuotaToastEntry): e is Extract<QuotaToastEntry, {
|
|
30
|
+
kind: "value";
|
|
31
|
+
}>;
|
|
32
|
+
export declare function isPercentEntry(e: QuotaToastEntry): e is Extract<QuotaToastEntry, {
|
|
33
|
+
percentRemaining: number;
|
|
34
|
+
}>;
|
|
17
35
|
export interface QuotaToastError {
|
|
18
36
|
/** Short label that will be rendered as "label: message". */
|
|
19
37
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../src/lib/entries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,
|
|
1
|
+
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../src/lib/entries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,eAAe,GACvB;IACE;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IAEb,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAC;IAEzB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACD;IACE,0CAA0C;IAC1C,IAAI,EAAE,OAAO,CAAC;IAEd,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IAEb,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IAEd,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,wBAAgB,YAAY,CAC1B,CAAC,EAAE,eAAe,GACjB,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAElD;AAED,wBAAgB,cAAc,CAC5B,CAAC,EAAE,eAAe,GACjB,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAE7D;AAED,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE;QACN,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,OAAO,CAAC;gBAAE,IAAI,CAAC,EAAE;oBAAE,SAAS,EAAE,KAAK,CAAC;wBAAE,EAAE,EAAE,MAAM,CAAA;qBAAE,CAAC,CAAA;iBAAE,CAAA;aAAE,CAAC,CAAC;YAC1E,GAAG,EAAE,MAAM,OAAO,CAAC;gBAAE,IAAI,CAAC,EAAE;oBAAE,KAAK,CAAC,EAAE,MAAM,CAAA;iBAAE,CAAA;aAAE,CAAC,CAAC;SACnD,CAAC;KACH,CAAC;IACF,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;KACpC,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IAEX,8DAA8D;IAC9D,WAAW,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7D,kDAAkD;IAClD,KAAK,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEnE,6DAA6D;IAC7D,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD"}
|
package/dist/lib/entries.js
CHANGED
|
@@ -4,5 +4,10 @@
|
|
|
4
4
|
* Providers should map their internal quota shapes into these types so that
|
|
5
5
|
* formatting and toast display stays universal across providers.
|
|
6
6
|
*/
|
|
7
|
-
export {
|
|
7
|
+
export function isValueEntry(e) {
|
|
8
|
+
return e.kind === "value";
|
|
9
|
+
}
|
|
10
|
+
export function isPercentEntry(e) {
|
|
11
|
+
return !isValueEntry(e);
|
|
12
|
+
}
|
|
8
13
|
//# sourceMappingURL=entries.js.map
|
package/dist/lib/entries.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/lib/entries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
1
|
+
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/lib/entries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiCH,MAAM,UAAU,YAAY,CAC1B,CAAkB;IAElB,OAAQ,CAAS,CAAC,IAAI,KAAK,OAAO,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,CAAkB;IAElB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/lib/firmware.d.ts
CHANGED
|
@@ -5,34 +5,19 @@
|
|
|
5
5
|
* and queries: https://app.firmware.ai/api/v1/quota
|
|
6
6
|
*/
|
|
7
7
|
import type { QuotaError } from "./types.js";
|
|
8
|
-
/** Single window quota info */
|
|
9
|
-
export interface FirmwareWindowQuota {
|
|
10
|
-
percentRemaining: number;
|
|
11
|
-
resetTimeIso?: string;
|
|
12
|
-
}
|
|
13
8
|
export type FirmwareResult = {
|
|
14
9
|
success: true;
|
|
15
|
-
|
|
16
|
-
percentRemaining: number;
|
|
10
|
+
creditsUsd: number;
|
|
17
11
|
resetTimeIso?: string;
|
|
18
|
-
/** Individual windows for grouped display */
|
|
19
|
-
windows: {
|
|
20
|
-
window: FirmwareWindowQuota;
|
|
21
|
-
weekly: FirmwareWindowQuota;
|
|
22
|
-
};
|
|
23
|
-
/** Manual resets available this week (0-2) */
|
|
24
|
-
windowResetsRemaining: number;
|
|
25
12
|
} | QuotaError | null;
|
|
26
13
|
export type FirmwareResetWindowResult = {
|
|
27
14
|
success: true;
|
|
28
|
-
windowResetsRemaining?: number;
|
|
29
15
|
} | QuotaError | null;
|
|
30
16
|
export declare function hasFirmwareApiKeyConfigured(): Promise<boolean>;
|
|
31
17
|
export { getFirmwareKeyDiagnostics, type FirmwareKeySource } from "./firmware-config.js";
|
|
32
18
|
export declare function queryFirmwareQuota(): Promise<FirmwareResult>;
|
|
33
19
|
/**
|
|
34
|
-
*
|
|
35
|
-
* Consumes one of the 2 weekly resets available.
|
|
20
|
+
* Deprecated: Firmware no longer documents a reset-window endpoint.
|
|
36
21
|
*/
|
|
37
22
|
export declare function resetFirmwareQuotaWindow(): Promise<FirmwareResetWindowResult>;
|
|
38
23
|
//# sourceMappingURL=firmware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firmware.d.ts","sourceRoot":"","sources":["../../src/lib/firmware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"firmware.d.ts","sourceRoot":"","sources":["../../src/lib/firmware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAqC7C,MAAM,MAAM,cAAc,GACtB;IACE,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACD,UAAU,GACV,IAAI,CAAC;AAET,MAAM,MAAM,yBAAyB,GACjC;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB,UAAU,GACV,IAAI,CAAC;AAIT,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,OAAO,EAAE,yBAAyB,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,CAAC,CAyClE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAQnF"}
|
package/dist/lib/firmware.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* and queries: https://app.firmware.ai/api/v1/quota
|
|
6
6
|
*/
|
|
7
7
|
import { fetchWithTimeout } from "./http.js";
|
|
8
|
-
import { clampPercent } from "./format-utils.js";
|
|
9
8
|
import { resolveFirmwareApiKey, hasFirmwareApiKey, } from "./firmware-config.js";
|
|
10
9
|
/**
|
|
11
10
|
* Strip control characters (ANSI escapes, etc.) from error text
|
|
@@ -23,7 +22,6 @@ async function readFirmwareAuth() {
|
|
|
23
22
|
return { type: "api", key: result.key, source: result.source };
|
|
24
23
|
}
|
|
25
24
|
const FIRMWARE_QUOTA_URL = "https://app.firmware.ai/api/v1/quota";
|
|
26
|
-
const FIRMWARE_RESET_WINDOW_URL = "https://app.firmware.ai/api/v1/quota/reset-window";
|
|
27
25
|
export async function hasFirmwareApiKeyConfigured() {
|
|
28
26
|
return await hasFirmwareApiKey();
|
|
29
27
|
}
|
|
@@ -48,43 +46,15 @@ export async function queryFirmwareQuota() {
|
|
|
48
46
|
};
|
|
49
47
|
}
|
|
50
48
|
const data = (await resp.json());
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
: undefined;
|
|
57
|
-
// Parse weekly
|
|
58
|
-
const weeklyUsed = typeof data.weeklyUsed === "number" ? data.weeklyUsed : NaN;
|
|
59
|
-
const weeklyPercentRemaining = clampPercent(100 - weeklyUsed * 100);
|
|
60
|
-
const weeklyResetIso = typeof data.weeklyReset === "string" && data.weeklyReset.length > 0
|
|
61
|
-
? data.weeklyReset
|
|
62
|
-
: undefined;
|
|
63
|
-
// Parse resets remaining (use trunc to avoid surprising rounding)
|
|
64
|
-
const windowResetsRemaining = typeof data.windowResetsRemaining === "number"
|
|
65
|
-
? Math.max(0, Math.min(2, Math.trunc(data.windowResetsRemaining)))
|
|
66
|
-
: 0;
|
|
67
|
-
// Back-compat: use worst window for classic display
|
|
68
|
-
const windowQuota = {
|
|
69
|
-
percentRemaining: windowPercentRemaining,
|
|
70
|
-
resetTimeIso: windowResetIso,
|
|
71
|
-
};
|
|
72
|
-
const weeklyQuota = {
|
|
73
|
-
percentRemaining: weeklyPercentRemaining,
|
|
74
|
-
resetTimeIso: weeklyResetIso,
|
|
75
|
-
};
|
|
76
|
-
// Worst window for classic mode
|
|
77
|
-
const isWindowWorse = windowPercentRemaining <= weeklyPercentRemaining;
|
|
78
|
-
const worst = isWindowWorse ? windowQuota : weeklyQuota;
|
|
49
|
+
const creditsUsd = typeof data.credits === "number" ? data.credits : NaN;
|
|
50
|
+
const resetTimeIso = typeof data.reset === "string" && data.reset.length > 0 ? data.reset : undefined;
|
|
51
|
+
if (!Number.isFinite(creditsUsd)) {
|
|
52
|
+
return { success: false, error: "Firmware API response missing credits" };
|
|
53
|
+
}
|
|
79
54
|
return {
|
|
80
55
|
success: true,
|
|
81
|
-
|
|
82
|
-
resetTimeIso
|
|
83
|
-
windows: {
|
|
84
|
-
window: windowQuota,
|
|
85
|
-
weekly: weeklyQuota,
|
|
86
|
-
},
|
|
87
|
-
windowResetsRemaining,
|
|
56
|
+
creditsUsd,
|
|
57
|
+
resetTimeIso,
|
|
88
58
|
};
|
|
89
59
|
}
|
|
90
60
|
catch (err) {
|
|
@@ -95,53 +65,15 @@ export async function queryFirmwareQuota() {
|
|
|
95
65
|
}
|
|
96
66
|
}
|
|
97
67
|
/**
|
|
98
|
-
*
|
|
99
|
-
* Consumes one of the 2 weekly resets available.
|
|
68
|
+
* Deprecated: Firmware no longer documents a reset-window endpoint.
|
|
100
69
|
*/
|
|
101
70
|
export async function resetFirmwareQuotaWindow() {
|
|
102
71
|
const auth = await readFirmwareAuth();
|
|
103
72
|
if (!auth)
|
|
104
73
|
return null;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
Authorization: `Bearer ${auth.key}`,
|
|
110
|
-
"User-Agent": "OpenCode-Quota-Toast/1.0",
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
if (!resp.ok) {
|
|
114
|
-
const text = await resp.text();
|
|
115
|
-
// Try to parse error JSON for better message
|
|
116
|
-
try {
|
|
117
|
-
const errorData = JSON.parse(text);
|
|
118
|
-
if (errorData.message) {
|
|
119
|
-
return {
|
|
120
|
-
success: false,
|
|
121
|
-
error: sanitizeErrorText(errorData.message),
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
// Not JSON, use raw text
|
|
127
|
-
}
|
|
128
|
-
return {
|
|
129
|
-
success: false,
|
|
130
|
-
error: `Firmware API error ${resp.status}: ${sanitizeErrorText(text.slice(0, 120))}`,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
// Parse success response
|
|
134
|
-
const data = (await resp.json());
|
|
135
|
-
return {
|
|
136
|
-
success: true,
|
|
137
|
-
windowResetsRemaining: typeof data.windowResetsRemaining === "number" ? data.windowResetsRemaining : undefined,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
return {
|
|
142
|
-
success: false,
|
|
143
|
-
error: err instanceof Error ? err.message : String(err),
|
|
144
|
-
};
|
|
145
|
-
}
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
error: "Deprecated: Firmware reset-window is no longer supported by the API.",
|
|
77
|
+
};
|
|
146
78
|
}
|
|
147
79
|
//# sourceMappingURL=firmware.js.map
|
package/dist/lib/firmware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firmware.js","sourceRoot":"","sources":["../../src/lib/firmware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"firmware.js","sourceRoot":"","sources":["../../src/lib/firmware.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,7 @@ export declare function formatTokenCount(count: number): string;
|
|
|
42
42
|
*
|
|
43
43
|
* Removes common prefixes/suffixes before truncating with ellipsis.
|
|
44
44
|
*/
|
|
45
|
+
export declare function fmtUsdAmount(n: number): string;
|
|
45
46
|
export declare function shortenModelName(name: string, maxLen: number): string;
|
|
46
47
|
export interface FormatResetCountdownOptions {
|
|
47
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-utils.d.ts","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,2BAA2B,GAAG,MAAM,CAc7F"}
|
|
1
|
+
{"version":3,"file":"format-utils.d.ts","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,2BAA2B,GAAG,MAAM,CAc7F"}
|
package/dist/lib/format-utils.js
CHANGED
|
@@ -72,6 +72,11 @@ export function formatTokenCount(count) {
|
|
|
72
72
|
*
|
|
73
73
|
* Removes common prefixes/suffixes before truncating with ellipsis.
|
|
74
74
|
*/
|
|
75
|
+
export function fmtUsdAmount(n) {
|
|
76
|
+
if (!Number.isFinite(n))
|
|
77
|
+
return "$0.00";
|
|
78
|
+
return `$${n.toFixed(2)}`;
|
|
79
|
+
}
|
|
75
80
|
export function shortenModelName(name, maxLen) {
|
|
76
81
|
if (name.length <= maxLen)
|
|
77
82
|
return name;
|