@llmindset/hf-mcp-server 0.1.16
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/LICENSE +21 -0
- package/components.json +21 -0
- package/dist/server/application.d.ts +30 -0
- package/dist/server/application.d.ts.map +1 -0
- package/dist/server/application.js +131 -0
- package/dist/server/application.js.map +1 -0
- package/dist/server/gradio-endpoint-connector.d.ts +46 -0
- package/dist/server/gradio-endpoint-connector.d.ts.map +1 -0
- package/dist/server/gradio-endpoint-connector.js +348 -0
- package/dist/server/gradio-endpoint-connector.js.map +1 -0
- package/dist/server/gradio-endpoint-connector.test.d.ts +2 -0
- package/dist/server/gradio-endpoint-connector.test.d.ts.map +1 -0
- package/dist/server/gradio-endpoint-connector.test.js +313 -0
- package/dist/server/gradio-endpoint-connector.test.js.map +1 -0
- package/dist/server/lib/logger.d.ts +5 -0
- package/dist/server/lib/logger.d.ts.map +1 -0
- package/dist/server/lib/logger.js +45 -0
- package/dist/server/lib/logger.js.map +1 -0
- package/dist/server/lib/mcp-api-client.d.ts +42 -0
- package/dist/server/lib/mcp-api-client.d.ts.map +1 -0
- package/dist/server/lib/mcp-api-client.js +188 -0
- package/dist/server/lib/mcp-api-client.js.map +1 -0
- package/dist/server/lib/tool-selection-strategy.d.ts +29 -0
- package/dist/server/lib/tool-selection-strategy.d.ts.map +1 -0
- package/dist/server/lib/tool-selection-strategy.js +113 -0
- package/dist/server/lib/tool-selection-strategy.js.map +1 -0
- package/dist/server/lib/tool-selection-strategy.test.d.ts +2 -0
- package/dist/server/lib/tool-selection-strategy.test.d.ts.map +1 -0
- package/dist/server/lib/tool-selection-strategy.test.js +407 -0
- package/dist/server/lib/tool-selection-strategy.test.js.map +1 -0
- package/dist/server/mcp-proxy.d.ts +5 -0
- package/dist/server/mcp-proxy.d.ts.map +1 -0
- package/dist/server/mcp-proxy.js +66 -0
- package/dist/server/mcp-proxy.js.map +1 -0
- package/dist/server/mcp-server.d.ts +8 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +219 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/sse.d.ts +3 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +47 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/server/stdio.d.ts +3 -0
- package/dist/server/stdio.d.ts.map +1 -0
- package/dist/server/stdio.js +49 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/server/streamableHttp.d.ts +3 -0
- package/dist/server/streamableHttp.d.ts.map +1 -0
- package/dist/server/streamableHttp.js +53 -0
- package/dist/server/streamableHttp.js.map +1 -0
- package/dist/server/transport/base-transport.d.ts +132 -0
- package/dist/server/transport/base-transport.d.ts.map +1 -0
- package/dist/server/transport/base-transport.js +390 -0
- package/dist/server/transport/base-transport.js.map +1 -0
- package/dist/server/transport/json-rpc-errors.d.ts +36 -0
- package/dist/server/transport/json-rpc-errors.d.ts.map +1 -0
- package/dist/server/transport/json-rpc-errors.js +53 -0
- package/dist/server/transport/json-rpc-errors.js.map +1 -0
- package/dist/server/transport/sse-transport.d.ts +17 -0
- package/dist/server/transport/sse-transport.d.ts.map +1 -0
- package/dist/server/transport/sse-transport.js +170 -0
- package/dist/server/transport/sse-transport.js.map +1 -0
- package/dist/server/transport/stateless-http-transport.d.ts +11 -0
- package/dist/server/transport/stateless-http-transport.d.ts.map +1 -0
- package/dist/server/transport/stateless-http-transport.js +172 -0
- package/dist/server/transport/stateless-http-transport.js.map +1 -0
- package/dist/server/transport/stateless-http-transport.test.d.ts +2 -0
- package/dist/server/transport/stateless-http-transport.test.d.ts.map +1 -0
- package/dist/server/transport/stateless-http-transport.test.js +58 -0
- package/dist/server/transport/stateless-http-transport.test.js.map +1 -0
- package/dist/server/transport/stdio-transport.d.ts +12 -0
- package/dist/server/transport/stdio-transport.d.ts.map +1 -0
- package/dist/server/transport/stdio-transport.js +78 -0
- package/dist/server/transport/stdio-transport.js.map +1 -0
- package/dist/server/transport/streamable-http-transport.d.ts +21 -0
- package/dist/server/transport/streamable-http-transport.d.ts.map +1 -0
- package/dist/server/transport/streamable-http-transport.js +220 -0
- package/dist/server/transport/streamable-http-transport.js.map +1 -0
- package/dist/server/transport/transport-factory.d.ts +5 -0
- package/dist/server/transport/transport-factory.d.ts.map +1 -0
- package/dist/server/transport/transport-factory.js +21 -0
- package/dist/server/transport/transport-factory.js.map +1 -0
- package/dist/server/utils/api-metrics.d.ts +15 -0
- package/dist/server/utils/api-metrics.d.ts.map +1 -0
- package/dist/server/utils/api-metrics.js +39 -0
- package/dist/server/utils/api-metrics.js.map +1 -0
- package/dist/server/utils/auth-utils.d.ts +6 -0
- package/dist/server/utils/auth-utils.d.ts.map +1 -0
- package/dist/server/utils/auth-utils.js +25 -0
- package/dist/server/utils/auth-utils.js.map +1 -0
- package/dist/server/utils/browser-detection.d.ts +2 -0
- package/dist/server/utils/browser-detection.d.ts.map +1 -0
- package/dist/server/utils/browser-detection.js +15 -0
- package/dist/server/utils/browser-detection.js.map +1 -0
- package/dist/server/utils/browser-detection.test.d.ts +2 -0
- package/dist/server/utils/browser-detection.test.d.ts.map +1 -0
- package/dist/server/utils/browser-detection.test.js +50 -0
- package/dist/server/utils/browser-detection.test.js.map +1 -0
- package/dist/server/utils/gradio-metrics.d.ts +22 -0
- package/dist/server/utils/gradio-metrics.d.ts.map +1 -0
- package/dist/server/utils/gradio-metrics.js +60 -0
- package/dist/server/utils/gradio-metrics.js.map +1 -0
- package/dist/server/utils/query-params.d.ts +3 -0
- package/dist/server/utils/query-params.d.ts.map +1 -0
- package/dist/server/utils/query-params.js +17 -0
- package/dist/server/utils/query-params.js.map +1 -0
- package/dist/server/utils/query-params.test.d.ts +2 -0
- package/dist/server/utils/query-params.test.d.ts.map +1 -0
- package/dist/server/utils/query-params.test.js +75 -0
- package/dist/server/utils/query-params.test.js.map +1 -0
- package/dist/server/web-server.d.ts +29 -0
- package/dist/server/web-server.d.ts.map +1 -0
- package/dist/server/web-server.js +273 -0
- package/dist/server/web-server.js.map +1 -0
- package/dist/shared/constants.d.ts +5 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +4 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/settings.d.ts +19 -0
- package/dist/shared/settings.d.ts.map +1 -0
- package/dist/shared/settings.js +47 -0
- package/dist/shared/settings.js.map +1 -0
- package/dist/shared/transport-info.d.ts +18 -0
- package/dist/shared/transport-info.d.ts.map +1 -0
- package/dist/shared/transport-info.js +22 -0
- package/dist/shared/transport-info.js.map +1 -0
- package/dist/shared/transport-info.test.d.ts +2 -0
- package/dist/shared/transport-info.test.d.ts.map +1 -0
- package/dist/shared/transport-info.test.js +90 -0
- package/dist/shared/transport-info.test.js.map +1 -0
- package/dist/shared/transport-metrics.d.ts +180 -0
- package/dist/shared/transport-metrics.d.ts.map +1 -0
- package/dist/shared/transport-metrics.js +247 -0
- package/dist/shared/transport-metrics.js.map +1 -0
- package/dist/shared/transport-metrics.test.d.ts +2 -0
- package/dist/shared/transport-metrics.test.d.ts.map +1 -0
- package/dist/shared/transport-metrics.test.js +10 -0
- package/dist/shared/transport-metrics.test.js.map +1 -0
- package/dist/web/assets/button-C4Q2P8Ns.css +1 -0
- package/dist/web/assets/button-DOWMQOme.js +79 -0
- package/dist/web/assets/hf-logo-DbjPOSLw.svg +21 -0
- package/dist/web/assets/main-CB77vUha.js +115 -0
- package/dist/web/assets/mcpWelcome-Cpw1-KJi.js +1 -0
- package/dist/web/hf-logo-DbjPOSLw.svg +21 -0
- package/dist/web/index.html +15 -0
- package/dist/web/mcp-welcome.html +92 -0
- package/package.json +100 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { StatefulTransport } from './base-transport.js';
|
|
2
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { logger } from '../lib/logger.js';
|
|
5
|
+
import { JsonRpcErrors, extractJsonRpcId } from './json-rpc-errors.js';
|
|
6
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { extractQueryParamsToHeaders } from '../utils/query-params.js';
|
|
8
|
+
export class StreamableHttpTransport extends StatefulTransport {
|
|
9
|
+
initialize(_options) {
|
|
10
|
+
this.setupRoutes();
|
|
11
|
+
this.startStaleConnectionCheck();
|
|
12
|
+
this.startPingKeepAlive();
|
|
13
|
+
logger.info('StreamableHTTP transport initialized', {
|
|
14
|
+
heartbeatInterval: this.HEARTBEAT_INTERVAL,
|
|
15
|
+
staleCheckInterval: this.STALE_CHECK_INTERVAL,
|
|
16
|
+
staleTimeout: this.STALE_TIMEOUT,
|
|
17
|
+
pingEnabled: this.PING_ENABLED,
|
|
18
|
+
pingInterval: this.PING_INTERVAL,
|
|
19
|
+
});
|
|
20
|
+
return Promise.resolve();
|
|
21
|
+
}
|
|
22
|
+
setupRoutes() {
|
|
23
|
+
this.app.post('/mcp', (req, res) => {
|
|
24
|
+
this.trackRequest();
|
|
25
|
+
void (async () => {
|
|
26
|
+
await this.handleRequest(req, res, 'POST');
|
|
27
|
+
})();
|
|
28
|
+
});
|
|
29
|
+
this.app.get('/mcp', (req, res) => {
|
|
30
|
+
this.trackRequest();
|
|
31
|
+
void (async () => {
|
|
32
|
+
await this.handleRequest(req, res, 'GET');
|
|
33
|
+
})();
|
|
34
|
+
});
|
|
35
|
+
this.app.delete('/mcp', (req, res) => {
|
|
36
|
+
this.trackRequest();
|
|
37
|
+
void (async () => {
|
|
38
|
+
await this.handleRequest(req, res, 'DELETE');
|
|
39
|
+
})();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async handleRequest(req, res, method) {
|
|
43
|
+
try {
|
|
44
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
45
|
+
if (sessionId && this.sessions.has(sessionId)) {
|
|
46
|
+
this.updateSessionActivity(sessionId);
|
|
47
|
+
}
|
|
48
|
+
switch (method) {
|
|
49
|
+
case 'POST':
|
|
50
|
+
await this.handlePostRequest(req, res, sessionId);
|
|
51
|
+
break;
|
|
52
|
+
case 'GET':
|
|
53
|
+
await this.handleGetRequest(req, res, sessionId);
|
|
54
|
+
break;
|
|
55
|
+
case 'DELETE':
|
|
56
|
+
await this.handleDeleteRequest(req, res, sessionId);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error({ error, method }, 'Request handling error');
|
|
62
|
+
this.trackError(500, error instanceof Error ? error : new Error(String(error)));
|
|
63
|
+
if (!res.headersSent) {
|
|
64
|
+
res.status(500).json(JsonRpcErrors.internalError(extractJsonRpcId(req.body ?? null)));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async handlePostRequest(req, res, sessionId) {
|
|
69
|
+
const trackingName = this.extractMethodForTracking(req.body);
|
|
70
|
+
if (trackingName && sessionId && this.sessions.has(sessionId)) {
|
|
71
|
+
const session = this.sessions.get(sessionId);
|
|
72
|
+
if (session) {
|
|
73
|
+
session.metadata.requestCount++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
if (!sessionId && this.isShuttingDown) {
|
|
78
|
+
this.trackError(503);
|
|
79
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
80
|
+
res.status(503).json(JsonRpcErrors.serverShuttingDown(extractJsonRpcId(req.body)));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
let transport;
|
|
84
|
+
if (sessionId && this.sessions.has(sessionId)) {
|
|
85
|
+
const existingSession = this.sessions.get(sessionId);
|
|
86
|
+
if (!existingSession) {
|
|
87
|
+
this.trackError(404);
|
|
88
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
89
|
+
res.status(404).json(JsonRpcErrors.sessionNotFound(sessionId, extractJsonRpcId(req.body)));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
transport = existingSession.transport;
|
|
93
|
+
}
|
|
94
|
+
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
95
|
+
const headers = req.headers;
|
|
96
|
+
extractQueryParamsToHeaders(req, headers);
|
|
97
|
+
const authResult = await this.validateAuthAndTrackMetrics(headers);
|
|
98
|
+
if (!authResult.shouldContinue) {
|
|
99
|
+
this.trackError(authResult.statusCode || 401);
|
|
100
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
101
|
+
res.set('WWW-Authenticate', 'Bearer resource_metadata="https://huggingface.co/.well-known/oauth-protected-resources/mcp"');
|
|
102
|
+
res.status(authResult.statusCode || 401).send('Unauthorized');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
transport = await this.createSession(headers);
|
|
106
|
+
}
|
|
107
|
+
else if (!sessionId) {
|
|
108
|
+
this.trackError(400);
|
|
109
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
110
|
+
res
|
|
111
|
+
.status(400)
|
|
112
|
+
.json(JsonRpcErrors.invalidRequest(extractJsonRpcId(req.body), 'Missing session ID for non-initialization request'));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.trackError(404);
|
|
117
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
118
|
+
res.status(404).json(JsonRpcErrors.sessionNotFound(sessionId, extractJsonRpcId(req.body)));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
await transport.handleRequest(req, res, req.body);
|
|
122
|
+
this.metrics.trackMethod(trackingName, undefined, false);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async handleGetRequest(req, res, sessionId) {
|
|
130
|
+
if (!sessionId || !this.sessions.has(sessionId)) {
|
|
131
|
+
this.trackError(400);
|
|
132
|
+
res.status(400).json(JsonRpcErrors.sessionNotFound(sessionId || 'missing', null));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const session = this.sessions.get(sessionId);
|
|
136
|
+
if (!session) {
|
|
137
|
+
this.trackError(404);
|
|
138
|
+
res.status(404).json(JsonRpcErrors.sessionNotFound(sessionId, null));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const lastEventId = req.headers['last-event-id'];
|
|
142
|
+
if (lastEventId) {
|
|
143
|
+
logger.warn({ sessionId, lastEventId }, 'Client attempting to result with Last-Event-ID');
|
|
144
|
+
}
|
|
145
|
+
session.activeResponse = res;
|
|
146
|
+
this.startHeartbeat(sessionId, res);
|
|
147
|
+
this.setupSseEventHandlers(sessionId, res);
|
|
148
|
+
await session.transport.handleRequest(req, res);
|
|
149
|
+
}
|
|
150
|
+
async handleDeleteRequest(req, res, sessionId) {
|
|
151
|
+
if (!sessionId || !this.sessions.has(sessionId)) {
|
|
152
|
+
this.trackError(404);
|
|
153
|
+
res.status(404).json(JsonRpcErrors.sessionNotFound(sessionId || 'missing', extractJsonRpcId(req.body)));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
logger.info({ sessionId }, 'Session termination requested');
|
|
157
|
+
const session = this.sessions.get(sessionId);
|
|
158
|
+
if (!session) {
|
|
159
|
+
this.trackError(404);
|
|
160
|
+
res.status(404).json(JsonRpcErrors.sessionNotFound(sessionId, extractJsonRpcId(req.body)));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
await session.transport.handleRequest(req, res, req.body);
|
|
164
|
+
await this.removeSession(sessionId);
|
|
165
|
+
}
|
|
166
|
+
async createSession(requestHeaders) {
|
|
167
|
+
const server = await this.serverFactory(requestHeaders || null);
|
|
168
|
+
const transport = new StreamableHTTPServerTransport({
|
|
169
|
+
sessionIdGenerator: () => randomUUID(),
|
|
170
|
+
onsessioninitialized: (sessionId) => {
|
|
171
|
+
logger.info({ sessionId }, 'Session initialized');
|
|
172
|
+
const session = {
|
|
173
|
+
transport,
|
|
174
|
+
server,
|
|
175
|
+
metadata: {
|
|
176
|
+
id: sessionId,
|
|
177
|
+
connectedAt: new Date(),
|
|
178
|
+
lastActivity: new Date(),
|
|
179
|
+
requestCount: 0,
|
|
180
|
+
capabilities: {},
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
this.sessions.set(sessionId, session);
|
|
184
|
+
this.trackSessionCreated(sessionId);
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
transport.onclose = () => {
|
|
188
|
+
const sessionId = transport.sessionId;
|
|
189
|
+
if (sessionId && this.sessions.has(sessionId)) {
|
|
190
|
+
logger.debug({ sessionId }, 'Transport closed, cleaning up session');
|
|
191
|
+
void this.removeSession(sessionId);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
server.server.onerror = (error) => {
|
|
195
|
+
this.trackError(undefined, error);
|
|
196
|
+
logger.error({ error, sessionId: transport.sessionId }, 'StreamableHTTP server error');
|
|
197
|
+
};
|
|
198
|
+
server.server.oninitialized = () => {
|
|
199
|
+
const sessionId = transport.sessionId;
|
|
200
|
+
if (sessionId) {
|
|
201
|
+
this.createClientInfoCapture(sessionId)();
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
await server.connect(transport);
|
|
205
|
+
return transport;
|
|
206
|
+
}
|
|
207
|
+
async removeSession(sessionId) {
|
|
208
|
+
await this.cleanupSession(sessionId);
|
|
209
|
+
}
|
|
210
|
+
async removeStaleSession(sessionId) {
|
|
211
|
+
logger.info({ sessionId }, 'Removing stale session');
|
|
212
|
+
await this.cleanupSession(sessionId);
|
|
213
|
+
}
|
|
214
|
+
async cleanup() {
|
|
215
|
+
this.stopStaleConnectionCheck();
|
|
216
|
+
await this.cleanupAllSessions();
|
|
217
|
+
logger.info('StreamableHTTP transport cleanup complete');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=streamable-http-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.js","sourceRoot":"","sources":["../../../src/server/transport/streamable-http-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Express } from 'express';
|
|
2
|
+
import { type TransportType } from '../../shared/constants.js';
|
|
3
|
+
import type { BaseTransport, ServerFactory } from './base-transport.js';
|
|
4
|
+
export declare const createTransport: (type: TransportType, serverFactory: ServerFactory, app: Express) => BaseTransport;
|
|
5
|
+
//# sourceMappingURL=transport-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../src/server/transport/transport-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASxE,eAAO,MAAM,eAAe,GAAI,MAAM,aAAa,EAAE,eAAe,aAAa,EAAE,KAAK,OAAO,KAAG,aAajG,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {} from 'express';
|
|
2
|
+
import {} from '../../shared/constants.js';
|
|
3
|
+
import { StdioTransport } from './stdio-transport.js';
|
|
4
|
+
import { SseTransport } from './sse-transport.js';
|
|
5
|
+
import { StreamableHttpTransport } from './streamable-http-transport.js';
|
|
6
|
+
import { StatelessHttpTransport } from './stateless-http-transport.js';
|
|
7
|
+
export const createTransport = (type, serverFactory, app) => {
|
|
8
|
+
switch (type) {
|
|
9
|
+
case 'stdio':
|
|
10
|
+
return new StdioTransport(serverFactory, app);
|
|
11
|
+
case 'sse':
|
|
12
|
+
return new SseTransport(serverFactory, app);
|
|
13
|
+
case 'streamableHttp':
|
|
14
|
+
return new StreamableHttpTransport(serverFactory, app);
|
|
15
|
+
case 'streamableHttpJson':
|
|
16
|
+
return new StatelessHttpTransport(serverFactory, app);
|
|
17
|
+
default:
|
|
18
|
+
throw new Error(`Unsupported transport type: ${type}`);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=transport-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-factory.js","sourceRoot":"","sources":["../../../src/server/transport/transport-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,SAAS,CAAC;AACvC,OAAO,EAAsB,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAKvE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAE,aAA4B,EAAE,GAAY,EAAiB,EAAE;IACjH,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,OAAO;YACX,OAAO,IAAI,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC/C,KAAK,KAAK;YACT,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7C,KAAK,gBAAgB;YACpB,OAAO,IAAI,uBAAuB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACxD,KAAK,oBAAoB;YACxB,OAAO,IAAI,sBAAsB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACvD;YACC,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ApiCallMetrics {
|
|
2
|
+
anonymous: number;
|
|
3
|
+
authenticated: number;
|
|
4
|
+
unauthorized: number;
|
|
5
|
+
forbidden: number;
|
|
6
|
+
}
|
|
7
|
+
declare class ApiMetricsCollector {
|
|
8
|
+
private metrics;
|
|
9
|
+
recordCall(hasToken: boolean, status: number): void;
|
|
10
|
+
getMetrics(): ApiCallMetrics;
|
|
11
|
+
resetMetrics(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare const apiMetrics: ApiMetricsCollector;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=api-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-metrics.d.ts","sourceRoot":"","sources":["../../../src/server/utils/api-metrics.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,cAAM,mBAAmB;IACxB,OAAO,CAAC,OAAO,CAKb;IAOF,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAkBnD,UAAU,IAAI,cAAc;IAO5B,YAAY,IAAI,IAAI;CAQpB;AAGD,eAAO,MAAM,UAAU,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
class ApiMetricsCollector {
|
|
3
|
+
metrics = {
|
|
4
|
+
anonymous: 0,
|
|
5
|
+
authenticated: 0,
|
|
6
|
+
unauthorized: 0,
|
|
7
|
+
forbidden: 0,
|
|
8
|
+
};
|
|
9
|
+
recordCall(hasToken, status) {
|
|
10
|
+
logger.debug(`Recording API call: hasToken=${hasToken}, status=${status}`);
|
|
11
|
+
if (status === 200) {
|
|
12
|
+
if (hasToken) {
|
|
13
|
+
this.metrics.authenticated++;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this.metrics.anonymous++;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else if (status === 401) {
|
|
20
|
+
this.metrics.unauthorized++;
|
|
21
|
+
}
|
|
22
|
+
else if (status === 403) {
|
|
23
|
+
this.metrics.forbidden++;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
getMetrics() {
|
|
27
|
+
return { ...this.metrics };
|
|
28
|
+
}
|
|
29
|
+
resetMetrics() {
|
|
30
|
+
this.metrics = {
|
|
31
|
+
anonymous: 0,
|
|
32
|
+
authenticated: 0,
|
|
33
|
+
unauthorized: 0,
|
|
34
|
+
forbidden: 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const apiMetrics = new ApiMetricsCollector();
|
|
39
|
+
//# sourceMappingURL=api-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-metrics.js","sourceRoot":"","sources":["../../../src/server/utils/api-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAY1C,MAAM,mBAAmB;IAChB,OAAO,GAAmB;QACjC,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;KACZ,CAAC;IAOF,UAAU,CAAC,QAAiB,EAAE,MAAc;QAC3C,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC1B,CAAC;QACF,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,CAAC;IACF,CAAC;IAKD,UAAU;QACT,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAKD,YAAY;QACX,IAAI,CAAC,OAAO,GAAG;YACd,SAAS,EAAE,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;SACZ,CAAC;IACH,CAAC;CACD;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils/auth-utils.ts"],"names":[],"mappings":"AAKA,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG;IACjF,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB,CA+BA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
export function extractAuthBouquetAndMix(headers) {
|
|
3
|
+
let tokenFromHeader;
|
|
4
|
+
let bouquet;
|
|
5
|
+
let mix;
|
|
6
|
+
if (headers) {
|
|
7
|
+
if ('authorization' in headers) {
|
|
8
|
+
const authHeader = headers.authorization || '';
|
|
9
|
+
if (authHeader.startsWith('Bearer ')) {
|
|
10
|
+
tokenFromHeader = authHeader.slice(7).trim();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if ('x-mcp-bouquet' in headers) {
|
|
14
|
+
bouquet = headers['x-mcp-bouquet'];
|
|
15
|
+
logger.info({ bouquet }, 'Bouquet parameter received');
|
|
16
|
+
}
|
|
17
|
+
if ('x-mcp-mix' in headers) {
|
|
18
|
+
mix = headers['x-mcp-mix'];
|
|
19
|
+
logger.info({ mix }, 'Mix parameter received');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const hfToken = tokenFromHeader || process.env.DEFAULT_HF_TOKEN;
|
|
23
|
+
return { hfToken, bouquet, mix };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=auth-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-utils.js","sourceRoot":"","sources":["../../../src/server/utils/auth-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK1C,MAAM,UAAU,wBAAwB,CAAC,OAAsC;IAK9E,IAAI,eAAmC,CAAC;IACxC,IAAI,OAA2B,CAAC;IAChC,IAAI,GAAuB,CAAC;IAE5B,IAAI,OAAO,EAAE,CAAC;QAEb,IAAI,eAAe,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;YAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,CAAC;QACF,CAAC;QAGD,IAAI,eAAe,IAAI,OAAO,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACxD,CAAC;QAGD,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC5B,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAGD,MAAM,OAAO,GAAG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAEhE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-detection.d.ts","sourceRoot":"","sources":["../../../src/server/utils/browser-detection.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,OAAO,CAqBzF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function isBrowser(headers) {
|
|
2
|
+
const acceptHeader = headers['accept'];
|
|
3
|
+
if (!acceptHeader) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
const accept = Array.isArray(acceptHeader) ? acceptHeader.join(',') : acceptHeader;
|
|
7
|
+
if (accept.includes('text/event-stream') || accept.includes('application/json')) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (accept.includes('*/*')) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=browser-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-detection.js","sourceRoot":"","sources":["../../../src/server/utils/browser-detection.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,OAAsD;IAC/E,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAGnF,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACjF,OAAO,KAAK,CAAC;IACd,CAAC;IAGD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACb,CAAC;IAGD,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-detection.test.d.ts","sourceRoot":"","sources":["../../../src/server/utils/browser-detection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isBrowser } from './browser-detection.js';
|
|
3
|
+
describe('isBrowser', () => {
|
|
4
|
+
it('returns false when accept header is missing', () => {
|
|
5
|
+
expect(isBrowser({})).toBe(false);
|
|
6
|
+
expect(isBrowser({ 'user-agent': 'Mozilla/5.0' })).toBe(false);
|
|
7
|
+
});
|
|
8
|
+
it('returns false when accept contains text/event-stream', () => {
|
|
9
|
+
expect(isBrowser({ accept: 'text/event-stream' })).toBe(false);
|
|
10
|
+
expect(isBrowser({ accept: 'text/event-stream, text/html' })).toBe(false);
|
|
11
|
+
});
|
|
12
|
+
it('returns false when accept contains application/json', () => {
|
|
13
|
+
expect(isBrowser({ accept: 'application/json' })).toBe(false);
|
|
14
|
+
expect(isBrowser({ accept: 'application/json, text/plain' })).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
it('returns true when accept contains */*', () => {
|
|
17
|
+
expect(isBrowser({ accept: '*/*' })).toBe(true);
|
|
18
|
+
expect(isBrowser({ accept: 'text/html, */*' })).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it('returns false for other accept headers', () => {
|
|
21
|
+
expect(isBrowser({ accept: 'text/html' })).toBe(false);
|
|
22
|
+
expect(isBrowser({ accept: 'text/plain' })).toBe(false);
|
|
23
|
+
expect(isBrowser({ accept: 'image/png' })).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it('handles array accept headers', () => {
|
|
26
|
+
expect(isBrowser({ accept: ['text/event-stream'] })).toBe(false);
|
|
27
|
+
expect(isBrowser({ accept: ['*/*', 'text/html'] })).toBe(true);
|
|
28
|
+
expect(isBrowser({ accept: ['application/json', 'text/plain'] })).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
it('real browser examples', () => {
|
|
31
|
+
expect(isBrowser({
|
|
32
|
+
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
|
|
33
|
+
})).toBe(true);
|
|
34
|
+
expect(isBrowser({
|
|
35
|
+
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
36
|
+
})).toBe(true);
|
|
37
|
+
expect(isBrowser({
|
|
38
|
+
accept: 'text/event-stream',
|
|
39
|
+
})).toBe(false);
|
|
40
|
+
expect(isBrowser({
|
|
41
|
+
accept: 'text/event-stream',
|
|
42
|
+
})).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
it('API client examples', () => {
|
|
45
|
+
expect(isBrowser({ accept: 'text/event-stream' })).toBe(false);
|
|
46
|
+
expect(isBrowser({ accept: 'application/json' })).toBe(false);
|
|
47
|
+
expect(isBrowser({ accept: 'application/json, text/event-stream' })).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=browser-detection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-detection.test.js","sourceRoot":"","sources":["../../../src/server/utils/browser-detection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface GradioToolMetrics {
|
|
2
|
+
success: number;
|
|
3
|
+
failure: number;
|
|
4
|
+
byTool: Record<string, {
|
|
5
|
+
success: number;
|
|
6
|
+
failure: number;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export declare class GradioMetricsCollector {
|
|
10
|
+
private static instance;
|
|
11
|
+
private metrics;
|
|
12
|
+
private constructor();
|
|
13
|
+
static getInstance(): GradioMetricsCollector;
|
|
14
|
+
recordSuccess(toolName: string): void;
|
|
15
|
+
recordFailure(toolName: string): void;
|
|
16
|
+
getMetrics(): Readonly<GradioToolMetrics>;
|
|
17
|
+
reset(): void;
|
|
18
|
+
getSummary(): string;
|
|
19
|
+
}
|
|
20
|
+
export declare const gradioMetrics: GradioMetricsCollector;
|
|
21
|
+
export declare function getMetricsSafeName(toolName: string): string;
|
|
22
|
+
//# sourceMappingURL=gradio-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradio-metrics.d.ts","sourceRoot":"","sources":["../../../src/server/utils/gradio-metrics.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAEjC,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,CAAC;IAEhB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,qBAAa,sBAAsB;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,OAAO,CAIb;IAEF,OAAO;WAEO,WAAW,IAAI,sBAAsB;IAW5C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiBrC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgBrC,UAAU,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAOzC,KAAK,IAAI,IAAI;IAWb,UAAU,IAAI,MAAM;CAK3B;AAGD,eAAO,MAAM,aAAa,wBAAuC,CAAC;AAUlE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe3D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { GRADIO_PRIVATE_PREFIX } from '../../shared/constants.js';
|
|
3
|
+
export class GradioMetricsCollector {
|
|
4
|
+
static instance;
|
|
5
|
+
metrics = {
|
|
6
|
+
success: 0,
|
|
7
|
+
failure: 0,
|
|
8
|
+
byTool: {},
|
|
9
|
+
};
|
|
10
|
+
constructor() { }
|
|
11
|
+
static getInstance() {
|
|
12
|
+
if (!GradioMetricsCollector.instance) {
|
|
13
|
+
GradioMetricsCollector.instance = new GradioMetricsCollector();
|
|
14
|
+
}
|
|
15
|
+
return GradioMetricsCollector.instance;
|
|
16
|
+
}
|
|
17
|
+
recordSuccess(toolName) {
|
|
18
|
+
this.metrics.success++;
|
|
19
|
+
if (!this.metrics.byTool[toolName]) {
|
|
20
|
+
this.metrics.byTool[toolName] = { success: 0, failure: 0 };
|
|
21
|
+
}
|
|
22
|
+
this.metrics.byTool[toolName].success++;
|
|
23
|
+
}
|
|
24
|
+
recordFailure(toolName) {
|
|
25
|
+
this.metrics.failure++;
|
|
26
|
+
if (!this.metrics.byTool[toolName]) {
|
|
27
|
+
this.metrics.byTool[toolName] = { success: 0, failure: 0 };
|
|
28
|
+
}
|
|
29
|
+
this.metrics.byTool[toolName].failure++;
|
|
30
|
+
}
|
|
31
|
+
getMetrics() {
|
|
32
|
+
return { ...this.metrics, byTool: { ...this.metrics.byTool } };
|
|
33
|
+
}
|
|
34
|
+
reset() {
|
|
35
|
+
this.metrics = {
|
|
36
|
+
success: 0,
|
|
37
|
+
failure: 0,
|
|
38
|
+
byTool: {},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
getSummary() {
|
|
42
|
+
const total = this.metrics.success + this.metrics.failure;
|
|
43
|
+
const successRate = total > 0 ? ((this.metrics.success / total) * 100).toFixed(1) : '0.0';
|
|
44
|
+
return `Gradio Tool Calls - Total: ${total}, Success: ${this.metrics.success}, Failure: ${this.metrics.failure}, Success Rate: ${successRate}%`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export const gradioMetrics = GradioMetricsCollector.getInstance();
|
|
48
|
+
export function getMetricsSafeName(toolName) {
|
|
49
|
+
if (toolName.startsWith(GRADIO_PRIVATE_PREFIX)) {
|
|
50
|
+
const match = toolName.match(/^grp(\d+)_(.*)$/);
|
|
51
|
+
if (match && match[1] && match[2]) {
|
|
52
|
+
const index = match[1];
|
|
53
|
+
const privateName = match[2];
|
|
54
|
+
const hash = createHash('sha256').update(privateName).digest('hex').substring(0, 6);
|
|
55
|
+
return `grp${index}_[private_${hash}]`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return toolName;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=gradio-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradio-metrics.js","sourceRoot":"","sources":["../../../src/server/utils/gradio-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-params.d.ts","sourceRoot":"","sources":["../../../src/server/utils/query-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOvC,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAkB/F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function extractQueryParamsToHeaders(req, headers) {
|
|
2
|
+
const bouquet = req.query.bouquet;
|
|
3
|
+
const mix = req.query.mix;
|
|
4
|
+
const forceauth = req.query.forceauth;
|
|
5
|
+
const login = req.query.login;
|
|
6
|
+
const auth = req.query.auth;
|
|
7
|
+
if (bouquet) {
|
|
8
|
+
headers['x-mcp-bouquet'] = bouquet;
|
|
9
|
+
}
|
|
10
|
+
if (mix) {
|
|
11
|
+
headers['x-mcp-mix'] = mix;
|
|
12
|
+
}
|
|
13
|
+
if (forceauth || login !== undefined || auth !== undefined) {
|
|
14
|
+
headers['x-mcp-force-auth'] = 'true';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=query-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-params.js","sourceRoot":"","sources":["../../../src/server/utils/query-params.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,2BAA2B,CAAC,GAAY,EAAE,OAA+B;IACxF,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAA6B,CAAC;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAyB,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAA+B,CAAC;IAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IAE5B,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC;IACpC,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;IAC5B,CAAC;IAGD,IAAI,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC;IACtC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-params.test.d.ts","sourceRoot":"","sources":["../../../src/server/utils/query-params.test.ts"],"names":[],"mappings":""}
|