@burdenoff/vibe-agent 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 (100) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +22 -0
  3. package/README.md +290 -0
  4. package/dist/app.d.ts +15 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +445 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +1043 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/db/schema.d.ts +145 -0
  13. package/dist/db/schema.d.ts.map +1 -0
  14. package/dist/db/schema.js +536 -0
  15. package/dist/db/schema.js.map +1 -0
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +61 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/middleware/ModuleAuth.d.ts +61 -0
  21. package/dist/middleware/ModuleAuth.d.ts.map +1 -0
  22. package/dist/middleware/ModuleAuth.js +220 -0
  23. package/dist/middleware/ModuleAuth.js.map +1 -0
  24. package/dist/middleware/auth.d.ts +3 -0
  25. package/dist/middleware/auth.d.ts.map +1 -0
  26. package/dist/middleware/auth.js +11 -0
  27. package/dist/middleware/auth.js.map +1 -0
  28. package/dist/migrations/remove-notes-prompts.d.ts +13 -0
  29. package/dist/migrations/remove-notes-prompts.d.ts.map +1 -0
  30. package/dist/migrations/remove-notes-prompts.js +148 -0
  31. package/dist/migrations/remove-notes-prompts.js.map +1 -0
  32. package/dist/routes/bookmarks.d.ts +3 -0
  33. package/dist/routes/bookmarks.d.ts.map +1 -0
  34. package/dist/routes/bookmarks.js +186 -0
  35. package/dist/routes/bookmarks.js.map +1 -0
  36. package/dist/routes/config.d.ts +3 -0
  37. package/dist/routes/config.d.ts.map +1 -0
  38. package/dist/routes/config.js +108 -0
  39. package/dist/routes/config.js.map +1 -0
  40. package/dist/routes/files.d.ts +3 -0
  41. package/dist/routes/files.d.ts.map +1 -0
  42. package/dist/routes/files.js +471 -0
  43. package/dist/routes/files.js.map +1 -0
  44. package/dist/routes/git.d.ts +3 -0
  45. package/dist/routes/git.d.ts.map +1 -0
  46. package/dist/routes/git.js +498 -0
  47. package/dist/routes/git.js.map +1 -0
  48. package/dist/routes/moduleRegistry.d.ts +41 -0
  49. package/dist/routes/moduleRegistry.d.ts.map +1 -0
  50. package/dist/routes/moduleRegistry.js +356 -0
  51. package/dist/routes/moduleRegistry.js.map +1 -0
  52. package/dist/routes/notifications.d.ts +3 -0
  53. package/dist/routes/notifications.d.ts.map +1 -0
  54. package/dist/routes/notifications.js +250 -0
  55. package/dist/routes/notifications.js.map +1 -0
  56. package/dist/routes/port-forward.d.ts +3 -0
  57. package/dist/routes/port-forward.d.ts.map +1 -0
  58. package/dist/routes/port-forward.js +205 -0
  59. package/dist/routes/port-forward.js.map +1 -0
  60. package/dist/routes/projects.d.ts +3 -0
  61. package/dist/routes/projects.d.ts.map +1 -0
  62. package/dist/routes/projects.js +442 -0
  63. package/dist/routes/projects.js.map +1 -0
  64. package/dist/routes/ssh.d.ts +3 -0
  65. package/dist/routes/ssh.d.ts.map +1 -0
  66. package/dist/routes/ssh.js +192 -0
  67. package/dist/routes/ssh.js.map +1 -0
  68. package/dist/routes/tasks.d.ts +3 -0
  69. package/dist/routes/tasks.d.ts.map +1 -0
  70. package/dist/routes/tasks.js +183 -0
  71. package/dist/routes/tasks.js.map +1 -0
  72. package/dist/routes/tmux.d.ts +3 -0
  73. package/dist/routes/tmux.d.ts.map +1 -0
  74. package/dist/routes/tmux.js +1191 -0
  75. package/dist/routes/tmux.js.map +1 -0
  76. package/dist/routes/tunnel.d.ts +25 -0
  77. package/dist/routes/tunnel.d.ts.map +1 -0
  78. package/dist/routes/tunnel.js +449 -0
  79. package/dist/routes/tunnel.js.map +1 -0
  80. package/dist/services/ModulePermissions.d.ts +100 -0
  81. package/dist/services/ModulePermissions.d.ts.map +1 -0
  82. package/dist/services/ModulePermissions.js +312 -0
  83. package/dist/services/ModulePermissions.js.map +1 -0
  84. package/dist/services/ModuleRegistryService.d.ts +152 -0
  85. package/dist/services/ModuleRegistryService.d.ts.map +1 -0
  86. package/dist/services/ModuleRegistryService.js +522 -0
  87. package/dist/services/ModuleRegistryService.js.map +1 -0
  88. package/dist/services/agent.service.d.ts +19 -0
  89. package/dist/services/agent.service.d.ts.map +1 -0
  90. package/dist/services/agent.service.js +88 -0
  91. package/dist/services/agent.service.js.map +1 -0
  92. package/dist/services/bootstrap.d.ts +22 -0
  93. package/dist/services/bootstrap.d.ts.map +1 -0
  94. package/dist/services/bootstrap.js +206 -0
  95. package/dist/services/bootstrap.js.map +1 -0
  96. package/dist/services/service-manager.d.ts +50 -0
  97. package/dist/services/service-manager.d.ts.map +1 -0
  98. package/dist/services/service-manager.js +382 -0
  99. package/dist/services/service-manager.js.map +1 -0
  100. package/package.json +107 -0
