@pixelbyte-software/pixcode 1.53.28 → 1.54.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 (75) hide show
  1. package/dist/assets/{index-BBDYzJ7B.js → index-CLO8YURv.js} +148 -148
  2. package/dist/index.html +1 -1
  3. package/dist-server/server/claude-sdk.js +6 -0
  4. package/dist-server/server/claude-sdk.js.map +1 -1
  5. package/dist-server/server/cli.js +67 -0
  6. package/dist-server/server/cli.js.map +1 -1
  7. package/dist-server/server/index.js +278 -54
  8. package/dist-server/server/index.js.map +1 -1
  9. package/dist-server/server/middleware/account-lockout.js +101 -0
  10. package/dist-server/server/middleware/account-lockout.js.map +1 -0
  11. package/dist-server/server/middleware/auth.js +71 -9
  12. package/dist-server/server/middleware/auth.js.map +1 -1
  13. package/dist-server/server/middleware/rate-limiter.js +62 -0
  14. package/dist-server/server/middleware/rate-limiter.js.map +1 -0
  15. package/dist-server/server/routes/agent.js +3 -4
  16. package/dist-server/server/routes/agent.js.map +1 -1
  17. package/dist-server/server/routes/auth.js +75 -13
  18. package/dist-server/server/routes/auth.js.map +1 -1
  19. package/dist-server/server/routes/codex.js +1 -1
  20. package/dist-server/server/routes/codex.js.map +1 -1
  21. package/dist-server/server/routes/diagnostics.js +6 -3
  22. package/dist-server/server/routes/diagnostics.js.map +1 -1
  23. package/dist-server/server/routes/gemini.js +1 -1
  24. package/dist-server/server/routes/gemini.js.map +1 -1
  25. package/dist-server/server/routes/git.js +9 -9
  26. package/dist-server/server/routes/git.js.map +1 -1
  27. package/dist-server/server/routes/live-view.js +2 -2
  28. package/dist-server/server/routes/live-view.js.map +1 -1
  29. package/dist-server/server/routes/plugins.js +12 -12
  30. package/dist-server/server/routes/plugins.js.map +1 -1
  31. package/dist-server/server/routes/projects.js +2 -2
  32. package/dist-server/server/routes/projects.js.map +1 -1
  33. package/dist-server/server/routes/qwen.js +1 -1
  34. package/dist-server/server/routes/qwen.js.map +1 -1
  35. package/dist-server/server/routes/remote.js +1 -1
  36. package/dist-server/server/routes/remote.js.map +1 -1
  37. package/dist-server/server/routes/webhooks.js +1 -1
  38. package/dist-server/server/routes/webhooks.js.map +1 -1
  39. package/dist-server/server/services/startup-update.js +31 -6
  40. package/dist-server/server/services/startup-update.js.map +1 -1
  41. package/dist-server/server/services/telegram/bot.js +6 -4
  42. package/dist-server/server/services/telegram/bot.js.map +1 -1
  43. package/dist-server/server/setup-wizard.js +246 -0
  44. package/dist-server/server/setup-wizard.js.map +1 -0
  45. package/dist-server/server/utils/plugin-loader.js +3 -0
  46. package/dist-server/server/utils/plugin-loader.js.map +1 -1
  47. package/dist-server/server/utils/port-access.js +25 -8
  48. package/dist-server/server/utils/port-access.js.map +1 -1
  49. package/dist-server/server/utils/security-log.js +89 -0
  50. package/dist-server/server/utils/security-log.js.map +1 -0
  51. package/package.json +1 -1
  52. package/server/claude-sdk.js +7 -0
  53. package/server/cli.js +67 -0
  54. package/server/index.js +287 -55
  55. package/server/middleware/account-lockout.js +112 -0
  56. package/server/middleware/auth.js +72 -9
  57. package/server/middleware/rate-limiter.js +82 -0
  58. package/server/routes/agent.js +3 -4
  59. package/server/routes/auth.js +86 -13
  60. package/server/routes/codex.js +1 -1
  61. package/server/routes/diagnostics.js +6 -3
  62. package/server/routes/gemini.js +1 -1
  63. package/server/routes/git.js +9 -9
  64. package/server/routes/live-view.js +2 -2
  65. package/server/routes/plugins.js +12 -12
  66. package/server/routes/projects.js +2 -2
  67. package/server/routes/qwen.js +1 -1
  68. package/server/routes/remote.js +1 -1
  69. package/server/routes/webhooks.js +1 -1
  70. package/server/services/startup-update.js +31 -6
  71. package/server/services/telegram/bot.js +6 -4
  72. package/server/setup-wizard.js +263 -0
  73. package/server/utils/plugin-loader.js +4 -0
  74. package/server/utils/port-access.js +26 -8
  75. package/server/utils/security-log.js +84 -0
