@pixelbyte-software/pixcode 1.34.0 → 1.35.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 (247) 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 +303 -303
  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 +548 -395
  10. package/dist/assets/index-B8w57E1r.css +32 -0
  11. package/dist/assets/index-CBdsvGSR.js +854 -0
  12. package/dist/clear-cache.html +85 -85
  13. package/dist/convert-icons.md +52 -52
  14. package/dist/favicon.svg +8 -8
  15. package/dist/generate-icons.js +48 -48
  16. package/dist/icons/codex-white.svg +3 -3
  17. package/dist/icons/codex.svg +3 -3
  18. package/dist/icons/cursor-white.svg +11 -11
  19. package/dist/icons/icon-128x128.svg +9 -9
  20. package/dist/icons/icon-144x144.svg +9 -9
  21. package/dist/icons/icon-152x152.svg +9 -9
  22. package/dist/icons/icon-192x192.svg +9 -9
  23. package/dist/icons/icon-384x384.svg +9 -9
  24. package/dist/icons/icon-512x512.svg +9 -9
  25. package/dist/icons/icon-72x72.svg +9 -9
  26. package/dist/icons/icon-96x96.svg +9 -9
  27. package/dist/icons/icon-template.svg +9 -9
  28. package/dist/icons/qwen-logo.svg +14 -14
  29. package/dist/index.html +59 -59
  30. package/dist/logo.svg +12 -12
  31. package/dist/manifest.json +60 -60
  32. package/dist/openapi.yaml +1693 -1311
  33. package/dist/sw.js +124 -124
  34. package/dist-server/server/claude-sdk.js +38 -7
  35. package/dist-server/server/claude-sdk.js.map +1 -1
  36. package/dist-server/server/cli.js +107 -112
  37. package/dist-server/server/cli.js.map +1 -1
  38. package/dist-server/server/daemon/manager.js +33 -33
  39. package/dist-server/server/daemon-manager.js +159 -112
  40. package/dist-server/server/daemon-manager.js.map +1 -1
  41. package/dist-server/server/database/json-store.js +8 -5
  42. package/dist-server/server/database/json-store.js.map +1 -1
  43. package/dist-server/server/index.js +31 -10
  44. package/dist-server/server/index.js.map +1 -1
  45. package/dist-server/server/modules/orchestration/a2a/adapter-registry.js +45 -19
  46. package/dist-server/server/modules/orchestration/a2a/adapter-registry.js.map +1 -1
  47. package/dist-server/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.js.map +1 -1
  48. package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js +1 -0
  49. package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js.map +1 -1
  50. package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js +202 -0
  51. package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js.map +1 -0
  52. package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js +205 -0
  53. package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js.map +1 -0
  54. package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js +205 -0
  55. package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js.map +1 -0
  56. package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js +205 -0
  57. package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js.map +1 -0
  58. package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js +205 -0
  59. package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js.map +1 -0
  60. package/dist-server/server/modules/orchestration/a2a/routes.js +298 -34
  61. package/dist-server/server/modules/orchestration/a2a/routes.js.map +1 -1
  62. package/dist-server/server/modules/orchestration/a2a/task-store.js +144 -0
  63. package/dist-server/server/modules/orchestration/a2a/task-store.js.map +1 -0
  64. package/dist-server/server/modules/orchestration/a2a/validator.js +16 -0
  65. package/dist-server/server/modules/orchestration/a2a/validator.js.map +1 -1
  66. package/dist-server/server/modules/orchestration/index.js +14 -0
  67. package/dist-server/server/modules/orchestration/index.js.map +1 -1
  68. package/dist-server/server/modules/orchestration/preview/port-watcher.js +90 -0
  69. package/dist-server/server/modules/orchestration/preview/port-watcher.js.map +1 -0
  70. package/dist-server/server/modules/orchestration/preview/preview-proxy.js +58 -0
  71. package/dist-server/server/modules/orchestration/preview/preview-proxy.js.map +1 -0
  72. package/dist-server/server/modules/orchestration/preview/types.js +2 -0
  73. package/dist-server/server/modules/orchestration/preview/types.js.map +1 -0
  74. package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js +37 -0
  75. package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js.map +1 -0
  76. package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js +68 -0
  77. package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js.map +1 -0
  78. package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js +128 -0
  79. package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js.map +1 -0
  80. package/dist-server/server/modules/orchestration/tasks/orchestration-task.types.js +2 -0
  81. package/dist-server/server/modules/orchestration/tasks/orchestration-task.types.js.map +1 -0
  82. package/dist-server/server/modules/orchestration/workflows/built-in-workflows.js +126 -0
  83. package/dist-server/server/modules/orchestration/workflows/built-in-workflows.js.map +1 -0
  84. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js +1047 -0
  85. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js.map +1 -0
  86. package/dist-server/server/modules/orchestration/workflows/workflow-store.js +76 -0
  87. package/dist-server/server/modules/orchestration/workflows/workflow-store.js.map +1 -0
  88. package/dist-server/server/modules/orchestration/workflows/workflow.routes.js +151 -0
  89. package/dist-server/server/modules/orchestration/workflows/workflow.routes.js.map +1 -0
  90. package/dist-server/server/modules/orchestration/workflows/workflow.types.js +2 -0
  91. package/dist-server/server/modules/orchestration/workflows/workflow.types.js.map +1 -0
  92. package/dist-server/server/modules/orchestration/workflows/workspace-target.js +98 -0
  93. package/dist-server/server/modules/orchestration/workflows/workspace-target.js.map +1 -0
  94. package/dist-server/server/modules/orchestration/workspace/docker-workspace.js +122 -0
  95. package/dist-server/server/modules/orchestration/workspace/docker-workspace.js.map +1 -0
  96. package/dist-server/server/modules/orchestration/workspace/path-safety.js +48 -0
  97. package/dist-server/server/modules/orchestration/workspace/path-safety.js.map +1 -0
  98. package/dist-server/server/modules/orchestration/workspace/types.js +11 -0
  99. package/dist-server/server/modules/orchestration/workspace/types.js.map +1 -0
  100. package/dist-server/server/modules/orchestration/workspace/workspace-manager.js +80 -0
  101. package/dist-server/server/modules/orchestration/workspace/workspace-manager.js.map +1 -0
  102. package/dist-server/server/modules/orchestration/workspace/worktree-workspace.js +96 -0
  103. package/dist-server/server/modules/orchestration/workspace/worktree-workspace.js.map +1 -0
  104. package/dist-server/server/modules/providers/index.js +3 -0
  105. package/dist-server/server/modules/providers/index.js.map +1 -0
  106. package/dist-server/server/openai-codex.js +35 -4
  107. package/dist-server/server/openai-codex.js.map +1 -1
  108. package/dist-server/server/routes/commands.js +25 -25
  109. package/dist-server/server/routes/git.js +17 -17
  110. package/dist-server/server/routes/taskmaster.js +525 -508
  111. package/dist-server/server/routes/taskmaster.js.map +1 -1
  112. package/package.json +180 -178
  113. package/scripts/fix-node-pty.js +67 -67
  114. package/scripts/smoke/a2a-roundtrip.mjs +86 -17
  115. package/scripts/smoke/orchestration-api.mjs +172 -0
  116. package/scripts/smoke/orchestration-live-run.mjs +176 -0
  117. package/server/claude-sdk.js +898 -857
  118. package/server/cli.js +935 -940
  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 +959 -920
  123. package/server/database/db.js +794 -794
  124. package/server/database/json-store.js +197 -194
  125. package/server/gemini-cli.js +535 -535
  126. package/server/gemini-response-handler.js +79 -79
  127. package/server/index.js +3135 -3104
  128. package/server/load-env.js +34 -34
  129. package/server/middleware/auth.js +173 -173
  130. package/server/modules/orchestration/a2a/adapter-registry.ts +72 -22
  131. package/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.ts +9 -3
  132. package/server/modules/orchestration/a2a/adapters/claude-code.adapter.ts +1 -0
  133. package/server/modules/orchestration/a2a/adapters/codex.adapter.ts +244 -0
  134. package/server/modules/orchestration/a2a/adapters/cursor.adapter.ts +249 -0
  135. package/server/modules/orchestration/a2a/adapters/gemini.adapter.ts +248 -0
  136. package/server/modules/orchestration/a2a/adapters/opencode.adapter.ts +248 -0
  137. package/server/modules/orchestration/a2a/adapters/qwen.adapter.ts +248 -0
  138. package/server/modules/orchestration/a2a/routes.ts +349 -36
  139. package/server/modules/orchestration/a2a/task-store.ts +178 -0
  140. package/server/modules/orchestration/a2a/types.ts +14 -0
  141. package/server/modules/orchestration/a2a/validator.ts +25 -2
  142. package/server/modules/orchestration/index.ts +40 -0
  143. package/server/modules/orchestration/preview/port-watcher.ts +112 -0
  144. package/server/modules/orchestration/preview/preview-proxy.ts +60 -0
  145. package/server/modules/orchestration/preview/types.ts +19 -0
  146. package/server/modules/orchestration/tasks/orchestration-task-store.ts +45 -0
  147. package/server/modules/orchestration/tasks/orchestration-task.routes.ts +73 -0
  148. package/server/modules/orchestration/tasks/orchestration-task.service.ts +145 -0
  149. package/server/modules/orchestration/tasks/orchestration-task.types.ts +29 -0
  150. package/server/modules/orchestration/workflows/built-in-workflows.ts +127 -0
  151. package/server/modules/orchestration/workflows/workflow-runner.ts +1206 -0
  152. package/server/modules/orchestration/workflows/workflow-store.ts +97 -0
  153. package/server/modules/orchestration/workflows/workflow.routes.ts +169 -0
  154. package/server/modules/orchestration/workflows/workflow.types.ts +70 -0
  155. package/server/modules/orchestration/workflows/workspace-target.ts +120 -0
  156. package/server/modules/orchestration/workspace/docker-workspace.ts +135 -0
  157. package/server/modules/orchestration/workspace/path-safety.ts +55 -0
  158. package/server/modules/orchestration/workspace/types.ts +52 -0
  159. package/server/modules/orchestration/workspace/workspace-manager.ts +97 -0
  160. package/server/modules/orchestration/workspace/worktree-workspace.ts +125 -0
  161. package/server/modules/providers/index.ts +2 -0
  162. package/server/modules/providers/list/claude/claude-auth.provider.ts +145 -145
  163. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
  164. package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -306
  165. package/server/modules/providers/list/claude/claude.provider.ts +15 -15
  166. package/server/modules/providers/list/codex/codex-auth.provider.ts +115 -115
  167. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
  168. package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -319
  169. package/server/modules/providers/list/codex/codex.provider.ts +15 -15
  170. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
  171. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
  172. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -421
  173. package/server/modules/providers/list/cursor/cursor.provider.ts +15 -15
  174. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +163 -163
  175. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -110
  176. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -227
  177. package/server/modules/providers/list/gemini/gemini.provider.ts +15 -15
  178. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +130 -130
  179. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +126 -126
  180. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +232 -232
  181. package/server/modules/providers/list/opencode/opencode.provider.ts +29 -29
  182. package/server/modules/providers/list/qwen/qwen-auth.provider.ts +145 -145
  183. package/server/modules/providers/list/qwen/qwen-mcp.provider.ts +114 -114
  184. package/server/modules/providers/list/qwen/qwen-sessions.provider.ts +265 -265
  185. package/server/modules/providers/list/qwen/qwen.provider.ts +21 -21
  186. package/server/modules/providers/provider.registry.ts +40 -40
  187. package/server/modules/providers/provider.routes.ts +819 -819
  188. package/server/modules/providers/services/mcp.service.ts +86 -86
  189. package/server/modules/providers/services/provider-auth.service.ts +26 -26
  190. package/server/modules/providers/services/sessions.service.ts +45 -45
  191. package/server/modules/providers/shared/base/abstract.provider.ts +20 -20
  192. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
  193. package/server/modules/providers/shared/provider-configs.ts +142 -142
  194. package/server/modules/providers/tests/mcp.test.ts +293 -293
  195. package/server/openai-codex.js +462 -426
  196. package/server/opencode-cli.js +459 -459
  197. package/server/opencode-response-handler.js +107 -107
  198. package/server/projects.js +3105 -3105
  199. package/server/qwen-code-cli.js +395 -395
  200. package/server/qwen-response-handler.js +73 -73
  201. package/server/routes/agent.js +1365 -1365
  202. package/server/routes/auth.js +138 -138
  203. package/server/routes/codex.js +19 -19
  204. package/server/routes/commands.js +554 -554
  205. package/server/routes/cursor.js +52 -52
  206. package/server/routes/gemini.js +24 -24
  207. package/server/routes/git.js +1488 -1488
  208. package/server/routes/mcp-utils.js +31 -31
  209. package/server/routes/messages.js +61 -61
  210. package/server/routes/network.js +120 -120
  211. package/server/routes/plugins.js +318 -318
  212. package/server/routes/projects.js +915 -915
  213. package/server/routes/qwen.js +27 -27
  214. package/server/routes/settings.js +286 -286
  215. package/server/routes/taskmaster.js +1496 -1471
  216. package/server/routes/telegram.js +125 -125
  217. package/server/routes/user.js +123 -123
  218. package/server/services/external-access.js +171 -171
  219. package/server/services/install-jobs.js +571 -571
  220. package/server/services/notification-orchestrator.js +242 -242
  221. package/server/services/provider-credentials.js +189 -189
  222. package/server/services/provider-models.js +381 -381
  223. package/server/services/telegram/bot.js +279 -279
  224. package/server/services/telegram/telegram-http-client.js +130 -130
  225. package/server/services/telegram/translations.js +170 -170
  226. package/server/services/vapid-keys.js +36 -36
  227. package/server/sessionManager.js +225 -225
  228. package/server/shared/interfaces.ts +54 -54
  229. package/server/shared/types.ts +172 -172
  230. package/server/shared/utils.ts +193 -193
  231. package/server/tsconfig.json +36 -36
  232. package/server/utils/colors.js +21 -21
  233. package/server/utils/commandParser.js +303 -303
  234. package/server/utils/frontmatter.js +18 -18
  235. package/server/utils/gitConfig.js +34 -34
  236. package/server/utils/mcp-detector.js +147 -147
  237. package/server/utils/plugin-loader.js +457 -457
  238. package/server/utils/plugin-process-manager.js +184 -184
  239. package/server/utils/port-access.js +209 -209
  240. package/server/utils/runtime-paths.js +37 -37
  241. package/server/utils/taskmaster-websocket.js +128 -128
  242. package/server/utils/url-detection.js +71 -71
  243. package/server/vite-daemon.js +78 -78
  244. package/shared/modelConstants.js +162 -162
  245. package/shared/networkHosts.js +22 -22
  246. package/dist/assets/index-B1ghfb4w.css +0 -32
  247. package/dist/assets/index-BvClqlMf.js +0 -852
