@slkiser/opencode-quota 3.1.4 → 3.3.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 (133) hide show
  1. package/README.md +256 -559
  2. package/dist/lib/anthropic.js +1 -1
  3. package/dist/lib/anthropic.js.map +1 -1
  4. package/dist/lib/cache.d.ts +17 -27
  5. package/dist/lib/cache.d.ts.map +1 -1
  6. package/dist/lib/cache.js +62 -65
  7. package/dist/lib/cache.js.map +1 -1
  8. package/dist/lib/config-file-utils.d.ts +12 -0
  9. package/dist/lib/config-file-utils.d.ts.map +1 -1
  10. package/dist/lib/config-file-utils.js +23 -0
  11. package/dist/lib/config-file-utils.js.map +1 -1
  12. package/dist/lib/config.d.ts +16 -3
  13. package/dist/lib/config.d.ts.map +1 -1
  14. package/dist/lib/config.js +448 -214
  15. package/dist/lib/config.js.map +1 -1
  16. package/dist/lib/copilot.d.ts.map +1 -1
  17. package/dist/lib/copilot.js +3 -2
  18. package/dist/lib/copilot.js.map +1 -1
  19. package/dist/lib/entries.d.ts +6 -2
  20. package/dist/lib/entries.d.ts.map +1 -1
  21. package/dist/lib/format-utils.d.ts.map +1 -1
  22. package/dist/lib/format-utils.js +3 -2
  23. package/dist/lib/format-utils.js.map +1 -1
  24. package/dist/lib/format.d.ts +2 -1
  25. package/dist/lib/format.d.ts.map +1 -1
  26. package/dist/lib/format.js +12 -6
  27. package/dist/lib/format.js.map +1 -1
  28. package/dist/lib/google-gemini-cli-companion.d.ts +29 -0
  29. package/dist/lib/google-gemini-cli-companion.d.ts.map +1 -0
  30. package/dist/lib/google-gemini-cli-companion.js +166 -0
  31. package/dist/lib/google-gemini-cli-companion.js.map +1 -0
  32. package/dist/lib/google-gemini-cli.d.ts +48 -0
  33. package/dist/lib/google-gemini-cli.d.ts.map +1 -0
  34. package/dist/lib/google-gemini-cli.js +404 -0
  35. package/dist/lib/google-gemini-cli.js.map +1 -0
  36. package/dist/lib/init-installer.d.ts +2 -1
  37. package/dist/lib/init-installer.d.ts.map +1 -1
  38. package/dist/lib/init-installer.js +10 -6
  39. package/dist/lib/init-installer.js.map +1 -1
  40. package/dist/lib/opencode-go.js +1 -1
  41. package/dist/lib/opencode-go.js.map +1 -1
  42. package/dist/lib/provider-metadata.d.ts +2 -1
  43. package/dist/lib/provider-metadata.d.ts.map +1 -1
  44. package/dist/lib/provider-metadata.js +27 -0
  45. package/dist/lib/provider-metadata.js.map +1 -1
  46. package/dist/lib/quota-format-style.d.ts +21 -0
  47. package/dist/lib/quota-format-style.d.ts.map +1 -0
  48. package/dist/lib/quota-format-style.js +38 -0
  49. package/dist/lib/quota-format-style.js.map +1 -0
  50. package/dist/lib/quota-render-data.d.ts +4 -12
  51. package/dist/lib/quota-render-data.d.ts.map +1 -1
  52. package/dist/lib/quota-render-data.js +83 -70
  53. package/dist/lib/quota-render-data.js.map +1 -1
  54. package/dist/lib/quota-runtime-context.d.ts +43 -0
  55. package/dist/lib/quota-runtime-context.d.ts.map +1 -0
  56. package/dist/lib/quota-runtime-context.js +61 -0
  57. package/dist/lib/quota-runtime-context.js.map +1 -0
  58. package/dist/lib/quota-state.d.ts +21 -0
  59. package/dist/lib/quota-state.d.ts.map +1 -0
  60. package/dist/lib/quota-state.js +228 -0
  61. package/dist/lib/quota-state.js.map +1 -0
  62. package/dist/lib/quota-status.d.ts +16 -0
  63. package/dist/lib/quota-status.d.ts.map +1 -1
  64. package/dist/lib/quota-status.js +63 -17
  65. package/dist/lib/quota-status.js.map +1 -1
  66. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  67. package/dist/lib/toast-format-grouped.js +5 -3
  68. package/dist/lib/toast-format-grouped.js.map +1 -1
  69. package/dist/lib/tui-config-diagnostics.d.ts +7 -2
  70. package/dist/lib/tui-config-diagnostics.d.ts.map +1 -1
  71. package/dist/lib/tui-config-diagnostics.js +27 -8
  72. package/dist/lib/tui-config-diagnostics.js.map +1 -1
  73. package/dist/lib/tui-runtime.d.ts +1 -2
  74. package/dist/lib/tui-runtime.d.ts.map +1 -1
  75. package/dist/lib/tui-runtime.js +24 -17
  76. package/dist/lib/tui-runtime.js.map +1 -1
  77. package/dist/lib/tui-sidebar-format.d.ts.map +1 -1
  78. package/dist/lib/tui-sidebar-format.js +2 -10
  79. package/dist/lib/tui-sidebar-format.js.map +1 -1
  80. package/dist/lib/types.d.ts +51 -9
  81. package/dist/lib/types.d.ts.map +1 -1
  82. package/dist/lib/types.js +2 -1
  83. package/dist/lib/types.js.map +1 -1
  84. package/dist/plugin.d.ts.map +1 -1
  85. package/dist/plugin.js +448 -242
  86. package/dist/plugin.js.map +1 -1
  87. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  88. package/dist/providers/alibaba-coding-plan.js +0 -16
  89. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  90. package/dist/providers/anthropic.d.ts.map +1 -1
  91. package/dist/providers/anthropic.js +15 -29
  92. package/dist/providers/anthropic.js.map +1 -1
  93. package/dist/providers/copilot.d.ts.map +1 -1
  94. package/dist/providers/copilot.js +27 -53
  95. package/dist/providers/copilot.js.map +1 -1
  96. package/dist/providers/cursor.d.ts.map +1 -1
  97. package/dist/providers/cursor.js +38 -79
  98. package/dist/providers/cursor.js.map +1 -1
  99. package/dist/providers/google-gemini-cli.d.ts +3 -0
  100. package/dist/providers/google-gemini-cli.d.ts.map +1 -0
  101. package/dist/providers/google-gemini-cli.js +83 -0
  102. package/dist/providers/google-gemini-cli.js.map +1 -0
  103. package/dist/providers/kimi-code.d.ts.map +1 -1
  104. package/dist/providers/kimi-code.js +3 -15
  105. package/dist/providers/kimi-code.js.map +1 -1
  106. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  107. package/dist/providers/minimax-coding-plan.js +3 -17
  108. package/dist/providers/minimax-coding-plan.js.map +1 -1
  109. package/dist/providers/nanogpt.d.ts.map +1 -1
  110. package/dist/providers/nanogpt.js +23 -42
  111. package/dist/providers/nanogpt.js.map +1 -1
  112. package/dist/providers/openai.d.ts.map +1 -1
  113. package/dist/providers/openai.js +6 -23
  114. package/dist/providers/openai.js.map +1 -1
  115. package/dist/providers/qwen-code.d.ts.map +1 -1
  116. package/dist/providers/qwen-code.js +7 -23
  117. package/dist/providers/qwen-code.js.map +1 -1
  118. package/dist/providers/registry.d.ts.map +1 -1
  119. package/dist/providers/registry.js +2 -0
  120. package/dist/providers/registry.js.map +1 -1
  121. package/dist/providers/result-helpers.d.ts +2 -2
  122. package/dist/providers/result-helpers.d.ts.map +1 -1
  123. package/dist/providers/result-helpers.js +7 -2
  124. package/dist/providers/result-helpers.js.map +1 -1
  125. package/dist/providers/synthetic.d.ts.map +1 -1
  126. package/dist/providers/synthetic.js +5 -14
  127. package/dist/providers/synthetic.js.map +1 -1
  128. package/dist/providers/zai.d.ts.map +1 -1
  129. package/dist/providers/zai.js +6 -28
  130. package/dist/providers/zai.js.map +1 -1
  131. package/dist/tui.d.ts.map +1 -1
  132. package/dist/tui.tsx +1 -15
  133. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-gemini-cli-companion.js","sourceRoot":"","sources":["../../src/lib/google-gemini-cli-companion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { AuthData, GeminiCliAuthSourceKey, GeminiCliResult } from "./types.js";
