@slkiser/opencode-quota 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -73
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +31 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/copilot.d.ts.map +1 -1
- package/dist/lib/copilot.js +8 -1
- package/dist/lib/copilot.js.map +1 -1
- package/dist/lib/firmware.d.ts +22 -0
- package/dist/lib/firmware.d.ts.map +1 -1
- package/dist/lib/firmware.js +96 -7
- package/dist/lib/firmware.js.map +1 -1
- package/dist/lib/markdown-table.d.ts +7 -0
- package/dist/lib/markdown-table.d.ts.map +1 -1
- package/dist/lib/markdown-table.js +76 -9
- package/dist/lib/markdown-table.js.map +1 -1
- package/dist/lib/opencode-auth.d.ts.map +1 -1
- package/dist/lib/opencode-auth.js +3 -1
- package/dist/lib/opencode-auth.js.map +1 -1
- package/dist/lib/quota-stats-format.d.ts.map +1 -1
- package/dist/lib/quota-stats-format.js +9 -3
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-stats.d.ts.map +1 -1
- package/dist/lib/quota-stats.js +36 -2
- package/dist/lib/quota-stats.js.map +1 -1
- package/dist/lib/quota-status.d.ts +3 -1
- package/dist/lib/quota-status.d.ts.map +1 -1
- package/dist/lib/quota-status.js +9 -2
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/types.d.ts +4 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +2 -2
- package/dist/lib/types.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +159 -181
- package/dist/plugin.js.map +1 -1
- package/dist/providers/copilot.d.ts.map +1 -1
- package/dist/providers/copilot.js +10 -5
- package/dist/providers/copilot.js.map +1 -1
- package/dist/providers/firmware.d.ts.map +1 -1
- package/dist/providers/firmware.js +40 -7
- package/dist/providers/firmware.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-status.js","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,oCAAoC,EACpC,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASlD,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,CAMpB;IACC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"quota-status.js","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -24,8 +24,11 @@ export interface QuotaToastConfig {
|
|
|
24
24
|
*
|
|
25
25
|
* Keep this list short and user-friendly; each provider advertises a stable id.
|
|
26
26
|
* Example: ["copilot", "google-antigravity"].
|
|
27
|
+
*
|
|
28
|
+
* When set to "auto" (or left unconfigured), the plugin will auto-enable
|
|
29
|
+
* all providers whose `isAvailable()` returns true at runtime.
|
|
27
30
|
*/
|
|
28
|
-
enabledProviders: string[];
|
|
31
|
+
enabledProviders: string[] | "auto";
|
|
29
32
|
googleModels: GoogleModelId[];
|
|
30
33
|
showOnIdle: boolean;
|
|
31
34
|
showOnQuestion: boolean;
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,+BAA+B;AAC/B,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvE,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IAEjB,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;IAErB,8BAA8B;IAC9B,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.js
CHANGED
|
@@ -8,8 +8,8 @@ export const DEFAULT_CONFIG = {
|
|
|
8
8
|
toastStyle: "classic",
|
|
9
9
|
minIntervalMs: 300000, // 5 minutes
|
|
10
10
|
debug: false,
|
|
11
|
-
// Providers are
|
|
12
|
-
enabledProviders:
|
|
11
|
+
// Providers are auto-detected by default; set to explicit list to opt-in manually.
|
|
12
|
+
enabledProviders: "auto",
|
|
13
13
|
// If Google Antigravity is enabled, default to Claude only.
|
|
14
14
|
googleModels: ["CLAUDE"],
|
|
15
15
|
showOnIdle: true,
|
package/dist/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,OAAO,EAAE,IAAI;IAEb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,MAAM,EAAE,YAAY;IAEnC,KAAK,EAAE,KAAK;IAEZ,mFAAmF;IACnF,gBAAgB,EAAE,MAAe;IAEjC,4DAA4D;IAC5D,YAAY,EAAE,CAAC,QAAQ,CAAC;IAExB,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,KAAK;IACvB,iBAAiB,EAAE,IAAI;IACvB,MAAM,EAAE;QACN,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;KACX;CACF,CAAC;AAuNF,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,sCAAsC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC,uCAAuC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAG1B;IACF,KAAK,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;IACjF,OAAO,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE;IACtD,MAAM,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACzF,OAAO,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE;CAC3D,CAAC"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAwOlD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAghC9B,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -16,13 +16,12 @@ import { aggregateUsage, getSessionTokenSummary, SessionNotFoundError } from "./
|
|
|
16
16
|
import { formatQuotaStatsReport } from "./lib/quota-stats-format.js";
|
|
17
17
|
import { buildQuotaStatusReport } from "./lib/quota-status.js";
|
|
18
18
|
import { refreshGoogleTokensForAllAccounts } from "./lib/google.js";
|
|
19
|
+
import { resetFirmwareQuotaWindow } from "./lib/firmware.js";
|
|
19
20
|
/** All token report command specifications */
|
|
20
21
|
const TOKEN_REPORT_COMMANDS = [
|
|
21
22
|
{
|
|
22
23
|
id: "tokens_today",
|
|
23
|
-
legacyId: "quota_today",
|
|
24
24
|
template: "/tokens_today",
|
|
25
|
-
legacyTemplate: "/quota_today",
|
|
26
25
|
description: "Token + official API cost summary for today (calendar day, local timezone).",
|
|
27
26
|
title: "Tokens used (Today) (/tokens_today)",
|
|
28
27
|
metadataTitle: "Tokens used (Today)",
|
|
@@ -30,9 +29,7 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
30
29
|
},
|
|
31
30
|
{
|
|
32
31
|
id: "tokens_daily",
|
|
33
|
-
legacyId: "quota_daily",
|
|
34
32
|
template: "/tokens_daily",
|
|
35
|
-
legacyTemplate: "/quota_daily",
|
|
36
33
|
description: "Token + official API cost summary for the last 24 hours (rolling).",
|
|
37
34
|
title: "Tokens used (Last 24 Hours) (/tokens_daily)",
|
|
38
35
|
metadataTitle: "Tokens used (Last 24 Hours)",
|
|
@@ -41,9 +38,7 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
41
38
|
},
|
|
42
39
|
{
|
|
43
40
|
id: "tokens_weekly",
|
|
44
|
-
legacyId: "quota_weekly",
|
|
45
41
|
template: "/tokens_weekly",
|
|
46
|
-
legacyTemplate: "/quota_weekly",
|
|
47
42
|
description: "Token + official API cost summary for the last 7 days (rolling).",
|
|
48
43
|
title: "Tokens used (Last 7 Days) (/tokens_weekly)",
|
|
49
44
|
metadataTitle: "Tokens used (Last 7 Days)",
|
|
@@ -52,9 +47,7 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
52
47
|
},
|
|
53
48
|
{
|
|
54
49
|
id: "tokens_monthly",
|
|
55
|
-
legacyId: "quota_monthly",
|
|
56
50
|
template: "/tokens_monthly",
|
|
57
|
-
legacyTemplate: "/quota_monthly",
|
|
58
51
|
description: "Token + official API cost summary for the last 30 days (rolling).",
|
|
59
52
|
title: "Tokens used (Last 30 Days) (/tokens_monthly)",
|
|
60
53
|
metadataTitle: "Tokens used (Last 30 Days)",
|
|
@@ -63,9 +56,7 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
63
56
|
},
|
|
64
57
|
{
|
|
65
58
|
id: "tokens_all",
|
|
66
|
-
legacyId: "quota_all",
|
|
67
59
|
template: "/tokens_all",
|
|
68
|
-
legacyTemplate: "/quota_all",
|
|
69
60
|
description: "Token + official API cost summary for all locally saved OpenCode history.",
|
|
70
61
|
title: "Tokens used (All Time) (/tokens_all)",
|
|
71
62
|
metadataTitle: "Tokens used (All Time)",
|
|
@@ -75,9 +66,7 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
75
66
|
},
|
|
76
67
|
{
|
|
77
68
|
id: "tokens_session",
|
|
78
|
-
legacyId: "quota_session",
|
|
79
69
|
template: "/tokens_session",
|
|
80
|
-
legacyTemplate: "/quota_session",
|
|
81
70
|
description: "Token + official API cost summary for current session only.",
|
|
82
71
|
title: "Tokens used (Current Session) (/tokens_session)",
|
|
83
72
|
metadataTitle: "Tokens used (Current Session)",
|
|
@@ -85,9 +74,7 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
85
74
|
},
|
|
86
75
|
{
|
|
87
76
|
id: "tokens_between",
|
|
88
|
-
legacyId: "quota_between",
|
|
89
77
|
template: "/tokens_between",
|
|
90
|
-
legacyTemplate: "/quota_between",
|
|
91
78
|
description: "Token + cost report between two YYYY-MM-DD dates (local timezone, inclusive).",
|
|
92
79
|
titleForRange: (startYmd, endYmd) => {
|
|
93
80
|
const formatYmd = (ymd) => {
|
|
@@ -102,12 +89,11 @@ const TOKEN_REPORT_COMMANDS = [
|
|
|
102
89
|
kind: "between",
|
|
103
90
|
},
|
|
104
91
|
];
|
|
105
|
-
/** Build a lookup map from command ID
|
|
92
|
+
/** Build a lookup map from command ID to spec */
|
|
106
93
|
const TOKEN_REPORT_COMMANDS_BY_ID = (() => {
|
|
107
94
|
const map = new Map();
|
|
108
95
|
for (const spec of TOKEN_REPORT_COMMANDS) {
|
|
109
96
|
map.set(spec.id, spec);
|
|
110
|
-
map.set(spec.legacyId, spec);
|
|
111
97
|
}
|
|
112
98
|
return map;
|
|
113
99
|
})();
|
|
@@ -225,7 +211,7 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
225
211
|
return new Date(ymd.y, ymd.m - 1, ymd.d + 1).getTime();
|
|
226
212
|
}
|
|
227
213
|
/**
|
|
228
|
-
* Parse /
|
|
214
|
+
* Parse /tokens_between arguments. Supports:
|
|
229
215
|
* - Positional: "2026-01-01 2026-01-15"
|
|
230
216
|
* - JSON: {"starting_date":"2026-01-01","ending_date":"2026-01-15"}
|
|
231
217
|
*/
|
|
@@ -351,11 +337,33 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
351
337
|
return false;
|
|
352
338
|
}
|
|
353
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* Get the current model from the active session.
|
|
342
|
+
*
|
|
343
|
+
* Only uses session-scoped model lookup. Does NOT fall back to
|
|
344
|
+
* client.config.get() because that returns the global/default model
|
|
345
|
+
* which can be stale across sessions.
|
|
346
|
+
*/
|
|
347
|
+
async function getCurrentModel(sessionID) {
|
|
348
|
+
if (!sessionID)
|
|
349
|
+
return undefined;
|
|
350
|
+
try {
|
|
351
|
+
const sessionResp = await typedClient.session.get({ path: { id: sessionID } });
|
|
352
|
+
return sessionResp.data?.modelID;
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return undefined;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
354
358
|
function formatDebugInfo(params) {
|
|
355
359
|
const availability = params.availability
|
|
356
360
|
? params.availability.map((x) => `${x.id}=${x.ok ? "ok" : "no"}`).join(" ")
|
|
357
361
|
: "unknown";
|
|
358
|
-
const providers = params.enabledProviders
|
|
362
|
+
const providers = params.enabledProviders === "auto"
|
|
363
|
+
? "(auto)"
|
|
364
|
+
: params.enabledProviders.length > 0
|
|
365
|
+
? params.enabledProviders.join(",")
|
|
366
|
+
: "(none)";
|
|
359
367
|
const modelPart = params.currentModel ? ` model=${params.currentModel}` : "";
|
|
360
368
|
const paths = configMeta.paths.length > 0 ? configMeta.paths.join(" | ") : "(none)";
|
|
361
369
|
return [
|
|
@@ -377,22 +385,23 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
377
385
|
? formatDebugInfo({ trigger, reason: "disabled", enabledProviders: [] })
|
|
378
386
|
: null;
|
|
379
387
|
}
|
|
380
|
-
const
|
|
381
|
-
|
|
382
|
-
|
|
388
|
+
const allProviders = getProviders();
|
|
389
|
+
const isAutoMode = config.enabledProviders === "auto";
|
|
390
|
+
const enabledProviderIds = isAutoMode ? [] : config.enabledProviders;
|
|
391
|
+
// When enabledProviders is "auto", we'll filter by availability below.
|
|
392
|
+
// When explicit, filter to just the listed providers.
|
|
393
|
+
const providers = isAutoMode
|
|
394
|
+
? allProviders
|
|
395
|
+
: allProviders.filter((p) => enabledProviderIds.includes(p.id));
|
|
396
|
+
// Only bail on empty if user explicitly configured an empty list.
|
|
397
|
+
if (!isAutoMode && providers.length === 0) {
|
|
383
398
|
return config.debug
|
|
384
399
|
? formatDebugInfo({ trigger, reason: "enabledProviders empty", enabledProviders: [] })
|
|
385
400
|
: null;
|
|
386
401
|
}
|
|
387
402
|
let currentModel;
|
|
388
403
|
if (config.onlyCurrentModel) {
|
|
389
|
-
|
|
390
|
-
const configResponse = await typedClient.config.get();
|
|
391
|
-
currentModel = configResponse.data?.model;
|
|
392
|
-
}
|
|
393
|
-
catch {
|
|
394
|
-
currentModel = undefined;
|
|
395
|
-
}
|
|
404
|
+
currentModel = await getCurrentModel(sessionID);
|
|
396
405
|
}
|
|
397
406
|
const ctx = {
|
|
398
407
|
client: typedClient,
|
|
@@ -466,7 +475,7 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
466
475
|
});
|
|
467
476
|
if (!config.debug)
|
|
468
477
|
return formatted;
|
|
469
|
-
const debugFooter = `\n\n[debug] src=${configMeta.source} providers=${config.enabledProviders.join(",") || "(none)"} avail=${avail
|
|
478
|
+
const debugFooter = `\n\n[debug] src=${configMeta.source} providers=${config.enabledProviders === "auto" ? "(auto)" : config.enabledProviders.join(",") || "(none)"} avail=${avail
|
|
470
479
|
.map((x) => `${x.p.id}:${x.ok ? "ok" : "no"}`)
|
|
471
480
|
.join(" ")}`;
|
|
472
481
|
return formatted + debugFooter;
|
|
@@ -548,8 +557,12 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
548
557
|
await refreshConfig();
|
|
549
558
|
if (!config.enabled)
|
|
550
559
|
return null;
|
|
551
|
-
const
|
|
552
|
-
|
|
560
|
+
const allProviders = getProviders();
|
|
561
|
+
const isAutoMode = config.enabledProviders === "auto";
|
|
562
|
+
const providers = isAutoMode
|
|
563
|
+
? allProviders
|
|
564
|
+
: allProviders.filter((p) => config.enabledProviders.includes(p.id));
|
|
565
|
+
if (!isAutoMode && providers.length === 0)
|
|
553
566
|
return null;
|
|
554
567
|
const ctx = {
|
|
555
568
|
client: typedClient,
|
|
@@ -620,14 +633,13 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
620
633
|
}
|
|
621
634
|
async function buildStatusReport(params) {
|
|
622
635
|
await refreshConfig();
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
currentModel
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
}
|
|
636
|
+
const currentModel = await getCurrentModel(params.sessionID);
|
|
637
|
+
const sessionModelLookup = !params.sessionID
|
|
638
|
+
? "no_session"
|
|
639
|
+
: currentModel
|
|
640
|
+
? "ok"
|
|
641
|
+
: "not_found";
|
|
642
|
+
const isAutoMode = config.enabledProviders === "auto";
|
|
631
643
|
const providers = getProviders();
|
|
632
644
|
const availability = await Promise.all(providers.map(async (p) => {
|
|
633
645
|
let ok = false;
|
|
@@ -642,7 +654,8 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
642
654
|
}
|
|
643
655
|
return {
|
|
644
656
|
id: p.id,
|
|
645
|
-
enabled
|
|
657
|
+
// In auto mode, a provider is effectively "enabled" if it's available.
|
|
658
|
+
enabled: isAutoMode ? ok : config.enabledProviders.includes(p.id),
|
|
646
659
|
available: ok,
|
|
647
660
|
matchesCurrentModel: typeof p.matchesCurrentModel === "function" && currentModel
|
|
648
661
|
? p.matchesCurrentModel(currentModel)
|
|
@@ -658,6 +671,7 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
658
671
|
enabledProviders: config.enabledProviders,
|
|
659
672
|
onlyCurrentModel: config.onlyCurrentModel,
|
|
660
673
|
currentModel,
|
|
674
|
+
sessionModelLookup,
|
|
661
675
|
providerAvailability: availability,
|
|
662
676
|
googleRefresh: refresh
|
|
663
677
|
? {
|
|
@@ -685,18 +699,16 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
685
699
|
template: "/quota_status",
|
|
686
700
|
description: "Diagnostics for toast + pricing + local storage (includes unknown pricing report).",
|
|
687
701
|
};
|
|
688
|
-
|
|
702
|
+
cfg.command["firmware_reset_window"] = {
|
|
703
|
+
template: "/firmware_reset_window",
|
|
704
|
+
description: "Manually reset your Firmware 5-hour spending window (consumes 1 of 2 weekly resets).",
|
|
705
|
+
};
|
|
706
|
+
// Register token report commands (/tokens_*)
|
|
689
707
|
for (const spec of TOKEN_REPORT_COMMANDS) {
|
|
690
|
-
// Primary command (/tokens_*)
|
|
691
708
|
cfg.command[spec.id] = {
|
|
692
709
|
template: spec.template,
|
|
693
710
|
description: spec.description,
|
|
694
711
|
};
|
|
695
|
-
// Legacy alias (/quota_*) for backwards compatibility
|
|
696
|
-
cfg.command[spec.legacyId] = {
|
|
697
|
-
template: spec.legacyTemplate,
|
|
698
|
-
description: `${spec.description} (Legacy alias for /${spec.id})`,
|
|
699
|
-
};
|
|
700
712
|
}
|
|
701
713
|
},
|
|
702
714
|
"command.execute.before": async (input) => {
|
|
@@ -729,14 +741,43 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
729
741
|
quotaCache.timestamp = Date.now();
|
|
730
742
|
}
|
|
731
743
|
if (!msg) {
|
|
732
|
-
|
|
744
|
+
// Provide an actionable message instead of a generic "unavailable".
|
|
745
|
+
if (!configLoaded) {
|
|
746
|
+
await injectRawOutput(sessionID, "Quota unavailable (config not loaded, try again)");
|
|
747
|
+
}
|
|
748
|
+
else if (!config.enabled) {
|
|
749
|
+
await injectRawOutput(sessionID, "Quota disabled in config (enabled: false)");
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
// Check what providers are available for a more specific hint.
|
|
753
|
+
const allProvs = getProviders();
|
|
754
|
+
const ctx = {
|
|
755
|
+
client: typedClient,
|
|
756
|
+
config: { googleModels: config.googleModels },
|
|
757
|
+
};
|
|
758
|
+
const avail = await Promise.all(allProvs.map(async (p) => {
|
|
759
|
+
try {
|
|
760
|
+
return { id: p.id, ok: await p.isAvailable(ctx) };
|
|
761
|
+
}
|
|
762
|
+
catch {
|
|
763
|
+
return { id: p.id, ok: false };
|
|
764
|
+
}
|
|
765
|
+
}));
|
|
766
|
+
const availableIds = avail.filter((x) => x.ok).map((x) => x.id);
|
|
767
|
+
if (availableIds.length === 0) {
|
|
768
|
+
await injectRawOutput(sessionID, "Quota unavailable\n\nNo quota providers detected. Make sure you are logged in to a supported provider (Copilot, OpenAI, etc.).\n\nRun /quota_status for diagnostics.");
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
await injectRawOutput(sessionID, `Quota unavailable\n\nProviders detected (${availableIds.join(", ")}) but returned no data. This may be a temporary API error.\n\nRun /quota_status for diagnostics.`);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
733
774
|
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
734
775
|
}
|
|
735
776
|
await injectRawOutput(sessionID, msg);
|
|
736
777
|
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
737
778
|
}
|
|
738
779
|
const untilMs = Date.now();
|
|
739
|
-
// Handle token report commands
|
|
780
|
+
// Handle token report commands (/tokens_*)
|
|
740
781
|
if (isTokenReportCommand(cmd)) {
|
|
741
782
|
const spec = TOKEN_REPORT_COMMANDS_BY_ID.get(cmd);
|
|
742
783
|
if (spec.kind === "between") {
|
|
@@ -808,78 +849,56 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
808
849
|
? parsed.value["skewMs"]
|
|
809
850
|
: undefined,
|
|
810
851
|
force: parsed.value["force"] === true,
|
|
852
|
+
sessionID,
|
|
811
853
|
});
|
|
812
854
|
await injectRawOutput(sessionID, out);
|
|
813
855
|
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
814
856
|
}
|
|
857
|
+
// Handle /firmware_reset_window (reset 5-hour spending window)
|
|
858
|
+
if (cmd === "firmware_reset_window") {
|
|
859
|
+
const raw = input.arguments?.trim() || "";
|
|
860
|
+
// Check for confirmation: accept "confirm" as positional or {"confirm": true} as JSON
|
|
861
|
+
let confirmed = false;
|
|
862
|
+
if (raw.toLowerCase() === "confirm") {
|
|
863
|
+
confirmed = true;
|
|
864
|
+
}
|
|
865
|
+
else if (raw.startsWith("{")) {
|
|
866
|
+
try {
|
|
867
|
+
const parsed = JSON.parse(raw);
|
|
868
|
+
confirmed = parsed["confirm"] === true;
|
|
869
|
+
}
|
|
870
|
+
catch {
|
|
871
|
+
await injectRawOutput(sessionID, `Invalid JSON arguments for /firmware_reset_window\n\nTo proceed, run:\n/firmware_reset_window confirm`);
|
|
872
|
+
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
// Require explicit confirmation (destructive action with limited weekly resets)
|
|
876
|
+
if (!confirmed) {
|
|
877
|
+
await injectRawOutput(sessionID, `⚠️ This will reset your Firmware 5-hour spending window.\nYou have a maximum of 2 resets per week.\n\nTo proceed, run:\n/firmware_reset_window confirm`);
|
|
878
|
+
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
879
|
+
}
|
|
880
|
+
const result = await resetFirmwareQuotaWindow();
|
|
881
|
+
if (!result) {
|
|
882
|
+
await injectRawOutput(sessionID, "Firmware API key not configured. Cannot reset window.");
|
|
883
|
+
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
884
|
+
}
|
|
885
|
+
if (!result.success) {
|
|
886
|
+
await injectRawOutput(sessionID, `Failed to reset Firmware window:\n${result.error}`);
|
|
887
|
+
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
888
|
+
}
|
|
889
|
+
// Build success message
|
|
890
|
+
const resetsLeft = result.windowResetsRemaining;
|
|
891
|
+
const resetsMsg = resetsLeft !== undefined
|
|
892
|
+
? ` (${resetsLeft} reset${resetsLeft === 1 ? "" : "s"} remaining this week)`
|
|
893
|
+
: "";
|
|
894
|
+
// Fetch updated quota to show new status
|
|
895
|
+
const quotaMsg = await fetchQuotaCommandMessage("command:/firmware_reset_window", sessionID);
|
|
896
|
+
const successOutput = `✓ Firmware 5-hour window reset successful${resetsMsg}${quotaMsg ? `\n\n${quotaMsg}` : ""}`;
|
|
897
|
+
await injectRawOutput(sessionID, successOutput);
|
|
898
|
+
throw new Error("__QUOTA_COMMAND_HANDLED__");
|
|
899
|
+
}
|
|
815
900
|
},
|
|
816
901
|
tool: {
|
|
817
|
-
quota_daily: tool({
|
|
818
|
-
description: "Token + official API cost summary for the last 24 hours (rolling).",
|
|
819
|
-
args: {},
|
|
820
|
-
async execute(_args, context) {
|
|
821
|
-
const untilMs = Date.now();
|
|
822
|
-
const sinceMs = untilMs - 24 * 60 * 60 * 1000;
|
|
823
|
-
const out = await buildQuotaReport({
|
|
824
|
-
title: "Tokens used (Last 24 Hours) (/tokens_daily)",
|
|
825
|
-
sinceMs,
|
|
826
|
-
untilMs,
|
|
827
|
-
sessionID: context.sessionID,
|
|
828
|
-
});
|
|
829
|
-
context.metadata({ title: "Tokens used (Last 24 Hours)" });
|
|
830
|
-
await injectRawOutput(context.sessionID, out);
|
|
831
|
-
return ""; // Empty return - output already injected with noReply
|
|
832
|
-
},
|
|
833
|
-
}),
|
|
834
|
-
quota_weekly: tool({
|
|
835
|
-
description: "Token + official API cost summary for the last 7 days (rolling).",
|
|
836
|
-
args: {},
|
|
837
|
-
async execute(_args, context) {
|
|
838
|
-
const untilMs = Date.now();
|
|
839
|
-
const sinceMs = untilMs - 7 * 24 * 60 * 60 * 1000;
|
|
840
|
-
const out = await buildQuotaReport({
|
|
841
|
-
title: "Tokens used (Last 7 Days) (/tokens_weekly)",
|
|
842
|
-
sinceMs,
|
|
843
|
-
untilMs,
|
|
844
|
-
sessionID: context.sessionID,
|
|
845
|
-
});
|
|
846
|
-
context.metadata({ title: "Tokens used (Last 7 Days)" });
|
|
847
|
-
await injectRawOutput(context.sessionID, out);
|
|
848
|
-
return ""; // Empty return - output already injected with noReply
|
|
849
|
-
},
|
|
850
|
-
}),
|
|
851
|
-
quota_monthly: tool({
|
|
852
|
-
description: "Token + official API cost summary for the last 30 days (rolling).",
|
|
853
|
-
args: {},
|
|
854
|
-
async execute(_args, context) {
|
|
855
|
-
const untilMs = Date.now();
|
|
856
|
-
const sinceMs = untilMs - 30 * 24 * 60 * 60 * 1000;
|
|
857
|
-
const out = await buildQuotaReport({
|
|
858
|
-
title: "Tokens used (Last 30 Days) (/tokens_monthly)",
|
|
859
|
-
sinceMs,
|
|
860
|
-
untilMs,
|
|
861
|
-
sessionID: context.sessionID,
|
|
862
|
-
});
|
|
863
|
-
context.metadata({ title: "Tokens used (Last 30 Days)" });
|
|
864
|
-
await injectRawOutput(context.sessionID, out);
|
|
865
|
-
return ""; // Empty return - output already injected with noReply
|
|
866
|
-
},
|
|
867
|
-
}),
|
|
868
|
-
quota_all: tool({
|
|
869
|
-
description: "Token + official API cost summary for all locally saved OpenCode history.",
|
|
870
|
-
args: {},
|
|
871
|
-
async execute(_args, context) {
|
|
872
|
-
const out = await buildQuotaReport({
|
|
873
|
-
title: "Tokens used (All Time) (/tokens_all)",
|
|
874
|
-
sessionID: context.sessionID,
|
|
875
|
-
topModels: 12,
|
|
876
|
-
topSessions: 12,
|
|
877
|
-
});
|
|
878
|
-
context.metadata({ title: "Tokens used (All Time)" });
|
|
879
|
-
await injectRawOutput(context.sessionID, out);
|
|
880
|
-
return ""; // Empty return - output already injected with noReply
|
|
881
|
-
},
|
|
882
|
-
}),
|
|
883
902
|
quota_status: tool({
|
|
884
903
|
description: "Diagnostics for toast + pricing + local storage (includes unknown pricing report).",
|
|
885
904
|
args: {
|
|
@@ -903,87 +922,46 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
903
922
|
refreshGoogleTokens: args.refreshGoogleTokens,
|
|
904
923
|
skewMs: args.skewMs,
|
|
905
924
|
force: args.force,
|
|
906
|
-
});
|
|
907
|
-
context.metadata({ title: "Quota Status" });
|
|
908
|
-
await injectRawOutput(context.sessionID, out);
|
|
909
|
-
return ""; // Empty return - output already injected with noReply
|
|
910
|
-
},
|
|
911
|
-
}),
|
|
912
|
-
quota_today: tool({
|
|
913
|
-
description: "Token + official API cost summary for today (calendar day, local timezone).",
|
|
914
|
-
args: {},
|
|
915
|
-
async execute(_args, context) {
|
|
916
|
-
const now = new Date();
|
|
917
|
-
const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
918
|
-
const sinceMs = startOfDay.getTime();
|
|
919
|
-
const untilMs = now.getTime();
|
|
920
|
-
const out = await buildQuotaReport({
|
|
921
|
-
title: "Tokens used (Today) (/tokens_today)",
|
|
922
|
-
sinceMs,
|
|
923
|
-
untilMs,
|
|
924
925
|
sessionID: context.sessionID,
|
|
925
926
|
});
|
|
926
|
-
context.metadata({ title: "
|
|
927
|
-
await injectRawOutput(context.sessionID, out);
|
|
928
|
-
return ""; // Empty return - output already injected with noReply
|
|
929
|
-
},
|
|
930
|
-
}),
|
|
931
|
-
quota_session: tool({
|
|
932
|
-
description: "Token + official API cost summary for current session only.",
|
|
933
|
-
args: {},
|
|
934
|
-
async execute(_args, context) {
|
|
935
|
-
const out = await buildQuotaReport({
|
|
936
|
-
title: "Tokens used (Current Session) (/tokens_session)",
|
|
937
|
-
sessionID: context.sessionID,
|
|
938
|
-
filterSessionID: context.sessionID,
|
|
939
|
-
sessionOnly: true,
|
|
940
|
-
});
|
|
941
|
-
context.metadata({ title: "Tokens used (Current Session)" });
|
|
927
|
+
context.metadata({ title: "Quota Status" });
|
|
942
928
|
await injectRawOutput(context.sessionID, out);
|
|
943
929
|
return ""; // Empty return - output already injected with noReply
|
|
944
930
|
},
|
|
945
931
|
}),
|
|
946
|
-
|
|
947
|
-
description: "
|
|
932
|
+
firmware_reset_window: tool({
|
|
933
|
+
description: "Manually reset your Firmware 5-hour spending window. Consumes 1 of 2 weekly resets. Requires confirm=true.",
|
|
948
934
|
args: {
|
|
949
|
-
|
|
950
|
-
.
|
|
951
|
-
.
|
|
952
|
-
.describe("
|
|
953
|
-
endingDate: tool.schema
|
|
954
|
-
.string()
|
|
955
|
-
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
956
|
-
.describe("Ending date in YYYY-MM-DD format (local timezone, inclusive)"),
|
|
935
|
+
confirm: tool.schema
|
|
936
|
+
.boolean()
|
|
937
|
+
.optional()
|
|
938
|
+
.describe("Must be true to proceed (destructive action with limited weekly resets)"),
|
|
957
939
|
},
|
|
958
940
|
async execute(args, context) {
|
|
959
|
-
|
|
960
|
-
if (
|
|
961
|
-
await injectRawOutput(context.sessionID,
|
|
941
|
+
// Require explicit confirmation (destructive action with limited weekly resets)
|
|
942
|
+
if (args.confirm !== true) {
|
|
943
|
+
await injectRawOutput(context.sessionID, `⚠️ This will reset your Firmware 5-hour spending window.\nYou have a maximum of 2 resets per week.\n\nTo proceed, call with confirm: true`);
|
|
962
944
|
return "";
|
|
963
945
|
}
|
|
964
|
-
const
|
|
965
|
-
if (!
|
|
966
|
-
await injectRawOutput(context.sessionID,
|
|
946
|
+
const result = await resetFirmwareQuotaWindow();
|
|
947
|
+
if (!result) {
|
|
948
|
+
await injectRawOutput(context.sessionID, "Firmware API key not configured. Cannot reset window.");
|
|
967
949
|
return "";
|
|
968
950
|
}
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
if (endMs < startMs) {
|
|
972
|
-
await injectRawOutput(context.sessionID, `Ending date (${args.endingDate}) is before starting date (${args.startingDate}).`);
|
|
951
|
+
if (!result.success) {
|
|
952
|
+
await injectRawOutput(context.sessionID, `Failed to reset Firmware window:\n${result.error}`);
|
|
973
953
|
return "";
|
|
974
954
|
}
|
|
975
|
-
|
|
976
|
-
const
|
|
977
|
-
const
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
context.metadata({ title: "Tokens used (Date Range)" });
|
|
986
|
-
await injectRawOutput(context.sessionID, out);
|
|
955
|
+
// Build success message
|
|
956
|
+
const resetsLeft = result.windowResetsRemaining;
|
|
957
|
+
const resetsMsg = resetsLeft !== undefined
|
|
958
|
+
? ` (${resetsLeft} reset${resetsLeft === 1 ? "" : "s"} remaining this week)`
|
|
959
|
+
: "";
|
|
960
|
+
// Fetch updated quota to show new status
|
|
961
|
+
const quotaMsg = await fetchQuotaCommandMessage("tool:firmware_reset_window", context.sessionID);
|
|
962
|
+
const successOutput = `✓ Firmware 5-hour window reset successful${resetsMsg}${quotaMsg ? `\n\n${quotaMsg}` : ""}`;
|
|
963
|
+
context.metadata({ title: "Firmware Window Reset" });
|
|
964
|
+
await injectRawOutput(context.sessionID, successOutput);
|
|
987
965
|
return ""; // Empty return - output already injected with noReply
|
|
988
966
|
},
|
|
989
967
|
}),
|