@pixelbyte-software/pixcode 1.47.4 → 1.47.5
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/dist/assets/{index-C7zmMv0b.js → index-DfqcgNYJ.js} +156 -156
- package/dist/index.html +1 -1
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +9 -1
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -1
- package/package.json +1 -1
- package/scripts/smoke/provider-selection-status.mjs +52 -0
- package/server/modules/providers/list/gemini/gemini-auth.provider.ts +10 -1
package/dist/index.html
CHANGED
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
<!-- Prevent zoom on iOS -->
|
|
37
37
|
<meta name="format-detection" content="telephone=no" />
|
|
38
|
-
<script type="module" crossorigin src="/assets/index-
|
|
38
|
+
<script type="module" crossorigin src="/assets/index-DfqcgNYJ.js"></script>
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-DB6V5Fl1.js">
|
|
40
40
|
<link rel="modulepreload" crossorigin href="/assets/vendor-codemirror-CzSp4P1a.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/vendor-xterm-CJZjLICi.js">
|
|
@@ -6,6 +6,7 @@ import spawn from 'cross-spawn';
|
|
|
6
6
|
import { readObjectRecord, readOptionalString } from '../../../../shared/utils.js';
|
|
7
7
|
// @ts-ignore — plain-JS module
|
|
8
8
|
import { getProviderCredentials } from '../../../../services/provider-credentials.js';
|
|
9
|
+
const GEMINI_TOKEN_INFO_TIMEOUT_MS = 5_000;
|
|
9
10
|
export class GeminiProviderAuth {
|
|
10
11
|
/**
|
|
11
12
|
* Checks whether the Gemini CLI is available on this host.
|
|
@@ -110,8 +111,12 @@ export class GeminiProviderAuth {
|
|
|
110
111
|
* Validates a Gemini OAuth access token and returns an email when Google reports one.
|
|
111
112
|
*/
|
|
112
113
|
async getTokenInfoEmail(accessToken) {
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
const timeout = setTimeout(() => controller.abort(), GEMINI_TOKEN_INFO_TIMEOUT_MS);
|
|
113
116
|
try {
|
|
114
|
-
const tokenRes = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${accessToken}
|
|
117
|
+
const tokenRes = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${accessToken}`, {
|
|
118
|
+
signal: controller.signal,
|
|
119
|
+
});
|
|
115
120
|
if (!tokenRes.ok) {
|
|
116
121
|
return { valid: false, email: null };
|
|
117
122
|
}
|
|
@@ -124,6 +129,9 @@ export class GeminiProviderAuth {
|
|
|
124
129
|
catch {
|
|
125
130
|
return { valid: false, email: null };
|
|
126
131
|
}
|
|
132
|
+
finally {
|
|
133
|
+
clearTimeout(timeout);
|
|
134
|
+
}
|
|
127
135
|
}
|
|
128
136
|
/**
|
|
129
137
|
* Reads Gemini's active local Google account as an offline fallback for display.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-auth.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/gemini/gemini-auth.provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gemini-auth.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/gemini/gemini-auth.provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixelbyte-software/pixcode",
|
|
3
|
-
"version": "1.47.
|
|
3
|
+
"version": "1.47.5",
|
|
4
4
|
"description": "Self-hosted AI coding agent control room for Claude Code, Cursor CLI, OpenAI Codex, Gemini CLI, Qwen Code, and OpenCode with chat, files, shell, Git, orchestration, API keys, Telegram, MCP, plugins, themes, and desktop/server deployment.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist-server/server/index.js",
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
|
|
4
|
+
const read = (path) => fs.readFileSync(path, 'utf8');
|
|
5
|
+
|
|
6
|
+
const providerPicker = read('src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx');
|
|
7
|
+
const providerStatusHook = read('src/components/provider-auth/hooks/useProviderAuthStatus.ts');
|
|
8
|
+
const geminiAuth = read('server/modules/providers/list/gemini/gemini-auth.provider.ts');
|
|
9
|
+
|
|
10
|
+
assert.match(
|
|
11
|
+
providerPicker,
|
|
12
|
+
/const isChecking = !status \|\| status\.loading;/,
|
|
13
|
+
'Provider cards should only show Checking while a request is actually loading.',
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
assert.doesNotMatch(
|
|
17
|
+
providerPicker,
|
|
18
|
+
/const isUnknown = !status \|\| status\.loading \|\| status\.installed === null;/,
|
|
19
|
+
'Completed unknown/error provider status must not be rendered as Checking forever.',
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
assert.match(
|
|
23
|
+
providerPicker,
|
|
24
|
+
/providerSelection\.statusUnavailable/,
|
|
25
|
+
'Provider cards should render a user-facing unavailable state after status errors.',
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
assert.match(
|
|
29
|
+
providerStatusHook,
|
|
30
|
+
/PROVIDER_AUTH_STATUS_TIMEOUT_MS/,
|
|
31
|
+
'Provider auth status requests should have a frontend timeout.',
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
assert.match(
|
|
35
|
+
providerStatusHook,
|
|
36
|
+
/AbortController/,
|
|
37
|
+
'Provider auth status fetches should abort instead of leaving cards loading forever.',
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
assert.match(
|
|
41
|
+
geminiAuth,
|
|
42
|
+
/GEMINI_TOKEN_INFO_TIMEOUT_MS/,
|
|
43
|
+
'Gemini tokeninfo lookup should have a backend timeout.',
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
assert.match(
|
|
47
|
+
geminiAuth,
|
|
48
|
+
/signal: controller\.signal/,
|
|
49
|
+
'Gemini tokeninfo fetch should use an abort signal.',
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
console.log('provider selection status smoke passed');
|
|
@@ -19,6 +19,8 @@ type GeminiCredentialsStatus = {
|
|
|
19
19
|
error?: string;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
const GEMINI_TOKEN_INFO_TIMEOUT_MS = 5_000;
|
|
23
|
+
|
|
22
24
|
export class GeminiProviderAuth implements IProviderAuth {
|
|
23
25
|
/**
|
|
24
26
|
* Checks whether the Gemini CLI is available on this host.
|
|
@@ -132,8 +134,13 @@ export class GeminiProviderAuth implements IProviderAuth {
|
|
|
132
134
|
* Validates a Gemini OAuth access token and returns an email when Google reports one.
|
|
133
135
|
*/
|
|
134
136
|
private async getTokenInfoEmail(accessToken: string): Promise<{ valid: boolean; email: string | null }> {
|
|
137
|
+
const controller = new AbortController();
|
|
138
|
+
const timeout = setTimeout(() => controller.abort(), GEMINI_TOKEN_INFO_TIMEOUT_MS);
|
|
139
|
+
|
|
135
140
|
try {
|
|
136
|
-
const tokenRes = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${accessToken}
|
|
141
|
+
const tokenRes = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${accessToken}`, {
|
|
142
|
+
signal: controller.signal,
|
|
143
|
+
});
|
|
137
144
|
if (!tokenRes.ok) {
|
|
138
145
|
return { valid: false, email: null };
|
|
139
146
|
}
|
|
@@ -145,6 +152,8 @@ export class GeminiProviderAuth implements IProviderAuth {
|
|
|
145
152
|
};
|
|
146
153
|
} catch {
|
|
147
154
|
return { valid: false, email: null };
|
|
155
|
+
} finally {
|
|
156
|
+
clearTimeout(timeout);
|
|
148
157
|
}
|
|
149
158
|
}
|
|
150
159
|
|