@loop_ouroboros/mcp-hub-lite 1.3.1 → 1.3.3
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/CHANGELOG.md +24 -0
- package/README.md +8 -3
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +2 -2
- package/dist/server/src/api/web/search.d.ts +1 -1
- package/dist/server/src/api/web/search.d.ts.map +1 -1
- package/dist/server/src/api/web/search.js +18 -16
- package/dist/server/src/models/system-tools.constants.d.ts +1 -0
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +3 -2
- package/dist/server/src/services/hub-tools/index.d.ts +1 -0
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/index.js +1 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +11 -29
- package/dist/server/src/services/hub-tools/server-metadata-cache.d.ts +19 -0
- package/dist/server/src/services/hub-tools/server-metadata-cache.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/server-metadata-cache.js +117 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts +1 -1
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/server-selector.js +3 -8
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +8 -1
- package/dist/server/src/services/hub-tools.service.d.ts +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +62 -88
- package/dist/server/src/services/system-tool-handler.js +1 -1
- package/dist/server/src/utils/search-matcher.d.ts +6 -0
- package/dist/server/src/utils/search-matcher.d.ts.map +1 -0
- package/dist/server/src/utils/search-matcher.js +24 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +358 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.3.3] - 2026-06-10
|
|
6
|
+
|
|
7
|
+
### Hub
|
|
8
|
+
|
|
9
|
+
- fix tag-match-unique error when reading server-level resources
|
|
10
|
+
- return per-instance tags array instead of merged object
|
|
11
|
+
- remove dead strictMode parameter from server-selector
|
|
12
|
+
- remove L1 fallback in call-tool, route directly to RANDOM
|
|
13
|
+
- remove gateway mode in call-tool, simplify tool validation
|
|
14
|
+
|
|
15
|
+
### Docs
|
|
16
|
+
|
|
17
|
+
- update hub-tools CLAUDE.md with current architecture
|
|
18
|
+
|
|
19
|
+
## [1.3.2] - 2026-06-09
|
|
20
|
+
|
|
21
|
+
### Search
|
|
22
|
+
|
|
23
|
+
- add tokenized multi-delimiter search in search_tools with match-count sorting and configurable result limit per server
|
|
24
|
+
|
|
25
|
+
### Docs
|
|
26
|
+
|
|
27
|
+
- clarify stateless mode requires header matching, UA detection is manual
|
|
28
|
+
|
|
5
29
|
## [1.3.1] - 2026-05-31
|
|
6
30
|
|
|
7
31
|
### Gateway
|
package/README.md
CHANGED
|
@@ -257,7 +257,7 @@ To connect your MCP client to MCP-HUB-LITE, add the following to your client's M
|
|
|
257
257
|
}
|
|
258
258
|
```
|
|
259
259
|
|
|
260
|
-
Stateful mode provides session persistence, SSE streaming, and real-time notifications.
|
|
260
|
+
Stateful mode provides session persistence, SSE streaming, and real-time notifications. UA matching is NOT automatic — it requires manually adding `"ClaudeCode"` to `system.session.sessionModeRules.stateful` in `.mcp-hub.json`. Standard MCP clients like Claude Code work with the default stateful mode without extra configuration.
|
|
261
261
|
|
|
262
262
|
</details>
|
|
263
263
|
|
|
@@ -269,13 +269,18 @@ Stateful mode provides session persistence, SSE streaming, and real-time notific
|
|
|
269
269
|
"mcpServers": {
|
|
270
270
|
"mcp-hub-lite": {
|
|
271
271
|
"type": "http",
|
|
272
|
-
"url": "http://localhost:7788/mcp"
|
|
272
|
+
"url": "http://localhost:7788/mcp",
|
|
273
|
+
"headers": {
|
|
274
|
+
"x-mcp-session-mode": "stateless"
|
|
275
|
+
}
|
|
273
276
|
}
|
|
274
277
|
}
|
|
275
278
|
}
|
|
276
279
|
```
|
|
277
280
|
|
|
278
|
-
CherryStudio
|
|
281
|
+
CherryStudio requires the `x-mcp-session-mode: stateless` header to use stateless mode. UA matching is NOT automatic — it requires manually adding `"CherryStudio"` to `system.session.sessionModeRules.stateless` in `.mcp-hub.json`. The header approach is the recommended way and takes highest priority.
|
|
282
|
+
|
|
283
|
+
Stateless mode uses per-request transport — each POST creates an independent transport, no session persistence, GET returns 405.
|
|
279
284
|
|
|
280
285
|
</details>
|
|
281
286
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/hub-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAqB1C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/hub-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAqB1C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAsL/D"}
|
|
@@ -168,13 +168,13 @@ export async function webHubToolsRoutes(fastify) {
|
|
|
168
168
|
});
|
|
169
169
|
// GET /web/hub-tools/search - Search tools across all connected servers
|
|
170
170
|
fastify.get('/web/hub-tools/search', async (request, reply) => {
|
|
171
|
-
const { q } = request.query;
|
|
171
|
+
const { q, limit } = request.query;
|
|
172
172
|
if (!q || typeof q !== 'string' || q.trim().length === 0) {
|
|
173
173
|
return reply.code(400).send({
|
|
174
174
|
error: 'Bad Request',
|
|
175
175
|
message: 'Query parameter "q" is required'
|
|
176
176
|
});
|
|
177
177
|
}
|
|
178
|
-
return hubToolsService.searchTools(q.trim());
|
|
178
|
+
return hubToolsService.searchTools(q.trim(), limit);
|
|
179
179
|
});
|
|
180
180
|
}
|
|
@@ -4,7 +4,7 @@ import { FastifyInstance } from 'fastify';
|
|
|
4
4
|
*
|
|
5
5
|
* Returns aggregated tools from the gateway cache with wrapped inputSchema
|
|
6
6
|
* (including serverName, toolName, toolArgs, and requestOptions fields).
|
|
7
|
-
* Uses
|
|
7
|
+
* Uses tokenized matching on tool name and description, sorted by match count.
|
|
8
8
|
*
|
|
9
9
|
* @param fastify - The Fastify instance to register routes on
|
|
10
10
|
* @returns Promise that resolves when all routes are registered
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAoD7D"}
|
|
@@ -1,33 +1,36 @@
|
|
|
1
1
|
import { MCP_HUB_LITE_SERVER } from '../../../shared/models/constants.js';
|
|
2
|
+
import { countMatchingTokens } from '../../utils/search-matcher.js';
|
|
2
3
|
/**
|
|
3
4
|
* Tool Search API Routes
|
|
4
5
|
*
|
|
5
6
|
* Returns aggregated tools from the gateway cache with wrapped inputSchema
|
|
6
7
|
* (including serverName, toolName, toolArgs, and requestOptions fields).
|
|
7
|
-
* Uses
|
|
8
|
+
* Uses tokenized matching on tool name and description, sorted by match count.
|
|
8
9
|
*
|
|
9
10
|
* @param fastify - The Fastify instance to register routes on
|
|
10
11
|
* @returns Promise that resolves when all routes are registered
|
|
11
12
|
*/
|
|
12
13
|
export async function webSearchRoutes(fastify) {
|
|
13
|
-
// GET /web/search - Search for tools with
|
|
14
|
+
// GET /web/search - Search for tools with tokenized matching
|
|
14
15
|
fastify.get('/web/search', async (request) => {
|
|
15
|
-
const { q, limit =
|
|
16
|
+
const { q, limit = 5 } = request.query;
|
|
17
|
+
const effectiveLimit = Math.min(Math.max(1, limit), 10);
|
|
16
18
|
// Dynamic import to avoid circular dependency at module init time
|
|
17
19
|
const { getExternalGatewayTools } = await import('../../services/gateway/tool-list-generator.js');
|
|
18
20
|
const gatewayTools = getExternalGatewayTools();
|
|
19
21
|
const query = q?.toLowerCase() || '';
|
|
20
|
-
//
|
|
21
|
-
const
|
|
22
|
+
// Score, filter, sort, and slice by token match count
|
|
23
|
+
const scored = gatewayTools
|
|
24
|
+
.map((tool) => {
|
|
22
25
|
if (!query)
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
26
|
+
return { tool, matchCount: Number.MAX_SAFE_INTEGER };
|
|
27
|
+
const matchCount = countMatchingTokens(query, [tool.name, tool.description || '']);
|
|
28
|
+
return { tool, matchCount };
|
|
29
|
+
})
|
|
30
|
+
.filter((item) => item.matchCount > 0)
|
|
31
|
+
.sort((a, b) => b.matchCount - a.matchCount)
|
|
32
|
+
.slice(0, effectiveLimit);
|
|
33
|
+
const results = scored.map(({ tool }) => {
|
|
31
34
|
// Extract serverName from description format "[From serverName] ..."
|
|
32
35
|
const descMatch = tool.description?.match(/^\[From\s+(.+?)\]/);
|
|
33
36
|
const serverName = descMatch ? descMatch[1] : MCP_HUB_LITE_SERVER;
|
|
@@ -38,12 +41,11 @@ export async function webSearchRoutes(fastify) {
|
|
|
38
41
|
inputSchema: tool.inputSchema
|
|
39
42
|
};
|
|
40
43
|
});
|
|
41
|
-
const results = mappedResults.slice(0, limit);
|
|
42
44
|
return {
|
|
43
45
|
results,
|
|
44
46
|
pagination: {
|
|
45
|
-
total:
|
|
46
|
-
limit,
|
|
47
|
+
total: results.length,
|
|
48
|
+
limit: effectiveLimit,
|
|
47
49
|
returned: results.length
|
|
48
50
|
},
|
|
49
51
|
metadata: {
|
|
@@ -37,6 +37,7 @@ export interface ListTagsParams {
|
|
|
37
37
|
}
|
|
38
38
|
export interface SearchToolsParams {
|
|
39
39
|
query: string;
|
|
40
|
+
limit?: number;
|
|
40
41
|
}
|
|
41
42
|
export type SystemToolArgs = ListServersParams | ListToolsInServerParams | GetToolParams | CallToolParams | UpdateServerDescriptionParams | ListTagsParams | SearchToolsParams;
|
|
42
43
|
export declare const LIST_SERVERS_TOOL = "list_servers";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tools.constants.d.ts","sourceRoot":"","sources":["../../../../src/models/system-tools.constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"system-tools.constants.d.ts","sourceRoot":"","sources":["../../../../src/models/system-tools.constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,aAAa,GACb,cAAc,GACd,6BAA6B,GAC7B,cAAc,GACd,iBAAiB,CAAC;AAGtB,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAChD,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAC1E,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,4HAQpB,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGhE;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tools-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/system-tools-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"system-tools-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/system-tools-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8OnE"}
|
|
@@ -223,14 +223,15 @@ export function registerSystemToolsHandlers(server) {
|
|
|
223
223
|
const SearchToolsRequestSchema = z.object({
|
|
224
224
|
method: z.literal(SEARCH_TOOLS_TOOL),
|
|
225
225
|
params: z.object({
|
|
226
|
-
query: z.string()
|
|
226
|
+
query: z.string(),
|
|
227
|
+
limit: z.number().int().min(1).max(10).optional()
|
|
227
228
|
}),
|
|
228
229
|
id: z.union([z.string(), z.number()]),
|
|
229
230
|
jsonrpc: z.literal('2.0')
|
|
230
231
|
});
|
|
231
232
|
server.server.setRequestHandler(SearchToolsRequestSchema, async (request) => {
|
|
232
233
|
try {
|
|
233
|
-
const result = await hubToolsService.searchTools(request.params.query);
|
|
234
|
+
const result = await hubToolsService.searchTools(request.params.query, request.params.limit);
|
|
234
235
|
return result;
|
|
235
236
|
}
|
|
236
237
|
catch (error) {
|
|
@@ -5,4 +5,5 @@ export { getSystemTools } from './system-tool-definitions.js';
|
|
|
5
5
|
export type { ToolAnnotations, SystemToolDefinition } from './system-tool-definitions.js';
|
|
6
6
|
export { generateDynamicResources, readResource } from './resource-generator.js';
|
|
7
7
|
export type { ServerMetadata } from './resource-generator.js';
|
|
8
|
+
export { serverMetadataCache } from './server-metadata-cache.js';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG3E,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG3E,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -3,3 +3,4 @@ export { HubToolsService, hubToolsService } from '../hub-tools.service.js';
|
|
|
3
3
|
export { hasValidId, selectBestInstance, getServerDescription } from './server-selector.js';
|
|
4
4
|
export { getSystemTools } from './system-tool-definitions.js';
|
|
5
5
|
export { generateDynamicResources, readResource } from './resource-generator.js';
|
|
6
|
+
export { serverMetadataCache } from './server-metadata-cache.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-generator.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/resource-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-generator.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/resource-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAoLlE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,IAAI,QAAQ,EAAE,CAqErD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,QAAQ,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAkFzD"}
|
|
@@ -3,7 +3,8 @@ import { dirname, join } from 'path';
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import { hubManager } from '../hub-manager.service.js';
|
|
5
5
|
import { mcpConnectionManager } from '../connection/index.js';
|
|
6
|
-
import { hasValidId,
|
|
6
|
+
import { hasValidId, getServerDescription } from './server-selector.js';
|
|
7
|
+
import { serverMetadataCache } from './server-metadata-cache.js';
|
|
7
8
|
/**
|
|
8
9
|
* Maps Hub URI to original MCP URI for resource forwarding.
|
|
9
10
|
* Key: Hub URI (e.g., "hub://servers/exa-ai/0/tools/list")
|
|
@@ -280,43 +281,24 @@ export async function readResource(uri, language) {
|
|
|
280
281
|
if (instanceIndex === undefined) {
|
|
281
282
|
// Handle list requests first
|
|
282
283
|
if (listType) {
|
|
283
|
-
//
|
|
284
|
-
const
|
|
285
|
-
if (!
|
|
284
|
+
// Read from aggregated cache for server-level list queries
|
|
285
|
+
const metadata = serverMetadataCache.get(serverName);
|
|
286
|
+
if (!metadata) {
|
|
286
287
|
throw new Error(`Server not found or not connected: ${serverName}`);
|
|
287
288
|
}
|
|
288
|
-
const instanceIndex = serverInfo.instance.index;
|
|
289
289
|
if (listType === 'tools') {
|
|
290
|
-
return mcpConnectionManager.
|
|
290
|
+
return mcpConnectionManager.getToolsByServerName(serverName);
|
|
291
291
|
}
|
|
292
292
|
else {
|
|
293
|
-
return mcpConnectionManager.
|
|
293
|
+
return mcpConnectionManager.getResourcesByName(serverName);
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
|
-
// Server metadata request
|
|
297
|
-
const
|
|
298
|
-
if (!
|
|
296
|
+
// Server metadata request — read from aggregated cache (no instance selection needed)
|
|
297
|
+
const metadata = serverMetadataCache.get(serverName);
|
|
298
|
+
if (!metadata) {
|
|
299
299
|
throw new Error(`Server not found or not connected: ${serverName}`);
|
|
300
300
|
}
|
|
301
|
-
|
|
302
|
-
const tools = mcpConnectionManager.getTools(serverName, instanceIndex);
|
|
303
|
-
const resources = mcpConnectionManager.getResources(serverName, instanceIndex);
|
|
304
|
-
// Build tool name to description map
|
|
305
|
-
const toolsMap = {};
|
|
306
|
-
for (const tool of tools) {
|
|
307
|
-
toolsMap[tool.name] = tool.description || '';
|
|
308
|
-
}
|
|
309
|
-
return {
|
|
310
|
-
name: serverName,
|
|
311
|
-
status: serverInfo.instance.status,
|
|
312
|
-
toolsCount: tools.length,
|
|
313
|
-
tools: toolsMap,
|
|
314
|
-
resourcesCount: resources.length,
|
|
315
|
-
tags: serverInfo.instance.tags || {},
|
|
316
|
-
lastHeartbeat: serverInfo.instance.lastHeartbeat,
|
|
317
|
-
uptime: serverInfo.instance.uptime,
|
|
318
|
-
description: getServerDescription(serverConfig, serverName)
|
|
319
|
-
};
|
|
301
|
+
return metadata;
|
|
320
302
|
}
|
|
321
303
|
// MCP native resource forwarding: hub://servers/{name}/{instanceIndex}/{mcpPath}
|
|
322
304
|
// Find the specific instance by index
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ServerMetadata } from './resource-generator.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cached server-level metadata aggregated across all connected instances.
|
|
4
|
+
* Updated reactively via EventBus subscriptions — no I/O, all synchronous cache lookups.
|
|
5
|
+
*/
|
|
6
|
+
declare class ServerMetadataCache {
|
|
7
|
+
private cache;
|
|
8
|
+
private unsubscribers;
|
|
9
|
+
private initialized;
|
|
10
|
+
initialize(): void;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
get(serverName: string): ServerMetadata | undefined;
|
|
13
|
+
refresh(serverName: string): void;
|
|
14
|
+
refreshAll(): void;
|
|
15
|
+
private buildMetadata;
|
|
16
|
+
}
|
|
17
|
+
export declare const serverMetadataCache: ServerMetadataCache;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=server-metadata-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-metadata-cache.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/server-metadata-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAO9D;;;GAGG;AACH,cAAM,mBAAmB;IACvB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,WAAW,CAAS;IAE5B,UAAU,IAAI,IAAI;IA4BlB,OAAO,IAAI,IAAI;IASf,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAYnD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IASjC,UAAU,IAAI,IAAI;IASlB,OAAO,CAAC,aAAa;CAkDtB;AAED,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { hubManager } from '../hub-manager.service.js';
|
|
2
|
+
import { mcpConnectionManager } from '../connection/index.js';
|
|
3
|
+
import { eventBus, EventTypes } from '../event-bus.service.js';
|
|
4
|
+
import { getServerDescription } from './server-selector.js';
|
|
5
|
+
/**
|
|
6
|
+
* Cached server-level metadata aggregated across all connected instances.
|
|
7
|
+
* Updated reactively via EventBus subscriptions — no I/O, all synchronous cache lookups.
|
|
8
|
+
*/
|
|
9
|
+
class ServerMetadataCache {
|
|
10
|
+
cache = new Map();
|
|
11
|
+
unsubscribers = [];
|
|
12
|
+
initialized = false;
|
|
13
|
+
initialize() {
|
|
14
|
+
if (this.initialized)
|
|
15
|
+
return;
|
|
16
|
+
this.initialized = true;
|
|
17
|
+
this.unsubscribers.push(eventBus.subscribe(EventTypes.SERVER_CONNECTED, (data) => {
|
|
18
|
+
this.refresh(data.serverName);
|
|
19
|
+
}));
|
|
20
|
+
this.unsubscribers.push(eventBus.subscribe(EventTypes.SERVER_DISCONNECTED, (data) => {
|
|
21
|
+
this.refresh(data.serverName);
|
|
22
|
+
}));
|
|
23
|
+
this.unsubscribers.push(eventBus.subscribe(EventTypes.TOOLS_UPDATED, (data) => {
|
|
24
|
+
this.refresh(data.serverName);
|
|
25
|
+
}));
|
|
26
|
+
this.unsubscribers.push(eventBus.subscribe(EventTypes.RESOURCES_UPDATED, (data) => {
|
|
27
|
+
this.refresh(data.serverName);
|
|
28
|
+
}));
|
|
29
|
+
// Cache populates lazily on first get() — avoids init-order issues in tests
|
|
30
|
+
}
|
|
31
|
+
destroy() {
|
|
32
|
+
for (const unsub of this.unsubscribers) {
|
|
33
|
+
unsub();
|
|
34
|
+
}
|
|
35
|
+
this.unsubscribers = [];
|
|
36
|
+
this.cache.clear();
|
|
37
|
+
this.initialized = false;
|
|
38
|
+
}
|
|
39
|
+
get(serverName) {
|
|
40
|
+
// Lazy build on first access — no pre-population needed
|
|
41
|
+
if (!this.cache.has(serverName)) {
|
|
42
|
+
const metadata = this.buildMetadata(serverName);
|
|
43
|
+
if (metadata) {
|
|
44
|
+
this.cache.set(serverName, metadata);
|
|
45
|
+
}
|
|
46
|
+
return metadata;
|
|
47
|
+
}
|
|
48
|
+
return this.cache.get(serverName);
|
|
49
|
+
}
|
|
50
|
+
refresh(serverName) {
|
|
51
|
+
const metadata = this.buildMetadata(serverName);
|
|
52
|
+
if (metadata) {
|
|
53
|
+
this.cache.set(serverName, metadata);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.cache.delete(serverName);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
refreshAll() {
|
|
60
|
+
const servers = hubManager.getAllServers();
|
|
61
|
+
for (const server of servers) {
|
|
62
|
+
if (server.name) {
|
|
63
|
+
this.refresh(server.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
buildMetadata(serverName) {
|
|
68
|
+
const serverConfig = hubManager.getServerByName(serverName);
|
|
69
|
+
if (!serverConfig)
|
|
70
|
+
return undefined;
|
|
71
|
+
const connectedIndexes = mcpConnectionManager.getConnectedIndexes(serverName);
|
|
72
|
+
if (connectedIndexes.length === 0)
|
|
73
|
+
return undefined;
|
|
74
|
+
// Aggregate tools across all instances (ToolCache already deduplicates by name)
|
|
75
|
+
const tools = mcpConnectionManager.getToolsByServerName(serverName) || [];
|
|
76
|
+
const toolsMap = {};
|
|
77
|
+
for (const tool of tools) {
|
|
78
|
+
toolsMap[tool.name] = tool.description || '';
|
|
79
|
+
}
|
|
80
|
+
// Aggregate resources across all instances
|
|
81
|
+
const resources = mcpConnectionManager.getResourcesByName(serverName) || [];
|
|
82
|
+
// Collect tags from all connected instances
|
|
83
|
+
const tags = [];
|
|
84
|
+
const instances = hubManager.getServerInstancesByName(serverName);
|
|
85
|
+
for (const instance of instances) {
|
|
86
|
+
if (instance.index !== undefined && connectedIndexes.includes(instance.index)) {
|
|
87
|
+
tags.push(instance.tags || {});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Aggregate heartbeat (max) and uptime (min startTime) across instances
|
|
91
|
+
let lastHeartbeat = 0;
|
|
92
|
+
let uptime = Infinity;
|
|
93
|
+
for (const idx of connectedIndexes) {
|
|
94
|
+
const status = mcpConnectionManager.getStatus(serverName, idx);
|
|
95
|
+
if (status) {
|
|
96
|
+
if (status.lastCheck > lastHeartbeat)
|
|
97
|
+
lastHeartbeat = status.lastCheck;
|
|
98
|
+
if (status.startTime && status.startTime < uptime)
|
|
99
|
+
uptime = status.startTime;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (uptime === Infinity)
|
|
103
|
+
uptime = 0;
|
|
104
|
+
return {
|
|
105
|
+
name: serverName,
|
|
106
|
+
status: 'online',
|
|
107
|
+
toolsCount: tools.length,
|
|
108
|
+
tools: toolsMap,
|
|
109
|
+
resourcesCount: resources.length,
|
|
110
|
+
tags,
|
|
111
|
+
lastHeartbeat,
|
|
112
|
+
uptime,
|
|
113
|
+
description: getServerDescription(serverConfig, serverName)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export const serverMetadataCache = new ServerMetadataCache();
|
|
@@ -72,5 +72,5 @@ export declare function hasValidId(server: unknown): server is ValidServer;
|
|
|
72
72
|
* const serverInfoNonStrict = selectBestInstance('my-mcp-server', undefined, false);
|
|
73
73
|
* ```
|
|
74
74
|
*/
|
|
75
|
-
export declare function selectBestInstance(serverName: string, requestOptions?: RequestOptions
|
|
75
|
+
export declare function selectBestInstance(serverName: string, requestOptions?: RequestOptions): ServerInstanceInfo | undefined;
|
|
76
76
|
//# sourceMappingURL=server-selector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-selector.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/server-selector.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,EACjE,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,WAAW,CAMjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"server-selector.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/server-selector.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,EACjE,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,WAAW,CAMjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,cAAc,GAC9B,kBAAkB,GAAG,SAAS,CAyChC"}
|
|
@@ -80,19 +80,16 @@ export function hasValidId(server) {
|
|
|
80
80
|
* const serverInfoNonStrict = selectBestInstance('my-mcp-server', undefined, false);
|
|
81
81
|
* ```
|
|
82
82
|
*/
|
|
83
|
-
export function selectBestInstance(serverName, requestOptions
|
|
84
|
-
// Get all instances of the server
|
|
83
|
+
export function selectBestInstance(serverName, requestOptions) {
|
|
85
84
|
const instances = hubManager.getServerInstancesByName(serverName);
|
|
86
85
|
if (instances.length === 0) {
|
|
87
86
|
return undefined;
|
|
88
87
|
}
|
|
89
|
-
// Get server configuration
|
|
90
88
|
const serverConfig = hubManager.getServerByName(serverName);
|
|
91
89
|
if (!serverConfig) {
|
|
92
90
|
return undefined;
|
|
93
91
|
}
|
|
94
92
|
try {
|
|
95
|
-
// Use the new instance selector
|
|
96
93
|
const selectedInstance = InstanceSelector.selectInstance(serverName, serverConfig, requestOptions);
|
|
97
94
|
if (!selectedInstance) {
|
|
98
95
|
return undefined;
|
|
@@ -104,12 +101,10 @@ export function selectBestInstance(serverName, requestOptions, strictMode = true
|
|
|
104
101
|
};
|
|
105
102
|
}
|
|
106
103
|
catch (error) {
|
|
107
|
-
//
|
|
108
|
-
if (
|
|
109
|
-
// Re-throw with server context added to message
|
|
104
|
+
// Re-throw tag matching errors with server context
|
|
105
|
+
if (error instanceof TagMatchUniqueError) {
|
|
110
106
|
throw new Error(`[${serverName}] ${error.message}`);
|
|
111
107
|
}
|
|
112
|
-
// Handle other errors or non-strict mode gracefully
|
|
113
108
|
logger.error(`Instance selection failed for server ${serverName}:`, error, LOG_MODULES.SERVER_SELECTOR);
|
|
114
109
|
return undefined;
|
|
115
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tool-definitions.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/system-tool-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAY/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"system-tool-definitions.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/system-tool-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAY/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,EAAE,CAgMvD"}
|
|
@@ -111,7 +111,7 @@ export function getSystemTools() {
|
|
|
111
111
|
properties: {
|
|
112
112
|
serverName: {
|
|
113
113
|
type: 'string',
|
|
114
|
-
description: 'Name of the MCP server (
|
|
114
|
+
description: 'Name of the target MCP server. Use the exact server name from list_servers results. If you already know the server name (e.g., from previous list_tools or search_tools calls), call directly without re-searching.'
|
|
115
115
|
},
|
|
116
116
|
toolName: { type: 'string', description: 'Name of the tool to call' },
|
|
117
117
|
toolArgs: { type: 'object', description: 'Arguments to pass to the tool' },
|
|
@@ -185,6 +185,13 @@ export function getSystemTools() {
|
|
|
185
185
|
query: {
|
|
186
186
|
type: 'string',
|
|
187
187
|
description: 'Search query to match against tool names and descriptions'
|
|
188
|
+
},
|
|
189
|
+
limit: {
|
|
190
|
+
type: 'integer',
|
|
191
|
+
description: 'Maximum number of results to return per server (1-10, default 5)',
|
|
192
|
+
minimum: 1,
|
|
193
|
+
maximum: 10,
|
|
194
|
+
default: 5
|
|
188
195
|
}
|
|
189
196
|
},
|
|
190
197
|
required: ['query']
|
|
@@ -202,7 +202,7 @@ export declare class HubToolsService {
|
|
|
202
202
|
* @returns {Promise<Record<string, { description: string; tools: ToolSummary[] }>>}
|
|
203
203
|
* Object mapping server names to their descriptions and matching tools
|
|
204
204
|
*/
|
|
205
|
-
searchTools(query: string): Promise<Record<string, {
|
|
205
|
+
searchTools(query: string, limit?: number): Promise<Record<string, {
|
|
206
206
|
description: string;
|
|
207
207
|
tools: ToolSummary[];
|
|
208
208
|
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-tools.service.d.ts","sourceRoot":"","sources":["../../../../src/services/hub-tools.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"hub-tools.service.d.ts","sourceRoot":"","sources":["../../../../src/services/hub-tools.service.ts"],"names":[],"mappings":"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"}
|