@samanhappy/mcphub 0.9.5 → 0.9.6
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/dist/config/DaoConfigService.js +210 -0
- package/dist/config/DaoConfigService.js.map +1 -0
- package/dist/config/configManager.js +123 -0
- package/dist/config/configManager.js.map +1 -0
- package/dist/config/migrationUtils.js +206 -0
- package/dist/config/migrationUtils.js.map +1 -0
- package/dist/controllers/logController.js +1 -1
- package/dist/controllers/logController.js.map +1 -1
- package/dist/controllers/marketController.js +1 -1
- package/dist/controllers/marketController.js.map +1 -1
- package/dist/controllers/openApiController.js +158 -7
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/promptController.js +1 -1
- package/dist/controllers/serverController.js +8 -9
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/dao/DaoFactory.js +102 -0
- package/dist/dao/DaoFactory.js.map +1 -0
- package/dist/dao/GroupDao.js +156 -0
- package/dist/dao/GroupDao.js.map +1 -0
- package/dist/dao/ServerDao.js +117 -0
- package/dist/dao/ServerDao.js.map +1 -0
- package/dist/dao/SystemConfigDao.js +55 -0
- package/dist/dao/SystemConfigDao.js.map +1 -0
- package/dist/dao/UserConfigDao.js +72 -0
- package/dist/dao/UserConfigDao.js.map +1 -0
- package/dist/dao/UserDao.js +107 -0
- package/dist/dao/UserDao.js.map +1 -0
- package/dist/dao/base/BaseDao.js +49 -0
- package/dist/dao/base/BaseDao.js.map +1 -0
- package/dist/dao/base/JsonFileBaseDao.js +84 -0
- package/dist/dao/base/JsonFileBaseDao.js.map +1 -0
- package/dist/dao/examples.js +172 -0
- package/dist/dao/examples.js.map +1 -0
- package/dist/dao/index.js +11 -0
- package/dist/dao/index.js.map +1 -0
- package/dist/routes/index.js +2 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/scripts/dao-demo.js +226 -0
- package/dist/scripts/dao-demo.js.map +1 -0
- package/dist/services/mcpService.js +49 -71
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/openApiGeneratorService.js +44 -8
- package/dist/services/openApiGeneratorService.js.map +1 -1
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/vectorSearchService.js +1 -1
- package/dist/services/vectorSearchService.js.map +1 -1
- package/frontend/dist/assets/{index-dsw9o-29.js → index-BvXslwpV.js} +3 -3
- package/frontend/dist/assets/{index-dsw9o-29.js.map → index-BvXslwpV.js.map} +1 -1
- package/frontend/dist/index.html +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { getSettingsPath } from '../../config/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for JSON file-based DAO implementations
|
|
6
|
+
*/
|
|
7
|
+
export class JsonFileBaseDao {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.settingsCache = null;
|
|
10
|
+
this.lastModified = 0;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Load settings from JSON file with caching
|
|
14
|
+
*/
|
|
15
|
+
async loadSettings() {
|
|
16
|
+
try {
|
|
17
|
+
const settingsPath = getSettingsPath();
|
|
18
|
+
const stats = fs.statSync(settingsPath);
|
|
19
|
+
const fileModified = stats.mtime.getTime();
|
|
20
|
+
// Check if cache is still valid
|
|
21
|
+
if (this.settingsCache && this.lastModified >= fileModified) {
|
|
22
|
+
return this.settingsCache;
|
|
23
|
+
}
|
|
24
|
+
const settingsData = fs.readFileSync(settingsPath, 'utf8');
|
|
25
|
+
const settings = JSON.parse(settingsData);
|
|
26
|
+
// Update cache
|
|
27
|
+
this.settingsCache = settings;
|
|
28
|
+
this.lastModified = fileModified;
|
|
29
|
+
return settings;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(`Failed to load settings:`, error);
|
|
33
|
+
const defaultSettings = {
|
|
34
|
+
mcpServers: {},
|
|
35
|
+
users: [],
|
|
36
|
+
groups: [],
|
|
37
|
+
systemConfig: {},
|
|
38
|
+
userConfigs: {},
|
|
39
|
+
};
|
|
40
|
+
// Cache default settings
|
|
41
|
+
this.settingsCache = defaultSettings;
|
|
42
|
+
this.lastModified = Date.now();
|
|
43
|
+
return defaultSettings;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Save settings to JSON file and update cache
|
|
48
|
+
*/
|
|
49
|
+
async saveSettings(settings) {
|
|
50
|
+
try {
|
|
51
|
+
// Ensure directory exists
|
|
52
|
+
const settingsPath = getSettingsPath();
|
|
53
|
+
const dir = path.dirname(settingsPath);
|
|
54
|
+
if (!fs.existsSync(dir)) {
|
|
55
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
56
|
+
}
|
|
57
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
58
|
+
// Update cache
|
|
59
|
+
this.settingsCache = settings;
|
|
60
|
+
this.lastModified = Date.now();
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(`Failed to save settings:`, error);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Clear settings cache
|
|
69
|
+
*/
|
|
70
|
+
clearCache() {
|
|
71
|
+
this.settingsCache = null;
|
|
72
|
+
this.lastModified = 0;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get cache status for debugging
|
|
76
|
+
*/
|
|
77
|
+
getCacheInfo() {
|
|
78
|
+
return {
|
|
79
|
+
hasCache: this.settingsCache !== null,
|
|
80
|
+
lastModified: this.lastModified,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=JsonFileBaseDao.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonFileBaseDao.js","sourceRoot":"","sources":["../../../src/dao/base/JsonFileBaseDao.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;GAEG;AACH,MAAM,OAAgB,eAAe;IAArC;QACU,kBAAa,GAAuB,IAAI,CAAC;QACzC,iBAAY,GAAW,CAAC,CAAC;IAkFnC,CAAC;IAhFC;;OAEG;IACO,KAAK,CAAC,YAAY;QAC1B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAE3C,gCAAgC;YAChC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;gBAC5D,OAAO,IAAI,CAAC,aAAa,CAAC;YAC5B,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAgB,CAAC;YAEzD,eAAe;YACf,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YAEjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,eAAe,GAAgB;gBACnC,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,EAAE;gBAChB,WAAW,EAAE,EAAE;aAChB,CAAC;YAEF,yBAAyB;YACzB,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,YAAY,CAAC,QAAqB;QAChD,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YAED,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAE1E,eAAe;YACf,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACO,UAAU;QAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACO,YAAY;QACpB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data access layer example and test utilities
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to use the DAO layer for managing different types of data
|
|
5
|
+
* in the MCPHub application.
|
|
6
|
+
*/
|
|
7
|
+
import { getUserDao, getServerDao, getGroupDao, getSystemConfigDao, getUserConfigDao, JsonFileDaoFactory, setDaoFactory, } from './DaoFactory.js';
|
|
8
|
+
/**
|
|
9
|
+
* Example usage of UserDao
|
|
10
|
+
*/
|
|
11
|
+
export async function exampleUserOperations() {
|
|
12
|
+
const userDao = getUserDao();
|
|
13
|
+
// Create a new user
|
|
14
|
+
const newUser = await userDao.createWithHashedPassword('testuser', 'password123', false);
|
|
15
|
+
console.log('Created user:', newUser.username);
|
|
16
|
+
// Find user by username
|
|
17
|
+
const foundUser = await userDao.findByUsername('testuser');
|
|
18
|
+
console.log('Found user:', foundUser?.username);
|
|
19
|
+
// Validate credentials
|
|
20
|
+
const isValid = await userDao.validateCredentials('testuser', 'password123');
|
|
21
|
+
console.log('Credentials valid:', isValid);
|
|
22
|
+
// Update user
|
|
23
|
+
await userDao.update('testuser', { isAdmin: true });
|
|
24
|
+
console.log('Updated user to admin');
|
|
25
|
+
// Find all admin users
|
|
26
|
+
const admins = await userDao.findAdmins();
|
|
27
|
+
console.log('Admin users:', admins.map((u) => u.username));
|
|
28
|
+
// Delete user
|
|
29
|
+
await userDao.delete('testuser');
|
|
30
|
+
console.log('Deleted test user');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Example usage of ServerDao
|
|
34
|
+
*/
|
|
35
|
+
export async function exampleServerOperations() {
|
|
36
|
+
const serverDao = getServerDao();
|
|
37
|
+
// Create a new server
|
|
38
|
+
const newServer = await serverDao.create({
|
|
39
|
+
name: 'test-server',
|
|
40
|
+
command: 'node',
|
|
41
|
+
args: ['server.js'],
|
|
42
|
+
enabled: true,
|
|
43
|
+
owner: 'admin',
|
|
44
|
+
});
|
|
45
|
+
console.log('Created server:', newServer.name);
|
|
46
|
+
// Find servers by owner
|
|
47
|
+
const userServers = await serverDao.findByOwner('admin');
|
|
48
|
+
console.log('Servers owned by admin:', userServers.map((s) => s.name));
|
|
49
|
+
// Find enabled servers
|
|
50
|
+
const enabledServers = await serverDao.findEnabled();
|
|
51
|
+
console.log('Enabled servers:', enabledServers.map((s) => s.name));
|
|
52
|
+
// Update server tools
|
|
53
|
+
await serverDao.updateTools('test-server', {
|
|
54
|
+
tool1: { enabled: true, description: 'Test tool' },
|
|
55
|
+
});
|
|
56
|
+
console.log('Updated server tools');
|
|
57
|
+
// Delete server
|
|
58
|
+
await serverDao.delete('test-server');
|
|
59
|
+
console.log('Deleted test server');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Example usage of GroupDao
|
|
63
|
+
*/
|
|
64
|
+
export async function exampleGroupOperations() {
|
|
65
|
+
const groupDao = getGroupDao();
|
|
66
|
+
// Create a new group
|
|
67
|
+
const newGroup = await groupDao.create({
|
|
68
|
+
name: 'test-group',
|
|
69
|
+
description: 'Test group for development',
|
|
70
|
+
servers: ['server1', 'server2'],
|
|
71
|
+
owner: 'admin',
|
|
72
|
+
});
|
|
73
|
+
console.log('Created group:', newGroup.name, 'with ID:', newGroup.id);
|
|
74
|
+
// Find groups by owner
|
|
75
|
+
const userGroups = await groupDao.findByOwner('admin');
|
|
76
|
+
console.log('Groups owned by admin:', userGroups.map((g) => g.name));
|
|
77
|
+
// Add server to group
|
|
78
|
+
await groupDao.addServerToGroup(newGroup.id, 'server3');
|
|
79
|
+
console.log('Added server3 to group');
|
|
80
|
+
// Find groups containing specific server
|
|
81
|
+
const groupsWithServer = await groupDao.findByServer('server1');
|
|
82
|
+
console.log('Groups containing server1:', groupsWithServer.map((g) => g.name));
|
|
83
|
+
// Remove server from group
|
|
84
|
+
await groupDao.removeServerFromGroup(newGroup.id, 'server2');
|
|
85
|
+
console.log('Removed server2 from group');
|
|
86
|
+
// Delete group
|
|
87
|
+
await groupDao.delete(newGroup.id);
|
|
88
|
+
console.log('Deleted test group');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Example usage of SystemConfigDao
|
|
92
|
+
*/
|
|
93
|
+
export async function exampleSystemConfigOperations() {
|
|
94
|
+
const systemConfigDao = getSystemConfigDao();
|
|
95
|
+
// Get current system config
|
|
96
|
+
const currentConfig = await systemConfigDao.get();
|
|
97
|
+
console.log('Current system config:', currentConfig);
|
|
98
|
+
// Update routing configuration
|
|
99
|
+
await systemConfigDao.updateSection('routing', {
|
|
100
|
+
enableGlobalRoute: true,
|
|
101
|
+
enableGroupNameRoute: true,
|
|
102
|
+
enableBearerAuth: false,
|
|
103
|
+
});
|
|
104
|
+
console.log('Updated routing configuration');
|
|
105
|
+
// Update install configuration
|
|
106
|
+
await systemConfigDao.updateSection('install', {
|
|
107
|
+
pythonIndexUrl: 'https://pypi.org/simple/',
|
|
108
|
+
npmRegistry: 'https://registry.npmjs.org/',
|
|
109
|
+
baseUrl: 'https://mcphub.local',
|
|
110
|
+
});
|
|
111
|
+
console.log('Updated install configuration');
|
|
112
|
+
// Get specific section
|
|
113
|
+
const routingConfig = await systemConfigDao.getSection('routing');
|
|
114
|
+
console.log('Routing config:', routingConfig);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Example usage of UserConfigDao
|
|
118
|
+
*/
|
|
119
|
+
export async function exampleUserConfigOperations() {
|
|
120
|
+
const userConfigDao = getUserConfigDao();
|
|
121
|
+
// Update user configuration
|
|
122
|
+
await userConfigDao.update('admin', {
|
|
123
|
+
routing: {
|
|
124
|
+
enableGlobalRoute: false,
|
|
125
|
+
enableGroupNameRoute: true,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
console.log('Updated admin user config');
|
|
129
|
+
// Get user configuration
|
|
130
|
+
const adminConfig = await userConfigDao.get('admin');
|
|
131
|
+
console.log('Admin config:', adminConfig);
|
|
132
|
+
// Get all user configurations
|
|
133
|
+
const allUserConfigs = await userConfigDao.getAll();
|
|
134
|
+
console.log('All user configs:', Object.keys(allUserConfigs));
|
|
135
|
+
// Get specific section for user
|
|
136
|
+
const userRoutingConfig = await userConfigDao.getSection('admin', 'routing');
|
|
137
|
+
console.log('Admin routing config:', userRoutingConfig);
|
|
138
|
+
// Delete user configuration
|
|
139
|
+
await userConfigDao.delete('admin');
|
|
140
|
+
console.log('Deleted admin user config');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Test all DAO operations
|
|
144
|
+
*/
|
|
145
|
+
export async function testAllDaoOperations() {
|
|
146
|
+
try {
|
|
147
|
+
console.log('=== Testing DAO Layer ===');
|
|
148
|
+
console.log('\n--- User Operations ---');
|
|
149
|
+
await exampleUserOperations();
|
|
150
|
+
console.log('\n--- Server Operations ---');
|
|
151
|
+
await exampleServerOperations();
|
|
152
|
+
console.log('\n--- Group Operations ---');
|
|
153
|
+
await exampleGroupOperations();
|
|
154
|
+
console.log('\n--- System Config Operations ---');
|
|
155
|
+
await exampleSystemConfigOperations();
|
|
156
|
+
console.log('\n--- User Config Operations ---');
|
|
157
|
+
await exampleUserConfigOperations();
|
|
158
|
+
console.log('\n=== DAO Layer Test Complete ===');
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.error('Error during DAO testing:', error);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reset DAO factory for testing purposes
|
|
166
|
+
*/
|
|
167
|
+
export function resetDaoFactory() {
|
|
168
|
+
const factory = JsonFileDaoFactory.getInstance();
|
|
169
|
+
factory.resetInstances();
|
|
170
|
+
setDaoFactory(factory);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/dao/examples.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Export all DAO interfaces and implementations
|
|
2
|
+
export * from './base/BaseDao.js';
|
|
3
|
+
export * from './base/JsonFileBaseDao.js';
|
|
4
|
+
export * from './UserDao.js';
|
|
5
|
+
export * from './ServerDao.js';
|
|
6
|
+
export * from './GroupDao.js';
|
|
7
|
+
export * from './SystemConfigDao.js';
|
|
8
|
+
export * from './UserConfigDao.js';
|
|
9
|
+
// Export the DAO factory and convenience functions
|
|
10
|
+
export * from './DaoFactory.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dao/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AAEnC,mDAAmD;AACnD,cAAc,iBAAiB,CAAC"}
|
package/dist/routes/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { callTool } from '../controllers/toolController.js';
|
|
|
13
13
|
import { getPrompt } from '../controllers/promptController.js';
|
|
14
14
|
import { uploadDxtFile, uploadMiddleware } from '../controllers/dxtController.js';
|
|
15
15
|
import { healthCheck } from '../controllers/healthController.js';
|
|
16
|
-
import { getOpenAPISpec, getOpenAPIServers, getOpenAPIStats, executeToolViaOpenAPI, } from '../controllers/openApiController.js';
|
|
16
|
+
import { getOpenAPISpec, getOpenAPIServers, getOpenAPIStats, executeToolViaOpenAPI, getGroupOpenAPISpec, } from '../controllers/openApiController.js';
|
|
17
17
|
import { auth } from '../middlewares/auth.js';
|
|
18
18
|
const router = express.Router();
|
|
19
19
|
export const initRoutes = (app) => {
|
|
@@ -103,6 +103,7 @@ export const initRoutes = (app) => {
|
|
|
103
103
|
app.get(`${config.basePath}/public-config`, getPublicConfig);
|
|
104
104
|
// OpenAPI generation endpoints
|
|
105
105
|
app.get(`${config.basePath}/api/openapi.json`, getOpenAPISpec);
|
|
106
|
+
app.get(`${config.basePath}/api/:name/openapi.json`, getGroupOpenAPISpec);
|
|
106
107
|
app.get(`${config.basePath}/api/openapi/servers`, getOpenAPIServers);
|
|
107
108
|
app.get(`${config.basePath}/api/openapi/stats`, getOpenAPIStats);
|
|
108
109
|
// OpenAPI-compatible tool execution endpoints
|
package/dist/routes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,aAAa,EACb,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,SAAS,EACT,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,6BAA6B,EAC7B,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,GACd,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCPHub DAO Layer Demo Script
|
|
4
|
+
*
|
|
5
|
+
* This script demonstrates how to use the new DAO layer for managing
|
|
6
|
+
* MCPHub configuration data.
|
|
7
|
+
*/
|
|
8
|
+
import { loadSettings, switchToDao, switchToLegacy, getDaoConfigService, } from '../config/configManager.js';
|
|
9
|
+
import { performMigration, validateMigration, testDaoOperations, performanceComparison, generateMigrationReport, } from '../config/migrationUtils.js';
|
|
10
|
+
async function main() {
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0];
|
|
13
|
+
switch (command) {
|
|
14
|
+
case 'migrate':
|
|
15
|
+
{
|
|
16
|
+
console.log('🚀 Starting migration to DAO layer...');
|
|
17
|
+
const success = await performMigration();
|
|
18
|
+
process.exit(success ? 0 : 1);
|
|
19
|
+
}
|
|
20
|
+
break;
|
|
21
|
+
case 'validate':
|
|
22
|
+
{
|
|
23
|
+
console.log('🔍 Validating migration...');
|
|
24
|
+
const isValid = await validateMigration();
|
|
25
|
+
process.exit(isValid ? 0 : 1);
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
case 'test':
|
|
29
|
+
{
|
|
30
|
+
console.log('🧪 Testing DAO operations...');
|
|
31
|
+
const testSuccess = await testDaoOperations();
|
|
32
|
+
process.exit(testSuccess ? 0 : 1);
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case 'compare':
|
|
36
|
+
{
|
|
37
|
+
console.log('⚡ Comparing performance...');
|
|
38
|
+
await performanceComparison();
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
case 'report':
|
|
43
|
+
{
|
|
44
|
+
console.log('📊 Generating migration report...');
|
|
45
|
+
await generateMigrationReport();
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case 'demo':
|
|
50
|
+
{
|
|
51
|
+
await runDemo();
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
case 'switch-dao':
|
|
56
|
+
{
|
|
57
|
+
switchToDao();
|
|
58
|
+
console.log('✅ Switched to DAO layer');
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
case 'switch-legacy':
|
|
63
|
+
{
|
|
64
|
+
switchToLegacy();
|
|
65
|
+
console.log('✅ Switched to legacy file-based approach');
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
default: {
|
|
70
|
+
printHelp();
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function printHelp() {
|
|
76
|
+
console.log(`
|
|
77
|
+
MCPHub DAO Layer Demo
|
|
78
|
+
|
|
79
|
+
Usage: node dao-demo.js <command>
|
|
80
|
+
|
|
81
|
+
Commands:
|
|
82
|
+
migrate - Migrate from legacy format to DAO layer
|
|
83
|
+
validate - Validate migration integrity
|
|
84
|
+
test - Test DAO operations with sample data
|
|
85
|
+
compare - Compare performance between legacy and DAO approaches
|
|
86
|
+
report - Generate migration report
|
|
87
|
+
demo - Run interactive demo
|
|
88
|
+
switch-dao - Switch to DAO layer
|
|
89
|
+
switch-legacy - Switch to legacy file-based approach
|
|
90
|
+
|
|
91
|
+
Examples:
|
|
92
|
+
node dao-demo.js migrate
|
|
93
|
+
node dao-demo.js test
|
|
94
|
+
node dao-demo.js compare
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
async function runDemo() {
|
|
98
|
+
console.log('🎭 MCPHub DAO Layer Interactive Demo');
|
|
99
|
+
console.log('=====================================\n');
|
|
100
|
+
try {
|
|
101
|
+
// Step 1: Show current configuration
|
|
102
|
+
console.log('📋 Step 1: Loading current configuration...');
|
|
103
|
+
switchToLegacy();
|
|
104
|
+
const legacySettings = await loadSettings();
|
|
105
|
+
console.log(`Current data:
|
|
106
|
+
- Users: ${legacySettings.users?.length || 0}
|
|
107
|
+
- Servers: ${Object.keys(legacySettings.mcpServers || {}).length}
|
|
108
|
+
- Groups: ${legacySettings.groups?.length || 0}
|
|
109
|
+
- System Config Sections: ${Object.keys(legacySettings.systemConfig || {}).length}
|
|
110
|
+
- User Configs: ${Object.keys(legacySettings.userConfigs || {}).length}
|
|
111
|
+
`);
|
|
112
|
+
// Step 2: Switch to DAO and show same data
|
|
113
|
+
console.log('🔄 Step 2: Switching to DAO layer...');
|
|
114
|
+
switchToDao();
|
|
115
|
+
const daoService = getDaoConfigService();
|
|
116
|
+
const daoSettings = await daoService.loadSettings();
|
|
117
|
+
console.log(`DAO layer data:
|
|
118
|
+
- Users: ${daoSettings.users?.length || 0}
|
|
119
|
+
- Servers: ${Object.keys(daoSettings.mcpServers || {}).length}
|
|
120
|
+
- Groups: ${daoSettings.groups?.length || 0}
|
|
121
|
+
- System Config Sections: ${Object.keys(daoSettings.systemConfig || {}).length}
|
|
122
|
+
- User Configs: ${Object.keys(daoSettings.userConfigs || {}).length}
|
|
123
|
+
`);
|
|
124
|
+
// Step 3: Demonstrate CRUD operations
|
|
125
|
+
console.log('🛠️ Step 3: Demonstrating CRUD operations...');
|
|
126
|
+
// Test user creation (if not exists)
|
|
127
|
+
try {
|
|
128
|
+
// Add demo data if needed
|
|
129
|
+
if (!daoSettings.users?.length) {
|
|
130
|
+
console.log('Creating demo user...');
|
|
131
|
+
// Note: In practice, you'd use the UserDao directly for password hashing
|
|
132
|
+
const demoSettings = {
|
|
133
|
+
...daoSettings,
|
|
134
|
+
users: [
|
|
135
|
+
{
|
|
136
|
+
username: 'demo-user',
|
|
137
|
+
password: 'hashed-password',
|
|
138
|
+
isAdmin: false,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
await daoService.saveSettings(demoSettings);
|
|
143
|
+
console.log('✅ Demo user created');
|
|
144
|
+
}
|
|
145
|
+
// Add demo server if needed
|
|
146
|
+
if (!Object.keys(daoSettings.mcpServers || {}).length) {
|
|
147
|
+
console.log('Creating demo server...');
|
|
148
|
+
const demoSettings = {
|
|
149
|
+
...daoSettings,
|
|
150
|
+
mcpServers: {
|
|
151
|
+
'demo-server': {
|
|
152
|
+
command: 'echo',
|
|
153
|
+
args: ['hello'],
|
|
154
|
+
enabled: true,
|
|
155
|
+
owner: 'admin',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
await daoService.saveSettings(demoSettings);
|
|
160
|
+
console.log('✅ Demo server created');
|
|
161
|
+
}
|
|
162
|
+
// Add demo group if needed
|
|
163
|
+
if (!daoSettings.groups?.length) {
|
|
164
|
+
console.log('Creating demo group...');
|
|
165
|
+
const demoSettings = {
|
|
166
|
+
...daoSettings,
|
|
167
|
+
groups: [
|
|
168
|
+
{
|
|
169
|
+
id: 'demo-group-1',
|
|
170
|
+
name: 'Demo Group',
|
|
171
|
+
description: 'A demo group for testing',
|
|
172
|
+
servers: ['demo-server'],
|
|
173
|
+
owner: 'admin',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
};
|
|
177
|
+
await daoService.saveSettings(demoSettings);
|
|
178
|
+
console.log('✅ Demo group created');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.log('⚠️ Some demo operations failed (this is expected for password hashing)');
|
|
183
|
+
console.log('In production, you would use individual DAO methods for proper handling');
|
|
184
|
+
}
|
|
185
|
+
// Step 4: Show benefits
|
|
186
|
+
console.log(`
|
|
187
|
+
🌟 Benefits of the DAO Layer:
|
|
188
|
+
|
|
189
|
+
1. 📦 Separation of Concerns
|
|
190
|
+
- Data access logic is separated from business logic
|
|
191
|
+
- Each data type has its own DAO with specific operations
|
|
192
|
+
|
|
193
|
+
2. 🔄 Easy Database Migration
|
|
194
|
+
- Ready for switching from JSON files to database
|
|
195
|
+
- Interface remains the same, implementation changes
|
|
196
|
+
|
|
197
|
+
3. 🧪 Better Testing
|
|
198
|
+
- Can easily mock DAO interfaces for unit tests
|
|
199
|
+
- Isolated testing of data access operations
|
|
200
|
+
|
|
201
|
+
4. 🔒 Type Safety
|
|
202
|
+
- Strong typing for all data operations
|
|
203
|
+
- Compile-time checking of data structure changes
|
|
204
|
+
|
|
205
|
+
5. 🚀 Enhanced Features
|
|
206
|
+
- User password hashing in UserDao
|
|
207
|
+
- Server filtering by owner/type in ServerDao
|
|
208
|
+
- Group membership management in GroupDao
|
|
209
|
+
- Section-based config updates in SystemConfigDao
|
|
210
|
+
|
|
211
|
+
6. 🏗️ Future Extensibility
|
|
212
|
+
- Easy to add new data types
|
|
213
|
+
- Consistent interface across all data operations
|
|
214
|
+
- Support for complex queries and relationships
|
|
215
|
+
`);
|
|
216
|
+
console.log('✅ Demo completed successfully!');
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error('❌ Demo failed:', error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Run the main function
|
|
223
|
+
if (require.main === module) {
|
|
224
|
+
main().catch(console.error);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=dao-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dao-demo.js","sourceRoot":"","sources":["../../src/scripts/dao-demo.ts"],"names":[],"mappings":"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"}
|