@burdenoff/vibe-agent 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +8 -0
- package/LICENSE +22 -0
- package/README.md +290 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +445 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1043 -0
- package/dist/cli.js.map +1 -0
- package/dist/db/schema.d.ts +145 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +536 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/ModuleAuth.d.ts +61 -0
- package/dist/middleware/ModuleAuth.d.ts.map +1 -0
- package/dist/middleware/ModuleAuth.js +220 -0
- package/dist/middleware/ModuleAuth.js.map +1 -0
- package/dist/middleware/auth.d.ts +3 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +11 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/migrations/remove-notes-prompts.d.ts +13 -0
- package/dist/migrations/remove-notes-prompts.d.ts.map +1 -0
- package/dist/migrations/remove-notes-prompts.js +148 -0
- package/dist/migrations/remove-notes-prompts.js.map +1 -0
- package/dist/routes/bookmarks.d.ts +3 -0
- package/dist/routes/bookmarks.d.ts.map +1 -0
- package/dist/routes/bookmarks.js +186 -0
- package/dist/routes/bookmarks.js.map +1 -0
- package/dist/routes/config.d.ts +3 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +108 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/files.d.ts +3 -0
- package/dist/routes/files.d.ts.map +1 -0
- package/dist/routes/files.js +471 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/git.d.ts +3 -0
- package/dist/routes/git.d.ts.map +1 -0
- package/dist/routes/git.js +498 -0
- package/dist/routes/git.js.map +1 -0
- package/dist/routes/moduleRegistry.d.ts +41 -0
- package/dist/routes/moduleRegistry.d.ts.map +1 -0
- package/dist/routes/moduleRegistry.js +356 -0
- package/dist/routes/moduleRegistry.js.map +1 -0
- package/dist/routes/notifications.d.ts +3 -0
- package/dist/routes/notifications.d.ts.map +1 -0
- package/dist/routes/notifications.js +250 -0
- package/dist/routes/notifications.js.map +1 -0
- package/dist/routes/port-forward.d.ts +3 -0
- package/dist/routes/port-forward.d.ts.map +1 -0
- package/dist/routes/port-forward.js +205 -0
- package/dist/routes/port-forward.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +442 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/ssh.d.ts +3 -0
- package/dist/routes/ssh.d.ts.map +1 -0
- package/dist/routes/ssh.js +192 -0
- package/dist/routes/ssh.js.map +1 -0
- package/dist/routes/tasks.d.ts +3 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +183 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/routes/tmux.d.ts +3 -0
- package/dist/routes/tmux.d.ts.map +1 -0
- package/dist/routes/tmux.js +1191 -0
- package/dist/routes/tmux.js.map +1 -0
- package/dist/routes/tunnel.d.ts +25 -0
- package/dist/routes/tunnel.d.ts.map +1 -0
- package/dist/routes/tunnel.js +449 -0
- package/dist/routes/tunnel.js.map +1 -0
- package/dist/services/ModulePermissions.d.ts +100 -0
- package/dist/services/ModulePermissions.d.ts.map +1 -0
- package/dist/services/ModulePermissions.js +312 -0
- package/dist/services/ModulePermissions.js.map +1 -0
- package/dist/services/ModuleRegistryService.d.ts +152 -0
- package/dist/services/ModuleRegistryService.d.ts.map +1 -0
- package/dist/services/ModuleRegistryService.js +522 -0
- package/dist/services/ModuleRegistryService.js.map +1 -0
- package/dist/services/agent.service.d.ts +19 -0
- package/dist/services/agent.service.d.ts.map +1 -0
- package/dist/services/agent.service.js +88 -0
- package/dist/services/agent.service.js.map +1 -0
- package/dist/services/bootstrap.d.ts +22 -0
- package/dist/services/bootstrap.d.ts.map +1 -0
- package/dist/services/bootstrap.js +206 -0
- package/dist/services/bootstrap.js.map +1 -0
- package/dist/services/service-manager.d.ts +50 -0
- package/dist/services/service-manager.d.ts.map +1 -0
- package/dist/services/service-manager.js +382 -0
- package/dist/services/service-manager.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
export class ModuleRegistryService extends EventEmitter {
|
|
8
|
+
activeModules = new Map();
|
|
9
|
+
availableModules = new Map();
|
|
10
|
+
installHistory = new Map();
|
|
11
|
+
healthChecks = new Map();
|
|
12
|
+
moduleProcesses = new Map();
|
|
13
|
+
recentActivity = [];
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this.startCleanupInterval();
|
|
17
|
+
}
|
|
18
|
+
// Module registration methods
|
|
19
|
+
async registerModule(moduleData) {
|
|
20
|
+
try {
|
|
21
|
+
// Validate module manifest
|
|
22
|
+
if (!this.validateModule(moduleData)) {
|
|
23
|
+
return { success: false, message: 'Invalid module manifest' };
|
|
24
|
+
}
|
|
25
|
+
// Check for port conflicts
|
|
26
|
+
const portConflict = this.checkPortConflicts(moduleData);
|
|
27
|
+
if (portConflict) {
|
|
28
|
+
return { success: false, message: `Port conflict: ${portConflict}` };
|
|
29
|
+
}
|
|
30
|
+
// Create registered module
|
|
31
|
+
const registeredModule = {
|
|
32
|
+
...moduleData,
|
|
33
|
+
registeredAt: new Date(),
|
|
34
|
+
lastHeartbeat: new Date(),
|
|
35
|
+
status: 'running'
|
|
36
|
+
};
|
|
37
|
+
// Store module
|
|
38
|
+
this.activeModules.set(registeredModule.name, registeredModule);
|
|
39
|
+
// Start health monitoring
|
|
40
|
+
this.startHealthMonitoring(registeredModule.name);
|
|
41
|
+
// Log activity
|
|
42
|
+
this.logActivity('register', registeredModule.name);
|
|
43
|
+
// Emit event
|
|
44
|
+
this.emit('module:registered', registeredModule);
|
|
45
|
+
console.log(`Module ${registeredModule.name} registered successfully`);
|
|
46
|
+
return { success: true, message: 'Module registered successfully' };
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error('Module registration failed:', error);
|
|
50
|
+
return { success: false, message: error instanceof Error ? error.message : 'Unknown error' };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async unregisterModule(moduleId) {
|
|
54
|
+
const module = this.activeModules.get(moduleId);
|
|
55
|
+
if (!module) {
|
|
56
|
+
return { success: false, message: 'Module not found' };
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
// Stop health monitoring
|
|
60
|
+
this.stopHealthMonitoring(moduleId);
|
|
61
|
+
// Stop module processes if running
|
|
62
|
+
await this.stopModuleProcesses(moduleId);
|
|
63
|
+
// Remove from active modules
|
|
64
|
+
this.activeModules.delete(moduleId);
|
|
65
|
+
// Log activity
|
|
66
|
+
this.logActivity('unregister', moduleId);
|
|
67
|
+
// Emit event
|
|
68
|
+
this.emit('module:unregistered', module);
|
|
69
|
+
console.log(`Module ${moduleId} unregistered successfully`);
|
|
70
|
+
return { success: true, message: 'Module unregistered successfully' };
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('Module unregistration failed:', error);
|
|
74
|
+
return { success: false, message: error instanceof Error ? error.message : 'Unknown error' };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Module lifecycle methods
|
|
78
|
+
async activateModule(moduleId) {
|
|
79
|
+
const module = this.activeModules.get(moduleId);
|
|
80
|
+
if (!module) {
|
|
81
|
+
return { success: false, message: 'Module not found' };
|
|
82
|
+
}
|
|
83
|
+
if (module.status === 'running') {
|
|
84
|
+
return { success: false, message: 'Module is already active' };
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
// Update status
|
|
88
|
+
module.status = 'starting';
|
|
89
|
+
this.activeModules.set(moduleId, module);
|
|
90
|
+
// Start module processes
|
|
91
|
+
await this.startModuleProcesses(module);
|
|
92
|
+
// Update status
|
|
93
|
+
module.status = 'running';
|
|
94
|
+
this.activeModules.set(moduleId, module);
|
|
95
|
+
// Start health monitoring
|
|
96
|
+
this.startHealthMonitoring(moduleId);
|
|
97
|
+
// Log activity
|
|
98
|
+
this.logActivity('activate', moduleId);
|
|
99
|
+
// Emit event
|
|
100
|
+
this.emit('module:activated', module);
|
|
101
|
+
return { success: true, message: 'Module activated successfully' };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
module.status = 'error';
|
|
105
|
+
this.activeModules.set(moduleId, module);
|
|
106
|
+
console.error('Module activation failed:', error);
|
|
107
|
+
return { success: false, message: error instanceof Error ? error.message : 'Unknown error' };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async deactivateModule(moduleId) {
|
|
111
|
+
const module = this.activeModules.get(moduleId);
|
|
112
|
+
if (!module) {
|
|
113
|
+
return { success: false, message: 'Module not found' };
|
|
114
|
+
}
|
|
115
|
+
if (module.status === 'stopped') {
|
|
116
|
+
return { success: false, message: 'Module is already inactive' };
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
// Update status
|
|
120
|
+
module.status = 'stopping';
|
|
121
|
+
this.activeModules.set(moduleId, module);
|
|
122
|
+
// Stop health monitoring
|
|
123
|
+
this.stopHealthMonitoring(moduleId);
|
|
124
|
+
// Stop module processes
|
|
125
|
+
await this.stopModuleProcesses(moduleId);
|
|
126
|
+
// Update status
|
|
127
|
+
module.status = 'stopped';
|
|
128
|
+
this.activeModules.set(moduleId, module);
|
|
129
|
+
// Log activity
|
|
130
|
+
this.logActivity('deactivate', moduleId);
|
|
131
|
+
// Emit event
|
|
132
|
+
this.emit('module:deactivated', module);
|
|
133
|
+
return { success: true, message: 'Module deactivated successfully' };
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
module.status = 'error';
|
|
137
|
+
this.activeModules.set(moduleId, module);
|
|
138
|
+
console.error('Module deactivation failed:', error);
|
|
139
|
+
return { success: false, message: error instanceof Error ? error.message : 'Unknown error' };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Module installation methods
|
|
143
|
+
async installModule(moduleId, source, version) {
|
|
144
|
+
const installationId = this.generateInstallationId();
|
|
145
|
+
const installation = {
|
|
146
|
+
id: installationId,
|
|
147
|
+
moduleId,
|
|
148
|
+
version: version || 'latest',
|
|
149
|
+
source,
|
|
150
|
+
installedAt: new Date(),
|
|
151
|
+
status: 'pending',
|
|
152
|
+
progress: 0,
|
|
153
|
+
logs: []
|
|
154
|
+
};
|
|
155
|
+
this.installHistory.set(installationId, installation);
|
|
156
|
+
try {
|
|
157
|
+
// Update status
|
|
158
|
+
installation.status = 'downloading';
|
|
159
|
+
installation.progress = 10;
|
|
160
|
+
this.installHistory.set(installationId, installation);
|
|
161
|
+
// Download and install module based on source type
|
|
162
|
+
switch (source.type) {
|
|
163
|
+
case 'remote':
|
|
164
|
+
await this.installFromRemote(installation);
|
|
165
|
+
break;
|
|
166
|
+
case 'marketplace':
|
|
167
|
+
await this.installFromMarketplace(installation);
|
|
168
|
+
break;
|
|
169
|
+
case 'container':
|
|
170
|
+
await this.installFromContainer(installation);
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
throw new Error(`Unsupported source type: ${source.type}`);
|
|
174
|
+
}
|
|
175
|
+
installation.status = 'installed';
|
|
176
|
+
installation.progress = 100;
|
|
177
|
+
this.installHistory.set(installationId, installation);
|
|
178
|
+
// Log activity
|
|
179
|
+
this.logActivity('install', moduleId);
|
|
180
|
+
// Emit event
|
|
181
|
+
this.emit('module:installed', installation);
|
|
182
|
+
console.log(`Module ${moduleId} installed successfully`);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
installation.status = 'failed';
|
|
186
|
+
installation.error = error instanceof Error ? error.message : 'Unknown error';
|
|
187
|
+
installation.logs?.push(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
188
|
+
this.installHistory.set(installationId, installation);
|
|
189
|
+
console.error(`Module installation failed:`, error);
|
|
190
|
+
}
|
|
191
|
+
return installation;
|
|
192
|
+
}
|
|
193
|
+
// Query methods
|
|
194
|
+
async listModules() {
|
|
195
|
+
return Array.from(this.activeModules.values());
|
|
196
|
+
}
|
|
197
|
+
async getModule(moduleId) {
|
|
198
|
+
return this.activeModules.get(moduleId) || null;
|
|
199
|
+
}
|
|
200
|
+
async searchModules(query, category, tags, status = 'all', limit = 50, offset = 0) {
|
|
201
|
+
let modules = Array.from(this.activeModules.values());
|
|
202
|
+
// Filter by status
|
|
203
|
+
if (status !== 'all') {
|
|
204
|
+
modules = modules.filter(module => {
|
|
205
|
+
if (status === 'active')
|
|
206
|
+
return module.status === 'running';
|
|
207
|
+
if (status === 'inactive')
|
|
208
|
+
return module.status !== 'running';
|
|
209
|
+
return true;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// Filter by search query
|
|
213
|
+
if (query) {
|
|
214
|
+
const searchTerm = query.toLowerCase();
|
|
215
|
+
modules = modules.filter(module => module.name.toLowerCase().includes(searchTerm) ||
|
|
216
|
+
module.displayName.toLowerCase().includes(searchTerm) ||
|
|
217
|
+
module.description.toLowerCase().includes(searchTerm));
|
|
218
|
+
}
|
|
219
|
+
// Filter by category
|
|
220
|
+
if (category) {
|
|
221
|
+
modules = modules.filter(module => module.category === category);
|
|
222
|
+
}
|
|
223
|
+
// Filter by tags
|
|
224
|
+
if (tags && tags.length > 0) {
|
|
225
|
+
modules = modules.filter(module => tags.some(tag => module.tags.includes(tag)));
|
|
226
|
+
}
|
|
227
|
+
// Apply pagination
|
|
228
|
+
return modules.slice(offset, offset + limit);
|
|
229
|
+
}
|
|
230
|
+
async getStats() {
|
|
231
|
+
const modules = Array.from(this.activeModules.values());
|
|
232
|
+
const categoryCounts = {};
|
|
233
|
+
modules.forEach(module => {
|
|
234
|
+
categoryCounts[module.category] = (categoryCounts[module.category] || 0) + 1;
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
totalModules: modules.length,
|
|
238
|
+
activeModules: modules.filter(m => m.status === 'running').length,
|
|
239
|
+
stoppedModules: modules.filter(m => m.status === 'stopped').length,
|
|
240
|
+
errorModules: modules.filter(m => m.status === 'error').length,
|
|
241
|
+
totalInstallations: this.installHistory.size,
|
|
242
|
+
categoryCounts,
|
|
243
|
+
recentActivity: this.recentActivity.slice(-10)
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
// Health and monitoring methods
|
|
247
|
+
async updateHeartbeat(moduleId, heartbeatData) {
|
|
248
|
+
const module = this.activeModules.get(moduleId);
|
|
249
|
+
if (!module) {
|
|
250
|
+
return { success: false, message: 'Module not found' };
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
module.lastHeartbeat = new Date();
|
|
254
|
+
module.metrics = heartbeatData.metrics;
|
|
255
|
+
if (heartbeatData.status === 'healthy') {
|
|
256
|
+
module.status = 'running';
|
|
257
|
+
}
|
|
258
|
+
else if (heartbeatData.status === 'unhealthy') {
|
|
259
|
+
module.status = 'error';
|
|
260
|
+
}
|
|
261
|
+
this.activeModules.set(moduleId, module);
|
|
262
|
+
return { success: true, message: 'Heartbeat updated' };
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
console.error('Failed to update heartbeat:', error);
|
|
266
|
+
return { success: false, message: error instanceof Error ? error.message : 'Unknown error' };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async checkModuleHealth(moduleId) {
|
|
270
|
+
const module = this.activeModules.get(moduleId);
|
|
271
|
+
if (!module) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const response = await fetch(`http://localhost:${module.api.backend.port}/health`, {
|
|
276
|
+
signal: AbortSignal.timeout(5000)
|
|
277
|
+
});
|
|
278
|
+
const health = {
|
|
279
|
+
healthy: response.ok,
|
|
280
|
+
status: response.status,
|
|
281
|
+
timestamp: new Date(),
|
|
282
|
+
latency: performance.now(),
|
|
283
|
+
details: response.ok ? await response.json() : null,
|
|
284
|
+
checks: {
|
|
285
|
+
http: response.ok,
|
|
286
|
+
status: response.status
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
module.health = health;
|
|
290
|
+
this.activeModules.set(moduleId, module);
|
|
291
|
+
return health;
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
const health = {
|
|
295
|
+
healthy: false,
|
|
296
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
297
|
+
timestamp: new Date(),
|
|
298
|
+
checks: {
|
|
299
|
+
http: false,
|
|
300
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
module.health = health;
|
|
304
|
+
this.activeModules.set(moduleId, module);
|
|
305
|
+
return health;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Utility methods
|
|
309
|
+
validateModule(module) {
|
|
310
|
+
const requiredFields = ['name', 'version', 'api'];
|
|
311
|
+
return requiredFields.every(field => module[field] !== undefined);
|
|
312
|
+
}
|
|
313
|
+
checkPortConflicts(module) {
|
|
314
|
+
for (const [_, existingModule] of this.activeModules) {
|
|
315
|
+
if (existingModule.name === module.name)
|
|
316
|
+
continue;
|
|
317
|
+
if (existingModule.api.backend.port === module.api.backend.port) {
|
|
318
|
+
return `Backend port ${module.api.backend.port} already in use by ${existingModule.name}`;
|
|
319
|
+
}
|
|
320
|
+
if (existingModule.api.frontend.port === module.api.frontend.port) {
|
|
321
|
+
return `Frontend port ${module.api.frontend.port} already in use by ${existingModule.name}`;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
startHealthMonitoring(moduleId) {
|
|
327
|
+
const interval = setInterval(async () => {
|
|
328
|
+
await this.checkModuleHealth(moduleId);
|
|
329
|
+
}, 60000); // Check every minute
|
|
330
|
+
this.healthChecks.set(moduleId, interval);
|
|
331
|
+
}
|
|
332
|
+
stopHealthMonitoring(moduleId) {
|
|
333
|
+
const interval = this.healthChecks.get(moduleId);
|
|
334
|
+
if (interval) {
|
|
335
|
+
clearInterval(interval);
|
|
336
|
+
this.healthChecks.delete(moduleId);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
async startModuleProcesses(module) {
|
|
340
|
+
const modulePath = path.join(process.cwd(), 'installed_modules', module.name);
|
|
341
|
+
try {
|
|
342
|
+
// Start backend process
|
|
343
|
+
const backendProcess = spawn('npm', ['run', 'start'], {
|
|
344
|
+
cwd: path.join(modulePath, 'src', 'backend'),
|
|
345
|
+
stdio: 'pipe',
|
|
346
|
+
env: { ...process.env, NODE_ENV: 'production' }
|
|
347
|
+
});
|
|
348
|
+
// Start frontend process
|
|
349
|
+
const frontendProcess = spawn('npm', ['run', 'start'], {
|
|
350
|
+
cwd: path.join(modulePath, 'src', 'frontend'),
|
|
351
|
+
stdio: 'pipe',
|
|
352
|
+
env: { ...process.env, NODE_ENV: 'production' }
|
|
353
|
+
});
|
|
354
|
+
this.moduleProcesses.set(module.name, {
|
|
355
|
+
backend: backendProcess,
|
|
356
|
+
frontend: frontendProcess
|
|
357
|
+
});
|
|
358
|
+
// Handle process events
|
|
359
|
+
backendProcess.on('error', (error) => {
|
|
360
|
+
console.error(`Backend process error for ${module.name}:`, error);
|
|
361
|
+
});
|
|
362
|
+
frontendProcess.on('error', (error) => {
|
|
363
|
+
console.error(`Frontend process error for ${module.name}:`, error);
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
console.error(`Failed to start processes for ${module.name}:`, error);
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
async stopModuleProcesses(moduleId) {
|
|
372
|
+
const processes = this.moduleProcesses.get(moduleId);
|
|
373
|
+
if (!processes)
|
|
374
|
+
return;
|
|
375
|
+
try {
|
|
376
|
+
if (processes.backend) {
|
|
377
|
+
processes.backend.kill('SIGTERM');
|
|
378
|
+
}
|
|
379
|
+
if (processes.frontend) {
|
|
380
|
+
processes.frontend.kill('SIGTERM');
|
|
381
|
+
}
|
|
382
|
+
this.moduleProcesses.delete(moduleId);
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
console.error(`Failed to stop processes for ${moduleId}:`, error);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
async installFromRemote(installation) {
|
|
389
|
+
// Implementation for remote Git repository installation
|
|
390
|
+
const { exec } = await import('child_process');
|
|
391
|
+
const util = await import('util');
|
|
392
|
+
const execAsync = util.promisify(exec);
|
|
393
|
+
const targetDir = path.join(process.cwd(), 'installed_modules', installation.moduleId);
|
|
394
|
+
try {
|
|
395
|
+
// Update progress
|
|
396
|
+
installation.progress = 20;
|
|
397
|
+
installation.logs?.push('Cloning repository...');
|
|
398
|
+
// Clone repository
|
|
399
|
+
await execAsync(`git clone ${installation.source.url} ${targetDir}`);
|
|
400
|
+
// Update progress
|
|
401
|
+
installation.progress = 40;
|
|
402
|
+
installation.logs?.push('Repository cloned');
|
|
403
|
+
// Checkout specific version if provided
|
|
404
|
+
if (installation.version && installation.version !== 'latest') {
|
|
405
|
+
await execAsync(`cd ${targetDir} && git checkout ${installation.version}`);
|
|
406
|
+
installation.logs?.push(`Checked out version ${installation.version}`);
|
|
407
|
+
}
|
|
408
|
+
// Update progress
|
|
409
|
+
installation.progress = 60;
|
|
410
|
+
installation.logs?.push('Installing dependencies...');
|
|
411
|
+
// Install dependencies
|
|
412
|
+
await execAsync(`cd ${targetDir} && npm run install:all`);
|
|
413
|
+
// Update progress
|
|
414
|
+
installation.progress = 80;
|
|
415
|
+
installation.logs?.push('Building module...');
|
|
416
|
+
// Build module
|
|
417
|
+
await execAsync(`cd ${targetDir} && npm run build`);
|
|
418
|
+
// Update progress
|
|
419
|
+
installation.progress = 90;
|
|
420
|
+
installation.logs?.push('Loading module manifest...');
|
|
421
|
+
// Load module manifest
|
|
422
|
+
const manifestPath = path.join(targetDir, 'module.json');
|
|
423
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf-8');
|
|
424
|
+
const manifest = JSON.parse(manifestContent);
|
|
425
|
+
// Add to available modules
|
|
426
|
+
this.availableModules.set(installation.moduleId, manifest);
|
|
427
|
+
installation.logs?.push('Module installed successfully');
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
installation.logs?.push(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
431
|
+
throw error;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
async installFromMarketplace(installation) {
|
|
435
|
+
// Implementation for marketplace installation
|
|
436
|
+
throw new Error('Marketplace installation not yet implemented');
|
|
437
|
+
}
|
|
438
|
+
async installFromContainer(installation) {
|
|
439
|
+
// Implementation for container-based installation
|
|
440
|
+
throw new Error('Container installation not yet implemented');
|
|
441
|
+
}
|
|
442
|
+
generateInstallationId() {
|
|
443
|
+
return `install_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
444
|
+
}
|
|
445
|
+
logActivity(type, moduleId) {
|
|
446
|
+
this.recentActivity.push({
|
|
447
|
+
type,
|
|
448
|
+
moduleId,
|
|
449
|
+
timestamp: new Date()
|
|
450
|
+
});
|
|
451
|
+
// Keep only last 100 activities
|
|
452
|
+
if (this.recentActivity.length > 100) {
|
|
453
|
+
this.recentActivity = this.recentActivity.slice(-100);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
startCleanupInterval() {
|
|
457
|
+
// Clean up old installation history every hour
|
|
458
|
+
setInterval(() => {
|
|
459
|
+
const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
|
|
460
|
+
for (const [id, installation] of this.installHistory) {
|
|
461
|
+
if (installation.installedAt < oneWeekAgo) {
|
|
462
|
+
this.installHistory.delete(id);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}, 60 * 60 * 1000); // Every hour
|
|
466
|
+
}
|
|
467
|
+
// Additional utility methods
|
|
468
|
+
async getInstallationHistory() {
|
|
469
|
+
return Array.from(this.installHistory.values());
|
|
470
|
+
}
|
|
471
|
+
async getInstallation(installationId) {
|
|
472
|
+
return this.installHistory.get(installationId) || null;
|
|
473
|
+
}
|
|
474
|
+
async getModuleLogs(moduleId, options = {}) {
|
|
475
|
+
// Implementation for getting module logs
|
|
476
|
+
// This would typically read from log files or log aggregation system
|
|
477
|
+
return [];
|
|
478
|
+
}
|
|
479
|
+
async bulkOperation(operation, moduleIds) {
|
|
480
|
+
const results = [];
|
|
481
|
+
for (const moduleId of moduleIds) {
|
|
482
|
+
try {
|
|
483
|
+
let result;
|
|
484
|
+
switch (operation) {
|
|
485
|
+
case 'activate':
|
|
486
|
+
result = await this.activateModule(moduleId);
|
|
487
|
+
break;
|
|
488
|
+
case 'deactivate':
|
|
489
|
+
result = await this.deactivateModule(moduleId);
|
|
490
|
+
break;
|
|
491
|
+
case 'restart':
|
|
492
|
+
await this.deactivateModule(moduleId);
|
|
493
|
+
result = await this.activateModule(moduleId);
|
|
494
|
+
break;
|
|
495
|
+
case 'uninstall':
|
|
496
|
+
result = await this.unregisterModule(moduleId);
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
results.push({ moduleId, success: result.success, message: result.message });
|
|
500
|
+
}
|
|
501
|
+
catch (error) {
|
|
502
|
+
results.push({ moduleId, success: false, message: error instanceof Error ? error.message : 'Unknown error' });
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return results;
|
|
506
|
+
}
|
|
507
|
+
subscribeToEvents(callback) {
|
|
508
|
+
this.on('module:registered', callback);
|
|
509
|
+
this.on('module:unregistered', callback);
|
|
510
|
+
this.on('module:activated', callback);
|
|
511
|
+
this.on('module:deactivated', callback);
|
|
512
|
+
this.on('module:installed', callback);
|
|
513
|
+
return () => {
|
|
514
|
+
this.off('module:registered', callback);
|
|
515
|
+
this.off('module:unregistered', callback);
|
|
516
|
+
this.off('module:activated', callback);
|
|
517
|
+
this.off('module:deactivated', callback);
|
|
518
|
+
this.off('module:installed', callback);
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=ModuleRegistryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleRegistryService.js","sourceRoot":"","sources":["../../src/services/ModuleRegistryService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface AgentConfig {
|
|
2
|
+
port: number;
|
|
3
|
+
name: string;
|
|
4
|
+
daemon: boolean;
|
|
5
|
+
dbPath: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class AgentService {
|
|
8
|
+
private app;
|
|
9
|
+
private config;
|
|
10
|
+
start(config: AgentConfig): Promise<void>;
|
|
11
|
+
stop(): Promise<void>;
|
|
12
|
+
startDaemon(config: AgentConfig): Promise<void>;
|
|
13
|
+
private saveProcessInfo;
|
|
14
|
+
getStatus(): {
|
|
15
|
+
running: boolean;
|
|
16
|
+
config: AgentConfig | null;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=agent.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.service.d.ts","sourceRoot":"","sources":["../../src/services/agent.service.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAA4B;IAEpC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAerB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YA8BvC,eAAe;IAc7B,SAAS,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE;CAM9D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { startServer } from '../app.js';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
export class AgentService {
|
|
5
|
+
app = null;
|
|
6
|
+
config = null;
|
|
7
|
+
async start(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
const spinner = ora('Starting VibeControls Agent...').start();
|
|
10
|
+
try {
|
|
11
|
+
// Set environment variables
|
|
12
|
+
process.env.PORT = config.port.toString();
|
|
13
|
+
process.env.DB_PATH = config.dbPath;
|
|
14
|
+
// Start the server
|
|
15
|
+
this.app = await startServer();
|
|
16
|
+
await this.app.listen({
|
|
17
|
+
port: config.port,
|
|
18
|
+
host: '0.0.0.0'
|
|
19
|
+
});
|
|
20
|
+
spinner.succeed(`🚀 VibeControls Agent '${config.name}' is running on http://localhost:${config.port}`);
|
|
21
|
+
// Handle graceful shutdown
|
|
22
|
+
process.on('SIGTERM', () => this.stop());
|
|
23
|
+
process.on('SIGINT', () => this.stop());
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
spinner.fail('Failed to start agent');
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async stop() {
|
|
31
|
+
if (this.app) {
|
|
32
|
+
const spinner = ora('Stopping VibeControls Agent...').start();
|
|
33
|
+
try {
|
|
34
|
+
await this.app.close();
|
|
35
|
+
spinner.succeed('✅ VibeControls Agent stopped');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
spinner.fail('Failed to stop agent gracefully');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async startDaemon(config) {
|
|
45
|
+
const spinner = ora('Starting VibeControls Agent as daemon...').start();
|
|
46
|
+
try {
|
|
47
|
+
// Spawn the process as a daemon
|
|
48
|
+
const child = spawn(process.execPath, [
|
|
49
|
+
process.argv[1], // CLI script path
|
|
50
|
+
'start',
|
|
51
|
+
'--port', config.port.toString(),
|
|
52
|
+
'--name', config.name,
|
|
53
|
+
'--db-path', config.dbPath
|
|
54
|
+
], {
|
|
55
|
+
detached: true,
|
|
56
|
+
stdio: 'ignore'
|
|
57
|
+
});
|
|
58
|
+
// Unreference the child process so parent can exit
|
|
59
|
+
child.unref();
|
|
60
|
+
spinner.succeed(`🚀 VibeControls Agent '${config.name}' started as daemon (PID: ${child.pid})`);
|
|
61
|
+
// Save process info for management
|
|
62
|
+
await this.saveProcessInfo(config.name, child.pid, config);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
spinner.fail('Failed to start daemon');
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async saveProcessInfo(name, pid, config) {
|
|
70
|
+
// This would typically save to a process registry file or database
|
|
71
|
+
// For now, we'll implement a simple file-based approach
|
|
72
|
+
const processInfo = {
|
|
73
|
+
name,
|
|
74
|
+
pid,
|
|
75
|
+
config,
|
|
76
|
+
startTime: new Date().toISOString()
|
|
77
|
+
};
|
|
78
|
+
// Save to a registry file (implementation would depend on requirements)
|
|
79
|
+
console.log('Process info saved:', processInfo);
|
|
80
|
+
}
|
|
81
|
+
getStatus() {
|
|
82
|
+
return {
|
|
83
|
+
running: this.app !== null,
|
|
84
|
+
config: this.config
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=agent.service.js.map
|