@miller-tech/uap 1.3.5 → 1.4.0
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/dist/bin/cli.js +285 -120
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -3
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/task.js +9 -3
- package/dist/cli/task.js.map +1 -1
- package/dist/coordination/service.d.ts.map +1 -1
- package/dist/coordination/service.js +4 -1
- package/dist/coordination/service.js.map +1 -1
- package/dist/mcp-router/executor/client.d.ts.map +1 -1
- package/dist/mcp-router/executor/client.js +21 -4
- package/dist/mcp-router/executor/client.js.map +1 -1
- package/dist/mcp-router/output-compressor.d.ts.map +1 -1
- package/dist/mcp-router/output-compressor.js +147 -26
- package/dist/mcp-router/output-compressor.js.map +1 -1
- package/dist/mcp-router/search/fuzzy.d.ts +1 -0
- package/dist/mcp-router/search/fuzzy.d.ts.map +1 -1
- package/dist/mcp-router/search/fuzzy.js +16 -6
- package/dist/mcp-router/search/fuzzy.js.map +1 -1
- package/dist/mcp-router/server.d.ts +5 -2
- package/dist/mcp-router/server.d.ts.map +1 -1
- package/dist/mcp-router/server.js +122 -29
- package/dist/mcp-router/server.js.map +1 -1
- package/dist/memory/knowledge-graph.d.ts +2 -1
- package/dist/memory/knowledge-graph.d.ts.map +1 -1
- package/dist/memory/knowledge-graph.js +56 -33
- package/dist/memory/knowledge-graph.js.map +1 -1
- package/dist/policies/policy-gate.d.ts +14 -1
- package/dist/policies/policy-gate.d.ts.map +1 -1
- package/dist/policies/policy-gate.js +129 -12
- package/dist/policies/policy-gate.js.map +1 -1
- package/dist/policies/schemas/policy.d.ts +2 -2
- package/dist/tasks/service.d.ts +7 -2
- package/dist/tasks/service.d.ts.map +1 -1
- package/dist/tasks/service.js +90 -18
- package/dist/tasks/service.js.map +1 -1
- package/dist/tasks/types.d.ts +8 -0
- package/dist/tasks/types.d.ts.map +1 -1
- package/dist/tasks/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/mcp-router/executor/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AAiBzD,MAAM,OAAO,SAAS;IACZ,OAAO,GAAwB,IAAI,CAAC;IACpC,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/mcp-router/executor/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-compressor.d.ts","sourceRoot":"","sources":["../../src/mcp-router/output-compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,gBAAgB,
|
|
1
|
+
{"version":3,"file":"output-compressor.d.ts","sourceRoot":"","sources":["../../src/mcp-router/output-compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,gBAAgB,CA+DlB"}
|
|
@@ -16,6 +16,21 @@ const MAX_SNIPPETS = 3;
|
|
|
16
16
|
*/
|
|
17
17
|
export function compressToolOutput(result, options = {}) {
|
|
18
18
|
const { maxBytes = DEFAULT_MAX_BYTES, intent } = options;
|
|
19
|
+
// Guard against null/undefined results that would produce "null"/"undefined" strings
|
|
20
|
+
// or crash Buffer.byteLength. Normalize to a meaningful empty response.
|
|
21
|
+
if (result === null || result === undefined) {
|
|
22
|
+
const placeholder = '(no output)';
|
|
23
|
+
const placeholderBytes = Buffer.byteLength(placeholder, 'utf-8');
|
|
24
|
+
return {
|
|
25
|
+
output: placeholder,
|
|
26
|
+
stats: {
|
|
27
|
+
originalBytes: 0,
|
|
28
|
+
compressedBytes: placeholderBytes,
|
|
29
|
+
savings: '0%',
|
|
30
|
+
method: 'passthrough',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
19
34
|
const serialized = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
20
35
|
const originalBytes = Buffer.byteLength(serialized, 'utf-8');
|
|
21
36
|
// Small output: pass through
|
|
@@ -84,13 +99,15 @@ function indexAndSearch(content, intent) {
|
|
|
84
99
|
insertMany(chunks.map((c, i) => ({ content: c, index: i })));
|
|
85
100
|
// Search with BM25 ranking
|
|
86
101
|
const sanitizedIntent = sanitizeFTS5Query(intent);
|
|
87
|
-
const results = db
|
|
102
|
+
const results = db
|
|
103
|
+
.prepare(`
|
|
88
104
|
SELECT content, rank
|
|
89
105
|
FROM output_fts
|
|
90
106
|
WHERE output_fts MATCH ?
|
|
91
107
|
ORDER BY rank
|
|
92
108
|
LIMIT ?
|
|
93
|
-
`)
|
|
109
|
+
`)
|
|
110
|
+
.all(sanitizedIntent, MAX_SNIPPETS);
|
|
94
111
|
// Extract vocabulary from all chunks for follow-up queries
|
|
95
112
|
const vocabulary = extractVocabulary(chunks);
|
|
96
113
|
if (results.length === 0) {
|
|
@@ -102,7 +119,7 @@ function indexAndSearch(content, intent) {
|
|
|
102
119
|
// Nothing matched, fall back to truncation
|
|
103
120
|
return smartTruncate(content, DEFAULT_MAX_BYTES);
|
|
104
121
|
}
|
|
105
|
-
const snippets = results.map(r => r.content);
|
|
122
|
+
const snippets = results.map((r) => r.content);
|
|
106
123
|
return formatIndexedResponse(snippets, vocabulary, chunks.length, content.length);
|
|
107
124
|
}
|
|
108
125
|
catch {
|
|
@@ -116,9 +133,7 @@ function indexAndSearch(content, intent) {
|
|
|
116
133
|
function formatIndexedResponse(snippets, vocabulary, totalChunks, totalBytes) {
|
|
117
134
|
const header = `[Indexed ${totalChunks} sections from ${formatBytes(totalBytes)} output — showing ${snippets.length} matching sections]`;
|
|
118
135
|
const body = snippets.map((s, i) => `--- Match ${i + 1} ---\n${s}`).join('\n\n');
|
|
119
|
-
const footer = vocabulary.length > 0
|
|
120
|
-
? `\n[Searchable terms: ${vocabulary.slice(0, 20).join(', ')}]`
|
|
121
|
-
: '';
|
|
136
|
+
const footer = vocabulary.length > 0 ? `\n[Searchable terms: ${vocabulary.slice(0, 20).join(', ')}]` : '';
|
|
122
137
|
return `${header}\n\n${body}${footer}`;
|
|
123
138
|
}
|
|
124
139
|
/**
|
|
@@ -160,26 +175,35 @@ function chunkByStructure(content) {
|
|
|
160
175
|
const lines = content.split('\n');
|
|
161
176
|
const chunkSize = Math.max(10, Math.ceil(lines.length / 20));
|
|
162
177
|
for (let i = 0; i < lines.length; i += chunkSize) {
|
|
163
|
-
const chunk = lines
|
|
178
|
+
const chunk = lines
|
|
179
|
+
.slice(i, i + chunkSize)
|
|
180
|
+
.join('\n')
|
|
181
|
+
.trim();
|
|
164
182
|
if (chunk)
|
|
165
183
|
chunks.push(chunk);
|
|
166
184
|
}
|
|
167
185
|
return chunks;
|
|
168
186
|
}
|
|
169
187
|
function sanitizeFTS5Query(query) {
|
|
170
|
-
const words = query
|
|
188
|
+
const words = query
|
|
189
|
+
.trim()
|
|
190
|
+
.split(/\s+/)
|
|
191
|
+
.filter((w) => w.length > 1);
|
|
171
192
|
if (words.length === 0)
|
|
172
193
|
return '""';
|
|
173
|
-
return words.map(w => `"${w.replace(/"/g, '""')}"`).join(' OR ');
|
|
194
|
+
return words.map((w) => `"${w.replace(/"/g, '""')}"`).join(' OR ');
|
|
174
195
|
}
|
|
175
196
|
/**
|
|
176
197
|
* Fallback keyword search when FTS5 match returns nothing.
|
|
177
198
|
*/
|
|
178
199
|
function keywordSearch(chunks, intent) {
|
|
179
|
-
const keywords = intent
|
|
200
|
+
const keywords = intent
|
|
201
|
+
.toLowerCase()
|
|
202
|
+
.split(/\s+/)
|
|
203
|
+
.filter((w) => w.length > 2);
|
|
180
204
|
if (keywords.length === 0)
|
|
181
205
|
return [];
|
|
182
|
-
const scored = chunks.map(chunk => {
|
|
206
|
+
const scored = chunks.map((chunk) => {
|
|
183
207
|
const lower = chunk.toLowerCase();
|
|
184
208
|
const score = keywords.reduce((sum, kw) => {
|
|
185
209
|
const matches = lower.split(kw).length - 1;
|
|
@@ -188,10 +212,10 @@ function keywordSearch(chunks, intent) {
|
|
|
188
212
|
return { chunk, score };
|
|
189
213
|
});
|
|
190
214
|
return scored
|
|
191
|
-
.filter(s => s.score > 0)
|
|
215
|
+
.filter((s) => s.score > 0)
|
|
192
216
|
.sort((a, b) => b.score - a.score)
|
|
193
217
|
.slice(0, MAX_SNIPPETS)
|
|
194
|
-
.map(s => s.chunk);
|
|
218
|
+
.map((s) => s.chunk);
|
|
195
219
|
}
|
|
196
220
|
/**
|
|
197
221
|
* Extract high-signal vocabulary terms from chunks for follow-up queries.
|
|
@@ -199,19 +223,116 @@ function keywordSearch(chunks, intent) {
|
|
|
199
223
|
function extractVocabulary(chunks) {
|
|
200
224
|
const wordFreq = new Map();
|
|
201
225
|
const stopWords = new Set([
|
|
202
|
-
'the',
|
|
203
|
-
'
|
|
204
|
-
'
|
|
205
|
-
'
|
|
206
|
-
'
|
|
207
|
-
'
|
|
208
|
-
'
|
|
209
|
-
'
|
|
210
|
-
'
|
|
211
|
-
'
|
|
212
|
-
'
|
|
213
|
-
'
|
|
214
|
-
'
|
|
226
|
+
'the',
|
|
227
|
+
'a',
|
|
228
|
+
'an',
|
|
229
|
+
'is',
|
|
230
|
+
'are',
|
|
231
|
+
'was',
|
|
232
|
+
'were',
|
|
233
|
+
'be',
|
|
234
|
+
'been',
|
|
235
|
+
'being',
|
|
236
|
+
'have',
|
|
237
|
+
'has',
|
|
238
|
+
'had',
|
|
239
|
+
'do',
|
|
240
|
+
'does',
|
|
241
|
+
'did',
|
|
242
|
+
'will',
|
|
243
|
+
'would',
|
|
244
|
+
'could',
|
|
245
|
+
'should',
|
|
246
|
+
'may',
|
|
247
|
+
'might',
|
|
248
|
+
'shall',
|
|
249
|
+
'can',
|
|
250
|
+
'need',
|
|
251
|
+
'dare',
|
|
252
|
+
'ought',
|
|
253
|
+
'used',
|
|
254
|
+
'to',
|
|
255
|
+
'of',
|
|
256
|
+
'in',
|
|
257
|
+
'for',
|
|
258
|
+
'on',
|
|
259
|
+
'with',
|
|
260
|
+
'at',
|
|
261
|
+
'by',
|
|
262
|
+
'from',
|
|
263
|
+
'as',
|
|
264
|
+
'into',
|
|
265
|
+
'through',
|
|
266
|
+
'during',
|
|
267
|
+
'before',
|
|
268
|
+
'after',
|
|
269
|
+
'above',
|
|
270
|
+
'below',
|
|
271
|
+
'and',
|
|
272
|
+
'but',
|
|
273
|
+
'or',
|
|
274
|
+
'nor',
|
|
275
|
+
'not',
|
|
276
|
+
'so',
|
|
277
|
+
'yet',
|
|
278
|
+
'both',
|
|
279
|
+
'either',
|
|
280
|
+
'neither',
|
|
281
|
+
'each',
|
|
282
|
+
'every',
|
|
283
|
+
'all',
|
|
284
|
+
'any',
|
|
285
|
+
'few',
|
|
286
|
+
'more',
|
|
287
|
+
'most',
|
|
288
|
+
'other',
|
|
289
|
+
'some',
|
|
290
|
+
'such',
|
|
291
|
+
'no',
|
|
292
|
+
'only',
|
|
293
|
+
'own',
|
|
294
|
+
'same',
|
|
295
|
+
'than',
|
|
296
|
+
'too',
|
|
297
|
+
'very',
|
|
298
|
+
'just',
|
|
299
|
+
'because',
|
|
300
|
+
'this',
|
|
301
|
+
'that',
|
|
302
|
+
'these',
|
|
303
|
+
'those',
|
|
304
|
+
'it',
|
|
305
|
+
'its',
|
|
306
|
+
'itself',
|
|
307
|
+
'they',
|
|
308
|
+
'them',
|
|
309
|
+
'their',
|
|
310
|
+
'what',
|
|
311
|
+
'which',
|
|
312
|
+
'who',
|
|
313
|
+
'whom',
|
|
314
|
+
'how',
|
|
315
|
+
'when',
|
|
316
|
+
'where',
|
|
317
|
+
'why',
|
|
318
|
+
'if',
|
|
319
|
+
'then',
|
|
320
|
+
'else',
|
|
321
|
+
'true',
|
|
322
|
+
'false',
|
|
323
|
+
'null',
|
|
324
|
+
'undefined',
|
|
325
|
+
'function',
|
|
326
|
+
'return',
|
|
327
|
+
'const',
|
|
328
|
+
'let',
|
|
329
|
+
'var',
|
|
330
|
+
'import',
|
|
331
|
+
'export',
|
|
332
|
+
'default',
|
|
333
|
+
'class',
|
|
334
|
+
'new',
|
|
335
|
+
'type',
|
|
215
336
|
]);
|
|
216
337
|
for (const chunk of chunks) {
|
|
217
338
|
const words = chunk.toLowerCase().match(/[a-z_][a-z0-9_-]{2,}/g) || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-compressor.js","sourceRoot":"","sources":["../../src/mcp-router/output-compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAC,+BAA+B;AAC/D,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,mCAAmC;AAClE,MAAM,YAAY,GAAG,CAAC,CAAC;AAcvB;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAe,EACf,UAAkD,EAAE;IAEpD,MAAM,EAAE,QAAQ,GAAG,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"output-compressor.js","sourceRoot":"","sources":["../../src/mcp-router/output-compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../../../src/mcp-router/search/fuzzy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpE,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../../../src/mcp-router/search/fuzzy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpE,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAkCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,OAAO,CAAe;IAE9B,OAAO,CAAC,SAAS,CAAqC;gBAE1C,OAAO,GAAE,YAAiB;IAOtC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAQvC,KAAK,IAAI,IAAI;IAKb,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,gBAAgB,EAAE;IA4BrD,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,gBAAgB,EAAE;IAalE,WAAW,IAAI,cAAc,EAAE;IAI/B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAKvD,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAO/C"}
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
* Uses Fuse.js for semantic-like matching
|
|
4
4
|
*/
|
|
5
5
|
function tokenize(str) {
|
|
6
|
-
return str
|
|
6
|
+
return str
|
|
7
|
+
.toLowerCase()
|
|
8
|
+
.split(/[\s_\-./]+/)
|
|
9
|
+
.filter(Boolean);
|
|
7
10
|
}
|
|
8
11
|
function calculateScore(query, target) {
|
|
9
12
|
const queryTokens = tokenize(query);
|
|
@@ -30,6 +33,8 @@ function calculateScore(query, target) {
|
|
|
30
33
|
export class ToolSearchIndex {
|
|
31
34
|
tools = [];
|
|
32
35
|
options;
|
|
36
|
+
// O(1) lookup index for getToolByPath - avoids O(n) linear scan per execute_tool call
|
|
37
|
+
pathIndex = new Map();
|
|
33
38
|
constructor(options = {}) {
|
|
34
39
|
this.options = {
|
|
35
40
|
threshold: options.threshold ?? 0.3,
|
|
@@ -38,9 +43,14 @@ export class ToolSearchIndex {
|
|
|
38
43
|
}
|
|
39
44
|
addTools(tools) {
|
|
40
45
|
this.tools.push(...tools);
|
|
46
|
+
// Rebuild path index
|
|
47
|
+
for (const tool of tools) {
|
|
48
|
+
this.pathIndex.set(`${tool.serverName}.${tool.name}`, tool);
|
|
49
|
+
}
|
|
41
50
|
}
|
|
42
51
|
clear() {
|
|
43
52
|
this.tools = [];
|
|
53
|
+
this.pathIndex.clear();
|
|
44
54
|
}
|
|
45
55
|
search(query, limit = 10) {
|
|
46
56
|
const results = [];
|
|
@@ -66,9 +76,9 @@ export class ToolSearchIndex {
|
|
|
66
76
|
}
|
|
67
77
|
searchByServer(serverName, limit = 50) {
|
|
68
78
|
return this.tools
|
|
69
|
-
.filter(t => t.serverName === serverName)
|
|
79
|
+
.filter((t) => t.serverName === serverName)
|
|
70
80
|
.slice(0, limit)
|
|
71
|
-
.map(tool => ({
|
|
81
|
+
.map((tool) => ({
|
|
72
82
|
path: `${tool.serverName}.${tool.name}`,
|
|
73
83
|
name: tool.name,
|
|
74
84
|
description: tool.description,
|
|
@@ -80,11 +90,11 @@ export class ToolSearchIndex {
|
|
|
80
90
|
return [...this.tools];
|
|
81
91
|
}
|
|
82
92
|
getToolByPath(path) {
|
|
83
|
-
|
|
84
|
-
return this.
|
|
93
|
+
// O(1) lookup via Map index instead of O(n) linear scan
|
|
94
|
+
return this.pathIndex.get(path);
|
|
85
95
|
}
|
|
86
96
|
getStats() {
|
|
87
|
-
const servers = new Set(this.tools.map(t => t.serverName));
|
|
97
|
+
const servers = new Set(this.tools.map((t) => t.serverName));
|
|
88
98
|
return {
|
|
89
99
|
servers: servers.size,
|
|
90
100
|
tools: this.tools.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../../src/mcp-router/search/fuzzy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../../src/mcp-router/search/fuzzy.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,8 @@ export declare class McpRouter {
|
|
|
19
19
|
private toolsLoaded;
|
|
20
20
|
constructor(options?: RouterOptions);
|
|
21
21
|
/**
|
|
22
|
-
* Load tools from all configured MCP servers
|
|
22
|
+
* Load tools from all configured MCP servers.
|
|
23
|
+
* Uses Promise.allSettled for parallel discovery and keeps clients alive in the pool.
|
|
23
24
|
*/
|
|
24
25
|
loadTools(): Promise<void>;
|
|
25
26
|
/**
|
|
@@ -44,7 +45,9 @@ export declare class McpRouter {
|
|
|
44
45
|
getConfig(): McpConfig;
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
|
-
* Run as stdio MCP server
|
|
48
|
+
* Run as stdio MCP server.
|
|
49
|
+
* Fully JSON-RPC 2.0 compliant: parse errors (-32700), invalid request (-32600),
|
|
50
|
+
* batch request support, jsonrpc field validation, and protocol version negotiation.
|
|
48
51
|
*/
|
|
49
52
|
export declare function runStdioServer(options?: RouterOptions): Promise<void>;
|
|
50
53
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp-router/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EACL,yBAAyB,EAG1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EAGxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,aAAkB;IAkBvC
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp-router/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EACL,yBAAyB,EAG1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EAGxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,aAAkB;IAkBvC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA2ChC;;OAEG;IACH,kBAAkB,IAAI,KAAK,CAAC,OAAO,yBAAyB,GAAG,OAAO,uBAAuB,CAAC;IAI9F;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBnE;;OAEG;IACH,QAAQ,IAAI,WAAW;IAuBvB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACH,SAAS,IAAI,SAAS;CAGvB;AAKD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2M/E"}
|