@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.
- package/.env.example +8 -0
- package/LICENSE +22 -0
- package/README.md +290 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +445 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1043 -0
- package/dist/cli.js.map +1 -0
- package/dist/db/schema.d.ts +145 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +536 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/ModuleAuth.d.ts +61 -0
- package/dist/middleware/ModuleAuth.d.ts.map +1 -0
- package/dist/middleware/ModuleAuth.js +220 -0
- package/dist/middleware/ModuleAuth.js.map +1 -0
- package/dist/middleware/auth.d.ts +3 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +11 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/migrations/remove-notes-prompts.d.ts +13 -0
- package/dist/migrations/remove-notes-prompts.d.ts.map +1 -0
- package/dist/migrations/remove-notes-prompts.js +148 -0
- package/dist/migrations/remove-notes-prompts.js.map +1 -0
- package/dist/routes/bookmarks.d.ts +3 -0
- package/dist/routes/bookmarks.d.ts.map +1 -0
- package/dist/routes/bookmarks.js +186 -0
- package/dist/routes/bookmarks.js.map +1 -0
- package/dist/routes/config.d.ts +3 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +108 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/files.d.ts +3 -0
- package/dist/routes/files.d.ts.map +1 -0
- package/dist/routes/files.js +471 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/git.d.ts +3 -0
- package/dist/routes/git.d.ts.map +1 -0
- package/dist/routes/git.js +498 -0
- package/dist/routes/git.js.map +1 -0
- package/dist/routes/moduleRegistry.d.ts +41 -0
- package/dist/routes/moduleRegistry.d.ts.map +1 -0
- package/dist/routes/moduleRegistry.js +356 -0
- package/dist/routes/moduleRegistry.js.map +1 -0
- package/dist/routes/notifications.d.ts +3 -0
- package/dist/routes/notifications.d.ts.map +1 -0
- package/dist/routes/notifications.js +250 -0
- package/dist/routes/notifications.js.map +1 -0
- package/dist/routes/port-forward.d.ts +3 -0
- package/dist/routes/port-forward.d.ts.map +1 -0
- package/dist/routes/port-forward.js +205 -0
- package/dist/routes/port-forward.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +442 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/ssh.d.ts +3 -0
- package/dist/routes/ssh.d.ts.map +1 -0
- package/dist/routes/ssh.js +192 -0
- package/dist/routes/ssh.js.map +1 -0
- package/dist/routes/tasks.d.ts +3 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +183 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/routes/tmux.d.ts +3 -0
- package/dist/routes/tmux.d.ts.map +1 -0
- package/dist/routes/tmux.js +1191 -0
- package/dist/routes/tmux.js.map +1 -0
- package/dist/routes/tunnel.d.ts +25 -0
- package/dist/routes/tunnel.d.ts.map +1 -0
- package/dist/routes/tunnel.js +449 -0
- package/dist/routes/tunnel.js.map +1 -0
- package/dist/services/ModulePermissions.d.ts +100 -0
- package/dist/services/ModulePermissions.d.ts.map +1 -0
- package/dist/services/ModulePermissions.js +312 -0
- package/dist/services/ModulePermissions.js.map +1 -0
- package/dist/services/ModuleRegistryService.d.ts +152 -0
- package/dist/services/ModuleRegistryService.d.ts.map +1 -0
- package/dist/services/ModuleRegistryService.js +522 -0
- package/dist/services/ModuleRegistryService.js.map +1 -0
- package/dist/services/agent.service.d.ts +19 -0
- package/dist/services/agent.service.d.ts.map +1 -0
- package/dist/services/agent.service.js +88 -0
- package/dist/services/agent.service.js.map +1 -0
- package/dist/services/bootstrap.d.ts +22 -0
- package/dist/services/bootstrap.d.ts.map +1 -0
- package/dist/services/bootstrap.js +206 -0
- package/dist/services/bootstrap.js.map +1 -0
- package/dist/services/service-manager.d.ts +50 -0
- package/dist/services/service-manager.d.ts.map +1 -0
- package/dist/services/service-manager.js +382 -0
- package/dist/services/service-manager.js.map +1 -0
- 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 @@
|
|
|
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"}
|