geminimock 0.1.2 → 0.1.3

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 (36) hide show
  1. package/README.md +77 -8
  2. package/dist/auth/account-store.d.ts +36 -0
  3. package/dist/auth/account-store.js +366 -0
  4. package/dist/auth/account-store.js.map +1 -0
  5. package/dist/auth/credential-store.d.ts +2 -0
  6. package/dist/auth/credential-store.js +33 -1
  7. package/dist/auth/credential-store.js.map +1 -1
  8. package/dist/auth/oauth-flow.d.ts +0 -2
  9. package/dist/auth/oauth-flow.js +122 -15
  10. package/dist/auth/oauth-flow.js.map +1 -1
  11. package/dist/auth/oauth-service.d.ts +12 -3
  12. package/dist/auth/oauth-service.js +90 -29
  13. package/dist/auth/oauth-service.js.map +1 -1
  14. package/dist/cli.js +336 -14
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/auth-login.d.ts +16 -0
  17. package/dist/commands/auth-login.js +114 -0
  18. package/dist/commands/auth-login.js.map +1 -0
  19. package/dist/commands/auth-logout.d.ts +19 -0
  20. package/dist/commands/auth-logout.js +178 -0
  21. package/dist/commands/auth-logout.js.map +1 -0
  22. package/dist/config/env.d.ts +1 -0
  23. package/dist/config/env.js +3 -1
  24. package/dist/config/env.js.map +1 -1
  25. package/dist/gemini/code-assist-client.d.ts +15 -1
  26. package/dist/gemini/code-assist-client.js +101 -37
  27. package/dist/gemini/code-assist-client.js.map +1 -1
  28. package/dist/gemini/errors.d.ts +8 -0
  29. package/dist/gemini/errors.js +29 -0
  30. package/dist/gemini/errors.js.map +1 -0
  31. package/dist/server/app.js +8 -3
  32. package/dist/server/app.js.map +1 -1
  33. package/dist/server/background-service.d.ts +46 -0
  34. package/dist/server/background-service.js +332 -0
  35. package/dist/server/background-service.js.map +1 -0
  36. package/package.json +6 -1
package/README.md CHANGED
@@ -9,8 +9,15 @@ OpenAI-compatible chat API server backed by Gemini Code Assist OAuth.
9
9
 
10
10
  Installed CLI command:
11
11
 
12
+ - `geminimock server start`
13
+ - `geminimock server stop`
14
+ - `geminimock server status`
12
15
  - `geminimock auth login`
13
16
  - `geminimock auth logout`
17
+ - `geminimock auth logout --all`
18
+ - `geminimock auth accounts list`
19
+ - `geminimock auth accounts use <id|email>`
20
+ - `geminimock auth accounts remove <id|email>`
14
21
  - `geminimock models list`
15
22
  - `geminimock update`
16
23
  - `geminimock serve`
@@ -19,7 +26,12 @@ Installed CLI command:
19
26
 
20
27
  - `bun run auth:login`
21
28
  - `bun run auth:logout`
29
+ - `bun run auth:logout:all`
30
+ - `bun run auth:accounts:list`
22
31
  - `bun run models:list`
32
+ - `bun run server:start`
33
+ - `bun run server:stop`
34
+ - `bun run server:status`
23
35
  - `bun run self:update`
24
36
  - `bun run dev`
25
37
  - `bun run start`
@@ -33,23 +45,45 @@ Installed CLI command:
33
45
  ## Environment
34
46
 
35
47
  - `GEMINI_CLI_API_HOST` default: `127.0.0.1`
36
- - `GEMINI_CLI_API_PORT` default: `8080`
48
+ - `GEMINI_CLI_API_PORT` default: `43173`
37
49
  - `GEMINI_CLI_MODEL` default: `gemini-2.5-pro`
38
50
  - `CODE_ASSIST_ENDPOINT` default: `https://cloudcode-pa.googleapis.com`
39
51
  - `CODE_ASSIST_API_VERSION` default: `v1internal`
52
+ - `GEMINI_CLI_API_ACCOUNTS_PATH` default: `~/.geminimock/accounts.json`
40
53
  - `GEMINI_CLI_API_OAUTH_PATH` default: `~/.geminimock/oauth_creds.json`