@@ -0,0 +1,471 @@
1
+ import { promises as fs, readFileSync } from 'fs';
2
+ import path from 'path';
3
+ export const fileRoutes = async (fastify) => {
4
+ // Read file
5
+ fastify.post('/read', async (request, reply) => {
6
+ const { path: filePath, projectId, connectionId } = request.body;
7
+ try {
8
+ // Security check - prevent directory traversal
9
+ const normalizedPath = path.normalize(filePath);
10
+ if (normalizedPath.includes('..')) {
11
+ return reply.code(403).send({ error: 'Directory traversal not allowed' });
12
+ }
13
+ // Check for sensitive files
14
+ const sensitivePatterns = [
15
+ /\.env$/,
16
+ /\.pem$/,
17
+ /\.key$/,
18
+ /id_rsa/,
19
+ /\.ssh\//,
20
+ /\.git\/config$/,
21
+ /\.npmrc$/
22
+ ];
23
+ if (sensitivePatterns.some(pattern => pattern.test(normalizedPath))) {
24
+ return reply.code(403).send({ error: 'Access to sensitive files not allowed' });
25
+ }
26
+ if (connectionId) {
27
+ // Read remote file via SSH
28
+ return await readRemoteFile(fastify, connectionId, normalizedPath, reply);
29
+ }
30
+ else {
31
+ // Read local file
32
+ const content = await fs.readFile(normalizedPath, 'utf-8');
33
+ // Emit file read event
34
+ fastify.io.emit('file:read', {
35
+ path: normalizedPath,
36
+ projectId,
37
+ size: content.length
38
+ });
39
+ return {
40
+ content,
41
+ path: normalizedPath,
42
+ size: content.length
43
+ };
44
+ }
45
+ }
46
+ catch (error) {
47
+ const nodeError = error;
48
+ if (nodeError.code === 'ENOENT') {
49
+ return reply.code(404).send({ error: 'File not found' });
50
+ }
51
+ if (nodeError.code === 'EACCES') {
52
+ return reply.code(403).send({ error: 'Permission denied' });
53
+ }
54
+ return reply.code(500).send({
55
+ error: 'Failed to read file',
56
+ details: error instanceof Error ? error.message : 'Unknown error'
57
+ });
58
+ }
59
+ });
60
+ // Write file
61
+ fastify.post('/write', async (request, reply) => {
62
+ const { path: filePath, content, projectId } = request.body;
63
+ try {
64
+ // Security check - prevent directory traversal
65
+ const normalizedPath = path.normalize(filePath);
66
+ if (normalizedPath.includes('..')) {
67
+ return reply.code(403).send({ error: 'Directory traversal not allowed' });
68
+ }
69
+ // Create directory if it doesn't exist
70
+ const dir = path.dirname(normalizedPath);
71
+ await fs.mkdir(dir, { recursive: true });
72
+ // Write file
73
+ await fs.writeFile(normalizedPath, content, 'utf-8');
74
+ // Get file stats
75
+ const stats = await fs.stat(normalizedPath);
76
+ // Emit file write event
77
+ fastify.io.emit('file:write', {
78
+ path: normalizedPath,
79
+ projectId,
80
+ size: stats.size
81
+ });
82
+ return {
83
+ success: true,
84
+ path: normalizedPath,
85
+ size: stats.size
86
+ };
87
+ }
88
+ catch (error) {
89
+ const nodeError = error;
90
+ if (nodeError.code === 'EACCES') {
91
+ return reply.code(403).send({ error: 'Permission denied' });
92
+ }
93
+ return reply.code(500).send({
94
+ error: 'Failed to write file',
95
+ details: error instanceof Error ? error.message : 'Unknown error'
96
+ });
97
+ }
98
+ });
99
+ // List directory
100
+ fastify.post('/list', async (request, reply) => {
101
+ const { path: dirPath, connectionId } = request.body;
102
+ try {
103
+ // Security check - prevent directory traversal
104
+ const normalizedPath = path.normalize(dirPath);
105
+ if (normalizedPath.includes('..')) {
106
+ return reply.code(403).send({ error: 'Directory traversal not allowed' });
107
+ }
108
+ if (connectionId) {
109
+ // List remote directory via SSH
110
+ return await listRemoteDirectory(fastify, connectionId, normalizedPath, reply);
111
+ }
112
+ else {
113
+ // List local directory
114
+ const entries = await fs.readdir(normalizedPath, { withFileTypes: true });
115
+ const files = await Promise.all(entries.map(async (entry) => {
116
+ const fullPath = path.join(normalizedPath, entry.name);
117
+ let stats;
118
+ try {
119
+ stats = await fs.stat(fullPath);
120
+ }
121
+ catch {
122
+ // Handle broken symlinks
123
+ stats = null;
124
+ }
125
+ return {
126
+ name: entry.name,
127
+ path: fullPath,
128
+ type: entry.isDirectory() ? 'directory' :
129
+ entry.isFile() ? 'file' :
130
+ entry.isSymbolicLink() ? 'symlink' : 'other',
131
+ size: stats?.size || 0,
132
+ modified: stats?.mtime || null,
133
+ permissions: stats?.mode || null
134
+ };
135
+ }));
136
+ // Sort: directories first, then files
137
+ files.sort((a, b) => {
138
+ if (a.type === 'directory' && b.type !== 'directory')
139
+ return -1;
140
+ if (a.type !== 'directory' && b.type === 'directory')
141
+ return 1;
142
+ return a.name.localeCompare(b.name);
143
+ });
144
+ return {
145
+ path: normalizedPath,
146
+ files,
147
+ count: files.length
148
+ };
149
+ }
150
+ }
151
+ catch (error) {
152
+ const nodeError = error;
153
+ if (nodeError.code === 'ENOENT') {
154
+ return reply.code(404).send({ error: 'Directory not found' });
155
+ }
156
+ if (nodeError.code === 'ENOTDIR') {
157
+ return reply.code(400).send({ error: 'Path is not a directory' });
158
+ }
159
+ if (nodeError.code === 'EACCES') {
160
+ return reply.code(403).send({ error: 'Permission denied' });
161
+ }
162
+ return reply.code(500).send({
163
+ error: 'Failed to list directory',
164
+ details: error instanceof Error ? error.message : 'Unknown error'
165
+ });
166
+ }
167
+ });
168
+ // Check if path exists
169
+ fastify.post('/exists', async (request, reply) => {
170
+ const { path: checkPath } = request.body;
171
+ try {
172
+ // Security check - prevent directory traversal
173
+ const normalizedPath = path.normalize(checkPath);
174
+ if (normalizedPath.includes('..')) {
175
+ return reply.code(403).send({ error: 'Directory traversal not allowed' });
176
+ }
177
+ await fs.access(normalizedPath);
178
+ const stats = await fs.stat(normalizedPath);
179
+ return {
180
+ exists: true,
181
+ path: normalizedPath,
182
+ type: stats.isDirectory() ? 'directory' :
183
+ stats.isFile() ? 'file' : 'other',
184
+ size: stats.size,
185
+ modified: stats.mtime
186
+ };
187
+ }
188
+ catch (error) {
189
+ const nodeError = error;
190
+ if (nodeError.code === 'ENOENT') {
191
+ return {
192
+ exists: false,
193
+ path: path.normalize(checkPath)
194
+ };
195
+ }
196
+ return reply.code(500).send({
197
+ error: 'Failed to check path',
198
+ details: error instanceof Error ? error.message : 'Unknown error'
199
+ });
200
+ }
201
+ });
202
+ // Delete file or directory
203
+ fastify.post('/delete', async (request, reply) => {
204
+ const { path: deletePath } = request.body;
205
+ try {
206
+ // Security check - prevent directory traversal
207
+ const normalizedPath = path.normalize(deletePath);
208
+ if (normalizedPath.includes('..')) {
209
+ return reply.code(403).send({ error: 'Directory traversal not allowed' });
210
+ }
211
+ // Additional security check for important paths
212
+ const protectedPaths = ['/', '/etc', '/usr', '/bin', '/sbin', '/var', '/opt'];
213
+ if (protectedPaths.includes(normalizedPath) ||
214
+ protectedPaths.some(p => normalizedPath.startsWith(p + '/'))) {
215
+ return reply.code(403).send({ error: 'Cannot delete system directories' });
216
+ }
217
+ const stats = await fs.stat(normalizedPath);
218
+ if (stats.isDirectory()) {
219
+ await fs.rmdir(normalizedPath, { recursive: true });
220
+ }
221
+ else {
222
+ await fs.unlink(normalizedPath);
223
+ }
224
+ // Emit file delete event
225
+ fastify.io.emit('file:delete', {
226
+ path: normalizedPath,
227
+ type: stats.isDirectory() ? 'directory' : 'file'
228
+ });
229
+ return {
230
+ success: true,
231
+ path: normalizedPath
232
+ };
233
+ }
234
+ catch (error) {
235
+ const nodeError = error;
236
+ if (nodeError.code === 'ENOENT') {
237
+ return reply.code(404).send({ error: 'Path not found' });
238
+ }
239
+ if (nodeError.code === 'EACCES') {
240
+ return reply.code(403).send({ error: 'Permission denied' });
241
+ }
242
+ return reply.code(500).send({
243
+ error: 'Failed to delete path',
244
+ details: error instanceof Error ? error.message : 'Unknown error'
245
+ });
246
+ }
247
+ });
248
+ // Read README file
249
+ fastify.post('/readme', async (request, reply) => {
250
+ const { path: projectPath, connectionId } = request.body;
251
+ try {
252
+ // Security check - prevent directory traversal
253
+ const normalizedPath = path.normalize(projectPath);
254
+ if (normalizedPath.includes('..')) {
255
+ return reply.code(403).send({ error: 'Directory traversal not allowed' });
256
+ }
257
+ // README file variants to check
258
+ const readmeVariants = [
259
+ 'README.md',
260
+ 'readme.md',
261
+ 'README.MD',
262
+ 'README',
263
+ 'readme',
264
+ 'README.txt',
265
+ 'readme.txt',
266
+ 'README.rst',
267
+ 'readme.rst'
268
+ ];
269
+ if (connectionId) {
270
+ // Check remote README
271
+ return await findRemoteReadme(fastify, connectionId, normalizedPath, readmeVariants, reply);
272
+ }
273
+ else {
274
+ // Check local README
275
+ for (const variant of readmeVariants) {
276
+ const readmePath = path.join(normalizedPath, variant);
277
+ try {
278
+ const content = await fs.readFile(readmePath, 'utf-8');
279
+ return {
280
+ content,
281
+ path: readmePath,
282
+ variant,
283
+ size: content.length
284
+ };
285
+ }
286
+ catch {
287
+ // Continue to next variant
288
+ }
289
+ }
290
+ return reply.code(404).send({ error: 'No README file found' });
291
+ }
292
+ }
293
+ catch (error) {
294
+ return reply.code(500).send({
295
+ error: 'Failed to read README',
296
+ details: error instanceof Error ? error.message : 'Unknown error'
297
+ });
298
+ }
299
+ });
300
+ };
301
+ // Helper function to read remote file
302
+ async function readRemoteFile(fastify, connectionId, filePath, reply) {
303
+ const connectionConfig = fastify.db.getSSHConnection(connectionId);
304
+ if (!connectionConfig) {
305
+ return reply.code(404).send({ error: 'SSH connection not found' });
306
+ }
307
+ const { Client } = await import('ssh2');
308
+ const conn = new Client();
309
+ return new Promise((resolve) => {
310
+ conn.on('ready', () => {
311
+ conn.sftp((err, sftp) => {
312
+ if (err) {
313
+ conn.end();
314
+ return resolve(reply.code(500).send({
315
+ error: 'Failed to establish SFTP connection',
316
+ details: err.message
317
+ }));
318
+ }
319
+ sftp.readFile(filePath, (err, buffer) => {
320
+ conn.end();
321
+ if (err) {
322
+ const sshError = err;
323
+ if (sshError.code === 2) { // ENOENT
324
+ return resolve(reply.code(404).send({ error: 'File not found' }));
325
+ }
326
+ return resolve(reply.code(500).send({
327
+ error: 'Failed to read remote file',
328
+ details: err.message
329
+ }));
330
+ }
331
+ const content = buffer.toString('utf-8');
332
+ resolve({
333
+ content,
334
+ path: filePath,
335
+ connectionId,
336
+ size: content.length
337
+ });
338
+ });
339
+ });
340
+ });
341
+ conn.on('error', (err) => {
342
+ resolve(reply.code(500).send({
343
+ error: 'SSH connection failed',
344
+ details: err.message
345
+ }));
346
+ });
347
+ // Connect with appropriate auth
348
+ const connectConfig = {
349
+ host: connectionConfig.host,
350
+ port: connectionConfig.port,
351
+ username: connectionConfig.username,
352
+ };
353
+ if (connectionConfig.privateKeyPath) {
354
+ connectConfig.privateKey = readFileSync(connectionConfig.privateKeyPath);
355
+ }
356
+ else if (connectionConfig.password) {
357
+ connectConfig.password = connectionConfig.password;
358
+ }
359
+ conn.connect(connectConfig);
360
+ });
361
+ }
362
+ // Helper function to list remote directory
363
+ async function listRemoteDirectory(fastify, connectionId, dirPath, reply) {
364
+ const connectionConfig = fastify.db.getSSHConnection(connectionId);
365
+ if (!connectionConfig) {
366
+ return reply.code(404).send({ error: 'SSH connection not found' });
367
+ }
368
+ const { Client } = await import('ssh2');
369
+ const conn = new Client();
370
+ return new Promise((resolve) => {
371
+ conn.on('ready', () => {
372
+ conn.exec(`ls -la "${dirPath}"`, (err, stream) => {
373
+ if (err) {
374
+ conn.end();
375
+ return resolve(reply.code(500).send({
376
+ error: 'Failed to execute remote command',
377
+ details: err.message
378
+ }));
379
+ }
380
+ let output = '';
381
+ let errorOutput = '';
382
+ stream.on('data', (data) => {
383
+ output += data.toString();
384
+ });
385
+ stream.stderr.on('data', (data) => {
386
+ errorOutput += data.toString();
387
+ });
388
+ stream.on('close', (code) => {
389
+ conn.end();
390
+ if (code !== 0) {
391
+ if (errorOutput.includes('No such file or directory')) {
392
+ return resolve(reply.code(404).send({ error: 'Directory not found' }));
393
+ }
394
+ return resolve(reply.code(500).send({
395
+ error: 'Failed to list directory',
396
+ details: errorOutput
397
+ }));
398
+ }
399
+ // Parse ls output
400
+ const lines = output.split('\n').filter(line => line.trim());
401
+ const files = lines.slice(1).map(line => {
402
+ const parts = line.split(/\s+/);
403
+ if (parts.length >= 9) {
404
+ const permissions = parts[0];
405
+ const size = parseInt(parts[4], 10);
406
+ const name = parts.slice(8).join(' ');
407
+ return {
408
+ name,
409
+ path: path.join(dirPath, name),
410
+ type: permissions.startsWith('d') ? 'directory' :
411
+ permissions.startsWith('l') ? 'symlink' : 'file',
412
+ size,
413
+ permissions: parts[0],
414
+ owner: parts[2],
415
+ group: parts[3],
416
+ modified: `${parts[5]} ${parts[6]} ${parts[7]}`
417
+ };
418
+ }
419
+ return null;
420
+ }).filter(f => f && f.name !== '.' && f.name !== '..');
421
+ resolve({
422
+ path: dirPath,
423
+ connectionId,
424
+ files,
425
+ count: files.length
426
+ });
427
+ });
428
+ });
429
+ });
430
+ conn.on('error', (err) => {
431
+ resolve(reply.code(500).send({
432
+ error: 'SSH connection failed',
433
+ details: err.message
434
+ }));
435
+ });
436
+ // Connect with appropriate auth
437
+ const connectConfig = {
438
+ host: connectionConfig.host,
439
+ port: connectionConfig.port,
440
+ username: connectionConfig.username,
441
+ };
442
+ if (connectionConfig.privateKeyPath) {
443
+ connectConfig.privateKey = readFileSync(connectionConfig.privateKeyPath);
444
+ }
445
+ else if (connectionConfig.password) {
446
+ connectConfig.password = connectionConfig.password;
447
+ }
448
+ conn.connect(connectConfig);
449
+ });
450
+ }
451
+ // Helper function to find remote README
452
+ async function findRemoteReadme(fastify, connectionId, dirPath, variants, reply) {
453
+ const connectionConfig = fastify.db.getSSHConnection(connectionId);
454
+ if (!connectionConfig) {
455
+ return reply.code(404).send({ error: 'SSH connection not found' });
456
+ }
457
+ // Try each variant
458
+ for (const variant of variants) {
459
+ const readmePath = path.join(dirPath, variant);
460
+ try {
461
+ const result = await readRemoteFile(fastify, connectionId, readmePath, reply);
462
+ return result;
463
+ }
464
+ catch {
465
+ // Continue to next variant if this one fails
466
+ continue;
467
+ }
468
+ }
469
+ return reply.code(404).send({ error: 'No README file found' });
470
+ }
471
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyPluginAsync } from 'fastify';
2
+ export declare const gitRoutes: FastifyPluginAsync;
3
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/routes/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAiB7C,eAAO,MAAM,SAAS,EAAE,kBA4PvB,CAAC"}