@@ -1,139 +1,139 @@
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
- import bcrypt from 'bcryptjs';
7
- import { userDb, db } from '../database/db.js';
8
- import { generateToken, authenticateToken } from '../middleware/auth.js';
9
-
10
- const router = express.Router();
11
-
12
- // Check auth status and setup requirements
13
- router.get('/status', async (req, res) => {
14
- try {
15
- const hasUsers = await userDb.hasUsers();
16
- res.json({
17
- needsSetup: !hasUsers,
18
- isAuthenticated: false // Will be overridden by frontend if token exists
19
- });
20
- } catch (error) {
21
- console.error('Auth status error:', error);
22
- res.status(500).json({ error: 'Internal server error' });
23
- }
24
- });
25
-
26
- // User registration (setup) - only allowed if no users exist
27
- router.post('/register', async (req, res) => {
28
- try {
29
- const { username, password } = req.body;
30
-
31
- // Validate input
32
- if (!username || !password) {
33
- return res.status(400).json({ error: 'Username and password are required' });
34
- }
35
-
36
- if (username.length < 3 || password.length < 6) {
37
- return res.status(400).json({ error: 'Username must be at least 3 characters, password at least 6 characters' });
38
- }
39
-
40
- // Use a transaction to prevent race conditions
41
- db.prepare('BEGIN').run();
42
- try {
43
- // Check if users already exist (only allow one user)
44
- const hasUsers = userDb.hasUsers();
45
- if (hasUsers) {
46
- db.prepare('ROLLBACK').run();
47
- return res.status(403).json({ error: 'User already exists. This is a single-user system.' });
48
- }
49
-
50
- // Hash password
51
- const saltRounds = 12;
52
- const passwordHash = await bcrypt.hash(password, saltRounds);
53
-
54
- // Create user
55
- const user = userDb.createUser(username, passwordHash);
56
-
57
- // Generate token
58
- const token = generateToken(user);
59
-
60
- db.prepare('COMMIT').run();
61
-
62
- // Update last login (non-fatal, outside transaction)
63
- userDb.updateLastLogin(user.id);
64
-
65
- res.json({
66
- success: true,
67
- user: { id: user.id, username: user.username },
68
- token
69
- });
70
- } catch (error) {
71
- db.prepare('ROLLBACK').run();
72
- throw error;
73
- }
74
-
75
- } catch (error) {
76
- console.error('Registration error:', error);
77
- if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {
78
- res.status(409).json({ error: 'Username already exists' });
79
- } else {
80
- res.status(500).json({ error: 'Internal server error' });
81
- }
82
- }
83
- });
84
-
85
- // User login
86
- router.post('/login', async (req, res) => {
87
- try {
88
- const { username, password } = req.body;
89
-
90
- // Validate input
91
- if (!username || !password) {
92
- return res.status(400).json({ error: 'Username and password are required' });
93
- }
94
-
95
- // Get user from database
96
- const user = userDb.getUserByUsername(username);
97
- if (!user) {
98
- return res.status(401).json({ error: 'Invalid username or password' });
99
- }
100
-
101
- // Verify password
102
- const isValidPassword = await bcrypt.compare(password, user.password_hash);
103
- if (!isValidPassword) {
104
- return res.status(401).json({ error: 'Invalid username or password' });
105
- }
106
-
107
- // Generate token
108
- const token = generateToken(user);
109
-
110
- // Update last login
111
- userDb.updateLastLogin(user.id);
112
-
113
- res.json({
114
- success: true,
115
- user: { id: user.id, username: user.username },
116
- token
117
- });
118
-
119
- } catch (error) {
120
- console.error('Login error:', error);
121
- res.status(500).json({ error: 'Internal server error' });
122
- }
123
- });
124
-
125
- // Get current user (protected route)
126
- router.get('/user', authenticateToken, (req, res) => {
127
- res.json({
128
- user: req.user
129
- });
130
- });
131
-
132
- // Logout (client-side token removal, but this endpoint can be used for logging)
133
- router.post('/logout', authenticateToken, (req, res) => {
134
- // In a simple JWT system, logout is mainly client-side
135
- // This endpoint exists for consistency and potential future logging
136
- res.json({ success: true, message: 'Logged out successfully' });
137
- });
138
-
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
+ import bcrypt from 'bcryptjs';
7
+ import { userDb, db } from '../database/db.js';
8
+ import { generateToken, authenticateToken } from '../middleware/auth.js';
9
+
10
+ const router = express.Router();
11
+
12
+ // Check auth status and setup requirements
13
+ router.get('/status', async (req, res) => {
14
+ try {
15
+ const hasUsers = await userDb.hasUsers();
16
+ res.json({
17
+ needsSetup: !hasUsers,
18
+ isAuthenticated: false // Will be overridden by frontend if token exists
19
+ });
20
+ } catch (error) {
21
+ console.error('Auth status error:', error);
22
+ res.status(500).json({ error: 'Internal server error' });
23
+ }
24
+ });
25
+
26
+ // User registration (setup) - only allowed if no users exist
27
+ router.post('/register', async (req, res) => {
28
+ try {
29
+ const { username, password } = req.body;
30
+
31
+ // Validate input
32
+ if (!username || !password) {
33
+ return res.status(400).json({ error: 'Username and password are required' });
34
+ }
35
+
36
+ if (username.length < 3 || password.length < 6) {
37
+ return res.status(400).json({ error: 'Username must be at least 3 characters, password at least 6 characters' });
38
+ }
39
+
40
+ // Use a transaction to prevent race conditions
41
+ db.prepare('BEGIN').run();
42
+ try {
43
+ // Check if users already exist (only allow one user)
44
+ const hasUsers = userDb.hasUsers();
45
+ if (hasUsers) {
46
+ db.prepare('ROLLBACK').run();
47
+ return res.status(403).json({ error: 'User already exists. This is a single-user system.' });
48
+ }
49
+
50
+ // Hash password
51
+ const saltRounds = 12;
52
+ const passwordHash = await bcrypt.hash(password, saltRounds);
53
+
54
+ // Create user
55
+ const user = userDb.createUser(username, passwordHash);
56
+
57
+ // Generate token
58
+ const token = generateToken(user);
59
+
60
+ db.prepare('COMMIT').run();
61
+
62
+ // Update last login (non-fatal, outside transaction)
63
+ userDb.updateLastLogin(user.id);
64
+
65
+ res.json({
66
+ success: true,
67
+ user: { id: user.id, username: user.username },
68
+ token
69
+ });
70
+ } catch (error) {
71
+ db.prepare('ROLLBACK').run();
72
+ throw error;
73
+ }
74
+
75
+ } catch (error) {
76
+ console.error('Registration error:', error);
77
+ if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {
78
+ res.status(409).json({ error: 'Username already exists' });
79
+ } else {
80
+ res.status(500).json({ error: 'Internal server error' });
81
+ }
82
+ }
83
+ });
84
+
85
+ // User login
86
+ router.post('/login', async (req, res) => {
87
+ try {
88
+ const { username, password } = req.body;
89
+
90
+ // Validate input
91
+ if (!username || !password) {
92
+ return res.status(400).json({ error: 'Username and password are required' });
93
+ }
94
+
95
+ // Get user from database
96
+ const user = userDb.getUserByUsername(username);
97
+ if (!user) {
98
+ return res.status(401).json({ error: 'Invalid username or password' });
99
+ }
100
+
101
+ // Verify password
102
+ const isValidPassword = await bcrypt.compare(password, user.password_hash);
103
+ if (!isValidPassword) {
104
+ return res.status(401).json({ error: 'Invalid username or password' });
105
+ }
106
+
107
+ // Generate token
108
+ const token = generateToken(user);
109
+
110
+ // Update last login
111
+ userDb.updateLastLogin(user.id);
112
+
113
+ res.json({
114
+ success: true,
115
+ user: { id: user.id, username: user.username },
116
+ token
117
+ });
118
+
119
+ } catch (error) {
120
+ console.error('Login error:', error);
121
+ res.status(500).json({ error: 'Internal server error' });
122
+ }
123
+ });
124
+
125
+ // Get current user (protected route)
126
+ router.get('/user', authenticateToken, (req, res) => {
127
+ res.json({
128
+ user: req.user
129
+ });
130
+ });
131
+
132
+ // Logout (client-side token removal, but this endpoint can be used for logging)
133
+ router.post('/logout', authenticateToken, (req, res) => {
134
+ // In a simple JWT system, logout is mainly client-side
135
+ // This endpoint exists for consistency and potential future logging
136
+ res.json({ success: true, message: 'Logged out successfully' });
137
+ });
138
+
139
139
  export default router;
