claudedesk 1.0.0

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 (182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +431 -0
  3. package/config/repos.example.json +128 -0
  4. package/config/settings.example.json +64 -0
  5. package/config/skills/code-review.md +76 -0
  6. package/config/skills/full-check.md +26 -0
  7. package/config/skills/lint-fix.md +23 -0
  8. package/dist/api/agent-routes.d.ts +2 -0
  9. package/dist/api/agent-routes.d.ts.map +1 -0
  10. package/dist/api/agent-routes.js +251 -0
  11. package/dist/api/agent-routes.js.map +1 -0
  12. package/dist/api/app-routes.d.ts +2 -0
  13. package/dist/api/app-routes.d.ts.map +1 -0
  14. package/dist/api/app-routes.js +150 -0
  15. package/dist/api/app-routes.js.map +1 -0
  16. package/dist/api/docker-routes.d.ts +2 -0
  17. package/dist/api/docker-routes.d.ts.map +1 -0
  18. package/dist/api/docker-routes.js +167 -0
  19. package/dist/api/docker-routes.js.map +1 -0
  20. package/dist/api/middleware.d.ts +6 -0
  21. package/dist/api/middleware.d.ts.map +1 -0
  22. package/dist/api/middleware.js +293 -0
  23. package/dist/api/middleware.js.map +1 -0
  24. package/dist/api/pin-auth.d.ts +65 -0
  25. package/dist/api/pin-auth.d.ts.map +1 -0
  26. package/dist/api/pin-auth.js +218 -0
  27. package/dist/api/pin-auth.js.map +1 -0
  28. package/dist/api/routes.d.ts +2 -0
  29. package/dist/api/routes.d.ts.map +1 -0
  30. package/dist/api/routes.js +473 -0
  31. package/dist/api/routes.js.map +1 -0
  32. package/dist/api/settings-routes.d.ts +2 -0
  33. package/dist/api/settings-routes.d.ts.map +1 -0
  34. package/dist/api/settings-routes.js +570 -0
  35. package/dist/api/settings-routes.js.map +1 -0
  36. package/dist/api/skill-routes.d.ts +2 -0
  37. package/dist/api/skill-routes.d.ts.map +1 -0
  38. package/dist/api/skill-routes.js +88 -0
  39. package/dist/api/skill-routes.js.map +1 -0
  40. package/dist/api/terminal-routes.d.ts +2 -0
  41. package/dist/api/terminal-routes.d.ts.map +1 -0
  42. package/dist/api/terminal-routes.js +3524 -0
  43. package/dist/api/terminal-routes.js.map +1 -0
  44. package/dist/api/tunnel-routes.d.ts +2 -0
  45. package/dist/api/tunnel-routes.d.ts.map +1 -0
  46. package/dist/api/tunnel-routes.js +196 -0
  47. package/dist/api/tunnel-routes.js.map +1 -0
  48. package/dist/api/workspace-routes.d.ts +3 -0
  49. package/dist/api/workspace-routes.d.ts.map +1 -0
  50. package/dist/api/workspace-routes.js +649 -0
  51. package/dist/api/workspace-routes.js.map +1 -0
  52. package/dist/cli.d.ts +3 -0
  53. package/dist/cli.d.ts.map +1 -0
  54. package/dist/cli.js +276 -0
  55. package/dist/cli.js.map +1 -0
  56. package/dist/client/assets/index-B4r0njGe.js +780 -0
  57. package/dist/client/assets/index-CY_9MyE0.css +1 -0
  58. package/dist/client/favicon.svg +5 -0
  59. package/dist/client/icons/icon-192.svg +5 -0
  60. package/dist/client/icons/icon-512.svg +5 -0
  61. package/dist/client/icons/logo-with-message.png +0 -0
  62. package/dist/client/icons/logo.png +0 -0
  63. package/dist/client/index.html +25 -0
  64. package/dist/client/manifest.json +62 -0
  65. package/dist/client/sw.js +243 -0
  66. package/dist/config/agent-usage.d.ts +34 -0
  67. package/dist/config/agent-usage.d.ts.map +1 -0
  68. package/dist/config/agent-usage.js +87 -0
  69. package/dist/config/agent-usage.js.map +1 -0
  70. package/dist/config/repos.d.ts +34 -0
  71. package/dist/config/repos.d.ts.map +1 -0
  72. package/dist/config/repos.js +412 -0
  73. package/dist/config/repos.js.map +1 -0
  74. package/dist/config/settings.d.ts +634 -0
  75. package/dist/config/settings.d.ts.map +1 -0
  76. package/dist/config/settings.js +459 -0
  77. package/dist/config/settings.js.map +1 -0
  78. package/dist/config/skills.d.ts +18 -0
  79. package/dist/config/skills.d.ts.map +1 -0
  80. package/dist/config/skills.js +174 -0
  81. package/dist/config/skills.js.map +1 -0
  82. package/dist/config/workspaces.d.ts +961 -0
  83. package/dist/config/workspaces.d.ts.map +1 -0
  84. package/dist/config/workspaces.js +482 -0
  85. package/dist/config/workspaces.js.map +1 -0
  86. package/dist/core/app-manager.d.ts +85 -0
  87. package/dist/core/app-manager.d.ts.map +1 -0
  88. package/dist/core/app-manager.js +447 -0
  89. package/dist/core/app-manager.js.map +1 -0
  90. package/dist/core/claude-invoker.d.ts +49 -0
  91. package/dist/core/claude-invoker.d.ts.map +1 -0
  92. package/dist/core/claude-invoker.js +583 -0
  93. package/dist/core/claude-invoker.js.map +1 -0
  94. package/dist/core/claude-session-reader.d.ts +25 -0
  95. package/dist/core/claude-session-reader.d.ts.map +1 -0
  96. package/dist/core/claude-session-reader.js +184 -0
  97. package/dist/core/claude-session-reader.js.map +1 -0
  98. package/dist/core/claude-usage-query.d.ts +78 -0
  99. package/dist/core/claude-usage-query.d.ts.map +1 -0
  100. package/dist/core/claude-usage-query.js +294 -0
  101. package/dist/core/claude-usage-query.js.map +1 -0
  102. package/dist/core/git-credential-helper.d.ts +57 -0
  103. package/dist/core/git-credential-helper.d.ts.map +1 -0
  104. package/dist/core/git-credential-helper.js +176 -0
  105. package/dist/core/git-credential-helper.js.map +1 -0
  106. package/dist/core/git-sandbox.d.ts +135 -0
  107. package/dist/core/git-sandbox.d.ts.map +1 -0
  108. package/dist/core/git-sandbox.js +907 -0
  109. package/dist/core/git-sandbox.js.map +1 -0
  110. package/dist/core/github-integration.d.ts +66 -0
  111. package/dist/core/github-integration.d.ts.map +1 -0
  112. package/dist/core/github-integration.js +350 -0
  113. package/dist/core/github-integration.js.map +1 -0
  114. package/dist/core/github-oauth.d.ts +88 -0
  115. package/dist/core/github-oauth.d.ts.map +1 -0
  116. package/dist/core/github-oauth.js +244 -0
  117. package/dist/core/github-oauth.js.map +1 -0
  118. package/dist/core/gitlab-integration.d.ts +66 -0
  119. package/dist/core/gitlab-integration.d.ts.map +1 -0
  120. package/dist/core/gitlab-integration.js +353 -0
  121. package/dist/core/gitlab-integration.js.map +1 -0
  122. package/dist/core/gitlab-oauth.d.ts +100 -0
  123. package/dist/core/gitlab-oauth.d.ts.map +1 -0
  124. package/dist/core/gitlab-oauth.js +366 -0
  125. package/dist/core/gitlab-oauth.js.map +1 -0
  126. package/dist/core/insights-extractor.d.ts +68 -0
  127. package/dist/core/insights-extractor.d.ts.map +1 -0
  128. package/dist/core/insights-extractor.js +402 -0
  129. package/dist/core/insights-extractor.js.map +1 -0
  130. package/dist/core/logger.d.ts +27 -0
  131. package/dist/core/logger.d.ts.map +1 -0
  132. package/dist/core/logger.js +70 -0
  133. package/dist/core/logger.js.map +1 -0
  134. package/dist/core/process-runner.d.ts +27 -0
  135. package/dist/core/process-runner.d.ts.map +1 -0
  136. package/dist/core/process-runner.js +147 -0
  137. package/dist/core/process-runner.js.map +1 -0
  138. package/dist/core/project-detector.d.ts +30 -0
  139. package/dist/core/project-detector.d.ts.map +1 -0
  140. package/dist/core/project-detector.js +482 -0
  141. package/dist/core/project-detector.js.map +1 -0
  142. package/dist/core/qr-generator.d.ts +18 -0
  143. package/dist/core/qr-generator.d.ts.map +1 -0
  144. package/dist/core/qr-generator.js +61 -0
  145. package/dist/core/qr-generator.js.map +1 -0
  146. package/dist/core/remote-tunnel-manager.d.ts +59 -0
  147. package/dist/core/remote-tunnel-manager.d.ts.map +1 -0
  148. package/dist/core/remote-tunnel-manager.js +235 -0
  149. package/dist/core/remote-tunnel-manager.js.map +1 -0
  150. package/dist/core/shared-docker-manager.d.ts +41 -0
  151. package/dist/core/shared-docker-manager.d.ts.map +1 -0
  152. package/dist/core/shared-docker-manager.js +409 -0
  153. package/dist/core/shared-docker-manager.js.map +1 -0
  154. package/dist/core/skill-executor.d.ts +25 -0
  155. package/dist/core/skill-executor.d.ts.map +1 -0
  156. package/dist/core/skill-executor.js +171 -0
  157. package/dist/core/skill-executor.js.map +1 -0
  158. package/dist/core/terminal-session.d.ts +149 -0
  159. package/dist/core/terminal-session.d.ts.map +1 -0
  160. package/dist/core/terminal-session.js +2340 -0
  161. package/dist/core/terminal-session.js.map +1 -0
  162. package/dist/core/tunnel-manager.d.ts +35 -0
  163. package/dist/core/tunnel-manager.d.ts.map +1 -0
  164. package/dist/core/tunnel-manager.js +137 -0
  165. package/dist/core/tunnel-manager.js.map +1 -0
  166. package/dist/core/usage-manager.d.ts +57 -0
  167. package/dist/core/usage-manager.d.ts.map +1 -0
  168. package/dist/core/usage-manager.js +363 -0
  169. package/dist/core/usage-manager.js.map +1 -0
  170. package/dist/core/ws-manager.d.ts +39 -0
  171. package/dist/core/ws-manager.d.ts.map +1 -0
  172. package/dist/core/ws-manager.js +190 -0
  173. package/dist/core/ws-manager.js.map +1 -0
  174. package/dist/index.d.ts +7 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +229 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/types.d.ts +868 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +119 -0
  181. package/dist/types.js.map +1 -0
  182. package/package.json +96 -0
@@ -0,0 +1,570 @@
1
+ import { Router } from 'express';
2
+ import { existsSync, statSync, readdirSync } from 'fs';
3
+ import { join, dirname, sep } from 'path';
4
+ import { homedir } from 'os';
5
+ import { settingsManager } from '../config/settings.js';
6
+ import { workspaceManager } from '../config/workspaces.js';
7
+ import { GitHubDeviceAuth } from '../core/github-oauth.js';
8
+ import { GitLabDeviceAuth } from '../core/gitlab-oauth.js';
9
+ import net from 'net';
10
+ export const settingsRouter = Router();
11
+ // Get all settings
12
+ settingsRouter.get('/', (_req, res) => {
13
+ const settings = settingsManager.get();
14
+ res.json({ success: true, data: settings });
15
+ });
16
+ // Update settings (partial update)
17
+ settingsRouter.put('/', (req, res) => {
18
+ try {
19
+ const updates = req.body;
20
+ const settings = settingsManager.update(updates);
21
+ res.json({ success: true, data: settings });
22
+ }
23
+ catch (error) {
24
+ const errorMsg = error instanceof Error ? error.message : String(error);
25
+ res.status(400).json({ success: false, error: errorMsg });
26
+ }
27
+ });
28
+ // Get general settings
29
+ settingsRouter.get('/general', (_req, res) => {
30
+ const general = settingsManager.getGeneral();
31
+ res.json({ success: true, data: general });
32
+ });
33
+ // Update general settings
34
+ settingsRouter.put('/general', (req, res) => {
35
+ try {
36
+ const updates = req.body;
37
+ const general = settingsManager.updateGeneral(updates);
38
+ res.json({ success: true, data: general });
39
+ }
40
+ catch (error) {
41
+ const errorMsg = error instanceof Error ? error.message : String(error);
42
+ res.status(400).json({ success: false, error: errorMsg });
43
+ }
44
+ });
45
+ // Get Claude settings (SEC-04: Permission modes)
46
+ settingsRouter.get('/claude', (_req, res) => {
47
+ const claude = settingsManager.getClaude();
48
+ res.json({ success: true, data: claude });
49
+ });
50
+ // Update Claude settings (SEC-04: Permission modes)
51
+ settingsRouter.put('/claude', (req, res) => {
52
+ try {
53
+ const updates = req.body;
54
+ const claude = settingsManager.updateClaude(updates);
55
+ res.json({ success: true, data: claude });
56
+ }
57
+ catch (error) {
58
+ const errorMsg = error instanceof Error ? error.message : String(error);
59
+ res.status(400).json({ success: false, error: errorMsg });
60
+ }
61
+ });
62
+ // Get voice settings
63
+ settingsRouter.get('/voice', (_req, res) => {
64
+ const voice = settingsManager.getVoice();
65
+ res.json({ success: true, data: voice });
66
+ });
67
+ // Update voice settings
68
+ settingsRouter.put('/voice', (req, res) => {
69
+ try {
70
+ const updates = req.body;
71
+ const voice = settingsManager.updateVoice(updates);
72
+ res.json({ success: true, data: voice });
73
+ }
74
+ catch (error) {
75
+ const errorMsg = error instanceof Error ? error.message : String(error);
76
+ res.status(400).json({ success: false, error: errorMsg });
77
+ }
78
+ });
79
+ // Get notification settings
80
+ settingsRouter.get('/notifications', (_req, res) => {
81
+ const notifications = settingsManager.getNotifications();
82
+ res.json({ success: true, data: notifications });
83
+ });
84
+ // Update notification settings
85
+ settingsRouter.put('/notifications', (req, res) => {
86
+ try {
87
+ const updates = req.body;
88
+ const notifications = settingsManager.updateNotifications(updates);
89
+ res.json({ success: true, data: notifications });
90
+ }
91
+ catch (error) {
92
+ const errorMsg = error instanceof Error ? error.message : String(error);
93
+ res.status(400).json({ success: false, error: errorMsg });
94
+ }
95
+ });
96
+ // Get GitHub settings
97
+ settingsRouter.get('/github', (_req, res) => {
98
+ const github = settingsManager.getGitHub();
99
+ res.json({ success: true, data: github });
100
+ });
101
+ // Update GitHub settings
102
+ settingsRouter.put('/github', (req, res) => {
103
+ try {
104
+ const updates = req.body;
105
+ const github = settingsManager.updateGitHub(updates);
106
+ res.json({ success: true, data: github });
107
+ }
108
+ catch (error) {
109
+ const errorMsg = error instanceof Error ? error.message : String(error);
110
+ res.status(400).json({ success: false, error: errorMsg });
111
+ }
112
+ });
113
+ // Get GitLab settings
114
+ settingsRouter.get('/gitlab', (_req, res) => {
115
+ const gitlab = settingsManager.getGitLab();
116
+ res.json({ success: true, data: gitlab });
117
+ });
118
+ // Update GitLab settings
119
+ settingsRouter.put('/gitlab', (req, res) => {
120
+ try {
121
+ const updates = req.body;
122
+ const gitlab = settingsManager.updateGitLab(updates);
123
+ res.json({ success: true, data: gitlab });
124
+ }
125
+ catch (error) {
126
+ const errorMsg = error instanceof Error ? error.message : String(error);
127
+ res.status(400).json({ success: false, error: errorMsg });
128
+ }
129
+ });
130
+ // Get Agents settings
131
+ settingsRouter.get('/agents', (_req, res) => {
132
+ const agents = settingsManager.getAgents();
133
+ res.json({ success: true, data: agents });
134
+ });
135
+ // Update Agents settings
136
+ settingsRouter.put('/agents', (req, res) => {
137
+ try {
138
+ const updates = req.body;
139
+ const agents = settingsManager.updateAgents(updates);
140
+ res.json({ success: true, data: agents });
141
+ }
142
+ catch (error) {
143
+ const errorMsg = error instanceof Error ? error.message : String(error);
144
+ res.status(400).json({ success: false, error: errorMsg });
145
+ }
146
+ });
147
+ // Get favorites
148
+ settingsRouter.get('/favorites', (_req, res) => {
149
+ const favorites = settingsManager.getFavorites();
150
+ res.json({ success: true, data: favorites });
151
+ });
152
+ // Add favorite repo
153
+ settingsRouter.post('/favorites/repos/:repoId', (req, res) => {
154
+ const { repoId } = req.params;
155
+ settingsManager.addFavoriteRepo(repoId);
156
+ res.json({ success: true, data: settingsManager.getFavorites() });
157
+ });
158
+ // Remove favorite repo
159
+ settingsRouter.delete('/favorites/repos/:repoId', (req, res) => {
160
+ const { repoId } = req.params;
161
+ settingsManager.removeFavoriteRepo(repoId);
162
+ res.json({ success: true, data: settingsManager.getFavorites() });
163
+ });
164
+ // Track recent repo usage
165
+ settingsRouter.post('/favorites/recent/:repoId', (req, res) => {
166
+ const { repoId } = req.params;
167
+ settingsManager.addRecentRepo(repoId);
168
+ res.json({ success: true, data: settingsManager.getFavorites() });
169
+ });
170
+ // Reset settings to defaults
171
+ settingsRouter.post('/reset', (_req, res) => {
172
+ const settings = settingsManager.reset();
173
+ res.json({ success: true, data: settings });
174
+ });
175
+ // Get pinned agents
176
+ settingsRouter.get('/agents', (_req, res) => {
177
+ const agents = settingsManager.getAgents();
178
+ res.json({ success: true, data: agents });
179
+ });
180
+ // Update pinned agents
181
+ settingsRouter.put('/agents', (req, res) => {
182
+ try {
183
+ const updates = req.body;
184
+ const agents = settingsManager.updateAgents(updates);
185
+ res.json({ success: true, data: agents });
186
+ }
187
+ catch (error) {
188
+ const errorMsg = error instanceof Error ? error.message : String(error);
189
+ res.status(400).json({ success: false, error: errorMsg });
190
+ }
191
+ });
192
+ // ============================================
193
+ // Path Validation
194
+ // ============================================
195
+ /**
196
+ * POST /validate-path
197
+ * Validates if a path exists, is a directory, and is not already used by a workspace
198
+ */
199
+ settingsRouter.post('/validate-path', (req, res) => {
200
+ try {
201
+ const { path, excludeWorkspaceId } = req.body;
202
+ if (!path || typeof path !== 'string') {
203
+ return res.status(400).json({
204
+ success: false,
205
+ error: 'Path is required',
206
+ });
207
+ }
208
+ // Check if path exists
209
+ if (!existsSync(path)) {
210
+ return res.json({
211
+ success: true,
212
+ data: {
213
+ valid: false,
214
+ error: 'Path does not exist',
215
+ },
216
+ });
217
+ }
218
+ // Check if path is a directory
219
+ try {
220
+ const stat = statSync(path);
221
+ if (!stat.isDirectory()) {
222
+ return res.json({
223
+ success: true,
224
+ data: {
225
+ valid: false,
226
+ error: 'Path is not a directory',
227
+ },
228
+ });
229
+ }
230
+ }
231
+ catch {
232
+ return res.json({
233
+ success: true,
234
+ data: {
235
+ valid: false,
236
+ error: 'Cannot access path',
237
+ },
238
+ });
239
+ }
240
+ // Check if path is already used by another workspace
241
+ const workspaces = workspaceManager.getAll();
242
+ const duplicate = workspaces.find((ws) => ws.scanPath === path && ws.id !== excludeWorkspaceId);
243
+ if (duplicate) {
244
+ return res.json({
245
+ success: true,
246
+ data: {
247
+ valid: false,
248
+ error: `Path is already used by workspace "${duplicate.name}"`,
249
+ },
250
+ });
251
+ }
252
+ res.json({
253
+ success: true,
254
+ data: {
255
+ valid: true,
256
+ },
257
+ });
258
+ }
259
+ catch (error) {
260
+ const errorMsg = error instanceof Error ? error.message : String(error);
261
+ res.status(500).json({ success: false, error: errorMsg });
262
+ }
263
+ });
264
+ // ============================================
265
+ // OAuth Connection Testing
266
+ // ============================================
267
+ /**
268
+ * POST /github/test
269
+ * Tests GitHub OAuth connection by verifying the stored token
270
+ */
271
+ settingsRouter.post('/github/test', async (req, res) => {
272
+ try {
273
+ const { workspaceId } = req.body;
274
+ if (!workspaceId) {
275
+ return res.status(400).json({
276
+ success: false,
277
+ error: 'Workspace ID is required',
278
+ });
279
+ }
280
+ const workspace = workspaceManager.get(workspaceId);
281
+ if (!workspace) {
282
+ return res.status(404).json({
283
+ success: false,
284
+ error: 'Workspace not found',
285
+ });
286
+ }
287
+ // Get the decrypted token
288
+ const githubToken = workspaceManager.getGitHubToken(workspaceId);
289
+ if (!githubToken) {
290
+ return res.json({
291
+ success: true,
292
+ data: {
293
+ connected: false,
294
+ error: 'No GitHub connection configured',
295
+ },
296
+ });
297
+ }
298
+ // Verify the token by making an API call
299
+ const settings = settingsManager.get();
300
+ if (!settings.github?.clientId) {
301
+ return res.json({
302
+ success: true,
303
+ data: {
304
+ connected: false,
305
+ error: 'GitHub OAuth not configured in settings',
306
+ },
307
+ });
308
+ }
309
+ const auth = new GitHubDeviceAuth(settings.github.clientId);
310
+ const isValid = await auth.verifyToken(githubToken);
311
+ const githubCredentials = workspaceManager.getGitHubCredentials(workspaceId);
312
+ if (isValid) {
313
+ res.json({
314
+ success: true,
315
+ data: {
316
+ connected: true,
317
+ username: githubCredentials?.username || 'Unknown',
318
+ },
319
+ });
320
+ }
321
+ else {
322
+ res.json({
323
+ success: true,
324
+ data: {
325
+ connected: false,
326
+ error: 'Token is invalid or expired',
327
+ },
328
+ });
329
+ }
330
+ }
331
+ catch (error) {
332
+ const errorMsg = error instanceof Error ? error.message : String(error);
333
+ res.status(500).json({ success: false, error: errorMsg });
334
+ }
335
+ });
336
+ /**
337
+ * POST /gitlab/test
338
+ * Tests GitLab OAuth connection by verifying the stored token
339
+ */
340
+ settingsRouter.post('/gitlab/test', async (req, res) => {
341
+ try {
342
+ const { workspaceId } = req.body;
343
+ if (!workspaceId) {
344
+ return res.status(400).json({
345
+ success: false,
346
+ error: 'Workspace ID is required',
347
+ });
348
+ }
349
+ const workspace = workspaceManager.get(workspaceId);
350
+ if (!workspace) {
351
+ return res.status(404).json({
352
+ success: false,
353
+ error: 'Workspace not found',
354
+ });
355
+ }
356
+ // Get the decrypted token
357
+ const gitlabTokenData = workspaceManager.getGitLabToken(workspaceId);
358
+ if (!gitlabTokenData) {
359
+ return res.json({
360
+ success: true,
361
+ data: {
362
+ connected: false,
363
+ error: 'No GitLab connection configured',
364
+ },
365
+ });
366
+ }
367
+ // Verify the token by making an API call
368
+ const settings = settingsManager.get();
369
+ if (!settings.gitlab?.clientId) {
370
+ return res.json({
371
+ success: true,
372
+ data: {
373
+ connected: false,
374
+ error: 'GitLab OAuth not configured in settings',
375
+ },
376
+ });
377
+ }
378
+ const auth = new GitLabDeviceAuth(settings.gitlab.clientId);
379
+ const isValid = await auth.verifyToken(gitlabTokenData.accessToken);
380
+ const gitlabCredentials = workspaceManager.getGitLabCredentials(workspaceId);
381
+ if (isValid) {
382
+ res.json({
383
+ success: true,
384
+ data: {
385
+ connected: true,
386
+ username: gitlabCredentials?.username || 'Unknown',
387
+ },
388
+ });
389
+ }
390
+ else {
391
+ res.json({
392
+ success: true,
393
+ data: {
394
+ connected: false,
395
+ error: 'Token is invalid or expired',
396
+ },
397
+ });
398
+ }
399
+ }
400
+ catch (error) {
401
+ const errorMsg = error instanceof Error ? error.message : String(error);
402
+ res.status(500).json({ success: false, error: errorMsg });
403
+ }
404
+ });
405
+ // ============================================
406
+ // Port Conflict Detection
407
+ // ============================================
408
+ /**
409
+ * Helper to check if a port is in use
410
+ */
411
+ function checkPortInUse(port) {
412
+ return new Promise((resolve) => {
413
+ const server = net.createServer();
414
+ server.once('error', (err) => {
415
+ if (err.code === 'EADDRINUSE') {
416
+ resolve(true);
417
+ }
418
+ else {
419
+ resolve(false);
420
+ }
421
+ });
422
+ server.once('listening', () => {
423
+ server.close();
424
+ resolve(false);
425
+ });
426
+ server.listen(port, '127.0.0.1');
427
+ });
428
+ }
429
+ /**
430
+ * GET /check-port
431
+ * Checks if a port is in use (for port conflict detection)
432
+ */
433
+ settingsRouter.get('/check-port', async (req, res) => {
434
+ try {
435
+ const port = parseInt(req.query.port, 10);
436
+ if (isNaN(port) || port < 1 || port > 65535) {
437
+ return res.status(400).json({
438
+ success: false,
439
+ error: 'Valid port number (1-65535) is required',
440
+ });
441
+ }
442
+ const inUse = await checkPortInUse(port);
443
+ res.json({
444
+ success: true,
445
+ data: {
446
+ port,
447
+ inUse,
448
+ },
449
+ });
450
+ }
451
+ catch (error) {
452
+ const errorMsg = error instanceof Error ? error.message : String(error);
453
+ res.status(500).json({ success: false, error: errorMsg });
454
+ }
455
+ });
456
+ /**
457
+ * GET /browse-directories
458
+ * Returns a list of directories at the specified path for web-based folder browsing
459
+ */
460
+ settingsRouter.get('/browse-directories', (req, res) => {
461
+ try {
462
+ const requestedPath = req.query.path;
463
+ // If no path specified, return common starting points based on OS
464
+ if (!requestedPath) {
465
+ const isWindows = process.platform === 'win32';
466
+ const startingPoints = [];
467
+ if (isWindows) {
468
+ // On Windows, dynamically detect available drive letters
469
+ const driveLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
470
+ for (const letter of driveLetters) {
471
+ const drivePath = `${letter}:${sep}`;
472
+ try {
473
+ if (existsSync(drivePath)) {
474
+ startingPoints.push({
475
+ name: `${letter}:`,
476
+ path: drivePath,
477
+ isDirectory: true,
478
+ });
479
+ }
480
+ }
481
+ catch {
482
+ // Skip inaccessible drives
483
+ continue;
484
+ }
485
+ }
486
+ }
487
+ else {
488
+ // On Unix-like systems, start from root and home
489
+ startingPoints.push({
490
+ name: 'Home',
491
+ path: homedir(),
492
+ isDirectory: true,
493
+ }, {
494
+ name: 'Root',
495
+ path: '/',
496
+ isDirectory: true,
497
+ });
498
+ }
499
+ return res.json({
500
+ success: true,
501
+ data: {
502
+ currentPath: null,
503
+ parentPath: null,
504
+ entries: startingPoints,
505
+ },
506
+ });
507
+ }
508
+ // Validate and normalize the path
509
+ if (!existsSync(requestedPath)) {
510
+ return res.status(400).json({
511
+ success: false,
512
+ error: 'Path does not exist',
513
+ });
514
+ }
515
+ const stat = statSync(requestedPath);
516
+ if (!stat.isDirectory()) {
517
+ return res.status(400).json({
518
+ success: false,
519
+ error: 'Path is not a directory',
520
+ });
521
+ }
522
+ // Read directory contents
523
+ const entries = [];
524
+ try {
525
+ const items = readdirSync(requestedPath);
526
+ for (const item of items) {
527
+ try {
528
+ const fullPath = join(requestedPath, item);
529
+ const itemStat = statSync(fullPath);
530
+ // Only include directories
531
+ if (itemStat.isDirectory()) {
532
+ entries.push({
533
+ name: item,
534
+ path: fullPath,
535
+ isDirectory: true,
536
+ });
537
+ }
538
+ }
539
+ catch (err) {
540
+ // Skip items we can't access (permission errors, etc.)
541
+ continue;
542
+ }
543
+ }
544
+ }
545
+ catch (err) {
546
+ return res.status(500).json({
547
+ success: false,
548
+ error: 'Cannot read directory contents',
549
+ });
550
+ }
551
+ // Sort directories alphabetically
552
+ entries.sort((a, b) => a.name.localeCompare(b.name));
553
+ // Get parent directory path
554
+ const parentPath = dirname(requestedPath);
555
+ const hasParent = parentPath !== requestedPath;
556
+ res.json({
557
+ success: true,
558
+ data: {
559
+ currentPath: requestedPath,
560
+ parentPath: hasParent ? parentPath : null,
561
+ entries,
562
+ },
563
+ });
564
+ }
565
+ catch (error) {
566
+ const errorMsg = error instanceof Error ? error.message : String(error);
567
+ res.status(500).json({ success: false, error: errorMsg });
568
+ }
569
+ });
570
+ //# sourceMappingURL=settings-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-routes.js","sourceRoot":"","sources":["../../src/api/settings-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const skillRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=skill-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-routes.d.ts","sourceRoot":"","sources":["../../src/api/skill-routes.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,4CAAW,CAAC"}