@slkiser/opencode-quota 1.4.4 → 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 +22 -16
- 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/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-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 +14 -18
- package/dist/lib/opencode-storage.d.ts.map +1 -1
- package/dist/lib/opencode-storage.js +183 -134
- package/dist/lib/opencode-storage.js.map +1 -1
- 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 +151 -28
- 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 +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,12 @@ 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
23
|
Add to your `opencode.json` (strict JSON) or `opencode.jsonc` (JSONC with comments/trailing commas):
|
|
@@ -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
|
|
|
@@ -120,7 +124,7 @@ Works automatically if OpenCode has Firmware configured. Alternatively, provide
|
|
|
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
|
|
|
@@ -191,7 +195,9 @@ All options go under `experimental.quotaToast` in `opencode.json` or `opencode.j
|
|
|
191
195
|
|
|
192
196
|
## Troubleshooting
|
|
193
197
|
|
|
194
|
-
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).
|
|
195
201
|
|
|
196
202
|
---
|
|
197
203
|
|
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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAGlB,MAAM,sBAAsB,CAAC;AAQ9B;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,iFAAiF;IACjF,4CAA4C;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC,CAAC;AACrF,CAAC;AAQD,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACjE,CAAC;AAgBD,MAAM,kBAAkB,GAAG,sCAAsC,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,OAAO,MAAM,iBAAiB,EAAE,CAAC;AACnC,CAAC;AAED,OAAO,EAAE,yBAAyB,EAA0B,MAAM,sBAAsB,CAAC;AAEzF,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,EAAE;YACtD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE;gBACnC,YAAY,EAAE,0BAA0B;aACzC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB,IAAI,CAAC,MAAM,KAAK,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;aACrF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;QAE5D,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACzE,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC;QAC5E,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU;YACV,YAAY;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,sEAAsE;KAC9E,CAAC;AACJ,CAAC"}
|
|
@@ -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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMxF,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,MAAM,CAsHT"}
|
package/dist/lib/format.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Formatting helpers for quota toast output
|
|
3
3
|
*/
|
|
4
|
+
import { isValueEntry } from "./entries.js";
|
|
4
5
|
import { bar, clampInt, formatResetCountdown, padLeft, padRight } from "./format-utils.js";
|
|
5
6
|
import { formatQuotaRowsGrouped } from "./toast-format-grouped.js";
|
|
6
7
|
import { renderSessionTokensLines } from "./session-tokens-format.js";
|
|
@@ -29,7 +30,7 @@ export function formatQuotaRows(params) {
|
|
|
29
30
|
// Line 2 (bar + percent) spans barWidth + separator + percentCol
|
|
30
31
|
const barWidth = Math.max(10, maxWidth - separator.length - percentCol);
|
|
31
32
|
const lines = [];
|
|
32
|
-
const
|
|
33
|
+
const addPercentEntry = (name, resetIso, remaining) => {
|
|
33
34
|
// Show reset countdown whenever quota is not fully available.
|
|
34
35
|
// (i.e., any usage at all, or depleted)
|
|
35
36
|
const timeStr = remaining < 100 ? formatResetCountdown(resetIso, { missing: "-" }) : "";
|
|
@@ -56,8 +57,39 @@ export function formatQuotaRows(params) {
|
|
|
56
57
|
const barLine = [barCell, percentCell].join(separator);
|
|
57
58
|
lines.push(barLine);
|
|
58
59
|
};
|
|
60
|
+
const addValueEntry = (name, resetIso, value) => {
|
|
61
|
+
const timeStr = formatResetCountdown(resetIso, { missing: "-" });
|
|
62
|
+
if (isTiny) {
|
|
63
|
+
// Tiny: single line without percent; keep time col alignment.
|
|
64
|
+
const valueCol = Math.min(value.length, Math.max(6, percentCol + 2));
|
|
65
|
+
const tinyNameCol = maxWidth - separator.length - timeCol - separator.length - valueCol;
|
|
66
|
+
const nameCol = Math.max(1, tinyNameCol);
|
|
67
|
+
const line = [
|
|
68
|
+
padRight(name, nameCol),
|
|
69
|
+
padLeft(timeStr, timeCol),
|
|
70
|
+
padLeft(value, valueCol),
|
|
71
|
+
].join(separator);
|
|
72
|
+
lines.push(line.slice(0, maxWidth));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const right = value;
|
|
76
|
+
const rightWidth = Math.max(right.length, 6);
|
|
77
|
+
const timeWidth = Math.max(timeStr.length, timeCol);
|
|
78
|
+
const leftWidth = Math.max(1, maxWidth - separator.length - rightWidth - separator.length - timeWidth);
|
|
79
|
+
const line = padRight(name, leftWidth) +
|
|
80
|
+
separator +
|
|
81
|
+
padLeft(right, rightWidth) +
|
|
82
|
+
separator +
|
|
83
|
+
padLeft(timeStr, timeWidth);
|
|
84
|
+
lines.push(line.slice(0, maxWidth));
|
|
85
|
+
};
|
|
59
86
|
for (const entry of params.entries ?? []) {
|
|
60
|
-
|
|
87
|
+
if (isValueEntry(entry)) {
|
|
88
|
+
addValueEntry(entry.name, entry.resetTimeIso, entry.value);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
addPercentEntry(entry.name, entry.resetTimeIso, entry.percentRemaining);
|
|
92
|
+
}
|
|
61
93
|
}
|
|
62
94
|
// Add error rows (rendered as "label: message")
|
|
63
95
|
for (const err of params.errors ?? []) {
|
package/dist/lib/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAwB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,UAAU,eAAe,CAAC,MAW/B;IACC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,sBAAsB,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAwC;YACxD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,sBAAsB;IACtB,4DAA4D;IAC5D,mCAAmC;IACnC,0CAA0C;IAC1C,MAAM,MAAM,GAAG,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAExD,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS;IAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,kFAAkF;IAClF,8CAA8C;IAC9C,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAExE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,12 @@ type Snapshot = {
|
|
|
16
16
|
};
|
|
17
17
|
export declare function getPricingSnapshotMeta(): Snapshot["_meta"];
|
|
18
18
|
export declare function hasProvider(providerId: string): boolean;
|
|
19
|
+
export declare function hasModel(providerId: string, modelId: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Infer the snapshot provider that owns a modelId.
|
|
22
|
+
* Returns null when model is not found or is ambiguous across providers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function inferProviderForModelId(modelId: string): string | null;
|
|
19
25
|
export declare function getProviderModelCount(providerId: string): number;
|
|
20
26
|
export declare function listProviders(): string[];
|
|
21
27
|
export declare function lookupCost(providerId: string, modelId: string): CostBuckets | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelsdev-pricing.d.ts","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACxD,CAAC;
|
|
1
|
+
{"version":3,"file":"modelsdev-pricing.d.ts","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACxD,CAAC;AA+BF,wBAAgB,sBAAsB,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE1D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAItE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMlF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from "fs";
|
|
2
2
|
let SNAPSHOT = null;
|
|
3
|
+
let MODEL_INDEX = null;
|
|
3
4
|
function ensureLoaded() {
|
|
4
5
|
if (SNAPSHOT)
|
|
5
6
|
return SNAPSHOT;
|
|
@@ -8,12 +9,46 @@ function ensureLoaded() {
|
|
|
8
9
|
SNAPSHOT = JSON.parse(raw);
|
|
9
10
|
return SNAPSHOT;
|
|
10
11
|
}
|
|
12
|
+
function ensureModelIndex() {
|
|
13
|
+
if (MODEL_INDEX)
|
|
14
|
+
return MODEL_INDEX;
|
|
15
|
+
const snap = ensureLoaded();
|
|
16
|
+
const idx = new Map();
|
|
17
|
+
for (const providerId of Object.keys(snap.providers)) {
|
|
18
|
+
const models = snap.providers[providerId] ?? {};
|
|
19
|
+
for (const modelId of Object.keys(models)) {
|
|
20
|
+
const existing = idx.get(modelId);
|
|
21
|
+
if (existing)
|
|
22
|
+
existing.push(providerId);
|
|
23
|
+
else
|
|
24
|
+
idx.set(modelId, [providerId]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
MODEL_INDEX = idx;
|
|
28
|
+
return idx;
|
|
29
|
+
}
|
|
11
30
|
export function getPricingSnapshotMeta() {
|
|
12
31
|
return ensureLoaded()._meta;
|
|
13
32
|
}
|
|
14
33
|
export function hasProvider(providerId) {
|
|
15
34
|
return !!ensureLoaded().providers[providerId];
|
|
16
35
|
}
|
|
36
|
+
export function hasModel(providerId, modelId) {
|
|
37
|
+
const p = ensureLoaded().providers[providerId];
|
|
38
|
+
if (!p)
|
|
39
|
+
return false;
|
|
40
|
+
return !!p[modelId];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Infer the snapshot provider that owns a modelId.
|
|
44
|
+
* Returns null when model is not found or is ambiguous across providers.
|
|
45
|
+
*/
|
|
46
|
+
export function inferProviderForModelId(modelId) {
|
|
47
|
+
const providers = ensureModelIndex().get(modelId);
|
|
48
|
+
if (!providers || providers.length !== 1)
|
|
49
|
+
return null;
|
|
50
|
+
return providers[0] ?? null;
|
|
51
|
+
}
|
|
17
52
|
export function getProviderModelCount(providerId) {
|
|
18
53
|
return Object.keys(ensureLoaded().providers[providerId] || {}).length;
|
|
19
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelsdev-pricing.js","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAoBlC,IAAI,QAAQ,GAAoB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"modelsdev-pricing.js","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface SqliteConn {
|
|
2
|
+
all<T = unknown>(sql: string, params?: unknown[]): T[];
|
|
3
|
+
get<T = unknown>(sql: string, params?: unknown[]): T | null;
|
|
4
|
+
close(): void;
|
|
5
|
+
}
|
|
6
|
+
export declare function openOpenCodeSqliteReadOnly(dbPath: string): Promise<SqliteConn>;
|
|
7
|
+
//# sourceMappingURL=opencode-sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-sqlite.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-sqlite.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IACvD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,IAAI,IAAI,CAAC;CACf;AAMD,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyCpF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function toParams(params) {
|
|
2
|
+
return Array.isArray(params) ? params : [];
|
|
3
|
+
}
|
|
4
|
+
export async function openOpenCodeSqliteReadOnly(dbPath) {
|
|
5
|
+
const mod = await import("bun:sqlite");
|
|
6
|
+
const Database = mod.Database;
|
|
7
|
+
const db = new Database(dbPath, { readonly: true });
|
|
8
|
+
// Keep reads deterministic and avoid accidental writes.
|
|
9
|
+
try {
|
|
10
|
+
db.query("PRAGMA query_only = ON;").run();
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// ignore
|
|
14
|
+
}
|
|
15
|
+
// Avoid transient SQLITE_BUSY errors (WAL).
|
|
16
|
+
try {
|
|
17
|
+
db.query("PRAGMA busy_timeout = 5000;").run();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// ignore
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
all(sql, params) {
|
|
24
|
+
const stmt = db.query(sql);
|
|
25
|
+
const p = toParams(params);
|
|
26
|
+
return (p.length ? stmt.all(...p) : stmt.all());
|
|
27
|
+
},
|
|
28
|
+
get(sql, params) {
|
|
29
|
+
const stmt = db.query(sql);
|
|
30
|
+
const p = toParams(params);
|
|
31
|
+
const row = (p.length ? stmt.get(...p) : stmt.get());
|
|
32
|
+
return row ?? null;
|
|
33
|
+
},
|
|
34
|
+
close() {
|
|
35
|
+
try {
|
|
36
|
+
db.close();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// ignore
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=opencode-sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-sqlite.js","sourceRoot":"","sources":["../../src/lib/opencode-sqlite.ts"],"names":[],"mappings":"AAMA,SAAS,QAAQ,CAAC,MAAkB;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,MAAc;IAC7D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAI,GAAW,CAAC,QAAe,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,wDAAwD;IACxD,IAAI,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,OAAO;QACL,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAQ,CAAC;QACzD,CAAC;QAED,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAkB,CAAC;YACtE,OAAO,GAAG,IAAI,IAAI,CAAC;QACrB,CAAC;QAED,KAAK;YACH,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|