@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,61 @@
1
+ import { FastifyRequest } from 'fastify';
2
+ export interface ModuleAuthPayload {
3
+ moduleId: string;
4
+ type: 'module';
5
+ permissions: string[];
6
+ iat: number;
7
+ exp: number;
8
+ }
9
+ export interface AuthResult {
10
+ valid: boolean;
11
+ moduleId?: string;
12
+ permissions?: string[];
13
+ error?: string;
14
+ }
15
+ export declare class ModuleAuthMiddleware {
16
+ private moduleTokens;
17
+ private tokenSecrets;
18
+ private jwtSecret;
19
+ constructor();
20
+ /**
21
+ * Generate authentication token for a module
22
+ */
23
+ generateModuleToken(moduleId: string, permissions?: string[]): string;
24
+ /**
25
+ * Authenticate module from request
26
+ */
27
+ authenticateModule(request: FastifyRequest): AuthResult;
28
+ /**
29
+ * Revoke module authentication token
30
+ */
31
+ revokeModuleToken(moduleId: string): void;
32
+ /**
33
+ * Refresh module token (extend expiration)
34
+ */
35
+ refreshModuleToken(moduleId: string, permissions?: string[]): string | null;
36
+ /**
37
+ * Validate token without authenticating request
38
+ */
39
+ validateToken(token: string): AuthResult;
40
+ /**
41
+ * Get all active module tokens
42
+ */
43
+ getActiveTokens(): Map<string, string>;
44
+ /**
45
+ * Clean up expired tokens
46
+ */
47
+ cleanupExpiredTokens(): void;
48
+ /**
49
+ * Fastify middleware for module authentication
50
+ */
51
+ createAuthMiddleware(): (request: FastifyRequest, reply: any) => Promise<void>;
52
+ /**
53
+ * Generate cryptographically secure secret
54
+ */
55
+ private generateSecret;
56
+ /**
57
+ * Start token cleanup interval
58
+ */
59
+ startCleanupInterval(): void;
60
+ }
61
+ //# sourceMappingURL=ModuleAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleAuth.d.ts","sourceRoot":"","sources":["../../src/middleware/ModuleAuth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,SAAS,CAAS;;IAM1B;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO,GAAG,MAAM;IA+BzE;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU;IAqEvD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMzC;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO,GAAG,MAAM,GAAG,IAAI;IAkB/E;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IA6BxC;;OAEG;IACH,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAItC;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAkB5B;;OAEG;IACH,oBAAoB,KACJ,SAAS,cAAc,EAAE,OAAO,GAAG;IAmBnD;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAM7B"}
@@ -0,0 +1,220 @@
1
+ import jwt from 'jsonwebtoken';
2
+ import crypto from 'crypto';
3
+ export class ModuleAuthMiddleware {
4
+ moduleTokens = new Map();
5
+ tokenSecrets = new Map();
6
+ jwtSecret;
7
+ constructor() {
8
+ this.jwtSecret = process.env.MODULE_JWT_SECRET || this.generateSecret();
9
+ }
10
+ /**
11
+ * Generate authentication token for a module
12
+ */
13
+ generateModuleToken(moduleId, permissions = []) {
14
+ try {
15
+ // Generate unique secret for this module
16
+ const moduleSecret = this.generateSecret();
17
+ this.tokenSecrets.set(moduleId, moduleSecret);
18
+ // Create JWT payload
19
+ const payload = {
20
+ moduleId,
21
+ type: 'module',
22
+ permissions
23
+ };
24
+ // Sign token with module-specific secret
25
+ const token = jwt.sign(payload, moduleSecret, {
26
+ expiresIn: '7d',
27
+ issuer: 'vibecontrols-agent',
28
+ audience: moduleId
29
+ });
30
+ // Store token mapping
31
+ this.moduleTokens.set(moduleId, token);
32
+ console.log(`Generated auth token for module: ${moduleId}`);
33
+ return token;
34
+ }
35
+ catch (error) {
36
+ console.error(`Failed to generate token for module ${moduleId}:`, error);
37
+ throw new Error('Token generation failed');
38
+ }
39
+ }
40
+ /**
41
+ * Authenticate module from request
42
+ */
43
+ authenticateModule(request) {
44
+ try {
45
+ const authHeader = request.headers.authorization;
46
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
47
+ return {
48
+ valid: false,
49
+ error: 'Missing or invalid authorization header'
50
+ };
51
+ }
52
+ const token = authHeader.substring(7);
53
+ // Decode token to get module ID (without verification)
54
+ const decoded = jwt.decode(token);
55
+ if (!decoded || !decoded.moduleId) {
56
+ return {
57
+ valid: false,
58
+ error: 'Invalid token format'
59
+ };
60
+ }
61
+ const moduleId = decoded.moduleId;
62
+ // Check if token exists for this module
63
+ const storedToken = this.moduleTokens.get(moduleId);
64
+ if (!storedToken || storedToken !== token) {
65
+ return {
66
+ valid: false,
67
+ error: 'Token not found or expired'
68
+ };
69
+ }
70
+ // Get module secret
71
+ const moduleSecret = this.tokenSecrets.get(moduleId);
72
+ if (!moduleSecret) {
73
+ return {
74
+ valid: false,
75
+ error: 'Module secret not found'
76
+ };
77
+ }
78
+ // Verify token with module secret
79
+ const payload = jwt.verify(token, moduleSecret, {
80
+ issuer: 'vibecontrols-agent',
81
+ audience: moduleId
82
+ });
83
+ return {
84
+ valid: true,
85
+ moduleId: payload.moduleId,
86
+ permissions: payload.permissions || []
87
+ };
88
+ }
89
+ catch (error) {
90
+ if (error instanceof jwt.JsonWebTokenError) {
91
+ return {
92
+ valid: false,
93
+ error: `JWT Error: ${error.message}`
94
+ };
95
+ }
96
+ console.error('Authentication error:', error);
97
+ return {
98
+ valid: false,
99
+ error: 'Authentication failed'
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Revoke module authentication token
105
+ */
106
+ revokeModuleToken(moduleId) {
107
+ this.moduleTokens.delete(moduleId);
108
+ this.tokenSecrets.delete(moduleId);
109
+ console.log(`Revoked auth token for module: ${moduleId}`);
110
+ }
111
+ /**
112
+ * Refresh module token (extend expiration)
113
+ */
114
+ refreshModuleToken(moduleId, permissions = []) {
115
+ try {
116
+ // Check if module has existing token
117
+ if (!this.moduleTokens.has(moduleId)) {
118
+ return null;
119
+ }
120
+ // Generate new token
121
+ const newToken = this.generateModuleToken(moduleId, permissions);
122
+ console.log(`Refreshed auth token for module: ${moduleId}`);
123
+ return newToken;
124
+ }
125
+ catch (error) {
126
+ console.error(`Failed to refresh token for module ${moduleId}:`, error);
127
+ return null;
128
+ }
129
+ }
130
+ /**
131
+ * Validate token without authenticating request
132
+ */
133
+ validateToken(token) {
134
+ try {
135
+ const decoded = jwt.decode(token);
136
+ if (!decoded || !decoded.moduleId) {
137
+ return { valid: false, error: 'Invalid token format' };
138
+ }
139
+ const moduleId = decoded.moduleId;
140
+ const moduleSecret = this.tokenSecrets.get(moduleId);
141
+ if (!moduleSecret) {
142
+ return { valid: false, error: 'Module secret not found' };
143
+ }
144
+ const payload = jwt.verify(token, moduleSecret, {
145
+ issuer: 'vibecontrols-agent',
146
+ audience: moduleId
147
+ });
148
+ return {
149
+ valid: true,
150
+ moduleId: payload.moduleId,
151
+ permissions: payload.permissions || []
152
+ };
153
+ }
154
+ catch (error) {
155
+ return { valid: false, error: error instanceof Error ? error.message : 'Unknown error' };
156
+ }
157
+ }
158
+ /**
159
+ * Get all active module tokens
160
+ */
161
+ getActiveTokens() {
162
+ return new Map(this.moduleTokens);
163
+ }
164
+ /**
165
+ * Clean up expired tokens
166
+ */
167
+ cleanupExpiredTokens() {
168
+ const now = Date.now() / 1000;
169
+ for (const [moduleId, token] of this.moduleTokens) {
170
+ try {
171
+ const decoded = jwt.decode(token);
172
+ if (decoded && decoded.exp && decoded.exp < now) {
173
+ this.revokeModuleToken(moduleId);
174
+ console.log(`Cleaned up expired token for module: ${moduleId}`);
175
+ }
176
+ }
177
+ catch (error) {
178
+ // If token is invalid, remove it
179
+ this.revokeModuleToken(moduleId);
180
+ console.log(`Cleaned up invalid token for module: ${moduleId}`);
181
+ }
182
+ }
183
+ }
184
+ /**
185
+ * Fastify middleware for module authentication
186
+ */
187
+ createAuthMiddleware() {
188
+ return async (request, reply) => {
189
+ const auth = this.authenticateModule(request);
190
+ if (!auth.valid) {
191
+ reply.code(401).send({
192
+ error: 'Unauthorized',
193
+ message: auth.error
194
+ });
195
+ return;
196
+ }
197
+ // Add module info to request
198
+ request.moduleAuth = {
199
+ moduleId: auth.moduleId,
200
+ permissions: auth.permissions
201
+ };
202
+ };
203
+ }
204
+ /**
205
+ * Generate cryptographically secure secret
206
+ */
207
+ generateSecret() {
208
+ return crypto.randomBytes(32).toString('hex');
209
+ }
210
+ /**
211
+ * Start token cleanup interval
212
+ */
213
+ startCleanupInterval() {
214
+ // Clean up expired tokens every hour
215
+ setInterval(() => {
216
+ this.cleanupExpiredTokens();
217
+ }, 60 * 60 * 1000);
218
+ }
219
+ }
220
+ //# sourceMappingURL=ModuleAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleAuth.js","sourceRoot":"","sources":["../../src/middleware/ModuleAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyRequest, FastifyReply } from 'fastify';
2
+ export declare function authMiddleware(request: FastifyRequest, reply: FastifyReply): Promise<void>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,iBAUhF"}
@@ -0,0 +1,11 @@
1
+ export async function authMiddleware(request, reply) {
2
+ // Skip auth for health check
3
+ if (request.url === '/health')
4
+ return;
5
+ const apiKey = request.headers['x-api-key'];
6
+ const expectedKey = process.env.AGENT_API_KEY || 'default-api-key';
7
+ if (!apiKey || apiKey !== expectedKey) {
8
+ reply.code(401).send({ error: 'Unauthorized' });
9
+ }
10
+ }
11
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB,EAAE,KAAmB;IAC/E,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO;IAEtC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAW,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAEnE,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Migration to remove orphaned notes and prompts tables from agent SQLite database
3
+ * These tables were created but never implemented in the agent codebase
4
+ * Notes and prompts functionality is handled by the PostgreSQL backend
5
+ */
6
+ export interface MigrationResult {
7
+ success: boolean;
8
+ tablesRemoved: string[];
9
+ errors: string[];
10
+ backupCreated?: string;
11
+ }
12
+ export declare function removeNotesPromptsTables(dbPath?: string): MigrationResult;
13
+ //# sourceMappingURL=remove-notes-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-notes-prompts.d.ts","sourceRoot":"","sources":["../../src/migrations/remove-notes-prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,MAAkC,GAAG,eAAe,CAuIpG"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Migration to remove orphaned notes and prompts tables from agent SQLite database
3
+ * These tables were created but never implemented in the agent codebase
4
+ * Notes and prompts functionality is handled by the PostgreSQL backend
5
+ */
6
+ import Database from 'better-sqlite3';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ export function removeNotesPromptsTables(dbPath = './vibecontrols-agent.db') {
10
+ const result = {
11
+ success: false,
12
+ tablesRemoved: [],
13
+ errors: []
14
+ };
15
+ let db = null;
16
+ try {
17
+ // Check if database exists
18
+ if (!fs.existsSync(dbPath)) {
19
+ result.errors.push('Database file does not exist');
20
+ return result;
21
+ }
22
+ // Create backup before migration
23
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
24
+ const backupPath = path.join(path.dirname(dbPath), `vibecontrols-agent-backup-${timestamp}.db`);
25
+ try {
26
+ fs.copyFileSync(dbPath, backupPath);
27
+ result.backupCreated = backupPath;
28
+ console.log(`Created backup at: ${backupPath}`);
29
+ }
30
+ catch (error) {
31
+ result.errors.push(`Failed to create backup: ${error instanceof Error ? error.message : 'Unknown error'}`);
32
+ return result;
33
+ }
34
+ // Open database connection
35
+ db = new Database(dbPath);
36
+ db.exec('PRAGMA journal_mode = WAL');
37
+ // Check if tables exist before attempting to drop them
38
+ const checkTablesQuery = `
39
+ SELECT name FROM sqlite_master
40
+ WHERE type='table' AND name IN ('notes', 'prompts')
41
+ `;
42
+ const existingTables = db.prepare(checkTablesQuery).all();
43
+ const tablesToRemove = existingTables.map(t => t.name);
44
+ if (tablesToRemove.length === 0) {
45
+ console.log('No notes or prompts tables found to remove');
46
+ result.success = true;
47
+ return result;
48
+ }
49
+ console.log(`Found tables to remove: ${tablesToRemove.join(', ')}`);
50
+ // Remove tables in transaction
51
+ const transaction = db.transaction(() => {
52
+ for (const tableName of tablesToRemove) {
53
+ try {
54
+ // Check if table has any data before dropping
55
+ const countQuery = `SELECT COUNT(*) as count FROM ${tableName}`;
56
+ const { count } = db.prepare(countQuery).get();
57
+ if (count > 0) {
58
+ console.log(`Warning: Table '${tableName}' contains ${count} rows that will be lost`);
59
+ }
60
+ else {
61
+ console.log(`Table '${tableName}' is empty, safe to remove`);
62
+ }
63
+ // Drop the table
64
+ const dropQuery = `DROP TABLE IF EXISTS ${tableName}`;
65
+ db.prepare(dropQuery).run();
66
+ // Remove associated indexes
67
+ const dropIndexQueries = [
68
+ `DROP INDEX IF EXISTS idx_${tableName}_projectId`,
69
+ `DROP INDEX IF EXISTS idx_${tableName}_status`,
70
+ `DROP INDEX IF EXISTS idx_${tableName}_createdAt`,
71
+ `DROP INDEX IF EXISTS idx_${tableName}_updatedAt`
72
+ ];
73
+ for (const indexQuery of dropIndexQueries) {
74
+ try {
75
+ db.prepare(indexQuery).run();
76
+ }
77
+ catch {
78
+ // Index might not exist, that's okay
79
+ }
80
+ }
81
+ result.tablesRemoved.push(tableName);
82
+ console.log(`Successfully removed table: ${tableName}`);
83
+ }
84
+ catch (tableError) {
85
+ const errorMsg = `Failed to remove table '${tableName}': ${tableError instanceof Error ? tableError.message : 'Unknown error'}`;
86
+ result.errors.push(errorMsg);
87
+ console.error(errorMsg);
88
+ }
89
+ }
90
+ });
91
+ // Execute the transaction
92
+ transaction();
93
+ // Verify tables were removed
94
+ const verifyQuery = `
95
+ SELECT name FROM sqlite_master
96
+ WHERE type='table' AND name IN ('notes', 'prompts')
97
+ `;
98
+ const remainingTables = db.prepare(verifyQuery).all();
99
+ if (remainingTables.length > 0) {
100
+ result.errors.push(`Some tables were not removed: ${remainingTables.map(t => t.name).join(', ')}`);
101
+ }
102
+ // Vacuum database to reclaim space
103
+ try {
104
+ db.exec('VACUUM');
105
+ console.log('Database vacuumed to reclaim space');
106
+ }
107
+ catch (vacuumError) {
108
+ console.warn('Failed to vacuum database:', vacuumError);
109
+ }
110
+ result.success = result.errors.length === 0;
111
+ }
112
+ catch (error) {
113
+ const errorMsg = `Migration failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
114
+ result.errors.push(errorMsg);
115
+ console.error(errorMsg);
116
+ }
117
+ finally {
118
+ // Close database connection
119
+ if (db) {
120
+ try {
121
+ db.close();
122
+ }
123
+ catch (closeError) {
124
+ console.warn('Warning: Failed to close database connection:', closeError);
125
+ }
126
+ }
127
+ }
128
+ return result;
129
+ }
130
+ // CLI support - run migration if this file is executed directly
131
+ if (import.meta.url === `file://${process.argv[1]}`) {
132
+ const dbPath = process.argv[2] || './vibecontrols-agent.db';
133
+ console.log('Running notes/prompts table removal migration...');
134
+ console.log(`Database path: ${dbPath}`);
135
+ const result = removeNotesPromptsTables(dbPath);
136
+ console.log('\n=== Migration Results ===');
137
+ console.log(`Success: ${result.success}`);
138
+ console.log(`Tables removed: ${result.tablesRemoved.length > 0 ? result.tablesRemoved.join(', ') : 'None'}`);
139
+ if (result.backupCreated) {
140
+ console.log(`Backup created: ${result.backupCreated}`);
141
+ }
142
+ if (result.errors.length > 0) {
143
+ console.log('Errors:');
144
+ result.errors.forEach(error => console.log(` - ${error}`));
145
+ }
146
+ process.exit(result.success ? 0 : 1);
147
+ }
148
+ //# sourceMappingURL=remove-notes-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-notes-prompts.js","sourceRoot":"","sources":["../../src/migrations/remove-notes-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyPluginAsync } from 'fastify';
2
+ export declare const bookmarkRoutes: FastifyPluginAsync;
3
+ //# sourceMappingURL=bookmarks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookmarks.d.ts","sourceRoot":"","sources":["../../src/routes/bookmarks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAsB7C,eAAO,MAAM,cAAc,EAAE,kBAoN5B,CAAC"}