41
54
  - `GEMINI_CLI_OAUTH_FALLBACK_PATH` default: `~/.gemini/oauth_creds.json`
42
- - `GEMINI_CLI_OAUTH_CLIENT_ID` required for fresh OAuth login
43
- - `GEMINI_CLI_OAUTH_CLIENT_SECRET` required for fresh OAuth login
55
+ - `GEMINI_CLI_OAUTH_CLIENT_ID` optional override
56
+ - `GEMINI_CLI_OAUTH_CLIENT_SECRET` optional
57
+ - `GEMINI_CLI_OAUTH_SOURCE_PATH` optional explicit path to Gemini CLI `oauth2.js` for auto-discovery
58
+ - `GEMINI_CLI_OAUTH_AUTO_DISCOVERY` default: `1` (`0` disables Gemini CLI client auto-discovery)
59
+ - `GEMINI_CLI_BIN_PATH` optional explicit path to `gemini` executable
44
60
  - `GOOGLE_CLOUD_PROJECT` optional
45
61
  - `GOOGLE_CLOUD_PROJECT_ID` optional
46
62
 
47
63
  ## OAuth Login
48
64
 
49
65
  1. Run `bun run auth:login`
50
- 2. Browser opens automatically and listens on a local callback URL
51
- 3. If browser callback is not available, paste either authorization code or full callback URL
52
- 4. If OAuth client env values are not set but `~/.gemini/oauth_creds.json` exists, stored credentials are reused
66
+ 2. Browser OAuth opens automatically with local callback and account selection prompt
67
+ 3. If callback cannot complete, paste the authorization code or callback URL in terminal
68
+ 4. OAuth client config is resolved in this order: explicit env vars, installed Gemini CLI auto-discovery
69
+ 5. `auth login` uses keyboard TUI (`Up/Down`, `Enter`, `Q/Esc`) to start login, repeat login, or finish
70
+ 6. `Login Completed` screen shows `Last login account: <email>`
71
+ 7. `auth logout` uses keyboard TUI (`Up/Down`, `Enter`, `Q/Esc`) to choose which account to logout
72
+ 8. In the logout list, `[*]` means the current active account
73
+ 9. Choosing `Logout ALL accounts` opens a second TUI confirm selector (`No` / `Yes`)
74
+ 10. `auth logout --all` clears all registered accounts and fallback Gemini auth state
75
+
76
+ ## Multi-Account Rotation
77
+
78
+ - accounts are stored in `~/.geminimock/accounts.json`
79
+ - active account is used by default
80
+ - automatic rotation occurs on API failures indicating rate/capacity/auth blocking:
81
+ - HTTP `429`, `503`, `401`, `403`
82
+ - or error body containing quota/capacity/resource-exhausted indicators
83
+ - current account is put on temporary cooldown and next available account is selected
84
+ - project cache is invalidated automatically when active account changes (manual switch or auto-rotation), so server restart is not required
85
+ - use `geminimock auth accounts list` to inspect active account and IDs
86
+ - use `geminimock auth accounts use <id|email>` to pin a specific account manually
53
87
 
54
88
  ## API
55
89
 
@@ -61,11 +95,46 @@ Installed CLI command:
61
95
  Example:
62
96
 
63
97
  ```bash
64
- curl -sS -X POST http://127.0.0.1:8080/v1/chat/completions \
98
+ curl -sS -X POST http://127.0.0.1:43173/v1/chat/completions \
65
99
  -H 'content-type: application/json' \
66
100
  -d '{"model":"gemini-2.5-flash","messages":[{"role":"user","content":"Hello"}]}'
67
101
  ```
68
102
 
69
103
  ```bash
70
- curl -sS http://127.0.0.1:8080/v1/models
104
+ curl -sS http://127.0.0.1:43173/v1/models
71
105
  ```
