@pixelbyte-software/pixcode 1.47.3 → 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-DD3hAStI.js → index-DfqcgNYJ.js} +141 -140
- package/dist/assets/index-ak1p_4ew.js +11 -0
- package/dist/assets/{vendor-codemirror-CzYAOTxS.js → vendor-codemirror-CzSp4P1a.js} +1 -1
- package/dist/assets/{vendor-react-D7WwDXvu.js → vendor-react-DB6V5Fl1.js} +9 -9
- package/dist/index.html +3 -3
- 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 +3 -1
- package/scripts/smoke/code-editor-vscode-engine.mjs +60 -0
- 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,9 +35,9 @@
|
|
|
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-
|
|
39
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-react-
|
|
40
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-codemirror-
|
|
38
|
+
<script type="module" crossorigin src="/assets/index-DfqcgNYJ.js"></script>
|
|
39
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-react-DB6V5Fl1.js">
|
|
40
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-codemirror-CzSp4P1a.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/vendor-xterm-CJZjLICi.js">
|
|
42
42
|
<link rel="stylesheet" crossorigin href="/assets/index-BBdWwJi6.css">
|
|
43
43
|
</head>
|
|
@@ -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",
|
|
@@ -145,6 +145,7 @@
|
|
|
145
145
|
"@commitlint/config-conventional": "^20.5.0",
|
|
146
146
|
"@eslint/js": "^9.39.3",
|
|
147
147
|
"@heroicons/react": "^2.2.0",
|
|
148
|
+
"@monaco-editor/react": "^4.7.0",
|
|
148
149
|
"@release-it/conventional-changelog": "^10.0.5",
|
|
149
150
|
"@replit/codemirror-minimap": "^0.5.2",
|
|
150
151
|
"@tailwindcss/typography": "^0.5.16",
|
|
@@ -186,6 +187,7 @@
|
|
|
186
187
|
"katex": "^0.16.25",
|
|
187
188
|
"lint-staged": "^16.3.2",
|
|
188
189
|
"lucide-react": "^0.515.0",
|
|
190
|
+
"monaco-editor": "^0.55.1",
|
|
189
191
|
"node-gyp": "^12.0.0",
|
|
190
192
|
"postcss": "^8.4.32",
|
|
191
193
|
"qrcode": "^1.5.4",
|
|
@@ -0,0 +1,60 @@
|
|
|
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 packageJson = JSON.parse(read('package.json'));
|
|
7
|
+
const surface = read('src/components/code-editor/view/subcomponents/CodeEditorSurface.tsx');
|
|
8
|
+
const editor = read('src/components/code-editor/view/CodeEditor.tsx');
|
|
9
|
+
|
|
10
|
+
const allDeps = {
|
|
11
|
+
...(packageJson.dependencies ?? {}),
|
|
12
|
+
...(packageJson.devDependencies ?? {}),
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
assert.ok(allDeps['@monaco-editor/react'], 'Code editor should depend on the React Monaco wrapper.');
|
|
16
|
+
assert.ok(allDeps['monaco-editor'], 'Code editor should depend on the Monaco editor engine.');
|
|
17
|
+
|
|
18
|
+
assert.match(
|
|
19
|
+
surface,
|
|
20
|
+
/const MonacoEditor = lazy[\s\S]*import\(['"]@monaco-editor\/react['"]\)/,
|
|
21
|
+
'Normal file editing should lazy-load Monaco instead of keeping a CodeMirror-only surface.',
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
assert.match(
|
|
25
|
+
surface,
|
|
26
|
+
/onMount=\{handleMonacoMount\}/,
|
|
27
|
+
'Monaco should expose an onMount hook so Pixcode can wire VS Code-style key commands.',
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
assert.match(
|
|
31
|
+
surface,
|
|
32
|
+
/KeyMod\.CtrlCmd\s*\|\s*KeyCode\.KeyS/,
|
|
33
|
+
'Monaco should handle Ctrl/Cmd+S with the native editor command system.',
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
assert.match(
|
|
37
|
+
surface,
|
|
38
|
+
/selectOnLineNumbers:\s*true/,
|
|
39
|
+
'Monaco should support line-number click selection like VS Code.',
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
assert.match(
|
|
43
|
+
surface,
|
|
44
|
+
/automaticLayout:\s*true/,
|
|
45
|
+
'Monaco should relayout cleanly inside resizable workbench panes.',
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
assert.match(
|
|
49
|
+
editor,
|
|
50
|
+
/const useMonacoEditor = !\(/,
|
|
51
|
+
'CodeEditor should keep the existing CodeMirror diff fallback while using Monaco for regular files.',
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
assert.match(
|
|
55
|
+
editor,
|
|
56
|
+
/useMonacoEditor=\{useMonacoEditor\}/,
|
|
57
|
+
'CodeEditor should pass the Monaco-vs-diff decision into the editor surface.',
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
console.log('code editor VS Code engine smoke passed');
|
|
@@ -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
|
|