@samanhappy/mcphub 0.10.6 → 0.11.1

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 (126) hide show
  1. package/README.fr.md +36 -152
  2. package/README.md +34 -255
  3. package/README.zh.md +33 -212
  4. package/dist/config/DaoConfigService.js +3 -3
  5. package/dist/config/DaoConfigService.js.map +1 -1
  6. package/dist/controllers/authController.js +2 -2
  7. package/dist/controllers/authController.js.map +1 -1
  8. package/dist/controllers/configController.js +32 -5
  9. package/dist/controllers/configController.js.map +1 -1
  10. package/dist/controllers/groupController.js +24 -24
  11. package/dist/controllers/groupController.js.map +1 -1
  12. package/dist/controllers/oauthClientController.js +13 -13
  13. package/dist/controllers/oauthClientController.js.map +1 -1
  14. package/dist/controllers/oauthDynamicRegistrationController.js +9 -9
  15. package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
  16. package/dist/controllers/oauthServerController.js +1 -1
  17. package/dist/controllers/oauthServerController.js.map +1 -1
  18. package/dist/controllers/openApiController.js +1 -1
  19. package/dist/controllers/openApiController.js.map +1 -1
  20. package/dist/controllers/serverController.js +134 -96
  21. package/dist/controllers/serverController.js.map +1 -1
  22. package/dist/controllers/userController.js +22 -21
  23. package/dist/controllers/userController.js.map +1 -1
  24. package/dist/dao/DaoFactory.js +43 -0
  25. package/dist/dao/DaoFactory.js.map +1 -1
  26. package/dist/dao/DatabaseDaoFactory.js +86 -0
  27. package/dist/dao/DatabaseDaoFactory.js.map +1 -0
  28. package/dist/dao/GroupDaoDbImpl.js +131 -0
  29. package/dist/dao/GroupDaoDbImpl.js.map +1 -0
  30. package/dist/dao/OAuthClientDao.js +100 -0
  31. package/dist/dao/OAuthClientDao.js.map +1 -0
  32. package/dist/dao/OAuthClientDaoDbImpl.js +83 -0
  33. package/dist/dao/OAuthClientDaoDbImpl.js.map +1 -0
  34. package/dist/dao/OAuthTokenDao.js +161 -0
  35. package/dist/dao/OAuthTokenDao.js.map +1 -0
  36. package/dist/dao/OAuthTokenDaoDbImpl.js +92 -0
  37. package/dist/dao/OAuthTokenDaoDbImpl.js.map +1 -0
  38. package/dist/dao/ServerDaoDbImpl.js +109 -0
  39. package/dist/dao/ServerDaoDbImpl.js.map +1 -0
  40. package/dist/dao/SystemConfigDaoDbImpl.js +56 -0
  41. package/dist/dao/SystemConfigDaoDbImpl.js.map +1 -0
  42. package/dist/dao/UserConfigDaoDbImpl.js +61 -0
  43. package/dist/dao/UserConfigDaoDbImpl.js.map +1 -0
  44. package/dist/dao/UserDaoDbImpl.js +90 -0
  45. package/dist/dao/UserDaoDbImpl.js.map +1 -0
  46. package/dist/dao/index.js +11 -0
  47. package/dist/dao/index.js.map +1 -1
  48. package/dist/db/entities/Group.js +49 -0
  49. package/dist/db/entities/Group.js.map +1 -0
  50. package/dist/db/entities/OAuthClient.js +66 -0
  51. package/dist/db/entities/OAuthClient.js.map +1 -0
  52. package/dist/db/entities/OAuthToken.js +66 -0
  53. package/dist/db/entities/OAuthToken.js.map +1 -0
  54. package/dist/db/entities/Server.js +93 -0
  55. package/dist/db/entities/Server.js.map +1 -0
  56. package/dist/db/entities/SystemConfig.js +66 -0
  57. package/dist/db/entities/SystemConfig.js.map +1 -0
  58. package/dist/db/entities/User.js +45 -0
  59. package/dist/db/entities/User.js.map +1 -0
  60. package/dist/db/entities/UserConfig.js +45 -0
  61. package/dist/db/entities/UserConfig.js.map +1 -0
  62. package/dist/db/entities/index.js +18 -2
  63. package/dist/db/entities/index.js.map +1 -1
  64. package/dist/db/repositories/GroupRepository.js +81 -0
  65. package/dist/db/repositories/GroupRepository.js.map +1 -0
  66. package/dist/db/repositories/OAuthClientRepository.js +68 -0
  67. package/dist/db/repositories/OAuthClientRepository.js.map +1 -0
  68. package/dist/db/repositories/OAuthTokenRepository.js +159 -0
  69. package/dist/db/repositories/OAuthTokenRepository.js.map +1 -0
  70. package/dist/db/repositories/ServerRepository.js +80 -0
  71. package/dist/db/repositories/ServerRepository.js.map +1 -0
  72. package/dist/db/repositories/SystemConfigRepository.js +64 -0
  73. package/dist/db/repositories/SystemConfigRepository.js.map +1 -0
  74. package/dist/db/repositories/UserConfigRepository.js +69 -0
  75. package/dist/db/repositories/UserConfigRepository.js.map +1 -0
  76. package/dist/db/repositories/UserRepository.js +68 -0
  77. package/dist/db/repositories/UserRepository.js.map +1 -0
  78. package/dist/db/repositories/index.js +8 -1
  79. package/dist/db/repositories/index.js.map +1 -1
  80. package/dist/index.js +12 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/middlewares/auth.js +2 -2
  83. package/dist/middlewares/auth.js.map +1 -1
  84. package/dist/middlewares/userContext.js +1 -1
  85. package/dist/middlewares/userContext.js.map +1 -1
  86. package/dist/models/OAuth.js +90 -122
  87. package/dist/models/OAuth.js.map +1 -1
  88. package/dist/models/User.js +29 -48
  89. package/dist/models/User.js.map +1 -1
  90. package/dist/routes/index.js +2 -1
  91. package/dist/routes/index.js.map +1 -1
  92. package/dist/scripts/migrate-to-database.js +5 -0
  93. package/dist/scripts/migrate-to-database.js.map +1 -0
  94. package/dist/server.js +2 -2
  95. package/dist/server.js.map +1 -1
  96. package/dist/services/groupService.js +87 -113
  97. package/dist/services/groupService.js.map +1 -1
  98. package/dist/services/keepAliveService.js +58 -0
  99. package/dist/services/keepAliveService.js.map +1 -0
  100. package/dist/services/mcpOAuthProvider.js +22 -28
  101. package/dist/services/mcpOAuthProvider.js.map +1 -1
  102. package/dist/services/mcpService.js +73 -92
  103. package/dist/services/mcpService.js.map +1 -1
  104. package/dist/services/oauthServerService.js +26 -20
  105. package/dist/services/oauthServerService.js.map +1 -1
  106. package/dist/services/oauthService.js +11 -10
  107. package/dist/services/oauthService.js.map +1 -1
  108. package/dist/services/oauthSettingsStore.js +17 -12
  109. package/dist/services/oauthSettingsStore.js.map +1 -1
  110. package/dist/services/openApiGeneratorService.js +6 -7
  111. package/dist/services/openApiGeneratorService.js.map +1 -1
  112. package/dist/services/sseService.js +20 -62
  113. package/dist/services/sseService.js.map +1 -1
  114. package/dist/services/userService.js +38 -45
  115. package/dist/services/userService.js.map +1 -1
  116. package/dist/utils/migration.js +235 -0
  117. package/dist/utils/migration.js.map +1 -0
  118. package/dist/utils/oauthBearer.js +4 -4
  119. package/dist/utils/oauthBearer.js.map +1 -1
  120. package/frontend/dist/assets/index-BiA4eB7l.js +251 -0
  121. package/frontend/dist/assets/index-BiA4eB7l.js.map +1 -0
  122. package/frontend/dist/index.html +1 -1
  123. package/mcp_settings.json +23 -1
  124. package/package.json +1 -1
  125. package/frontend/dist/assets/index-DDht0WYq.js +0 -251
  126. package/frontend/dist/assets/index-DDht0WYq.js.map +0 -1
