@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,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 @@
|
|
|
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 @@
|
|
|
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"}
|