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.
- package/README.md +77 -8
- package/dist/auth/account-store.d.ts +36 -0
- package/dist/auth/account-store.js +366 -0
- package/dist/auth/account-store.js.map +1 -0
- package/dist/auth/credential-store.d.ts +2 -0
- package/dist/auth/credential-store.js +33 -1
- package/dist/auth/credential-store.js.map +1 -1
- package/dist/auth/oauth-flow.d.ts +0 -2
- package/dist/auth/oauth-flow.js +122 -15
- package/dist/auth/oauth-flow.js.map +1 -1
- package/dist/auth/oauth-service.d.ts +12 -3
- package/dist/auth/oauth-service.js +90 -29
- package/dist/auth/oauth-service.js.map +1 -1
- package/dist/cli.js +336 -14
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth-login.d.ts +16 -0
- package/dist/commands/auth-login.js +114 -0
- package/dist/commands/auth-login.js.map +1 -0
- package/dist/commands/auth-logout.d.ts +19 -0
- package/dist/commands/auth-logout.js +178 -0
- package/dist/commands/auth-logout.js.map +1 -0
- package/dist/config/env.d.ts +1 -0
- package/dist/config/env.js +3 -1
- package/dist/config/env.js.map +1 -1
- package/dist/gemini/code-assist-client.d.ts +15 -1
- package/dist/gemini/code-assist-client.js +101 -37
- package/dist/gemini/code-assist-client.js.map +1 -1
- package/dist/gemini/errors.d.ts +8 -0
- package/dist/gemini/errors.js +29 -0
- package/dist/gemini/errors.js.map +1 -0
- package/dist/server/app.js +8 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/background-service.d.ts +46 -0
- package/dist/server/background-service.js +332 -0
- package/dist/server/background-service.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
function formatAccountLabel(account) {
|
|
2
|
+
return account.email ? `${account.id} (${account.email})` : account.id;
|
|
3
|
+
}
|
|
4
|
+
function moveIndex(current, delta, total) {
|
|
5
|
+
if (total <= 0) {
|
|
6
|
+
return 0;
|
|
7
|
+
}
|
|
8
|
+
const next = (current + delta) % total;
|
|
9
|
+
return next < 0 ? next + total : next;
|
|
10
|
+
}
|
|
11
|
+
function buildMenuItems(accounts) {
|
|
12
|
+
return [
|
|
13
|
+
...accounts.map((account) => ({ kind: "account", account })),
|
|
14
|
+
{ kind: "all" },
|
|
15
|
+
{ kind: "cancel" }
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
function initialMainIndex(accounts, activeId) {
|
|
19
|
+
if (!activeId) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
const index = accounts.findIndex((account) => account.id === activeId);
|
|
23
|
+
return index < 0 ? 0 : index;
|
|
24
|
+
}
|
|
25
|
+
function renderMainScreen(items, index, activeId) {
|
|
26
|
+
const lines = [
|
|
27
|
+
"+------------------------------------------------------------+",
|
|
28
|
+
"| GeminiMock Logout Selector |",
|
|
29
|
+
"+------------------------------------------------------------+",
|
|
30
|
+
"Use Up/Down to move, Enter to select, Q/Esc to cancel",
|
|
31
|
+
"Legend: [*] active account",
|
|
32
|
+
""
|
|
33
|
+
];
|
|
34
|
+
for (let i = 0; i < items.length; i += 1) {
|
|
35
|
+
const item = items[i];
|
|
36
|
+
const marker = i === index ? ">" : " ";
|
|
37
|
+
if (item.kind === "account") {
|
|
38
|
+
const activeMarker = item.account.id === activeId ? "*" : " ";
|
|
39
|
+
const email = item.account.email ?? "(no email)";
|
|
40
|
+
lines.push(`${marker} [${activeMarker}] ${email} ${item.account.id}`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (item.kind === "all") {
|
|
44
|
+
lines.push(`${marker} [ ] Logout ALL accounts`);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
lines.push(`${marker} [ ] Cancel`);
|
|
48
|
+
}
|
|
49
|
+
lines.push("");
|
|
50
|
+
return lines.join("\n");
|
|
51
|
+
}
|
|
52
|
+
function renderConfirmAllScreen(index) {
|
|
53
|
+
const options = ["No, keep accounts", "Yes, logout ALL accounts"];
|
|
54
|
+
const lines = [
|
|
55
|
+
"+------------------------------------------------------------+",
|
|
56
|
+
"| Confirm Logout ALL Accounts |",
|
|
57
|
+
"+------------------------------------------------------------+",
|
|
58
|
+
"Use Up/Down and Enter to confirm",
|
|
59
|
+
""
|
|
60
|
+
];
|
|
61
|
+
for (let i = 0; i < options.length; i += 1) {
|
|
62
|
+
const marker = i === index ? ">" : " ";
|
|
63
|
+
lines.push(`${marker} ${options[i]}`);
|
|
64
|
+
}
|
|
65
|
+
lines.push("");
|
|
66
|
+
return lines.join("\n");
|
|
67
|
+
}
|
|
68
|
+
async function logoutActiveAndDescribe(oauthService, store) {
|
|
69
|
+
const activeBefore = await store.getActiveAccount();
|
|
70
|
+
const removed = await oauthService.logout();
|
|
71
|
+
if (!removed) {
|
|
72
|
+
return ["No active account to logout"];
|
|
73
|
+
}
|
|
74
|
+
const activeAfter = await store.getActiveAccount();
|
|
75
|
+
const lines = [`Logged out account: ${formatAccountLabel(removed)}`];
|
|
76
|
+
if (!activeBefore || activeBefore.id !== removed.id) {
|
|
77
|
+
if (activeAfter) {
|
|
78
|
+
lines.push(`Active account unchanged: ${formatAccountLabel(activeAfter)}`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push("No active account remaining");
|
|
82
|
+
}
|
|
83
|
+
return lines;
|
|
84
|
+
}
|
|
85
|
+
if (!activeAfter) {
|
|
86
|
+
lines.push("No accounts remaining");
|
|
87
|
+
return lines;
|
|
88
|
+
}
|
|
89
|
+
lines.push(`Active account switched to: ${formatAccountLabel(activeAfter)}`);
|
|
90
|
+
return lines;
|
|
91
|
+
}
|
|
92
|
+
async function logoutSpecificAndDescribe(oauthService, store, target) {
|
|
93
|
+
const activeBefore = await store.getActiveAccount();
|
|
94
|
+
if (activeBefore?.id === target.id) {
|
|
95
|
+
return logoutActiveAndDescribe(oauthService, store);
|
|
96
|
+
}
|
|
97
|
+
const removed = await oauthService.removeAccount(target.id);
|
|
98
|
+
if (!removed) {
|
|
99
|
+
return [`Account not found: ${target.id}`];
|
|
100
|
+
}
|
|
101
|
+
const activeAfter = await store.getActiveAccount();
|
|
102
|
+
const lines = [`Logged out account: ${formatAccountLabel(target)}`];
|
|
103
|
+
if (!activeAfter) {
|
|
104
|
+
lines.push("No active account remaining");
|
|
105
|
+
return lines;
|
|
106
|
+
}
|
|
107
|
+
lines.push(`Active account unchanged: ${formatAccountLabel(activeAfter)}`);
|
|
108
|
+
return lines;
|
|
109
|
+
}
|
|
110
|
+
export async function runAuthLogoutFlow(options) {
|
|
111
|
+
const { oauthService, store, io, forceAll = false } = options;
|
|
112
|
+
const accounts = await oauthService.listAccounts();
|
|
113
|
+
if (accounts.length === 0) {
|
|
114
|
+
return ["No accounts registered"];
|
|
115
|
+
}
|
|
116
|
+
if (forceAll) {
|
|
117
|
+
await oauthService.logoutAll();
|
|
118
|
+
return ["All OAuth accounts cleared"];
|
|
119
|
+
}
|
|
120
|
+
if (!io.isTTY) {
|
|
121
|
+
return logoutActiveAndDescribe(oauthService, store);
|
|
122
|
+
}
|
|
123
|
+
const active = await store.getActiveAccount();
|
|
124
|
+
const items = buildMenuItems(accounts);
|
|
125
|
+
let state = {
|
|
126
|
+
kind: "main",
|
|
127
|
+
index: initialMainIndex(accounts, active?.id)
|
|
128
|
+
};
|
|
129
|
+
while (true) {
|
|
130
|
+
io.clear();
|
|
131
|
+
if (state.kind === "main") {
|
|
132
|
+
io.write(`${renderMainScreen(items, state.index, active?.id)}\n`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
io.write(`${renderConfirmAllScreen(state.index)}\n`);
|
|
136
|
+
}
|
|
137
|
+
const key = await io.readKey();
|
|
138
|
+
if (state.kind === "main") {
|
|
139
|
+
if (key === "up") {
|
|
140
|
+
state = { kind: "main", index: moveIndex(state.index, -1, items.length) };
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (key === "down") {
|
|
144
|
+
state = { kind: "main", index: moveIndex(state.index, 1, items.length) };
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (key === "cancel") {
|
|
148
|
+
return ["Logout cancelled"];
|
|
149
|
+
}
|
|
150
|
+
const selected = items[state.index];
|
|
151
|
+
if (!selected || selected.kind === "cancel") {
|
|
152
|
+
return ["Logout cancelled"];
|
|
153
|
+
}
|
|
154
|
+
if (selected.kind === "all") {
|
|
155
|
+
state = { kind: "confirmAll", index: 0 };
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
return logoutSpecificAndDescribe(oauthService, store, selected.account);
|
|
159
|
+
}
|
|
160
|
+
if (key === "up") {
|
|
161
|
+
state = { kind: "confirmAll", index: moveIndex(state.index, -1, 2) };
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (key === "down") {
|
|
165
|
+
state = { kind: "confirmAll", index: moveIndex(state.index, 1, 2) };
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (key === "cancel") {
|
|
169
|
+
return ["Logout cancelled"];
|
|
170
|
+
}
|
|
171
|
+
if (state.index === 1) {
|
|
172
|
+
await oauthService.logoutAll();
|
|
173
|
+
return ["All OAuth accounts cleared"];
|
|
174
|
+
}
|
|
175
|
+
return ["Logout cancelled"];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=auth-logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logout.js","sourceRoot":"","sources":["../../src/commands/auth-logout.ts"],"names":[],"mappings":"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"}
|
package/dist/config/env.d.ts
CHANGED
package/dist/config/env.js
CHANGED
|
@@ -3,10 +3,11 @@ import { join } from "node:path";
|
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
const schema = z.object({
|
|
5
5
|
GEMINI_CLI_API_HOST: z.string().default("127.0.0.1"),
|
|
6
|
-
GEMINI_CLI_API_PORT: z.coerce.number().int().min(1).max(65535).default(
|
|
6
|
+
GEMINI_CLI_API_PORT: z.coerce.number().int().min(1).max(65535).default(43173),
|
|
7
7
|
GEMINI_CLI_MODEL: z.string().default("gemini-2.5-pro"),
|
|
8
8
|
CODE_ASSIST_ENDPOINT: z.string().url().default("https://cloudcode-pa.googleapis.com"),
|
|
9
9
|
CODE_ASSIST_API_VERSION: z.string().default("v1internal"),
|
|
10
|
+
GEMINI_CLI_API_ACCOUNTS_PATH: z.string().default(join(homedir(), ".geminimock", "accounts.json")),
|
|
10
11
|
GEMINI_CLI_API_OAUTH_PATH: z.string().default(join(homedir(), ".geminimock", "oauth_creds.json")),
|
|
11
12
|
GEMINI_CLI_OAUTH_FALLBACK_PATH: z.string().default(join(homedir(), ".gemini", "oauth_creds.json")),
|
|
12
13
|
GOOGLE_CLOUD_PROJECT: z.string().optional(),
|
|
@@ -20,6 +21,7 @@ export function loadEnv(source = process.env) {
|
|
|
20
21
|
defaultModel: parsed.GEMINI_CLI_MODEL,
|
|
21
22
|
codeAssistEndpoint: parsed.CODE_ASSIST_ENDPOINT,
|
|
22
23
|
codeAssistApiVersion: parsed.CODE_ASSIST_API_VERSION,
|
|
24
|
+
accountsPath: parsed.GEMINI_CLI_API_ACCOUNTS_PATH,
|
|
23
25
|
oauthPath: parsed.GEMINI_CLI_API_OAUTH_PATH,
|
|
24
26
|
oauthFallbackPath: parsed.GEMINI_CLI_OAUTH_FALLBACK_PATH,
|
|
25
27
|
projectId: parsed.GOOGLE_CLOUD_PROJECT ?? parsed.GOOGLE_CLOUD_PROJECT_ID
|
package/dist/config/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACpD,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACpD,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7E,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACtD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;IACrF,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IACzD,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACjG,yBAAyB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;IACjG,8BAA8B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAClG,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3C,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAcH,MAAM,UAAU,OAAO,CAAC,SAAiE,OAAO,CAAC,GAAG;IAClG,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,mBAAmB;QAChC,IAAI,EAAE,MAAM,CAAC,mBAAmB;QAChC,YAAY,EAAE,MAAM,CAAC,gBAAgB;QACrC,kBAAkB,EAAE,MAAM,CAAC,oBAAoB;QAC/C,oBAAoB,EAAE,MAAM,CAAC,uBAAuB;QACpD,YAAY,EAAE,MAAM,CAAC,4BAA4B;QACjD,SAAS,EAAE,MAAM,CAAC,yBAAyB;QAC3C,iBAAiB,EAAE,MAAM,CAAC,8BAA8B;QACxD,SAAS,EAAE,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,uBAAuB;KACzE,CAAC;AACJ,CAAC"}
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import type { AppEnv } from "../config/env.js";
|
|
2
2
|
import type { CAGenerateContentRequest, CaGenerateContentResponse, LoadCodeAssistResponse, LongRunningOperationResponse, OnboardUserRequest, RetrieveUserQuotaResponse } from "./types.js";
|
|
3
|
+
import { CodeAssistApiError } from "./errors.js";
|
|
3
4
|
export declare class CodeAssistClient {
|
|
4
5
|
private readonly env;
|
|
5
6
|
private readonly getAccessToken;
|
|
7
|
+
private readonly hooks;
|
|
6
8
|
private projectCache?;
|
|
7
|
-
|
|
9
|
+
private projectCacheAccountKey?;
|
|
10
|
+
constructor(env: AppEnv, getAccessToken: () => Promise<string>, hooks?: {
|
|
11
|
+
onApiError?: (error: CodeAssistApiError) => Promise<boolean>;
|
|
12
|
+
onApiSuccess?: () => Promise<void>;
|
|
13
|
+
maxAttempts?: () => number | Promise<number>;
|
|
14
|
+
getAccountCacheKey?: () => string | undefined | Promise<string | undefined>;
|
|
15
|
+
});
|
|
16
|
+
private resolveAccountCacheKey;
|
|
17
|
+
private refreshCacheContext;
|
|
18
|
+
private invalidateProjectCache;
|
|
19
|
+
private resolveAttempts;
|
|
20
|
+
private withJsonRetry;
|
|
21
|
+
private withStreamRetry;
|
|
8
22
|
private buildUrl;
|
|
9
23
|
private postJson;
|
|
10
24
|
loadCodeAssist(projectId?: string): Promise<LoadCodeAssistResponse>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CodeAssistApiError, parseRetryAfterMs } from "./errors.js";
|
|
1
2
|
function platformToCode() {
|
|
2
3
|
const p = process.platform;
|
|
3
4
|
const a = process.arch;
|
|
@@ -50,10 +51,76 @@ async function* parseSseStream(stream) {
|
|
|
50
51
|
export class CodeAssistClient {
|
|
51
52
|
env;
|
|
52
53
|
getAccessToken;
|
|
54
|
+
hooks;
|
|
53
55
|
projectCache;
|
|
54
|
-
|
|
56
|
+
projectCacheAccountKey;
|
|
57
|
+
constructor(env, getAccessToken, hooks = {}) {
|
|
55
58
|
this.env = env;
|
|
56
59
|
this.getAccessToken = getAccessToken;
|
|
60
|
+
this.hooks = hooks;
|
|
61
|
+
}
|
|
62
|
+
async resolveAccountCacheKey() {
|
|
63
|
+
const key = this.hooks.getAccountCacheKey ? await this.hooks.getAccountCacheKey() : undefined;
|
|
64
|
+
return key ?? undefined;
|
|
65
|
+
}
|
|
66
|
+
async refreshCacheContext() {
|
|
67
|
+
const accountKey = await this.resolveAccountCacheKey();
|
|
68
|
+
if (accountKey !== this.projectCacheAccountKey) {
|
|
69
|
+
this.projectCache = undefined;
|
|
70
|
+
this.projectCacheAccountKey = accountKey;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async invalidateProjectCache() {
|
|
74
|
+
this.projectCache = undefined;
|
|
75
|
+
this.projectCacheAccountKey = await this.resolveAccountCacheKey();
|
|
76
|
+
}
|
|
77
|
+
async resolveAttempts() {
|
|
78
|
+
const candidate = this.hooks.maxAttempts ? await this.hooks.maxAttempts() : 1;
|
|
79
|
+
if (!Number.isFinite(candidate) || candidate < 1) {
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
82
|
+
return Math.floor(candidate);
|
|
83
|
+
}
|
|
84
|
+
async withJsonRetry(method, execute, onRetry) {
|
|
85
|
+
const attempts = await this.resolveAttempts();
|
|
86
|
+
for (let attempt = 1; attempt <= attempts; attempt += 1) {
|
|
87
|
+
const token = await this.getAccessToken();
|
|
88
|
+
const response = await execute(token);
|
|
89
|
+
if (response.ok) {
|
|
90
|
+
const payload = (await response.json());
|
|
91
|
+
await this.hooks.onApiSuccess?.();
|
|
92
|
+
return payload;
|
|
93
|
+
}
|
|
94
|
+
const body = await response.text();
|
|
95
|
+
const error = new CodeAssistApiError(method, response.status, body, parseRetryAfterMs(response.headers.get("retry-after")));
|
|
96
|
+
const canRetry = attempt < attempts && await this.hooks.onApiError?.(error);
|
|
97
|
+
if (!canRetry) {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
await this.invalidateProjectCache();
|
|
101
|
+
await onRetry?.();
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Code Assist ${method} failed`);
|
|
104
|
+
}
|
|
105
|
+
async withStreamRetry(method, execute, onRetry) {
|
|
106
|
+
const attempts = await this.resolveAttempts();
|
|
107
|
+
for (let attempt = 1; attempt <= attempts; attempt += 1) {
|
|
108
|
+
const token = await this.getAccessToken();
|
|
109
|
+
const response = await execute(token);
|
|
110
|
+
if (response.ok) {
|
|
111
|
+
await this.hooks.onApiSuccess?.();
|
|
112
|
+
return response;
|
|
113
|
+
}
|
|
114
|
+
const body = await response.text();
|
|
115
|
+
const error = new CodeAssistApiError(method, response.status, body, parseRetryAfterMs(response.headers.get("retry-after")));
|
|
116
|
+
const canRetry = attempt < attempts && await this.hooks.onApiError?.(error);
|
|
117
|
+
if (!canRetry) {
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
await this.invalidateProjectCache();
|
|
121
|
+
await onRetry?.();
|
|
122
|
+
}
|
|
123
|
+
throw new Error(`Code Assist ${method} failed`);
|
|
57
124
|
}
|
|
58
125
|
buildUrl(method, query) {
|
|
59
126
|
const base = `${this.env.codeAssistEndpoint}/${this.env.codeAssistApiVersion}:${method}`;
|
|
@@ -63,20 +130,21 @@ export class CodeAssistClient {
|
|
|
63
130
|
return `${base}?${query.toString()}`;
|
|
64
131
|
}
|
|
65
132
|
async postJson(method, body, query) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
133
|
+
return this.withJsonRetry(method, async (token) => {
|
|
134
|
+
return fetch(this.buildUrl(method, query), {
|
|
135
|
+
method: "POST",
|
|
136
|
+
headers: {
|
|
137
|
+
"Content-Type": "application/json",
|
|
138
|
+
Authorization: `Bearer ${token}`
|
|
139
|
+
},
|
|
140
|
+
body: JSON.stringify(body)
|
|
141
|
+
});
|
|
142
|
+
}, async () => {
|
|
143
|
+
if (method === "generateContent") {
|
|
144
|
+
const payload = body;
|
|
145
|
+
payload.project = await this.resolveProjectId();
|
|
146
|
+
}
|
|
74
147
|
});
|
|
75
|
-
if (!response.ok) {
|
|
76
|
-
const text = await response.text();
|
|
77
|
-
throw new Error(`Code Assist ${method} failed (${response.status}): ${text}`);
|
|
78
|
-
}
|
|
79
|
-
return (await response.json());
|
|
80
148
|
}
|
|
81
149
|
async loadCodeAssist(projectId) {
|
|
82
150
|
const request = {
|
|
@@ -92,20 +160,17 @@ export class CodeAssistClient {
|
|
|
92
160
|
return this.postJson("retrieveUserQuota", { project: projectId });
|
|
93
161
|
}
|
|
94
162
|
async getOperation(name) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
163
|
+
return this.withJsonRetry("operation", async (token) => {
|
|
164
|
+
return fetch(`${this.env.codeAssistEndpoint}/${this.env.codeAssistApiVersion}/${name}`, {
|
|
165
|
+
method: "GET",
|
|
166
|
+
headers: {
|
|
167
|
+
Authorization: `Bearer ${token}`
|
|
168
|
+
}
|
|
169
|
+
});
|
|
101
170
|
});
|
|
102
|
-
if (!response.ok) {
|
|
103
|
-
const text = await response.text();
|
|
104
|
-
throw new Error(`Code Assist operation failed (${response.status}): ${text}`);
|
|
105
|
-
}
|
|
106
|
-
return (await response.json());
|
|
107
171
|
}
|
|
108
172
|
async resolveProjectId() {
|
|
173
|
+
await this.refreshCacheContext();
|
|
109
174
|
if (this.projectCache) {
|
|
110
175
|
return this.projectCache;
|
|
111
176
|
}
|
|
@@ -153,20 +218,19 @@ export class CodeAssistClient {
|
|
|
153
218
|
return this.postJson("generateContent", request);
|
|
154
219
|
}
|
|
155
220
|
async *streamGenerateContent(request) {
|
|
156
|
-
const token = await this.getAccessToken();
|
|
157
221
|
const query = new URLSearchParams({ alt: "sse" });
|
|
158
|
-
const response = await
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
222
|
+
const response = await this.withStreamRetry("streamGenerateContent", async (token) => {
|
|
223
|
+
return fetch(this.buildUrl("streamGenerateContent", query), {
|
|
224
|
+
method: "POST",
|
|
225
|
+
headers: {
|
|
226
|
+
"Content-Type": "application/json",
|
|
227
|
+
Authorization: `Bearer ${token}`
|
|
228
|
+
},
|
|
229
|
+
body: JSON.stringify(request)
|
|
230
|
+
});
|
|
231
|
+
}, async () => {
|
|
232
|
+
request.project = await this.resolveProjectId();
|
|
165
233
|
});
|
|
166
|
-
if (!response.ok) {
|
|
167
|
-
const text = await response.text();
|
|
168
|
-
throw new Error(`Code Assist streamGenerateContent failed (${response.status}): ${text}`);
|
|
169
|
-
}
|
|
170
234
|
if (!response.body) {
|
|
171
235
|
throw new Error("Empty stream body");
|
|
172
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-assist-client.js","sourceRoot":"","sources":["../../src/gemini/code-assist-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"code-assist-client.js","sourceRoot":"","sources":["../../src/gemini/code-assist-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class CodeAssistApiError extends Error {
|
|
2
|
+
readonly method: string;
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly body: string;
|
|
5
|
+
readonly retryAfterMs?: number | undefined;
|
|
6
|
+
constructor(method: string, status: number, body: string, retryAfterMs?: number | undefined);
|
|
7
|
+
}
|
|
8
|
+
export declare function parseRetryAfterMs(retryAfter: string | null): number | undefined;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class CodeAssistApiError extends Error {
|
|
2
|
+
method;
|
|
3
|
+
status;
|
|
4
|
+
body;
|
|
5
|
+
retryAfterMs;
|
|
6
|
+
constructor(method, status, body, retryAfterMs) {
|
|
7
|
+
super(`Code Assist ${method} failed (${status}): ${body}`);
|
|
8
|
+
this.method = method;
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.body = body;
|
|
11
|
+
this.retryAfterMs = retryAfterMs;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function parseRetryAfterMs(retryAfter) {
|
|
15
|
+
if (!retryAfter) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const asSeconds = Number.parseInt(retryAfter, 10);
|
|
19
|
+
if (Number.isFinite(asSeconds) && asSeconds >= 0) {
|
|
20
|
+
return asSeconds * 1000;
|
|
21
|
+
}
|
|
22
|
+
const asDate = Date.parse(retryAfter);
|
|
23
|
+
if (!Number.isFinite(asDate)) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const delta = asDate - Date.now();
|
|
27
|
+
return delta > 0 ? delta : undefined;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/gemini/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IACA;IACA;IACA;IAJlB,YACkB,MAAc,EACd,MAAc,EACd,IAAY,EACZ,YAAqB;QAErC,KAAK,CAAC,eAAe,MAAM,YAAY,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QAL3C,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QACZ,iBAAY,GAAZ,YAAY,CAAS;IAGvC,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAyB;IACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC"}
|
package/dist/server/app.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Fastify from "fastify";
|
|
2
2
|
import cors from "@fastify/cors";
|
|
3
3
|
import { ZodError } from "zod";
|
|
4
|
-
import {
|
|
4
|
+
import { createAccountStore } from "../auth/account-store.js";
|
|
5
5
|
import { OAuthService } from "../auth/oauth-service.js";
|
|
6
6
|
import { loadEnv } from "../config/env.js";
|
|
7
7
|
import { CodeAssistClient } from "../gemini/code-assist-client.js";
|
|
@@ -10,9 +10,14 @@ import { OpenAIChatService } from "../openai/chat-service.js";
|
|
|
10
10
|
import { toOpenAIModelList } from "../openai/models-response.js";
|
|
11
11
|
import { openAIChatCompletionRequestSchema } from "../openai/types.js";
|
|
12
12
|
export async function createDefaultDependencies(env = loadEnv()) {
|
|
13
|
-
const store =
|
|
13
|
+
const store = createAccountStore(env.accountsPath, env.oauthPath, env.oauthFallbackPath);
|
|
14
14
|
const oauthService = new OAuthService(store);
|
|
15
|
-
const codeAssistClient = new CodeAssistClient(env, () => oauthService.getAccessToken()
|
|
15
|
+
const codeAssistClient = new CodeAssistClient(env, () => oauthService.getAccessToken(), {
|
|
16
|
+
onApiError: (error) => oauthService.handleCodeAssistError(error),
|
|
17
|
+
onApiSuccess: () => oauthService.handleCodeAssistSuccess(),
|
|
18
|
+
maxAttempts: () => oauthService.getApiAttemptLimit(),
|
|
19
|
+
getAccountCacheKey: () => oauthService.getActiveAccountId()
|
|
20
|
+
});
|
|
16
21
|
const modelCatalogService = new ModelCatalogService(codeAssistClient);
|
|
17
22
|
const chatService = new OpenAIChatService(env.defaultModel, codeAssistClient, modelCatalogService);
|
|
18
23
|
return { env, oauthService, chatService, modelCatalogService };
|
package/dist/server/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type AppEnv } from "../config/env.js";
|
|
2
|
+
type FileOps = {
|
|
3
|
+
mkdir(path: string): Promise<void>;
|
|
4
|
+
readFile(path: string): Promise<string>;
|
|
5
|
+
writeFile(path: string, data: string): Promise<void>;
|
|
6
|
+
rm(path: string): Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
type BackgroundServiceDeps = {
|
|
9
|
+
fileOps?: FileOps;
|
|
10
|
+
loadEnv?: () => AppEnv;
|
|
11
|
+
execPath?: string;
|
|
12
|
+
entryPath?: string;
|
|
13
|
+
stateDir?: string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
spawnProcess?: (command: string, args: string[], logPath: string, env: NodeJS.ProcessEnv) => number;
|
|
16
|
+
isProcessAlive?: (pid: number) => boolean;
|
|
17
|
+
killProcess?: (pid: number, signal?: NodeJS.Signals) => void;
|
|
18
|
+
fetchFn?: typeof fetch;
|
|
19
|
+
wait?: (ms: number) => Promise<void>;
|
|
20
|
+
resolveAvailablePort?: (host: string, preferredPort: number) => Promise<number>;
|
|
21
|
+
};
|
|
22
|
+
export type BackgroundStartResult = {
|
|
23
|
+
alreadyRunning: boolean;
|
|
24
|
+
pid?: number;
|
|
25
|
+
port: number;
|
|
26
|
+
url: string;
|
|
27
|
+
logPath: string;
|
|
28
|
+
};
|
|
29
|
+
export type BackgroundStatusResult = {
|
|
30
|
+
running: boolean;
|
|
31
|
+
pid?: number;
|
|
32
|
+
port: number;
|
|
33
|
+
url: string;
|
|
34
|
+
logPath: string;
|
|
35
|
+
};
|
|
36
|
+
export type BackgroundStopResult = {
|
|
37
|
+
stopped: boolean;
|
|
38
|
+
pid?: number;
|
|
39
|
+
unmanagedRunning?: boolean;
|
|
40
|
+
};
|
|
41
|
+
export declare function createBackgroundServiceManager(deps?: BackgroundServiceDeps): {
|
|
42
|
+
start: () => Promise<BackgroundStartResult>;
|
|
43
|
+
stop: () => Promise<BackgroundStopResult>;
|
|
44
|
+
status: () => Promise<BackgroundStatusResult>;
|
|
45
|
+
};
|
|
46
|
+
export {};
|