2
+ export declare const DEFAULT_GEMINI_CLI_AUTH_CACHE_MAX_AGE_MS = 5000;
3
+ type RefreshParts = {
4
+ refreshToken: string;
5
+ projectId?: string;
6
+ managedProjectId?: string;
7
+ };
8
+ export type GeminiCliAccount = {
9
+ sourceKey: GeminiCliAuthSourceKey;
10
+ refreshToken: string;
11
+ projectId: string;
12
+ email?: string;
13
+ accessToken?: string;
14
+ expiresAt?: number;
15
+ };
16
+ export type GeminiCliAuthPresence = {
17
+ state: "missing";
18
+ sourceKey?: undefined;
19
+ accountCount: 0;
20
+ validAccountCount: 0;
21
+ } | {
22
+ state: "present";
23
+ sourceKey: GeminiCliAuthSourceKey;
24
+ accountCount: number;
25
+ validAccountCount: number;
26
+ } | {
27
+ state: "invalid";
28
+ sourceKey?: GeminiCliAuthSourceKey;
29
+ accountCount: number;
30
+ validAccountCount: number;
31
+ error: string;
32
+ };
33
+ type ConfigClient = {
34
+ config?: {
35
+ get?: () => Promise<{
36
+ data?: unknown;
37
+ }>;
38
+ };
39
+ };
40
+ export declare function parseGeminiCliRefreshParts(refresh: string | undefined): RefreshParts;
41
+ export declare function resolveGeminiCliAccounts(auth: AuthData | null | undefined, configuredProjectId?: string): GeminiCliAccount[];
42
+ export declare function resolveGeminiCliConfiguredProjectId(client?: ConfigClient): Promise<string | undefined>;
43
+ export declare function inspectGeminiCliAuthPresence(client?: ConfigClient): Promise<GeminiCliAuthPresence>;
44
+ export declare function hasGeminiCliQuotaRuntimeAvailable(client?: ConfigClient): Promise<boolean>;
45
+ export declare function queryGeminiCliQuota(client?: ConfigClient): Promise<GeminiCliResult>;
46
+ export declare function clearGeminiCliRuntimeCacheForTests(): void;
47
+ export {};
48
+ //# sourceMappingURL=google-gemini-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-gemini-cli.d.ts","sourceRoot":"","sources":["../../src/lib/google-gemini-cli.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,QAAQ,EACR,sBAAsB,EAGtB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,wCAAwC,OAAQ,CAAC;AAiB9D,KAAK,YAAY,GAAG;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,sBAAsB,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,EAAE,CAAC,CAAC;IAChB,iBAAiB,EAAE,CAAC,CAAC;CACtB,GACD;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,sBAAsB,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GACD;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAcN,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACzC,CAAC;CACH,CAAC;AAUF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAOpF;AA8BD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,mBAAmB,CAAC,EAAE,MAAM,GAC3B,gBAAgB,EAAE,CA0CpB;AA0BD,wBAAsB,mCAAmC,CACvD,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuB7B;AAED,wBAAsB,4BAA4B,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA4BxG;AAED,wBAAsB,iCAAiC,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAW/F;AAiQD,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CA+CzF;AAED,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD"}
@@ -0,0 +1,404 @@
1
+ import { readAuthFileCached } from "./opencode-auth.js";
2
+ import { fetchWithTimeout } from "./http.js";
3
+ import { getCachedAccessToken, makeAccountCacheKey, setCachedAccessToken, } from "./google-token-cache.js";
4
+ import { clearGeminiCliCompanionCacheForTests as clearGeminiCliCompanionResolutionCacheForTests, inspectGeminiCliCompanionPresence, resolveGeminiCliClientCredentials, } from "./google-gemini-cli-companion.js";
5
+ export const DEFAULT_GEMINI_CLI_AUTH_CACHE_MAX_AGE_MS = 5_000;
6
+ const GEMINI_CLI_AUTH_KEYS = [
7
+ "google-gemini-cli",
8
+ "gemini-cli",
9
+ "opencode-gemini-auth",
10
+ "gemini",
11
+ "google",
12
+ ];
13
+ const GEMINI_TOKEN_REFRESH_URL = "https://oauth2.googleapis.com/token";
14
+ const GEMINI_QUOTA_API_URL = "https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota";
15
+ const GEMINI_TOKEN_TIMEOUT_MS = 8_000;
16
+ const GEMINI_QUOTA_TIMEOUT_MS = 6_000;
17
+ const GEMINI_ACCOUNTS_CONCURRENCY = 3;
18
+ const GEMINI_CLI_USER_AGENT = `GeminiCLI/opencode-quota (${process.platform}; ${process.arch})`;
19
+ function normalizeString(value) {
20
+ if (typeof value !== "string") {
21
+ return undefined;
22
+ }
23
+ const trimmed = value.trim();
24
+ return trimmed || undefined;
25
+ }
26
+ export function parseGeminiCliRefreshParts(refresh) {
27
+ const [refreshToken = "", projectId = "", managedProjectId = ""] = (refresh ?? "").split("|");
28
+ return {
29
+ refreshToken: refreshToken.trim(),
30
+ ...(normalizeString(projectId) ? { projectId: projectId.trim() } : {}),
31
+ ...(normalizeString(managedProjectId) ? { managedProjectId: managedProjectId.trim() } : {}),
32
+ };
33
+ }
34
+ function getAuthEntry(auth, sourceKey) {
35
+ return auth[sourceKey];
36
+ }
37
+ function resolveEmail(entry) {
38
+ return (normalizeString(entry.email) ??
39
+ normalizeString(entry.accountEmail) ??
40
+ normalizeString(entry.login));
41
+ }
42
+ function resolveProjectId(entry, parts, configuredProjectId) {
43
+ return (normalizeString(entry.projectId) ??
44
+ normalizeString(entry.projectID) ??
45
+ normalizeString(entry.managedProjectId) ??
46
+ normalizeString(entry.quotaProjectId) ??
47
+ parts.projectId ??
48
+ parts.managedProjectId ??
49
+ normalizeString(configuredProjectId));
50
+ }
51
+ export function resolveGeminiCliAccounts(auth, configuredProjectId) {
52
+ if (!auth) {
53
+ return [];
54
+ }
55
+ const accounts = [];
56
+ const seen = new Set();
57
+ for (const sourceKey of GEMINI_CLI_AUTH_KEYS) {
58
+ const entry = getAuthEntry(auth, sourceKey);
59
+ if (!entry || entry.type !== "oauth") {
60
+ continue;
61
+ }
62
+ const parts = parseGeminiCliRefreshParts(entry.refresh);
63
+ if (!parts.refreshToken) {
64
+ continue;
65
+ }
66
+ const projectId = resolveProjectId(entry, parts, configuredProjectId);
67
+ if (!projectId) {
68
+ continue;
69
+ }
70
+ const email = resolveEmail(entry);
71
+ const key = `${parts.refreshToken}\n${projectId}`;
72
+ if (seen.has(key)) {
73
+ continue;
74
+ }
75
+ seen.add(key);
76
+ accounts.push({
77
+ sourceKey,
78
+ refreshToken: parts.refreshToken,
79
+ projectId,
80
+ ...(email ? { email } : {}),
81
+ ...(normalizeString(entry.access) ? { accessToken: entry.access.trim() } : {}),
82
+ ...(typeof entry.expires === "number" ? { expiresAt: entry.expires } : {}),
83
+ });
84
+ }
85
+ return accounts;
86
+ }
87
+ function countGeminiCliAuthEntries(auth) {
88
+ if (!auth) {
89
+ return 0;
90
+ }
91
+ return GEMINI_CLI_AUTH_KEYS.reduce((count, sourceKey) => {
92
+ const entry = getAuthEntry(auth, sourceKey);
93
+ return entry && entry.type === "oauth" ? count + 1 : count;
94
+ }, 0);
95
+ }
96
+ function firstGeminiCliAuthKey(auth) {
97
+ if (!auth) {
98
+ return undefined;
99
+ }
100
+ return GEMINI_CLI_AUTH_KEYS.find((sourceKey) => getAuthEntry(auth, sourceKey)?.type === "oauth");
101
+ }
102
+ function getCompanionQuotaError(state) {
103
+ return state === "missing"
104
+ ? "Gemini CLI requires the opencode-gemini-auth plugin"
105
+ : "Installed opencode-gemini-auth package is incompatible";
106
+ }
107
+ export async function resolveGeminiCliConfiguredProjectId(client) {
108
+ const explicitEnvProjectId = normalizeString(process.env.OPENCODE_GEMINI_PROJECT_ID);
109
+ if (explicitEnvProjectId) {
110
+ return explicitEnvProjectId;
111
+ }
112
+ if (client?.config?.get) {
113
+ try {
114
+ const result = await client.config.get();
115
+ const data = result?.data;
116
+ const configProjectId = normalizeString(data?.provider?.google?.options?.projectId);
117
+ if (configProjectId) {
118
+ return configProjectId;
119
+ }
120
+ }
121
+ catch {
122
+ // ignore and fall back to generic Google project env vars below
123
+ }
124
+ }
125
+ return (normalizeString(process.env.GOOGLE_CLOUD_PROJECT) ??
126
+ normalizeString(process.env.GOOGLE_CLOUD_PROJECT_ID));
127
+ }
128
+ export async function inspectGeminiCliAuthPresence(client) {
129
+ const [auth, configuredProjectId] = await Promise.all([
130
+ readAuthFileCached({ maxAgeMs: DEFAULT_GEMINI_CLI_AUTH_CACHE_MAX_AGE_MS }),
131
+ resolveGeminiCliConfiguredProjectId(client),
132
+ ]);
133
+ const accountCount = countGeminiCliAuthEntries(auth);
134
+ if (accountCount === 0) {
135
+ return { state: "missing", accountCount: 0, validAccountCount: 0 };
136
+ }
137
+ const accounts = resolveGeminiCliAccounts(auth, configuredProjectId);
138
+ const sourceKey = accounts[0]?.sourceKey ?? firstGeminiCliAuthKey(auth);
139
+ if (accounts.length === 0) {
140
+ return {
141
+ state: "invalid",
142
+ ...(sourceKey ? { sourceKey } : {}),
143
+ accountCount,
144
+ validAccountCount: 0,
145
+ error: "Gemini CLI OAuth auth is missing a refresh token or project id",
146
+ };
147
+ }
148
+ return {
149
+ state: "present",
150
+ sourceKey: accounts[0].sourceKey,
151
+ accountCount,
152
+ validAccountCount: accounts.length,
153
+ };
154
+ }
155
+ export async function hasGeminiCliQuotaRuntimeAvailable(client) {
156
+ const [authPresence, companionPresence] = await Promise.all([
157
+ inspectGeminiCliAuthPresence(client),
158
+ inspectGeminiCliCompanionPresence(),
159
+ ]);
160
+ return (authPresence.state === "present" &&
161
+ authPresence.validAccountCount > 0 &&
162
+ companionPresence.state === "present");
163
+ }
164
+ async function mapWithConcurrency(params) {
165
+ const n = Math.max(1, Math.trunc(params.concurrency));
166
+ const results = new Array(params.items.length);
167
+ let nextIndex = 0;
168
+ const workers = Array.from({ length: Math.min(n, params.items.length) }, async () => {
169
+ while (true) {
170
+ const idx = nextIndex++;
171
+ if (idx >= params.items.length)
172
+ return;
173
+ results[idx] = await params.fn(params.items[idx], idx);
174
+ }
175
+ });
176
+ await Promise.all(workers);
177
+ return results;
178
+ }
179
+ async function refreshAccessToken(params) {
180
+ try {
181
+ const response = await fetchWithTimeout(GEMINI_TOKEN_REFRESH_URL, {
182
+ method: "POST",
183
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
184
+ body: new URLSearchParams({
185
+ client_id: params.clientId,
186
+ client_secret: params.clientSecret,
187
+ refresh_token: params.refreshToken,
188
+ grant_type: "refresh_token",
189
+ }),
190
+ }, params.timeoutMs ?? GEMINI_TOKEN_TIMEOUT_MS);
191
+ if (!response.ok) {
192
+ try {
193
+ const errorData = (await response.json());
194
+ if (errorData.error === "invalid_grant") {
195
+ return { error: "Token revoked" };
196
+ }
197
+ return { error: errorData.error_description || `HTTP ${response.status}` };
198
+ }
199
+ catch {
200
+ return { error: `HTTP ${response.status}` };
201
+ }
202
+ }
203
+ const data = (await response.json());
204
+ return {
205
+ accessToken: data.access_token,
206
+ expiresIn: data.expires_in,
207
+ };
208
+ }
209
+ catch (err) {
210
+ if (err instanceof Error && err.message.includes("timeout")) {
211
+ return { error: "Token refresh timeout" };
212
+ }
213
+ return { error: "Token refresh failed" };
214
+ }
215
+ }
216
+ async function refreshGeminiCliAccessTokenWithCache(params) {
217
+ const skewMs = params.skewMs ?? 2 * 60_000;
218
+ const key = makeAccountCacheKey({
219
+ refreshToken: params.account.refreshToken,
220
+ projectId: params.account.projectId,
221
+ email: params.account.email,
222
+ });
223
+ if (!params.force) {
224
+ const cached = await getCachedAccessToken({ key, skewMs });
225
+ if (cached)
226
+ return { accessToken: cached.accessToken };
227
+ if (params.account.accessToken &&
228
+ typeof params.account.expiresAt === "number" &&
229
+ params.account.expiresAt > Date.now() + skewMs) {
230
+ return { accessToken: params.account.accessToken };
231
+ }
232
+ }
233
+ const refreshed = await refreshAccessToken({
234
+ refreshToken: params.account.refreshToken,
235
+ clientId: params.credentials.clientId,
236
+ clientSecret: params.credentials.clientSecret,
237
+ });
238
+ if ("error" in refreshed)
239
+ return refreshed;
240
+ await setCachedAccessToken({
241
+ key,
242
+ entry: {
243
+ accessToken: refreshed.accessToken,
244
+ expiresAt: Date.now() + Math.max(1, refreshed.expiresIn) * 1000,
245
+ projectId: params.account.projectId,
246
+ email: params.account.email,
247
+ },
248
+ });
249
+ return { accessToken: refreshed.accessToken };
250
+ }
251
+ async function retrieveGeminiCliQuota(accessToken, projectId) {
252
+ const response = await fetchWithTimeout(GEMINI_QUOTA_API_URL, {
253
+ method: "POST",
254
+ headers: {
255
+ "Content-Type": "application/json",
256
+ Authorization: `Bearer ${accessToken}`,
257
+ "User-Agent": GEMINI_CLI_USER_AGENT,
258
+ },
259
+ body: JSON.stringify({ project: projectId }),
260
+ }, GEMINI_QUOTA_TIMEOUT_MS);
261
+ if (!response.ok) {
262
+ if (response.status === 401 || response.status === 403) {
263
+ throw new Error(`Gemini CLI quota auth error: ${response.status}`);
264
+ }
265
+ throw new Error(`Gemini CLI quota API error: ${response.status}`);
266
+ }
267
+ return response.json();
268
+ }
269
+ function formatDisplayName(modelId) {
270
+ const cleaned = modelId.replace(/_/g, "-").trim();
271
+ if (!cleaned) {
272
+ return "Gemini";
273
+ }
274
+ const words = cleaned
275
+ .replace(/^gemini-/i, "")
276
+ .split("-")
277
+ .filter(Boolean)
278
+ .map((part) => {
279
+ if (/^[0-9]+(?:\.[0-9]+)*$/.test(part))
280
+ return part;
281
+ return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
282
+ });
283
+ return words.length > 0 ? `Gemini ${words.join(" ")}` : "Gemini";
284
+ }
285
+ function mapQuotaBuckets(buckets, account) {
286
+ if (!buckets) {
287
+ return [];
288
+ }
289
+ return buckets
290
+ .filter((bucket) => normalizeString(bucket.modelId))
291
+ .map((bucket) => {
292
+ const modelId = normalizeString(bucket.modelId);
293
+ const remainingFraction = bucket.remainingFraction;
294
+ const percentRemaining = typeof remainingFraction === "number" && Number.isFinite(remainingFraction)
295
+ ? Math.round(remainingFraction * 100)
296
+ : 0;
297
+ return {
298
+ modelId,
299
+ displayName: formatDisplayName(modelId),
300
+ percentRemaining,
301
+ ...(normalizeString(bucket.resetTime) ? { resetTimeIso: bucket.resetTime.trim() } : {}),
302
+ ...(normalizeString(bucket.remainingAmount)
303
+ ? { remainingAmount: bucket.remainingAmount.trim() }
304
+ : {}),
305
+ ...(normalizeString(bucket.tokenType) ? { tokenType: bucket.tokenType.trim() } : {}),
306
+ ...(account.email ? { accountEmail: account.email } : {}),
307
+ sourceKey: account.sourceKey,
308
+ };
309
+ });
310
+ }
311
+ async function fetchAccountQuota(params) {
312
+ const accountEmail = params.account.email || params.account.sourceKey;
313
+ try {
314
+ const tokenResult = await refreshGeminiCliAccessTokenWithCache({
315
+ account: params.account,
316
+ credentials: params.credentials,
317
+ });
318
+ if ("error" in tokenResult) {
319
+ return { success: false, error: tokenResult.error, accountEmail };
320
+ }
321
+ let quota;
322
+ try {
323
+ quota = await retrieveGeminiCliQuota(tokenResult.accessToken, params.account.projectId);
324
+ }
325
+ catch (err) {
326
+ if (err instanceof Error && err.message.includes("auth error")) {
327
+ const retryToken = await refreshGeminiCliAccessTokenWithCache({
328
+ account: params.account,
329
+ credentials: params.credentials,
330
+ force: true,
331
+ });
332
+ if ("error" in retryToken) {
333
+ return { success: false, error: retryToken.error, accountEmail };
334
+ }
335
+ quota = await retrieveGeminiCliQuota(retryToken.accessToken, params.account.projectId);
336
+ }
337
+ else {
338
+ throw err;
339
+ }
340
+ }
341
+ return {
342
+ success: true,
343
+ buckets: mapQuotaBuckets(quota.buckets, params.account),
344
+ accountEmail,
345
+ };
346
+ }
347
+ catch (err) {
348
+ if (err instanceof Error && err.message.includes("timeout")) {
349
+ return { success: false, error: "API timeout", accountEmail };
350
+ }
351
+ return {
352
+ success: false,
353
+ error: err instanceof Error ? err.message : String(err),
354
+ accountEmail,
355
+ };
356
+ }
357
+ }
358
+ export async function queryGeminiCliQuota(client) {
359
+ const [auth, configuredProjectId] = await Promise.all([
360
+ readAuthFileCached({ maxAgeMs: DEFAULT_GEMINI_CLI_AUTH_CACHE_MAX_AGE_MS }),
361
+ resolveGeminiCliConfiguredProjectId(client),
362
+ ]);
363
+ const accounts = resolveGeminiCliAccounts(auth, configuredProjectId);
364
+ if (accounts.length === 0) {
365
+ return null;
366
+ }
367
+ const credentials = await resolveGeminiCliClientCredentials();
368
+ if (credentials.state !== "configured") {
369
+ return {
370
+ success: false,
371
+ error: getCompanionQuotaError(credentials.state),
372
+ };
373
+ }
374
+ const results = await mapWithConcurrency({
375
+ items: accounts,
376
+ concurrency: GEMINI_ACCOUNTS_CONCURRENCY,
377
+ fn: async (account) => fetchAccountQuota({ account, credentials }),
378
+ });
379
+ const allBuckets = [];
380
+ const errors = [];
381
+ for (const result of results) {
382
+ if (result.success && result.buckets && result.buckets.length > 0) {
383
+ allBuckets.push(...result.buckets);
384
+ }
385
+ else if (!result.success && result.error && result.accountEmail) {
386
+ errors.push({ email: result.accountEmail, error: result.error });
387
+ }
388
+ }
389
+ if (allBuckets.length === 0 && errors.length === 0) {
390
+ return {
391
+ success: false,
392
+ error: "No Gemini CLI quota data available",
393
+ };
394
+ }
395
+ return {
396
+ success: true,
397
+ buckets: allBuckets,
398
+ errors: errors.length > 0 ? errors : undefined,
399
+ };
400
+ }
401
+ export function clearGeminiCliRuntimeCacheForTests() {
402
+ clearGeminiCliCompanionResolutionCacheForTests();
403
+ }
404
+ //# sourceMappingURL=google-gemini-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-gemini-cli.js","sourceRoot":"","sources":["../../src/lib/google-gemini-cli.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type ConfigFileFormat } from "./config-file-utils.js";
2
+ import { type CanonicalQuotaFormatStyle } from "./quota-format-style.js";
2
3
  import type { QuotaToastConfig } from "./types.js";
