@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.
Files changed (164) hide show
  1. package/dist/app-31chs2a1.js +17180 -0
  2. package/dist/app-31chs2a1.js.map +170 -0
  3. package/dist/chunk-pm1hna8x-473akrq0.js +16826 -0
  4. package/dist/chunk-pm1hna8x-473akrq0.js.map +11 -0
  5. package/dist/cli.js +4686 -1146
  6. package/dist/cli.js.map +51 -1
  7. package/dist/highlights-eq9cgrbb.scm +604 -0
  8. package/dist/highlights-ghv9g403.scm +205 -0
  9. package/dist/highlights-hk7bwhj4.scm +284 -0
  10. package/dist/highlights-r812a2qc.scm +150 -0
  11. package/dist/highlights-x6tmsnaa.scm +115 -0
  12. package/dist/index-5xngv42g.js +2546 -0
  13. package/dist/index-5xngv42g.js.map +26 -0
  14. package/dist/index-6aq4nc58.js +11429 -0
  15. package/dist/index-6aq4nc58.js.map +21 -0
  16. package/dist/index-ac2ebaf8.js +4 -0
  17. package/dist/index-ac2ebaf8.js.map +9 -0
  18. package/dist/index-g8dczzvv.js +33 -0
  19. package/dist/index-g8dczzvv.js.map +9 -0
  20. package/dist/index-gmz54dkc.js +28402 -0
  21. package/dist/index-gmz54dkc.js.map +11 -0
  22. package/dist/index-t06ktmx9.js +216 -0
  23. package/dist/index-t06ktmx9.js.map +11 -0
  24. package/dist/index.js +69 -87
  25. package/dist/index.js.map +10 -1
  26. package/dist/injections-73j83es3.scm +27 -0
  27. package/dist/package-0158fp3w.js +136 -0
  28. package/dist/package-0158fp3w.js.map +9 -0
  29. package/dist/plugin-system-bg1pzjj9.js +453 -0
  30. package/dist/plugin-system-bg1pzjj9.js.map +11 -0
  31. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  32. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  33. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  34. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  35. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  36. package/package.json +33 -44
  37. package/dist/app.d.ts +0 -15
  38. package/dist/app.d.ts.map +0 -1
  39. package/dist/app.js +0 -600
  40. package/dist/app.js.map +0 -1
  41. package/dist/cli.d.ts +0 -3
  42. package/dist/cli.d.ts.map +0 -1
  43. package/dist/db/schema.d.ts +0 -121
  44. package/dist/db/schema.d.ts.map +0 -1
  45. package/dist/db/schema.js +0 -473
  46. package/dist/db/schema.js.map +0 -1
  47. package/dist/index.d.ts +0 -2
  48. package/dist/index.d.ts.map +0 -1
  49. package/dist/middleware/ModuleAuth.d.ts +0 -61
  50. package/dist/middleware/ModuleAuth.d.ts.map +0 -1
  51. package/dist/middleware/ModuleAuth.js +0 -223
  52. package/dist/middleware/ModuleAuth.js.map +0 -1
  53. package/dist/middleware/auth.d.ts +0 -3
  54. package/dist/middleware/auth.d.ts.map +0 -1
  55. package/dist/middleware/auth.js +0 -11
  56. package/dist/middleware/auth.js.map +0 -1
  57. package/dist/migrations/remove-notes-prompts.d.ts +0 -13
  58. package/dist/migrations/remove-notes-prompts.d.ts.map +0 -1
  59. package/dist/migrations/remove-notes-prompts.js +0 -148
  60. package/dist/migrations/remove-notes-prompts.js.map +0 -1
  61. package/dist/routes/bookmarks.d.ts +0 -3
  62. package/dist/routes/bookmarks.d.ts.map +0 -1
  63. package/dist/routes/bookmarks.js +0 -195
  64. package/dist/routes/bookmarks.js.map +0 -1
  65. package/dist/routes/config.d.ts +0 -3
  66. package/dist/routes/config.d.ts.map +0 -1
  67. package/dist/routes/config.js +0 -106
  68. package/dist/routes/config.js.map +0 -1
  69. package/dist/routes/files.d.ts +0 -3
  70. package/dist/routes/files.d.ts.map +0 -1
  71. package/dist/routes/files.js +0 -313
  72. package/dist/routes/files.js.map +0 -1
  73. package/dist/routes/git.d.ts +0 -3
  74. package/dist/routes/git.d.ts.map +0 -1
  75. package/dist/routes/git.js +0 -427
  76. package/dist/routes/git.js.map +0 -1
  77. package/dist/routes/logs.d.ts +0 -9
  78. package/dist/routes/logs.d.ts.map +0 -1
  79. package/dist/routes/logs.js +0 -107
  80. package/dist/routes/logs.js.map +0 -1
  81. package/dist/routes/moduleRegistry.d.ts +0 -41
  82. package/dist/routes/moduleRegistry.d.ts.map +0 -1
  83. package/dist/routes/moduleRegistry.js +0 -356
  84. package/dist/routes/moduleRegistry.js.map +0 -1
  85. package/dist/routes/notifications.d.ts +0 -3
  86. package/dist/routes/notifications.d.ts.map +0 -1
  87. package/dist/routes/notifications.js +0 -255
  88. package/dist/routes/notifications.js.map +0 -1
  89. package/dist/routes/plugin-state.d.ts +0 -19
  90. package/dist/routes/plugin-state.d.ts.map +0 -1
  91. package/dist/routes/plugin-state.js +0 -139
  92. package/dist/routes/plugin-state.js.map +0 -1
  93. package/dist/routes/plugins.d.ts +0 -3
  94. package/dist/routes/plugins.d.ts.map +0 -1
  95. package/dist/routes/plugins.js +0 -118
  96. package/dist/routes/plugins.js.map +0 -1
  97. package/dist/routes/projects.d.ts +0 -3
  98. package/dist/routes/projects.d.ts.map +0 -1
  99. package/dist/routes/projects.js +0 -456
  100. package/dist/routes/projects.js.map +0 -1
  101. package/dist/routes/tasks.d.ts +0 -3
  102. package/dist/routes/tasks.d.ts.map +0 -1
  103. package/dist/routes/tasks.js +0 -187
  104. package/dist/routes/tasks.js.map +0 -1
  105. package/dist/routes/tmux.d.ts +0 -3
  106. package/dist/routes/tmux.d.ts.map +0 -1
  107. package/dist/routes/tmux.js +0 -1287
  108. package/dist/routes/tmux.js.map +0 -1
  109. package/dist/routes/tunnel.d.ts +0 -25
  110. package/dist/routes/tunnel.d.ts.map +0 -1
  111. package/dist/routes/tunnel.js +0 -498
  112. package/dist/routes/tunnel.js.map +0 -1
  113. package/dist/services/ModulePermissions.d.ts +0 -100
  114. package/dist/services/ModulePermissions.d.ts.map +0 -1
  115. package/dist/services/ModulePermissions.js +0 -322
  116. package/dist/services/ModulePermissions.js.map +0 -1
  117. package/dist/services/ModuleRegistryService.d.ts +0 -152
  118. package/dist/services/ModuleRegistryService.d.ts.map +0 -1
  119. package/dist/services/ModuleRegistryService.js +0 -547
  120. package/dist/services/ModuleRegistryService.js.map +0 -1
  121. package/dist/services/agent.service.d.ts +0 -19
  122. package/dist/services/agent.service.d.ts.map +0 -1
  123. package/dist/services/agent.service.js +0 -91
  124. package/dist/services/agent.service.js.map +0 -1
  125. package/dist/services/bootstrap.d.ts +0 -22
  126. package/dist/services/bootstrap.d.ts.map +0 -1
  127. package/dist/services/bootstrap.js +0 -283
  128. package/dist/services/bootstrap.js.map +0 -1
  129. package/dist/services/completion.d.ts +0 -46
  130. package/dist/services/completion.d.ts.map +0 -1
  131. package/dist/services/completion.js +0 -317
  132. package/dist/services/completion.js.map +0 -1
  133. package/dist/services/gateway-client.d.ts +0 -61
  134. package/dist/services/gateway-client.d.ts.map +0 -1
  135. package/dist/services/gateway-client.js +0 -147
  136. package/dist/services/gateway-client.js.map +0 -1
  137. package/dist/services/logger.d.ts +0 -61
  138. package/dist/services/logger.d.ts.map +0 -1
  139. package/dist/services/logger.js +0 -223
  140. package/dist/services/logger.js.map +0 -1
  141. package/dist/services/plugin-manager.d.ts +0 -105
  142. package/dist/services/plugin-manager.d.ts.map +0 -1
  143. package/dist/services/plugin-manager.js +0 -250
  144. package/dist/services/plugin-manager.js.map +0 -1
  145. package/dist/services/plugin-state-backend.d.ts +0 -22
  146. package/dist/services/plugin-state-backend.d.ts.map +0 -1
  147. package/dist/services/plugin-state-backend.js +0 -103
  148. package/dist/services/plugin-state-backend.js.map +0 -1
  149. package/dist/services/plugin-state-external.d.ts +0 -36
  150. package/dist/services/plugin-state-external.d.ts.map +0 -1
  151. package/dist/services/plugin-state-external.js +0 -144
  152. package/dist/services/plugin-state-external.js.map +0 -1
  153. package/dist/services/plugin-state-router.d.ts +0 -40
  154. package/dist/services/plugin-state-router.d.ts.map +0 -1
  155. package/dist/services/plugin-state-router.js +0 -82
  156. package/dist/services/plugin-state-router.js.map +0 -1
  157. package/dist/services/port-utils.d.ts +0 -11
  158. package/dist/services/port-utils.d.ts.map +0 -1
  159. package/dist/services/port-utils.js +0 -39
  160. package/dist/services/port-utils.js.map +0 -1
  161. package/dist/services/service-manager.d.ts +0 -50
  162. package/dist/services/service-manager.d.ts.map +0 -1
  163. package/dist/services/service-manager.js +0 -389
  164. package/dist/services/service-manager.js.map +0 -1
