@burdenoff/vibe-agent 1.3.2 → 2.1.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/dist/app-31chs2a1.js +17180 -0
- package/dist/app-31chs2a1.js.map +170 -0
- package/dist/chunk-pm1hna8x-473akrq0.js +16826 -0
- package/dist/chunk-pm1hna8x-473akrq0.js.map +11 -0
- package/dist/cli.js +4686 -1146
- package/dist/cli.js.map +51 -1
- package/dist/highlights-eq9cgrbb.scm +604 -0
- package/dist/highlights-ghv9g403.scm +205 -0
- package/dist/highlights-hk7bwhj4.scm +284 -0
- package/dist/highlights-r812a2qc.scm +150 -0
- package/dist/highlights-x6tmsnaa.scm +115 -0
- package/dist/index-5xngv42g.js +2546 -0
- package/dist/index-5xngv42g.js.map +26 -0
- package/dist/index-6aq4nc58.js +11429 -0
- package/dist/index-6aq4nc58.js.map +21 -0
- package/dist/index-ac2ebaf8.js +4 -0
- package/dist/index-ac2ebaf8.js.map +9 -0
- package/dist/index-g8dczzvv.js +33 -0
- package/dist/index-g8dczzvv.js.map +9 -0
- package/dist/index-gmz54dkc.js +28402 -0
- package/dist/index-gmz54dkc.js.map +11 -0
- package/dist/index-t06ktmx9.js +216 -0
- package/dist/index-t06ktmx9.js.map +11 -0
- package/dist/index.js +69 -87
- package/dist/index.js.map +10 -1
- package/dist/injections-73j83es3.scm +27 -0
- package/dist/package-0158fp3w.js +136 -0
- package/dist/package-0158fp3w.js.map +9 -0
- package/dist/plugin-system-bg1pzjj9.js +453 -0
- package/dist/plugin-system-bg1pzjj9.js.map +11 -0
- package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/package.json +33 -44
- package/dist/app.d.ts +0 -15
- package/dist/app.d.ts.map +0 -1
- package/dist/app.js +0 -600
- package/dist/app.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/db/schema.d.ts +0 -121
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -473
- package/dist/db/schema.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/ModuleAuth.d.ts +0 -61
- package/dist/middleware/ModuleAuth.d.ts.map +0 -1
- package/dist/middleware/ModuleAuth.js +0 -223
- package/dist/middleware/ModuleAuth.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -3
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/middleware/auth.js +0 -11
- package/dist/middleware/auth.js.map +0 -1
- package/dist/migrations/remove-notes-prompts.d.ts +0 -13
- package/dist/migrations/remove-notes-prompts.d.ts.map +0 -1
- package/dist/migrations/remove-notes-prompts.js +0 -148
- package/dist/migrations/remove-notes-prompts.js.map +0 -1
- package/dist/routes/bookmarks.d.ts +0 -3
- package/dist/routes/bookmarks.d.ts.map +0 -1
- package/dist/routes/bookmarks.js +0 -195
- package/dist/routes/bookmarks.js.map +0 -1
- package/dist/routes/config.d.ts +0 -3
- package/dist/routes/config.d.ts.map +0 -1
- package/dist/routes/config.js +0 -106
- package/dist/routes/config.js.map +0 -1
- package/dist/routes/files.d.ts +0 -3
- package/dist/routes/files.d.ts.map +0 -1
- package/dist/routes/files.js +0 -313
- package/dist/routes/files.js.map +0 -1
- package/dist/routes/git.d.ts +0 -3
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/git.js +0 -427
- package/dist/routes/git.js.map +0 -1
- package/dist/routes/logs.d.ts +0 -9
- package/dist/routes/logs.d.ts.map +0 -1
- package/dist/routes/logs.js +0 -107
- package/dist/routes/logs.js.map +0 -1
- package/dist/routes/moduleRegistry.d.ts +0 -41
- package/dist/routes/moduleRegistry.d.ts.map +0 -1
- package/dist/routes/moduleRegistry.js +0 -356
- package/dist/routes/moduleRegistry.js.map +0 -1
- package/dist/routes/notifications.d.ts +0 -3
- package/dist/routes/notifications.d.ts.map +0 -1
- package/dist/routes/notifications.js +0 -255
- package/dist/routes/notifications.js.map +0 -1
- package/dist/routes/plugin-state.d.ts +0 -19
- package/dist/routes/plugin-state.d.ts.map +0 -1
- package/dist/routes/plugin-state.js +0 -139
- package/dist/routes/plugin-state.js.map +0 -1
- package/dist/routes/plugins.d.ts +0 -3
- package/dist/routes/plugins.d.ts.map +0 -1
- package/dist/routes/plugins.js +0 -118
- package/dist/routes/plugins.js.map +0 -1
- package/dist/routes/projects.d.ts +0 -3
- package/dist/routes/projects.d.ts.map +0 -1
- package/dist/routes/projects.js +0 -456
- package/dist/routes/projects.js.map +0 -1
- package/dist/routes/tasks.d.ts +0 -3
- package/dist/routes/tasks.d.ts.map +0 -1
- package/dist/routes/tasks.js +0 -187
- package/dist/routes/tasks.js.map +0 -1
- package/dist/routes/tmux.d.ts +0 -3
- package/dist/routes/tmux.d.ts.map +0 -1
- package/dist/routes/tmux.js +0 -1287
- package/dist/routes/tmux.js.map +0 -1
- package/dist/routes/tunnel.d.ts +0 -25
- package/dist/routes/tunnel.d.ts.map +0 -1
- package/dist/routes/tunnel.js +0 -498
- package/dist/routes/tunnel.js.map +0 -1
- package/dist/services/ModulePermissions.d.ts +0 -100
- package/dist/services/ModulePermissions.d.ts.map +0 -1
- package/dist/services/ModulePermissions.js +0 -322
- package/dist/services/ModulePermissions.js.map +0 -1
- package/dist/services/ModuleRegistryService.d.ts +0 -152
- package/dist/services/ModuleRegistryService.d.ts.map +0 -1
- package/dist/services/ModuleRegistryService.js +0 -547
- package/dist/services/ModuleRegistryService.js.map +0 -1
- package/dist/services/agent.service.d.ts +0 -19
- package/dist/services/agent.service.d.ts.map +0 -1
- package/dist/services/agent.service.js +0 -91
- package/dist/services/agent.service.js.map +0 -1
- package/dist/services/bootstrap.d.ts +0 -22
- package/dist/services/bootstrap.d.ts.map +0 -1
- package/dist/services/bootstrap.js +0 -283
- package/dist/services/bootstrap.js.map +0 -1
- package/dist/services/completion.d.ts +0 -46
- package/dist/services/completion.d.ts.map +0 -1
- package/dist/services/completion.js +0 -317
- package/dist/services/completion.js.map +0 -1
- package/dist/services/gateway-client.d.ts +0 -61
- package/dist/services/gateway-client.d.ts.map +0 -1
- package/dist/services/gateway-client.js +0 -147
- package/dist/services/gateway-client.js.map +0 -1
- package/dist/services/logger.d.ts +0 -61
- package/dist/services/logger.d.ts.map +0 -1
- package/dist/services/logger.js +0 -223
- package/dist/services/logger.js.map +0 -1
- package/dist/services/plugin-manager.d.ts +0 -105
- package/dist/services/plugin-manager.d.ts.map +0 -1
- package/dist/services/plugin-manager.js +0 -250
- package/dist/services/plugin-manager.js.map +0 -1
- package/dist/services/plugin-state-backend.d.ts +0 -22
- package/dist/services/plugin-state-backend.d.ts.map +0 -1
- package/dist/services/plugin-state-backend.js +0 -103
- package/dist/services/plugin-state-backend.js.map +0 -1
- package/dist/services/plugin-state-external.d.ts +0 -36
- package/dist/services/plugin-state-external.d.ts.map +0 -1
- package/dist/services/plugin-state-external.js +0 -144
- package/dist/services/plugin-state-external.js.map +0 -1
- package/dist/services/plugin-state-router.d.ts +0 -40
- package/dist/services/plugin-state-router.d.ts.map +0 -1
- package/dist/services/plugin-state-router.js +0 -82
- package/dist/services/plugin-state-router.js.map +0 -1
- package/dist/services/port-utils.d.ts +0 -11
- package/dist/services/port-utils.d.ts.map +0 -1
- package/dist/services/port-utils.js +0 -39
- package/dist/services/port-utils.js.map +0 -1
- package/dist/services/service-manager.d.ts +0 -50
- package/dist/services/service-manager.d.ts.map +0 -1
- package/dist/services/service-manager.js +0 -389
- package/dist/services/service-manager.js.map +0 -1
package/dist/routes/projects.js
DELETED
|
@@ -1,456 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from "fs";
|
|
2
|
-
import path from "path";
|
|
3
|
-
// Security function to check if a path is allowed for scanning
|
|
4
|
-
function isAllowedPath(scanPath) {
|
|
5
|
-
const normalizedPath = path.resolve(scanPath);
|
|
6
|
-
// List of forbidden paths (system directories)
|
|
7
|
-
const forbiddenPaths = [
|
|
8
|
-
"/System",
|
|
9
|
-
"/usr",
|
|
10
|
-
"/bin",
|
|
11
|
-
"/sbin",
|
|
12
|
-
"/etc",
|
|
13
|
-
"/var/root",
|
|
14
|
-
"/private/var/root",
|
|
15
|
-
"/Library/Application Support",
|
|
16
|
-
"/private/var/db",
|
|
17
|
-
"/private/var/install",
|
|
18
|
-
"/private/var/tmp",
|
|
19
|
-
"/tmp",
|
|
20
|
-
"/Windows",
|
|
21
|
-
"/Program Files",
|
|
22
|
-
"/Program Files (x86)",
|
|
23
|
-
"C:\\Windows",
|
|
24
|
-
"C:\\Program Files",
|
|
25
|
-
"C:\\Program Files (x86)",
|
|
26
|
-
];
|
|
27
|
-
// Check if the path starts with any forbidden directory
|
|
28
|
-
for (const forbiddenPath of forbiddenPaths) {
|
|
29
|
-
if (normalizedPath.startsWith(forbiddenPath)) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// Only allow paths under common user directories
|
|
34
|
-
const allowedPrefixes = [
|
|
35
|
-
"/Users",
|
|
36
|
-
"/home",
|
|
37
|
-
"/opt",
|
|
38
|
-
process.env.HOME || "",
|
|
39
|
-
"C:\\Users",
|
|
40
|
-
"D:\\",
|
|
41
|
-
"E:\\",
|
|
42
|
-
].filter(Boolean);
|
|
43
|
-
return allowedPrefixes.some((prefix) => normalizedPath.startsWith(prefix));
|
|
44
|
-
}
|
|
45
|
-
// Function to parse .gitignore patterns
|
|
46
|
-
function parseGitignore(gitignoreContent) {
|
|
47
|
-
return gitignoreContent
|
|
48
|
-
.split("\n")
|
|
49
|
-
.map((line) => line.trim())
|
|
50
|
-
.filter((line) => line && !line.startsWith("#"))
|
|
51
|
-
.map((line) => {
|
|
52
|
-
// Remove leading slash
|
|
53
|
-
if (line.startsWith("/")) {
|
|
54
|
-
line = line.slice(1);
|
|
55
|
-
}
|
|
56
|
-
return line;
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
// Function to check if a path should be ignored based on .gitignore patterns
|
|
60
|
-
function shouldIgnoreByGitignore(relativePath, patterns, _basePath) {
|
|
61
|
-
for (const pattern of patterns) {
|
|
62
|
-
// Simple pattern matching - could be enhanced with proper glob matching
|
|
63
|
-
if (pattern.endsWith("/")) {
|
|
64
|
-
// Directory pattern
|
|
65
|
-
const dirPattern = pattern.slice(0, -1);
|
|
66
|
-
if (relativePath === dirPattern ||
|
|
67
|
-
relativePath.startsWith(dirPattern + "/")) {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else if (pattern.includes("*")) {
|
|
72
|
-
// Wildcard pattern - basic implementation
|
|
73
|
-
const regexPattern = pattern.replace(/\./g, "\\.").replace(/\*/g, ".*");
|
|
74
|
-
const regex = new RegExp(`^${regexPattern}$`);
|
|
75
|
-
if (regex.test(relativePath)) {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
// Exact match or starts with pattern
|
|
81
|
-
if (relativePath === pattern || relativePath.startsWith(pattern + "/")) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
// Function to collect .gitignore patterns from all parent directories
|
|
89
|
-
async function collectGitignorePatterns(startPath, targetPath) {
|
|
90
|
-
const patterns = new Map();
|
|
91
|
-
let currentPath = targetPath;
|
|
92
|
-
while (currentPath.startsWith(startPath)) {
|
|
93
|
-
try {
|
|
94
|
-
const gitignorePath = path.join(currentPath, ".gitignore");
|
|
95
|
-
const gitignoreContent = await fs.readFile(gitignorePath, "utf-8");
|
|
96
|
-
const pathPatterns = parseGitignore(gitignoreContent);
|
|
97
|
-
if (pathPatterns.length > 0) {
|
|
98
|
-
patterns.set(currentPath, pathPatterns);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
// .gitignore doesn't exist in this directory, continue
|
|
103
|
-
}
|
|
104
|
-
const parentPath = path.dirname(currentPath);
|
|
105
|
-
if (parentPath === currentPath)
|
|
106
|
-
break; // Reached root
|
|
107
|
-
currentPath = parentPath;
|
|
108
|
-
}
|
|
109
|
-
return patterns;
|
|
110
|
-
}
|
|
111
|
-
export const projectRoutes = async (fastify) => {
|
|
112
|
-
// Scan local projects
|
|
113
|
-
fastify.post("/scan", async (request, reply) => {
|
|
114
|
-
const { recursive = false, scanPath, respectGitignore = true, } = request.body;
|
|
115
|
-
try {
|
|
116
|
-
console.log("Scanning projects...", {
|
|
117
|
-
recursive,
|
|
118
|
-
scanPath,
|
|
119
|
-
respectGitignore,
|
|
120
|
-
});
|
|
121
|
-
// Require scanPath to be provided - no default scanning
|
|
122
|
-
if (!scanPath) {
|
|
123
|
-
return reply.code(400).send({
|
|
124
|
-
error: "scanPath is required",
|
|
125
|
-
success: false,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
// Security check - prevent directory traversal
|
|
129
|
-
const normalizedPath = path.normalize(scanPath);
|
|
130
|
-
if (normalizedPath.includes("..")) {
|
|
131
|
-
return reply.code(403).send({
|
|
132
|
-
error: "Directory traversal not allowed",
|
|
133
|
-
success: false,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
// Additional security checks
|
|
137
|
-
if (!isAllowedPath(normalizedPath)) {
|
|
138
|
-
return reply.code(403).send({
|
|
139
|
-
error: "Access to this path is not allowed",
|
|
140
|
-
success: false,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
const projects = await scanForProjects(normalizedPath, recursive, respectGitignore);
|
|
144
|
-
// Emit project scan event
|
|
145
|
-
fastify.io.emit("projects:scanned", {
|
|
146
|
-
path: normalizedPath,
|
|
147
|
-
count: projects.length,
|
|
148
|
-
recursive,
|
|
149
|
-
});
|
|
150
|
-
return {
|
|
151
|
-
projects,
|
|
152
|
-
success: true,
|
|
153
|
-
count: projects.length,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
console.error("Error scanning projects:", error);
|
|
158
|
-
return reply.code(500).send({
|
|
159
|
-
error: "Failed to scan projects",
|
|
160
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
161
|
-
success: false,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
// Scan remote projects
|
|
166
|
-
fastify.post("/scan-remote", async (request, reply) => {
|
|
167
|
-
const { recursive = false, scanPath, respectGitignore = true, } = request.body;
|
|
168
|
-
try {
|
|
169
|
-
console.log("Scanning remote projects...", {
|
|
170
|
-
recursive,
|
|
171
|
-
scanPath,
|
|
172
|
-
respectGitignore,
|
|
173
|
-
});
|
|
174
|
-
// Require scanPath to be provided - no default scanning
|
|
175
|
-
if (!scanPath) {
|
|
176
|
-
return reply.code(400).send({
|
|
177
|
-
error: "scanPath is required for remote scanning",
|
|
178
|
-
success: false,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
// Security check - prevent directory traversal
|
|
182
|
-
const normalizedPath = path.normalize(scanPath);
|
|
183
|
-
if (normalizedPath.includes("..")) {
|
|
184
|
-
return reply.code(403).send({
|
|
185
|
-
error: "Directory traversal not allowed",
|
|
186
|
-
success: false,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
// Additional security checks
|
|
190
|
-
if (!isAllowedPath(normalizedPath)) {
|
|
191
|
-
return reply.code(403).send({
|
|
192
|
-
error: "Access to this path is not allowed",
|
|
193
|
-
success: false,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
// For now, return empty array as this requires SSH setup
|
|
197
|
-
// TODO: Implement remote scanning via SSH
|
|
198
|
-
const projects = [];
|
|
199
|
-
// Emit remote project scan event
|
|
200
|
-
fastify.io.emit("projects:remote-scanned", {
|
|
201
|
-
path: normalizedPath,
|
|
202
|
-
count: projects.length,
|
|
203
|
-
recursive,
|
|
204
|
-
});
|
|
205
|
-
return {
|
|
206
|
-
projects,
|
|
207
|
-
success: true,
|
|
208
|
-
count: projects.length,
|
|
209
|
-
message: "Remote scanning not yet implemented",
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
catch (error) {
|
|
213
|
-
console.error("Error scanning remote projects:", error);
|
|
214
|
-
return reply.code(500).send({
|
|
215
|
-
error: "Failed to scan remote projects",
|
|
216
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
217
|
-
success: false,
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
// Get all projects (mock for now)
|
|
222
|
-
fastify.get("/", async (request, reply) => {
|
|
223
|
-
const { includeNested } = request.query;
|
|
224
|
-
try {
|
|
225
|
-
// For now, return empty array as this would come from database
|
|
226
|
-
const projects = [];
|
|
227
|
-
return projects;
|
|
228
|
-
}
|
|
229
|
-
catch (error) {
|
|
230
|
-
console.error("Error getting projects:", error);
|
|
231
|
-
return reply.code(500).send({
|
|
232
|
-
error: "Failed to get projects",
|
|
233
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
// Create project (mock for now)
|
|
238
|
-
fastify.post("/", async (request, reply) => {
|
|
239
|
-
const projectData = request.body;
|
|
240
|
-
try {
|
|
241
|
-
// For now, just return success
|
|
242
|
-
const id = `project-${Date.now()}`;
|
|
243
|
-
return {
|
|
244
|
-
id,
|
|
245
|
-
success: true,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
catch (error) {
|
|
249
|
-
console.error("Error creating project:", error);
|
|
250
|
-
return reply.code(500).send({
|
|
251
|
-
error: "Failed to create project",
|
|
252
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
// Update project (mock for now)
|
|
257
|
-
fastify.put("/:id", async (request, reply) => {
|
|
258
|
-
const { id } = request.params;
|
|
259
|
-
const updates = request.body;
|
|
260
|
-
try {
|
|
261
|
-
// For now, just return success
|
|
262
|
-
return {
|
|
263
|
-
success: true,
|
|
264
|
-
changes: 1,
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
console.error("Error updating project:", error);
|
|
269
|
-
return reply.code(500).send({
|
|
270
|
-
error: "Failed to update project",
|
|
271
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
};
|
|
276
|
-
// Helper function to scan for projects
|
|
277
|
-
async function scanForProjects(basePath, recursive, respectGitignore = true) {
|
|
278
|
-
const projects = [];
|
|
279
|
-
// Collect .gitignore patterns if respectGitignore is enabled
|
|
280
|
-
let gitignorePatterns = new Map();
|
|
281
|
-
if (respectGitignore) {
|
|
282
|
-
gitignorePatterns = await collectGitignorePatterns(basePath, basePath);
|
|
283
|
-
}
|
|
284
|
-
try {
|
|
285
|
-
const entries = await fs.readdir(basePath, { withFileTypes: true });
|
|
286
|
-
for (const entry of entries) {
|
|
287
|
-
if (!entry.isDirectory())
|
|
288
|
-
continue;
|
|
289
|
-
const fullPath = path.join(basePath, entry.name);
|
|
290
|
-
// Skip hidden directories and node_modules
|
|
291
|
-
if (entry.name.startsWith(".") || entry.name === "node_modules") {
|
|
292
|
-
continue;
|
|
293
|
-
}
|
|
294
|
-
// Check if directory should be ignored by .gitignore
|
|
295
|
-
if (respectGitignore && gitignorePatterns.size > 0) {
|
|
296
|
-
let shouldIgnore = false;
|
|
297
|
-
// Check against all collected .gitignore patterns
|
|
298
|
-
for (const [patternBasePath, patterns] of Array.from(gitignorePatterns)) {
|
|
299
|
-
if (fullPath.startsWith(patternBasePath)) {
|
|
300
|
-
const relativePath = path.relative(patternBasePath, fullPath);
|
|
301
|
-
if (shouldIgnoreByGitignore(relativePath, patterns, patternBasePath)) {
|
|
302
|
-
shouldIgnore = true;
|
|
303
|
-
break;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
if (shouldIgnore) {
|
|
308
|
-
console.log(`Skipping directory ${entry.name} due to .gitignore`);
|
|
309
|
-
continue;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
// Check if this directory is a project
|
|
313
|
-
const project = await detectProject(fullPath, entry.name);
|
|
314
|
-
if (project) {
|
|
315
|
-
projects.push(project);
|
|
316
|
-
}
|
|
317
|
-
// If recursive, scan subdirectories
|
|
318
|
-
if (recursive) {
|
|
319
|
-
try {
|
|
320
|
-
const subProjects = await scanForProjects(fullPath, true, respectGitignore);
|
|
321
|
-
projects.push(...subProjects);
|
|
322
|
-
}
|
|
323
|
-
catch (error) {
|
|
324
|
-
// Ignore errors in subdirectories
|
|
325
|
-
console.warn(`Failed to scan subdirectory ${fullPath}:`, error);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
catch (error) {
|
|
331
|
-
console.error(`Failed to scan directory ${basePath}:`, error);
|
|
332
|
-
}
|
|
333
|
-
return projects;
|
|
334
|
-
}
|
|
335
|
-
// Helper function to detect if a directory is a project
|
|
336
|
-
async function detectProject(dirPath, dirName) {
|
|
337
|
-
try {
|
|
338
|
-
const files = await fs.readdir(dirPath);
|
|
339
|
-
// Check for common project indicators
|
|
340
|
-
let hasPackageJson = files.includes("package.json");
|
|
341
|
-
const hasPyproject = files.includes("pyproject.toml");
|
|
342
|
-
const hasRequirements = files.includes("requirements.txt");
|
|
343
|
-
const hasCargoToml = files.includes("Cargo.toml");
|
|
344
|
-
const hasGitDir = files.includes(".git");
|
|
345
|
-
const hasDockerfile = files.includes("Dockerfile");
|
|
346
|
-
const hasMakefile = files.includes("Makefile");
|
|
347
|
-
// If it doesn't look like a project, skip it
|
|
348
|
-
if (!hasPackageJson &&
|
|
349
|
-
!hasPyproject &&
|
|
350
|
-
!hasRequirements &&
|
|
351
|
-
!hasCargoToml &&
|
|
352
|
-
!hasGitDir) {
|
|
353
|
-
return null;
|
|
354
|
-
}
|
|
355
|
-
let projectType = "unknown";
|
|
356
|
-
let vitePort;
|
|
357
|
-
// Determine project type
|
|
358
|
-
if (hasPackageJson) {
|
|
359
|
-
try {
|
|
360
|
-
const packageJsonPath = path.join(dirPath, "package.json");
|
|
361
|
-
const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8");
|
|
362
|
-
// Check if the file is empty or invalid
|
|
363
|
-
if (!packageJsonContent.trim()) {
|
|
364
|
-
console.warn(`Empty package.json file found at ${packageJsonPath}`);
|
|
365
|
-
hasPackageJson = false;
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
369
|
-
if (packageJson.dependencies?.vite ||
|
|
370
|
-
packageJson.devDependencies?.vite) {
|
|
371
|
-
projectType = "vite";
|
|
372
|
-
// Try to detect port from vite config or scripts
|
|
373
|
-
vitePort = extractVitePort(packageJson);
|
|
374
|
-
}
|
|
375
|
-
else if (packageJson.dependencies?.react ||
|
|
376
|
-
packageJson.devDependencies?.react) {
|
|
377
|
-
projectType = "react";
|
|
378
|
-
}
|
|
379
|
-
else if (packageJson.dependencies?.next ||
|
|
380
|
-
packageJson.devDependencies?.next) {
|
|
381
|
-
projectType = "nextjs";
|
|
382
|
-
}
|
|
383
|
-
else if (packageJson.dependencies?.express) {
|
|
384
|
-
projectType = "express";
|
|
385
|
-
}
|
|
386
|
-
else if (packageJson.dependencies?.fastify) {
|
|
387
|
-
projectType = "fastify";
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
projectType = "nodejs";
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
catch (error) {
|
|
395
|
-
console.warn(`Failed to parse package.json in ${dirPath}:`, error);
|
|
396
|
-
projectType = "nodejs";
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
else if (hasPyproject || hasRequirements) {
|
|
400
|
-
projectType = "python";
|
|
401
|
-
}
|
|
402
|
-
else if (hasCargoToml) {
|
|
403
|
-
projectType = "rust";
|
|
404
|
-
}
|
|
405
|
-
// Get directory stats
|
|
406
|
-
const stats = await fs.stat(dirPath);
|
|
407
|
-
// Create project object
|
|
408
|
-
const project = {
|
|
409
|
-
id: `local-${Buffer.from(dirPath).toString("base64").slice(0, 8)}-${Date.now()}`,
|
|
410
|
-
name: dirName,
|
|
411
|
-
path: dirPath,
|
|
412
|
-
type: projectType,
|
|
413
|
-
lastUpdated: stats.mtime.getTime(),
|
|
414
|
-
lastFileChange: stats.mtime.getTime(),
|
|
415
|
-
status: "INACTIVE",
|
|
416
|
-
isRemote: false,
|
|
417
|
-
tags: [projectType],
|
|
418
|
-
};
|
|
419
|
-
if (vitePort) {
|
|
420
|
-
project.vitePort = vitePort;
|
|
421
|
-
}
|
|
422
|
-
// Check if it's a git repository
|
|
423
|
-
if (hasGitDir) {
|
|
424
|
-
try {
|
|
425
|
-
const gitConfigPath = path.join(dirPath, ".git", "config");
|
|
426
|
-
const gitConfig = await fs.readFile(gitConfigPath, "utf-8");
|
|
427
|
-
const remoteMatch = gitConfig.match(/url = (.+)/);
|
|
428
|
-
if (remoteMatch) {
|
|
429
|
-
project.repository = remoteMatch[1].trim();
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
catch (error) {
|
|
433
|
-
// Ignore git config errors
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
return project;
|
|
437
|
-
}
|
|
438
|
-
catch (error) {
|
|
439
|
-
console.error(`Failed to detect project in ${dirPath}:`, error);
|
|
440
|
-
return null;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
// Helper function to extract Vite port from package.json
|
|
444
|
-
function extractVitePort(packageJson) {
|
|
445
|
-
// Check dev script for port
|
|
446
|
-
const devScript = packageJson.scripts?.dev;
|
|
447
|
-
if (devScript && typeof devScript === "string") {
|
|
448
|
-
const portMatch = devScript.match(/--port[=\s]+(\d+)/);
|
|
449
|
-
if (portMatch) {
|
|
450
|
-
return parseInt(portMatch[1], 10);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
// Default Vite port
|
|
454
|
-
return undefined;
|
|
455
|
-
}
|
|
456
|
-
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,+DAA+D;AAC/D,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9C,+CAA+C;IAC/C,MAAM,cAAc,GAAG;QACrB,SAAS;QACT,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,WAAW;QACX,mBAAmB;QACnB,8BAA8B;QAC9B,iBAAiB;QACjB,sBAAsB;QACtB,kBAAkB;QAClB,MAAM;QACN,UAAU;QACV,gBAAgB;QAChB,sBAAsB;QACtB,aAAa;QACb,mBAAmB;QACnB,yBAAyB;KAC1B,CAAC;IAEF,wDAAwD;IACxD,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,cAAc,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,eAAe,GAAG;QACtB,QAAQ;QACR,OAAO;QACP,MAAM;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QACtB,WAAW;QACX,MAAM;QACN,MAAM;KACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,wCAAwC;AACxC,SAAS,cAAc,CAAC,gBAAwB;IAC9C,OAAO,gBAAgB;SACpB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,uBAAuB;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC;AAED,6EAA6E;AAC7E,SAAS,uBAAuB,CAC9B,YAAoB,EACpB,QAAkB,EAClB,SAAiB;IAEjB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,wEAAwE;QACxE,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,oBAAoB;YACpB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,IACE,YAAY,KAAK,UAAU;gBAC3B,YAAY,CAAC,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,EACzC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,0CAA0C;YAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;gBACvE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sEAAsE;AACtE,KAAK,UAAU,wBAAwB,CACrC,SAAiB,EACjB,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,IAAI,WAAW,GAAG,UAAU,CAAC;IAE7B,OAAO,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC3D,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;YACtD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uDAAuD;QACzD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,UAAU,KAAK,WAAW;YAAE,MAAM,CAAC,eAAe;QACtD,WAAW,GAAG,UAAU,CAAC;IAC3B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAsCD,MAAM,CAAC,MAAM,aAAa,GAAuB,KAAK,EAAE,OAAO,EAAE,EAAE;IACjE,sBAAsB;IACtB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,EACJ,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,gBAAgB,GAAG,IAAI,GACxB,GAAG,OAAO,CAAC,IAAwB,CAAC;QAErC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;gBAClC,SAAS;gBACT,QAAQ;gBACR,gBAAgB;aACjB,CAAC,CAAC;YAEH,wDAAwD;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,sBAAsB;oBAC7B,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,+CAA+C;YAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,iCAAiC;oBACxC,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,6BAA6B;YAC7B,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,oCAAoC;oBAC3C,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,cAAc,EACd,SAAS,EACT,gBAAgB,CACjB,CAAC;YAEF,0BAA0B;YAC1B,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAClC,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,SAAS;aACV,CAAC,CAAC;YAEH,OAAO;gBACL,QAAQ;gBACR,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,QAAQ,CAAC,MAAM;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,yBAAyB;gBAChC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBACjE,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACpD,MAAM,EACJ,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,gBAAgB,GAAG,IAAI,GACxB,GAAG,OAAO,CAAC,IAA8B,CAAC;QAE3C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;gBACzC,SAAS;gBACT,QAAQ;gBACR,gBAAgB;aACjB,CAAC,CAAC;YAEH,wDAAwD;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,0CAA0C;oBACjD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,+CAA+C;YAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,iCAAiC;oBACxC,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,6BAA6B;YAC7B,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,oCAAoC;oBAC3C,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,yDAAyD;YACzD,0CAA0C;YAC1C,MAAM,QAAQ,GAAc,EAAE,CAAC;YAE/B,iCAAiC;YACjC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACzC,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,SAAS;aACV,CAAC,CAAC;YAEH,OAAO;gBACL,QAAQ;gBACR,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,OAAO,EAAE,qCAAqC;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,gCAAgC;gBACvC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBACjE,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACxC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,KAAmC,CAAC;QAEtE,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,QAAQ,GAAc,EAAE,CAAC;YAE/B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,wBAAwB;gBAC/B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAwB,CAAC;QAErD,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,EAAE,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEnC,OAAO;gBACL,EAAE;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,0BAA0B;gBACjC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAwB,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAwB,CAAC;QAEjD,IAAI,CAAC;YACH,+BAA+B;YAC/B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC;aACX,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,0BAA0B;gBACjC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,uCAAuC;AACvC,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,SAAkB,EAClB,mBAA4B,IAAI;IAEhC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,6DAA6D;IAC7D,IAAI,iBAAiB,GAA0B,IAAI,GAAG,EAAE,CAAC;IACzD,IAAI,gBAAgB,EAAE,CAAC;QACrB,iBAAiB,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEjD,2CAA2C;YAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,qDAAqD;YACrD,IAAI,gBAAgB,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnD,IAAI,YAAY,GAAG,KAAK,CAAC;gBAEzB,kDAAkD;gBAClD,KAAK,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAClD,iBAAiB,CAClB,EAAE,CAAC;oBACF,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;wBACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;wBAC9D,IACE,uBAAuB,CAAC,YAAY,EAAE,QAAQ,EAAE,eAAe,CAAC,EAChE,CAAC;4BACD,YAAY,GAAG,IAAI,CAAC;4BACpB,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,oBAAoB,CAAC,CAAC;oBAClE,SAAS;gBACX,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAED,oCAAoC;YACpC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,eAAe,CACvC,QAAQ,EACR,IAAI,EACJ,gBAAgB,CACjB,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;gBAChC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,kCAAkC;oBAClC,OAAO,CAAC,IAAI,CAAC,+BAA+B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wDAAwD;AACxD,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,sCAAsC;QACtC,IAAI,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE/C,6CAA6C;QAC7C,IACE,CAAC,cAAc;YACf,CAAC,YAAY;YACb,CAAC,eAAe;YAChB,CAAC,YAAY;YACb,CAAC,SAAS,EACV,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,WAAW,GAAG,SAAS,CAAC;QAC5B,IAAI,QAA4B,CAAC;QAEjC,yBAAyB;QACzB,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAC3D,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAEvE,wCAAwC;gBACxC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,oCAAoC,eAAe,EAAE,CAAC,CAAC;oBACpE,cAAc,GAAG,KAAK,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBAEnD,IACE,WAAW,CAAC,YAAY,EAAE,IAAI;wBAC9B,WAAW,CAAC,eAAe,EAAE,IAAI,EACjC,CAAC;wBACD,WAAW,GAAG,MAAM,CAAC;wBACrB,iDAAiD;wBACjD,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;oBAC1C,CAAC;yBAAM,IACL,WAAW,CAAC,YAAY,EAAE,KAAK;wBAC/B,WAAW,CAAC,eAAe,EAAE,KAAK,EAClC,CAAC;wBACD,WAAW,GAAG,OAAO,CAAC;oBACxB,CAAC;yBAAM,IACL,WAAW,CAAC,YAAY,EAAE,IAAI;wBAC9B,WAAW,CAAC,eAAe,EAAE,IAAI,EACjC,CAAC;wBACD,WAAW,GAAG,QAAQ,CAAC;oBACzB,CAAC;yBAAM,IAAI,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;wBAC7C,WAAW,GAAG,SAAS,CAAC;oBAC1B,CAAC;yBAAM,IAAI,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;wBAC7C,WAAW,GAAG,SAAS,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACN,WAAW,GAAG,QAAQ,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnE,WAAW,GAAG,QAAQ,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;YAC3C,WAAW,GAAG,QAAQ,CAAC;QACzB,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,WAAW,GAAG,MAAM,CAAC;QACvB,CAAC;QAED,sBAAsB;QACtB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErC,wBAAwB;QACxB,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YAChF,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;YAClC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;YACrC,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,CAAC,WAAW,CAAC;SACpB,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,CAAC;QAED,iCAAiC;QACjC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBAC5D,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAClD,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,2BAA2B;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,SAAS,eAAe,CAAC,WAAgB;IACvC,4BAA4B;IAC5B,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;IAC3C,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/routes/tasks.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/routes/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAsB7C,eAAO,MAAM,UAAU,EAAE,kBAuFxB,CAAC"}
|
package/dist/routes/tasks.js
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
import { exec } from "child_process";
|
|
3
|
-
import { promisify } from "util";
|
|
4
|
-
const execAsync = promisify(exec);
|
|
5
|
-
export const taskRoutes = async (fastify) => {
|
|
6
|
-
// Get all tasks
|
|
7
|
-
fastify.get("/", async (request, _reply) => {
|
|
8
|
-
const { status } = request.query;
|
|
9
|
-
if (status === "pending") {
|
|
10
|
-
const tasks = fastify.db.getPendingTasks();
|
|
11
|
-
return { tasks };
|
|
12
|
-
}
|
|
13
|
-
// For now, return pending tasks by default
|
|
14
|
-
// In a real implementation, you'd want to add methods to get all tasks with pagination
|
|
15
|
-
const tasks = fastify.db.getPendingTasks();
|
|
16
|
-
return { tasks };
|
|
17
|
-
});
|
|
18
|
-
// Get task by ID
|
|
19
|
-
fastify.get("/:id", async (request, reply) => {
|
|
20
|
-
const { id } = request.params;
|
|
21
|
-
const task = fastify.db.getTask(id);
|
|
22
|
-
if (!task) {
|
|
23
|
-
return reply.code(404).send({ error: "Task not found" });
|
|
24
|
-
}
|
|
25
|
-
return { task };
|
|
26
|
-
});
|
|
27
|
-
// Create new task
|
|
28
|
-
fastify.post("/", async (request, reply) => {
|
|
29
|
-
const { type, payload } = request.body;
|
|
30
|
-
try {
|
|
31
|
-
const task = fastify.db.createTask({
|
|
32
|
-
id: crypto.randomUUID(),
|
|
33
|
-
type,
|
|
34
|
-
status: "pending",
|
|
35
|
-
payload: JSON.stringify(payload),
|
|
36
|
-
});
|
|
37
|
-
// Emit task created event
|
|
38
|
-
fastify.io.emit("task:created", task);
|
|
39
|
-
// Process task asynchronously
|
|
40
|
-
processTask(fastify, task);
|
|
41
|
-
return { task };
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
return reply.code(500).send({
|
|
45
|
-
error: "Failed to create task",
|
|
46
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
// Cancel task
|
|
51
|
-
fastify.post("/:id/cancel", async (request, reply) => {
|
|
52
|
-
const { id } = request.params;
|
|
53
|
-
try {
|
|
54
|
-
const task = fastify.db.getTask(id);
|
|
55
|
-
if (!task) {
|
|
56
|
-
return reply.code(404).send({ error: "Task not found" });
|
|
57
|
-
}
|
|
58
|
-
if (task.status !== "pending") {
|
|
59
|
-
return reply
|
|
60
|
-
.code(400)
|
|
61
|
-
.send({ error: "Only pending tasks can be cancelled" });
|
|
62
|
-
}
|
|
63
|
-
fastify.db.updateTask(id, {
|
|
64
|
-
status: "failed",
|
|
65
|
-
error: "Task cancelled by user",
|
|
66
|
-
});
|
|
67
|
-
// Emit task cancelled event
|
|
68
|
-
fastify.io.emit("task:cancelled", { id });
|
|
69
|
-
return { success: true };
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
return reply.code(500).send({
|
|
73
|
-
error: "Failed to cancel task",
|
|
74
|
-
details: error instanceof Error ? error.message : "Unknown error",
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
// Process task asynchronously
|
|
80
|
-
async function processTask(fastify, task) {
|
|
81
|
-
try {
|
|
82
|
-
// Update task status to running
|
|
83
|
-
fastify.db.updateTask(task.id, { status: "running" });
|
|
84
|
-
fastify.io.emit("task:started", { id: task.id });
|
|
85
|
-
const payload = JSON.parse(task.payload);
|
|
86
|
-
let result;
|
|
87
|
-
switch (task.type) {
|
|
88
|
-
case "command":
|
|
89
|
-
result = await executeCommand(payload);
|
|
90
|
-
break;
|
|
91
|
-
case "script":
|
|
92
|
-
result = await executeScript(payload);
|
|
93
|
-
break;
|
|
94
|
-
case "file_operation":
|
|
95
|
-
result = await executeFileOperation(payload);
|
|
96
|
-
break;
|
|
97
|
-
default:
|
|
98
|
-
throw new Error(`Unknown task type: ${task.type}`);
|
|
99
|
-
}
|
|
100
|
-
// Update task with result
|
|
101
|
-
fastify.db.updateTask(task.id, {
|
|
102
|
-
status: "completed",
|
|
103
|
-
result: JSON.stringify(result),
|
|
104
|
-
});
|
|
105
|
-
// Emit task completed event
|
|
106
|
-
fastify.io.emit("task:completed", {
|
|
107
|
-
id: task.id,
|
|
108
|
-
result,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
// Update task with error
|
|
113
|
-
fastify.db.updateTask(task.id, {
|
|
114
|
-
status: "failed",
|
|
115
|
-
error: error instanceof Error ? error.message : "Unknown error",
|
|
116
|
-
});
|
|
117
|
-
// Emit task failed event
|
|
118
|
-
fastify.io.emit("task:failed", {
|
|
119
|
-
id: task.id,
|
|
120
|
-
error: error instanceof Error ? error.message : "Unknown error",
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// Execute command
|
|
125
|
-
async function executeCommand(payload) {
|
|
126
|
-
const { command, cwd, env } = payload;
|
|
127
|
-
const { stdout, stderr } = await execAsync(command, {
|
|
128
|
-
cwd,
|
|
129
|
-
env: { ...process.env, ...env },
|
|
130
|
-
});
|
|
131
|
-
return { stdout, stderr };
|
|
132
|
-
}
|
|
133
|
-
// Execute script
|
|
134
|
-
async function executeScript(payload) {
|
|
135
|
-
const { script, interpreter = "bash", cwd } = payload;
|
|
136
|
-
// Write script to temporary file
|
|
137
|
-
const fs = await import("fs/promises");
|
|
138
|
-
const path = await import("path");
|
|
139
|
-
const os = await import("os");
|
|
140
|
-
const tmpDir = os.tmpdir();
|
|
141
|
-
const scriptFile = path.join(tmpDir, `vibecontrols-script-${Date.now()}.sh`);
|
|
142
|
-
await fs.writeFile(scriptFile, script, { mode: 0o755 });
|
|
143
|
-
try {
|
|
144
|
-
const { stdout, stderr } = await execAsync(`${interpreter} ${scriptFile}`, {
|
|
145
|
-
cwd,
|
|
146
|
-
});
|
|
147
|
-
return { stdout, stderr };
|
|
148
|
-
}
|
|
149
|
-
finally {
|
|
150
|
-
// Clean up
|
|
151
|
-
await fs.unlink(scriptFile).catch(() => { });
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Execute file operation
|
|
155
|
-
async function executeFileOperation(payload) {
|
|
156
|
-
const fs = await import("fs/promises");
|
|
157
|
-
const { operation, path, content } = payload;
|
|
158
|
-
switch (operation) {
|
|
159
|
-
case "read": {
|
|
160
|
-
const data = await fs.readFile(path, "utf-8");
|
|
161
|
-
return { content: data };
|
|
162
|
-
}
|
|
163
|
-
case "write":
|
|
164
|
-
if (!content)
|
|
165
|
-
throw new Error("Content is required for write operation");
|
|
166
|
-
await fs.writeFile(path, content);
|
|
167
|
-
return { success: true };
|
|
168
|
-
case "delete":
|
|
169
|
-
await fs.unlink(path);
|
|
170
|
-
return { success: true };
|
|
171
|
-
case "exists":
|
|
172
|
-
try {
|
|
173
|
-
await fs.access(path);
|
|
174
|
-
return { exists: true };
|
|
175
|
-
}
|
|
176
|
-
catch {
|
|
177
|
-
return { exists: false };
|
|
178
|
-
}
|
|
179
|
-
case "list": {
|
|
180
|
-
const files = await fs.readdir(path);
|
|
181
|
-
return { files };
|
|
182
|
-
}
|
|
183
|
-
default:
|
|
184
|
-
throw new Error(`Unknown file operation: ${operation}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=tasks.js.map
|