@slkiser/opencode-quota 5.0.0 → 5.0.2

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 (53) hide show
  1. package/README.md +2 -0
  2. package/dist/data/modelsdev-pricing.min.json +12 -0
  3. package/dist/lib/config.d.ts +1 -1
  4. package/dist/lib/config.d.ts.map +1 -1
  5. package/dist/lib/config.js +9 -0
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/lib/copilot.d.ts.map +1 -1
  8. package/dist/lib/copilot.js +24 -1
  9. package/dist/lib/copilot.js.map +1 -1
  10. package/dist/lib/cursor-pricing.d.ts.map +1 -1
  11. package/dist/lib/cursor-pricing.js +3 -0
  12. package/dist/lib/cursor-pricing.js.map +1 -1
  13. package/dist/lib/format.d.ts.map +1 -1
  14. package/dist/lib/format.js +27 -3
  15. package/dist/lib/format.js.map +1 -1
  16. package/dist/lib/google-agy.js +1 -1
  17. package/dist/lib/home-dir-display.d.ts +10 -0
  18. package/dist/lib/home-dir-display.d.ts.map +1 -0
  19. package/dist/lib/home-dir-display.js +108 -0
  20. package/dist/lib/home-dir-display.js.map +1 -0
  21. package/dist/lib/opencode-auth.d.ts +6 -0
  22. package/dist/lib/opencode-auth.d.ts.map +1 -1
  23. package/dist/lib/opencode-auth.js +80 -21
  24. package/dist/lib/opencode-auth.js.map +1 -1
  25. package/dist/lib/opencode-storage.d.ts.map +1 -1
  26. package/dist/lib/opencode-storage.js +47 -3
  27. package/dist/lib/opencode-storage.js.map +1 -1
  28. package/dist/lib/quota-providers-remote.d.ts.map +1 -1
  29. package/dist/lib/quota-providers-remote.js +8 -5
  30. package/dist/lib/quota-providers-remote.js.map +1 -1
  31. package/dist/lib/quota-retry-wait.d.ts +36 -0
  32. package/dist/lib/quota-retry-wait.d.ts.map +1 -0
  33. package/dist/lib/quota-retry-wait.js +67 -0
  34. package/dist/lib/quota-retry-wait.js.map +1 -0
  35. package/dist/lib/quota-status.d.ts +2 -0
  36. package/dist/lib/quota-status.d.ts.map +1 -1
  37. package/dist/lib/quota-status.js +33 -15
  38. package/dist/lib/quota-status.js.map +1 -1
  39. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  40. package/dist/lib/toast-format-grouped.js +36 -7
  41. package/dist/lib/toast-format-grouped.js.map +1 -1
  42. package/dist/lib/types.d.ts +5 -0
  43. package/dist/lib/types.d.ts.map +1 -1
  44. package/dist/lib/types.js +1 -0
  45. package/dist/lib/types.js.map +1 -1
  46. package/dist/plugin.d.ts.map +1 -1
  47. package/dist/plugin.js +13 -0
  48. package/dist/plugin.js.map +1 -1
  49. package/dist/providers/copilot.js +2 -2
  50. package/dist/providers/openai.d.ts.map +1 -1
  51. package/dist/providers/openai.js +117 -24
  52. package/dist/providers/openai.js.map +1 -1
  53. package/package.json +1 -1