@@ -1,19 +1,19 @@
1
- import express from 'express';
2
- import { deleteCodexSession } from '../projects.js';
3
- import { sessionNamesDb } from '../database/db.js';
4
-
5
- const router = express.Router();
6
-
7
- router.delete('/sessions/:sessionId', async (req, res) => {
8
- try {
9
- const { sessionId } = req.params;
10
- await deleteCodexSession(sessionId);
11
- sessionNamesDb.deleteName(sessionId, 'codex');
12
- res.json({ success: true });
13
- } catch (error) {
14
- console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);
15
- res.status(500).json({ success: false, error: error.message });
16
- }
17
- });
18
-
19
- export default router;
1
+ import express from 'express';
2
+ import { deleteCodexSession } from '../projects.js';
3
+ import { sessionNamesDb } from '../database/db.js';
4
+
5
+ const router = express.Router();
6
+
7
+ router.delete('/sessions/:sessionId', async (req, res) => {
8
+ try {
9
+ const { sessionId } = req.params;
10
+ await deleteCodexSession(sessionId);
11
+ sessionNamesDb.deleteName(sessionId, 'codex');
12
+ res.json({ success: true });
13
+ } catch (error) {
14
+ console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);
15
+ res.status(500).json({ success: false, error: error.message });
16
+ }
17
+ });
18
+
19
+ export default router;