@burdenoff/vibe-agent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +22 -0
  3. package/README.md +290 -0
  4. package/dist/app.d.ts +15 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +445 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +1043 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/db/schema.d.ts +145 -0
  13. package/dist/db/schema.d.ts.map +1 -0
  14. package/dist/db/schema.js +536 -0
  15. package/dist/db/schema.js.map +1 -0
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +61 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/middleware/ModuleAuth.d.ts +61 -0
  21. package/dist/middleware/ModuleAuth.d.ts.map +1 -0
  22. package/dist/middleware/ModuleAuth.js +220 -0
  23. package/dist/middleware/ModuleAuth.js.map +1 -0
  24. package/dist/middleware/auth.d.ts +3 -0
  25. package/dist/middleware/auth.d.ts.map +1 -0
  26. package/dist/middleware/auth.js +11 -0
  27. package/dist/middleware/auth.js.map +1 -0
  28. package/dist/migrations/remove-notes-prompts.d.ts +13 -0
  29. package/dist/migrations/remove-notes-prompts.d.ts.map +1 -0
  30. package/dist/migrations/remove-notes-prompts.js +148 -0
  31. package/dist/migrations/remove-notes-prompts.js.map +1 -0
  32. package/dist/routes/bookmarks.d.ts +3 -0
  33. package/dist/routes/bookmarks.d.ts.map +1 -0
  34. package/dist/routes/bookmarks.js +186 -0
  35. package/dist/routes/bookmarks.js.map +1 -0
  36. package/dist/routes/config.d.ts +3 -0
  37. package/dist/routes/config.d.ts.map +1 -0
  38. package/dist/routes/config.js +108 -0
  39. package/dist/routes/config.js.map +1 -0
  40. package/dist/routes/files.d.ts +3 -0
  41. package/dist/routes/files.d.ts.map +1 -0
  42. package/dist/routes/files.js +471 -0
  43. package/dist/routes/files.js.map +1 -0
  44. package/dist/routes/git.d.ts +3 -0
  45. package/dist/routes/git.d.ts.map +1 -0
  46. package/dist/routes/git.js +498 -0
  47. package/dist/routes/git.js.map +1 -0
  48. package/dist/routes/moduleRegistry.d.ts +41 -0
  49. package/dist/routes/moduleRegistry.d.ts.map +1 -0
  50. package/dist/routes/moduleRegistry.js +356 -0
  51. package/dist/routes/moduleRegistry.js.map +1 -0
  52. package/dist/routes/notifications.d.ts +3 -0
  53. package/dist/routes/notifications.d.ts.map +1 -0
  54. package/dist/routes/notifications.js +250 -0
  55. package/dist/routes/notifications.js.map +1 -0
  56. package/dist/routes/port-forward.d.ts +3 -0
  57. package/dist/routes/port-forward.d.ts.map +1 -0
  58. package/dist/routes/port-forward.js +205 -0
  59. package/dist/routes/port-forward.js.map +1 -0
  60. package/dist/routes/projects.d.ts +3 -0
  61. package/dist/routes/projects.d.ts.map +1 -0
  62. package/dist/routes/projects.js +442 -0
  63. package/dist/routes/projects.js.map +1 -0
  64. package/dist/routes/ssh.d.ts +3 -0
  65. package/dist/routes/ssh.d.ts.map +1 -0
  66. package/dist/routes/ssh.js +192 -0
  67. package/dist/routes/ssh.js.map +1 -0
  68. package/dist/routes/tasks.d.ts +3 -0
  69. package/dist/routes/tasks.d.ts.map +1 -0
  70. package/dist/routes/tasks.js +183 -0
  71. package/dist/routes/tasks.js.map +1 -0
  72. package/dist/routes/tmux.d.ts +3 -0
  73. package/dist/routes/tmux.d.ts.map +1 -0
  74. package/dist/routes/tmux.js +1191 -0
  75. package/dist/routes/tmux.js.map +1 -0
  76. package/dist/routes/tunnel.d.ts +25 -0
  77. package/dist/routes/tunnel.d.ts.map +1 -0
  78. package/dist/routes/tunnel.js +449 -0
  79. package/dist/routes/tunnel.js.map +1 -0
  80. package/dist/services/ModulePermissions.d.ts +100 -0
  81. package/dist/services/ModulePermissions.d.ts.map +1 -0
  82. package/dist/services/ModulePermissions.js +312 -0
  83. package/dist/services/ModulePermissions.js.map +1 -0
  84. package/dist/services/ModuleRegistryService.d.ts +152 -0
  85. package/dist/services/ModuleRegistryService.d.ts.map +1 -0
  86. package/dist/services/ModuleRegistryService.js +522 -0
  87. package/dist/services/ModuleRegistryService.js.map +1 -0
  88. package/dist/services/agent.service.d.ts +19 -0
  89. package/dist/services/agent.service.d.ts.map +1 -0
  90. package/dist/services/agent.service.js +88 -0
  91. package/dist/services/agent.service.js.map +1 -0
  92. package/dist/services/bootstrap.d.ts +22 -0
  93. package/dist/services/bootstrap.d.ts.map +1 -0
  94. package/dist/services/bootstrap.js +206 -0
  95. package/dist/services/bootstrap.js.map +1 -0
  96. package/dist/services/service-manager.d.ts +50 -0
  97. package/dist/services/service-manager.d.ts.map +1 -0
  98. package/dist/services/service-manager.js +382 -0
  99. package/dist/services/service-manager.js.map +1 -0
  100. package/package.json +107 -0
