repoburg 1.3.166 → 1.3.168

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 (56) hide show
  1. package/backend/dist/src/app.module.js +2 -0
  2. package/backend/dist/src/app.module.js.map +1 -1
  3. package/backend/dist/src/core-entities/mcp-config.entity.d.ts +9 -0
  4. package/backend/dist/src/core-entities/mcp-config.entity.js +71 -6
  5. package/backend/dist/src/core-entities/mcp-config.entity.js.map +1 -1
  6. package/backend/dist/src/events/websocket.events.d.ts +12 -0
  7. package/backend/dist/src/events/websocket.events.js +4 -0
  8. package/backend/dist/src/events/websocket.events.js.map +1 -1
  9. package/backend/dist/src/llm-orchestration/action-handlers/dto/web-fetch.args.dto.d.ts +3 -0
  10. package/backend/dist/src/llm-orchestration/action-handlers/dto/web-fetch.args.dto.js +22 -0
  11. package/backend/dist/src/llm-orchestration/action-handlers/dto/web-fetch.args.dto.js.map +1 -0
  12. package/backend/dist/src/llm-orchestration/action-handlers/dto/web-search.args.dto.d.ts +4 -0
  13. package/backend/dist/src/llm-orchestration/action-handlers/dto/web-search.args.dto.js +30 -0
  14. package/backend/dist/src/llm-orchestration/action-handlers/dto/web-search.args.dto.js.map +1 -0
  15. package/backend/dist/src/llm-orchestration/action-handlers/web-fetch.handler.d.ts +16 -0
  16. package/backend/dist/src/llm-orchestration/action-handlers/web-fetch.handler.js +180 -0
  17. package/backend/dist/src/llm-orchestration/action-handlers/web-fetch.handler.js.map +1 -0
  18. package/backend/dist/src/llm-orchestration/action-handlers/web-search.handler.d.ts +16 -0
  19. package/backend/dist/src/llm-orchestration/action-handlers/web-search.handler.js +185 -0
  20. package/backend/dist/src/llm-orchestration/action-handlers/web-search.handler.js.map +1 -0
  21. package/backend/dist/src/llm-orchestration/llm-orchestration.module.js +9 -1
  22. package/backend/dist/src/llm-orchestration/llm-orchestration.module.js.map +1 -1
  23. package/backend/dist/src/mcp/marketplace/dto/initiate-connect.dto.d.ts +3 -0
  24. package/backend/dist/src/mcp/marketplace/dto/initiate-connect.dto.js +27 -0
  25. package/backend/dist/src/mcp/marketplace/dto/initiate-connect.dto.js.map +1 -0
  26. package/backend/dist/src/mcp/marketplace/marketplace.controller.d.ts +20 -0
  27. package/backend/dist/src/mcp/marketplace/marketplace.controller.js +145 -0
  28. package/backend/dist/src/mcp/marketplace/marketplace.controller.js.map +1 -0
  29. package/backend/dist/src/mcp/marketplace/marketplace.module.d.ts +2 -0
  30. package/backend/dist/src/mcp/marketplace/marketplace.module.js +34 -0
  31. package/backend/dist/src/mcp/marketplace/marketplace.module.js.map +1 -0
  32. package/backend/dist/src/mcp/marketplace/marketplace.service.d.ts +35 -0
  33. package/backend/dist/src/mcp/marketplace/marketplace.service.js +275 -0
  34. package/backend/dist/src/mcp/marketplace/marketplace.service.js.map +1 -0
  35. package/backend/dist/src/mcp/marketplace/oauth-provider.d.ts +29 -0
  36. package/backend/dist/src/mcp/marketplace/oauth-provider.js +55 -0
  37. package/backend/dist/src/mcp/marketplace/oauth-provider.js.map +1 -0
  38. package/backend/dist/src/mcp/marketplace/remote-servers.catalog.d.ts +12 -0
  39. package/backend/dist/src/mcp/marketplace/remote-servers.catalog.js +2318 -0
  40. package/backend/dist/src/mcp/marketplace/remote-servers.catalog.js.map +1 -0
  41. package/backend/dist/src/mcp/mcp.service.d.ts +2 -0
  42. package/backend/dist/src/mcp/mcp.service.js +92 -4
  43. package/backend/dist/src/mcp/mcp.service.js.map +1 -1
  44. package/backend/dist/src/mcp-server/mcp-server.constants.js +2 -0
  45. package/backend/dist/src/mcp-server/mcp-server.constants.js.map +1 -1
  46. package/backend/dist/src/seeding/data/system-prompts/control-repoburg-agent.js +2 -0
  47. package/backend/dist/src/seeding/data/system-prompts/control-repoburg-agent.js.map +1 -1
  48. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js +2 -0
  49. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js.map +1 -1
  50. package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.js +2 -0
  51. package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.js.map +1 -1
  52. package/backend/dist/src/system-prompts/system-prompts.service.js +2 -0
  53. package/backend/dist/src/system-prompts/system-prompts.service.js.map +1 -1
  54. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  55. package/backend/package.json +2 -1
  56. package/package.json +1 -1
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var MarketplaceService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MarketplaceService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const typeorm_1 = require("@nestjs/typeorm");
19
+ const typeorm_2 = require("typeorm");
20
+ const core_entities_1 = require("../../core-entities");
21
+ const app_service_1 = require("../../app.service");
22
+ const events_gateway_1 = require("../../events/events.gateway");
23
+ const mcp_service_1 = require("../mcp.service");
24
+ const remote_servers_catalog_1 = require("./remote-servers.catalog");
25
+ const oauth_provider_1 = require("./oauth-provider");
26
+ const auth_js_1 = require("@modelcontextprotocol/sdk/client/auth.js");
27
+ const crypto_1 = require("crypto");
28
+ let MarketplaceService = MarketplaceService_1 = class MarketplaceService {
29
+ constructor(mcpConfigRepository, appService, eventsGateway, mcpService) {
30
+ this.mcpConfigRepository = mcpConfigRepository;
31
+ this.appService = appService;
32
+ this.eventsGateway = eventsGateway;
33
+ this.mcpService = mcpService;
34
+ this.logger = new common_1.Logger(MarketplaceService_1.name);
35
+ this.pendingAuths = new Map();
36
+ }
37
+ getMarketplaceServers() {
38
+ return remote_servers_catalog_1.REMOTE_SERVERS_CATALOG;
39
+ }
40
+ getMarketplaceServer(id) {
41
+ const entry = (0, remote_servers_catalog_1.findCatalogEntry)(id);
42
+ if (!entry) {
43
+ throw new common_1.NotFoundException(`Marketplace server "${id}" not found.`);
44
+ }
45
+ return entry;
46
+ }
47
+ async getConnectStatus(marketplaceId) {
48
+ for (const pending of this.pendingAuths.values()) {
49
+ if (pending.marketplaceId === marketplaceId) {
50
+ return { status: pending.status, error: pending.error };
51
+ }
52
+ }
53
+ const config = await this.mcpConfigRepository.findOneBy({
54
+ marketplace_id: marketplaceId,
55
+ });
56
+ if (config) {
57
+ return { status: 'connected' };
58
+ }
59
+ return { status: 'pending' };
60
+ }
61
+ async initiateConnect(marketplaceId) {
62
+ const entry = (0, remote_servers_catalog_1.findCatalogEntry)(marketplaceId);
63
+ if (!entry) {
64
+ throw new common_1.NotFoundException(`Marketplace server "${marketplaceId}" not found.`);
65
+ }
66
+ const existing = await this.mcpConfigRepository.findOneBy({
67
+ marketplace_id: marketplaceId,
68
+ });
69
+ if (existing) {
70
+ throw new common_1.BadRequestException(`Server "${entry.name}" is already connected.`);
71
+ }
72
+ const port = this.appService.getPort();
73
+ const redirectUrl = `http://localhost:${port}/mcp/oauth/callback`;
74
+ this.logger.log(`Initiating OAuth flow for ${marketplaceId} (${entry.serverUrl})`);
75
+ const requiresAuth = await this.probeServerAuth(entry.serverUrl);
76
+ if (!requiresAuth) {
77
+ this.logger.log(`Server ${marketplaceId} does not require auth. Connecting directly.`);
78
+ await this.finalizeDirectConnection(marketplaceId, entry);
79
+ return { authUrl: '', state: '' };
80
+ }
81
+ const state = (0, crypto_1.randomUUID)();
82
+ const pendingState = {
83
+ marketplaceId,
84
+ oauthState: state,
85
+ serverUrl: entry.serverUrl,
86
+ status: 'pending',
87
+ };
88
+ const provider = new oauth_provider_1.DbBackedOAuthProvider(redirectUrl, pendingState);
89
+ this.pendingAuths.set(state, pendingState);
90
+ try {
91
+ const result = await (0, auth_js_1.auth)(provider, {
92
+ serverUrl: entry.serverUrl,
93
+ });
94
+ if (result === 'AUTHORIZED' && pendingState.tokens) {
95
+ await this.finalizeConnection(marketplaceId, pendingState);
96
+ return { authUrl: '', state };
97
+ }
98
+ if (result === 'REDIRECT' && pendingState.authUrl) {
99
+ return { authUrl: pendingState.authUrl, state };
100
+ }
101
+ throw new Error('OAuth flow did not produce an authorization URL. The server may not support OAuth.');
102
+ }
103
+ catch (error) {
104
+ this.logger.error(`OAuth flow initiation failed for ${marketplaceId}: ${error.message}`);
105
+ pendingState.status = 'error';
106
+ pendingState.error = error.message;
107
+ throw new common_1.BadRequestException(`Failed to initiate OAuth: ${error.message}`);
108
+ }
109
+ }
110
+ async handleOAuthCallback(code, state) {
111
+ const pendingState = this.pendingAuths.get(state);
112
+ if (!pendingState) {
113
+ this.logger.warn(`OAuth callback received with unknown state: ${state}`);
114
+ return {
115
+ success: false,
116
+ error: 'Invalid or expired OAuth session. Please try again.',
117
+ };
118
+ }
119
+ const { marketplaceId, serverUrl } = pendingState;
120
+ this.logger.log(`Processing OAuth callback for ${marketplaceId} (code: ${code.substring(0, 10)}...)`);
121
+ const port = this.appService.getPort();
122
+ const redirectUrl = `http://localhost:${port}/mcp/oauth/callback`;
123
+ const provider = new oauth_provider_1.DbBackedOAuthProvider(redirectUrl, pendingState);
124
+ try {
125
+ const result = await (0, auth_js_1.auth)(provider, {
126
+ serverUrl,
127
+ authorizationCode: code,
128
+ });
129
+ if (result !== 'AUTHORIZED') {
130
+ throw new Error('Token exchange did not result in authorization. The code may be invalid or expired.');
131
+ }
132
+ if (!pendingState.tokens) {
133
+ throw new Error('No tokens received after authorization.');
134
+ }
135
+ await this.finalizeConnection(marketplaceId, pendingState);
136
+ return { success: true, serverName: marketplaceId };
137
+ }
138
+ catch (error) {
139
+ this.logger.error(`OAuth callback failed for ${marketplaceId}: ${error.message}`);
140
+ pendingState.status = 'error';
141
+ pendingState.error = error.message;
142
+ this.pendingAuths.set(state, pendingState);
143
+ this.eventsGateway.sendToAll('mcp-marketplace-error', {
144
+ marketplaceId,
145
+ error: error.message,
146
+ });
147
+ return { success: false, error: error.message };
148
+ }
149
+ }
150
+ async probeServerAuth(serverUrl) {
151
+ try {
152
+ const resp = await fetch(serverUrl, {
153
+ method: 'POST',
154
+ headers: {
155
+ 'Content-Type': 'application/json',
156
+ Accept: 'application/json, text/event-stream',
157
+ },
158
+ body: JSON.stringify({
159
+ jsonrpc: '2.0',
160
+ id: 1,
161
+ method: 'initialize',
162
+ params: {
163
+ protocolVersion: '2024-11-05',
164
+ capabilities: {},
165
+ clientInfo: { name: 'repoburg-probe', version: '1.0.0' },
166
+ },
167
+ }),
168
+ });
169
+ this.logger.log(`Auth probe for ${serverUrl}: status ${resp.status}`);
170
+ return resp.status === 401;
171
+ }
172
+ catch (e) {
173
+ this.logger.warn(`Auth probe failed for ${serverUrl}: ${e.message}. Assuming auth required.`);
174
+ return true;
175
+ }
176
+ }
177
+ async finalizeDirectConnection(marketplaceId, entry) {
178
+ const serverName = entry.name.toLowerCase().replace(/\s+/g, '-');
179
+ let finalServerName = serverName;
180
+ let counter = 1;
181
+ while (await this.mcpConfigRepository.findOneBy({ server_name: finalServerName })) {
182
+ finalServerName = `${serverName}-${counter++}`;
183
+ }
184
+ const newConfig = this.mcpConfigRepository.create({
185
+ server_name: finalServerName,
186
+ transport_type: 'streamable_http',
187
+ server_url: entry.serverUrl,
188
+ access_token: null,
189
+ refresh_token: null,
190
+ token_expires_at: null,
191
+ client_information: null,
192
+ logo_url: entry.logoUrl,
193
+ category: entry.category,
194
+ marketplace_id: marketplaceId,
195
+ is_active: true,
196
+ });
197
+ const savedConfig = await this.mcpConfigRepository.save(newConfig);
198
+ this.logger.log(`Saved McpConfig (no-auth) for ${marketplaceId} as "${finalServerName}"`);
199
+ await this.mcpService.connectToServer(savedConfig);
200
+ this.eventsGateway.sendToAll('mcp-marketplace-connected', {
201
+ marketplaceId,
202
+ serverName: finalServerName,
203
+ });
204
+ this.logger.log(`Direct connection completed for ${marketplaceId}`);
205
+ }
206
+ async finalizeConnection(marketplaceId, pendingState) {
207
+ const entry = (0, remote_servers_catalog_1.findCatalogEntry)(marketplaceId);
208
+ if (!entry) {
209
+ throw new Error(`Catalog entry not found for ${marketplaceId}`);
210
+ }
211
+ const tokens = pendingState.tokens;
212
+ const serverName = entry.name.toLowerCase().replace(/\s+/g, '-');
213
+ let finalServerName = serverName;
214
+ let counter = 1;
215
+ while (await this.mcpConfigRepository.findOneBy({ server_name: finalServerName })) {
216
+ finalServerName = `${serverName}-${counter++}`;
217
+ }
218
+ const newConfig = this.mcpConfigRepository.create({
219
+ server_name: finalServerName,
220
+ transport_type: 'streamable_http',
221
+ server_url: entry.serverUrl,
222
+ access_token: tokens.access_token,
223
+ refresh_token: tokens.refresh_token || null,
224
+ token_expires_at: tokens.expires_in
225
+ ? new Date(Date.now() + tokens.expires_in * 1000)
226
+ : null,
227
+ client_information: pendingState.clientInformation || null,
228
+ logo_url: entry.logoUrl,
229
+ category: entry.category,
230
+ marketplace_id: marketplaceId,
231
+ is_active: true,
232
+ });
233
+ const savedConfig = await this.mcpConfigRepository.save(newConfig);
234
+ this.logger.log(`Saved McpConfig for ${marketplaceId} as "${finalServerName}"`);
235
+ await this.mcpService.connectToServer(savedConfig);
236
+ this.eventsGateway.sendToAll('mcp-marketplace-connected', {
237
+ marketplaceId,
238
+ serverName: finalServerName,
239
+ });
240
+ this.pendingAuths.delete(pendingState.oauthState);
241
+ this.logger.log(`OAuth flow completed for ${marketplaceId}`);
242
+ }
243
+ createProviderForConfig(config) {
244
+ const port = this.appService.getPort();
245
+ const redirectUrl = `http://localhost:${port}/mcp/oauth/callback`;
246
+ const pendingState = {
247
+ marketplaceId: config.marketplace_id || config.server_name,
248
+ oauthState: '',
249
+ serverUrl: config.server_url || '',
250
+ clientInformation: config.client_information,
251
+ tokens: config.access_token
252
+ ? {
253
+ access_token: config.access_token,
254
+ token_type: 'Bearer',
255
+ refresh_token: config.refresh_token || undefined,
256
+ expires_in: config.token_expires_at
257
+ ? Math.floor((config.token_expires_at.getTime() - Date.now()) / 1000)
258
+ : undefined,
259
+ }
260
+ : undefined,
261
+ status: 'pending',
262
+ };
263
+ return new oauth_provider_1.DbBackedOAuthProvider(redirectUrl, pendingState);
264
+ }
265
+ };
266
+ exports.MarketplaceService = MarketplaceService;
267
+ exports.MarketplaceService = MarketplaceService = MarketplaceService_1 = __decorate([
268
+ (0, common_1.Injectable)(),
269
+ __param(0, (0, typeorm_1.InjectRepository)(core_entities_1.McpConfig)),
270
+ __metadata("design:paramtypes", [typeorm_2.Repository,
271
+ app_service_1.AppService,
272
+ events_gateway_1.EventsGateway,
273
+ mcp_service_1.McpService])
274
+ ], MarketplaceService);
275
+ //# sourceMappingURL=marketplace.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.service.js","sourceRoot":"","sources":["../../../../src/mcp/marketplace/marketplace.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
2
+ import type { OAuthClientMetadata, OAuthClientInformationMixed, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
3
+ export interface PendingAuthState {
4
+ marketplaceId: string;
5
+ codeVerifier?: string;
6
+ oauthState: string;
7
+ serverUrl: string;
8
+ clientInformation?: OAuthClientInformationMixed;
9
+ tokens?: OAuthTokens;
10
+ authUrl?: string;
11
+ status: 'pending' | 'connected' | 'error';
12
+ error?: string;
13
+ }
14
+ export declare class DbBackedOAuthProvider implements OAuthClientProvider {
15
+ private readonly redirectUrlValue;
16
+ private readonly pendingState;
17
+ private readonly logger;
18
+ constructor(redirectUrlValue: string, pendingState: PendingAuthState);
19
+ get redirectUrl(): string;
20
+ get clientMetadata(): OAuthClientMetadata;
21
+ state(): Promise<string>;
22
+ clientInformation(): OAuthClientInformationMixed | undefined;
23
+ saveClientInformation(clientInformation: OAuthClientInformationMixed): Promise<void>;
24
+ tokens(): OAuthTokens | undefined;
25
+ saveTokens(tokens: OAuthTokens): Promise<void>;
26
+ redirectToAuthorization(authorizationUrl: URL): Promise<void>;
27
+ saveCodeVerifier(codeVerifier: string): Promise<void>;
28
+ codeVerifier(): Promise<string>;
29
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DbBackedOAuthProvider = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class DbBackedOAuthProvider {
6
+ constructor(redirectUrlValue, pendingState) {
7
+ this.redirectUrlValue = redirectUrlValue;
8
+ this.pendingState = pendingState;
9
+ this.logger = new common_1.Logger(DbBackedOAuthProvider.name);
10
+ }
11
+ get redirectUrl() {
12
+ return this.redirectUrlValue;
13
+ }
14
+ get clientMetadata() {
15
+ return {
16
+ client_name: 'Repoburg MCP Client',
17
+ redirect_uris: [this.redirectUrlValue],
18
+ grant_types: ['authorization_code', 'refresh_token'],
19
+ response_types: ['code'],
20
+ token_endpoint_auth_method: 'client_secret_post',
21
+ };
22
+ }
23
+ async state() {
24
+ return this.pendingState.oauthState;
25
+ }
26
+ clientInformation() {
27
+ return this.pendingState.clientInformation;
28
+ }
29
+ async saveClientInformation(clientInformation) {
30
+ this.pendingState.clientInformation = clientInformation;
31
+ this.logger.log(`Saved OAuth client information for ${this.pendingState.marketplaceId}`);
32
+ }
33
+ tokens() {
34
+ return this.pendingState.tokens;
35
+ }
36
+ async saveTokens(tokens) {
37
+ this.pendingState.tokens = tokens;
38
+ this.logger.log(`Saved OAuth tokens for ${this.pendingState.marketplaceId}`);
39
+ }
40
+ async redirectToAuthorization(authorizationUrl) {
41
+ this.pendingState.authUrl = authorizationUrl.toString();
42
+ this.logger.log(`Authorization URL captured for ${this.pendingState.marketplaceId}: ${authorizationUrl.toString()}`);
43
+ }
44
+ async saveCodeVerifier(codeVerifier) {
45
+ this.pendingState.codeVerifier = codeVerifier;
46
+ }
47
+ async codeVerifier() {
48
+ if (!this.pendingState.codeVerifier) {
49
+ throw new Error('No code verifier saved for this OAuth flow.');
50
+ }
51
+ return this.pendingState.codeVerifier;
52
+ }
53
+ }
54
+ exports.DbBackedOAuthProvider = DbBackedOAuthProvider;
55
+ //# sourceMappingURL=oauth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../../../src/mcp/marketplace/oauth-provider.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AA6CxC,MAAa,qBAAqB;IAGhC,YACmB,gBAAwB,EACxB,YAA8B;QAD9B,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,iBAAY,GAAZ,YAAY,CAAkB;QAJhC,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAK9D,CAAC;IAEJ,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,IAAI,cAAc;QAChB,OAAO;YACL,WAAW,EAAE,qBAAqB;YAClC,aAAa,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACtC,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;YACpD,cAAc,EAAE,CAAC,MAAM,CAAC;YACxB,0BAA0B,EAAE,oBAAoB;SACjD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,iBAA8C;QAE9C,IAAI,CAAC,YAAY,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,sCAAsC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAmB;QAClC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,0BAA0B,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAC5D,CAAC;IACJ,CAAC;IAOD,KAAK,CAAC,uBAAuB,CAAC,gBAAqB;QACjD,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,kCAAkC,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CACpG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACzC,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;IACxC,CAAC;CACF;AAxED,sDAwEC"}
@@ -0,0 +1,12 @@
1
+ export interface RemoteServerCatalogEntry {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ serverUrl: string;
6
+ logoUrl: string;
7
+ category: string;
8
+ authType: 'oauth';
9
+ }
10
+ export declare const REMOTE_SERVERS_CATALOG: RemoteServerCatalogEntry[];
11
+ export declare function findCatalogEntry(id: string): RemoteServerCatalogEntry | undefined;
12
+ export declare function getCatalogCategories(): string[];