@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.
Files changed (34) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +8 -3
  3. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  4. package/dist/server/src/api/web/hub-tools.js +2 -2
  5. package/dist/server/src/api/web/search.d.ts +1 -1
  6. package/dist/server/src/api/web/search.d.ts.map +1 -1
  7. package/dist/server/src/api/web/search.js +18 -16
  8. package/dist/server/src/models/system-tools.constants.d.ts +1 -0
  9. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  10. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  11. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +3 -2
  12. package/dist/server/src/services/hub-tools/index.d.ts +1 -0
  13. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  14. package/dist/server/src/services/hub-tools/index.js +1 -0
  15. package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -1
  16. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  17. package/dist/server/src/services/hub-tools/resource-generator.js +11 -29
  18. package/dist/server/src/services/hub-tools/server-metadata-cache.d.ts +19 -0
  19. package/dist/server/src/services/hub-tools/server-metadata-cache.d.ts.map +1 -0
  20. package/dist/server/src/services/hub-tools/server-metadata-cache.js +117 -0
  21. package/dist/server/src/services/hub-tools/server-selector.d.ts +1 -1
  22. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  23. package/dist/server/src/services/hub-tools/server-selector.js +3 -8
  24. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  25. package/dist/server/src/services/hub-tools/system-tool-definitions.js +8 -1
  26. package/dist/server/src/services/hub-tools.service.d.ts +1 -1
  27. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  28. package/dist/server/src/services/hub-tools.service.js +62 -88
  29. package/dist/server/src/services/system-tool-handler.js +1 -1
  30. package/dist/server/src/utils/search-matcher.d.ts +6 -0
  31. package/dist/server/src/utils/search-matcher.d.ts.map +1 -0
  32. package/dist/server/src/utils/search-matcher.js +24 -0
  33. package/dist/server/tests/unit/services/hub-tools.service.test.js +358 -8
  34. 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. No extra headers needed — Claude Code is detected automatically by UA matching.
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 is detected automatically by UA matching and routed to stateless mode. Stateless mode uses per-request transporteach POST creates an independent transport, no session persistence, GET returns 405.
281
+ CherryStudio requires the `x-mcp-session-mode: stateless` header to use stateless mode. UA matching is NOT automaticit 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,iBAmL/D"}
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 straightforward string matching on tool name and description.
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;AAG1C;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAoD7D"}
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 straightforward string matching on tool name and description.
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 simple string matching
14
+ // GET /web/search - Search for tools with tokenized matching
14
15
  fastify.get('/web/search', async (request) => {
15
- const { q, limit = 50 } = request.query;
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
- // Filter by search query
21
- const queryMatched = gatewayTools.filter((tool) => {
22
+ // Score, filter, sort, and slice by token match count
23
+ const scored = gatewayTools
24
+ .map((tool) => {
22
25
  if (!query)
23
- return true;
24
- // Match against tool name (gateway-resolved name)
25
- const nameMatch = tool.name.toLowerCase().includes(query);
26
- // Match against description (contains "[From serverName] original description")
27
- const descMatch = tool.description?.toLowerCase().includes(query);
28
- return nameMatch || descMatch;
29
- });
30
- const mappedResults = queryMatched.map((tool) => {
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: mappedResults.length,
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;CACf;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
+ {"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,CA6OnE"}
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';
@@ -9,7 +9,7 @@ export interface ServerMetadata {
9
9
  toolsCount: number;
10
10
  tools: Record<string, string>;
11
11
  resourcesCount: number;
12
- tags: Record<string, string>;
12
+ tags: Array<Record<string, string>>;
13
13
  lastHeartbeat: number;
14
14
  uptime: number;
15
15
  description: string;
@@ -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;AAmLlE;;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,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,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,CAyGzD"}
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, selectBestInstance, getServerDescription } from './server-selector.js';
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
- // Use selectBestInstance to get an instance for the list
284
- const serverInfo = selectBestInstance(serverName);
285
- if (!serverInfo) {
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.getTools(serverName, instanceIndex);
290
+ return mcpConnectionManager.getToolsByServerName(serverName);
291
291
  }
292
292
  else {
293
- return mcpConnectionManager.getResources(serverName, instanceIndex);
293
+ return mcpConnectionManager.getResourcesByName(serverName);
294
294
  }
295
295
  }
296
- // Server metadata request - use selectBestInstance to get runtime properties
297
- const serverInfo = selectBestInstance(serverName);
298
- if (!serverInfo) {
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
- const instanceIndex = serverInfo.instance.index;
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, strictMode?: boolean): ServerInstanceInfo | undefined;
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,EAC/B,UAAU,GAAE,OAAc,GACzB,kBAAkB,GAAG,SAAS,CA8ChC"}
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, strictMode = true) {
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
- // In strict mode, re-throw tag matching errors to maintain correct semantics
108
- if (strictMode && error instanceof TagMatchUniqueError) {
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,CAwLvD"}
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 (must be an external server, not mcp-hub-lite)'
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;AAOjE,OAAO,EAEL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,8BAA8B,EAC9B,cAAc,EACd,iBAAiB,EAElB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,6BAA6B,EAC7B,cAAc,EACd,iBAAiB,EAClB,MAAM,mCAAmC,CAAC;AAa3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,eAAe;;IAM1B;;;;;;;;;OASG;IACH,cAAc;IAId;;;;;;;;;OASG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBpD;;;;;;;;;;;OAWG;IACG,iBAAiB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC;QAC9D,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,WAAW,EAAE,CAAC;KACtB,CAAC;IAqDF;;;;;;;;;;OAUG;IACG,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IA+B7D;;;;;;;;;;OAUG;IACG,uBAAuB,CAAC,IAAI,EAAE,6BAA6B,GAAG,OAAO,CAAC;QAC1E,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAkCF;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAC,CAAC;KAC/E,CAAC;IAmBF;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,CAAC,SAAS,cAAc,EAC3C,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,SAAS,OAAO,iBAAiB,GACxC,iBAAiB,GACjB,CAAC,SAAS,OAAO,eAAe,GAC9B,uBAAuB,GACvB,CAAC,SAAS,OAAO,aAAa,GAC5B,aAAa,GACb,CAAC,SAAS,OAAO,cAAc,GAC7B,cAAc,GACd,CAAC,SAAS,OAAO,8BAA8B,GAC7C,6BAA6B,GAC7B,CAAC,SAAS,OAAO,cAAc,GAC7B,cAAc,GACd,CAAC,SAAS,OAAO,iBAAiB,GAChC,iBAAiB,GACjB,KAAK,GACpB,OAAO,CACR,CAAC,SAAS,OAAO,iBAAiB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,CAAC,SAAS,OAAO,eAAe,GAC9B;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,EAAE,CAAA;KAAE,GAC5C,CAAC,SAAS,OAAO,aAAa,GAC5B,IAAI,GAAG,SAAS,GAChB,CAAC,SAAS,OAAO,cAAc,GAC7B,OAAO,GACP,CAAC,SAAS,OAAO,8BAA8B,GAC7C;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAC7D,CAAC,SAAS,OAAO,cAAc,GAC7B;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAC,CAAC;KAC/E,GACD,CAAC,SAAS,OAAO,iBAAiB,GAChC,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC,GAC7D,KAAK,CACtB;IAkFD;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAgTtD;;;;;;;;OAQG;IACG,YAAY,IAAI,OAAO,CAC3B,MAAM,CACJ,MAAM,EACN;QACE,KAAK,EAAE,WAAW,EAAE,CAAC;KACtB,CACF,CACF;IAuCD;;;;;;;;;OASG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC,CAAC;IAgDzE;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAK1C;;;;;;;;;;;;;OAaG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACpC;QACE,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,cAAc,EAAE,MAAM,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,GACD,IAAI,EAAE,GACN,QAAQ,EAAE,GACV,MAAM,CACT;CAkBF;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
1
+ {"version":3,"file":"hub-tools.service.d.ts","sourceRoot":"","sources":["../../../../src/services/hub-tools.service.ts"],"names":[],"mappings":"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"}