106
+
107
+ Notes:
108
+
109
+ - `messages` must include at least one non-`system` message (`user` or `assistant`). Sending only `system` can fail with:
110
+ - `400 INVALID_ARGUMENT: at least one contents field is required`
111
+ - To use system prompt, include both `system` and `user`:
112
+
113
+ ```bash
114
+ curl -sS -X POST http://127.0.0.1:43173/v1/chat/completions \
115
+ -H 'content-type: application/json' \
116
+ -d '{"model":"gemini-2.5-flash","messages":[{"role":"system","content":"You are concise."},{"role":"user","content":"Hello"}]}'
117
+ ```
118
+
119
+ Troubleshooting:
120
+
121
+ - `403 PERMISSION_DENIED` (for example `IAM_PERMISSION_DENIED`) usually means the active account does not have permission on the resolved Google project/model.
122
+ - Check active account and switch if needed:
123
+ - `geminimock auth accounts list`
124
+ - `geminimock auth accounts use <id|email>`
125
+ - Check currently available models for that account/project:
126
+ - `geminimock models list`
127
+
128
+ ## Background Server
129
+
130
+ - start: `geminimock server start`
131
+ - status: `geminimock server status`
132
+ - stop: `geminimock server stop`
133
+ - log file: `~/.geminimock/server.log`
134
+ - if `43173` is already in use, `server start` automatically picks an available port; check the actual URL with `server status`
135
+
136
+ ## GitHub Release Automation
137
+
138
+ - On push to `main`, GitHub Actions reads `package.json` version and creates a release tag `v<version>` if it does not exist.
139
+ - Release notes are generated automatically from the merged changes.
140
+ - To publish a new release, bump `package.json` version, commit, and push to `main`.
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import type { StoredCredentials } from "./credential-store.js";
3
+ declare const accountSchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ email: z.ZodOptional<z.ZodString>;
6
+ enabled: z.ZodDefault<z.ZodBoolean>;
7
+ created_at: z.ZodNumber;
8
+ updated_at: z.ZodNumber;
9
+ last_used_at: z.ZodOptional<z.ZodNumber>;
10
+ cooldown_until: z.ZodOptional<z.ZodNumber>;
11
+ last_error: z.ZodOptional<z.ZodString>;
12
+ credentials: z.ZodObject<{
13
+ access_token: z.ZodString;
14
+ refresh_token: z.ZodOptional<z.ZodString>;
15
+ expiry_date: z.ZodOptional<z.ZodNumber>;
16
+ token_type: z.ZodOptional<z.ZodString>;
17
+ scope: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ }, z.core.$strip>;
20
+ export type StoredAccount = z.infer<typeof accountSchema>;
21
+ export type AccountStore = ReturnType<typeof createAccountStore>;
22
+ export declare function createAccountStore(accountsPath: string, legacyOAuthPath?: string, fallbackOAuthPath?: string): {
23
+ accountsPath: string;
24
+ listAccounts(): Promise<StoredAccount[]>;
25
+ getActiveAccount(): Promise<StoredAccount | null>;
26
+ getAccountCount(): Promise<number>;
27
+ addOrUpdateAccount(credentials: StoredCredentials, email?: string): Promise<StoredAccount>;
28
+ setActiveAccount(idOrEmail: string): Promise<StoredAccount>;
29
+ removeAccount(idOrEmail: string): Promise<boolean>;
30
+ logoutActive(): Promise<StoredAccount | null>;
31
+ markActiveUsed(): Promise<void>;
32
+ updateActiveCredentials(credentials: StoredCredentials, email?: string): Promise<StoredAccount>;
33
+ rotateActiveAccount(reason: string, cooldownMs: number): Promise<StoredAccount | null>;
34
+ clearAll(): Promise<void>;
35
+ };
36
+ export {};
@@ -0,0 +1,366 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { z } from "zod";
5
+ const credentialSchema = z.object({
6
+ access_token: z.string(),
7
+ refresh_token: z.string().optional(),
8
+ expiry_date: z.number().optional(),
9
+ token_type: z.string().optional(),
10
+ scope: z.string().optional()
11
+ });
12
+ const accountSchema = z.object({
13
+ id: z.string(),
14
+ email: z.string().optional(),
15
+ enabled: z.boolean().default(true),
16
+ created_at: z.number(),
17
+ updated_at: z.number(),
18
+ last_used_at: z.number().optional(),
19
+ cooldown_until: z.number().optional(),
20
+ last_error: z.string().optional(),
21
+ credentials: credentialSchema
22
+ });
23
+ const storageSchema = z.object({
24
+ version: z.literal(1),
25
+ active_account_id: z.string().optional(),
26
+ rotation_cursor: z.number().int().nonnegative().default(0),
27
+ accounts: z.array(accountSchema).default([])
28
+ });
29
+ function createEmptyStorage() {
30
+ return {
31
+ version: 1,
32
+ active_account_id: undefined,
33
+ rotation_cursor: 0,
34
+ accounts: []
35
+ };
36
+ }
37
+ async function readJson(path) {
38
+ try {
39
+ const raw = await readFile(path, "utf8");
40
+ return JSON.parse(raw);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function normalizeCredentials(credentials) {
47
+ return credentialSchema.parse({
48
+ access_token: credentials.access_token,
49
+ refresh_token: credentials.refresh_token ?? undefined,
50
+ expiry_date: credentials.expiry_date ?? undefined,
51
+ token_type: credentials.token_type ?? undefined,
52
+ scope: credentials.scope ?? undefined
53
+ });
54
+ }
55
+ function now() {
56
+ return Date.now();
57
+ }
58
+ function accountId() {
59
+ return randomBytes(8).toString("hex");
60
+ }
61
+ function isUsable(account, at) {
62
+ if (!account.enabled) {
63
+ return false;
64
+ }
65
+ const cooldownUntil = account.cooldown_until ?? 0;
66
+ return cooldownUntil <= at;
67
+ }
68
+ function ensureActiveAccount(storage) {
69
+ if (storage.accounts.length === 0) {
70
+ storage.active_account_id = undefined;
71
+ storage.rotation_cursor = 0;
72
+ return storage;
73
+ }
74
+ const active = storage.accounts.find((account) => account.id === storage.active_account_id);
75
+ if (active?.enabled) {
76
+ return storage;
77
+ }
78
+ const fallback = storage.accounts.find((account) => account.enabled) ?? storage.accounts[0];
79
+ storage.active_account_id = fallback?.id;
80
+ return storage;
81
+ }
82
+ export function createAccountStore(accountsPath, legacyOAuthPath, fallbackOAuthPath) {
83
+ const signedOutPath = join(dirname(accountsPath), ".signed_out");
84
+ const fallbackDir = fallbackOAuthPath ? dirname(fallbackOAuthPath) : undefined;
85
+ const fallbackAccountsPath = fallbackDir ? join(fallbackDir, "google_accounts.json") : undefined;
86
+ async function writeStorage(storage) {
87
+ const normalized = storageSchema.parse(storage);
88
+ await mkdir(dirname(accountsPath), { recursive: true });
89
+ await writeFile(accountsPath, JSON.stringify(normalized, null, 2), { mode: 0o600, encoding: "utf8" });
90
+ await rm(signedOutPath, { force: true });
91
+ }
92
+ async function readStorageFromFile() {
93
+ const raw = await readJson(accountsPath);
94
+ if (!raw) {
95
+ return null;
96
+ }
97
+ try {
98
+ const parsed = storageSchema.parse(raw);
99
+ return ensureActiveAccount(parsed);
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ async function signedOut() {
106
+ try {
107
+ await readFile(signedOutPath, "utf8");
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ async function migrateLegacySingleAccount() {
115
+ const storage = createEmptyStorage();
116
+ if (await signedOut()) {
117
+ return storage;
118
+ }
119
+ const legacy = legacyOAuthPath ? await readJson(legacyOAuthPath) : null;
120
+ const fallback = fallbackOAuthPath ? await readJson(fallbackOAuthPath) : null;
121
+ const candidate = legacy ?? fallback;
122
+ if (!candidate) {
123
+ return storage;
124
+ }
125
+ try {
126
+ const credentials = credentialSchema.parse(candidate);
127
+ const initial = {
128
+ id: accountId(),
129
+ enabled: true,
130
+ created_at: now(),
131
+ updated_at: now(),
132
+ last_used_at: undefined,
133
+ cooldown_until: undefined,
134
+ last_error: undefined,
135
+ email: undefined,
136
+ credentials
137
+ };
138
+ storage.accounts = [initial];
139
+ storage.active_account_id = initial.id;
140
+ storage.rotation_cursor = 0;
141
+ await writeStorage(storage);
142
+ return storage;
143
+ }
144
+ catch {
145
+ return storage;
146
+ }
147
+ }
148
+ async function loadStorage() {
149
+ const existing = await readStorageFromFile();
150
+ if (existing) {
151
+ return ensureActiveAccount(existing);
152
+ }
153
+ return migrateLegacySingleAccount();
154
+ }
155
+ function resolveAccount(accounts, idOrEmail) {
156
+ const key = idOrEmail.trim().toLowerCase();
157
+ return accounts.find((account) => account.id === idOrEmail || account.email?.toLowerCase() === key);
158
+ }
159
+ function upsertAccount(storage, credentials, email) {
160
+ const normalized = normalizeCredentials(credentials);
161
+ const emailKey = email?.trim().toLowerCase();
162
+ const refreshToken = normalized.refresh_token;
163
+ const existing = storage.accounts.find((account) => {
164
+ if (refreshToken && account.credentials.refresh_token === refreshToken) {
165
+ return true;
166
+ }
167
+ if (emailKey && account.email?.toLowerCase() === emailKey) {
168
+ return true;
169
+ }
170
+ return false;
171
+ });
172
+ if (existing) {
173
+ existing.credentials = normalizeCredentials({
174
+ ...normalized,
175
+ refresh_token: normalized.refresh_token ?? existing.credentials.refresh_token,
176
+ expiry_date: normalized.expiry_date ?? existing.credentials.expiry_date
177
+ });
178
+ existing.enabled = true;
179
+ existing.updated_at = now();
180
+ existing.cooldown_until = undefined;
181
+ existing.last_error = undefined;
182
+ if (email) {
183
+ existing.email = email;
184
+ }
185
+ storage.active_account_id = existing.id;
186
+ return existing;
187
+ }
188
+ const created = {
189
+ id: accountId(),
190
+ email: email,
191
+ enabled: true,
192
+ created_at: now(),
193
+ updated_at: now(),
194
+ last_used_at: undefined,
195
+ cooldown_until: undefined,
196
+ last_error: undefined,
197
+ credentials: normalized
198
+ };
199
+ storage.accounts.push(created);
200
+ storage.active_account_id = created.id;
201
+ return created;
202
+ }
203
+ return {
204
+ accountsPath,
205
+ async listAccounts() {
206
+ const storage = await loadStorage();
207
+ return storage.accounts.map((account) => ({ ...account }));
208
+ },
209
+ async getActiveAccount() {
210
+ const storage = await loadStorage();
211
+ const active = storage.accounts.find((account) => account.id === storage.active_account_id);
212
+ return active ? { ...active } : null;
213
+ },
214
+ async getAccountCount() {
215
+ const storage = await loadStorage();
216
+ return storage.accounts.filter((account) => account.enabled).length;
217
+ },
218
+ async addOrUpdateAccount(credentials, email) {
219
+ const storage = await loadStorage();
220
+ const account = upsertAccount(storage, credentials, email);
221
+ await writeStorage(storage);
222
+ return { ...account };
223
+ },
224
+ async setActiveAccount(idOrEmail) {
225
+ const storage = await loadStorage();
226
+ const account = resolveAccount(storage.accounts, idOrEmail);
227
+ if (!account) {
228
+ throw new Error(`Account not found: ${idOrEmail}`);
229
+ }
230
+ if (!account.enabled) {
231
+ throw new Error(`Account is disabled: ${idOrEmail}`);
232
+ }
233
+ storage.active_account_id = account.id;
234
+ account.updated_at = now();
235
+ await writeStorage(storage);
236
+ return { ...account };
237
+ },
238
+ async removeAccount(idOrEmail) {
239
+ const storage = await loadStorage();
240
+ const index = storage.accounts.findIndex((account) => {
241
+ const email = account.email?.toLowerCase();
242
+ const key = idOrEmail.trim().toLowerCase();
243
+ return account.id === idOrEmail || email === key;
244
+ });
245
+ if (index < 0) {
246
+ return false;
247
+ }
248
+ const removed = storage.accounts.splice(index, 1)[0];
249
+ if (removed?.id === storage.active_account_id) {
250
+ storage.active_account_id = storage.accounts.find((account) => account.enabled)?.id
251
+ ?? storage.accounts[0]?.id;
252
+ }
253
+ await writeStorage(storage);
254
+ return true;
255
+ },
256
+ async logoutActive() {
257
+ const storage = await loadStorage();
258
+ const index = storage.accounts.findIndex((account) => account.id === storage.active_account_id);
259
+ if (index < 0) {
260
+ return null;
261
+ }
262
+ const removed = storage.accounts.splice(index, 1)[0];
263
+ if (removed?.id === storage.active_account_id) {
264
+ storage.active_account_id = storage.accounts.find((account) => account.enabled)?.id
265
+ ?? storage.accounts[0]?.id;
266
+ }
267
+ if (storage.accounts.length === 0) {
268
+ storage.rotation_cursor = 0;
269
+ }
270
+ else if (storage.rotation_cursor >= storage.accounts.length) {
271
+ storage.rotation_cursor = 0;
272
+ }
273
+ await writeStorage(storage);
274
+ return removed ? { ...removed } : null;
275
+ },
276
+ async markActiveUsed() {
277
+ const storage = await loadStorage();
278
+ const active = storage.accounts.find((account) => account.id === storage.active_account_id);
279
+ if (!active) {
280
+ return;
281
+ }
282
+ active.last_used_at = now();
283
+ active.updated_at = now();
284
+ active.cooldown_until = undefined;
285
+ active.last_error = undefined;
286
+ await writeStorage(storage);
287
+ },
288
+ async updateActiveCredentials(credentials, email) {
289
+ const storage = await loadStorage();
290
+ let active = storage.accounts.find((account) => account.id === storage.active_account_id);
291
+ if (!active) {
292
+ active = upsertAccount(storage, credentials, email);
293
+ }
294
+ else {
295
+ const normalized = normalizeCredentials(credentials);
296
+ active.credentials = normalizeCredentials({
297
+ ...normalized,
298
+ refresh_token: normalized.refresh_token ?? active.credentials.refresh_token,
299
+ expiry_date: normalized.expiry_date ?? active.credentials.expiry_date
300
+ });
301
+ active.updated_at = now();
302
+ active.cooldown_until = undefined;
303
+ active.last_error = undefined;
304
+ if (email) {
305
+ active.email = email;
306
+ }
307
+ }
308
+ await writeStorage(storage);
309
+ return { ...active };
310
+ },
311
+ async rotateActiveAccount(reason, cooldownMs) {
312
+ const storage = await loadStorage();
313
+ if (storage.accounts.length < 2) {
314
+ return null;
315
+ }
316
+ const at = now();
317
+ const activeIndex = storage.accounts.findIndex((account) => account.id === storage.active_account_id);
318
+ const current = activeIndex >= 0 ? storage.accounts[activeIndex] : undefined;
319
+ if (!current) {
320
+ storage.active_account_id = storage.accounts.find((account) => isUsable(account, at))?.id
321
+ ?? storage.accounts[0]?.id;
322
+ await writeStorage(storage);
323
+ return storage.accounts.find((account) => account.id === storage.active_account_id) ?? null;
324
+ }
325
+ current.cooldown_until = at + Math.max(0, cooldownMs);
326
+ current.last_error = reason;
327
+ current.updated_at = at;
328
+ for (let step = 1; step <= storage.accounts.length; step += 1) {
329
+ const idx = (activeIndex + step) % storage.accounts.length;
330
+ const candidate = storage.accounts[idx];
331
+ if (!candidate) {
332
+ continue;
333
+ }
334
+ if (candidate.id === current.id) {
335
+ continue;
336
+ }
337
+ if (!isUsable(candidate, at)) {
338
+ continue;
339
+ }
340
+ storage.active_account_id = candidate.id;
341
+ storage.rotation_cursor = idx;
342
+ candidate.last_used_at = at;
343
+ candidate.updated_at = at;
344
+ await writeStorage(storage);
345
+ return { ...candidate };
346
+ }
347
+ await writeStorage(storage);
348
+ return null;
349
+ },
350
+ async clearAll() {
351
+ await rm(accountsPath, { force: true });
352
+ await mkdir(dirname(accountsPath), { recursive: true });
353
+ await writeFile(signedOutPath, `${Date.now()}`, { mode: 0o600, encoding: "utf8" });
354
+ if (legacyOAuthPath) {
355
+ await rm(legacyOAuthPath, { force: true });
356
+ }
357
+ if (fallbackOAuthPath) {
358
+ await rm(fallbackOAuthPath, { force: true });
359
+ }
360
+ if (fallbackAccountsPath) {
361
+ await rm(fallbackAccountsPath, { force: true });
362
+ }
363
+ }
364
+ };
365
+ }
366
+ //# sourceMappingURL=account-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-store.js","sourceRoot":"","sources":["../../src/auth/account-store.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ export declare function createCredentialStore(path: string, fallbackPath?: strin
12
12
  load(): Promise<StoredCredentials | null>;
13
13
  save(credentials: StoredCredentials): Promise<void>;
14
14
  clear(): Promise<void>;
15
+ loadFallback(): Promise<StoredCredentials | null>;
16
+ clearFallback(): Promise<void>;
15
17
  };
16
18
  export type CredentialStore = ReturnType<typeof createCredentialStore>;
17
19
  export {};
@@ -1,5 +1,5 @@
1
1
  import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
- import { dirname } from "node:path";
2
+ import { dirname, join } from "node:path";
3
3
  import { z } from "zod";
4
4
  const credentialSchema = z.object({
5
5
  access_token: z.string(),
@@ -18,7 +18,19 @@ async function readCredentialFile(path) {
18
18
  return null;
19
19
  }
20
20
  }
21
+ async function exists(path) {
22
+ try {
23
+ await readFile(path, "utf8");
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
21
30
  export function createCredentialStore(path, fallbackPath) {
31
+ const signedOutPath = `${dirname(path)}/.signed_out`;
32
+ const fallbackDir = fallbackPath ? dirname(fallbackPath) : undefined;
33
+ const fallbackAccountsPath = fallbackDir ? join(fallbackDir, "google_accounts.json") : undefined;
22
34
  return {
23
35
  path,
24
36
  async load() {
@@ -26,6 +38,9 @@ export function createCredentialStore(path, fallbackPath) {
26
38
  if (primary) {
27
39
  return primary;
28
40
  }
41
+ if (await exists(signedOutPath)) {
42
+ return null;
43
+ }
29
44
  if (!fallbackPath) {
30
45
  return null;
31
46
  }
@@ -35,9 +50,26 @@ export function createCredentialStore(path, fallbackPath) {
35
50
  const data = credentialSchema.parse(credentials);
36
51
  await mkdir(dirname(path), { recursive: true });
37
52
  await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600, encoding: "utf8" });
53
+ await rm(signedOutPath, { force: true });
38
54
  },
39
55
  async clear() {
40
56
  await rm(path, { force: true });
57
+ await mkdir(dirname(path), { recursive: true });
58
+ await writeFile(signedOutPath, `${Date.now()}`, { mode: 0o600, encoding: "utf8" });
59
+ },
60
+ async loadFallback() {
61
+ if (!fallbackPath) {
62
+ return null;
63
+ }
64
+ return readCredentialFile(fallbackPath);
65
+ },
66
+ async clearFallback() {
67
+ if (fallbackPath) {
68
+ await rm(fallbackPath, { force: true });
69
+ }
70
+ if (fallbackAccountsPath) {
71
+ await rm(fallbackAccountsPath, { force: true });
72
+ }
41
73
  }
42
74
  };
43
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAIH,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,YAAqB;IACvE,OAAO;QACL,IAAI;QACJ,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,WAA8B;YACvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,4 @@
1
1
  import { OAuth2Client, type Credentials } from "google-auth-library";
2
- export declare const GEMINI_CLI_OAUTH_CLIENT_ID: string;
3
- export declare const GEMINI_CLI_OAUTH_CLIENT_SECRET: string;
4
2
  export declare const GEMINI_CLI_OAUTH_REDIRECT_URI = "https://codeassist.google.com/authcode";
5
3
  export declare const GEMINI_CLI_OAUTH_SCOPE: readonly ["https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"];
6
4
  export type ManualOAuthRequest = {