@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,100 @@
|
|
|
1
|
+
import { FastifyRequest, FastifyReply } from 'fastify';
|
|
2
|
+
export type Permission = 'filesystem' | 'network' | 'database' | 'terminal' | 'system' | 'users' | 'modules' | 'settings' | 'logs' | 'registry' | '*';
|
|
3
|
+
export interface PermissionRule {
|
|
4
|
+
permission: Permission;
|
|
5
|
+
resource?: string;
|
|
6
|
+
action?: string;
|
|
7
|
+
conditions?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface ModulePermissions {
|
|
10
|
+
moduleId: string;
|
|
11
|
+
permissions: Set<Permission>;
|
|
12
|
+
rules: PermissionRule[];
|
|
13
|
+
grantedAt: Date;
|
|
14
|
+
grantedBy: string;
|
|
15
|
+
temporary?: {
|
|
16
|
+
expiresAt: Date;
|
|
17
|
+
reason: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare class ModulePermissionManager {
|
|
21
|
+
private modulePermissions;
|
|
22
|
+
private permissionHierarchy;
|
|
23
|
+
private resourcePatterns;
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Initialize permission hierarchy (parent permissions include child permissions)
|
|
27
|
+
*/
|
|
28
|
+
private initializePermissionHierarchy;
|
|
29
|
+
/**
|
|
30
|
+
* Grant permissions to a module
|
|
31
|
+
*/
|
|
32
|
+
grantPermissions(moduleId: string, permissions: Permission[], grantedBy?: string, rules?: PermissionRule[]): void;
|
|
33
|
+
/**
|
|
34
|
+
* Grant temporary permissions that expire
|
|
35
|
+
*/
|
|
36
|
+
grantTemporaryPermissions(moduleId: string, permissions: Permission[], duration: number, // in milliseconds
|
|
37
|
+
reason: string, grantedBy?: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Revoke permissions from a module
|
|
40
|
+
*/
|
|
41
|
+
revokePermissions(moduleId: string, permissions?: Permission[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Check if module has specific permission
|
|
44
|
+
*/
|
|
45
|
+
hasPermission(moduleId: string, permission: Permission, resource?: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check resource-specific access
|
|
48
|
+
*/
|
|
49
|
+
private checkResourceAccess;
|
|
50
|
+
/**
|
|
51
|
+
* Get or create resource pattern
|
|
52
|
+
*/
|
|
53
|
+
private getResourcePattern;
|
|
54
|
+
/**
|
|
55
|
+
* Enforce permission check (throws error if not permitted)
|
|
56
|
+
*/
|
|
57
|
+
checkPermission(moduleId: string, permission: Permission, resource?: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Get all permissions for a module
|
|
60
|
+
*/
|
|
61
|
+
getModulePermissions(moduleId: string): ModulePermissions | null;
|
|
62
|
+
/**
|
|
63
|
+
* List all modules with their permissions
|
|
64
|
+
*/
|
|
65
|
+
listAllPermissions(): Map<string, ModulePermissions>;
|
|
66
|
+
/**
|
|
67
|
+
* Create Fastify middleware for permission checking
|
|
68
|
+
*/
|
|
69
|
+
requirePermission(permission: Permission, resource?: string): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Create middleware that requires any of the specified permissions
|
|
72
|
+
*/
|
|
73
|
+
requireAnyPermission(permissions: Permission[]): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Create middleware that requires all specified permissions
|
|
76
|
+
*/
|
|
77
|
+
requireAllPermissions(permissions: Permission[]): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Audit permission usage
|
|
80
|
+
*/
|
|
81
|
+
auditPermissionUsage(moduleId: string, permission: Permission, resource?: string, action?: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get permission statistics
|
|
84
|
+
*/
|
|
85
|
+
getPermissionStats(): {
|
|
86
|
+
totalModules: number;
|
|
87
|
+
permissionCounts: Record<Permission, number>;
|
|
88
|
+
temporaryPermissions: number;
|
|
89
|
+
expiredPermissions: number;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Clean up expired permissions
|
|
93
|
+
*/
|
|
94
|
+
private cleanupExpiredPermissions;
|
|
95
|
+
/**
|
|
96
|
+
* Start cleanup interval for expired permissions
|
|
97
|
+
*/
|
|
98
|
+
private startCleanupInterval;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ModulePermissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModulePermissions.d.ts","sourceRoot":"","sources":["../../src/services/ModulePermissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
export class ModulePermissionManager {
|
|
2
|
+
modulePermissions = new Map();
|
|
3
|
+
permissionHierarchy = new Map();
|
|
4
|
+
resourcePatterns = new Map();
|
|
5
|
+
constructor() {
|
|
6
|
+
this.initializePermissionHierarchy();
|
|
7
|
+
this.startCleanupInterval();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Initialize permission hierarchy (parent permissions include child permissions)
|
|
11
|
+
*/
|
|
12
|
+
initializePermissionHierarchy() {
|
|
13
|
+
this.permissionHierarchy.set('*', [
|
|
14
|
+
'filesystem', 'network', 'database', 'terminal', 'system',
|
|
15
|
+
'users', 'modules', 'settings', 'logs', 'registry'
|
|
16
|
+
]);
|
|
17
|
+
this.permissionHierarchy.set('system', ['terminal', 'logs']);
|
|
18
|
+
this.permissionHierarchy.set('modules', ['registry']);
|
|
19
|
+
this.permissionHierarchy.set('database', ['filesystem']); // Database access may require file access
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Grant permissions to a module
|
|
23
|
+
*/
|
|
24
|
+
grantPermissions(moduleId, permissions, grantedBy = 'system', rules = []) {
|
|
25
|
+
const modulePermissions = {
|
|
26
|
+
moduleId,
|
|
27
|
+
permissions: new Set(permissions),
|
|
28
|
+
rules,
|
|
29
|
+
grantedAt: new Date(),
|
|
30
|
+
grantedBy
|
|
31
|
+
};
|
|
32
|
+
this.modulePermissions.set(moduleId, modulePermissions);
|
|
33
|
+
console.log(`Granted permissions to module ${moduleId}:`, permissions);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Grant temporary permissions that expire
|
|
37
|
+
*/
|
|
38
|
+
grantTemporaryPermissions(moduleId, permissions, duration, // in milliseconds
|
|
39
|
+
reason, grantedBy = 'system') {
|
|
40
|
+
const expiresAt = new Date(Date.now() + duration);
|
|
41
|
+
const modulePermissions = {
|
|
42
|
+
moduleId,
|
|
43
|
+
permissions: new Set(permissions),
|
|
44
|
+
rules: [],
|
|
45
|
+
grantedAt: new Date(),
|
|
46
|
+
grantedBy,
|
|
47
|
+
temporary: {
|
|
48
|
+
expiresAt,
|
|
49
|
+
reason
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
this.modulePermissions.set(moduleId, modulePermissions);
|
|
53
|
+
console.log(`Granted temporary permissions to module ${moduleId} until ${expiresAt}:`, permissions);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Revoke permissions from a module
|
|
57
|
+
*/
|
|
58
|
+
revokePermissions(moduleId, permissions) {
|
|
59
|
+
const modulePermissions = this.modulePermissions.get(moduleId);
|
|
60
|
+
if (!modulePermissions) {
|
|
61
|
+
console.warn(`Attempted to revoke permissions from non-existent module: ${moduleId}`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (permissions) {
|
|
65
|
+
// Revoke specific permissions
|
|
66
|
+
permissions.forEach(permission => {
|
|
67
|
+
modulePermissions.permissions.delete(permission);
|
|
68
|
+
});
|
|
69
|
+
// Remove empty permission set
|
|
70
|
+
if (modulePermissions.permissions.size === 0) {
|
|
71
|
+
this.modulePermissions.delete(moduleId);
|
|
72
|
+
}
|
|
73
|
+
console.log(`Revoked specific permissions from module ${moduleId}:`, permissions);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Revoke all permissions
|
|
77
|
+
this.modulePermissions.delete(moduleId);
|
|
78
|
+
console.log(`Revoked all permissions from module ${moduleId}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if module has specific permission
|
|
83
|
+
*/
|
|
84
|
+
hasPermission(moduleId, permission, resource) {
|
|
85
|
+
const modulePermissions = this.modulePermissions.get(moduleId);
|
|
86
|
+
if (!modulePermissions) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Check if permissions are expired
|
|
90
|
+
if (modulePermissions.temporary && modulePermissions.temporary.expiresAt < new Date()) {
|
|
91
|
+
this.revokePermissions(moduleId);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// Check direct permission
|
|
95
|
+
if (modulePermissions.permissions.has(permission)) {
|
|
96
|
+
return this.checkResourceAccess(modulePermissions, permission, resource);
|
|
97
|
+
}
|
|
98
|
+
// Check wildcard permission
|
|
99
|
+
if (modulePermissions.permissions.has('*')) {
|
|
100
|
+
return this.checkResourceAccess(modulePermissions, permission, resource);
|
|
101
|
+
}
|
|
102
|
+
// Check hierarchical permissions
|
|
103
|
+
for (const [parentPermission, childPermissions] of this.permissionHierarchy) {
|
|
104
|
+
if (modulePermissions.permissions.has(parentPermission) &&
|
|
105
|
+
childPermissions.includes(permission)) {
|
|
106
|
+
return this.checkResourceAccess(modulePermissions, permission, resource);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check resource-specific access
|
|
113
|
+
*/
|
|
114
|
+
checkResourceAccess(modulePermissions, permission, resource) {
|
|
115
|
+
if (!resource) {
|
|
116
|
+
return true; // No resource restriction
|
|
117
|
+
}
|
|
118
|
+
// Check if there are specific rules for this permission
|
|
119
|
+
const relevantRules = modulePermissions.rules.filter(rule => rule.permission === permission || rule.permission === '*');
|
|
120
|
+
if (relevantRules.length === 0) {
|
|
121
|
+
return true; // No specific rules, permission is granted
|
|
122
|
+
}
|
|
123
|
+
// Check if resource matches any allowed pattern
|
|
124
|
+
for (const rule of relevantRules) {
|
|
125
|
+
if (rule.resource) {
|
|
126
|
+
const pattern = this.getResourcePattern(rule.resource);
|
|
127
|
+
if (pattern.test(resource)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get or create resource pattern
|
|
136
|
+
*/
|
|
137
|
+
getResourcePattern(resource) {
|
|
138
|
+
if (!this.resourcePatterns.has(resource)) {
|
|
139
|
+
// Convert glob-like patterns to regex
|
|
140
|
+
const regexPattern = resource
|
|
141
|
+
.replace(/\*/g, '.*')
|
|
142
|
+
.replace(/\?/g, '.');
|
|
143
|
+
this.resourcePatterns.set(resource, new RegExp(`^${regexPattern}$`));
|
|
144
|
+
}
|
|
145
|
+
return this.resourcePatterns.get(resource);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Enforce permission check (throws error if not permitted)
|
|
149
|
+
*/
|
|
150
|
+
checkPermission(moduleId, permission, resource) {
|
|
151
|
+
if (!this.hasPermission(moduleId, permission, resource)) {
|
|
152
|
+
const resourceInfo = resource ? ` for resource: ${resource}` : '';
|
|
153
|
+
throw new Error(`Module ${moduleId} does not have permission: ${permission}${resourceInfo}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get all permissions for a module
|
|
158
|
+
*/
|
|
159
|
+
getModulePermissions(moduleId) {
|
|
160
|
+
return this.modulePermissions.get(moduleId) || null;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* List all modules with their permissions
|
|
164
|
+
*/
|
|
165
|
+
listAllPermissions() {
|
|
166
|
+
return new Map(this.modulePermissions);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Create Fastify middleware for permission checking
|
|
170
|
+
*/
|
|
171
|
+
requirePermission(permission, resource) {
|
|
172
|
+
return async (request, reply) => {
|
|
173
|
+
const moduleAuth = request.moduleAuth;
|
|
174
|
+
if (!moduleAuth || !moduleAuth.moduleId) {
|
|
175
|
+
reply.code(401).send({
|
|
176
|
+
error: 'Unauthorized',
|
|
177
|
+
message: 'Module authentication required'
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (!this.hasPermission(moduleAuth.moduleId, permission, resource)) {
|
|
182
|
+
reply.code(403).send({
|
|
183
|
+
error: 'Forbidden',
|
|
184
|
+
message: `Insufficient permissions: ${permission}${resource ? ` for ${resource}` : ''}`
|
|
185
|
+
});
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Add permission info to request
|
|
189
|
+
request.permissionContext = {
|
|
190
|
+
permission,
|
|
191
|
+
resource,
|
|
192
|
+
moduleId: moduleAuth.moduleId
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create middleware that requires any of the specified permissions
|
|
198
|
+
*/
|
|
199
|
+
requireAnyPermission(permissions) {
|
|
200
|
+
return async (request, reply) => {
|
|
201
|
+
const moduleAuth = request.moduleAuth;
|
|
202
|
+
if (!moduleAuth || !moduleAuth.moduleId) {
|
|
203
|
+
reply.code(401).send({
|
|
204
|
+
error: 'Unauthorized',
|
|
205
|
+
message: 'Module authentication required'
|
|
206
|
+
});
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const hasAnyPermission = permissions.some(permission => this.hasPermission(moduleAuth.moduleId, permission));
|
|
210
|
+
if (!hasAnyPermission) {
|
|
211
|
+
reply.code(403).send({
|
|
212
|
+
error: 'Forbidden',
|
|
213
|
+
message: `Insufficient permissions: requires one of ${permissions.join(', ')}`
|
|
214
|
+
});
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Create middleware that requires all specified permissions
|
|
221
|
+
*/
|
|
222
|
+
requireAllPermissions(permissions) {
|
|
223
|
+
return async (request, reply) => {
|
|
224
|
+
const moduleAuth = request.moduleAuth;
|
|
225
|
+
if (!moduleAuth || !moduleAuth.moduleId) {
|
|
226
|
+
reply.code(401).send({
|
|
227
|
+
error: 'Unauthorized',
|
|
228
|
+
message: 'Module authentication required'
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const missingPermissions = permissions.filter(permission => !this.hasPermission(moduleAuth.moduleId, permission));
|
|
233
|
+
if (missingPermissions.length > 0) {
|
|
234
|
+
reply.code(403).send({
|
|
235
|
+
error: 'Forbidden',
|
|
236
|
+
message: `Missing permissions: ${missingPermissions.join(', ')}`
|
|
237
|
+
});
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Audit permission usage
|
|
244
|
+
*/
|
|
245
|
+
auditPermissionUsage(moduleId, permission, resource, action) {
|
|
246
|
+
const timestamp = new Date().toISOString();
|
|
247
|
+
const logMessage = `[${timestamp}] Module ${moduleId} used permission ${permission}${resource ? ` on ${resource}` : ''}${action ? ` (${action})` : ''}`;
|
|
248
|
+
console.log(logMessage);
|
|
249
|
+
// In production, this would be logged to an audit system
|
|
250
|
+
// this.auditLogger.log({
|
|
251
|
+
// moduleId,
|
|
252
|
+
// permission,
|
|
253
|
+
// resource,
|
|
254
|
+
// action,
|
|
255
|
+
// timestamp: new Date()
|
|
256
|
+
// });
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get permission statistics
|
|
260
|
+
*/
|
|
261
|
+
getPermissionStats() {
|
|
262
|
+
const stats = {
|
|
263
|
+
totalModules: this.modulePermissions.size,
|
|
264
|
+
permissionCounts: {},
|
|
265
|
+
temporaryPermissions: 0,
|
|
266
|
+
expiredPermissions: 0
|
|
267
|
+
};
|
|
268
|
+
const now = new Date();
|
|
269
|
+
for (const [moduleId, modulePermissions] of this.modulePermissions) {
|
|
270
|
+
// Count permissions
|
|
271
|
+
for (const permission of modulePermissions.permissions) {
|
|
272
|
+
stats.permissionCounts[permission] = (stats.permissionCounts[permission] || 0) + 1;
|
|
273
|
+
}
|
|
274
|
+
// Count temporary permissions
|
|
275
|
+
if (modulePermissions.temporary) {
|
|
276
|
+
if (modulePermissions.temporary.expiresAt < now) {
|
|
277
|
+
stats.expiredPermissions++;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
stats.temporaryPermissions++;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return stats;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Clean up expired permissions
|
|
288
|
+
*/
|
|
289
|
+
cleanupExpiredPermissions() {
|
|
290
|
+
const now = new Date();
|
|
291
|
+
const expiredModules = [];
|
|
292
|
+
for (const [moduleId, modulePermissions] of this.modulePermissions) {
|
|
293
|
+
if (modulePermissions.temporary && modulePermissions.temporary.expiresAt < now) {
|
|
294
|
+
expiredModules.push(moduleId);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
expiredModules.forEach(moduleId => {
|
|
298
|
+
this.revokePermissions(moduleId);
|
|
299
|
+
console.log(`Cleaned up expired permissions for module: ${moduleId}`);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Start cleanup interval for expired permissions
|
|
304
|
+
*/
|
|
305
|
+
startCleanupInterval() {
|
|
306
|
+
// Clean up expired permissions every 5 minutes
|
|
307
|
+
setInterval(() => {
|
|
308
|
+
this.cleanupExpiredPermissions();
|
|
309
|
+
}, 5 * 60 * 1000);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=ModulePermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModulePermissions.js","sourceRoot":"","sources":["../../src/services/ModulePermissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export interface ModuleManifest {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
version: string;
|
|
6
|
+
description: string;
|
|
7
|
+
author: string;
|
|
8
|
+
category: string;
|
|
9
|
+
tags: string[];
|
|
10
|
+
main: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
permissions: string[];
|
|
13
|
+
compatibility: {
|
|
14
|
+
vibecontrols: string;
|
|
15
|
+
platforms: string[];
|
|
16
|
+
};
|
|
17
|
+
api: {
|
|
18
|
+
backend: {
|
|
19
|
+
port: number;
|
|
20
|
+
endpoints: string[];
|
|
21
|
+
};
|
|
22
|
+
frontend: {
|
|
23
|
+
port: number;
|
|
24
|
+
route: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
dependencies: Record<string, string>;
|
|
28
|
+
configuration: Record<string, any>;
|
|
29
|
+
features: string[];
|
|
30
|
+
screenshots?: string[];
|
|
31
|
+
documentation: {
|
|
32
|
+
readme: string;
|
|
33
|
+
userGuide?: string;
|
|
34
|
+
developerGuide?: string;
|
|
35
|
+
api?: string;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface RegisteredModule extends ModuleManifest {
|
|
39
|
+
registeredAt: Date;
|
|
40
|
+
lastHeartbeat: Date;
|
|
41
|
+
status: 'running' | 'stopped' | 'error' | 'starting' | 'stopping';
|
|
42
|
+
health?: {
|
|
43
|
+
healthy: boolean;
|
|
44
|
+
checks: Record<string, any>;
|
|
45
|
+
timestamp: Date;
|
|
46
|
+
};
|
|
47
|
+
metrics?: {
|
|
48
|
+
uptime: number;
|
|
49
|
+
memory: any;
|
|
50
|
+
cpu?: any;
|
|
51
|
+
pid: number;
|
|
52
|
+
};
|
|
53
|
+
source: {
|
|
54
|
+
type: 'local' | 'remote' | 'marketplace' | 'container';
|
|
55
|
+
url?: string;
|
|
56
|
+
registeredAt: string;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export interface ModuleInstallation {
|
|
60
|
+
id: string;
|
|
61
|
+
moduleId: string;
|
|
62
|
+
version: string;
|
|
63
|
+
source: ModuleSource;
|
|
64
|
+
installedAt: Date;
|
|
65
|
+
status: 'pending' | 'downloading' | 'installing' | 'installed' | 'failed';
|
|
66
|
+
error?: string;
|
|
67
|
+
progress?: number;
|
|
68
|
+
logs?: string[];
|
|
69
|
+
}
|
|
70
|
+
export interface ModuleSource {
|
|
71
|
+
type: 'remote' | 'marketplace' | 'container';
|
|
72
|
+
url: string;
|
|
73
|
+
credentials?: {
|
|
74
|
+
username?: string;
|
|
75
|
+
password?: string;
|
|
76
|
+
token?: string;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export interface ModuleStats {
|
|
80
|
+
totalModules: number;
|
|
81
|
+
activeModules: number;
|
|
82
|
+
stoppedModules: number;
|
|
83
|
+
errorModules: number;
|
|
84
|
+
totalInstallations: number;
|
|
85
|
+
categoryCounts: Record<string, number>;
|
|
86
|
+
recentActivity: Array<{
|
|
87
|
+
type: 'register' | 'unregister' | 'install' | 'activate' | 'deactivate';
|
|
88
|
+
moduleId: string;
|
|
89
|
+
timestamp: Date;
|
|
90
|
+
}>;
|
|
91
|
+
}
|
|
92
|
+
export declare class ModuleRegistryService extends EventEmitter {
|
|
93
|
+
private activeModules;
|
|
94
|
+
private availableModules;
|
|
95
|
+
private installHistory;
|
|
96
|
+
private healthChecks;
|
|
97
|
+
private moduleProcesses;
|
|
98
|
+
private recentActivity;
|
|
99
|
+
constructor();
|
|
100
|
+
registerModule(moduleData: Partial<RegisteredModule>): Promise<{
|
|
101
|
+
success: boolean;
|
|
102
|
+
message: string;
|
|
103
|
+
}>;
|
|
104
|
+
unregisterModule(moduleId: string): Promise<{
|
|
105
|
+
success: boolean;
|
|
106
|
+
message: string;
|
|
107
|
+
}>;
|
|
108
|
+
activateModule(moduleId: string): Promise<{
|
|
109
|
+
success: boolean;
|
|
110
|
+
message: string;
|
|
111
|
+
}>;
|
|
112
|
+
deactivateModule(moduleId: string): Promise<{
|
|
113
|
+
success: boolean;
|
|
114
|
+
message: string;
|
|
115
|
+
}>;
|
|
116
|
+
installModule(moduleId: string, source: ModuleSource, version?: string): Promise<ModuleInstallation>;
|
|
117
|
+
listModules(): Promise<RegisteredModule[]>;
|
|
118
|
+
getModule(moduleId: string): Promise<RegisteredModule | null>;
|
|
119
|
+
searchModules(query?: string, category?: string, tags?: string[], status?: 'active' | 'inactive' | 'all', limit?: number, offset?: number): Promise<RegisteredModule[]>;
|
|
120
|
+
getStats(): Promise<ModuleStats>;
|
|
121
|
+
updateHeartbeat(moduleId: string, heartbeatData: {
|
|
122
|
+
timestamp: string;
|
|
123
|
+
status: 'healthy' | 'unhealthy' | 'warning';
|
|
124
|
+
metrics?: any;
|
|
125
|
+
}): Promise<{
|
|
126
|
+
success: boolean;
|
|
127
|
+
message: string;
|
|
128
|
+
}>;
|
|
129
|
+
checkModuleHealth(moduleId: string): Promise<any>;
|
|
130
|
+
private validateModule;
|
|
131
|
+
private checkPortConflicts;
|
|
132
|
+
private startHealthMonitoring;
|
|
133
|
+
private stopHealthMonitoring;
|
|
134
|
+
private startModuleProcesses;
|
|
135
|
+
private stopModuleProcesses;
|
|
136
|
+
private installFromRemote;
|
|
137
|
+
private installFromMarketplace;
|
|
138
|
+
private installFromContainer;
|
|
139
|
+
private generateInstallationId;
|
|
140
|
+
private logActivity;
|
|
141
|
+
private startCleanupInterval;
|
|
142
|
+
getInstallationHistory(): Promise<ModuleInstallation[]>;
|
|
143
|
+
getInstallation(installationId: string): Promise<ModuleInstallation | null>;
|
|
144
|
+
getModuleLogs(moduleId: string, options?: {
|
|
145
|
+
limit?: number;
|
|
146
|
+
since?: Date;
|
|
147
|
+
level?: 'error' | 'warn' | 'info' | 'debug';
|
|
148
|
+
}): Promise<any[]>;
|
|
149
|
+
bulkOperation(operation: 'activate' | 'deactivate' | 'restart' | 'uninstall', moduleIds: string[]): Promise<any[]>;
|
|
150
|
+
subscribeToEvents(callback: (event: any) => void): () => void;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=ModuleRegistryService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleRegistryService.d.ts","sourceRoot":"","sources":["../../src/services/ModuleRegistryService.ts"],"names":[],"mappings":"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"}
|