@@ -0,0 +1,382 @@
1
+ import { spawn, exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { homedir } from 'os';
6
+ import psTree from 'ps-tree';
7
+ import ora from 'ora';
8
+ const execAsync = promisify(exec);
9
+ const psTreeAsync = promisify(psTree);
10
+ export class ServiceManager {
11
+ registryPath;
12
+ logsDir;
13
+ constructor() {
14
+ const configDir = join(homedir(), '.vibecontrols');
15
+ this.registryPath = join(configDir, 'agents.json');
16
+ this.logsDir = join(configDir, 'logs');
17
+ // Ensure directories exist
18
+ mkdirSync(configDir, { recursive: true });
19
+ mkdirSync(this.logsDir, { recursive: true });
20
+ }
21
+ async startDaemon(config) {
22
+ const spinner = ora(`Starting agent '${config.name}'...`).start();
23
+ try {
24
+ // Check if already running
25
+ const existing = await this.findProcessByName(config.name);
26
+ if (existing && existing.status === 'running') {
27
+ spinner.warn(`Agent '${config.name}' is already running on port ${existing.port}`);
28
+ return;
29
+ }
30
+ // Create log file
31
+ const logFile = join(this.logsDir, `${config.name}.log`);
32
+ // Spawn the process
33
+ const child = spawn(process.execPath, [
34
+ join(process.cwd(), 'dist/index.js')
35
+ ], {
36
+ detached: true,
37
+ stdio: ['ignore', 'pipe', 'pipe'],
38
+ env: {
39
+ ...process.env,
40
+ PORT: config.port.toString(),
41
+ DB_PATH: config.dbPath,
42
+ NODE_ENV: 'production'
43
+ }
44
+ });
45
+ // Redirect output to log file
46
+ if (child.stdout) {
47
+ child.stdout.on('data', (data) => {
48
+ const timestamp = new Date().toISOString();
49
+ const logEntry = `[${timestamp}] ${data.toString()}`;
50
+ this.appendToLog(config.name, logEntry);
51
+ });
52
+ }
53
+ if (child.stderr) {
54
+ child.stderr.on('data', (data) => {
55
+ const timestamp = new Date().toISOString();
56
+ const logEntry = `[${timestamp}] ERROR: ${data.toString()}`;
57
+ this.appendToLog(config.name, logEntry);
58
+ });
59
+ }
60
+ // Unreference the child process
61
+ child.unref();
62
+ // Wait a moment to ensure the process started
63
+ await new Promise(resolve => setTimeout(resolve, 2000));
64
+ // Check if process is still running
65
+ const isRunning = await this.isProcessRunning(child.pid);
66
+ if (!isRunning) {
67
+ spinner.fail(`Failed to start agent '${config.name}'`);
68
+ throw new Error('Process failed to start');
69
+ }
70
+ // Save process info
71
+ await this.saveProcessInfo(config.name, child.pid, config);
72
+ spinner.succeed(`🚀 Agent '${config.name}' started successfully (PID: ${child.pid}, Port: ${config.port})`);
73
+ }
74
+ catch (error) {
75
+ spinner.fail(`Failed to start agent '${config.name}'`);
76
+ throw error;
77
+ }
78
+ }
79
+ async stop(name) {
80
+ const spinner = ora(`Stopping agent '${name}'...`).start();
81
+ try {
82
+ const agentProcess = await this.findProcessByName(name);
83
+ if (!agentProcess || agentProcess.status !== 'running') {
84
+ spinner.warn(`Agent '${name}' is not running`);
85
+ return;
86
+ }
87
+ // Send SIGTERM
88
+ try {
89
+ process.kill(agentProcess.pid, 'SIGTERM');
90
+ // Wait for graceful shutdown
91
+ await new Promise(resolve => setTimeout(resolve, 3000));
92
+ // Check if still running
93
+ const stillRunning = await this.isProcessRunning(agentProcess.pid);
94
+ if (stillRunning) {
95
+ // Force kill if still running
96
+ process.kill(agentProcess.pid, 'SIGKILL');
97
+ }
98
+ // Update registry
99
+ await this.updateProcessStatus(name, 'stopped');
100
+ spinner.succeed(`✅ Agent '${name}' stopped successfully`);
101
+ }
102
+ catch (error) {
103
+ spinner.fail(`Failed to stop agent '${name}'`);
104
+ throw error;
105
+ }
106
+ }
107
+ catch (error) {
108
+ spinner.fail(`Failed to stop agent '${name}'`);
109
+ throw error;
110
+ }
111
+ }
112
+ async restart(name, config) {
113
+ const spinner = ora(`Restarting agent '${name}'...`).start();
114
+ try {
115
+ // Stop if running
116
+ const existing = await this.findProcessByName(name);
117
+ if (existing && existing.status === 'running') {
118
+ spinner.text = `Stopping agent '${name}'...`;
119
+ await this.stop(name);
120
+ }
121
+ // Start with new config
122
+ spinner.text = `Starting agent '${name}'...`;
123
+ await this.startDaemon(config);
124
+ spinner.succeed(`🔄 Agent '${name}' restarted successfully`);
125
+ }
126
+ catch (error) {
127
+ spinner.fail(`Failed to restart agent '${name}'`);
128
+ throw error;
129
+ }
130
+ }
131
+ async stopAll() {
132
+ const spinner = ora('Stopping all agents...').start();
133
+ try {
134
+ const processes = await this.getRunningProcesses();
135
+ if (processes.length === 0) {
136
+ spinner.warn('No running agents found');
137
+ return;
138
+ }
139
+ // Stop all processes
140
+ for (const process of processes) {
141
+ await this.stop(process.name);
142
+ }
143
+ spinner.succeed(`✅ Stopped ${processes.length} agent(s)`);
144
+ }
145
+ catch (error) {
146
+ spinner.fail('Failed to stop all agents');
147
+ throw error;
148
+ }
149
+ }
150
+ async kill(name) {
151
+ const spinner = ora(`Force killing agent '${name}'...`).start();
152
+ try {
153
+ const agentProcess = await this.findProcessByName(name);
154
+ if (!agentProcess || agentProcess.status !== 'running') {
155
+ spinner.warn(`Agent '${name}' is not running`);
156
+ return;
157
+ }
158
+ // Force kill
159
+ await this.killProcessTree(agentProcess.pid);
160
+ // Update registry
161
+ await this.updateProcessStatus(name, 'stopped');
162
+ spinner.succeed(`💀 Agent '${name}' killed successfully`);
163
+ }
164
+ catch (error) {
165
+ spinner.fail(`Failed to kill agent '${name}'`);
166
+ throw error;
167
+ }
168
+ }
169
+ async killAll() {
170
+ const spinner = ora('Force killing all agents...').start();
171
+ try {
172
+ const processes = await this.getRunningProcesses();
173
+ if (processes.length === 0) {
174
+ spinner.warn('No running agents found');
175
+ return;
176
+ }
177
+ // Kill all processes
178
+ for (const process of processes) {
179
+ await this.kill(process.name);
180
+ }
181
+ spinner.succeed(`💀 Killed ${processes.length} agent(s)`);
182
+ }
183
+ catch (error) {
184
+ spinner.fail('Failed to kill all agents');
185
+ throw error;
186
+ }
187
+ }
188
+ async getStatus(name) {
189
+ const process = await this.findProcessByName(name);
190
+ return process;
191
+ }
192
+ async getStatusAll() {
193
+ const registry = await this.loadRegistry();
194
+ const processes = [];
195
+ for (const processInfo of registry) {
196
+ const isRunning = await this.isProcessRunning(processInfo.pid);
197
+ processes.push({
198
+ ...processInfo,
199
+ status: isRunning ? 'running' : 'stopped'
200
+ });
201
+ }
202
+ return processes;
203
+ }
204
+ async listInstances() {
205
+ return await this.getStatusAll();
206
+ }
207
+ async showLogs(name, options) {
208
+ const logFile = join(this.logsDir, `${name}.log`);
209
+ if (!existsSync(logFile)) {
210
+ console.log(`No logs found for agent '${name}'`);
211
+ return;
212
+ }
213
+ if (options.follow) {
214
+ // Follow logs (simplified implementation)
215
+ const { spawn } = await import('child_process');
216
+ const tail = spawn('tail', ['-f', '-n', options.tail.toString(), logFile]);
217
+ tail.stdout?.on('data', (data) => {
218
+ process.stdout.write(data);
219
+ });
220
+ tail.stderr?.on('data', (data) => {
221
+ process.stderr.write(data);
222
+ });
223
+ // Handle Ctrl+C
224
+ process.on('SIGINT', () => {
225
+ tail.kill();
226
+ process.exit(0);
227
+ });
228
+ }
229
+ else {
230
+ // Show last N lines
231
+ try {
232
+ const { stdout } = await execAsync(`tail -n ${options.tail} "${logFile}"`);
233
+ console.log(stdout);
234
+ }
235
+ catch (error) {
236
+ console.error('Failed to read logs:', error);
237
+ }
238
+ }
239
+ }
240
+ async checkHealth(name) {
241
+ const process = await this.findProcessByName(name);
242
+ if (!process || process.status !== 'running') {
243
+ return { healthy: false, details: { error: 'Process not running' } };
244
+ }
245
+ try {
246
+ // Make HTTP request to health endpoint
247
+ const response = await fetch(`http://localhost:${process.port}/health`);
248
+ const data = await response.json();
249
+ return {
250
+ healthy: response.ok,
251
+ details: data
252
+ };
253
+ }
254
+ catch (error) {
255
+ return {
256
+ healthy: false,
257
+ details: { error: 'Health check failed', message: error.message }
258
+ };
259
+ }
260
+ }
261
+ async checkHealthAll() {
262
+ const processes = await this.getRunningProcesses();
263
+ const health = {};
264
+ for (const process of processes) {
265
+ health[process.name] = await this.checkHealth(process.name);
266
+ }
267
+ return health;
268
+ }
269
+ async setConfig(key, value) {
270
+ // Implementation for setting global configuration
271
+ const configFile = join(homedir(), '.vibecontrols', 'config.json');
272
+ let config = {};
273
+ if (existsSync(configFile)) {
274
+ config = JSON.parse(readFileSync(configFile, 'utf8'));
275
+ }
276
+ config[key] = value;
277
+ writeFileSync(configFile, JSON.stringify(config, null, 2));
278
+ }
279
+ async getConfig(key) {
280
+ const configFile = join(homedir(), '.vibecontrols', 'config.json');
281
+ if (!existsSync(configFile)) {
282
+ return key ? undefined : {};
283
+ }
284
+ const config = JSON.parse(readFileSync(configFile, 'utf8'));
285
+ return key ? config[key] : config;
286
+ }
287
+ // Private helper methods
288
+ async loadRegistry() {
289
+ if (!existsSync(this.registryPath)) {
290
+ return [];
291
+ }
292
+ try {
293
+ const data = readFileSync(this.registryPath, 'utf8');
294
+ return JSON.parse(data);
295
+ }
296
+ catch (error) {
297
+ console.warn('Failed to load registry:', error);
298
+ return [];
299
+ }
300
+ }
301
+ async saveRegistry(processes) {
302
+ writeFileSync(this.registryPath, JSON.stringify(processes, null, 2));
303
+ }
304
+ async saveProcessInfo(name, pid, config) {
305
+ const registry = await this.loadRegistry();
306
+ // Remove existing entry with same name
307
+ const filtered = registry.filter(p => p.name !== name);
308
+ // Add new entry
309
+ const processInfo = {
310
+ name,
311
+ pid,
312
+ port: config.port,
313
+ config,
314
+ startTime: new Date().toISOString(),
315
+ status: 'running'
316
+ };
317
+ filtered.push(processInfo);
318
+ await this.saveRegistry(filtered);
319
+ }
320
+ async updateProcessStatus(name, status) {
321
+ const registry = await this.loadRegistry();
322
+ const process = registry.find(p => p.name === name);
323
+ if (process) {
324
+ process.status = status;
325
+ await this.saveRegistry(registry);
326
+ }
327
+ }
328
+ async findProcessByName(name) {
329
+ const registry = await this.loadRegistry();
330
+ const process = registry.find(p => p.name === name);
331
+ if (!process) {
332
+ return null;
333
+ }
334
+ // Update status based on actual process state
335
+ const isRunning = await this.isProcessRunning(process.pid);
336
+ process.status = isRunning ? 'running' : 'stopped';
337
+ return process;
338
+ }
339
+ async getRunningProcesses() {
340
+ const processes = await this.getStatusAll();
341
+ return processes.filter(p => p.status === 'running');
342
+ }
343
+ async isProcessRunning(pid) {
344
+ try {
345
+ // Use kill with signal 0 to check if process exists
346
+ process.kill(pid, 0);
347
+ return true;
348
+ }
349
+ catch (error) {
350
+ return false;
351
+ }
352
+ }
353
+ async killProcessTree(pid) {
354
+ try {
355
+ const children = await psTreeAsync(pid);
356
+ // Kill all child processes first
357
+ for (const child of children) {
358
+ try {
359
+ process.kill(parseInt(child.PID), 'SIGKILL');
360
+ }
361
+ catch (error) {
362
+ // Ignore errors for processes that might already be dead
363
+ }
364
+ }
365
+ // Kill the main process
366
+ process.kill(pid, 'SIGKILL');
367
+ }
368
+ catch (error) {
369
+ // Process might already be dead
370
+ }
371
+ }
372
+ appendToLog(name, data) {
373
+ const logFile = join(this.logsDir, `${name}.log`);
374
+ try {
375
+ writeFileSync(logFile, data, { flag: 'a' });
376
+ }
377
+ catch (error) {
378
+ console.error('Failed to write to log file:', error);
379
+ }
380
+ }
381
+ }
382
+ //# sourceMappingURL=service-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-manager.js","sourceRoot":"","sources":["../../src/services/service-manager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,107 @@
1
+ {
2
+ "name": "@burdenoff/vibe-agent",
3
+ "version": "1.0.0",
4
+ "main": "./dist/index.js",
5
+ "type": "module",
6
+ "bin": {
7
+ "vibe": "./dist/cli.js"
8
+ },
9
+ "engines": {
10
+ "node": ">=18.0.0"
11
+ },
12
+ "scripts": {
13
+ "dev": "node --watch --experimental-specifier-resolution=node ./dist/index.js",
14
+ "dev:ts": "npx tsx --watch ./src/index.ts",
15
+ "start": "node ./dist/index.js",
16
+ "build": "tsc",
17
+ "lint": "eslint ./src",
18
+ "lint:fix": "eslint ./src --fix",
19
+ "format": "npx prettier . --write",
20
+ "format:check": "npx prettier . --check",
21
+ "type:check": "tsc --noEmit",
22
+ "test": "node --test tests/**/*.test.ts 2>/dev/null || echo 'Tests skipped'",
23
+ "db:clean": "node ./dist/scripts/clean-database.js",
24
+ "db:migrate": "node ./dist/migrations/remove-notes-prompts.js",
25
+ "prepublishOnly": "npm run build",
26
+ "clean": "rimraf dist coverage",
27
+ "prebuild": "npm run clean",
28
+ "postbuild": "echo 'Build completed successfully'",
29
+ "sanity": "npm run format:check && npm run lint && npm run type:check && npm run build"
30
+ },
31
+ "keywords": [
32
+ "vibecontrols",
33
+ "vibe",
34
+ "agent",
35
+ "task-runner",
36
+ "terminal",
37
+ "tmux",
38
+ "ssh",
39
+ "tunnel",
40
+ "cloudflared",
41
+ "cli",
42
+ "devtools",
43
+ "remote-development"
44
+ ],
45
+ "author": {
46
+ "name": "Vignesh T.V",
47
+ "email": "vignesh@burdenoff.com",
48
+ "url": "https://github.com/tvvignesh"
49
+ },
50
+ "license": "SEE LICENSE IN LICENSE",
51
+ "description": "VibeControls Agent CLI - Remote development environment management with terminal multiplexing, SSH, tunnels, and port forwarding",
52
+ "dependencies": {
53
+ "@fastify/cors": "^11.0.1",
54
+ "@fastify/helmet": "^13.0.1",
55
+ "@fastify/http-proxy": "^11.4.1",
56
+ "better-sqlite3": "^11.10.0",
57
+ "chokidar": "^4.0.3",
58
+ "commander": "^14.0.0",
59
+ "dotenv": "^16.6.1",
60
+ "fastify": "^5.4.0",
61
+ "jsonwebtoken": "^9.0.2",
62
+ "ora": "^8.2.0",
63
+ "ps-tree": "^1.2.0",
64
+ "socket.io": "^4.8.1",
65
+ "ssh2": "^1.16.0",
66
+ "uuid": "^11.1.0"
67
+ },
68
+ "devDependencies": {
69
+ "@eslint/js": "^9.30.1",
70
+ "@types/better-sqlite3": "^7.6.13",
71
+ "@types/jsonwebtoken": "^9.0.10",
72
+ "@types/node": "^24.0.11",
73
+ "@types/ps-tree": "^1.1.6",
74
+ "@types/ssh2": "^1.15.5",
75
+ "@types/uuid": "^10.0.0",
76
+ "@types/ws": "^8.18.1",
77
+ "eslint": "^9.30.1",
78
+ "globals": "^16.3.0",
79
+ "prettier": "^3.6.2",
80
+ "rimraf": "^6.0.1",
81
+ "typescript": "^5.8.3",
82
+ "typescript-eslint": "^8.36.0"
83
+ },
84
+ "trustedDependencies": [
85
+ "better-sqlite3",
86
+ "cpu-features",
87
+ "ssh2"
88
+ ],
89
+ "repository": {
90
+ "type": "git",
91
+ "url": "https://github.com/algoshred/vibecontrols-agent.git"
92
+ },
93
+ "bugs": {
94
+ "url": "https://github.com/algoshred/vibecontrols-agent/issues"
95
+ },
96
+ "homepage": "https://vibecontrols.com",
97
+ "publishConfig": {
98
+ "access": "public",
99
+ "registry": "https://registry.npmjs.org/"
100
+ },
101
+ "files": [
102
+ "dist/**/*",
103
+ "README.md",
104
+ "LICENSE",
105
+ ".env.example"
106
+ ]
107
+ }