@@ -5,6 +5,7 @@ import { DEFAULT_OPENAI_AUTH_CACHE_MAX_AGE_MS, hasOpenAIOAuthCached, OPENAI_AUTH
5
5
  import { credentialRowAuthEntry, formatCredentialDisplayNames, readCredentialRows, } from "../lib/opencode-auth.js";
6
6
  import { isCanonicalProviderAvailable } from "../lib/provider-availability.js";
7
7
  import { modelProviderIncludesAny } from "../lib/provider-model-matching.js";
8
+ import { resolveQuotaProviderSessionModelIdentity } from "../lib/quota-providers.js";
8
9
  import { attemptedResult, groupedPercentWindowEntries, mapNullableProviderResult, statusDetailsFromRecord, withStatusDetails, } from "./result-helpers.js";
9
10
  export const openaiProvider = {
10
11
  id: "openai",
@@ -18,15 +19,43 @@ export const openaiProvider = {
18
19
  if (availableByProviderId) {
19
20
  return true;
20
21
  }
21
- return hasOpenAIOAuthCached({ maxAgeMs: DEFAULT_OPENAI_AUTH_CACHE_MAX_AGE_MS });
22
+ if (await hasOpenAIOAuthCached({ maxAgeMs: DEFAULT_OPENAI_AUTH_CACHE_MAX_AGE_MS })) {
23
+ return true;
24
+ }
25
+ // Without an OpenAI alias or OAuth login, a stored API key still counts.
26
+ const keyRows = await readCredentialRows(OPENAI_AUTH_SOURCE_KEYS, {
27
+ methods: ["key"],
28
+ firstOnly: true,
29
+ });
30
+ return keyRows.length > 0;
22
31
  },
23
32
  matchesCurrentModel(model) {
24
33
  return modelProviderIncludesAny(model, ["openai", "chatgpt", "codex"]);
25
34
  },
26
35
  async fetch(ctx) {
27
- const rows = (await readCredentialRows(OPENAI_AUTH_SOURCE_KEYS, { methods: ["oauth"] })).filter((row) => OPENAI_AUTH_SOURCE_KEYS.includes(row.integrationId));
36
+ const currentIntegrationId = ctx.config?.currentProviderID ??
37
+ resolveQuotaProviderSessionModelIdentity({ currentModel: ctx.config?.currentModel ?? "" })
38
+ ?.providerId;
39
+ const rows = (await readCredentialRows(OPENAI_AUTH_SOURCE_KEYS, { methods: ["oauth", "key"] }))
40
+ .filter((row) => OPENAI_AUTH_SOURCE_KEYS.includes(row.integrationId))
41
+ // Active is per integration: keep the session's active login first, then
42
+ // other active logins, preserving source order within each set. Without
43
+ // the session's login, an active OAuth login (which has quota numbers)
44
+ // goes before an active API key (which only has a status).
45
+ .sort((left, right) => {
46
+ const activeOrder = Number(right.active) - Number(left.active);
47
+ if (activeOrder !== 0 || !left.active)
48
+ return activeOrder;
49
+ const sessionOrder = Number(right.integrationId === currentIntegrationId) -
50
+ Number(left.integrationId === currentIntegrationId);
51
+ if (sessionOrder !== 0)
52
+ return sessionOrder;
53
+ return Number(left.value.type === "api") - Number(right.value.type === "api");
54
+ });
28
55
  // A failed login stays in the list so it shows as its own error row.
29
56
  const credentials = rows.flatMap((row) => {
57
+ if (row.value.type === "api")
58
+ return [];
30
59
  const auth = resolveOpenAIOAuth({
31
60
  [row.integrationId]: credentialRowAuthEntry(row),
32
61
  });
@@ -58,35 +87,99 @@ export const openaiProvider = {
58
87
  });
59
88
  const results = await Promise.all(credentials.map(async ({ row, auth }) => ({
60
89
  row,
61
- auth,
62
90
  result: await queryOpenAIQuota({ requestTimeoutMs: ctx.config?.requestTimeoutMs, auth }),
63
91
  })));
64
- const names = formatCredentialDisplayNames("OpenAI", results.map(({ row, result }) => ({
65
- row,
66
- fallbackName: result?.success ? result.label : "OpenAI",
67
- })));
68
- for (const [index, { row, result }] of results.entries()) {
69
- const providerResult = mapResult(result, { group: names[index], sourceId: row.id });
70
- entries.push(...providerResult.entries);
71
- errors.push(...providerResult.errors);
92
+ const resultByRow = new Map(results.map(({ row, result }) => [row, result]));
93
+ // Names span every stored account (OAuth and API key) so numbering and the
94
+ // `(active)` marker match the accounts OpenCode actually holds.
95
+ const names = formatCredentialDisplayNames("OpenAI", rows.map((row) => {
96
+ const result = resultByRow.get(row);
97
+ return {
98
+ row,
99
+ fallbackName: result?.success ? result.label : "OpenAI",
100
+ numberUnnamed: row.value.type === "api",
101
+ };
102
+ }));
103
+ const nameByRow = new Map(rows.map((row, index) => [row, names[index]]));
104
+ for (const row of rows) {
105
+ const name = nameByRow.get(row) ?? "OpenAI";
106
+ if (row.value.type !== "api") {
107
+ const providerResult = mapResult(resultByRow.get(row) ?? null, {
108
+ group: name,
109
+ sourceId: row.id,
110
+ });
111
+ entries.push(...providerResult.entries);
112
+ errors.push(...providerResult.errors);
113
+ continue;
114
+ }
115
+ // ChatGPT's usage endpoint only accepts OAuth credentials, so an API-key
116
+ // account reports its lack of ChatGPT quota instead of a quota number.
117
+ if (row.resolveError !== undefined) {
118
+ errors.push({
119
+ label: name,
120
+ message: `OpenAI API key could not be read: ${row.resolveError}`,
121
+ });
122
+ continue;
123
+ }
124
+ entries.push({
125
+ kind: "value",
126
+ accounting: {
127
+ resultType: "status",
128
+ acquisitionMethod: "local_runtime_accounting",
129
+ ownership: "maintained",
130
+ authority: "locally_derived",
131
+ sourceId: row.id,
132
+ },
133
+ name,
134
+ group: name,
135
+ value: "ChatGPT quota unavailable for API key",
136
+ });
72
137
  }
73
138
  const providerResult = entries.length > 0 || errors.length > 0
74
139
  ? attemptedResult(entries, errors)
75
140
  : mapResult(await queryOpenAIQuota({ requestTimeoutMs: ctx.config?.requestTimeoutMs }));
76
- const configuredAuth = credentials[0]?.auth;
77
- const configured = configuredAuth !== undefined;
78
- const expiresAt = configuredAuth?.state === "configured" ? configuredAuth.expiresAt : undefined;
141
+ // The active account describes the status; a row OpenCode did not mark
142
+ // active (e.g. an env-selected connection or a failed active lookup) must
143
+ // not be reported as the active one.
144
+ const activeRow = rows.find((row) => row.active);
145
+ let authConfigured = "false";
146
+ let authSource = "(none)";
147
+ let tokenStatus = "(none)";
148
+ let tokenExpiresAt = "(none)";
149
+ if (activeRow) {
150
+ if (activeRow.value.type === "api") {
151
+ authConfigured = "true";
152
+ authSource = activeRow.integrationId;
153
+ tokenStatus = activeRow.resolveError !== undefined ? "failed" : "api key";
154
+ }
155
+ else {
156
+ const auth = credentials.find(({ row }) => row === activeRow)?.auth;
157
+ if (auth) {
158
+ const expiresAt = auth.state === "configured" ? auth.expiresAt : undefined;
159
+ authConfigured = "true";
160
+ authSource = auth.sourceKey;
161
+ tokenStatus =
162
+ auth.state === "failed"
163
+ ? "failed"
164
+ : expiresAt && expiresAt < Date.now()
165
+ ? "expired"
166
+ : "valid";
167
+ tokenExpiresAt = expiresAt ? new Date(expiresAt).toISOString() : "(none)";
168
+ }
169
+ }
170
+ }
171
+ else if (rows.length > 0) {
172
+ // Stored accounts exist, but which one is active is unknown.
173
+ authConfigured = "true";
174
+ authSource = "unknown";
175
+ tokenStatus = "unknown";
176
+ tokenExpiresAt = "unknown";
177
+ }
79
178
  return withStatusDetails(providerResult, statusDetailsFromRecord({
80
- auth_configured: configured ? "true" : "false",
81
- auth_source: configuredAuth?.sourceKey ?? "(none)",
82
- token_status: !configured
83
- ? "(none)"
84
- : configuredAuth?.state === "failed"
85
- ? "failed"
86
- : expiresAt && expiresAt < Date.now()
87
- ? "expired"
88
- : "valid",
89
- token_expires_at: expiresAt ? new Date(expiresAt).toISOString() : "(none)",
179
+ auth_configured: authConfigured,
180
+ auth_source: authSource,
181
+ token_status: tokenStatus,
182
+ token_expires_at: tokenExpiresAt,
90
183
  }));
91
184
  },
92
185
  };
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,oCAAoC,EACpC,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,wCAAwC,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,EACL,eAAe,EACf,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,EAAE,EAAE,QAAQ;IAEZ,KAAK,CAAC,WAAW,CAAC,GAAyB;QACzC,gFAAgF;QAChF,MAAM,qBAAqB,GAAG,MAAM,4BAA4B,CAAC;YAC/D,GAAG;YACH,UAAU,EAAE,QAAQ;YACpB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,IAAI,qBAAqB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,oBAAoB,CAAC,EAAE,QAAQ,EAAE,oCAAoC,EAAE,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yEAAyE;QACzE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,uBAAuB,EAAE;YAChE,OAAO,EAAE,CAAC,KAAK,CAAC;YAChB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,OAAO,wBAAwB,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAyB;QACnC,MAAM,oBAAoB,GACxB,GAAG,CAAC,MAAM,EAAE,iBAAiB;YAC7B,wCAAwC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,EAAE,CAAC;gBACxF,EAAE,UAAU,CAAC;QACjB,MAAM,IAAI,GAAG,CAAC,MAAM,kBAAkB,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;aAC5F,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,uBAA6C,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC5F,yEAAyE;YACzE,wEAAwE;YACxE,uEAAuE;YACvE,2DAA2D;aAC1D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,WAAW,CAAC;YAC1D,MAAM,YAAY,GAChB,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,oBAAoB,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,oBAAoB,CAAC,CAAC;YACtD,IAAI,YAAY,KAAK,CAAC;gBAAE,OAAO,YAAY,CAAC;YAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACL,qEAAqE;QACrE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,kBAAkB,CAAC;gBAC9B,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC,GAAG,CAAC;aACrC,CAAC,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAmC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAkC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,CAChB,MAAoD,EACpD,OAAO,GAA0C,EAAE,EACnD,EAAE,CACF,yBAAyB,CAAC,MAAM,EAAE;YAChC,UAAU,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;YACrC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;gBAC5C,OAAO,eAAe,CACpB,2BAA2B,CAAC;oBAC1B,KAAK;oBACL,UAAU,EAAE;wBACV,UAAU,EAAE,YAAY;wBACxB,iBAAiB,EAAE,YAAY;wBAC/B,SAAS,EAAE,YAAY;wBACvB,SAAS,EAAE,mBAAmB;wBAC9B,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5D;oBACD,OAAO,EAAE;wBACP,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;wBAC7D,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;wBACrE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;wBACxE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE;qBACpF;iBACF,CAAC,EACF,EAAE,EACF,EAAE,uBAAuB,EAAE,KAAK,EAAE,CACnC,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QACL,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,GAAG;YACH,MAAM,EAAE,MAAM,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;SACzF,CAAC,CAAC,CACJ,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7E,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,KAAK,GAAG,4BAA4B,CACxC,QAAQ,EACR,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO;gBACL,GAAG;gBACH,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;gBACvD,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK;aACxC,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;YAC5C,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC7B,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;oBAC7D,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,GAAG,CAAC,EAAE;iBACjB,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,yEAAyE;YACzE,uEAAuE;YACvE,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,IAAI;oBACX,OAAO,EAAE,qCAAqC,GAAG,CAAC,YAAY,EAAE;iBACjE,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE;oBACV,UAAU,EAAE,QAAQ;oBACpB,iBAAiB,EAAE,0BAA0B;oBAC7C,SAAS,EAAE,YAAY;oBACvB,SAAS,EAAE,iBAAiB;oBAC5B,QAAQ,EAAE,GAAG,CAAC,EAAE;iBACjB;gBACD,IAAI;gBACJ,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,uCAAuC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,cAAc,GAClB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACrC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC;YAClC,CAAC,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAE5F,uEAAuE;QACvE,0EAA0E;QAC1E,qCAAqC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,cAAc,GAAG,OAAO,CAAC;QAC7B,IAAI,UAAU,GAAG,QAAQ,CAAC;QAC1B,IAAI,WAAW,GAAG,QAAQ,CAAC;QAC3B,IAAI,cAAc,GAAG,QAAQ,CAAC;QAC9B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnC,cAAc,GAAG,MAAM,CAAC;gBACxB,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC;gBACrC,WAAW,GAAG,SAAS,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE,IAAI,CAAC;gBACpE,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC3E,cAAc,GAAG,MAAM,CAAC;oBACxB,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC5B,WAAW;wBACT,IAAI,CAAC,KAAK,KAAK,QAAQ;4BACrB,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,SAAS,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;gCACnC,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,OAAO,CAAC;oBAChB,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,6DAA6D;YAC7D,cAAc,GAAG,MAAM,CAAC;YACxB,UAAU,GAAG,SAAS,CAAC;YACvB,WAAW,GAAG,SAAS,CAAC;YACxB,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;QACD,OAAO,iBAAiB,CACtB,cAAc,EACd,uBAAuB,CAAC;YACtB,eAAe,EAAE,cAAc;YAC/B,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,WAAW;YACzB,gBAAgB,EAAE,cAAc;SACjC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slkiser/opencode-quota",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
4
4
  "description": "OpenCode quota & tokens usage with zero context window pollution. Supports GitHub Copilot, OpenAI (Plus/Pro), Chutes AI, Synthetic, Google AGY, Z.ai coding plan and more.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",