repoburg 1.3.167 → 1.3.169
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/backend/dist/src/app.module.js +2 -0
- package/backend/dist/src/app.module.js.map +1 -1
- package/backend/dist/src/core-entities/mcp-config.entity.d.ts +9 -0
- package/backend/dist/src/core-entities/mcp-config.entity.js +71 -6
- package/backend/dist/src/core-entities/mcp-config.entity.js.map +1 -1
- package/backend/dist/src/events/websocket.events.d.ts +12 -0
- package/backend/dist/src/events/websocket.events.js +4 -0
- package/backend/dist/src/events/websocket.events.js.map +1 -1
- package/backend/dist/src/llm-orchestration/action-handlers/discard-messages.handler.js +19 -9
- package/backend/dist/src/llm-orchestration/action-handlers/discard-messages.handler.js.map +1 -1
- package/backend/dist/src/llm-orchestration/action-handlers/session-status.handler.js +4 -1
- package/backend/dist/src/llm-orchestration/action-handlers/session-status.handler.js.map +1 -1
- package/backend/dist/src/llm-orchestration/session-status.util.js +2 -0
- package/backend/dist/src/llm-orchestration/session-status.util.js.map +1 -1
- package/backend/dist/src/mcp/marketplace/dto/initiate-connect.dto.d.ts +3 -0
- package/backend/dist/src/mcp/marketplace/dto/initiate-connect.dto.js +27 -0
- package/backend/dist/src/mcp/marketplace/dto/initiate-connect.dto.js.map +1 -0
- package/backend/dist/src/mcp/marketplace/marketplace.controller.d.ts +20 -0
- package/backend/dist/src/mcp/marketplace/marketplace.controller.js +145 -0
- package/backend/dist/src/mcp/marketplace/marketplace.controller.js.map +1 -0
- package/backend/dist/src/mcp/marketplace/marketplace.module.d.ts +2 -0
- package/backend/dist/src/mcp/marketplace/marketplace.module.js +34 -0
- package/backend/dist/src/mcp/marketplace/marketplace.module.js.map +1 -0
- package/backend/dist/src/mcp/marketplace/marketplace.service.d.ts +35 -0
- package/backend/dist/src/mcp/marketplace/marketplace.service.js +275 -0
- package/backend/dist/src/mcp/marketplace/marketplace.service.js.map +1 -0
- package/backend/dist/src/mcp/marketplace/oauth-provider.d.ts +29 -0
- package/backend/dist/src/mcp/marketplace/oauth-provider.js +55 -0
- package/backend/dist/src/mcp/marketplace/oauth-provider.js.map +1 -0
- package/backend/dist/src/mcp/marketplace/remote-servers.catalog.d.ts +12 -0
- package/backend/dist/src/mcp/marketplace/remote-servers.catalog.js +2318 -0
- package/backend/dist/src/mcp/marketplace/remote-servers.catalog.js.map +1 -0
- package/backend/dist/src/mcp/mcp.service.d.ts +2 -0
- package/backend/dist/src/mcp/mcp.service.js +92 -4
- package/backend/dist/src/mcp/mcp.service.js.map +1 -1
- package/backend/dist/src/seeding/data/sub-agents/session-compressor.d.ts +7 -0
- package/backend/dist/src/seeding/data/sub-agents/session-compressor.js +11 -0
- package/backend/dist/src/seeding/data/sub-agents/session-compressor.js.map +1 -0
- package/backend/dist/src/seeding/data/system-prompts/control-repoburg-agent.js +2 -0
- package/backend/dist/src/seeding/data/system-prompts/control-repoburg-agent.js.map +1 -1
- package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js +2 -0
- package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js.map +1 -1
- package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.js +2 -0
- package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.js.map +1 -1
- package/backend/dist/src/seeding/data/system-prompts/session-compressor-agent.d.ts +4 -0
- package/backend/dist/src/seeding/data/system-prompts/session-compressor-agent.js +51 -0
- package/backend/dist/src/seeding/data/system-prompts/session-compressor-agent.js.map +1 -0
- package/backend/dist/src/seeding/data/tool-hooks/session-compression-hook.d.ts +2 -0
- package/backend/dist/src/seeding/data/tool-hooks/session-compression-hook.js +41 -0
- package/backend/dist/src/seeding/data/tool-hooks/session-compression-hook.js.map +1 -0
- package/backend/dist/src/seeding/seeding.module.js +3 -2
- package/backend/dist/src/seeding/seeding.module.js.map +1 -1
- package/backend/dist/src/seeding/seeding.service.d.ts +3 -1
- package/backend/dist/src/seeding/seeding.service.js +6 -2
- package/backend/dist/src/seeding/seeding.service.js.map +1 -1
- package/backend/dist/src/seeding/tool-hook-seeding.service.d.ts +8 -0
- package/backend/dist/src/seeding/tool-hook-seeding.service.js +55 -0
- package/backend/dist/src/seeding/tool-hook-seeding.service.js.map +1 -0
- package/backend/dist/src/tool-hooks/hook-context.interface.d.ts +1 -0
- package/backend/dist/src/tool-hooks/tool-hooks.service.js +7 -1
- package/backend/dist/src/tool-hooks/tool-hooks.service.js.map +1 -1
- package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
- package/backend/package.json +1 -1
- package/package.json +1 -1
- package/backend/test-workspace-llm-turn-processor/.repoburg/hooks/context-size-hook.ts +0 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.controller.js","sourceRoot":"","sources":["../../../../src/mcp/marketplace/marketplace.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MarketplaceModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
12
|
+
const core_entities_1 = require("../../core-entities");
|
|
13
|
+
const marketplace_controller_1 = require("./marketplace.controller");
|
|
14
|
+
const marketplace_service_1 = require("./marketplace.service");
|
|
15
|
+
const mcp_module_1 = require("../mcp.module");
|
|
16
|
+
const events_module_1 = require("../../events/events.module");
|
|
17
|
+
const app_module_1 = require("../../app.module");
|
|
18
|
+
let MarketplaceModule = class MarketplaceModule {
|
|
19
|
+
};
|
|
20
|
+
exports.MarketplaceModule = MarketplaceModule;
|
|
21
|
+
exports.MarketplaceModule = MarketplaceModule = __decorate([
|
|
22
|
+
(0, common_1.Module)({
|
|
23
|
+
imports: [
|
|
24
|
+
typeorm_1.TypeOrmModule.forFeature([core_entities_1.McpConfig]),
|
|
25
|
+
mcp_module_1.McpModule,
|
|
26
|
+
events_module_1.EventsModule,
|
|
27
|
+
(0, common_1.forwardRef)(() => app_module_1.AppModule),
|
|
28
|
+
],
|
|
29
|
+
controllers: [marketplace_controller_1.MarketplaceController],
|
|
30
|
+
providers: [marketplace_service_1.MarketplaceService],
|
|
31
|
+
exports: [marketplace_service_1.MarketplaceService],
|
|
32
|
+
})
|
|
33
|
+
], MarketplaceModule);
|
|
34
|
+
//# sourceMappingURL=marketplace.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.module.js","sourceRoot":"","sources":["../../../../src/mcp/marketplace/marketplace.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAoD;AACpD,6CAAgD;AAChD,uDAAgD;AAChD,qEAAiE;AACjE,+DAA2D;AAC3D,8CAA0C;AAC1C,8DAA0D;AAC1D,iDAA6C;AAatC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,8CAAiB;4BAAjB,iBAAiB;IAX7B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,uBAAa,CAAC,UAAU,CAAC,CAAC,yBAAS,CAAC,CAAC;YACrC,sBAAS;YACT,4BAAY;YACZ,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,sBAAS,CAAC;SAC5B;QACD,WAAW,EAAE,CAAC,8CAAqB,CAAC;QACpC,SAAS,EAAE,CAAC,wCAAkB,CAAC;QAC/B,OAAO,EAAE,CAAC,wCAAkB,CAAC;KAC9B,CAAC;GACW,iBAAiB,CAAG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Repository } from 'typeorm';
|
|
2
|
+
import { McpConfig } from '../../core-entities';
|
|
3
|
+
import { AppService } from '../../app.service';
|
|
4
|
+
import { EventsGateway } from '../../events/events.gateway';
|
|
5
|
+
import { McpService } from '../mcp.service';
|
|
6
|
+
import { RemoteServerCatalogEntry } from './remote-servers.catalog';
|
|
7
|
+
import { DbBackedOAuthProvider } from './oauth-provider';
|
|
8
|
+
export declare class MarketplaceService {
|
|
9
|
+
private readonly mcpConfigRepository;
|
|
10
|
+
private readonly appService;
|
|
11
|
+
private readonly eventsGateway;
|
|
12
|
+
private readonly mcpService;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private readonly pendingAuths;
|
|
15
|
+
constructor(mcpConfigRepository: Repository<McpConfig>, appService: AppService, eventsGateway: EventsGateway, mcpService: McpService);
|
|
16
|
+
getMarketplaceServers(): RemoteServerCatalogEntry[];
|
|
17
|
+
getMarketplaceServer(id: string): RemoteServerCatalogEntry;
|
|
18
|
+
getConnectStatus(marketplaceId: string): Promise<{
|
|
19
|
+
status: 'pending' | 'connected' | 'error';
|
|
20
|
+
error?: string;
|
|
21
|
+
}>;
|
|
22
|
+
initiateConnect(marketplaceId: string): Promise<{
|
|
23
|
+
authUrl: string;
|
|
24
|
+
state: string;
|
|
25
|
+
}>;
|
|
26
|
+
handleOAuthCallback(code: string, state: string): Promise<{
|
|
27
|
+
success: boolean;
|
|
28
|
+
serverName?: string;
|
|
29
|
+
error?: string;
|
|
30
|
+
}>;
|
|
31
|
+
private probeServerAuth;
|
|
32
|
+
private finalizeDirectConnection;
|
|
33
|
+
private finalizeConnection;
|
|
34
|
+
createProviderForConfig(config: McpConfig): DbBackedOAuthProvider;
|
|
35
|
+
}
|
|
@@ -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[];
|