@pixelbyte-software/pixcode 1.54.0 → 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.
- package/dist/assets/{index-CEw93JQ7.js → index-CLO8YURv.js} +205 -205
- package/dist/assets/index-DvudRU5X.css +32 -0
- package/dist/index.html +2 -2
- package/dist-server/server/claude-sdk.js +6 -0
- package/dist-server/server/claude-sdk.js.map +1 -1
- package/dist-server/server/index.js +240 -46
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/middleware/account-lockout.js +101 -0
- package/dist-server/server/middleware/account-lockout.js.map +1 -0
- package/dist-server/server/middleware/auth.js +71 -9
- package/dist-server/server/middleware/auth.js.map +1 -1
- package/dist-server/server/middleware/rate-limiter.js +62 -0
- package/dist-server/server/middleware/rate-limiter.js.map +1 -0
- package/dist-server/server/routes/agent.js +3 -4
- package/dist-server/server/routes/agent.js.map +1 -1
- package/dist-server/server/routes/auth.js +75 -13
- package/dist-server/server/routes/auth.js.map +1 -1
- package/dist-server/server/routes/codex.js +1 -1
- package/dist-server/server/routes/codex.js.map +1 -1
- package/dist-server/server/routes/diagnostics.js +6 -3
- package/dist-server/server/routes/diagnostics.js.map +1 -1
- package/dist-server/server/routes/gemini.js +1 -1
- package/dist-server/server/routes/gemini.js.map +1 -1
- package/dist-server/server/routes/git.js +9 -9
- package/dist-server/server/routes/git.js.map +1 -1
- package/dist-server/server/routes/live-view.js +2 -2
- package/dist-server/server/routes/live-view.js.map +1 -1
- package/dist-server/server/routes/plugins.js +12 -12
- package/dist-server/server/routes/plugins.js.map +1 -1
- package/dist-server/server/routes/projects.js +2 -2
- package/dist-server/server/routes/projects.js.map +1 -1
- package/dist-server/server/routes/qwen.js +1 -1
- package/dist-server/server/routes/qwen.js.map +1 -1
- package/dist-server/server/routes/remote.js +1 -1
- package/dist-server/server/routes/remote.js.map +1 -1
- package/dist-server/server/routes/webhooks.js +1 -1
- package/dist-server/server/routes/webhooks.js.map +1 -1
- package/dist-server/server/services/startup-update.js +31 -6
- package/dist-server/server/services/startup-update.js.map +1 -1
- package/dist-server/server/services/telegram/bot.js +6 -4
- package/dist-server/server/services/telegram/bot.js.map +1 -1
- package/dist-server/server/setup-wizard.js +12 -6
- package/dist-server/server/setup-wizard.js.map +1 -1
- package/dist-server/server/utils/plugin-loader.js +3 -0
- package/dist-server/server/utils/plugin-loader.js.map +1 -1
- package/dist-server/server/utils/port-access.js +25 -8
- package/dist-server/server/utils/port-access.js.map +1 -1
- package/dist-server/server/utils/security-log.js +89 -0
- package/dist-server/server/utils/security-log.js.map +1 -0
- package/package.json +1 -1
- package/server/claude-sdk.js +7 -0
- package/server/index.js +249 -46
- package/server/middleware/account-lockout.js +112 -0
- package/server/middleware/auth.js +72 -9
- package/server/middleware/rate-limiter.js +82 -0
- package/server/routes/agent.js +3 -4
- package/server/routes/auth.js +86 -13
- package/server/routes/codex.js +1 -1
- package/server/routes/diagnostics.js +6 -3
- package/server/routes/gemini.js +1 -1
- package/server/routes/git.js +9 -9
- package/server/routes/live-view.js +2 -2
- package/server/routes/plugins.js +12 -12
- package/server/routes/projects.js +2 -2
- package/server/routes/qwen.js +1 -1
- package/server/routes/remote.js +1 -1
- package/server/routes/webhooks.js +1 -1
- package/server/services/startup-update.js +31 -6
- package/server/services/telegram/bot.js +6 -4
- package/server/setup-wizard.js +12 -6
- package/server/utils/plugin-loader.js +4 -0
- package/server/utils/port-access.js +26 -8
- package/server/utils/security-log.js +84 -0
- package/dist/assets/index-B6Ssy_IG.css +0 -32
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
// bcryptjs is a pure-JS drop-in (same hash/compare API, same output format)
|
|
3
|
-
// — switching from native `bcrypt` here eliminated one C++ compile from
|
|
4
|
-
// the install path. Existing $2a$/$2b$ hashes in the DB remain valid;
|
|
5
|
-
// bcryptjs recognizes both prefixes so logins work across the swap.
|
|
6
2
|
import bcrypt from 'bcryptjs';
|
|
7
3
|
import { userDb, db } from '../database/db.js';
|
|
8
4
|
import { generateToken, authenticateToken, requireAdmin } from '../middleware/auth.js';
|
|
5
|
+
import { authRateLimiter } from '../middleware/rate-limiter.js';
|
|
6
|
+
import { checkAccountLockout, recordFailedLogin, recordSuccessfulLogin, validatePasswordPolicy, validateUsername, } from '../middleware/account-lockout.js';
|
|
7
|
+
import { securityLog, getClientIp } from '../utils/security-log.js';
|
|
9
8
|
import { consumeQrLoginToken, createQrLoginToken, getQrLoginSettings, saveQrLoginSettings, } from '../services/qr-login.js';
|
|
10
9
|
import { getPublicRemoteConnectionConfig, saveRemoteConnectionConfig, } from '../services/remote-connection.js';
|
|
11
10
|
const router = express.Router();
|
|
@@ -36,7 +35,10 @@ router.get('/status', async (req, res) => {
|
|
|
36
35
|
router.get('/connection-mode', (req, res) => {
|
|
37
36
|
res.json({ success: true, connection: getPublicRemoteConnectionConfig() });
|
|
38
37
|
});
|
|
39
|
-
|
|
38
|
+
// Changing the connection mode is a state-changing operation that must
|
|
39
|
+
// require authentication. Without auth, any unauthenticated caller could
|
|
40
|
+
// redirect the app to a malicious remote server.
|
|
41
|
+
router.put('/connection-mode', authenticateToken, requireAdmin, (req, res) => {
|
|
40
42
|
try {
|
|
41
43
|
res.json({ success: true, connection: saveRemoteConnectionConfig(req.body || {}) });
|
|
42
44
|
}
|
|
@@ -55,7 +57,7 @@ router.put('/qr-login/settings', authenticateToken, requireAdmin, (req, res) =>
|
|
|
55
57
|
res.status(400).json({ success: false, error: error.message });
|
|
56
58
|
}
|
|
57
59
|
});
|
|
58
|
-
router.post('/qr-login/token', authenticateToken, requireAdmin, (req, res) => {
|
|
60
|
+
router.post('/qr-login/token', authenticateToken, requireAdmin, authRateLimiter, (req, res) => {
|
|
59
61
|
try {
|
|
60
62
|
const baseUrl = typeof req.body?.baseUrl === 'string' && req.body.baseUrl.trim()
|
|
61
63
|
? req.body.baseUrl.trim()
|
|
@@ -67,11 +69,16 @@ router.post('/qr-login/token', authenticateToken, requireAdmin, (req, res) => {
|
|
|
67
69
|
res.status(status).json({ success: false, error: error.message });
|
|
68
70
|
}
|
|
69
71
|
});
|
|
70
|
-
router.post('/qr-login', (req, res) => {
|
|
72
|
+
router.post('/qr-login', authRateLimiter, (req, res) => {
|
|
71
73
|
try {
|
|
72
74
|
const user = consumeQrLoginToken(req.body?.token);
|
|
73
75
|
const token = generateToken(user);
|
|
74
76
|
userDb.updateLastLogin(user.id);
|
|
77
|
+
securityLog('qr_login_success', {
|
|
78
|
+
ip: getClientIp(req),
|
|
79
|
+
userId: user.id,
|
|
80
|
+
username: user.username,
|
|
81
|
+
});
|
|
75
82
|
res.json({
|
|
76
83
|
success: true,
|
|
77
84
|
user: publicUser(user),
|
|
@@ -80,19 +87,29 @@ router.post('/qr-login', (req, res) => {
|
|
|
80
87
|
}
|
|
81
88
|
catch (error) {
|
|
82
89
|
const status = error?.code === 'QR_LOGIN_DISABLED' ? 409 : 401;
|
|
90
|
+
securityLog('qr_login_failed', {
|
|
91
|
+
ip: getClientIp(req),
|
|
92
|
+
reason: error?.code || 'unknown',
|
|
93
|
+
});
|
|
83
94
|
res.status(status).json({ success: false, error: error.message });
|
|
84
95
|
}
|
|
85
96
|
});
|
|
86
97
|
// User registration (setup) - only allowed if no users exist
|
|
87
|
-
router.post('/register', async (req, res) => {
|
|
98
|
+
router.post('/register', authRateLimiter, async (req, res) => {
|
|
88
99
|
try {
|
|
89
100
|
const { username, password } = req.body;
|
|
101
|
+
const clientIp = getClientIp(req);
|
|
90
102
|
// Validate input
|
|
91
103
|
if (!username || !password) {
|
|
92
104
|
return res.status(400).json({ error: 'Username and password are required' });
|
|
93
105
|
}
|
|
94
|
-
|
|
95
|
-
|
|
106
|
+
const usernameValidation = validateUsername(username);
|
|
107
|
+
if (!usernameValidation.valid) {
|
|
108
|
+
return res.status(400).json({ error: usernameValidation.error });
|
|
109
|
+
}
|
|
110
|
+
const passwordValidation = validatePasswordPolicy(password);
|
|
111
|
+
if (!passwordValidation.valid) {
|
|
112
|
+
return res.status(400).json({ error: passwordValidation.error });
|
|
96
113
|
}
|
|
97
114
|
// Use a transaction to prevent race conditions
|
|
98
115
|
db.prepare('BEGIN').run();
|
|
@@ -113,6 +130,11 @@ router.post('/register', async (req, res) => {
|
|
|
113
130
|
db.prepare('COMMIT').run();
|
|
114
131
|
// Update last login (non-fatal, outside transaction)
|
|
115
132
|
userDb.updateLastLogin(user.id);
|
|
133
|
+
securityLog('user_registered', {
|
|
134
|
+
ip: clientIp,
|
|
135
|
+
userId: user.id,
|
|
136
|
+
username: user.username,
|
|
137
|
+
});
|
|
116
138
|
res.json({
|
|
117
139
|
success: true,
|
|
118
140
|
user: publicUser(user),
|
|
@@ -135,27 +157,64 @@ router.post('/register', async (req, res) => {
|
|
|
135
157
|
}
|
|
136
158
|
});
|
|
137
159
|
// User login
|
|
138
|
-
router.post('/login', async (req, res) => {
|
|
160
|
+
router.post('/login', authRateLimiter, async (req, res) => {
|
|
139
161
|
try {
|
|
140
162
|
const { username, password } = req.body;
|
|
163
|
+
const clientIp = getClientIp(req);
|
|
141
164
|
// Validate input
|
|
142
165
|
if (!username || !password) {
|
|
143
166
|
return res.status(400).json({ error: 'Username and password are required' });
|
|
144
167
|
}
|
|
168
|
+
// Check account lockout before attempting login
|
|
169
|
+
const lockoutStatus = checkAccountLockout(String(username), clientIp);
|
|
170
|
+
if (lockoutStatus.locked) {
|
|
171
|
+
securityLog('login_blocked_locked', {
|
|
172
|
+
ip: clientIp,
|
|
173
|
+
username,
|
|
174
|
+
reason: 'Account locked due to failed attempts',
|
|
175
|
+
});
|
|
176
|
+
return res.status(423).json({ error: lockoutStatus.message });
|
|
177
|
+
}
|
|
145
178
|
// Get user from database
|
|
146
179
|
const user = userDb.getUserByUsername(username);
|
|
147
180
|
if (!user) {
|
|
181
|
+
const failResult = recordFailedLogin(String(username), clientIp);
|
|
182
|
+
securityLog('login_failed', {
|
|
183
|
+
ip: clientIp,
|
|
184
|
+
username,
|
|
185
|
+
reason: 'User not found',
|
|
186
|
+
});
|
|
187
|
+
if (failResult.locked) {
|
|
188
|
+
return res.status(423).json({ error: failResult.message });
|
|
189
|
+
}
|
|
148
190
|
return res.status(401).json({ error: 'Invalid username or password' });
|
|
149
191
|
}
|
|
150
192
|
// Verify password
|
|
151
193
|
const isValidPassword = await bcrypt.compare(password, user.password_hash);
|
|
152
194
|
if (!isValidPassword) {
|
|
195
|
+
const failResult = recordFailedLogin(String(username), clientIp);
|
|
196
|
+
securityLog('login_failed', {
|
|
197
|
+
ip: clientIp,
|
|
198
|
+
username,
|
|
199
|
+
userId: user.id,
|
|
200
|
+
reason: 'Invalid password',
|
|
201
|
+
});
|
|
202
|
+
if (failResult.locked) {
|
|
203
|
+
return res.status(423).json({ error: failResult.message });
|
|
204
|
+
}
|
|
153
205
|
return res.status(401).json({ error: 'Invalid username or password' });
|
|
154
206
|
}
|
|
207
|
+
// Clear failed attempts on successful login
|
|
208
|
+
recordSuccessfulLogin(String(username), clientIp);
|
|
155
209
|
// Generate token
|
|
156
210
|
const token = generateToken(user);
|
|
157
211
|
// Update last login
|
|
158
212
|
userDb.updateLastLogin(user.id);
|
|
213
|
+
securityLog('login_success', {
|
|
214
|
+
ip: clientIp,
|
|
215
|
+
userId: user.id,
|
|
216
|
+
username: user.username,
|
|
217
|
+
});
|
|
159
218
|
res.json({
|
|
160
219
|
success: true,
|
|
161
220
|
user: publicUser(user),
|
|
@@ -175,8 +234,11 @@ router.get('/user', authenticateToken, (req, res) => {
|
|
|
175
234
|
});
|
|
176
235
|
// Logout (client-side token removal, but this endpoint can be used for logging)
|
|
177
236
|
router.post('/logout', authenticateToken, (req, res) => {
|
|
178
|
-
|
|
179
|
-
|
|
237
|
+
securityLog('user_logout', {
|
|
238
|
+
ip: getClientIp(req),
|
|
239
|
+
userId: req.user?.id,
|
|
240
|
+
username: req.user?.username,
|
|
241
|
+
});
|
|
180
242
|
res.json({ success: true, message: 'Logged out successfully' });
|
|
181
243
|
});
|
|
182
244
|
export default router;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../server/routes/auth.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../server/routes/auth.js"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
|
|
|
11
11
|
}
|
|
12
12
|
catch (error) {
|
|
13
13
|
console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);
|
|
14
|
-
res.status(500).json({ success: false, error: error
|
|
14
|
+
res.status(500).json({ success: false, error: "Internal server error" });
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
export default router;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../server/routes/codex.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACjC,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACpC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../server/routes/codex.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACjC,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACpC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import { collectDiagnostics } from '../services/diagnostics.js';
|
|
3
|
+
import { requireAdmin } from '../middleware/auth.js';
|
|
3
4
|
const router = express.Router();
|
|
4
5
|
function buildDiagnostics(req) {
|
|
5
6
|
return collectDiagnostics({
|
|
@@ -12,10 +13,12 @@ function buildDiagnostics(req) {
|
|
|
12
13
|
cache: req.app.locals.diagnosticsCache || {},
|
|
13
14
|
});
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
// Diagnostics expose internal system state (active sessions, errors,
|
|
17
|
+
// provider health) — restrict to admins to prevent information leakage.
|
|
18
|
+
router.get('/', requireAdmin, (req, res) => {
|
|
16
19
|
res.json(buildDiagnostics(req));
|
|
17
20
|
});
|
|
18
|
-
router.post('/refresh', (req, res) => {
|
|
21
|
+
router.post('/refresh', requireAdmin, (req, res) => {
|
|
19
22
|
req.app.locals.diagnosticsCache = {
|
|
20
23
|
...(req.app.locals.diagnosticsCache || {}),
|
|
21
24
|
diagnosticsUpdatedAt: new Date().toISOString(),
|
|
@@ -23,7 +26,7 @@ router.post('/refresh', (req, res) => {
|
|
|
23
26
|
};
|
|
24
27
|
res.json(buildDiagnostics(req));
|
|
25
28
|
});
|
|
26
|
-
router.get('/bundle', (req, res) => {
|
|
29
|
+
router.get('/bundle', requireAdmin, (req, res) => {
|
|
27
30
|
const diagnostics = buildDiagnostics(req);
|
|
28
31
|
res.json({
|
|
29
32
|
generatedAt: diagnostics.timestamp,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../server/routes/diagnostics.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../server/routes/diagnostics.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,SAAS,gBAAgB,CAAC,GAAG;IAC3B,OAAO,kBAAkB,CAAC;QACxB,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW;QACvC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa;QAC3C,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG;QACvB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE;QAC3C,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE;QAC/C,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE;QACnD,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE;KAC7C,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,wEAAwE;AACxE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACzC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,GAAG;QAChC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC1C,oBAAoB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC9C,aAAa,EAAE,IAAI;KACpB,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,IAAI,CAAC;QACP,WAAW,EAAE,WAAW,CAAC,SAAS;QAClC,QAAQ,EAAE,IAAI;QACd,WAAW;KACZ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -14,7 +14,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
|
|
|
14
14
|
}
|
|
15
15
|
catch (error) {
|
|
16
16
|
console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);
|
|
17
|
-
res.status(500).json({ success: false, error: error
|
|
17
|
+
res.status(500).json({ success: false, error: "Internal server error" });
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
20
|
export default router;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../server/routes/gemini.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrD,IAAI,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAEjC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5F,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9C,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../server/routes/gemini.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrD,IAAI,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAEjC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5F,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9C,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC7E,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -752,7 +752,7 @@ router.post('/initial-commit', async (req, res) => {
|
|
|
752
752
|
details: 'No files found in the repository. Add some files first.'
|
|
753
753
|
});
|
|
754
754
|
}
|
|
755
|
-
res.status(500).json({ error: error
|
|
755
|
+
res.status(500).json({ error: "Internal server error" });
|
|
756
756
|
}
|
|
757
757
|
});
|
|
758
758
|
// Commit changes
|
|
@@ -777,7 +777,7 @@ router.post('/commit', async (req, res) => {
|
|
|
777
777
|
}
|
|
778
778
|
catch (error) {
|
|
779
779
|
console.error('Git commit error:', error);
|
|
780
|
-
res.status(500).json({ error: error
|
|
780
|
+
res.status(500).json({ error: "Internal server error" });
|
|
781
781
|
}
|
|
782
782
|
});
|
|
783
783
|
// Revert latest local commit (keeps changes staged)
|
|
@@ -819,7 +819,7 @@ router.post('/revert-local-commit', async (req, res) => {
|
|
|
819
819
|
}
|
|
820
820
|
catch (error) {
|
|
821
821
|
console.error('Git revert local commit error:', error);
|
|
822
|
-
res.status(500).json({ error: error
|
|
822
|
+
res.status(500).json({ error: "Internal server error" });
|
|
823
823
|
}
|
|
824
824
|
});
|
|
825
825
|
// Get list of branches
|
|
@@ -872,7 +872,7 @@ router.post('/checkout', async (req, res) => {
|
|
|
872
872
|
}
|
|
873
873
|
catch (error) {
|
|
874
874
|
console.error('Git checkout error:', error);
|
|
875
|
-
res.status(500).json({ error: error
|
|
875
|
+
res.status(500).json({ error: "Internal server error" });
|
|
876
876
|
}
|
|
877
877
|
});
|
|
878
878
|
// Create new branch
|
|
@@ -890,7 +890,7 @@ router.post('/create-branch', async (req, res) => {
|
|
|
890
890
|
}
|
|
891
891
|
catch (error) {
|
|
892
892
|
console.error('Git create branch error:', error);
|
|
893
|
-
res.status(500).json({ error: error
|
|
893
|
+
res.status(500).json({ error: "Internal server error" });
|
|
894
894
|
}
|
|
895
895
|
});
|
|
896
896
|
// Delete a local branch
|
|
@@ -912,7 +912,7 @@ router.post('/delete-branch', async (req, res) => {
|
|
|
912
912
|
}
|
|
913
913
|
catch (error) {
|
|
914
914
|
console.error('Git delete branch error:', error);
|
|
915
|
-
res.status(500).json({ error: error
|
|
915
|
+
res.status(500).json({ error: "Internal server error" });
|
|
916
916
|
}
|
|
917
917
|
});
|
|
918
918
|
// Get recent commits
|
|
@@ -1038,7 +1038,7 @@ router.post('/generate-commit-message', async (req, res) => {
|
|
|
1038
1038
|
}
|
|
1039
1039
|
catch (error) {
|
|
1040
1040
|
console.error('Generate commit message error:', error);
|
|
1041
|
-
res.status(500).json({ error: error
|
|
1041
|
+
res.status(500).json({ error: "Internal server error" });
|
|
1042
1042
|
}
|
|
1043
1043
|
});
|
|
1044
1044
|
/**
|
|
@@ -1513,7 +1513,7 @@ router.post('/discard', async (req, res) => {
|
|
|
1513
1513
|
}
|
|
1514
1514
|
catch (error) {
|
|
1515
1515
|
console.error('Git discard error:', error);
|
|
1516
|
-
res.status(500).json({ error: error
|
|
1516
|
+
res.status(500).json({ error: "Internal server error" });
|
|
1517
1517
|
}
|
|
1518
1518
|
});
|
|
1519
1519
|
// Delete untracked file
|
|
@@ -1550,7 +1550,7 @@ router.post('/delete-untracked', async (req, res) => {
|
|
|
1550
1550
|
}
|
|
1551
1551
|
catch (error) {
|
|
1552
1552
|
console.error('Git delete untracked error:', error);
|
|
1553
|
-
res.status(500).json({ error: error
|
|
1553
|
+
res.status(500).json({ error: "Internal server error" });
|
|
1554
1554
|
}
|
|
1555
1555
|
});
|
|
1556
1556
|
export default router;
|