@pixelbyte-software/pixcode 1.30.2 → 1.31.1
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/LICENSE +718 -718
- package/README.de.md +248 -248
- package/README.ja.md +240 -240
- package/README.ko.md +240 -240
- package/README.md +295 -285
- package/README.ru.md +248 -248
- package/README.tr.md +250 -250
- package/README.zh-CN.md +240 -240
- package/dist/api-docs.html +879 -879
- package/dist/assets/index-BtOeB3cE.js +837 -0
- package/dist/assets/index-CDpePeIN.css +32 -0
- package/dist/assets/vendor-codemirror-CzYAOTxS.js +41 -0
- package/dist/clear-cache.html +85 -85
- package/dist/convert-icons.md +52 -52
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +7 -8
- package/dist/generate-icons.js +48 -48
- package/dist/icons/codex-white.svg +3 -3
- package/dist/icons/codex.svg +3 -3
- package/dist/icons/cursor-white.svg +11 -11
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-128x128.svg +9 -12
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-144x144.svg +9 -12
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-152x152.svg +9 -12
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-192x192.svg +9 -12
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-384x384.svg +9 -12
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-512x512.svg +9 -12
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-72x72.svg +9 -12
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/icons/icon-96x96.svg +9 -12
- package/dist/icons/icon-template.svg +9 -12
- package/dist/icons/qwen-ai-icon.png +0 -0
- package/dist/index.html +60 -50
- package/dist/logo.png +0 -0
- package/dist/logo.svg +11 -16
- package/dist/manifest.json +60 -60
- package/dist/sw.js +124 -124
- package/dist-server/server/claude-sdk.js +28 -5
- package/dist-server/server/claude-sdk.js.map +1 -1
- package/dist-server/server/cli.js +100 -97
- package/dist-server/server/cli.js.map +1 -1
- package/dist-server/server/daemon/manager.js +33 -33
- package/dist-server/server/daemon-manager.js +62 -62
- package/dist-server/server/database/db.js +114 -22
- package/dist-server/server/database/db.js.map +1 -1
- package/dist-server/server/database/schema.js +122 -89
- package/dist-server/server/database/schema.js.map +1 -1
- package/dist-server/server/gemini-cli.js +6 -1
- package/dist-server/server/gemini-cli.js.map +1 -1
- package/dist-server/server/index.js +346 -61
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +29 -2
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +22 -2
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +2 -2
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +14 -2
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/qwen/qwen-auth.provider.js +132 -0
- package/dist-server/server/modules/providers/list/qwen/qwen-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/qwen/qwen-mcp.provider.js +87 -0
- package/dist-server/server/modules/providers/list/qwen/qwen-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/qwen/qwen-sessions.provider.js +201 -0
- package/dist-server/server/modules/providers/list/qwen/qwen-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/qwen/qwen.provider.js +19 -0
- package/dist-server/server/modules/providers/list/qwen/qwen.provider.js.map +1 -0
- package/dist-server/server/modules/providers/provider.registry.js +2 -0
- package/dist-server/server/modules/providers/provider.registry.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +478 -1
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/shared/provider-configs.js +105 -0
- package/dist-server/server/modules/providers/shared/provider-configs.js.map +1 -0
- package/dist-server/server/projects.js +197 -6
- package/dist-server/server/projects.js.map +1 -1
- package/dist-server/server/qwen-code-cli.js +350 -0
- package/dist-server/server/qwen-code-cli.js.map +1 -0
- package/dist-server/server/qwen-response-handler.js +70 -0
- package/dist-server/server/qwen-response-handler.js.map +1 -0
- package/dist-server/server/routes/commands.js +25 -25
- package/dist-server/server/routes/git.js +17 -17
- package/dist-server/server/routes/network.js +116 -0
- package/dist-server/server/routes/network.js.map +1 -0
- package/dist-server/server/routes/projects.js +166 -1
- package/dist-server/server/routes/projects.js.map +1 -1
- package/dist-server/server/routes/qwen.js +23 -0
- package/dist-server/server/routes/qwen.js.map +1 -0
- package/dist-server/server/routes/taskmaster.js +419 -419
- package/dist-server/server/routes/telegram.js +119 -0
- package/dist-server/server/routes/telegram.js.map +1 -0
- package/dist-server/server/services/external-access.js +228 -0
- package/dist-server/server/services/external-access.js.map +1 -0
- package/dist-server/server/services/install-jobs.js +552 -0
- package/dist-server/server/services/install-jobs.js.map +1 -0
- package/dist-server/server/services/notification-orchestrator.js +19 -5
- package/dist-server/server/services/notification-orchestrator.js.map +1 -1
- package/dist-server/server/services/provider-credentials.js +154 -0
- package/dist-server/server/services/provider-credentials.js.map +1 -0
- package/dist-server/server/services/provider-models.js +218 -0
- package/dist-server/server/services/provider-models.js.map +1 -0
- package/dist-server/server/services/telegram/bot.js +259 -0
- package/dist-server/server/services/telegram/bot.js.map +1 -0
- package/dist-server/server/services/telegram/translations.js +160 -0
- package/dist-server/server/services/telegram/translations.js.map +1 -0
- package/dist-server/server/utils/port-access.js +196 -0
- package/dist-server/server/utils/port-access.js.map +1 -0
- package/dist-server/shared/modelConstants.js +18 -0
- package/dist-server/shared/modelConstants.js.map +1 -1
- package/package.json +177 -168
- package/scripts/fix-node-pty.js +67 -67
- package/server/claude-sdk.js +857 -834
- package/server/cli.js +940 -937
- package/server/constants/config.js +4 -4
- package/server/cursor-cli.js +342 -342
- package/server/daemon/manager.js +564 -564
- package/server/daemon-manager.js +920 -920
- package/server/database/db.js +696 -593
- package/server/database/schema.js +138 -102
- package/server/gemini-cli.js +475 -469
- package/server/gemini-response-handler.js +79 -79
- package/server/index.js +2854 -2556
- package/server/load-env.js +34 -34
- package/server/middleware/auth.js +132 -132
- package/server/modules/providers/list/claude/claude-auth.provider.ts +145 -123
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -306
- package/server/modules/providers/list/claude/claude.provider.ts +15 -15
- package/server/modules/providers/list/codex/codex-auth.provider.ts +115 -100
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -319
- package/server/modules/providers/list/codex/codex.provider.ts +15 -15
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -421
- package/server/modules/providers/list/cursor/cursor.provider.ts +15 -15
- package/server/modules/providers/list/gemini/gemini-auth.provider.ts +163 -151
- package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -110
- package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -227
- package/server/modules/providers/list/gemini/gemini.provider.ts +15 -15
- package/server/modules/providers/list/qwen/qwen-auth.provider.ts +145 -0
- package/server/modules/providers/list/qwen/qwen-mcp.provider.ts +114 -0
- package/server/modules/providers/list/qwen/qwen-sessions.provider.ts +218 -0
- package/server/modules/providers/list/qwen/qwen.provider.ts +21 -0
- package/server/modules/providers/provider.registry.ts +38 -36
- package/server/modules/providers/provider.routes.ts +781 -217
- package/server/modules/providers/services/mcp.service.ts +94 -94
- package/server/modules/providers/services/provider-auth.service.ts +26 -26
- package/server/modules/providers/services/sessions.service.ts +45 -45
- package/server/modules/providers/shared/base/abstract.provider.ts +20 -20
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
- package/server/modules/providers/shared/provider-configs.ts +118 -0
- package/server/modules/providers/tests/mcp.test.ts +293 -293
- package/server/openai-codex.js +426 -426
- package/server/projects.js +2993 -2792
- package/server/qwen-code-cli.js +392 -0
- package/server/qwen-response-handler.js +73 -0
- package/server/routes/agent.js +1245 -1245
- package/server/routes/auth.js +134 -134
- package/server/routes/codex.js +19 -19
- package/server/routes/commands.js +554 -554
- package/server/routes/cursor.js +52 -52
- package/server/routes/gemini.js +24 -24
- package/server/routes/git.js +1488 -1488
- package/server/routes/mcp-utils.js +31 -31
- package/server/routes/messages.js +61 -61
- package/server/routes/network.js +128 -0
- package/server/routes/plugins.js +307 -307
- package/server/routes/projects.js +795 -627
- package/server/routes/qwen.js +27 -0
- package/server/routes/settings.js +286 -286
- package/server/routes/taskmaster.js +1471 -1471
- package/server/routes/telegram.js +125 -0
- package/server/routes/user.js +123 -123
- package/server/services/external-access.js +240 -0
- package/server/services/install-jobs.js +569 -0
- package/server/services/notification-orchestrator.js +242 -227
- package/server/services/provider-credentials.js +151 -0
- package/server/services/provider-models.js +225 -0
- package/server/services/telegram/bot.js +280 -0
- package/server/services/telegram/translations.js +170 -0
- package/server/services/vapid-keys.js +35 -35
- package/server/sessionManager.js +225 -225
- package/server/shared/interfaces.ts +54 -54
- package/server/shared/types.ts +172 -172
- package/server/shared/utils.ts +193 -193
- package/server/tsconfig.json +36 -36
- package/server/utils/colors.js +21 -21
- package/server/utils/commandParser.js +303 -303
- package/server/utils/frontmatter.js +18 -18
- package/server/utils/gitConfig.js +34 -34
- package/server/utils/mcp-detector.js +147 -147
- package/server/utils/plugin-loader.js +457 -457
- package/server/utils/plugin-process-manager.js +184 -184
- package/server/utils/port-access.js +209 -0
- package/server/utils/runtime-paths.js +37 -37
- package/server/utils/taskmaster-websocket.js +128 -128
- package/server/utils/url-detection.js +71 -71
- package/server/vite-daemon.js +78 -78
- package/shared/modelConstants.js +117 -97
- package/shared/networkHosts.js +22 -22
- package/dist/assets/index-C2c9QNwK.css +0 -32
- package/dist/assets/index-DyXDZED-.js +0 -1277
- package/dist/assets/vendor-codemirror-NA4v81it.js +0 -41
|
@@ -8,6 +8,7 @@ import os from 'os';
|
|
|
8
8
|
import sessionManager from './sessionManager.js';
|
|
9
9
|
import GeminiResponseHandler from './gemini-response-handler.js';
|
|
10
10
|
import { notifyRunFailed, notifyRunStopped } from './services/notification-orchestrator.js';
|
|
11
|
+
import { buildSpawnEnv } from './services/provider-credentials.js';
|
|
11
12
|
import { providerAuthService } from './modules/providers/services/provider-auth.service.js';
|
|
12
13
|
import { createNormalizedMessage } from './shared/utils.js';
|
|
13
14
|
let activeGeminiProcesses = new Map(); // Track active processes by session ID
|
|
@@ -147,11 +148,15 @@ async function spawnGemini(command, options = {}, ws) {
|
|
|
147
148
|
// Use exec to replace the shell process, ensuring signals hit gemini directly
|
|
148
149
|
spawnArgs = ['-c', 'exec "$0" "$@"', geminiPath, ...args];
|
|
149
150
|
}
|
|
151
|
+
// Pixcode UI-saved API key (stored in ~/.pixcode/provider-credentials.json)
|
|
152
|
+
// overlays on top of process.env so Gemini picks it up without the user
|
|
153
|
+
// exporting GEMINI_API_KEY in their shell.
|
|
154
|
+
const spawnEnv = await buildSpawnEnv('gemini');
|
|
150
155
|
return new Promise((resolve, reject) => {
|
|
151
156
|
const geminiProcess = spawnFunction(spawnCmd, spawnArgs, {
|
|
152
157
|
cwd: workingDir,
|
|
153
158
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
154
|
-
env:
|
|
159
|
+
env: spawnEnv,
|
|
155
160
|
});
|
|
156
161
|
let terminalNotificationSent = false;
|
|
157
162
|
let terminalFailureReason = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../server/gemini-cli.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../server/gemini-cli.js"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,15 @@ const __dirname = getModuleDir(import.meta.url);
|
|
|
10
10
|
// Resolving the app root once keeps every repo-level lookup below aligned across both layouts.
|
|
11
11
|
const APP_ROOT = findAppRoot(__dirname);
|
|
12
12
|
const installMode = fs.existsSync(path.join(APP_ROOT, '.git')) ? 'git' : 'npm';
|
|
13
|
+
const SERVER_VERSION = (() => {
|
|
14
|
+
try {
|
|
15
|
+
const pkgRaw = fs.readFileSync(path.join(APP_ROOT, 'package.json'), 'utf8');
|
|
16
|
+
return JSON.parse(pkgRaw).version || '0.0.0';
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return '0.0.0';
|
|
20
|
+
}
|
|
21
|
+
})();
|
|
13
22
|
const DAEMON_COMMAND_CONTEXT = {
|
|
14
23
|
appRoot: APP_ROOT,
|
|
15
24
|
cliEntry: path.join(APP_ROOT, 'server', 'cli.js'),
|
|
@@ -32,6 +41,7 @@ import { queryClaudeSDK, abortClaudeSDKSession, isClaudeSDKSessionActive, getAct
|
|
|
32
41
|
import { spawnCursor, abortCursorSession, isCursorSessionActive, getActiveCursorSessions } from './cursor-cli.js';
|
|
33
42
|
import { queryCodex, abortCodexSession, isCodexSessionActive, getActiveCodexSessions } from './openai-codex.js';
|
|
34
43
|
import { spawnGemini, abortGeminiSession, isGeminiSessionActive, getActiveGeminiSessions } from './gemini-cli.js';
|
|
44
|
+
import { spawnQwen, abortQwenSession, isQwenSessionActive, getActiveQwenSessions } from './qwen-code-cli.js';
|
|
35
45
|
import sessionManager from './sessionManager.js';
|
|
36
46
|
import gitRoutes from './routes/git.js';
|
|
37
47
|
import authRoutes from './routes/auth.js';
|
|
@@ -45,9 +55,16 @@ import projectsRoutes, { WORKSPACES_ROOT, WORKSPACES_BASE, validateWorkspacePath
|
|
|
45
55
|
import userRoutes from './routes/user.js';
|
|
46
56
|
import codexRoutes from './routes/codex.js';
|
|
47
57
|
import geminiRoutes from './routes/gemini.js';
|
|
58
|
+
import qwenRoutes from './routes/qwen.js';
|
|
48
59
|
import pluginsRoutes from './routes/plugins.js';
|
|
49
60
|
import messagesRoutes from './routes/messages.js';
|
|
50
61
|
import providerRoutes from './modules/providers/provider.routes.js';
|
|
62
|
+
import networkRoutes from './routes/network.js';
|
|
63
|
+
import telegramRoutes from './routes/telegram.js';
|
|
64
|
+
import { restoreBotFromConfig } from './services/telegram/bot.js';
|
|
65
|
+
import { ensurePortOpen } from './utils/port-access.js';
|
|
66
|
+
import { applyAllStoredCredentialsToEnv, applyProviderCredentialsToEnv, listProviderCredentialSummaries, PROVIDER_ENV_VARS, setProviderCredentials, } from './services/provider-credentials.js';
|
|
67
|
+
import { primeCliBinPath } from './services/install-jobs.js';
|
|
51
68
|
import { startEnabledPluginServers, stopAllPlugins, getPluginPort } from './utils/plugin-process-manager.js';
|
|
52
69
|
import { initializeDatabase, sessionNamesDb, applyCustomSessionNames } from './database/db.js';
|
|
53
70
|
import { configureWebPush } from './services/vapid-keys.js';
|
|
@@ -55,7 +72,7 @@ import { validateApiKey, authenticateToken, authenticateWebSocket } from './midd
|
|
|
55
72
|
import { IS_PLATFORM } from './constants/config.js';
|
|
56
73
|
import { getConnectableHost } from '../shared/networkHosts.js';
|
|
57
74
|
import { buildDaemonCliCommand, handleDaemonCommand } from './daemon-manager.js';
|
|
58
|
-
const VALID_PROVIDERS = ['claude', 'codex', 'cursor', 'gemini'];
|
|
75
|
+
const VALID_PROVIDERS = ['claude', 'codex', 'cursor', 'gemini', 'qwen'];
|
|
59
76
|
// File system watchers for provider project/session folders
|
|
60
77
|
const PROVIDER_WATCH_PATHS = [
|
|
61
78
|
{ provider: 'claude', rootPath: path.join(os.homedir(), '.claude', 'projects') },
|
|
@@ -64,6 +81,10 @@ const PROVIDER_WATCH_PATHS = [
|
|
|
64
81
|
{ provider: 'gemini', rootPath: path.join(os.homedir(), '.gemini', 'projects') },
|
|
65
82
|
{ provider: 'gemini_sessions', rootPath: path.join(os.homedir(), '.gemini', 'sessions') },
|
|
66
83
|
{ provider: 'gemini_cli', rootPath: path.join(os.homedir(), '.gemini', 'tmp') },
|
|
84
|
+
// Qwen Code is a Gemini-CLI fork so its on-disk layout mirrors ~/.gemini/.
|
|
85
|
+
{ provider: 'qwen', rootPath: path.join(os.homedir(), '.qwen', 'projects') },
|
|
86
|
+
{ provider: 'qwen_sessions', rootPath: path.join(os.homedir(), '.qwen', 'sessions') },
|
|
87
|
+
{ provider: 'qwen_cli', rootPath: path.join(os.homedir(), '.qwen', 'tmp') },
|
|
67
88
|
];
|
|
68
89
|
const WATCHER_IGNORED_PATTERNS = [
|
|
69
90
|
'**/node_modules/**',
|
|
@@ -243,7 +264,8 @@ app.get('/health', (req, res) => {
|
|
|
243
264
|
res.json({
|
|
244
265
|
status: 'ok',
|
|
245
266
|
timestamp: new Date().toISOString(),
|
|
246
|
-
installMode
|
|
267
|
+
installMode,
|
|
268
|
+
version: SERVER_VERSION
|
|
247
269
|
});
|
|
248
270
|
});
|
|
249
271
|
// Optional API key validation (if configured)
|
|
@@ -270,12 +292,18 @@ app.use('/api/user', authenticateToken, userRoutes);
|
|
|
270
292
|
app.use('/api/codex', authenticateToken, codexRoutes);
|
|
271
293
|
// Gemini API Routes (protected)
|
|
272
294
|
app.use('/api/gemini', authenticateToken, geminiRoutes);
|
|
295
|
+
// Qwen Code API Routes (protected)
|
|
296
|
+
app.use('/api/qwen', authenticateToken, qwenRoutes);
|
|
273
297
|
// Plugins API Routes (protected)
|
|
274
298
|
app.use('/api/plugins', authenticateToken, pluginsRoutes);
|
|
275
299
|
// Unified session messages route (protected)
|
|
276
300
|
app.use('/api/sessions', authenticateToken, messagesRoutes);
|
|
277
301
|
// Unified provider MCP routes (protected)
|
|
278
302
|
app.use('/api/providers', authenticateToken, providerRoutes);
|
|
303
|
+
// Network discovery / QR endpoints (protected)
|
|
304
|
+
app.use('/api/network', authenticateToken, networkRoutes);
|
|
305
|
+
// Telegram integration (protected)
|
|
306
|
+
app.use('/api/telegram', authenticateToken, telegramRoutes);
|
|
279
307
|
// Agent API Routes (uses API key authentication)
|
|
280
308
|
app.use('/api/agent', agentRoutes);
|
|
281
309
|
// Serve public files (like api-docs.html)
|
|
@@ -299,70 +327,237 @@ app.use(express.static(path.join(APP_ROOT, 'dist'), {
|
|
|
299
327
|
// API Routes (protected)
|
|
300
328
|
// /api/config endpoint removed - no longer needed
|
|
301
329
|
// Frontend now uses window.location for WebSocket URLs
|
|
302
|
-
// System update endpoint
|
|
330
|
+
// System update endpoint — streams live output via Server-Sent Events so the
|
|
331
|
+
// UI sees npm/git progress in real time instead of waiting ~2 minutes for the
|
|
332
|
+
// buffered response.
|
|
333
|
+
//
|
|
334
|
+
// Three update modes, picked in order of specificity:
|
|
335
|
+
// 1. PIXCODE_RUNTIME_DIR set → "desktop wrapper" path. Pulls the latest
|
|
336
|
+
// npm tarball, extracts it to the writable runtime dir, and triggers
|
|
337
|
+
// a server restart so the Electron wrapper respawns with new code.
|
|
338
|
+
// ~4 MB download, ~10 s; no npm/git/shell required on the host.
|
|
339
|
+
// 2. installMode === 'git' → `git pull && npm install` in-place.
|
|
340
|
+
// 3. fallback → `npm install -g …` (classic npm-distributed install).
|
|
303
341
|
app.post('/api/system/update', authenticateToken, async (req, res) => {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
342
|
+
const projectRoot = APP_ROOT;
|
|
343
|
+
console.log('Starting system update from directory:', projectRoot);
|
|
344
|
+
const runtimeDir = process.env.PIXCODE_RUNTIME_DIR || null;
|
|
345
|
+
const updateCommand = IS_PLATFORM
|
|
346
|
+
? 'npm run update:platform'
|
|
347
|
+
: installMode === 'git'
|
|
348
|
+
? 'git checkout main && git pull && npm install'
|
|
349
|
+
: 'npm install -g @pixelbyte-software/pixcode@latest';
|
|
350
|
+
const updateCwd = IS_PLATFORM || installMode === 'git'
|
|
351
|
+
? projectRoot
|
|
352
|
+
: os.homedir();
|
|
353
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
354
|
+
res.setHeader('Cache-Control', 'no-cache, no-transform');
|
|
355
|
+
res.setHeader('Connection', 'keep-alive');
|
|
356
|
+
res.setHeader('X-Accel-Buffering', 'no');
|
|
357
|
+
if (typeof res.flushHeaders === 'function') {
|
|
358
|
+
res.flushHeaders();
|
|
359
|
+
}
|
|
360
|
+
// Single-source end guard. When spawn() fails with ENOENT both the
|
|
361
|
+
// 'error' and 'close' handlers can fire on the child, and before this
|
|
362
|
+
// guard both would try to write a `done` event + call res.end(), which
|
|
363
|
+
// crashed the process with ERR_HTTP_HEADERS_SENT.
|
|
364
|
+
let ended = false;
|
|
365
|
+
const endStream = () => {
|
|
366
|
+
if (ended)
|
|
367
|
+
return;
|
|
368
|
+
ended = true;
|
|
369
|
+
clearInterval(heartbeat);
|
|
370
|
+
res.end();
|
|
371
|
+
};
|
|
372
|
+
const send = (event, payload) => {
|
|
373
|
+
if (ended)
|
|
374
|
+
return;
|
|
375
|
+
res.write(`event: ${event}\n`);
|
|
376
|
+
res.write(`data: ${JSON.stringify(payload)}\n\n`);
|
|
377
|
+
};
|
|
378
|
+
// Heartbeat keeps intermediate proxies from closing an idle connection
|
|
379
|
+
// during long npm installs. Declared before spawn so the handlers below
|
|
380
|
+
// can reference it, and guarded against writes after end.
|
|
381
|
+
const heartbeat = setInterval(() => {
|
|
382
|
+
if (ended)
|
|
383
|
+
return;
|
|
384
|
+
res.write(': ping\n\n');
|
|
385
|
+
}, 15000);
|
|
386
|
+
// ────────────────────────────────────────────────────────────────
|
|
387
|
+
// Runtime-dir mode — the desktop wrapper (pixcode-desktop) sets
|
|
388
|
+
// PIXCODE_RUNTIME_DIR to a writable directory it owns and forks this
|
|
389
|
+
// server from there. Updates download the npm tarball directly and
|
|
390
|
+
// swap it in-place, which is ~4 MB vs. ~85 MB for a full installer
|
|
391
|
+
// re-download. No shell, npm, or git required on the host.
|
|
392
|
+
// ────────────────────────────────────────────────────────────────
|
|
393
|
+
if (runtimeDir) {
|
|
394
|
+
send('log', { stream: 'meta', chunk: `Update mode: runtime-dir\n` });
|
|
395
|
+
send('log', { stream: 'meta', chunk: `Runtime: ${runtimeDir}\n` });
|
|
396
|
+
try {
|
|
397
|
+
// 1. Resolve the latest version from the npm registry.
|
|
398
|
+
send('log', { stream: 'meta', chunk: 'Querying registry for latest version…\n' });
|
|
399
|
+
const registryRes = await fetch('https://registry.npmjs.org/@pixelbyte-software/pixcode');
|
|
400
|
+
if (!registryRes.ok)
|
|
401
|
+
throw new Error(`Registry returned HTTP ${registryRes.status}`);
|
|
402
|
+
const metadata = await registryRes.json();
|
|
403
|
+
const latestVersion = metadata['dist-tags']?.latest;
|
|
404
|
+
const latestEntry = latestVersion ? metadata.versions?.[latestVersion] : null;
|
|
405
|
+
const tarballUrl = latestEntry?.dist?.tarball;
|
|
406
|
+
if (!latestVersion || !tarballUrl)
|
|
407
|
+
throw new Error('Registry response missing latest/tarball');
|
|
408
|
+
send('log', { stream: 'meta', chunk: `Current: ${SERVER_VERSION} → Latest: ${latestVersion}\n` });
|
|
409
|
+
if (latestVersion === SERVER_VERSION) {
|
|
410
|
+
send('done', {
|
|
337
411
|
success: true,
|
|
338
|
-
|
|
339
|
-
|
|
412
|
+
version: SERVER_VERSION,
|
|
413
|
+
alreadyLatest: true,
|
|
414
|
+
message: 'Already on the latest version.',
|
|
340
415
|
});
|
|
416
|
+
endStream();
|
|
417
|
+
return;
|
|
341
418
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
419
|
+
// 2. Download the tarball stream and pipe it through tar's
|
|
420
|
+
// extractor into a staging directory. Doing the extract
|
|
421
|
+
// under `.staging` first means the live runtime stays
|
|
422
|
+
// intact if the download fails partway through.
|
|
423
|
+
send('log', { stream: 'meta', chunk: `Downloading ${tarballUrl}\n` });
|
|
424
|
+
const tarballRes = await fetch(tarballUrl);
|
|
425
|
+
if (!tarballRes.ok || !tarballRes.body) {
|
|
426
|
+
throw new Error(`Tarball fetch failed: HTTP ${tarballRes.status}`);
|
|
427
|
+
}
|
|
428
|
+
const stagingDir = path.join(runtimeDir, '.staging');
|
|
429
|
+
const backupDir = path.join(runtimeDir, '.previous');
|
|
430
|
+
fs.rmSync(stagingDir, { recursive: true, force: true });
|
|
431
|
+
fs.mkdirSync(stagingDir, { recursive: true });
|
|
432
|
+
const { Readable } = await import('node:stream');
|
|
433
|
+
const tarModule = await import('tar');
|
|
434
|
+
const tarExtract = tarModule.x || tarModule.default?.x;
|
|
435
|
+
if (!tarExtract)
|
|
436
|
+
throw new Error('tar extractor not available');
|
|
437
|
+
// npm tarballs always root at `package/` — strip:1 lifts the
|
|
438
|
+
// contents to the staging dir directly so paths match the
|
|
439
|
+
// existing runtime layout.
|
|
440
|
+
await new Promise((resolve, reject) => {
|
|
441
|
+
const webStream = tarballRes.body;
|
|
442
|
+
const nodeStream = typeof Readable.fromWeb === 'function' && webStream?.getReader
|
|
443
|
+
? Readable.fromWeb(webStream)
|
|
444
|
+
: webStream;
|
|
445
|
+
const extractor = tarExtract({ cwd: stagingDir, strip: 1 });
|
|
446
|
+
nodeStream.pipe(extractor);
|
|
447
|
+
extractor.on('finish', resolve);
|
|
448
|
+
extractor.on('error', reject);
|
|
449
|
+
nodeStream.on('error', reject);
|
|
450
|
+
});
|
|
451
|
+
send('log', { stream: 'meta', chunk: 'Swapping runtime…\n' });
|
|
452
|
+
// 3. Atomic swap: move every top-level entry from staging into
|
|
453
|
+
// the runtime, keeping a .previous snapshot for rollback.
|
|
454
|
+
// We don't blow away the whole runtime because userData
|
|
455
|
+
// may contain wrapper-managed files (auth DB cache, etc.)
|
|
456
|
+
// that we don't want to touch.
|
|
457
|
+
fs.rmSync(backupDir, { recursive: true, force: true });
|
|
458
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
459
|
+
for (const entry of fs.readdirSync(stagingDir)) {
|
|
460
|
+
const src = path.join(stagingDir, entry);
|
|
461
|
+
const dst = path.join(runtimeDir, entry);
|
|
462
|
+
if (fs.existsSync(dst)) {
|
|
463
|
+
fs.renameSync(dst, path.join(backupDir, entry));
|
|
464
|
+
}
|
|
465
|
+
fs.renameSync(src, dst);
|
|
349
466
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
error: error.message
|
|
467
|
+
fs.rmSync(stagingDir, { recursive: true, force: true });
|
|
468
|
+
send('done', {
|
|
469
|
+
success: true,
|
|
470
|
+
version: latestVersion,
|
|
471
|
+
message: `Updated to ${latestVersion}. Restarting…`,
|
|
356
472
|
});
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
473
|
+
endStream();
|
|
474
|
+
// 4. Self-exit so the Electron wrapper respawns the server
|
|
475
|
+
// against the freshly-extracted files. 250 ms gives the
|
|
476
|
+
// SSE stream time to flush the done event before we die.
|
|
477
|
+
setTimeout(() => {
|
|
478
|
+
// Exit code 42 is a convention the wrapper watches for —
|
|
479
|
+
// it means "clean update restart, please respawn".
|
|
480
|
+
console.log('[update] Restarting for runtime-dir update');
|
|
481
|
+
process.exit(42);
|
|
482
|
+
}, 250);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
console.error('Runtime-dir update failed:', error);
|
|
487
|
+
send('done', { success: false, error: error?.message || String(error) });
|
|
488
|
+
endStream();
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
365
491
|
}
|
|
492
|
+
send('log', { stream: 'meta', chunk: `Running: ${updateCommand}\n` });
|
|
493
|
+
// Cross-platform shell invocation. Using { shell: true } delegates to
|
|
494
|
+
// cmd.exe on Windows and /bin/sh on POSIX, so the endpoint no longer
|
|
495
|
+
// fails with `spawn sh ENOENT` on Windows installs.
|
|
496
|
+
const child = spawn(updateCommand, {
|
|
497
|
+
cwd: updateCwd,
|
|
498
|
+
env: process.env,
|
|
499
|
+
shell: true,
|
|
500
|
+
});
|
|
501
|
+
let clientAborted = false;
|
|
502
|
+
req.on('close', () => {
|
|
503
|
+
if (!res.writableEnded) {
|
|
504
|
+
clientAborted = true;
|
|
505
|
+
try {
|
|
506
|
+
child.kill();
|
|
507
|
+
}
|
|
508
|
+
catch { /* noop */ }
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
child.stdout?.on('data', (data) => {
|
|
512
|
+
send('log', { stream: 'stdout', chunk: data.toString() });
|
|
513
|
+
});
|
|
514
|
+
child.stderr?.on('data', (data) => {
|
|
515
|
+
send('log', { stream: 'stderr', chunk: data.toString() });
|
|
516
|
+
});
|
|
517
|
+
child.on('error', (error) => {
|
|
518
|
+
if (ended)
|
|
519
|
+
return;
|
|
520
|
+
console.error('Update process error:', error);
|
|
521
|
+
send('done', { success: false, error: error.message });
|
|
522
|
+
endStream();
|
|
523
|
+
});
|
|
524
|
+
child.on('close', (code) => {
|
|
525
|
+
if (ended)
|
|
526
|
+
return;
|
|
527
|
+
if (clientAborted) {
|
|
528
|
+
endStream();
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
if (code === 0) {
|
|
532
|
+
send('done', {
|
|
533
|
+
success: true,
|
|
534
|
+
version: SERVER_VERSION,
|
|
535
|
+
message: 'Update completed. Restart the server to apply changes.',
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
send('done', {
|
|
540
|
+
success: false,
|
|
541
|
+
error: `Update command exited with code ${code}`,
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
endStream();
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
// Restart endpoint — exits the current process so an external wrapper
|
|
548
|
+
// (systemd/pm2/daemon manager) can bring the server back on the new code.
|
|
549
|
+
// Foreground installs without a wrapper will simply stop; the UI reports this.
|
|
550
|
+
app.post('/api/system/restart', authenticateToken, (req, res) => {
|
|
551
|
+
res.json({
|
|
552
|
+
success: true,
|
|
553
|
+
version: SERVER_VERSION,
|
|
554
|
+
message: 'Server is shutting down for restart. Reconnecting...'
|
|
555
|
+
});
|
|
556
|
+
// Give the response time to flush before we exit.
|
|
557
|
+
setTimeout(() => {
|
|
558
|
+
console.log('Restart requested via /api/system/restart — exiting process.');
|
|
559
|
+
process.exit(0);
|
|
560
|
+
}, 250);
|
|
366
561
|
});
|
|
367
562
|
app.get('/api/projects', authenticateToken, async (req, res) => {
|
|
368
563
|
try {
|
|
@@ -1317,6 +1512,13 @@ function handleChatConnection(ws, request) {
|
|
|
1317
1512
|
console.log('🤖 Model:', data.options?.model || 'default');
|
|
1318
1513
|
await spawnGemini(data.command, data.options, writer);
|
|
1319
1514
|
}
|
|
1515
|
+
else if (data.type === 'qwen-command') {
|
|
1516
|
+
console.log('[DEBUG] Qwen Code message:', data.command || '[Continue/Resume]');
|
|
1517
|
+
console.log('📁 Project:', data.options?.projectPath || data.options?.cwd || 'Unknown');
|
|
1518
|
+
console.log('🔄 Session:', data.options?.sessionId ? 'Resume' : 'New');
|
|
1519
|
+
console.log('🤖 Model:', data.options?.model || 'default');
|
|
1520
|
+
await spawnQwen(data.command, data.options, writer);
|
|
1521
|
+
}
|
|
1320
1522
|
else if (data.type === 'cursor-resume') {
|
|
1321
1523
|
// Backward compatibility: treat as cursor-command with resume and no prompt
|
|
1322
1524
|
console.log('[DEBUG] Cursor resume session (compat):', data.sessionId);
|
|
@@ -1339,6 +1541,9 @@ function handleChatConnection(ws, request) {
|
|
|
1339
1541
|
else if (provider === 'gemini') {
|
|
1340
1542
|
success = abortGeminiSession(data.sessionId);
|
|
1341
1543
|
}
|
|
1544
|
+
else if (provider === 'qwen') {
|
|
1545
|
+
success = abortQwenSession(data.sessionId);
|
|
1546
|
+
}
|
|
1342
1547
|
else {
|
|
1343
1548
|
// Use Claude Agents SDK
|
|
1344
1549
|
success = await abortClaudeSDKSession(data.sessionId);
|
|
@@ -1377,6 +1582,9 @@ function handleChatConnection(ws, request) {
|
|
|
1377
1582
|
else if (provider === 'gemini') {
|
|
1378
1583
|
isActive = isGeminiSessionActive(sessionId);
|
|
1379
1584
|
}
|
|
1585
|
+
else if (provider === 'qwen') {
|
|
1586
|
+
isActive = isQwenSessionActive(sessionId);
|
|
1587
|
+
}
|
|
1380
1588
|
else {
|
|
1381
1589
|
// Use Claude Agents SDK
|
|
1382
1590
|
isActive = isClaudeSDKSessionActive(sessionId);
|
|
@@ -1411,7 +1619,8 @@ function handleChatConnection(ws, request) {
|
|
|
1411
1619
|
claude: getActiveClaudeSDKSessions(),
|
|
1412
1620
|
cursor: getActiveCursorSessions(),
|
|
1413
1621
|
codex: getActiveCodexSessions(),
|
|
1414
|
-
gemini: getActiveGeminiSessions()
|
|
1622
|
+
gemini: getActiveGeminiSessions(),
|
|
1623
|
+
qwen: getActiveQwenSessions()
|
|
1415
1624
|
};
|
|
1416
1625
|
writer.send({
|
|
1417
1626
|
type: 'active-sessions',
|
|
@@ -1507,7 +1716,11 @@ function handleShellConnection(ws) {
|
|
|
1507
1716
|
welcomeMsg = `\x1b[36mStarting terminal in: ${projectPath}\x1b[0m\r\n`;
|
|
1508
1717
|
}
|
|
1509
1718
|
else {
|
|
1510
|
-
const providerName = provider === 'cursor' ? 'Cursor'
|
|
1719
|
+
const providerName = provider === 'cursor' ? 'Cursor'
|
|
1720
|
+
: provider === 'codex' ? 'Codex'
|
|
1721
|
+
: provider === 'gemini' ? 'Gemini'
|
|
1722
|
+
: provider === 'qwen' ? 'Qwen Code'
|
|
1723
|
+
: 'Claude';
|
|
1511
1724
|
welcomeMsg = hasSession ?
|
|
1512
1725
|
`\x1b[36mResuming ${providerName} session ${sessionId} in: ${projectPath}\x1b[0m\r\n` :
|
|
1513
1726
|
`\x1b[36mStarting new ${providerName} session in: ${projectPath}\x1b[0m\r\n`;
|
|
@@ -1592,6 +1805,33 @@ function handleShellConnection(ws) {
|
|
|
1592
1805
|
shellCommand = command;
|
|
1593
1806
|
}
|
|
1594
1807
|
}
|
|
1808
|
+
else if (provider === 'qwen') {
|
|
1809
|
+
// Qwen Code shares Gemini CLI's --resume semantics (it's a fork),
|
|
1810
|
+
// so the resume path resolves the backend-tracked cliSessionId the
|
|
1811
|
+
// same way. Falls back to a fresh session when the ID can't be found.
|
|
1812
|
+
const command = initialCommand || 'qwen';
|
|
1813
|
+
let resumeId = sessionId;
|
|
1814
|
+
if (hasSession && sessionId) {
|
|
1815
|
+
try {
|
|
1816
|
+
const sess = sessionManager.getSession(sessionId);
|
|
1817
|
+
if (sess && sess.cliSessionId) {
|
|
1818
|
+
resumeId = sess.cliSessionId;
|
|
1819
|
+
if (!safeSessionIdPattern.test(resumeId)) {
|
|
1820
|
+
resumeId = null;
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
catch (err) {
|
|
1825
|
+
console.error('Failed to get Qwen Code CLI session ID:', err);
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
if (hasSession && resumeId) {
|
|
1829
|
+
shellCommand = `${command} --resume "${resumeId}"`;
|
|
1830
|
+
}
|
|
1831
|
+
else {
|
|
1832
|
+
shellCommand = command;
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1595
1835
|
else {
|
|
1596
1836
|
// Claude (default provider)
|
|
1597
1837
|
const command = initialCommand || 'claude';
|
|
@@ -1869,6 +2109,17 @@ app.get('/api/projects/:projectName/sessions/:sessionId/token-usage', authentica
|
|
|
1869
2109
|
message: 'Token usage tracking not available for Gemini sessions'
|
|
1870
2110
|
});
|
|
1871
2111
|
}
|
|
2112
|
+
// Qwen Code is a Gemini CLI fork and doesn't expose per-session token
|
|
2113
|
+
// accounting either; treat it the same way.
|
|
2114
|
+
if (provider === 'qwen') {
|
|
2115
|
+
return res.json({
|
|
2116
|
+
used: 0,
|
|
2117
|
+
total: 0,
|
|
2118
|
+
breakdown: { input: 0, cacheCreation: 0, cacheRead: 0 },
|
|
2119
|
+
unsupported: true,
|
|
2120
|
+
message: 'Token usage tracking not available for Qwen Code sessions'
|
|
2121
|
+
});
|
|
2122
|
+
}
|
|
1872
2123
|
// Handle Codex sessions
|
|
1873
2124
|
if (provider === 'codex') {
|
|
1874
2125
|
const codexSessionsDir = path.join(homeDir, '.codex', 'sessions');
|
|
@@ -2279,6 +2530,31 @@ async function startServer() {
|
|
|
2279
2530
|
await initializeDatabase();
|
|
2280
2531
|
// Configure Web Push (VAPID keys)
|
|
2281
2532
|
configureWebPush();
|
|
2533
|
+
// Load any provider API keys saved through the UI into process.env so
|
|
2534
|
+
// the Claude/Codex SDKs pick them up automatically. Spawn-based
|
|
2535
|
+
// adapters (Gemini, Qwen) layer their own env on top via buildSpawnEnv.
|
|
2536
|
+
try {
|
|
2537
|
+
await applyAllStoredCredentialsToEnv();
|
|
2538
|
+
}
|
|
2539
|
+
catch (err) {
|
|
2540
|
+
console.warn('[provider-credentials] Failed to apply stored credentials:', err?.message || err);
|
|
2541
|
+
}
|
|
2542
|
+
// Prepend the pixcode-managed CLI sandbox
|
|
2543
|
+
// (~/.pixcode/cli-bin/node_modules/.bin) to PATH so any provider CLI
|
|
2544
|
+
// installed via the in-app installer is instantly resolvable by
|
|
2545
|
+
// cross-spawn calls in the provider adapters — no server restart
|
|
2546
|
+
// required, no need to touch the user's shell PATH.
|
|
2547
|
+
try {
|
|
2548
|
+
primeCliBinPath();
|
|
2549
|
+
}
|
|
2550
|
+
catch (err) {
|
|
2551
|
+
console.warn('[install-jobs] Failed to prime CLI bin path:', err?.message || err);
|
|
2552
|
+
}
|
|
2553
|
+
// Restore any previously-configured Telegram bot. This is best-effort:
|
|
2554
|
+
// a bad token or network blip should warn, not crash the server.
|
|
2555
|
+
restoreBotFromConfig().catch((err) => {
|
|
2556
|
+
console.warn('[telegram] restore failed:', err?.message || err);
|
|
2557
|
+
});
|
|
2282
2558
|
// Check if running in production mode (dist folder exists)
|
|
2283
2559
|
const distIndexPath = path.join(APP_ROOT, 'dist', 'index.html');
|
|
2284
2560
|
const isProduction = fs.existsSync(distIndexPath);
|
|
@@ -2298,6 +2574,15 @@ async function startServer() {
|
|
|
2298
2574
|
console.log('');
|
|
2299
2575
|
console.log(`${c.info('[INFO]')} Server URL: ${c.bright('http://' + DISPLAY_HOST + ':' + SERVER_PORT)}`);
|
|
2300
2576
|
console.log(`${c.info('[INFO]')} Installed at: ${c.dim(appInstallPath)}`);
|
|
2577
|
+
// Print LAN IP + open inbound firewall port (Linux auto, Windows/Mac
|
|
2578
|
+
// ask interactively once, then persist the decision). Non-fatal on
|
|
2579
|
+
// any error — LAN access often works without a rule anyway.
|
|
2580
|
+
try {
|
|
2581
|
+
await ensurePortOpen(Number(SERVER_PORT));
|
|
2582
|
+
}
|
|
2583
|
+
catch (err) {
|
|
2584
|
+
console.log(`${c.dim('[INFO]')} Port-access helper failed: ${err?.message || err}`);
|
|
2585
|
+
}
|
|
2301
2586
|
console.log(`${c.tip('[TIP]')} Run "pixcode status" for full configuration details`);
|
|
2302
2587
|
console.log('');
|
|
2303
2588
|
// Start watching the projects folder for changes
|