@slkiser/opencode-quota 2.1.0 → 2.2.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.
Files changed (55) hide show
  1. package/README.md +72 -45
  2. package/dist/lib/command-handled.d.ts +4 -0
  3. package/dist/lib/command-handled.d.ts.map +1 -1
  4. package/dist/lib/command-handled.js +6 -0
  5. package/dist/lib/command-handled.js.map +1 -1
  6. package/dist/lib/google.d.ts.map +1 -1
  7. package/dist/lib/google.js +7 -2
  8. package/dist/lib/google.js.map +1 -1
  9. package/dist/lib/modelsdev-pricing.d.ts +4 -0
  10. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  11. package/dist/lib/modelsdev-pricing.js +14 -1
  12. package/dist/lib/modelsdev-pricing.js.map +1 -1
  13. package/dist/lib/provider-availability.d.ts +7 -0
  14. package/dist/lib/provider-availability.d.ts.map +1 -0
  15. package/dist/lib/provider-availability.js +12 -0
  16. package/dist/lib/provider-availability.js.map +1 -0
  17. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  18. package/dist/lib/quota-stats-format.js +9 -1
  19. package/dist/lib/quota-stats-format.js.map +1 -1
  20. package/dist/lib/quota-stats.d.ts +15 -0
  21. package/dist/lib/quota-stats.d.ts.map +1 -1
  22. package/dist/lib/quota-stats.js +168 -73
  23. package/dist/lib/quota-stats.js.map +1 -1
  24. package/dist/lib/quota-status.d.ts.map +1 -1
  25. package/dist/lib/quota-status.js +5 -2
  26. package/dist/lib/quota-status.js.map +1 -1
  27. package/dist/lib/qwen-auth.d.ts +8 -0
  28. package/dist/lib/qwen-auth.d.ts.map +1 -0
  29. package/dist/lib/qwen-auth.js +19 -0
  30. package/dist/lib/qwen-auth.js.map +1 -0
  31. package/dist/lib/types.d.ts +54 -0
  32. package/dist/lib/types.d.ts.map +1 -1
  33. package/dist/lib/types.js +2 -2
  34. package/dist/lib/types.js.map +1 -1
  35. package/dist/lib/zai.d.ts +9 -0
  36. package/dist/lib/zai.d.ts.map +1 -0
  37. package/dist/lib/zai.js +86 -0
  38. package/dist/lib/zai.js.map +1 -0
  39. package/dist/plugin.d.ts.map +1 -1
  40. package/dist/plugin.js +135 -138
  41. package/dist/plugin.js.map +1 -1
  42. package/dist/providers/openai.d.ts.map +1 -1
  43. package/dist/providers/openai.js +7 -10
  44. package/dist/providers/openai.js.map +1 -1
  45. package/dist/providers/qwen-code.d.ts.map +1 -1
  46. package/dist/providers/qwen-code.js +4 -11
  47. package/dist/providers/qwen-code.js.map +1 -1
  48. package/dist/providers/registry.d.ts.map +1 -1
  49. package/dist/providers/registry.js +2 -0
  50. package/dist/providers/registry.js.map +1 -1
  51. package/dist/providers/zai.d.ts +8 -0
  52. package/dist/providers/zai.d.ts.map +1 -0
  53. package/dist/providers/zai.js +112 -0
  54. package/dist/providers/zai.js.map +1 -0
  55. package/package.json +1 -1