@@ -1,195 +0,0 @@
1
- import crypto from "node:crypto";
2
- export const bookmarkRoutes = async (fastify) => {
3
- // Get all bookmarks
4
- fastify.get("/", async (request, _reply) => {
5
- const { projectId } = request.query;
6
- const bookmarks = projectId !== undefined
7
- ? fastify.db.getBookmarkedCommandsByProject(projectId)
8
- : fastify.db.getBookmarkedCommandsByProject(null);
9
- return { bookmarks };
10
- });
11
- // Get bookmarks by project
12
- fastify.get("/project/:projectId", async (request, _reply) => {
13
- const { projectId } = request.params;
14
- const bookmarks = fastify.db.getBookmarkedCommandsByProject(projectId);
15
- return { bookmarks };
16
- });
17
- // Get global bookmarks (no project)
18
- fastify.get("/global", async (_request, _reply) => {
19
- const bookmarks = fastify.db.getBookmarkedCommandsByProject(null);
20
- return { bookmarks };
21
- });
22
- // Get bookmark by ID
23
- fastify.get("/:id", async (request, reply) => {
24
- const { id } = request.params;
25
- const bookmark = fastify.db.getBookmarkedCommand(id);
26
- if (!bookmark) {
27
- return reply.code(404).send({ error: "Bookmarked command not found" });
28
- }
29
- return { bookmark };
30
- });
31
- // Create new bookmark
32
- fastify.post("/", async (request, reply) => {
33
- const { projectId, command, description, category } = request.body;
34
- try {
35
- const bookmark = fastify.db.createBookmarkedCommand({
36
- id: crypto.randomUUID(),
37
- projectId,
38
- command,
39
- description,
40
- category,
41
- });
42
- // Emit bookmark created event
43
- fastify.io.emit("bookmark:created", bookmark);
44
- return { bookmark };
45
- }
46
- catch (error) {
47
- return reply.code(500).send({
48
- error: "Failed to create bookmarked command",
49
- details: error instanceof Error ? error.message : "Unknown error",
50
- });
51
- }
52
- });
53
- // Update bookmark
54
- fastify.put("/:id", async (request, reply) => {
55
- const { id } = request.params;
56
- const { command, description, category } = request.body;
57
- try {
58
- const bookmark = fastify.db.getBookmarkedCommand(id);
59
- if (!bookmark) {
60
- return reply.code(404).send({ error: "Bookmarked command not found" });
61
- }
62
- const updates = {};
63
- if (command !== undefined)
64
- updates.command = command;
65
- if (description !== undefined)
66
- updates.description = description;
67
- if (category !== undefined)
68
- updates.category = category;
69
- fastify.db.updateBookmarkedCommand(id, updates);
70
- // Get updated bookmark
71
- const updatedBookmark = fastify.db.getBookmarkedCommand(id);
72
- // Emit bookmark updated event
73
- fastify.io.emit("bookmark:updated", updatedBookmark);
74
- return { bookmark: updatedBookmark };
75
- }
76
- catch (error) {
77
- return reply.code(500).send({
78
- error: "Failed to update bookmarked command",
79
- details: error instanceof Error ? error.message : "Unknown error",
80
- });
81
- }
82
- });
83
- // Delete bookmark
84
- fastify.delete("/:id", async (request, reply) => {
85
- const { id } = request.params;
86
- try {
87
- const bookmark = fastify.db.getBookmarkedCommand(id);
88
- if (!bookmark) {
89
- return reply.code(404).send({ error: "Bookmarked command not found" });
90
- }
91
- fastify.db.deleteBookmarkedCommand(id);
92
- // Emit bookmark deleted event
93
- fastify.io.emit("bookmark:deleted", {
94
- id,
95
- projectId: bookmark.projectId,
96
- });
97
- return { success: true };
98
- }
99
- catch (error) {
100
- return reply.code(500).send({
101
- error: "Failed to delete bookmarked command",
102
- details: error instanceof Error ? error.message : "Unknown error",
103
- });
104
- }
105
- });
106
- // Execute bookmarked command
107
- fastify.post("/:id/execute", async (request, reply) => {
108
- const { id } = request.params;
109
- const { sessionId, cwd } = request.body;
110
- try {
111
- const bookmark = fastify.db.getBookmarkedCommand(id);
112
- if (!bookmark) {
113
- return reply.code(404).send({ error: "Bookmarked command not found" });
114
- }
115
- // If sessionId is provided, execute in tmux session
116
- if (sessionId) {
117
- const session = fastify.db.getTmuxSession(sessionId);
118
- if (!session) {
119
- return reply.code(404).send({ error: "Session not found" });
120
- }
121
- // Execute command in tmux session
122
- const { spawn } = await import("child_process");
123
- const tmuxProcess = spawn("tmux", [
124
- "send-keys",
125
- "-t",
126
- session.sessionName,
127
- bookmark.command,
128
- "Enter",
129
- ]);
130
- await new Promise((resolve, reject) => {
131
- tmuxProcess.on("close", (code) => {
132
- if (code === 0)
133
- resolve(undefined);
134
- else
135
- reject(new Error(`Tmux exited with code ${code}`));
136
- });
137
- tmuxProcess.on("error", reject);
138
- });
139
- // Emit command executed event
140
- fastify.io.emit("bookmark:executed", {
141
- bookmarkId: id,
142
- command: bookmark.command,
143
- sessionId,
144
- });
145
- return {
146
- success: true,
147
- executedIn: "tmux",
148
- sessionId,
149
- };
150
- }
151
- else {
152
- // Execute as a task
153
- const task = fastify.db.createTask({
154
- id: crypto.randomUUID(),
155
- type: "command",
156
- status: "pending",
157
- payload: JSON.stringify({
158
- command: bookmark.command,
159
- cwd: cwd || process.cwd(),
160
- }),
161
- });
162
- // Emit task created event
163
- fastify.io.emit("task:created", task);
164
- // Process task asynchronously (reuse task processing logic)
165
- // This would need to be imported from tasks route
166
- return {
167
- success: true,
168
- executedIn: "task",
169
- taskId: task.id,
170
- };
171
- }
172
- }
173
- catch (error) {
174
- return reply.code(500).send({
175
- error: "Failed to execute bookmarked command",
176
- details: error instanceof Error ? error.message : "Unknown error",
177
- });
178
- }
179
- });
180
- // Get bookmarks by category
181
- fastify.get("/category/:category", async (request, _reply) => {
182
- const { category } = request.params;
183
- // Get all bookmarks and filter by category
184
- const allBookmarks = [
185
- ...fastify.db.getBookmarkedCommandsByProject(null),
186
- // Would need to implement getAllBookmarkedCommands to get all
187
- ];
188
- const filteredBookmarks = allBookmarks.filter((b) => b.category === category);
189
- return {
190
- bookmarks: filteredBookmarks,
191
- category,
192
- };
193
- });
194
- };
195
- //# sourceMappingURL=bookmarks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bookmarks.js","sourceRoot":"","sources":["../../src/routes/bookmarks.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { FastifyPluginAsync } from "fastify";
2
- export declare const configRoutes: FastifyPluginAsync;
3
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAM7C,eAAO,MAAM,YAAY,EAAE,kBAyH1B,CAAC"}
@@ -1,106 +0,0 @@
1
- export const configRoutes = async (fastify) => {
2
- // Get all configuration
3
- fastify.get("/", async (_request, _reply) => {
4
- const config = fastify.db.getAllConfig();
5
- return { config };
6
- });
7
- // Get specific config value
8
- fastify.get("/:key", async (request, reply) => {
9
- const { key } = request.params;
10
- const value = fastify.db.getConfig(key);
11
- if (value === undefined) {
12
- return reply.code(404).send({ error: "Configuration key not found" });
13
- }
14
- return { key, value };
15
- });
16
- // Set config value
17
- fastify.put("/:key", async (request, reply) => {
18
- const { key } = request.params;
19
- const { value } = request.body;
20
- try {
21
- fastify.db.setConfig(key, value);
22
- // Emit config changed event
23
- fastify.io.emit("config:changed", { key, value });
24
- return { success: true };
25
- }
26
- catch (error) {
27
- return reply.code(500).send({
28
- error: "Failed to set configuration",
29
- details: error instanceof Error ? error.message : "Unknown error",
30
- });
31
- }
32
- });
33
- // Delete config value
34
- fastify.delete("/:key", async (request, reply) => {
35
- const { key } = request.params;
36
- try {
37
- // Check if config exists
38
- const currentValue = fastify.db.getConfig(key);
39
- if (currentValue === undefined) {
40
- return reply.code(404).send({ error: "Configuration key not found" });
41
- }
42
- // Delete the config by setting it to undefined
43
- // Note: SQLite doesn't have a direct delete operation in our current schema
44
- // We'll use a special marker to indicate deletion
45
- fastify.db.setConfig(key, "__DELETED__");
46
- // Emit config deleted event
47
- fastify.io.emit("config:deleted", { key });
48
- return { success: true };
49
- }
50
- catch (error) {
51
- return reply.code(500).send({
52
- error: "Failed to delete configuration",
53
- details: error instanceof Error ? error.message : "Unknown error",
54
- });
55
- }
56
- });
57
- // Bulk set configuration
58
- fastify.post("/bulk", async (request, reply) => {
59
- const { configs } = request.body;
60
- try {
61
- for (const [key, value] of Object.entries(configs)) {
62
- fastify.db.setConfig(key, value);
63
- }
64
- // Emit config changed event
65
- fastify.io.emit("config:bulk-changed", { configs });
66
- return { success: true };
67
- }
68
- catch (error) {
69
- return reply.code(500).send({
70
- error: "Failed to set configuration",
71
- details: error instanceof Error ? error.message : "Unknown error",
72
- });
73
- }
74
- });
75
- // Get system info
76
- fastify.get("/system/info", async (_request, _reply) => {
77
- const os = await import("os");
78
- return {
79
- hostname: os.hostname(),
80
- platform: os.platform(),
81
- arch: os.arch(),
82
- release: os.release(),
83
- cpus: os.cpus().length,
84
- totalMemory: os.totalmem(),
85
- freeMemory: os.freemem(),
86
- uptime: os.uptime(),
87
- nodeVersion: process.version,
88
- agentVersion: "1.0.0",
89
- environment: process.env.NODE_ENV || "development",
90
- };
91
- });
92
- // Get agent status
93
- fastify.get("/status", async (_request, _reply) => {
94
- const tmuxSessions = fastify.db.getAllTmuxSessions();
95
- return {
96
- status: "online",
97
- timestamp: new Date().toISOString(),
98
- stats: {
99
- activeSessions: tmuxSessions.filter((s) => s.status === "active")
100
- .length,
101
- totalSessions: tmuxSessions.length,
102
- },
103
- };
104
- });
105
- };
106
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { FastifyPluginAsync } from "fastify";
2
- export declare const fileRoutes: FastifyPluginAsync;
3
- //# sourceMappingURL=files.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAoB7C,eAAO,MAAM,UAAU,EAAE,kBA+VxB,CAAC"}
@@ -1,313 +0,0 @@
1
- import { promises as fs } 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 } = request.body;
7
- try {
8
- // Security check - prevent directory traversal
9
- const normalizedPath = path.normalize(filePath);
10
- if (normalizedPath.includes("..")) {
11
- return reply
12
- .code(403)
13
- .send({ error: "Directory traversal not allowed" });
14
- }
15
- // Check for sensitive files
16
- const sensitivePatterns = [
17
- /\.env$/,
18
- /\.pem$/,
19
- /\.key$/,
20
- /id_rsa/,
21
- /\.ssh\//,
22
- /\.git\/config$/,
23
- /\.npmrc$/,
24
- ];
25
- if (sensitivePatterns.some((pattern) => pattern.test(normalizedPath))) {
26
- return reply
27
- .code(403)
28
- .send({ error: "Access to sensitive files not allowed" });
29
- }
30
- const content = await fs.readFile(normalizedPath, "utf-8");
31
- // Emit file read event
32
- fastify.io.emit("file:read", {
33
- path: normalizedPath,
34
- projectId,
35
- size: content.length,
36
- });
37
- return {
38
- content,
39
- path: normalizedPath,
40
- size: content.length,
41
- };
42
- }
43
- catch (error) {
44
- const nodeError = error;
45
- if (nodeError.code === "ENOENT") {
46
- return reply.code(404).send({ error: "File not found" });
47
- }
48
- if (nodeError.code === "EACCES") {
49
- return reply.code(403).send({ error: "Permission denied" });
50
- }
51
- return reply.code(500).send({
52
- error: "Failed to read file",
53
- details: error instanceof Error ? error.message : "Unknown error",
54
- });
55
- }
56
- });
57
- // Write file
58
- fastify.post("/write", async (request, reply) => {
59
- const { path: filePath, content, projectId, } = request.body;
60
- try {
61
- // Security check - prevent directory traversal
62
- const normalizedPath = path.normalize(filePath);
63
- if (normalizedPath.includes("..")) {
64
- return reply
65
- .code(403)
66
- .send({ error: "Directory traversal not allowed" });
67
- }
68
- // Create directory if it doesn't exist
69
- const dir = path.dirname(normalizedPath);
70
- await fs.mkdir(dir, { recursive: true });
71
- // Write file
72
- await fs.writeFile(normalizedPath, content, "utf-8");
73
- // Get file stats
74
- const stats = await fs.stat(normalizedPath);
75
- // Emit file write event
76
- fastify.io.emit("file:write", {
77
- path: normalizedPath,
78
- projectId,
79
- size: stats.size,
80
- });
81
- return {
82
- success: true,
83
- path: normalizedPath,
84
- size: stats.size,
85
- };
86
- }
87
- catch (error) {
88
- const nodeError = error;
89
- if (nodeError.code === "EACCES") {
90
- return reply.code(403).send({ error: "Permission denied" });
91
- }
92
- return reply.code(500).send({
93
- error: "Failed to write file",
94
- details: error instanceof Error ? error.message : "Unknown error",
95
- });
96
- }
97
- });
98
- // List directory
99
- fastify.post("/list", async (request, reply) => {
100
- const { path: dirPath } = request.body;
101
- try {
102
- // Security check - prevent directory traversal
103
- const normalizedPath = path.normalize(dirPath);
104
- if (normalizedPath.includes("..")) {
105
- return reply
106
- .code(403)
107
- .send({ error: "Directory traversal not allowed" });
108
- }
109
- const entries = await fs.readdir(normalizedPath, {
110
- withFileTypes: true,
111
- });
112
- const files = await Promise.all(entries.map(async (entry) => {
113
- const fullPath = path.join(normalizedPath, entry.name);
114
- let stats;
115
- try {
116
- stats = await fs.stat(fullPath);
117
- }
118
- catch {
119
- // Handle broken symlinks
120
- stats = null;
121
- }
122
- return {
123
- name: entry.name,
124
- path: fullPath,
125
- type: entry.isDirectory()
126
- ? "directory"
127
- : entry.isFile()
128
- ? "file"
129
- : entry.isSymbolicLink()
130
- ? "symlink"
131
- : "other",
132
- size: stats?.size || 0,
133
- modified: stats?.mtime || null,
134
- permissions: stats?.mode || null,
135
- };
136
- }));
137
- // Sort: directories first, then files
138
- files.sort((a, b) => {
139
- if (a.type === "directory" && b.type !== "directory")
140
- return -1;
141
- if (a.type !== "directory" && b.type === "directory")
142
- return 1;
143
- return a.name.localeCompare(b.name);
144
- });
145
- return {
146
- path: normalizedPath,
147
- files,
148
- count: files.length,
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
176
- .code(403)
177
- .send({ error: "Directory traversal not allowed" });
178
- }
179
- await fs.access(normalizedPath);
180
- const stats = await fs.stat(normalizedPath);
181
- return {
182
- exists: true,
183
- path: normalizedPath,
184
- type: stats.isDirectory()
185
- ? "directory"
186
- : stats.isFile()
187
- ? "file"
188
- : "other",
189
- size: stats.size,
190
- modified: stats.mtime,
191
- };
192
- }
193
- catch (error) {
194
- const nodeError = error;
195
- if (nodeError.code === "ENOENT") {
196
- return {
197
- exists: false,
198
- path: path.normalize(checkPath),
199
- };
200
- }
201
- return reply.code(500).send({
202
- error: "Failed to check path",
203
- details: error instanceof Error ? error.message : "Unknown error",
204
- });
205
- }
206
- });
207
- // Delete file or directory
208
- fastify.post("/delete", async (request, reply) => {
209
- const { path: deletePath } = request.body;
210
- try {
211
- // Security check - prevent directory traversal
212
- const normalizedPath = path.normalize(deletePath);
213
- if (normalizedPath.includes("..")) {
214
- return reply
215
- .code(403)
216
- .send({ error: "Directory traversal not allowed" });
217
- }
218
- // Additional security check for important paths
219
- const protectedPaths = [
220
- "/",
221
- "/etc",
222
- "/usr",
223
- "/bin",
224
- "/sbin",
225
- "/var",
226
- "/opt",
227
- ];
228
- if (protectedPaths.includes(normalizedPath) ||
229
- protectedPaths.some((p) => normalizedPath.startsWith(p + "/"))) {
230
- return reply
231
- .code(403)
232
- .send({ error: "Cannot delete system directories" });
233
- }
234
- const stats = await fs.stat(normalizedPath);
235
- if (stats.isDirectory()) {
236
- await fs.rmdir(normalizedPath, { recursive: true });
237
- }
238
- else {
239
- await fs.unlink(normalizedPath);
240
- }
241
- // Emit file delete event
242
- fastify.io.emit("file:delete", {
243
- path: normalizedPath,
244
- type: stats.isDirectory() ? "directory" : "file",
245
- });
246
- return {
247
- success: true,
248
- path: normalizedPath,
249
- };
250
- }
251
- catch (error) {
252
- const nodeError = error;
253
- if (nodeError.code === "ENOENT") {
254
- return reply.code(404).send({ error: "Path not found" });
255
- }
256
- if (nodeError.code === "EACCES") {
257
- return reply.code(403).send({ error: "Permission denied" });
258
- }
259
- return reply.code(500).send({
260
- error: "Failed to delete path",
261
- details: error instanceof Error ? error.message : "Unknown error",
262
- });
263
- }
264
- });
265
- // Read README file
266
- fastify.post("/readme", async (request, reply) => {
267
- const { path: projectPath } = request.body;
268
- try {
269
- // Security check - prevent directory traversal
270
- const normalizedPath = path.normalize(projectPath);
271
- if (normalizedPath.includes("..")) {
272
- return reply
273
- .code(403)
274
- .send({ error: "Directory traversal not allowed" });
275
- }
276
- // README file variants to check
277
- const readmeVariants = [
278
- "README.md",
279
- "readme.md",
280
- "README.MD",
281
- "README",
282
- "readme",
283
- "README.txt",
284
- "readme.txt",
285
- "README.rst",
286
- "readme.rst",
287
- ];
288
- for (const variant of readmeVariants) {
289
- const readmePath = path.join(normalizedPath, variant);
290
- try {
291
- const content = await fs.readFile(readmePath, "utf-8");
292
- return {
293
- content,
294
- path: readmePath,
295
- variant,
296
- size: content.length,
297
- };
298
- }
299
- catch {
300
- // Continue to next variant
301
- }
302
- }
303
- return reply.code(404).send({ error: "No README file found" });
304
- }
305
- catch (error) {
306
- return reply.code(500).send({
307
- error: "Failed to read README",
308
- details: error instanceof Error ? error.message : "Unknown error",
309
- });
310
- }
311
- });
312
- };
313
- //# sourceMappingURL=files.js.map