@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,536 @@
1
+ import Database from 'better-sqlite3';
2
+ class AgentDatabase {
3
+ db;
4
+ constructor(dbPath = './vibecontrols-agent.db') {
5
+ this.db = new Database(dbPath);
6
+ this.db.exec('PRAGMA journal_mode = WAL');
7
+ this.initializeSchema();
8
+ }
9
+ initializeSchema() {
10
+ const schema = `
11
+ CREATE TABLE IF NOT EXISTS tmux_sessions (
12
+ id TEXT PRIMARY KEY,
13
+ sessionName TEXT UNIQUE NOT NULL,
14
+ projectId TEXT NOT NULL,
15
+ windowName TEXT NOT NULL,
16
+ command TEXT,
17
+ status TEXT CHECK(status IN ('active', 'inactive', 'terminated')) DEFAULT 'active',
18
+ ttydPort INTEGER,
19
+ ttydPid INTEGER,
20
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
21
+ updatedAt TEXT DEFAULT CURRENT_TIMESTAMP
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS ssh_connections (
25
+ id TEXT PRIMARY KEY,
26
+ serverName TEXT NOT NULL,
27
+ host TEXT NOT NULL,
28
+ port INTEGER DEFAULT 22,
29
+ username TEXT NOT NULL,
30
+ privateKeyPath TEXT,
31
+ password TEXT,
32
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS port_forwards (
36
+ id TEXT PRIMARY KEY,
37
+ localPort INTEGER NOT NULL,
38
+ remoteHost TEXT NOT NULL,
39
+ remotePort INTEGER NOT NULL,
40
+ serverName TEXT NOT NULL,
41
+ connectionId TEXT,
42
+ status TEXT CHECK(status IN ('active', 'inactive', 'error')) DEFAULT 'inactive',
43
+ pid INTEGER,
44
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
45
+ updatedAt TEXT DEFAULT CURRENT_TIMESTAMP,
46
+ UNIQUE(localPort, serverName)
47
+ );
48
+
49
+ CREATE TABLE IF NOT EXISTS tasks (
50
+ id TEXT PRIMARY KEY,
51
+ type TEXT CHECK(type IN ('command', 'script', 'file_operation')) NOT NULL,
52
+ status TEXT CHECK(status IN ('pending', 'running', 'completed', 'failed')) DEFAULT 'pending',
53
+ payload TEXT NOT NULL,
54
+ result TEXT,
55
+ error TEXT,
56
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
57
+ updatedAt TEXT DEFAULT CURRENT_TIMESTAMP
58
+ );
59
+
60
+ CREATE TABLE IF NOT EXISTS agent_config (
61
+ id TEXT PRIMARY KEY,
62
+ key TEXT UNIQUE NOT NULL,
63
+ value TEXT NOT NULL,
64
+ updatedAt TEXT DEFAULT CURRENT_TIMESTAMP
65
+ );
66
+
67
+ CREATE TABLE IF NOT EXISTS git_repositories (
68
+ id TEXT PRIMARY KEY,
69
+ path TEXT UNIQUE NOT NULL,
70
+ name TEXT NOT NULL,
71
+ parentPath TEXT,
72
+ isSubmodule INTEGER DEFAULT 0,
73
+ projectType TEXT,
74
+ vitePort INTEGER,
75
+ lastScanned TEXT DEFAULT CURRENT_TIMESTAMP,
76
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP
77
+ );
78
+
79
+
80
+ CREATE TABLE IF NOT EXISTS bookmarked_commands (
81
+ id TEXT PRIMARY KEY,
82
+ projectId TEXT,
83
+ command TEXT NOT NULL,
84
+ description TEXT,
85
+ category TEXT,
86
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP
87
+ );
88
+
89
+ CREATE TABLE IF NOT EXISTS notifications (
90
+ id TEXT PRIMARY KEY,
91
+ sessionName TEXT,
92
+ projectId TEXT,
93
+ type TEXT CHECK(type IN ('info', 'success', 'warning', 'error')) DEFAULT 'info',
94
+ title TEXT NOT NULL,
95
+ message TEXT NOT NULL,
96
+ status TEXT CHECK(status IN ('unread', 'read')) DEFAULT 'unread',
97
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP
98
+ );
99
+
100
+ CREATE TABLE IF NOT EXISTS tunnels (
101
+ id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
102
+ localPort INTEGER NOT NULL,
103
+ publicUrl TEXT,
104
+ subdomain TEXT,
105
+ provider TEXT NOT NULL DEFAULT 'cloudflared',
106
+ pid INTEGER,
107
+ status TEXT CHECK(status IN ('active', 'inactive', 'error')) DEFAULT 'inactive',
108
+ sessionId TEXT,
109
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
110
+ updatedAt TEXT DEFAULT CURRENT_TIMESTAMP
111
+ );
112
+
113
+ CREATE INDEX IF NOT EXISTS idx_tmux_sessions_projectId ON tmux_sessions(projectId);
114
+ CREATE INDEX IF NOT EXISTS idx_tmux_sessions_status ON tmux_sessions(status);
115
+ CREATE INDEX IF NOT EXISTS idx_port_forwards_serverName ON port_forwards(serverName);
116
+ CREATE INDEX IF NOT EXISTS idx_port_forwards_status ON port_forwards(status);
117
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
118
+ CREATE INDEX IF NOT EXISTS idx_tasks_type ON tasks(type);
119
+ CREATE INDEX IF NOT EXISTS idx_git_repositories_path ON git_repositories(path);
120
+ CREATE INDEX IF NOT EXISTS idx_git_repositories_parentPath ON git_repositories(parentPath);
121
+ CREATE INDEX IF NOT EXISTS idx_bookmarked_commands_projectId ON bookmarked_commands(projectId);
122
+ CREATE INDEX IF NOT EXISTS idx_notifications_status ON notifications(status);
123
+ CREATE INDEX IF NOT EXISTS idx_notifications_projectId ON notifications(projectId);
124
+ CREATE INDEX IF NOT EXISTS idx_tunnels_localPort ON tunnels(localPort);
125
+ CREATE INDEX IF NOT EXISTS idx_tunnels_status ON tunnels(status);
126
+ CREATE INDEX IF NOT EXISTS idx_tunnels_sessionId ON tunnels(sessionId);
127
+ `;
128
+ this.db.exec(schema);
129
+ }
130
+ // TmuxSession methods
131
+ createTmuxSession(session) {
132
+ const stmt = this.db.prepare(`
133
+ INSERT INTO tmux_sessions (id, sessionName, projectId, windowName, command, status, ttydPort, ttydPid)
134
+ VALUES ($id, $sessionName, $projectId, $windowName, $command, $status, $ttydPort, $ttydPid)
135
+ `);
136
+ stmt.run({
137
+ id: session.id,
138
+ sessionName: session.sessionName,
139
+ projectId: session.projectId,
140
+ windowName: session.windowName,
141
+ command: session.command ?? null,
142
+ status: session.status,
143
+ ttydPort: session.ttydPort ?? null,
144
+ ttydPid: session.ttydPid ?? null,
145
+ });
146
+ return this.getTmuxSession(session.id);
147
+ }
148
+ getTmuxSession(id) {
149
+ const stmt = this.db.prepare('SELECT * FROM tmux_sessions WHERE id = $id');
150
+ return stmt.get({ id: id });
151
+ }
152
+ getTmuxSessionByName(sessionName) {
153
+ const stmt = this.db.prepare('SELECT * FROM tmux_sessions WHERE sessionName = $sessionName');
154
+ return stmt.get({ sessionName: sessionName });
155
+ }
156
+ getAllTmuxSessions() {
157
+ const stmt = this.db.prepare('SELECT * FROM tmux_sessions ORDER BY createdAt DESC');
158
+ return stmt.all();
159
+ }
160
+ updateTmuxSession(id, updates) {
161
+ const fields = Object.keys(updates)
162
+ .filter(key => key !== 'id' && key !== 'createdAt')
163
+ .map(key => `${key} = $${key}`)
164
+ .join(', ');
165
+ const stmt = this.db.prepare(`
166
+ UPDATE tmux_sessions
167
+ SET ${fields}, updatedAt = CURRENT_TIMESTAMP
168
+ WHERE id = $id
169
+ `);
170
+ const params = { id: id };
171
+ for (const [key, value] of Object.entries(updates)) {
172
+ params[key] = value ?? null;
173
+ }
174
+ stmt.run(params);
175
+ }
176
+ deleteTmuxSession(id) {
177
+ const stmt = this.db.prepare('DELETE FROM tmux_sessions WHERE id = $id');
178
+ stmt.run({ id: id });
179
+ }
180
+ // SSHConnection methods
181
+ createSSHConnection(connection) {
182
+ const stmt = this.db.prepare(`
183
+ INSERT INTO ssh_connections (id, serverName, host, port, username, privateKeyPath, password)
184
+ VALUES ($id, $serverName, $host, $port, $username, $privateKeyPath, $password)
185
+ `);
186
+ stmt.run({
187
+ id: connection.id,
188
+ serverName: connection.serverName,
189
+ host: connection.host,
190
+ port: connection.port,
191
+ username: connection.username,
192
+ privateKeyPath: connection.privateKeyPath ?? null,
193
+ password: connection.password ?? null,
194
+ });
195
+ return this.getSSHConnection(connection.id);
196
+ }
197
+ getSSHConnection(id) {
198
+ const stmt = this.db.prepare('SELECT * FROM ssh_connections WHERE id = $id');
199
+ return stmt.get({ id: id });
200
+ }
201
+ getSSHConnectionByName(serverName) {
202
+ const stmt = this.db.prepare('SELECT * FROM ssh_connections WHERE serverName = $serverName');
203
+ return stmt.get({ serverName: serverName });
204
+ }
205
+ getAllSSHConnections() {
206
+ const stmt = this.db.prepare('SELECT * FROM ssh_connections ORDER BY serverName');
207
+ return stmt.all();
208
+ }
209
+ deleteSSHConnection(id) {
210
+ const stmt = this.db.prepare('DELETE FROM ssh_connections WHERE id = $id');
211
+ stmt.run({ id: id });
212
+ }
213
+ // PortForward methods
214
+ createPortForward(forward) {
215
+ const stmt = this.db.prepare(`
216
+ INSERT INTO port_forwards (id, localPort, remoteHost, remotePort, serverName, connectionId, status, pid)
217
+ VALUES ($id, $localPort, $remoteHost, $remotePort, $serverName, $connectionId, $status, $pid)
218
+ `);
219
+ stmt.run({
220
+ id: forward.id,
221
+ localPort: forward.localPort,
222
+ remoteHost: forward.remoteHost,
223
+ remotePort: forward.remotePort,
224
+ serverName: forward.serverName,
225
+ connectionId: forward.connectionId ?? null,
226
+ status: forward.status,
227
+ pid: forward.pid ?? null,
228
+ });
229
+ return this.getPortForward(forward.id);
230
+ }
231
+ getPortForward(id) {
232
+ const stmt = this.db.prepare('SELECT * FROM port_forwards WHERE id = $id');
233
+ return stmt.get({ id: id });
234
+ }
235
+ getAllPortForwards() {
236
+ const stmt = this.db.prepare('SELECT * FROM port_forwards ORDER BY createdAt DESC');
237
+ return stmt.all();
238
+ }
239
+ updatePortForward(id, updates) {
240
+ const fields = Object.keys(updates)
241
+ .filter(key => key !== 'id' && key !== 'createdAt')
242
+ .map(key => `${key} = $${key}`)
243
+ .join(', ');
244
+ const stmt = this.db.prepare(`
245
+ UPDATE port_forwards
246
+ SET ${fields}, updatedAt = CURRENT_TIMESTAMP
247
+ WHERE id = $id
248
+ `);
249
+ const params = { id: id };
250
+ for (const [key, value] of Object.entries(updates)) {
251
+ params[key] = value ?? null;
252
+ }
253
+ stmt.run(params);
254
+ }
255
+ deletePortForward(id) {
256
+ const stmt = this.db.prepare('DELETE FROM port_forwards WHERE id = $id');
257
+ stmt.run({ id: id });
258
+ }
259
+ // Task methods
260
+ createTask(task) {
261
+ const stmt = this.db.prepare(`
262
+ INSERT INTO tasks (id, type, status, payload, result, error)
263
+ VALUES ($id, $type, $status, $payload, $result, $error)
264
+ `);
265
+ stmt.run({
266
+ id: task.id,
267
+ type: task.type,
268
+ status: task.status,
269
+ payload: task.payload,
270
+ result: task.result ?? null,
271
+ error: task.error ?? null,
272
+ });
273
+ return this.getTask(task.id);
274
+ }
275
+ getTask(id) {
276
+ const stmt = this.db.prepare('SELECT * FROM tasks WHERE id = $id');
277
+ return stmt.get({ id: id });
278
+ }
279
+ getPendingTasks() {
280
+ const stmt = this.db.prepare('SELECT * FROM tasks WHERE status = $status ORDER BY createdAt');
281
+ return stmt.all({ status: 'pending' });
282
+ }
283
+ updateTask(id, updates) {
284
+ const fields = Object.keys(updates)
285
+ .filter(key => key !== 'id' && key !== 'createdAt')
286
+ .map(key => `${key} = $${key}`)
287
+ .join(', ');
288
+ const stmt = this.db.prepare(`
289
+ UPDATE tasks
290
+ SET ${fields}, updatedAt = CURRENT_TIMESTAMP
291
+ WHERE id = $id
292
+ `);
293
+ const params = { id: id };
294
+ for (const [key, value] of Object.entries(updates)) {
295
+ params[key] = value ?? null;
296
+ }
297
+ stmt.run(params);
298
+ }
299
+ // Config methods
300
+ getConfig(key) {
301
+ const stmt = this.db.prepare('SELECT value FROM agent_config WHERE key = $key');
302
+ const result = stmt.get({ key: key });
303
+ if (result?.value === '__DELETED__') {
304
+ return undefined;
305
+ }
306
+ return result?.value;
307
+ }
308
+ setConfig(key, value) {
309
+ const stmt = this.db.prepare(`
310
+ INSERT INTO agent_config (id, key, value)
311
+ VALUES ($id, $key, $value)
312
+ ON CONFLICT(key) DO UPDATE SET value = $value, updatedAt = CURRENT_TIMESTAMP
313
+ `);
314
+ stmt.run({ id: key, key: key, value: value });
315
+ }
316
+ getAllConfig() {
317
+ const stmt = this.db.prepare('SELECT key, value FROM agent_config');
318
+ const rows = stmt.all();
319
+ return rows.reduce((acc, row) => {
320
+ // Filter out deleted entries
321
+ if (row.value !== '__DELETED__') {
322
+ acc[row.key] = row.value;
323
+ }
324
+ return acc;
325
+ }, {});
326
+ }
327
+ // Git Repository methods
328
+ createGitRepository(repo) {
329
+ const stmt = this.db.prepare(`
330
+ INSERT INTO git_repositories (id, path, name, parentPath, isSubmodule, projectType, vitePort)
331
+ VALUES ($id, $path, $name, $parentPath, $isSubmodule, $projectType, $vitePort)
332
+ `);
333
+ stmt.run({
334
+ id: repo.id,
335
+ path: repo.path,
336
+ name: repo.name,
337
+ parentPath: repo.parentPath ?? null,
338
+ isSubmodule: repo.isSubmodule ? 1 : 0,
339
+ projectType: repo.projectType ?? null,
340
+ vitePort: repo.vitePort ?? null,
341
+ });
342
+ return this.getGitRepository(repo.id);
343
+ }
344
+ getGitRepository(id) {
345
+ const stmt = this.db.prepare('SELECT * FROM git_repositories WHERE id = $id');
346
+ const repo = stmt.get({ id: id });
347
+ if (repo) {
348
+ repo.isSubmodule = repo.isSubmodule === 1;
349
+ }
350
+ return repo;
351
+ }
352
+ getGitRepositoryByPath(path) {
353
+ const stmt = this.db.prepare('SELECT * FROM git_repositories WHERE path = $path');
354
+ const repo = stmt.get({ path: path });
355
+ if (repo) {
356
+ repo.isSubmodule = repo.isSubmodule === 1;
357
+ }
358
+ return repo;
359
+ }
360
+ getAllGitRepositories() {
361
+ const stmt = this.db.prepare('SELECT * FROM git_repositories ORDER BY path');
362
+ const repos = stmt.all();
363
+ return repos.map(repo => ({ ...repo, isSubmodule: repo.isSubmodule === 1 }));
364
+ }
365
+ updateGitRepository(id, updates) {
366
+ const fields = Object.keys(updates)
367
+ .filter(key => key !== 'id' && key !== 'createdAt')
368
+ .map(key => `${key} = $${key}`)
369
+ .join(', ');
370
+ const stmt = this.db.prepare(`
371
+ UPDATE git_repositories
372
+ SET ${fields}, lastScanned = CURRENT_TIMESTAMP
373
+ WHERE id = $id
374
+ `);
375
+ const params = { id: id };
376
+ for (const [key, value] of Object.entries(updates)) {
377
+ if (key === 'isSubmodule') {
378
+ params[key] = value ? 1 : 0;
379
+ }
380
+ else {
381
+ params[key] = value ?? null;
382
+ }
383
+ }
384
+ stmt.run(params);
385
+ }
386
+ deleteGitRepository(id) {
387
+ const stmt = this.db.prepare('DELETE FROM git_repositories WHERE id = $id');
388
+ stmt.run({ id: id });
389
+ }
390
+ // Bookmarked Command methods
391
+ createBookmarkedCommand(command) {
392
+ const stmt = this.db.prepare(`
393
+ INSERT INTO bookmarked_commands (id, projectId, command, description, category)
394
+ VALUES ($id, $projectId, $command, $description, $category)
395
+ `);
396
+ stmt.run({
397
+ id: command.id,
398
+ projectId: command.projectId ?? null,
399
+ command: command.command,
400
+ description: command.description ?? null,
401
+ category: command.category ?? null,
402
+ });
403
+ return this.getBookmarkedCommand(command.id);
404
+ }
405
+ getBookmarkedCommand(id) {
406
+ const stmt = this.db.prepare('SELECT * FROM bookmarked_commands WHERE id = $id');
407
+ return stmt.get({ id: id });
408
+ }
409
+ getBookmarkedCommandsByProject(projectId) {
410
+ if (projectId === null) {
411
+ const stmt = this.db.prepare('SELECT * FROM bookmarked_commands WHERE projectId IS NULL ORDER BY createdAt DESC');
412
+ return stmt.all();
413
+ }
414
+ else {
415
+ const stmt = this.db.prepare('SELECT * FROM bookmarked_commands WHERE projectId = $projectId ORDER BY createdAt DESC');
416
+ return stmt.all({ projectId: projectId });
417
+ }
418
+ }
419
+ updateBookmarkedCommand(id, updates) {
420
+ const fields = Object.keys(updates)
421
+ .filter(key => key !== 'id' && key !== 'createdAt')
422
+ .map(key => `${key} = $${key}`)
423
+ .join(', ');
424
+ const stmt = this.db.prepare(`
425
+ UPDATE bookmarked_commands
426
+ SET ${fields}
427
+ WHERE id = $id
428
+ `);
429
+ const params = { id: id };
430
+ for (const [key, value] of Object.entries(updates)) {
431
+ params[key] = value ?? null;
432
+ }
433
+ stmt.run(params);
434
+ }
435
+ deleteBookmarkedCommand(id) {
436
+ const stmt = this.db.prepare('DELETE FROM bookmarked_commands WHERE id = $id');
437
+ stmt.run({ id: id });
438
+ }
439
+ // Notification methods
440
+ createNotification(notification) {
441
+ const stmt = this.db.prepare(`
442
+ INSERT INTO notifications (id, sessionName, projectId, type, title, message, status)
443
+ VALUES ($id, $sessionName, $projectId, $type, $title, $message, $status)
444
+ `);
445
+ stmt.run({
446
+ id: notification.id,
447
+ sessionName: notification.sessionName ?? null,
448
+ projectId: notification.projectId ?? null,
449
+ type: notification.type,
450
+ title: notification.title,
451
+ message: notification.message,
452
+ status: notification.status,
453
+ });
454
+ return this.getNotification(notification.id);
455
+ }
456
+ getNotification(id) {
457
+ const stmt = this.db.prepare('SELECT * FROM notifications WHERE id = $id');
458
+ return stmt.get({ id: id });
459
+ }
460
+ getNotificationsByProject(projectId) {
461
+ if (projectId === null) {
462
+ const stmt = this.db.prepare('SELECT * FROM notifications WHERE projectId IS NULL ORDER BY createdAt DESC');
463
+ return stmt.all();
464
+ }
465
+ else {
466
+ const stmt = this.db.prepare('SELECT * FROM notifications WHERE projectId = $projectId ORDER BY createdAt DESC');
467
+ return stmt.all({ projectId: projectId });
468
+ }
469
+ }
470
+ getUnreadNotifications() {
471
+ const stmt = this.db.prepare('SELECT * FROM notifications WHERE status = $status ORDER BY createdAt DESC');
472
+ return stmt.all({ status: 'unread' });
473
+ }
474
+ updateNotificationStatus(id, status) {
475
+ const stmt = this.db.prepare('UPDATE notifications SET status = $status WHERE id = $id');
476
+ stmt.run({ status: status, id: id });
477
+ }
478
+ deleteNotification(id) {
479
+ const stmt = this.db.prepare('DELETE FROM notifications WHERE id = $id');
480
+ stmt.run({ id: id });
481
+ }
482
+ // Tunnel methods
483
+ createTunnel(localPort, subdomain, sessionId) {
484
+ const id = crypto.randomUUID().replace(/-/g, '');
485
+ const stmt = this.db.prepare(`
486
+ INSERT INTO tunnels (id, localPort, subdomain, sessionId, provider, status)
487
+ VALUES ($id, $localPort, $subdomain, $sessionId, 'cloudflared', 'inactive')
488
+ `);
489
+ stmt.run({
490
+ id: id,
491
+ localPort: localPort,
492
+ subdomain: subdomain ?? null,
493
+ sessionId: sessionId ?? null,
494
+ });
495
+ return this.getTunnel(id);
496
+ }
497
+ getTunnel(id) {
498
+ const stmt = this.db.prepare('SELECT * FROM tunnels WHERE id = $id');
499
+ return stmt.get({ id: id });
500
+ }
501
+ getTunnelByPort(localPort) {
502
+ const stmt = this.db.prepare('SELECT * FROM tunnels WHERE localPort = $localPort AND status = $status');
503
+ return stmt.get({ localPort: localPort, status: 'active' });
504
+ }
505
+ listTunnels() {
506
+ const stmt = this.db.prepare('SELECT * FROM tunnels ORDER BY createdAt DESC');
507
+ return stmt.all();
508
+ }
509
+ updateTunnel(id, data) {
510
+ const fields = Object.keys(data)
511
+ .filter(key => key !== 'id' && key !== 'createdAt')
512
+ .map(key => `${key} = $${key}`)
513
+ .join(', ');
514
+ if (!fields)
515
+ return;
516
+ const stmt = this.db.prepare(`
517
+ UPDATE tunnels
518
+ SET ${fields}, updatedAt = CURRENT_TIMESTAMP
519
+ WHERE id = $id
520
+ `);
521
+ const params = { id: id };
522
+ for (const [key, value] of Object.entries(data)) {
523
+ params[key] = value ?? null;
524
+ }
525
+ stmt.run(params);
526
+ }
527
+ deleteTunnel(id) {
528
+ const stmt = this.db.prepare('DELETE FROM tunnels WHERE id = $id');
529
+ stmt.run({ id: id });
530
+ }
531
+ close() {
532
+ this.db.close();
533
+ }
534
+ }
535
+ export default AgentDatabase;
536
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import 'dotenv/config';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ import 'dotenv/config';
2
+ import { startServer, getAgentApiKey } from './app.js';
3
+ import { bootstrap, checkDependencies } from './services/bootstrap.js';
4
+ import { startAgentTunnel } from './routes/tunnel.js';
5
+ const start = async () => {
6
+ try {
7
+ // Auto-bootstrap dependencies on first run (unless SKIP_BOOTSTRAP=true)
8
+ if (process.env.SKIP_BOOTSTRAP !== 'true') {
9
+ const deps = checkDependencies();
10
+ const missing = Object.entries(deps).filter(([, v]) => !v.available);
11
+ if (missing.length > 0) {
12
+ console.log(`\nšŸ“¦ Missing dependencies: ${missing.map(([k]) => k).join(', ')}`);
13
+ console.log('Running auto-bootstrap...\n');
14
+ const results = await bootstrap({ verbose: true });
15
+ const failed = results.filter(r => r.status === 'failed');
16
+ if (failed.length > 0) {
17
+ console.warn(`\nāš ļø Could not install: ${failed.map(f => f.tool).join(', ')}`);
18
+ console.warn('Some features may not work. Run `vibecontrols-agent setup` for manual install.\n');
19
+ }
20
+ else {
21
+ console.log('\nāœ… All dependencies bootstrapped successfully!\n');
22
+ }
23
+ }
24
+ else {
25
+ console.log('āœ… All system dependencies verified');
26
+ }
27
+ }
28
+ const app = await startServer();
29
+ const port = Number(process.env.PORT || 3005);
30
+ await app.listen({ port, host: '0.0.0.0' });
31
+ console.log(`šŸš€ VibeControls Agent is running on http://localhost:${port}`);
32
+ console.log(`šŸ”‘ Agent API Key: ${getAgentApiKey()}`);
33
+ console.log(` Use this key in the agent configuration in the VibeControls UI.`);
34
+ console.log(` Pass it via x-agent-api-key header for all API calls.`);
35
+ // Auto-start the single cloudflared tunnel for this agent (unless disabled).
36
+ // The tunnel URL is exposed via GET /api/agent-tunnel — the user copies it
37
+ // into the agent's tunnel URL field in the VibeControls UI.
38
+ if (process.env.AGENT_TUNNEL !== 'false') {
39
+ try {
40
+ const tunnelUrl = await startAgentTunnel(port);
41
+ if (tunnelUrl) {
42
+ console.log(`šŸš‡ Agent tunnel: ${tunnelUrl} → localhost:${port}`);
43
+ console.log(` Copy this URL into the agent's tunnel URL field in the VibeControls UI.`);
44
+ }
45
+ }
46
+ catch (err) {
47
+ console.warn('āš ļø Failed to start agent tunnel:', err instanceof Error ? err.message : err);
48
+ console.warn(' Tunnel can be started manually via POST /api/agent-tunnel/start');
49
+ }
50
+ }
51
+ else {
52
+ console.log('šŸš‡ Agent tunnel disabled (AGENT_TUNNEL=false)');
53
+ }
54
+ }
55
+ catch (err) {
56
+ console.error('Error starting server:', err);
57
+ process.exit(1);
58
+ }
59
+ };
60
+ start();
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}