3
4
  export type InitInstallerScope = "project" | "global";
4
5
  export type InitQuotaUi = "toast" | "sidebar" | "toast_sidebar" | "none";
@@ -8,7 +9,7 @@ export interface InitInstallerSelections {
8
9
  quotaUi: InitQuotaUi;
9
10
  providerMode: InitProviderMode;
10
11
  manualProviders: string[];
11
- formatStyle: QuotaToastConfig["formatStyle"];
12
+ formatStyle: CanonicalQuotaFormatStyle;
12
13
  percentDisplayMode: QuotaToastConfig["percentDisplayMode"];
13
14
  showSessionTokens: boolean;
14
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init-installer.d.ts","sourceRoot":"","sources":["../../src/lib/init-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-installer.d.ts","sourceRoot":"","sources":["../../src/lib/init-installer.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { dedupeNonEmptyStrings, extractPluginSpecsFromParsedConfig, getPluginSpe
5
5
  import { parseJsonOrJsonc } from "./jsonc.js";
6
6
  import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
7
7
  import { QUOTA_PROVIDER_SHAPES, getQuotaProviderDisplayLabel, normalizeQuotaProviderId, } from "./provider-metadata.js";
8
+ import { getQuotaFormatStyleLabel, isQuotaFormatStyle, resolveQuotaFormatStyle, } from "./quota-format-style.js";
8
9
  const QUOTA_PLUGIN_SPEC = "@slkiser/opencode-quota";
9
10
  const OPENCODE_SCHEMA_URL = "https://opencode.ai/config.json";
10
11
  const TUI_SCHEMA_URL = "https://opencode.ai/tui.json";
@@ -59,8 +60,8 @@ function resolveRequestedProviders(selections) {
59
60
  return normalized;
60
61
  }
61
62
  function pickFormatStyleToWrite(params) {
62
- if (params.quotaToast.toastStyle === "classic" || params.quotaToast.toastStyle === "grouped") {
63
- return params.quotaToast.toastStyle;
63
+ if (isQuotaFormatStyle(params.quotaToast.toastStyle)) {
64
+ return resolveQuotaFormatStyle(params.quotaToast.toastStyle);
64
65
  }
65
66
  return params.selectedFormatStyle;
66
67
  }
@@ -271,7 +272,7 @@ function buildPlanSummary(plan) {
271
272
  `Scope: ${plan.selections.scope} (${plan.baseDir})`,
272
273
  `Quota UI: ${getUiLabel(plan.selections.quotaUi)}`,
273
274
  `Provider mode: ${getProviderModeLabel(plan.selections.providerMode)}`,
274
- `Layout style: ${plan.selections.formatStyle}`,
275
+ `Quota display style: ${getQuotaFormatStyleLabel(plan.selections.formatStyle)}`,
275
276
  `Percent display (toast/sidebar): ${getPercentDisplayModeLabel(plan.selections.percentDisplayMode)}`,
276
277
  `Show session tokens: ${plan.selections.showSessionTokens ? "Yes" : "No"}`,
277
278
  ];
@@ -426,10 +427,13 @@ async function promptForSelections(prompts) {
426
427
  manualProviders = selected.filter((value) => typeof value === "string");
427
428
  }
428
429
  const formatStyle = await prompts.select({
429
- message: "Layout style",
430
+ message: "Quota display style",
430
431
  options: [
431
- { label: "Classic", value: "classic" },
432
- { label: "Grouped", value: "grouped" },
432
+ {
433
+ label: "Single window",
434
+ value: "singleWindow",
435
+ },
436
+ { label: "All windows", value: "allWindows" }
433
437
  ],
434
438
  });
435
439
  if (prompts.isCancel(formatStyle))