package/server/cli.js CHANGED
@@ -7,6 +7,7 @@
7
7
  * Commands:
8
8
  * (no args) - Start the server (default)
9
9
  * start - Start the server
10
+ * setup - Run the interactive setup wizard
10
11
  * sandbox - Manage Docker sandbox environments
11
12
  * daemon - Manage persistent Linux service modes
12
13
  * status - Show configuration and data locations
@@ -23,6 +24,7 @@ import { spawn } from 'node:child_process';
23
24
  import { findAppRoot, getModuleDir } from './utils/runtime-paths.js';
24
25
  import { buildDaemonCliCommand, handleDaemonCommand, hasInstalledDaemonUnit } from './daemon-manager.js';
25
26
  import { runStartupAutoUpdate, startupUpdateReexecEnv } from './services/startup-update.js';
27
+ import { runSetupWizard, postStartupGuidance, isFirstRun, isPortAvailable, findAvailablePort, waitForServerReady } from './setup-wizard.js';
26
28
 
27
29
  const __dirname = getModuleDir(import.meta.url);
28
30
  // The CLI is compiled into dist-server/server, but it still needs to read the top-level
@@ -169,6 +171,7 @@ Usage:
169
171
 
170
172
  Commands:
171
173
  start Start the Pixcode server (default)
174
+ setup Run the interactive setup wizard (port, mode, browser)
172
175
  daemon Manage persistent Linux service (system-first)
173
176
  sandbox Manage Docker sandbox environments
174
177
  status Show configuration and data locations
@@ -180,14 +183,17 @@ Options:
180
183
  -p, --port <port> Set server port (default: 3001)
181
184
  --database-path <path> Set custom database location
182
185
  --no-daemon Disable automatic daemon startup on Linux
186
+ --no-browser Do not auto-open browser on startup
183
187
  --restart-daemon Restart daemon automatically after update
184
188
  -h, --help Show this help information
185
189
  -v, --version Show version information
186
190
 
187
191
  Examples:
188
192
  $ pixcode # Start with defaults
193
+ $ pixcode setup # Run the interactive setup wizard
189
194
  $ pixcode --port 8080 # Start on port 8080
190
195
  $ pixcode --no-daemon # Force foreground mode
196
+ $ pixcode --no-browser # Start without auto-opening browser
191
197
  $ sudo pixcode daemon install --mode system --port 3001
192
198
  $ pixcode daemon install --mode user --port 3001 --single-port
193
199
  $ pixcode daemon doctor --mode system
