@slkiser/opencode-quota 2.0.0 → 2.1.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.
@@ -0,0 +1,66 @@
1
+ import { computeQwenQuota, readQwenLocalQuotaState } from "../lib/qwen-local-quota.js";
2
+ import { readAuthFileCached } from "../lib/opencode-auth.js";
3
+ const QWEN_AUTH_CACHE_MAX_AGE_MS = 5_000;
4
+ function hasQwenOAuthAuth(auth) {
5
+ const qwen = auth?.["opencode-qwencode-auth"];
6
+ return (!!qwen &&
7
+ qwen.type === "oauth" &&
8
+ typeof qwen.access === "string" &&
9
+ qwen.access.trim().length > 0);
10
+ }
11
+ export const qwenCodeProvider = {
12
+ id: "qwen-code",
13
+ async isAvailable(_ctx) {
14
+ const auth = await readAuthFileCached({ maxAgeMs: QWEN_AUTH_CACHE_MAX_AGE_MS });
15
+ return hasQwenOAuthAuth(auth);
16
+ },
17
+ matchesCurrentModel(model) {
18
+ return model.toLowerCase().startsWith("qwen-code/");
19
+ },
20
+ async fetch(ctx) {
21
+ const auth = await readAuthFileCached({ maxAgeMs: QWEN_AUTH_CACHE_MAX_AGE_MS });
22
+ if (!hasQwenOAuthAuth(auth)) {
23
+ return { attempted: false, entries: [], errors: [] };
24
+ }
25
+ const quota = computeQwenQuota({ state: await readQwenLocalQuotaState() });
26
+ const style = ctx.config.toastStyle ?? "classic";
27
+ if (style === "grouped") {
28
+ const entries = [
29
+ {
30
+ name: "Qwen Daily",
31
+ group: "Qwen (OAuth)",
32
+ label: "Daily:",
33
+ right: `${quota.day.used}/${quota.day.limit}`,
34
+ percentRemaining: quota.day.percentRemaining,
35
+ resetTimeIso: quota.day.resetTimeIso,
36
+ },
37
+ {
38
+ name: "Qwen RPM",
39
+ group: "Qwen (OAuth)",
40
+ label: "RPM:",
41
+ right: `${quota.rpm.used}/${quota.rpm.limit}`,
42
+ percentRemaining: quota.rpm.percentRemaining,
43
+ resetTimeIso: quota.rpm.resetTimeIso,
44
+ },
45
+ ];
46
+ return { attempted: true, entries, errors: [] };
47
+ }
48
+ return {
49
+ attempted: true,
50
+ entries: [
51
+ {
52
+ name: "Qwen Daily",
53
+ percentRemaining: quota.day.percentRemaining,
54
+ resetTimeIso: quota.day.resetTimeIso,
55
+ },
56
+ {
57
+ name: "Qwen RPM",
58
+ percentRemaining: quota.rpm.percentRemaining,
59
+ resetTimeIso: quota.rpm.resetTimeIso,
60
+ },
61
+ ],
62
+ errors: [],
63
+ };
64
+ },
65
+ };
66
+ //# sourceMappingURL=qwen-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-code.js","sourceRoot":"","sources":["../../src/providers/qwen-code.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOvD,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAS9C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQvD,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAU9C"}
@@ -8,11 +8,13 @@ import { openaiProvider } from "./openai.js";
8
8
  import { googleAntigravityProvider } from "./google-antigravity.js";
9
9
  import { firmwareProvider } from "./firmware.js";
10
10
  import { chutesProvider } from "./chutes.js";
11
+ import { qwenCodeProvider } from "./qwen-code.js";
11
12
  export function getProviders() {
12
13
  // Order here defines display ordering in the toast.
13
14
  return [
14
15
  copilotProvider,
15
16
  openaiProvider,
17
+ qwenCodeProvider,
16
18
  firmwareProvider,
17
19
  chutesProvider,
18
20
  googleAntigravityProvider,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,YAAY;IAC1B,oDAAoD;IACpD,OAAO;QACL,eAAe;QACf,cAAc;QACd,gBAAgB;QAChB,cAAc;QACd,yBAAyB;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,UAAU,YAAY;IAC1B,oDAAoD;IACpD,OAAO;QACL,eAAe;QACf,cAAc;QACd,gBAAgB;QAChB,gBAAgB;QAChB,cAAc;QACd,yBAAyB;KAC1B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slkiser/opencode-quota",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Monitor quota and tokens for OpenCode providers via Toasts and Commands. Zero LLM calls, zero context pollution.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",