@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.
Files changed (209) hide show
  1. package/LICENSE +718 -718
  2. package/README.de.md +248 -248
  3. package/README.ja.md +240 -240
  4. package/README.ko.md +240 -240
  5. package/README.md +295 -285
  6. package/README.ru.md +248 -248
  7. package/README.tr.md +250 -250
  8. package/README.zh-CN.md +240 -240
  9. package/dist/api-docs.html +879 -879
  10. package/dist/assets/index-BtOeB3cE.js +837 -0
  11. package/dist/assets/index-CDpePeIN.css +32 -0
  12. package/dist/assets/vendor-codemirror-CzYAOTxS.js +41 -0
  13. package/dist/clear-cache.html +85 -85
  14. package/dist/convert-icons.md +52 -52
  15. package/dist/favicon.png +0 -0
  16. package/dist/favicon.svg +7 -8
  17. package/dist/generate-icons.js +48 -48
  18. package/dist/icons/codex-white.svg +3 -3
  19. package/dist/icons/codex.svg +3 -3
  20. package/dist/icons/cursor-white.svg +11 -11
  21. package/dist/icons/icon-128x128.png +0 -0
  22. package/dist/icons/icon-128x128.svg +9 -12
  23. package/dist/icons/icon-144x144.png +0 -0
  24. package/dist/icons/icon-144x144.svg +9 -12
  25. package/dist/icons/icon-152x152.png +0 -0
  26. package/dist/icons/icon-152x152.svg +9 -12
  27. package/dist/icons/icon-192x192.png +0 -0
  28. package/dist/icons/icon-192x192.svg +9 -12
  29. package/dist/icons/icon-384x384.png +0 -0
  30. package/dist/icons/icon-384x384.svg +9 -12
  31. package/dist/icons/icon-512x512.png +0 -0
  32. package/dist/icons/icon-512x512.svg +9 -12
  33. package/dist/icons/icon-72x72.png +0 -0
  34. package/dist/icons/icon-72x72.svg +9 -12
  35. package/dist/icons/icon-96x96.png +0 -0
  36. package/dist/icons/icon-96x96.svg +9 -12
  37. package/dist/icons/icon-template.svg +9 -12
  38. package/dist/icons/qwen-ai-icon.png +0 -0
  39. package/dist/index.html +60 -50
  40. package/dist/logo.png +0 -0
  41. package/dist/logo.svg +11 -16
  42. package/dist/manifest.json +60 -60
  43. package/dist/sw.js +124 -124
  44. package/dist-server/server/claude-sdk.js +28 -5
  45. package/dist-server/server/claude-sdk.js.map +1 -1
  46. package/dist-server/server/cli.js +100 -97
  47. package/dist-server/server/cli.js.map +1 -1
  48. package/dist-server/server/daemon/manager.js +33 -33
  49. package/dist-server/server/daemon-manager.js +62 -62
  50. package/dist-server/server/database/db.js +114 -22
  51. package/dist-server/server/database/db.js.map +1 -1
  52. package/dist-server/server/database/schema.js +122 -89
  53. package/dist-server/server/database/schema.js.map +1 -1
  54. package/dist-server/server/gemini-cli.js +6 -1
  55. package/dist-server/server/gemini-cli.js.map +1 -1
  56. package/dist-server/server/index.js +346 -61
  57. package/dist-server/server/index.js.map +1 -1
  58. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +29 -2
  59. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
  60. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +22 -2
  61. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -1
  62. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +2 -2
  63. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -1
  64. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +14 -2
  65. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -1
  66. package/dist-server/server/modules/providers/list/qwen/qwen-auth.provider.js +132 -0
  67. package/dist-server/server/modules/providers/list/qwen/qwen-auth.provider.js.map +1 -0
  68. package/dist-server/server/modules/providers/list/qwen/qwen-mcp.provider.js +87 -0
  69. package/dist-server/server/modules/providers/list/qwen/qwen-mcp.provider.js.map +1 -0
  70. package/dist-server/server/modules/providers/list/qwen/qwen-sessions.provider.js +201 -0
  71. package/dist-server/server/modules/providers/list/qwen/qwen-sessions.provider.js.map +1 -0
  72. package/dist-server/server/modules/providers/list/qwen/qwen.provider.js +19 -0
  73. package/dist-server/server/modules/providers/list/qwen/qwen.provider.js.map +1 -0
  74. package/dist-server/server/modules/providers/provider.registry.js +2 -0
  75. package/dist-server/server/modules/providers/provider.registry.js.map +1 -1
  76. package/dist-server/server/modules/providers/provider.routes.js +478 -1
  77. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  78. package/dist-server/server/modules/providers/shared/provider-configs.js +105 -0
  79. package/dist-server/server/modules/providers/shared/provider-configs.js.map +1 -0
  80. package/dist-server/server/projects.js +197 -6
  81. package/dist-server/server/projects.js.map +1 -1
  82. package/dist-server/server/qwen-code-cli.js +350 -0
  83. package/dist-server/server/qwen-code-cli.js.map +1 -0
  84. package/dist-server/server/qwen-response-handler.js +70 -0
  85. package/dist-server/server/qwen-response-handler.js.map +1 -0
  86. package/dist-server/server/routes/commands.js +25 -25
  87. package/dist-server/server/routes/git.js +17 -17
  88. package/dist-server/server/routes/network.js +116 -0
  89. package/dist-server/server/routes/network.js.map +1 -0
  90. package/dist-server/server/routes/projects.js +166 -1
  91. package/dist-server/server/routes/projects.js.map +1 -1
  92. package/dist-server/server/routes/qwen.js +23 -0
  93. package/dist-server/server/routes/qwen.js.map +1 -0
  94. package/dist-server/server/routes/taskmaster.js +419 -419
  95. package/dist-server/server/routes/telegram.js +119 -0
  96. package/dist-server/server/routes/telegram.js.map +1 -0
  97. package/dist-server/server/services/external-access.js +228 -0
  98. package/dist-server/server/services/external-access.js.map +1 -0
  99. package/dist-server/server/services/install-jobs.js +552 -0
  100. package/dist-server/server/services/install-jobs.js.map +1 -0
  101. package/dist-server/server/services/notification-orchestrator.js +19 -5
  102. package/dist-server/server/services/notification-orchestrator.js.map +1 -1
  103. package/dist-server/server/services/provider-credentials.js +154 -0
  104. package/dist-server/server/services/provider-credentials.js.map +1 -0
  105. package/dist-server/server/services/provider-models.js +218 -0
  106. package/dist-server/server/services/provider-models.js.map +1 -0
  107. package/dist-server/server/services/telegram/bot.js +259 -0
  108. package/dist-server/server/services/telegram/bot.js.map +1 -0
  109. package/dist-server/server/services/telegram/translations.js +160 -0
  110. package/dist-server/server/services/telegram/translations.js.map +1 -0
  111. package/dist-server/server/utils/port-access.js +196 -0
  112. package/dist-server/server/utils/port-access.js.map +1 -0
  113. package/dist-server/shared/modelConstants.js +18 -0
  114. package/dist-server/shared/modelConstants.js.map +1 -1
  115. package/package.json +177 -168
  116. package/scripts/fix-node-pty.js +67 -67
  117. package/server/claude-sdk.js +857 -834
  118. package/server/cli.js +940 -937
  119. package/server/constants/config.js +4 -4
  120. package/server/cursor-cli.js +342 -342
  121. package/server/daemon/manager.js +564 -564
  122. package/server/daemon-manager.js +920 -920
  123. package/server/database/db.js +696 -593
  124. package/server/database/schema.js +138 -102
  125. package/server/gemini-cli.js +475 -469
  126. package/server/gemini-response-handler.js +79 -79
  127. package/server/index.js +2854 -2556
  128. package/server/load-env.js +34 -34
  129. package/server/middleware/auth.js +132 -132
  130. package/server/modules/providers/list/claude/claude-auth.provider.ts +145 -123
  131. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
  132. package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -306
  133. package/server/modules/providers/list/claude/claude.provider.ts +15 -15
  134. package/server/modules/providers/list/codex/codex-auth.provider.ts +115 -100
  135. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
  136. package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -319
  137. package/server/modules/providers/list/codex/codex.provider.ts +15 -15
  138. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
  139. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
  140. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -421
  141. package/server/modules/providers/list/cursor/cursor.provider.ts +15 -15
  142. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +163 -151
  143. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -110
  144. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -227
  145. package/server/modules/providers/list/gemini/gemini.provider.ts +15 -15
  146. package/server/modules/providers/list/qwen/qwen-auth.provider.ts +145 -0
  147. package/server/modules/providers/list/qwen/qwen-mcp.provider.ts +114 -0
  148. package/server/modules/providers/list/qwen/qwen-sessions.provider.ts +218 -0
  149. package/server/modules/providers/list/qwen/qwen.provider.ts +21 -0
  150. package/server/modules/providers/provider.registry.ts +38 -36
  151. package/server/modules/providers/provider.routes.ts +781 -217
  152. package/server/modules/providers/services/mcp.service.ts +94 -94
  153. package/server/modules/providers/services/provider-auth.service.ts +26 -26
  154. package/server/modules/providers/services/sessions.service.ts +45 -45
  155. package/server/modules/providers/shared/base/abstract.provider.ts +20 -20
  156. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
  157. package/server/modules/providers/shared/provider-configs.ts +118 -0
  158. package/server/modules/providers/tests/mcp.test.ts +293 -293
  159. package/server/openai-codex.js +426 -426
  160. package/server/projects.js +2993 -2792
  161. package/server/qwen-code-cli.js +392 -0
  162. package/server/qwen-response-handler.js +73 -0
  163. package/server/routes/agent.js +1245 -1245
  164. package/server/routes/auth.js +134 -134
  165. package/server/routes/codex.js +19 -19
  166. package/server/routes/commands.js +554 -554
  167. package/server/routes/cursor.js +52 -52
  168. package/server/routes/gemini.js +24 -24
  169. package/server/routes/git.js +1488 -1488
  170. package/server/routes/mcp-utils.js +31 -31
  171. package/server/routes/messages.js +61 -61
  172. package/server/routes/network.js +128 -0
  173. package/server/routes/plugins.js +307 -307
  174. package/server/routes/projects.js +795 -627
  175. package/server/routes/qwen.js +27 -0
  176. package/server/routes/settings.js +286 -286
  177. package/server/routes/taskmaster.js +1471 -1471
  178. package/server/routes/telegram.js +125 -0
  179. package/server/routes/user.js +123 -123
  180. package/server/services/external-access.js +240 -0
  181. package/server/services/install-jobs.js +569 -0
  182. package/server/services/notification-orchestrator.js +242 -227
  183. package/server/services/provider-credentials.js +151 -0
  184. package/server/services/provider-models.js +225 -0
  185. package/server/services/telegram/bot.js +280 -0
  186. package/server/services/telegram/translations.js +170 -0
  187. package/server/services/vapid-keys.js +35 -35
  188. package/server/sessionManager.js +225 -225
  189. package/server/shared/interfaces.ts +54 -54
  190. package/server/shared/types.ts +172 -172
  191. package/server/shared/utils.ts +193 -193
  192. package/server/tsconfig.json +36 -36
  193. package/server/utils/colors.js +21 -21
  194. package/server/utils/commandParser.js +303 -303
  195. package/server/utils/frontmatter.js +18 -18
  196. package/server/utils/gitConfig.js +34 -34
  197. package/server/utils/mcp-detector.js +147 -147
  198. package/server/utils/plugin-loader.js +457 -457
  199. package/server/utils/plugin-process-manager.js +184 -184
  200. package/server/utils/port-access.js +209 -0
  201. package/server/utils/runtime-paths.js +37 -37
  202. package/server/utils/taskmaster-websocket.js +128 -128
  203. package/server/utils/url-detection.js +71 -71
  204. package/server/vite-daemon.js +78 -78
  205. package/shared/modelConstants.js +117 -97
  206. package/shared/networkHosts.js +22 -22
  207. package/dist/assets/index-C2c9QNwK.css +0 -32
  208. package/dist/assets/index-DyXDZED-.js +0 -1277
  209. 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: { ...process.env } // Inherit all environment variables
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
- try {
305
- // Get the project root directory (parent of server directory)
306
- const projectRoot = APP_ROOT;
307
- console.log('Starting system update from directory:', projectRoot);
308
- // Platform deployments use their own update workflow from the project root.
309
- const updateCommand = IS_PLATFORM
310
- // In platform, husky and dev dependencies are not needed
311
- ? 'npm run update:platform'
312
- : installMode === 'git'
313
- ? 'git checkout main && git pull && npm install'
314
- : 'npm install -g @pixelbyte-software/pixcode@latest';
315
- const updateCwd = IS_PLATFORM || installMode === 'git'
316
- ? projectRoot
317
- : os.homedir();
318
- const child = spawn('sh', ['-c', updateCommand], {
319
- cwd: updateCwd,
320
- env: process.env
321
- });
322
- let output = '';
323
- let errorOutput = '';
324
- child.stdout.on('data', (data) => {
325
- const text = data.toString();
326
- output += text;
327
- console.log('Update output:', text);
328
- });
329
- child.stderr.on('data', (data) => {
330
- const text = data.toString();
331
- errorOutput += text;
332
- console.error('Update error:', text);
333
- });
334
- child.on('close', (code) => {
335
- if (code === 0) {
336
- res.json({
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
- output: output || 'Update completed successfully',
339
- message: 'Update completed. Please restart the server to apply changes.'
412
+ version: SERVER_VERSION,
413
+ alreadyLatest: true,
414
+ message: 'Already on the latest version.',
340
415
  });
416
+ endStream();
417
+ return;
341
418
  }
342
- else {
343
- res.status(500).json({
344
- success: false,
345
- error: 'Update command failed',
346
- output: output,
347
- errorOutput: errorOutput
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
- child.on('error', (error) => {
352
- console.error('Update process error:', error);
353
- res.status(500).json({
354
- success: false,
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
- catch (error) {
360
- console.error('System update error:', error);
361
- res.status(500).json({
362
- success: false,
363
- error: error.message
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' : (provider === 'codex' ? 'Codex' : (provider === 'gemini' ? 'Gemini' : 'Claude'));
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