@@ -945,6 +951,8 @@ function parseArgs(args) {
945
951
  parsed.options.databasePath = arg.split('=')[1];
946
952
  } else if (arg === '--no-daemon') {
947
953
  parsed.options.noDaemon = true;
954
+ } else if (arg === '--no-browser') {
955
+ parsed.options.noBrowser = true;
948
956
  } else if (arg === '--restart-daemon') {
949
957
  parsed.options.restartDaemon = true;
950
958
  } else if (arg === '--help' || arg === '-h') {
@@ -982,6 +990,9 @@ async function main() {
982
990
  if (options.noDaemon) {
983
991
  process.env.PIXCODE_NO_DAEMON = '1';
984
992
  }
993
+ if (options.noBrowser) {
994
+ process.env.PIXCODE_NO_BROWSER = '1';
995
+ }
985
996
  if (options.databasePath) {
986
997
  process.env.DATABASE_PATH = options.databasePath;
987
998
  }
@@ -991,11 +1002,67 @@ async function main() {
991
1002
  if (process.env.PIXCODE_ENABLE_STARTUP_UPDATE === '1' && await runStartupUpdateGate()) {
992
1003
  break;
993
1004
  }
1005
+ {
1006
+ const effectivePort = Number(options.serverPort || process.env.SERVER_PORT || process.env.PORT || '3001');
1007
+
1008
+ // First-run setup wizard
1009
+ if (isFirstRun()) {
1010
+ const wizardResult = await runSetupWizard(options);
1011
+ if (wizardResult) {
1012
+ if (!options.serverPort) {
1013
+ process.env.SERVER_PORT = String(wizardResult.port);
1014
+ }
1015
+ if (wizardResult.useDaemon === false) {
1016
+ options.noDaemon = true;
1017
+ process.env.PIXCODE_NO_DAEMON = '1';
1018
+ }
1019
+ }
1020
+ }
1021
+
1022
+ // Port conflict detection (every run, not just first)
1023
+ const currentPort = Number(options.serverPort || process.env.SERVER_PORT || process.env.PORT || '3001');
1024
+ if (!await isPortAvailable(currentPort)) {
1025
+ const alreadyRunning = await waitForServerReady(currentPort, 2000);
1026
+ if (alreadyRunning) {
1027
+ console.log(`\n${c.ok('[OK]')} Pixcode is already running on port ${c.bright(String(currentPort))}.`);
1028
+ await postStartupGuidance(currentPort);
1029
+ break;
1030
+ }
1031
+ console.log(`\n${c.warn('[WARN]')} Port ${c.bright(String(currentPort))} is in use by another process.`);
1032
+ const altPort = await findAvailablePort(currentPort + 1);
1033
+ if (altPort) {
1034
+ console.log(`${c.info('[INFO]')} Switching to port ${c.bright(String(altPort))}.`);
1035
+ process.env.SERVER_PORT = String(altPort);
1036
+ options.serverPort = String(altPort);
1037
+ } else {
1038
+ console.error(`${c.error('[ERROR]')} No free ports found. Specify one with ${c.bright('--port <port>')}.`);
1039
+ process.exit(1);
1040
+ }
1041
+ }
1042
+ }
994
1043
  if (await maybeAutoDaemonStart(options)) {
1044
+ const daemonPort = Number(options.serverPort || process.env.SERVER_PORT || process.env.PORT || '3001');
1045
+ const ready = await waitForServerReady(daemonPort, 15000);
1046
+ if (ready) {
1047
+ await postStartupGuidance(daemonPort);
1048
+ }
995
1049
  break;
996
1050
  }
997
1051
  await startServer();
998
1052
  break;
1053
+ case 'setup':
1054
+ {
1055
+ const wizardResult = await runSetupWizard(options);
1056
+ if (wizardResult) {
1057
+ process.env.SERVER_PORT = String(wizardResult.port);
1058
+ if (wizardResult.useDaemon === false) {
1059
+ options.noDaemon = true;
1060
+ process.env.PIXCODE_NO_DAEMON = '1';
1061
+ }
1062
+ }
1063
+ console.log(`\n${c.ok('[OK]')} Setup complete! Run ${c.bright('pixcode start')} to launch.`);
1064
+ }
1065
+ break;
999
1066
  case 'sandbox':
1000
1067
  await sandboxCommand(remainingArgs || []);
1001
1068
  break;