@@ -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":"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;;;;;;;;OAQG;IACH,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEpC,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IAExB,iDAAiD;IACjD,gBAAgB,EAAE,OAAO,CAAC;IAE1B,4EAA4E;IAC5E,iBAAiB,EAAE,OAAO,CAAC;IAE3B,oCAAoC;IACpC,MAAM,EAAE;QACN,8CAA8C;QAC9C,QAAQ,EAAE,MAAM,CAAC;QACjB,wDAAwD;QACxD,QAAQ,EAAE,MAAM,CAAC;QACjB,8DAA8D;QAC9D,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,mCAAmC;AACnC,eAAO,MAAM,cAAc,EAAE,gBA2B5B,CAAC;AAMF,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAE9E;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,gBAAgB,CAAC,EAAE,eAAe,CAAC;IACnC,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,wBAAwB,CAAC,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iBAAiB,CAAC,EAAE;QAClB,IAAI,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAMD,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED,0CAA0C;AAC1C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAMD,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CACZ,MAAM,EACN;QACE,SAAS,CAAC,EAAE;YACV,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CACF,CAAC;CACH;AAED,uDAAuD;AACvD,MAAM,WAAW,6BAA8B,SAAQ,oBAAoB;IACzE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAMD,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oBAAoB,EAAE,WAAW,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,OAAO,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,OAAO,EAAE,CAAC;IACnC,iBAAiB,EAAE,OAAO,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,cAAc,CAAC;CACjC;AAMD,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACJ,MAAM,EAAE,aAAa,EAAE,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,MAAM,CAAC,EAAE;YAAE,gBAAgB,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7D,MAAM,CAAC,EAAE;YAAE,gBAAgB,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7D,GAAG,CAAC,EAAE;YAAE,gBAAgB,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3D,CAAC;CACH;AAMD,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iCAAiC;AACjC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,mBAAmB;AACnB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,4BAA4B;AAC5B,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,UAAU,GAAG,IAAI,CAAC;AACnE,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,UAAU,GAAG,IAAI,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,UAAU,GAAG,IAAI,CAAC;AAC3D,MAAM,MAAM,YAAY,GACpB;IACE,OAAO,EAAE,IAAI,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACD,UAAU,GACV,IAAI,CAAC;AAET,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,sCAAsC;AACtC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,uCAAuC;AACvC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,aAAa,EACb;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMlD,CAAC"}
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-high", altKey: "gemini-3-pro-low", display: "G3Pro" },
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-5-thinking", altKey: "claude-opus-4-5", display: "Claude" },
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
@@ -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;AA2OF,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"}
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"}
@@ -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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"}
@@ -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,MAu/B9B,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;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 { readAuthFileCached } from "./lib/opencode-auth.js";
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 (!isQwenModel(currentModel))
262
+ if (!isQwenCodeModelId(currentModel))
273
263
  return false;
274
- return await hasQwenOAuthAuth();
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
- const cmd = input.command;
754
- const sessionID = input.sessionID;
755
- if (cmd === "quota") {
756
- // Separate cache for /quota so it doesn't pollute the toast cache.
757
- let quotaCache = globalThis.__opencodeQuotaCommandCache;
758
- if (!quotaCache) {
759
- quotaCache = { message: "", timestamp: 0 };
760
- globalThis.__opencodeQuotaCommandCache = quotaCache;
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
- else if (!config.enabled) {
787
- await injectRawOutput(sessionID, "Quota disabled in config (enabled: false)");
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
- else {
790
- // Check what providers are available for a more specific hint.
791
- const allProvs = getProviders();
792
- const ctx = {
793
- client: typedClient,
794
- config: { googleModels: config.googleModels },
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
- 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.`);
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
- await injectRawOutput(sessionID, msg);
815
- handled();
816
- }
817
- const untilMs = Date.now();
818
- // Handle token report commands (/tokens_*)
819
- if (isTokenReportCommand(cmd)) {
820
- const spec = TOKEN_REPORT_COMMANDS_BY_ID.get(cmd);
821
- if (spec.kind === "between") {
822
- // Special handling for date range command
823
- const parsed = parseQuotaBetweenArgs(input.arguments);
824
- if (!parsed.ok) {
825
- 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`);
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
- const sinceMs = startOfLocalDayMs(parsed.startYmd);
829
- const rangeUntilMs = startOfNextLocalDayMs(parsed.endYmd); // Exclusive upper bound for inclusive end date
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.titleForRange(parsed.startYmd, parsed.endYmd),
856
+ title: spec.title,
832
857
  sinceMs,
833
- untilMs: rangeUntilMs,
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
- // Non-between token report commands
840
- let sinceMs;
841
- let filterSessionID;
842
- let sessionOnly;
843
- let topModels;
844
- let topSessions;
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
- case "session":
856
- filterSessionID = sessionID;
857
- sessionOnly = true;
858
- break;
859
- case "all":
860
- topModels = spec.topModels;
861
- topSessions = spec.topSessions;
862
- break;
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
- const out = await buildStatusReport({
885
- refreshGoogleTokens: parsed.value["refreshGoogleTokens"] === true,
886
- skewMs: typeof parsed.value["skewMs"] === "number"
887
- ? parsed.value["skewMs"]
888
- : undefined,
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 (isQwenModel(model) && (await hasQwenOAuthAuth())) {
948
+ if (isQwenCodeModelId(model) && (await hasQwenOAuthAuthCached())) {
952
949
  try {
953
950
  await recordQwenCompletion();
954
951
  }