@@ -0,0 +1,83 @@
1
+ import { OAuthClientRepository } from '../db/repositories/OAuthClientRepository.js';
2
+ /**
3
+ * Database-backed implementation of OAuthClientDao
4
+ */
5
+ export class OAuthClientDaoDbImpl {
6
+ constructor() {
7
+ this.repository = new OAuthClientRepository();
8
+ }
9
+ async findAll() {
10
+ const clients = await this.repository.findAll();
11
+ return clients.map((c) => this.mapToOAuthClient(c));
12
+ }
13
+ async findById(clientId) {
14
+ const client = await this.repository.findByClientId(clientId);
15
+ return client ? this.mapToOAuthClient(client) : null;
16
+ }
17
+ async findByClientId(clientId) {
18
+ return this.findById(clientId);
19
+ }
20
+ async findByOwner(owner) {
21
+ const clients = await this.repository.findByOwner(owner);
22
+ return clients.map((c) => this.mapToOAuthClient(c));
23
+ }
24
+ async create(entity) {
25
+ const client = await this.repository.create({
26
+ clientId: entity.clientId,
27
+ clientSecret: entity.clientSecret,
28
+ name: entity.name,
29
+ redirectUris: entity.redirectUris,
30
+ grants: entity.grants,
31
+ scopes: entity.scopes,
32
+ owner: entity.owner || 'admin',
33
+ metadata: entity.metadata,
34
+ });
35
+ return this.mapToOAuthClient(client);
36
+ }
37
+ async update(clientId, entity) {
38
+ const client = await this.repository.update(clientId, {
39
+ clientSecret: entity.clientSecret,
40
+ name: entity.name,
41
+ redirectUris: entity.redirectUris,
42
+ grants: entity.grants,
43
+ scopes: entity.scopes,
44
+ owner: entity.owner,
45
+ metadata: entity.metadata,
46
+ });
47
+ return client ? this.mapToOAuthClient(client) : null;
48
+ }
49
+ async delete(clientId) {
50
+ return await this.repository.delete(clientId);
51
+ }
52
+ async exists(clientId) {
53
+ return await this.repository.exists(clientId);
54
+ }
55
+ async count() {
56
+ return await this.repository.count();
57
+ }
58
+ async validateCredentials(clientId, clientSecret) {
59
+ const client = await this.findByClientId(clientId);
60
+ if (!client) {
61
+ return false;
62
+ }
63
+ // If client has no secret (public client), accept if no secret provided
64
+ if (!client.clientSecret) {
65
+ return !clientSecret;
66
+ }
67
+ // If client has a secret, it must match
68
+ return client.clientSecret === clientSecret;
69
+ }
70
+ mapToOAuthClient(client) {
71
+ return {
72
+ clientId: client.clientId,
73
+ clientSecret: client.clientSecret,
74
+ name: client.name,
75
+ redirectUris: client.redirectUris,
76
+ grants: client.grants,
77
+ scopes: client.scopes,
78
+ owner: client.owner,
79
+ metadata: client.metadata,
80
+ };
81
+ }
82
+ }
83
+ //# sourceMappingURL=OAuthClientDaoDbImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthClientDaoDbImpl.js","sourceRoot":"","sources":["../../src/dao/OAuthClientDaoDbImpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ import { JsonFileBaseDao } from './base/JsonFileBaseDao.js';
2
+ /**
3
+ * JSON file-based OAuth Token DAO implementation
4
+ */
5
+ export class OAuthTokenDaoImpl extends JsonFileBaseDao {
6
+ async getAll() {
7
+ const settings = await this.loadSettings();
8
+ // Convert stored dates back to Date objects
9
+ return (settings.oauthTokens || []).map((token) => ({
10
+ ...token,
11
+ accessTokenExpiresAt: new Date(token.accessTokenExpiresAt),
12
+ refreshTokenExpiresAt: token.refreshTokenExpiresAt
13
+ ? new Date(token.refreshTokenExpiresAt)
14
+ : undefined,
15
+ }));
16
+ }
17
+ async saveAll(tokens) {
18
+ const settings = await this.loadSettings();
19
+ settings.oauthTokens = tokens;
20
+ await this.saveSettings(settings);
21
+ }
22
+ getEntityId(token) {
23
+ return token.accessToken;
24
+ }
25
+ createEntity(_data) {
26
+ throw new Error('accessToken must be provided');
27
+ }
28
+ updateEntity(existing, updates) {
29
+ return {
30
+ ...existing,
31
+ ...updates,
32
+ accessToken: existing.accessToken, // accessToken should not be updated
33
+ };
34
+ }
35
+ async findAll() {
36
+ return this.getAll();
37
+ }
38
+ async findById(accessToken) {
39
+ return this.findByAccessToken(accessToken);
40
+ }
41
+ async findByAccessToken(accessToken) {
42
+ const tokens = await this.getAll();
43
+ return tokens.find((token) => token.accessToken === accessToken) || null;
44
+ }
45
+ async findByRefreshToken(refreshToken) {
46
+ const tokens = await this.getAll();
47
+ return tokens.find((token) => token.refreshToken === refreshToken) || null;
48
+ }
49
+ async findByClientId(clientId) {
50
+ const tokens = await this.getAll();
51
+ return tokens.filter((token) => token.clientId === clientId);
52
+ }
53
+ async findByUsername(username) {
54
+ const tokens = await this.getAll();
55
+ return tokens.filter((token) => token.username === username);
56
+ }
57
+ async create(data) {
58
+ const tokens = await this.getAll();
59
+ // Remove any existing tokens with the same access token or refresh token
60
+ const filteredTokens = tokens.filter((t) => t.accessToken !== data.accessToken && t.refreshToken !== data.refreshToken);
61
+ const newToken = {
62
+ ...data,
63
+ };
64
+ filteredTokens.push(newToken);
65
+ await this.saveAll(filteredTokens);
66
+ return newToken;
67
+ }
68
+ async update(accessToken, updates) {
69
+ const tokens = await this.getAll();
70
+ const index = tokens.findIndex((token) => token.accessToken === accessToken);
71
+ if (index === -1) {
72
+ return null;
73
+ }
74
+ // Don't allow accessToken changes
75
+ const { accessToken: _, ...allowedUpdates } = updates;
76
+ const updatedToken = this.updateEntity(tokens[index], allowedUpdates);
77
+ tokens[index] = updatedToken;
78
+ await this.saveAll(tokens);
79
+ return updatedToken;
80
+ }
81
+ async delete(accessToken) {
82
+ const tokens = await this.getAll();
83
+ const index = tokens.findIndex((token) => token.accessToken === accessToken);
84
+ if (index === -1) {
85
+ return false;
86
+ }
87
+ tokens.splice(index, 1);
88
+ await this.saveAll(tokens);
89
+ return true;
90
+ }
91
+ async exists(accessToken) {
92
+ const token = await this.findByAccessToken(accessToken);
93
+ return token !== null;
94
+ }
95
+ async count() {
96
+ const tokens = await this.getAll();
97
+ return tokens.length;
98
+ }
99
+ async revokeToken(token) {
100
+ const tokens = await this.getAll();
101
+ const tokenData = tokens.find((t) => t.accessToken === token || t.refreshToken === token);
102
+ if (!tokenData) {
103
+ return false;
104
+ }
105
+ const filteredTokens = tokens.filter((t) => t.accessToken !== tokenData.accessToken && t.refreshToken !== tokenData.refreshToken);
106
+ await this.saveAll(filteredTokens);
107
+ return true;
108
+ }
109
+ async revokeUserTokens(username) {
110
+ const tokens = await this.getAll();
111
+ const userTokens = tokens.filter((token) => token.username === username);
112
+ const remainingTokens = tokens.filter((token) => token.username !== username);
113
+ await this.saveAll(remainingTokens);
114
+ return userTokens.length;
115
+ }
116
+ async revokeClientTokens(clientId) {
117
+ const tokens = await this.getAll();
118
+ const clientTokens = tokens.filter((token) => token.clientId === clientId);
119
+ const remainingTokens = tokens.filter((token) => token.clientId !== clientId);
120
+ await this.saveAll(remainingTokens);
121
+ return clientTokens.length;
122
+ }
123
+ async cleanupExpired() {
124
+ const tokens = await this.getAll();
125
+ const now = new Date();
126
+ const validTokens = tokens.filter((token) => {
127
+ // Keep if access token is still valid
128
+ if (token.accessTokenExpiresAt > now) {
129
+ return true;
130
+ }
131
+ // Or if refresh token exists and is still valid
132
+ if (token.refreshToken && token.refreshTokenExpiresAt && token.refreshTokenExpiresAt > now) {
133
+ return true;
134
+ }
135
+ return false;
136
+ });
137
+ const expiredCount = tokens.length - validTokens.length;
138
+ if (expiredCount > 0) {
139
+ await this.saveAll(validTokens);
140
+ }
141
+ return expiredCount;
142
+ }
143
+ async isAccessTokenValid(accessToken) {
144
+ const token = await this.findByAccessToken(accessToken);
145
+ if (!token) {
146
+ return false;
147
+ }
148
+ return token.accessTokenExpiresAt > new Date();
149
+ }
150
+ async isRefreshTokenValid(refreshToken) {
151
+ const token = await this.findByRefreshToken(refreshToken);
152
+ if (!token) {
153
+ return false;
154
+ }
155
+ if (!token.refreshTokenExpiresAt) {
156
+ return true; // No expiration means always valid
157
+ }
158
+ return token.refreshTokenExpiresAt > new Date();
159
+ }
160
+ }
161
+ //# sourceMappingURL=OAuthTokenDao.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthTokenDao.js","sourceRoot":"","sources":["../../src/dao/OAuthTokenDao.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { OAuthTokenRepository } from '../db/repositories/OAuthTokenRepository.js';
2
+ /**
3
+ * Database-backed implementation of OAuthTokenDao
4
+ */
5
+ export class OAuthTokenDaoDbImpl {
6
+ constructor() {
7
+ this.repository = new OAuthTokenRepository();
8
+ }
9
+ async findAll() {
10
+ const tokens = await this.repository.findAll();
11
+ return tokens.map((t) => this.mapToOAuthToken(t));
12
+ }
13
+ async findById(accessToken) {
14
+ const token = await this.repository.findByAccessToken(accessToken);
15
+ return token ? this.mapToOAuthToken(token) : null;
16
+ }
17
+ async findByAccessToken(accessToken) {
18
+ return this.findById(accessToken);
19
+ }
20
+ async findByRefreshToken(refreshToken) {
21
+ const token = await this.repository.findByRefreshToken(refreshToken);
22
+ return token ? this.mapToOAuthToken(token) : null;
23
+ }
24
+ async findByClientId(clientId) {
25
+ const tokens = await this.repository.findByClientId(clientId);
26
+ return tokens.map((t) => this.mapToOAuthToken(t));
27
+ }
28
+ async findByUsername(username) {
29
+ const tokens = await this.repository.findByUsername(username);
30
+ return tokens.map((t) => this.mapToOAuthToken(t));
31
+ }
32
+ async create(entity) {
33
+ const token = await this.repository.create({
34
+ accessToken: entity.accessToken,
35
+ accessTokenExpiresAt: entity.accessTokenExpiresAt,
36
+ refreshToken: entity.refreshToken,
37
+ refreshTokenExpiresAt: entity.refreshTokenExpiresAt,
38
+ scope: entity.scope,
39
+ clientId: entity.clientId,
40
+ username: entity.username,
41
+ });
42
+ return this.mapToOAuthToken(token);
43
+ }
44
+ async update(accessToken, entity) {
45
+ const token = await this.repository.update(accessToken, {
46
+ accessTokenExpiresAt: entity.accessTokenExpiresAt,
47
+ refreshToken: entity.refreshToken,
48
+ refreshTokenExpiresAt: entity.refreshTokenExpiresAt,
49
+ scope: entity.scope,
50
+ });
51
+ return token ? this.mapToOAuthToken(token) : null;
52
+ }
53
+ async delete(accessToken) {
54
+ return await this.repository.delete(accessToken);
55
+ }
56
+ async exists(accessToken) {
57
+ return await this.repository.exists(accessToken);
58
+ }
59
+ async count() {
60
+ return await this.repository.count();
61
+ }
62
+ async revokeToken(token) {
63
+ return await this.repository.revokeToken(token);
64
+ }
65
+ async revokeUserTokens(username) {
66
+ return await this.repository.revokeUserTokens(username);
67
+ }
68
+ async revokeClientTokens(clientId) {
69
+ return await this.repository.revokeClientTokens(clientId);
70
+ }
71
+ async cleanupExpired() {
72
+ return await this.repository.cleanupExpired();
73
+ }
74
+ async isAccessTokenValid(accessToken) {
75
+ return await this.repository.isAccessTokenValid(accessToken);
76
+ }
77
+ async isRefreshTokenValid(refreshToken) {
78
+ return await this.repository.isRefreshTokenValid(refreshToken);
79
+ }
80
+ mapToOAuthToken(token) {
81
+ return {
82
+ accessToken: token.accessToken,
83
+ accessTokenExpiresAt: token.accessTokenExpiresAt,
84
+ refreshToken: token.refreshToken,
85
+ refreshTokenExpiresAt: token.refreshTokenExpiresAt,
86
+ scope: token.scope,
87
+ clientId: token.clientId,
88
+ username: token.username,
89
+ };
90
+ }
91
+ }
92
+ //# sourceMappingURL=OAuthTokenDaoDbImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthTokenDaoDbImpl.js","sourceRoot":"","sources":["../../src/dao/OAuthTokenDaoDbImpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { ServerRepository } from '../db/repositories/ServerRepository.js';
2
+ /**
3
+ * Database-backed implementation of ServerDao
4
+ */
5
+ export class ServerDaoDbImpl {
6
+ constructor() {
7
+ this.repository = new ServerRepository();
8
+ }
9
+ async findAll() {
10
+ const servers = await this.repository.findAll();
11
+ return servers.map((s) => this.mapToServerConfig(s));
12
+ }
13
+ async findById(name) {
14
+ const server = await this.repository.findByName(name);
15
+ return server ? this.mapToServerConfig(server) : null;
16
+ }
17
+ async create(entity) {
18
+ const server = await this.repository.create({
19
+ name: entity.name,
20
+ type: entity.type,
21
+ url: entity.url,
22
+ command: entity.command,
23
+ args: entity.args,
24
+ env: entity.env,
25
+ headers: entity.headers,
26
+ enabled: entity.enabled !== undefined ? entity.enabled : true,
27
+ owner: entity.owner,
28
+ enableKeepAlive: entity.enableKeepAlive,
29
+ keepAliveInterval: entity.keepAliveInterval,
30
+ tools: entity.tools,
31
+ prompts: entity.prompts,
32
+ options: entity.options,
33
+ oauth: entity.oauth,
34
+ });
35
+ return this.mapToServerConfig(server);
36
+ }
37
+ async update(name, entity) {
38
+ const server = await this.repository.update(name, {
39
+ type: entity.type,
40
+ url: entity.url,
41
+ command: entity.command,
42
+ args: entity.args,
43
+ env: entity.env,
44
+ headers: entity.headers,
45
+ enabled: entity.enabled,
46
+ owner: entity.owner,
47
+ enableKeepAlive: entity.enableKeepAlive,
48
+ keepAliveInterval: entity.keepAliveInterval,
49
+ tools: entity.tools,
50
+ prompts: entity.prompts,
51
+ options: entity.options,
52
+ oauth: entity.oauth,
53
+ });
54
+ return server ? this.mapToServerConfig(server) : null;
55
+ }
56
+ async delete(name) {
57
+ return await this.repository.delete(name);
58
+ }
59
+ async exists(name) {
60
+ return await this.repository.exists(name);
61
+ }
62
+ async count() {
63
+ return await this.repository.count();
64
+ }
65
+ async findByOwner(owner) {
66
+ const servers = await this.repository.findByOwner(owner);
67
+ return servers.map((s) => this.mapToServerConfig(s));
68
+ }
69
+ async findEnabled() {
70
+ const servers = await this.repository.findEnabled();
71
+ return servers.map((s) => this.mapToServerConfig(s));
72
+ }
73
+ async findByType(type) {
74
+ const allServers = await this.repository.findAll();
75
+ return allServers.filter((s) => s.type === type).map((s) => this.mapToServerConfig(s));
76
+ }
77
+ async setEnabled(name, enabled) {
78
+ const server = await this.repository.setEnabled(name, enabled);
79
+ return server !== null;
80
+ }
81
+ async updateTools(name, tools) {
82
+ const result = await this.update(name, { tools });
83
+ return result !== null;
84
+ }
85
+ async updatePrompts(name, prompts) {
86
+ const result = await this.update(name, { prompts });
87
+ return result !== null;
88
+ }
89
+ mapToServerConfig(server) {
90
+ return {
91
+ name: server.name,
92
+ type: server.type,
93
+ url: server.url,
94
+ command: server.command,
95
+ args: server.args,
96
+ env: server.env,
97
+ headers: server.headers,
98
+ enabled: server.enabled,
99
+ owner: server.owner,
100
+ enableKeepAlive: server.enableKeepAlive,
101
+ keepAliveInterval: server.keepAliveInterval,
102
+ tools: server.tools,
103
+ prompts: server.prompts,
104
+ options: server.options,
105
+ oauth: server.oauth,
106
+ };
107
+ }
108
+ }
109
+ //# sourceMappingURL=ServerDaoDbImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerDaoDbImpl.js","sourceRoot":"","sources":["../../src/dao/ServerDaoDbImpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { SystemConfigRepository } from '../db/repositories/SystemConfigRepository.js';
2
+ /**
3
+ * Database-backed implementation of SystemConfigDao
4
+ */
5
+ export class SystemConfigDaoDbImpl {
6
+ constructor() {
7
+ this.repository = new SystemConfigRepository();
8
+ }
9
+ async get() {
10
+ const config = await this.repository.get();
11
+ return {
12
+ routing: config.routing,
13
+ install: config.install,
14
+ smartRouting: config.smartRouting,
15
+ mcpRouter: config.mcpRouter,
16
+ nameSeparator: config.nameSeparator,
17
+ oauth: config.oauth,
18
+ oauthServer: config.oauthServer,
19
+ enableSessionRebuild: config.enableSessionRebuild,
20
+ };
21
+ }
22
+ async update(config) {
23
+ const updated = await this.repository.update(config);
24
+ return {
25
+ routing: updated.routing,
26
+ install: updated.install,
27
+ smartRouting: updated.smartRouting,
28
+ mcpRouter: updated.mcpRouter,
29
+ nameSeparator: updated.nameSeparator,
30
+ oauth: updated.oauth,
31
+ oauthServer: updated.oauthServer,
32
+ enableSessionRebuild: updated.enableSessionRebuild,
33
+ };
34
+ }
35
+ async reset() {
36
+ const config = await this.repository.reset();
37
+ return {
38
+ routing: config.routing,
39
+ install: config.install,
40
+ smartRouting: config.smartRouting,
41
+ mcpRouter: config.mcpRouter,
42
+ nameSeparator: config.nameSeparator,
43
+ oauth: config.oauth,
44
+ oauthServer: config.oauthServer,
45
+ enableSessionRebuild: config.enableSessionRebuild,
46
+ };
47
+ }
48
+ async getSection(section) {
49
+ return (await this.repository.getSection(section));
50
+ }
51
+ async updateSection(section, value) {
52
+ await this.repository.updateSection(section, value);
53
+ return true;
54
+ }
55
+ }
56
+ //# sourceMappingURL=SystemConfigDaoDbImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemConfigDaoDbImpl.js","sourceRoot":"","sources":["../../src/dao/SystemConfigDaoDbImpl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAEtF;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAGhC;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAc;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAc;YAC9B,YAAY,EAAE,MAAM,CAAC,YAAmB;YACxC,SAAS,EAAE,MAAM,CAAC,SAAgB;YAClC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,KAAK,EAAE,MAAM,CAAC,KAAY;YAC1B,WAAW,EAAE,MAAM,CAAC,WAAkB;YACtC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA6B;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAa,CAAC,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAc;YAC/B,OAAO,EAAE,OAAO,CAAC,OAAc;YAC/B,YAAY,EAAE,OAAO,CAAC,YAAmB;YACzC,SAAS,EAAE,OAAO,CAAC,SAAgB;YACnC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAY;YAC3B,WAAW,EAAE,OAAO,CAAC,WAAkB;YACvC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAc;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAc;YAC9B,YAAY,EAAE,MAAM,CAAC,YAAmB;YACxC,SAAS,EAAE,MAAM,CAAC,SAAgB;YAClC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,KAAK,EAAE,MAAM,CAAC,KAAY;YAC1B,WAAW,EAAE,MAAM,CAAC,WAAkB;YACtC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAA+B,OAAU;QACvD,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAQ,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAU,EACV,KAAsB;QAEtB,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,KAAY,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,61 @@
1
+ import { UserConfigRepository } from '../db/repositories/UserConfigRepository.js';
2
+ /**
3
+ * Database-backed implementation of UserConfigDao
4
+ */
5
+ export class UserConfigDaoDbImpl {
6
+ constructor() {
7
+ this.repository = new UserConfigRepository();
8
+ }
9
+ async getAll() {
10
+ const configs = await this.repository.getAll();
11
+ const result = {};
12
+ for (const [username, config] of Object.entries(configs)) {
13
+ result[username] = {
14
+ routing: config.routing,
15
+ ...config.additionalConfig,
16
+ };
17
+ }
18
+ return result;
19
+ }
20
+ async get(username) {
21
+ const config = await this.repository.get(username);
22
+ if (!config) {
23
+ return { routing: {} };
24
+ }
25
+ return {
26
+ routing: config.routing,
27
+ ...config.additionalConfig,
28
+ };
29
+ }
30
+ async update(username, config) {
31
+ const { routing, ...additionalConfig } = config;
32
+ const updated = await this.repository.update(username, {
33
+ routing,
34
+ additionalConfig,
35
+ });
36
+ return {
37
+ routing: updated.routing,
38
+ ...updated.additionalConfig,
39
+ };
40
+ }
41
+ async delete(username) {
42
+ return await this.repository.delete(username);
43
+ }
44
+ async getSection(username, section) {
45
+ const config = await this.get(username);
46
+ return config[section];
47
+ }
48
+ async updateSection(username, section, value) {
49
+ await this.update(username, { [section]: value });
50
+ return true;
51
+ }
52
+ async exists(username) {
53
+ const config = await this.repository.get(username);
54
+ return config !== null;
55
+ }
56
+ async reset(username) {
57
+ await this.repository.delete(username);
58
+ return { routing: {} };
59
+ }
60
+ }
61
+ //# sourceMappingURL=UserConfigDaoDbImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserConfigDaoDbImpl.js","sourceRoot":"","sources":["../../src/dao/UserConfigDaoDbImpl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAElF;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAG9B;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,MAAM,GAA+B,EAAE,CAAC;QAE9C,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,GAAG;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,MAAM,CAAC,gBAAgB;aAC3B,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QACD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,GAAG,MAAM,CAAC,gBAAgB;SAC3B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,MAA2B;QACxD,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,GAAG,MAAM,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;YACrD,OAAO;YACP,gBAAgB;SACjB,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,OAAO,CAAC,gBAAgB;SAC5B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,UAAU,CAA6B,QAAgB,EAAE,OAAU;QACvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,QAAgB,EAChB,OAAU,EACV,KAAoB;QAEpB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAyB,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,MAAM,KAAK,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;CACF"}