@slkiser/opencode-quota 2.1.0 → 2.2.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 +72 -45
- package/dist/data/modelsdev-pricing.min.json +5 -0
- package/dist/lib/command-handled.d.ts +4 -0
- package/dist/lib/command-handled.d.ts.map +1 -1
- package/dist/lib/command-handled.js +6 -0
- package/dist/lib/command-handled.js.map +1 -1
- package/dist/lib/google.d.ts.map +1 -1
- package/dist/lib/google.js +7 -2
- package/dist/lib/google.js.map +1 -1
- package/dist/lib/modelsdev-pricing.d.ts +4 -0
- package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
- package/dist/lib/modelsdev-pricing.js +14 -1
- package/dist/lib/modelsdev-pricing.js.map +1 -1
- package/dist/lib/provider-availability.d.ts +7 -0
- package/dist/lib/provider-availability.d.ts.map +1 -0
- package/dist/lib/provider-availability.js +12 -0
- package/dist/lib/provider-availability.js.map +1 -0
- package/dist/lib/quota-stats-format.d.ts.map +1 -1
- package/dist/lib/quota-stats-format.js +9 -1
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-stats.d.ts +15 -0
- package/dist/lib/quota-stats.d.ts.map +1 -1
- package/dist/lib/quota-stats.js +168 -73
- 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 +5 -2
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/qwen-auth.d.ts +8 -0
- package/dist/lib/qwen-auth.d.ts.map +1 -0
- package/dist/lib/qwen-auth.js +19 -0
- package/dist/lib/qwen-auth.js.map +1 -0
- package/dist/lib/types.d.ts +54 -0
- 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/lib/zai.d.ts +9 -0
- package/dist/lib/zai.d.ts.map +1 -0
- package/dist/lib/zai.js +86 -0
- package/dist/lib/zai.js.map +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +135 -138
- package/dist/plugin.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +7 -10
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/qwen-code.d.ts.map +1 -1
- package/dist/providers/qwen-code.js +4 -11
- package/dist/providers/qwen-code.js.map +1 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/zai.d.ts +8 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +112 -0
- package/dist/providers/zai.js.map +1 -0
- package/package.json +1 -1
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":"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"}
|
|
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
|
@@ -32,9 +32,9 @@ export const DEFAULT_CONFIG = {
|
|
|
32
32
|
export const REQUEST_TIMEOUT_MS = 3000;
|
|
33
33
|
/** Model key mapping for Google API */
|
|
34
34
|
export const GOOGLE_MODEL_KEYS = {
|
|
35
|
-
G3PRO: { key: "gemini-3-pro
|
|
35
|
+
G3PRO: { key: "gemini-3.1-pro", altKey: "gemini-3.1-pro-high|gemini-3.1-pro-low|gemini-3-pro-high|gemini-3-pro-low", display: "G3Pro" },
|
|
36
36
|
G3FLASH: { key: "gemini-3-flash", display: "G3Flash" },
|
|
37
|
-
CLAUDE: { key: "claude-opus-4-
|
|
37
|
+
CLAUDE: { key: "claude-opus-4-6-thinking", altKey: "claude-opus-4-5-thinking|claude-opus-4-5", display: "Claude" },
|
|
38
38
|
G3IMAGE: { key: "gemini-3-pro-image", display: "G3Image" },
|
|
39
39
|
};
|
|
40
40
|
//# sourceMappingURL=types.js.map
|
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;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;
|
|
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;AAgSF,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,gBAAgB,EAAE,MAAM,EAAE,2EAA2E,EAAE,OAAO,EAAE,OAAO,EAAE;IACvI,OAAO,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE;IACtD,MAAM,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,0CAA0C,EAAE,OAAO,EAAE,QAAQ,EAAE;IAClH,OAAO,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE;CAC3D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Z.ai quota fetcher
|
|
3
|
+
*
|
|
4
|
+
* Uses OpenCode's auth.json (zai-coding-plan) and queries:
|
|
5
|
+
* https://api.z.ai/api/monitor/usage/quota/limit
|
|
6
|
+
*/
|
|
7
|
+
import type { ZaiResult } from "./types.js";
|
|
8
|
+
export declare function queryZaiQuota(): Promise<ZaiResult>;
|
|
9
|
+
//# sourceMappingURL=zai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zai.d.ts","sourceRoot":"","sources":["../../src/lib/zai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,SAAS,EAGV,MAAM,YAAY,CAAC;AAWpB,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAyExD"}
|
package/dist/lib/zai.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Z.ai quota fetcher
|
|
3
|
+
*
|
|
4
|
+
* Uses OpenCode's auth.json (zai-coding-plan) and queries:
|
|
5
|
+
* https://api.z.ai/api/monitor/usage/quota/limit
|
|
6
|
+
*/
|
|
7
|
+
import { clampPercent } from "./format-utils.js";
|
|
8
|
+
import { fetchWithTimeout } from "./http.js";
|
|
9
|
+
import { readAuthFile } from "./opencode-auth.js";
|
|
10
|
+
async function readZaiAuth() {
|
|
11
|
+
const auth = await readAuthFile();
|
|
12
|
+
const zai = auth?.["zai-coding-plan"];
|
|
13
|
+
if (!zai || zai.type !== "api" || !zai.key)
|
|
14
|
+
return null;
|
|
15
|
+
return zai;
|
|
16
|
+
}
|
|
17
|
+
const ZAI_QUOTA_URL = "https://api.z.ai/api/monitor/usage/quota/limit";
|
|
18
|
+
export async function queryZaiQuota() {
|
|
19
|
+
const auth = await readZaiAuth();
|
|
20
|
+
if (!auth)
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const headers = {
|
|
24
|
+
Authorization: auth.key,
|
|
25
|
+
"User-Agent": "OpenCode-Quota-Toast/1.0",
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
};
|
|
28
|
+
const resp = await fetchWithTimeout(ZAI_QUOTA_URL, { headers });
|
|
29
|
+
if (!resp.ok) {
|
|
30
|
+
const text = await resp.text();
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: `Z.ai API error ${resp.status}: ${text.slice(0, 120)}`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const data = (await resp.json());
|
|
37
|
+
const limits = data.data.limits;
|
|
38
|
+
if (!limits || !Array.isArray(limits)) {
|
|
39
|
+
return { success: false, error: "Invalid quota data" };
|
|
40
|
+
}
|
|
41
|
+
let hourlyWindow;
|
|
42
|
+
let weeklyWindow;
|
|
43
|
+
let mcpWindow;
|
|
44
|
+
for (const limit of limits) {
|
|
45
|
+
const percentRemaining = clampPercent(100 - limit.percentage);
|
|
46
|
+
let resetTimeIso;
|
|
47
|
+
if (limit.nextResetTime) {
|
|
48
|
+
const ms = Math.round(limit.nextResetTime);
|
|
49
|
+
if (Number.isFinite(ms) && ms > 0) {
|
|
50
|
+
resetTimeIso = new Date(ms).toISOString();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const window = { percentRemaining, resetTimeIso };
|
|
54
|
+
if (limit.type === "TOKENS_LIMIT") {
|
|
55
|
+
if (limit.unit === 3) {
|
|
56
|
+
// unit 3 is 5-hourly (Standard Lite/Pro/Max window)
|
|
57
|
+
hourlyWindow = window;
|
|
58
|
+
}
|
|
59
|
+
else if (limit.unit === 4 || limit.unit === 6) {
|
|
60
|
+
// unit 6 is weekly, unit 4 is daily. We prioritize the longer one as Weekly for display parity.
|
|
61
|
+
weeklyWindow = window;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (limit.type === "TIME_LIMIT") {
|
|
65
|
+
// TIME_LIMIT (unit 5) is typically the Monthly MCP limit
|
|
66
|
+
mcpWindow = window;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
success: true,
|
|
71
|
+
label: "Z.ai",
|
|
72
|
+
windows: {
|
|
73
|
+
hourly: hourlyWindow,
|
|
74
|
+
weekly: weeklyWindow,
|
|
75
|
+
mcp: mcpWindow,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
error: err instanceof Error ? err.message : String(err),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=zai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zai.js","sourceRoot":"","sources":["../../src/lib/zai.ts"],"names":[],"mappings":"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"}
|
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;AAwPlD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,
|
|
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;AAwPlD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MA6+B9B,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -17,10 +17,10 @@ import { fetchSessionTokensForDisplay } from "./lib/session-tokens.js";
|
|
|
17
17
|
import { formatQuotaStatsReport } from "./lib/quota-stats-format.js";
|
|
18
18
|
import { buildQuotaStatusReport } from "./lib/quota-status.js";
|
|
19
19
|
import { refreshGoogleTokensForAllAccounts } from "./lib/google.js";
|
|
20
|
-
import {
|
|
20
|
+
import { hasQwenOAuthAuthCached, isQwenCodeModelId } from "./lib/qwen-auth.js";
|
|
21
21
|
import { recordQwenCompletion } from "./lib/qwen-local-quota.js";
|
|
22
22
|
import { parseOptionalJsonArgs, parseQuotaBetweenArgs, startOfLocalDayMs, startOfNextLocalDayMs, formatYmd, } from "./lib/command-parsing.js";
|
|
23
|
-
import { handled } from "./lib/command-handled.js";
|
|
23
|
+
import { handled, isCommandHandledError } from "./lib/command-handled.js";
|
|
24
24
|
/** All token report command specifications */
|
|
25
25
|
const TOKEN_REPORT_COMMANDS = [
|
|
26
26
|
{
|
|
@@ -107,7 +107,6 @@ function isTokenReportCommand(cmd) {
|
|
|
107
107
|
*/
|
|
108
108
|
export const QuotaToastPlugin = async ({ client }) => {
|
|
109
109
|
const typedClient = client;
|
|
110
|
-
const QWEN_AUTH_CACHE_MAX_AGE_MS = 5_000;
|
|
111
110
|
const TOOL_FAILURE_STATUSES = new Set(["error", "failed", "failure", "cancelled", "canceled"]);
|
|
112
111
|
const TOOL_SUCCESS_STATUSES = new Set(["success", "ok", "completed", "complete"]);
|
|
113
112
|
function getProviderDisplayLabel(id) {
|
|
@@ -124,6 +123,8 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
124
123
|
return "Chutes";
|
|
125
124
|
case "qwen-code":
|
|
126
125
|
return "Qwen";
|
|
126
|
+
case "zai":
|
|
127
|
+
return "Z.ai";
|
|
127
128
|
default:
|
|
128
129
|
return id;
|
|
129
130
|
}
|
|
@@ -165,17 +166,6 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
165
166
|
// Track last session token error for /quota_status diagnostics
|
|
166
167
|
let lastSessionTokenError;
|
|
167
168
|
const providerFetchCache = new Map();
|
|
168
|
-
function isQwenModel(model) {
|
|
169
|
-
return typeof model === "string" && model.toLowerCase().startsWith("qwen-code/");
|
|
170
|
-
}
|
|
171
|
-
async function hasQwenOAuthAuth() {
|
|
172
|
-
const auth = await readAuthFileCached({ maxAgeMs: QWEN_AUTH_CACHE_MAX_AGE_MS });
|
|
173
|
-
const qwen = auth?.["opencode-qwencode-auth"];
|
|
174
|
-
return (!!qwen &&
|
|
175
|
-
qwen.type === "oauth" &&
|
|
176
|
-
typeof qwen.access === "string" &&
|
|
177
|
-
qwen.access.trim().length > 0);
|
|
178
|
-
}
|
|
179
169
|
function asRecord(value) {
|
|
180
170
|
return value && typeof value === "object" ? value : null;
|
|
181
171
|
}
|
|
@@ -269,9 +259,9 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
269
259
|
if (config.enabledProviders !== "auto" && !config.enabledProviders.includes("qwen-code"))
|
|
270
260
|
return false;
|
|
271
261
|
const currentModel = await getCurrentModel(sessionID);
|
|
272
|
-
if (!
|
|
262
|
+
if (!isQwenCodeModelId(currentModel))
|
|
273
263
|
return false;
|
|
274
|
-
return await
|
|
264
|
+
return await hasQwenOAuthAuthCached();
|
|
275
265
|
}
|
|
276
266
|
async function refreshConfig() {
|
|
277
267
|
if (configInFlight)
|
|
@@ -750,147 +740,154 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
750
740
|
}
|
|
751
741
|
},
|
|
752
742
|
"command.execute.before": async (input) => {
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
quotaCache
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
const now = Date.now();
|
|
763
|
-
const cached = quotaCache.timestamp && now - quotaCache.timestamp < config.minIntervalMs
|
|
764
|
-
? quotaCache.message
|
|
765
|
-
: null;
|
|
766
|
-
const msg = cached
|
|
767
|
-
? cached
|
|
768
|
-
: await (quotaCache.inFlight ??
|
|
769
|
-
(quotaCache.inFlight = (async () => {
|
|
770
|
-
try {
|
|
771
|
-
return await fetchQuotaCommandMessage("command:/quota", sessionID);
|
|
772
|
-
}
|
|
773
|
-
finally {
|
|
774
|
-
quotaCache.inFlight = undefined;
|
|
775
|
-
}
|
|
776
|
-
})()));
|
|
777
|
-
if (msg) {
|
|
778
|
-
quotaCache.message = msg;
|
|
779
|
-
quotaCache.timestamp = Date.now();
|
|
780
|
-
}
|
|
781
|
-
if (!msg) {
|
|
782
|
-
// Provide an actionable message instead of a generic "unavailable".
|
|
783
|
-
if (!configLoaded) {
|
|
784
|
-
await injectRawOutput(sessionID, "Quota unavailable (config not loaded, try again)");
|
|
743
|
+
try {
|
|
744
|
+
const cmd = input.command;
|
|
745
|
+
const sessionID = input.sessionID;
|
|
746
|
+
if (cmd === "quota") {
|
|
747
|
+
// Separate cache for /quota so it doesn't pollute the toast cache.
|
|
748
|
+
let quotaCache = globalThis.__opencodeQuotaCommandCache;
|
|
749
|
+
if (!quotaCache) {
|
|
750
|
+
quotaCache = { message: "", timestamp: 0 };
|
|
751
|
+
globalThis.__opencodeQuotaCommandCache = quotaCache;
|
|
785
752
|
}
|
|
786
|
-
|
|
787
|
-
|
|
753
|
+
const now = Date.now();
|
|
754
|
+
const cached = quotaCache.timestamp && now - quotaCache.timestamp < config.minIntervalMs
|
|
755
|
+
? quotaCache.message
|
|
756
|
+
: null;
|
|
757
|
+
const msg = cached
|
|
758
|
+
? cached
|
|
759
|
+
: await (quotaCache.inFlight ??
|
|
760
|
+
(quotaCache.inFlight = (async () => {
|
|
761
|
+
try {
|
|
762
|
+
return await fetchQuotaCommandMessage("command:/quota", sessionID);
|
|
763
|
+
}
|
|
764
|
+
finally {
|
|
765
|
+
quotaCache.inFlight = undefined;
|
|
766
|
+
}
|
|
767
|
+
})()));
|
|
768
|
+
if (msg) {
|
|
769
|
+
quotaCache.message = msg;
|
|
770
|
+
quotaCache.timestamp = Date.now();
|
|
788
771
|
}
|
|
789
|
-
|
|
790
|
-
//
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
const avail = await Promise.all(allProvs.map(async (p) => {
|
|
797
|
-
try {
|
|
798
|
-
return { id: p.id, ok: await p.isAvailable(ctx) };
|
|
799
|
-
}
|
|
800
|
-
catch {
|
|
801
|
-
return { id: p.id, ok: false };
|
|
802
|
-
}
|
|
803
|
-
}));
|
|
804
|
-
const availableIds = avail.filter((x) => x.ok).map((x) => x.id);
|
|
805
|
-
if (availableIds.length === 0) {
|
|
806
|
-
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.");
|
|
772
|
+
if (!msg) {
|
|
773
|
+
// Provide an actionable message instead of a generic "unavailable".
|
|
774
|
+
if (!configLoaded) {
|
|
775
|
+
await injectRawOutput(sessionID, "Quota unavailable (config not loaded, try again)");
|
|
776
|
+
}
|
|
777
|
+
else if (!config.enabled) {
|
|
778
|
+
await injectRawOutput(sessionID, "Quota disabled in config (enabled: false)");
|
|
807
779
|
}
|
|
808
780
|
else {
|
|
809
|
-
|
|
781
|
+
// Check what providers are available for a more specific hint.
|
|
782
|
+
const allProvs = getProviders();
|
|
783
|
+
const ctx = {
|
|
784
|
+
client: typedClient,
|
|
785
|
+
config: { googleModels: config.googleModels },
|
|
786
|
+
};
|
|
787
|
+
const avail = await Promise.all(allProvs.map(async (p) => {
|
|
788
|
+
try {
|
|
789
|
+
return { id: p.id, ok: await p.isAvailable(ctx) };
|
|
790
|
+
}
|
|
791
|
+
catch {
|
|
792
|
+
return { id: p.id, ok: false };
|
|
793
|
+
}
|
|
794
|
+
}));
|
|
795
|
+
const availableIds = avail.filter((x) => x.ok).map((x) => x.id);
|
|
796
|
+
if (availableIds.length === 0) {
|
|
797
|
+
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.");
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
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.`);
|
|
801
|
+
}
|
|
810
802
|
}
|
|
803
|
+
handled();
|
|
811
804
|
}
|
|
805
|
+
await injectRawOutput(sessionID, msg);
|
|
812
806
|
handled();
|
|
813
807
|
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
808
|
+
const untilMs = Date.now();
|
|
809
|
+
// Handle token report commands (/tokens_*)
|
|
810
|
+
if (isTokenReportCommand(cmd)) {
|
|
811
|
+
const spec = TOKEN_REPORT_COMMANDS_BY_ID.get(cmd);
|
|
812
|
+
if (spec.kind === "between") {
|
|
813
|
+
// Special handling for date range command
|
|
814
|
+
const parsed = parseQuotaBetweenArgs(input.arguments);
|
|
815
|
+
if (!parsed.ok) {
|
|
816
|
+
await injectRawOutput(sessionID, `Invalid arguments for /${spec.id}\n\n${parsed.error}\n\nExpected: /${spec.id} YYYY-MM-DD YYYY-MM-DD\nExample: /${spec.id} 2026-01-01 2026-01-15`);
|
|
817
|
+
handled();
|
|
818
|
+
}
|
|
819
|
+
const sinceMs = startOfLocalDayMs(parsed.startYmd);
|
|
820
|
+
const rangeUntilMs = startOfNextLocalDayMs(parsed.endYmd); // Exclusive upper bound for inclusive end date
|
|
821
|
+
const out = await buildQuotaReport({
|
|
822
|
+
title: spec.titleForRange(parsed.startYmd, parsed.endYmd),
|
|
823
|
+
sinceMs,
|
|
824
|
+
untilMs: rangeUntilMs,
|
|
825
|
+
sessionID,
|
|
826
|
+
});
|
|
827
|
+
await injectRawOutput(sessionID, out);
|
|
826
828
|
handled();
|
|
827
829
|
}
|
|
828
|
-
|
|
829
|
-
|
|
830
|
+
// Non-between token report commands
|
|
831
|
+
let sinceMs;
|
|
832
|
+
let filterSessionID;
|
|
833
|
+
let sessionOnly;
|
|
834
|
+
let topModels;
|
|
835
|
+
let topSessions;
|
|
836
|
+
switch (spec.kind) {
|
|
837
|
+
case "rolling":
|
|
838
|
+
sinceMs = untilMs - spec.windowMs;
|
|
839
|
+
break;
|
|
840
|
+
case "today": {
|
|
841
|
+
const now = new Date();
|
|
842
|
+
const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
843
|
+
sinceMs = startOfDay.getTime();
|
|
844
|
+
break;
|
|
845
|
+
}
|
|
846
|
+
case "session":
|
|
847
|
+
filterSessionID = sessionID;
|
|
848
|
+
sessionOnly = true;
|
|
849
|
+
break;
|
|
850
|
+
case "all":
|
|
851
|
+
topModels = spec.topModels;
|
|
852
|
+
topSessions = spec.topSessions;
|
|
853
|
+
break;
|
|
854
|
+
}
|
|
830
855
|
const out = await buildQuotaReport({
|
|
831
|
-
title: spec.
|
|
856
|
+
title: spec.title,
|
|
832
857
|
sinceMs,
|
|
833
|
-
untilMs:
|
|
858
|
+
untilMs: spec.kind === "rolling" || spec.kind === "today" ? untilMs : undefined,
|
|
834
859
|
sessionID,
|
|
860
|
+
filterSessionID,
|
|
861
|
+
sessionOnly,
|
|
862
|
+
topModels,
|
|
863
|
+
topSessions,
|
|
835
864
|
});
|
|
836
865
|
await injectRawOutput(sessionID, out);
|
|
837
866
|
handled();
|
|
838
867
|
}
|
|
839
|
-
//
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
switch (spec.kind) {
|
|
846
|
-
case "rolling":
|
|
847
|
-
sinceMs = untilMs - spec.windowMs;
|
|
848
|
-
break;
|
|
849
|
-
case "today": {
|
|
850
|
-
const now = new Date();
|
|
851
|
-
const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
852
|
-
sinceMs = startOfDay.getTime();
|
|
853
|
-
break;
|
|
868
|
+
// Handle /quota_status (diagnostics - not a token report)
|
|
869
|
+
if (cmd === "quota_status") {
|
|
870
|
+
const parsed = parseOptionalJsonArgs(input.arguments);
|
|
871
|
+
if (!parsed.ok) {
|
|
872
|
+
await injectRawOutput(sessionID, `Invalid arguments for /quota_status\n\n${parsed.error}\n\nExample:\n/quota_status {"refreshGoogleTokens": true}`);
|
|
873
|
+
handled();
|
|
854
874
|
}
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
const out = await buildQuotaReport({
|
|
865
|
-
title: spec.title,
|
|
866
|
-
sinceMs,
|
|
867
|
-
untilMs: spec.kind === "rolling" || spec.kind === "today" ? untilMs : undefined,
|
|
868
|
-
sessionID,
|
|
869
|
-
filterSessionID,
|
|
870
|
-
sessionOnly,
|
|
871
|
-
topModels,
|
|
872
|
-
topSessions,
|
|
873
|
-
});
|
|
874
|
-
await injectRawOutput(sessionID, out);
|
|
875
|
-
handled();
|
|
876
|
-
}
|
|
877
|
-
// Handle /quota_status (diagnostics - not a token report)
|
|
878
|
-
if (cmd === "quota_status") {
|
|
879
|
-
const parsed = parseOptionalJsonArgs(input.arguments);
|
|
880
|
-
if (!parsed.ok) {
|
|
881
|
-
await injectRawOutput(sessionID, `Invalid arguments for /quota_status\n\n${parsed.error}\n\nExample:\n/quota_status {"refreshGoogleTokens": true}`);
|
|
875
|
+
const out = await buildStatusReport({
|
|
876
|
+
refreshGoogleTokens: parsed.value["refreshGoogleTokens"] === true,
|
|
877
|
+
skewMs: typeof parsed.value["skewMs"] === "number"
|
|
878
|
+
? parsed.value["skewMs"]
|
|
879
|
+
: undefined,
|
|
880
|
+
force: parsed.value["force"] === true,
|
|
881
|
+
sessionID,
|
|
882
|
+
});
|
|
883
|
+
await injectRawOutput(sessionID, out);
|
|
882
884
|
handled();
|
|
883
885
|
}
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
force: parsed.value["force"] === true,
|
|
890
|
-
sessionID,
|
|
891
|
-
});
|
|
892
|
-
await injectRawOutput(sessionID, out);
|
|
893
|
-
handled();
|
|
886
|
+
}
|
|
887
|
+
catch (err) {
|
|
888
|
+
if (isCommandHandledError(err))
|
|
889
|
+
return;
|
|
890
|
+
throw err;
|
|
894
891
|
}
|
|
895
892
|
},
|
|
896
893
|
tool: {
|
|
@@ -948,7 +945,7 @@ export const QuotaToastPlugin = async ({ client }) => {
|
|
|
948
945
|
return;
|
|
949
946
|
if (isSuccessfulQuestionExecution(output)) {
|
|
950
947
|
const model = await getCurrentModel(input.sessionID);
|
|
951
|
-
if (
|
|
948
|
+
if (isQwenCodeModelId(model) && (await hasQwenOAuthAuthCached())) {
|
|
952
949
|
try {
|
|
953
950
|
await recordQwenCompletion();
|
|
954
951
|
}
|