@frontmcp/plugins 0.6.0 → 0.6.2

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 (119) hide show
  1. package/{src/cache → cache}/cache.types.d.ts +26 -3
  2. package/cache/index.js +412 -0
  3. package/{src/cache → cache}/providers/cache-memory.provider.d.ts +3 -3
  4. package/{src/cache → cache}/providers/cache-redis.provider.d.ts +3 -3
  5. package/cache/providers/cache-vercel-kv.provider.d.ts +24 -0
  6. package/codecall/index.js +2988 -0
  7. package/{src/codecall → codecall}/tools/invoke.schema.d.ts +6 -1
  8. package/esm/cache/index.mjs +395 -0
  9. package/esm/codecall/index.mjs +2959 -0
  10. package/esm/index.mjs +2951 -0
  11. package/esm/package.json +85 -0
  12. package/index.js +2973 -0
  13. package/package.json +49 -10
  14. package/src/cache/README.md +0 -186
  15. package/src/cache/cache.plugin.js +0 -135
  16. package/src/cache/cache.plugin.js.map +0 -1
  17. package/src/cache/cache.symbol.js +0 -5
  18. package/src/cache/cache.symbol.js.map +0 -1
  19. package/src/cache/cache.types.js +0 -3
  20. package/src/cache/cache.types.js.map +0 -1
  21. package/src/cache/index.js +0 -8
  22. package/src/cache/index.js.map +0 -1
  23. package/src/cache/providers/cache-memory.provider.js +0 -110
  24. package/src/cache/providers/cache-memory.provider.js.map +0 -1
  25. package/src/cache/providers/cache-redis.provider.js +0 -69
  26. package/src/cache/providers/cache-redis.provider.js.map +0 -1
  27. package/src/codecall/README.md +0 -999
  28. package/src/codecall/codecall.plugin.js +0 -152
  29. package/src/codecall/codecall.plugin.js.map +0 -1
  30. package/src/codecall/codecall.symbol.js +0 -4
  31. package/src/codecall/codecall.symbol.js.map +0 -1
  32. package/src/codecall/codecall.types.js +0 -262
  33. package/src/codecall/codecall.types.js.map +0 -1
  34. package/src/codecall/errors/index.js +0 -6
  35. package/src/codecall/errors/index.js.map +0 -1
  36. package/src/codecall/errors/tool-call.errors.js +0 -119
  37. package/src/codecall/errors/tool-call.errors.js.map +0 -1
  38. package/src/codecall/index.js +0 -8
  39. package/src/codecall/index.js.map +0 -1
  40. package/src/codecall/providers/code-call.config.js +0 -120
  41. package/src/codecall/providers/code-call.config.js.map +0 -1
  42. package/src/codecall/security/index.js +0 -7
  43. package/src/codecall/security/index.js.map +0 -1
  44. package/src/codecall/security/self-reference-guard.js +0 -70
  45. package/src/codecall/security/self-reference-guard.js.map +0 -1
  46. package/src/codecall/security/tool-access-control.service.js +0 -170
  47. package/src/codecall/security/tool-access-control.service.js.map +0 -1
  48. package/src/codecall/services/audit-logger.service.js +0 -322
  49. package/src/codecall/services/audit-logger.service.js.map +0 -1
  50. package/src/codecall/services/enclave.service.js +0 -214
  51. package/src/codecall/services/enclave.service.js.map +0 -1
  52. package/src/codecall/services/error-enrichment.service.js +0 -387
  53. package/src/codecall/services/error-enrichment.service.js.map +0 -1
  54. package/src/codecall/services/index.js +0 -13
  55. package/src/codecall/services/index.js.map +0 -1
  56. package/src/codecall/services/output-sanitizer.js +0 -260
  57. package/src/codecall/services/output-sanitizer.js.map +0 -1
  58. package/src/codecall/services/synonym-expansion.service.js +0 -374
  59. package/src/codecall/services/synonym-expansion.service.js.map +0 -1
  60. package/src/codecall/services/tool-search.service.js +0 -587
  61. package/src/codecall/services/tool-search.service.js.map +0 -1
  62. package/src/codecall/tools/describe.schema.js +0 -67
  63. package/src/codecall/tools/describe.schema.js.map +0 -1
  64. package/src/codecall/tools/describe.tool.js +0 -207
  65. package/src/codecall/tools/describe.tool.js.map +0 -1
  66. package/src/codecall/tools/execute.schema.js +0 -116
  67. package/src/codecall/tools/execute.schema.js.map +0 -1
  68. package/src/codecall/tools/execute.tool.js +0 -238
  69. package/src/codecall/tools/execute.tool.js.map +0 -1
  70. package/src/codecall/tools/index.js +0 -13
  71. package/src/codecall/tools/index.js.map +0 -1
  72. package/src/codecall/tools/invoke.schema.js +0 -27
  73. package/src/codecall/tools/invoke.schema.js.map +0 -1
  74. package/src/codecall/tools/invoke.tool.js +0 -70
  75. package/src/codecall/tools/invoke.tool.js.map +0 -1
  76. package/src/codecall/tools/search.schema.js +0 -60
  77. package/src/codecall/tools/search.schema.js.map +0 -1
  78. package/src/codecall/tools/search.tool.js +0 -108
  79. package/src/codecall/tools/search.tool.js.map +0 -1
  80. package/src/codecall/utils/describe.utils.js +0 -531
  81. package/src/codecall/utils/describe.utils.js.map +0 -1
  82. package/src/codecall/utils/index.js +0 -7
  83. package/src/codecall/utils/index.js.map +0 -1
  84. package/src/codecall/utils/mcp-result.js +0 -36
  85. package/src/codecall/utils/mcp-result.js.map +0 -1
  86. package/src/index.js +0 -9
  87. package/src/index.js.map +0 -1
  88. /package/{src/cache → cache}/cache.plugin.d.ts +0 -0
  89. /package/{src/cache → cache}/cache.symbol.d.ts +0 -0
  90. /package/{src/cache → cache}/index.d.ts +0 -0
  91. /package/{src/codecall → codecall}/codecall.plugin.d.ts +0 -0
  92. /package/{src/codecall → codecall}/codecall.symbol.d.ts +0 -0
  93. /package/{src/codecall → codecall}/codecall.types.d.ts +0 -0
  94. /package/{src/codecall → codecall}/errors/index.d.ts +0 -0
  95. /package/{src/codecall → codecall}/errors/tool-call.errors.d.ts +0 -0
  96. /package/{src/codecall → codecall}/index.d.ts +0 -0
  97. /package/{src/codecall → codecall}/providers/code-call.config.d.ts +0 -0
  98. /package/{src/codecall → codecall}/security/index.d.ts +0 -0
  99. /package/{src/codecall → codecall}/security/self-reference-guard.d.ts +0 -0
  100. /package/{src/codecall → codecall}/security/tool-access-control.service.d.ts +0 -0
  101. /package/{src/codecall → codecall}/services/audit-logger.service.d.ts +0 -0
  102. /package/{src/codecall → codecall}/services/enclave.service.d.ts +0 -0
  103. /package/{src/codecall → codecall}/services/error-enrichment.service.d.ts +0 -0
  104. /package/{src/codecall → codecall}/services/index.d.ts +0 -0
  105. /package/{src/codecall → codecall}/services/output-sanitizer.d.ts +0 -0
  106. /package/{src/codecall → codecall}/services/synonym-expansion.service.d.ts +0 -0
  107. /package/{src/codecall → codecall}/services/tool-search.service.d.ts +0 -0
  108. /package/{src/codecall → codecall}/tools/describe.schema.d.ts +0 -0
  109. /package/{src/codecall → codecall}/tools/describe.tool.d.ts +0 -0
  110. /package/{src/codecall → codecall}/tools/execute.schema.d.ts +0 -0
  111. /package/{src/codecall → codecall}/tools/execute.tool.d.ts +0 -0
  112. /package/{src/codecall → codecall}/tools/index.d.ts +0 -0
  113. /package/{src/codecall → codecall}/tools/invoke.tool.d.ts +0 -0
  114. /package/{src/codecall → codecall}/tools/search.schema.d.ts +0 -0
  115. /package/{src/codecall → codecall}/tools/search.tool.d.ts +0 -0
  116. /package/{src/codecall → codecall}/utils/describe.utils.d.ts +0 -0
  117. /package/{src/codecall → codecall}/utils/index.d.ts +0 -0
  118. /package/{src/codecall → codecall}/utils/mcp-result.d.ts +0 -0
  119. /package/{src/index.d.ts → index.d.ts} +0 -0
@@ -1,531 +0,0 @@
1
- "use strict";
2
- // file: libs/plugins/src/codecall/utils/describe.utils.ts
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.detectToolIntent = detectToolIntent;
5
- exports.jsonSchemaToSignature = jsonSchemaToSignature;
6
- exports.jsonSchemaToNaturalLanguage = jsonSchemaToNaturalLanguage;
7
- exports.generateBasicExample = generateBasicExample;
8
- exports.hasPaginationParams = hasPaginationParams;
9
- exports.hasFilterParams = hasFilterParams;
10
- exports.getFilterProperties = getFilterProperties;
11
- exports.generatePaginationExample = generatePaginationExample;
12
- exports.generateFilterExample = generateFilterExample;
13
- exports.generateCreateExample = generateCreateExample;
14
- exports.generateGetExample = generateGetExample;
15
- exports.generateListExample = generateListExample;
16
- exports.generateUpdateExample = generateUpdateExample;
17
- exports.generateDeleteExample = generateDeleteExample;
18
- exports.generateSearchExample = generateSearchExample;
19
- exports.generateSmartExample = generateSmartExample;
20
- /**
21
- * Patterns for detecting tool intent from the action verb.
22
- * These patterns use the same synonym groups as the search service.
23
- */
24
- const INTENT_PATTERNS = {
25
- create: /^(create|add|new|insert|make|append|register|generate|produce|build|construct|provision|instantiate|define|compose|draft)/i,
26
- delete: /^(delete|remove|destroy|drop|erase|clear|purge|discard|eliminate|unbind|unregister)/i,
27
- get: /^(get|fetch|retrieve|read|obtain|load|pull|access|grab|receive)/i,
28
- update: /^(update|edit|modify|change|patch|set|alter|revise|adjust|amend|correct|fix|refresh|sync|upgrade|downgrade)/i,
29
- list: /^(list|all|index|enumerate|show|display|view|browse|scan|inventory)/i,
30
- search: /^(search|find|query|lookup|locate|discover|explore|seek|match|filter)/i,
31
- };
32
- /**
33
- * Detect the intent of a tool from its name.
34
- * Extracts the action verb from tool names like "users:create" or "orders:list".
35
- */
36
- function detectToolIntent(toolName, description) {
37
- // Extract action verb from tool name (e.g., "users:create" -> "create")
38
- const parts = toolName.split(':');
39
- const actionPart = parts.length > 1 ? parts[parts.length - 1] : toolName;
40
- // Check each intent pattern
41
- for (const [intent, pattern] of Object.entries(INTENT_PATTERNS)) {
42
- if (pattern.test(actionPart)) {
43
- return intent;
44
- }
45
- }
46
- // Fallback: check description for clues
47
- if (description) {
48
- const descLower = description.toLowerCase();
49
- if (/creates?\s|adding\s|inserts?/i.test(descLower))
50
- return 'create';
51
- if (/deletes?\s|removes?\s|destroys?/i.test(descLower))
52
- return 'delete';
53
- if (/gets?\s|fetche?s?\s|retrieves?/i.test(descLower))
54
- return 'get';
55
- if (/updates?\s|modif(?:y|ies)\s|edits?/i.test(descLower))
56
- return 'update';
57
- if (/lists?\s|shows?\s|displays?/i.test(descLower))
58
- return 'list';
59
- if (/search(?:es)?\s|find(?:s)?\s|quer(?:y|ies)/i.test(descLower))
60
- return 'search';
61
- }
62
- return 'unknown';
63
- }
64
- /**
65
- * Generate a TypeScript-like function signature from a JSON Schema.
66
- *
67
- * @example
68
- * Input: { type: 'object', properties: { id: { type: 'string' }, limit: { type: 'number' } }, required: ['id'] }
69
- * Output: "(id: string, limit?: number) => unknown"
70
- */
71
- function jsonSchemaToSignature(toolName, inputSchema, outputSchema) {
72
- const inputPart = schemaToTypeString(inputSchema, 'input');
73
- const outputPart = schemaToTypeString(outputSchema, 'output');
74
- return `callTool('${toolName}', ${inputPart}) => Promise<${outputPart}>`;
75
- }
76
- /**
77
- * Convert JSON Schema to a TypeScript-like type string.
78
- */
79
- function schemaToTypeString(schema, context) {
80
- if (!schema) {
81
- return context === 'input' ? '{}' : 'unknown';
82
- }
83
- if (schema.type === 'object' && schema.properties) {
84
- const props = [];
85
- const required = new Set(schema.required || []);
86
- for (const [key, propSchema] of Object.entries(schema.properties)) {
87
- if (typeof propSchema === 'boolean')
88
- continue;
89
- const isRequired = required.has(key);
90
- const typeStr = getTypeString(propSchema);
91
- props.push(`${key}${isRequired ? '' : '?'}: ${typeStr}`);
92
- }
93
- if (props.length === 0) {
94
- return '{}';
95
- }
96
- return `{ ${props.join(', ')} }`;
97
- }
98
- return getTypeString(schema);
99
- }
100
- /**
101
- * Get a simple type string for a schema.
102
- */
103
- function getTypeString(schema) {
104
- if (schema.enum) {
105
- return schema.enum.map((v) => JSON.stringify(v)).join(' | ');
106
- }
107
- if (schema.type) {
108
- if (Array.isArray(schema.type)) {
109
- return schema.type.join(' | ');
110
- }
111
- switch (schema.type) {
112
- case 'string':
113
- return 'string';
114
- case 'number':
115
- case 'integer':
116
- return 'number';
117
- case 'boolean':
118
- return 'boolean';
119
- case 'null':
120
- return 'null';
121
- case 'array':
122
- if (schema.items && typeof schema.items !== 'boolean') {
123
- return `${getTypeString(schema.items)}[]`;
124
- }
125
- return 'unknown[]';
126
- case 'object':
127
- if (schema.properties) {
128
- return schemaToTypeString(schema, 'input');
129
- }
130
- return 'Record<string, unknown>';
131
- default:
132
- return 'unknown';
133
- }
134
- }
135
- if (schema.oneOf || schema.anyOf) {
136
- // We've confirmed at least one is truthy, so use non-null assertion
137
- const options = (schema.oneOf ?? schema.anyOf);
138
- return options
139
- .filter((s) => typeof s !== 'boolean')
140
- .map((s) => getTypeString(s))
141
- .join(' | ');
142
- }
143
- return 'unknown';
144
- }
145
- /**
146
- * Generate a natural language summary of a schema.
147
- */
148
- function jsonSchemaToNaturalLanguage(schema, direction) {
149
- if (!schema) {
150
- return direction === 'input' ? 'No input parameters' : 'Returns unspecified data';
151
- }
152
- if (schema.description) {
153
- return schema.description;
154
- }
155
- if (schema.type === 'object' && schema.properties) {
156
- const required = new Set(schema.required || []);
157
- const props = Object.entries(schema.properties);
158
- if (props.length === 0) {
159
- return direction === 'input' ? 'No parameters required' : 'Returns an empty object';
160
- }
161
- const requiredProps = props.filter(([key]) => required.has(key));
162
- const optionalProps = props.filter(([key]) => !required.has(key));
163
- const parts = [];
164
- if (requiredProps.length > 0) {
165
- parts.push(`Required: ${requiredProps.map(([k]) => k).join(', ')}`);
166
- }
167
- if (optionalProps.length > 0) {
168
- parts.push(`Optional: ${optionalProps.map(([k]) => k).join(', ')}`);
169
- }
170
- return parts.join('. ');
171
- }
172
- return direction === 'input' ? `Takes a ${schema.type || 'value'}` : `Returns a ${schema.type || 'value'}`;
173
- }
174
- /**
175
- * Generate a basic usage example for a tool.
176
- */
177
- function generateBasicExample(toolName, inputSchema) {
178
- const params = generateSampleParams(inputSchema);
179
- const paramsStr = params ? JSON.stringify(params, null, 2) : '{}';
180
- return {
181
- description: `Basic usage of ${toolName}`,
182
- code: `const result = await callTool('${toolName}', ${paramsStr});
183
- return result;`,
184
- };
185
- }
186
- /**
187
- * Generate sample parameters from a schema.
188
- */
189
- function generateSampleParams(schema) {
190
- if (!schema || schema.type !== 'object' || !schema.properties) {
191
- return null;
192
- }
193
- const params = {};
194
- const required = new Set(schema.required || []);
195
- for (const [key, propSchema] of Object.entries(schema.properties)) {
196
- if (typeof propSchema === 'boolean')
197
- continue;
198
- // Only include required params and a couple optional ones for example
199
- if (!required.has(key))
200
- continue;
201
- params[key] = getSampleValue(propSchema, key);
202
- }
203
- return Object.keys(params).length > 0 ? params : null;
204
- }
205
- /**
206
- * Generate a sample value for a schema property.
207
- */
208
- function getSampleValue(schema, key) {
209
- if (schema.default !== undefined) {
210
- return schema.default;
211
- }
212
- if (schema.enum && schema.enum.length > 0) {
213
- return schema.enum[0];
214
- }
215
- if (schema.const !== undefined) {
216
- return schema.const;
217
- }
218
- const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;
219
- switch (type) {
220
- case 'string':
221
- // Generate contextual sample based on key name
222
- if (key.toLowerCase().includes('id'))
223
- return 'abc123';
224
- if (key.toLowerCase().includes('email'))
225
- return 'user@example.com';
226
- if (key.toLowerCase().includes('name'))
227
- return 'Example';
228
- if (key.toLowerCase().includes('url'))
229
- return 'https://example.com';
230
- return 'string';
231
- case 'number':
232
- case 'integer':
233
- if (key.toLowerCase().includes('limit'))
234
- return 10;
235
- if (key.toLowerCase().includes('offset'))
236
- return 0;
237
- if (key.toLowerCase().includes('page'))
238
- return 1;
239
- return 0;
240
- case 'boolean':
241
- return true;
242
- case 'array':
243
- return [];
244
- case 'object':
245
- return {};
246
- default:
247
- return null;
248
- }
249
- }
250
- /**
251
- * Check if a schema has pagination parameters.
252
- */
253
- function hasPaginationParams(schema) {
254
- if (!schema || schema.type !== 'object' || !schema.properties) {
255
- return false;
256
- }
257
- const props = Object.keys(schema.properties);
258
- return props.some((p) => ['limit', 'offset', 'page', 'pageSize', 'cursor'].includes(p.toLowerCase()));
259
- }
260
- /**
261
- * Check if a schema has filter-like parameters.
262
- */
263
- function hasFilterParams(schema) {
264
- if (!schema || schema.type !== 'object' || !schema.properties) {
265
- return false;
266
- }
267
- const props = Object.keys(schema.properties);
268
- return props.some((p) => p.toLowerCase().includes('filter') ||
269
- p.toLowerCase().includes('query') ||
270
- p.toLowerCase().includes('search') ||
271
- p.toLowerCase() === 'status' ||
272
- p.toLowerCase() === 'type' ||
273
- p.toLowerCase() === 'role');
274
- }
275
- /**
276
- * Get filter-like property names from a schema.
277
- */
278
- function getFilterProperties(schema) {
279
- if (!schema || schema.type !== 'object' || !schema.properties) {
280
- return [];
281
- }
282
- return Object.keys(schema.properties).filter((p) => p.toLowerCase().includes('filter') ||
283
- p.toLowerCase().includes('query') ||
284
- p.toLowerCase().includes('search') ||
285
- p.toLowerCase() === 'status' ||
286
- p.toLowerCase() === 'type' ||
287
- p.toLowerCase() === 'role');
288
- }
289
- /**
290
- * Generate a pagination example for a tool.
291
- */
292
- function generatePaginationExample(toolName) {
293
- return {
294
- description: `Pagination example for ${toolName}`,
295
- code: `// Fetch first page
296
- const page1 = await callTool('${toolName}', { limit: 10, offset: 0 });
297
-
298
- // Fetch second page
299
- const page2 = await callTool('${toolName}', { limit: 10, offset: 10 });
300
-
301
- // Combine results
302
- return [...page1.items, ...page2.items];`,
303
- };
304
- }
305
- /**
306
- * Generate a filter example for a tool.
307
- */
308
- function generateFilterExample(toolName, filterProp) {
309
- return {
310
- description: `Filter by ${filterProp}`,
311
- code: `const filtered = await callTool('${toolName}', { ${filterProp}: 'value' });
312
- return filtered.items || filtered;`,
313
- };
314
- }
315
- // ==========================================
316
- // Intent-Specific Example Generators
317
- // ==========================================
318
- /**
319
- * Extract entity name from tool name (e.g., "users:create" -> "user")
320
- */
321
- function extractEntityName(toolName) {
322
- const parts = toolName.split(':');
323
- const entity = parts.length > 1 ? parts[0] : toolName;
324
- // Singularize simple plurals
325
- return entity.endsWith('s') && !entity.endsWith('ss') ? entity.slice(0, -1) : entity;
326
- }
327
- /**
328
- * Generate a create example for a tool.
329
- * Shows required parameters with contextual sample values.
330
- */
331
- function generateCreateExample(toolName, inputSchema) {
332
- const entity = extractEntityName(toolName);
333
- const params = generateSampleParams(inputSchema);
334
- const paramsStr = params ? JSON.stringify(params, null, 2) : '{ /* required fields */ }';
335
- return {
336
- description: `Create a new ${entity}`,
337
- code: `const result = await callTool('${toolName}', ${paramsStr});
338
- return result;`,
339
- };
340
- }
341
- /**
342
- * Generate a get (retrieve single item) example for a tool.
343
- */
344
- function generateGetExample(toolName, inputSchema) {
345
- const entity = extractEntityName(toolName);
346
- const idParam = findIdParameter(inputSchema);
347
- if (idParam) {
348
- return {
349
- description: `Get ${entity} by ${idParam}`,
350
- code: `const ${entity} = await callTool('${toolName}', { ${idParam}: 'abc123' });
351
- return ${entity};`,
352
- };
353
- }
354
- // Fallback to basic example if no ID parameter found
355
- const params = generateSampleParams(inputSchema);
356
- const paramsStr = params ? JSON.stringify(params, null, 2) : '{}';
357
- return {
358
- description: `Get ${entity} details`,
359
- code: `const ${entity} = await callTool('${toolName}', ${paramsStr});
360
- return ${entity};`,
361
- };
362
- }
363
- /**
364
- * Generate a list example for a tool.
365
- */
366
- function generateListExample(toolName, inputSchema) {
367
- const entity = extractEntityName(toolName);
368
- return {
369
- description: `List all ${entity}s`,
370
- code: `const result = await callTool('${toolName}', {});
371
- return result.items || result;`,
372
- };
373
- }
374
- /**
375
- * Generate an update example for a tool.
376
- */
377
- function generateUpdateExample(toolName, inputSchema) {
378
- const entity = extractEntityName(toolName);
379
- const idParam = findIdParameter(inputSchema);
380
- // Generate sample update fields (excluding ID fields)
381
- const updateFields = generateUpdateFields(inputSchema);
382
- const fieldsStr = updateFields
383
- ? JSON.stringify(updateFields, null, 2).replace(/\n/g, '\n ')
384
- : '{ /* fields to update */ }';
385
- if (idParam) {
386
- return {
387
- description: `Update ${entity} by ${idParam}`,
388
- code: `const updated = await callTool('${toolName}', {
389
- ${idParam}: 'abc123',
390
- ...${fieldsStr}
391
- });
392
- return updated;`,
393
- };
394
- }
395
- return {
396
- description: `Update ${entity}`,
397
- code: `const updated = await callTool('${toolName}', ${fieldsStr});
398
- return updated;`,
399
- };
400
- }
401
- /**
402
- * Generate a delete example for a tool.
403
- */
404
- function generateDeleteExample(toolName, inputSchema) {
405
- const entity = extractEntityName(toolName);
406
- const idParam = findIdParameter(inputSchema);
407
- if (idParam) {
408
- return {
409
- description: `Delete ${entity} by ${idParam}`,
410
- code: `const result = await callTool('${toolName}', { ${idParam}: 'abc123' });
411
- return result;`,
412
- };
413
- }
414
- const params = generateSampleParams(inputSchema);
415
- const paramsStr = params ? JSON.stringify(params, null, 2) : '{ /* identifier */ }';
416
- return {
417
- description: `Delete ${entity}`,
418
- code: `const result = await callTool('${toolName}', ${paramsStr});
419
- return result;`,
420
- };
421
- }
422
- /**
423
- * Generate a search example for a tool.
424
- */
425
- function generateSearchExample(toolName, inputSchema) {
426
- const entity = extractEntityName(toolName);
427
- const queryParam = findQueryParameter(inputSchema);
428
- if (queryParam) {
429
- return {
430
- description: `Search for ${entity}s`,
431
- code: `const results = await callTool('${toolName}', { ${queryParam}: 'search term' });
432
- return results.items || results;`,
433
- };
434
- }
435
- return {
436
- description: `Search for ${entity}s`,
437
- code: `const results = await callTool('${toolName}', { query: 'search term' });
438
- return results.items || results;`,
439
- };
440
- }
441
- /**
442
- * Find an ID-like parameter in the schema.
443
- */
444
- function findIdParameter(schema) {
445
- if (!schema || schema.type !== 'object' || !schema.properties) {
446
- return null;
447
- }
448
- const props = Object.keys(schema.properties);
449
- const required = new Set(schema.required || []);
450
- // Prioritize required ID fields
451
- const idPatterns = ['id', 'Id', 'ID', '_id', 'uuid', 'key'];
452
- for (const pattern of idPatterns) {
453
- const found = props.find((p) => (p === pattern || p.endsWith(pattern)) && required.has(p));
454
- if (found)
455
- return found;
456
- }
457
- // Fall back to any ID-like field
458
- for (const pattern of idPatterns) {
459
- const found = props.find((p) => p === pattern || p.endsWith(pattern));
460
- if (found)
461
- return found;
462
- }
463
- return null;
464
- }
465
- /**
466
- * Find a query-like parameter in the schema.
467
- */
468
- function findQueryParameter(schema) {
469
- if (!schema || schema.type !== 'object' || !schema.properties) {
470
- return null;
471
- }
472
- const props = Object.keys(schema.properties);
473
- const queryPatterns = ['query', 'search', 'q', 'term', 'keyword', 'filter'];
474
- for (const pattern of queryPatterns) {
475
- const found = props.find((p) => p.toLowerCase() === pattern || p.toLowerCase().includes(pattern));
476
- if (found)
477
- return found;
478
- }
479
- return null;
480
- }
481
- /**
482
- * Generate sample update fields (excluding ID-like fields).
483
- */
484
- function generateUpdateFields(schema) {
485
- if (!schema || schema.type !== 'object' || !schema.properties) {
486
- return null;
487
- }
488
- const fields = {};
489
- const idPatterns = ['id', 'Id', 'ID', '_id', 'uuid', 'key'];
490
- for (const [key, propSchema] of Object.entries(schema.properties)) {
491
- if (typeof propSchema === 'boolean')
492
- continue;
493
- // Skip ID-like fields
494
- const isIdField = idPatterns.some((p) => key === p || key.endsWith(p));
495
- if (isIdField)
496
- continue;
497
- // Include a few non-ID fields for the update example
498
- if (Object.keys(fields).length < 2) {
499
- fields[key] = getSampleValue(propSchema, key);
500
- }
501
- }
502
- return Object.keys(fields).length > 0 ? fields : null;
503
- }
504
- /**
505
- * Smart example generator that uses intent detection.
506
- * This is the main entry point for generating examples.
507
- */
508
- function generateSmartExample(toolName, inputSchema, description) {
509
- const intent = detectToolIntent(toolName, description);
510
- switch (intent) {
511
- case 'create':
512
- return generateCreateExample(toolName, inputSchema);
513
- case 'get':
514
- return generateGetExample(toolName, inputSchema);
515
- case 'list':
516
- // For list tools, still use pagination example if available
517
- return hasPaginationParams(inputSchema)
518
- ? generatePaginationExample(toolName)
519
- : generateListExample(toolName, inputSchema);
520
- case 'update':
521
- return generateUpdateExample(toolName, inputSchema);
522
- case 'delete':
523
- return generateDeleteExample(toolName, inputSchema);
524
- case 'search':
525
- return generateSearchExample(toolName, inputSchema);
526
- default:
527
- // Fallback to basic example for unknown intents
528
- return generateBasicExample(toolName, inputSchema);
529
- }
530
- }
531
- //# sourceMappingURL=describe.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"describe.utils.js","sourceRoot":"","sources":["../../../../src/codecall/utils/describe.utils.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/plugins/src/codecall/utils/describe.utils.ts\n\nimport type { JSONSchema } from 'zod/v4/core';\n\n/** JSON Schema type from Zod v4 */\ntype JsonSchema = JSONSchema.JSONSchema;\n\n/**\n * Tool example for describe output\n */\nexport interface ToolUsageExample {\n description: string;\n code: string;\n}\n\n/**\n * Detected intent of a tool based on its name and description.\n */\nexport type ToolIntent = 'create' | 'list' | 'get' | 'update' | 'delete' | 'search' | 'action' | 'unknown';\n\n/**\n * Patterns for detecting tool intent from the action verb.\n * These patterns use the same synonym groups as the search service.\n */\nconst INTENT_PATTERNS: Record<Exclude<ToolIntent, 'action' | 'unknown'>, RegExp> = {\n create:\n /^(create|add|new|insert|make|append|register|generate|produce|build|construct|provision|instantiate|define|compose|draft)/i,\n delete: /^(delete|remove|destroy|drop|erase|clear|purge|discard|eliminate|unbind|unregister)/i,\n get: /^(get|fetch|retrieve|read|obtain|load|pull|access|grab|receive)/i,\n update:\n /^(update|edit|modify|change|patch|set|alter|revise|adjust|amend|correct|fix|refresh|sync|upgrade|downgrade)/i,\n list: /^(list|all|index|enumerate|show|display|view|browse|scan|inventory)/i,\n search: /^(search|find|query|lookup|locate|discover|explore|seek|match|filter)/i,\n};\n\n/**\n * Detect the intent of a tool from its name.\n * Extracts the action verb from tool names like \"users:create\" or \"orders:list\".\n */\nexport function detectToolIntent(toolName: string, description?: string): ToolIntent {\n // Extract action verb from tool name (e.g., \"users:create\" -> \"create\")\n const parts = toolName.split(':');\n const actionPart = parts.length > 1 ? parts[parts.length - 1] : toolName;\n\n // Check each intent pattern\n for (const [intent, pattern] of Object.entries(INTENT_PATTERNS) as [ToolIntent, RegExp][]) {\n if (pattern.test(actionPart)) {\n return intent;\n }\n }\n\n // Fallback: check description for clues\n if (description) {\n const descLower = description.toLowerCase();\n if (/creates?\\s|adding\\s|inserts?/i.test(descLower)) return 'create';\n if (/deletes?\\s|removes?\\s|destroys?/i.test(descLower)) return 'delete';\n if (/gets?\\s|fetche?s?\\s|retrieves?/i.test(descLower)) return 'get';\n if (/updates?\\s|modif(?:y|ies)\\s|edits?/i.test(descLower)) return 'update';\n if (/lists?\\s|shows?\\s|displays?/i.test(descLower)) return 'list';\n if (/search(?:es)?\\s|find(?:s)?\\s|quer(?:y|ies)/i.test(descLower)) return 'search';\n }\n\n return 'unknown';\n}\n\n/**\n * Generate a TypeScript-like function signature from a JSON Schema.\n *\n * @example\n * Input: { type: 'object', properties: { id: { type: 'string' }, limit: { type: 'number' } }, required: ['id'] }\n * Output: \"(id: string, limit?: number) => unknown\"\n */\nexport function jsonSchemaToSignature(toolName: string, inputSchema?: JsonSchema, outputSchema?: JsonSchema): string {\n const inputPart = schemaToTypeString(inputSchema, 'input');\n const outputPart = schemaToTypeString(outputSchema, 'output');\n\n return `callTool('${toolName}', ${inputPart}) => Promise<${outputPart}>`;\n}\n\n/**\n * Convert JSON Schema to a TypeScript-like type string.\n */\nfunction schemaToTypeString(schema: JsonSchema | undefined | null, context: 'input' | 'output'): string {\n if (!schema) {\n return context === 'input' ? '{}' : 'unknown';\n }\n\n if (schema.type === 'object' && schema.properties) {\n const props: string[] = [];\n const required = new Set(schema.required || []);\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n if (typeof propSchema === 'boolean') continue;\n\n const isRequired = required.has(key);\n const typeStr = getTypeString(propSchema);\n props.push(`${key}${isRequired ? '' : '?'}: ${typeStr}`);\n }\n\n if (props.length === 0) {\n return '{}';\n }\n\n return `{ ${props.join(', ')} }`;\n }\n\n return getTypeString(schema);\n}\n\n/**\n * Get a simple type string for a schema.\n */\nfunction getTypeString(schema: JsonSchema): string {\n if (schema.enum) {\n return schema.enum.map((v) => JSON.stringify(v)).join(' | ');\n }\n\n if (schema.type) {\n if (Array.isArray(schema.type)) {\n return schema.type.join(' | ');\n }\n\n switch (schema.type) {\n case 'string':\n return 'string';\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'null':\n return 'null';\n case 'array':\n if (schema.items && typeof schema.items !== 'boolean') {\n return `${getTypeString(schema.items as JsonSchema)}[]`;\n }\n return 'unknown[]';\n case 'object':\n if (schema.properties) {\n return schemaToTypeString(schema, 'input');\n }\n return 'Record<string, unknown>';\n default:\n return 'unknown';\n }\n }\n\n if (schema.oneOf || schema.anyOf) {\n // We've confirmed at least one is truthy, so use non-null assertion\n const options = (schema.oneOf ?? schema.anyOf)!;\n return options\n .filter((s): s is JsonSchema => typeof s !== 'boolean')\n .map((s) => getTypeString(s))\n .join(' | ');\n }\n\n return 'unknown';\n}\n\n/**\n * Generate a natural language summary of a schema.\n */\nexport function jsonSchemaToNaturalLanguage(\n schema: JsonSchema | undefined | null,\n direction: 'input' | 'output',\n): string {\n if (!schema) {\n return direction === 'input' ? 'No input parameters' : 'Returns unspecified data';\n }\n\n if (schema.description) {\n return schema.description;\n }\n\n if (schema.type === 'object' && schema.properties) {\n const required = new Set(schema.required || []);\n const props = Object.entries(schema.properties);\n\n if (props.length === 0) {\n return direction === 'input' ? 'No parameters required' : 'Returns an empty object';\n }\n\n const requiredProps = props.filter(([key]) => required.has(key));\n const optionalProps = props.filter(([key]) => !required.has(key));\n\n const parts: string[] = [];\n\n if (requiredProps.length > 0) {\n parts.push(`Required: ${requiredProps.map(([k]) => k).join(', ')}`);\n }\n\n if (optionalProps.length > 0) {\n parts.push(`Optional: ${optionalProps.map(([k]) => k).join(', ')}`);\n }\n\n return parts.join('. ');\n }\n\n return direction === 'input' ? `Takes a ${schema.type || 'value'}` : `Returns a ${schema.type || 'value'}`;\n}\n\n/**\n * Generate a basic usage example for a tool.\n */\nexport function generateBasicExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const params = generateSampleParams(inputSchema);\n const paramsStr = params ? JSON.stringify(params, null, 2) : '{}';\n\n return {\n description: `Basic usage of ${toolName}`,\n code: `const result = await callTool('${toolName}', ${paramsStr});\nreturn result;`,\n };\n}\n\n/**\n * Generate sample parameters from a schema.\n */\nfunction generateSampleParams(schema?: JsonSchema): Record<string, unknown> | null {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return null;\n }\n\n const params: Record<string, unknown> = {};\n const required = new Set(schema.required || []);\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n if (typeof propSchema === 'boolean') continue;\n\n // Only include required params and a couple optional ones for example\n if (!required.has(key)) continue;\n\n params[key] = getSampleValue(propSchema, key);\n }\n\n return Object.keys(params).length > 0 ? params : null;\n}\n\n/**\n * Generate a sample value for a schema property.\n */\nfunction getSampleValue(schema: JsonSchema, key: string): unknown {\n if (schema.default !== undefined) {\n return schema.default;\n }\n\n if (schema.enum && schema.enum.length > 0) {\n return schema.enum[0];\n }\n\n if (schema.const !== undefined) {\n return schema.const;\n }\n\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n\n switch (type) {\n case 'string':\n // Generate contextual sample based on key name\n if (key.toLowerCase().includes('id')) return 'abc123';\n if (key.toLowerCase().includes('email')) return 'user@example.com';\n if (key.toLowerCase().includes('name')) return 'Example';\n if (key.toLowerCase().includes('url')) return 'https://example.com';\n return 'string';\n\n case 'number':\n case 'integer':\n if (key.toLowerCase().includes('limit')) return 10;\n if (key.toLowerCase().includes('offset')) return 0;\n if (key.toLowerCase().includes('page')) return 1;\n return 0;\n\n case 'boolean':\n return true;\n\n case 'array':\n return [];\n\n case 'object':\n return {};\n\n default:\n return null;\n }\n}\n\n/**\n * Check if a schema has pagination parameters.\n */\nexport function hasPaginationParams(schema?: JsonSchema): boolean {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return false;\n }\n\n const props = Object.keys(schema.properties);\n return props.some((p) => ['limit', 'offset', 'page', 'pageSize', 'cursor'].includes(p.toLowerCase()));\n}\n\n/**\n * Check if a schema has filter-like parameters.\n */\nexport function hasFilterParams(schema?: JsonSchema): boolean {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return false;\n }\n\n const props = Object.keys(schema.properties);\n return props.some(\n (p) =>\n p.toLowerCase().includes('filter') ||\n p.toLowerCase().includes('query') ||\n p.toLowerCase().includes('search') ||\n p.toLowerCase() === 'status' ||\n p.toLowerCase() === 'type' ||\n p.toLowerCase() === 'role',\n );\n}\n\n/**\n * Get filter-like property names from a schema.\n */\nexport function getFilterProperties(schema?: JsonSchema): string[] {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return [];\n }\n\n return Object.keys(schema.properties).filter(\n (p) =>\n p.toLowerCase().includes('filter') ||\n p.toLowerCase().includes('query') ||\n p.toLowerCase().includes('search') ||\n p.toLowerCase() === 'status' ||\n p.toLowerCase() === 'type' ||\n p.toLowerCase() === 'role',\n );\n}\n\n/**\n * Generate a pagination example for a tool.\n */\nexport function generatePaginationExample(toolName: string): ToolUsageExample {\n return {\n description: `Pagination example for ${toolName}`,\n code: `// Fetch first page\nconst page1 = await callTool('${toolName}', { limit: 10, offset: 0 });\n\n// Fetch second page\nconst page2 = await callTool('${toolName}', { limit: 10, offset: 10 });\n\n// Combine results\nreturn [...page1.items, ...page2.items];`,\n };\n}\n\n/**\n * Generate a filter example for a tool.\n */\nexport function generateFilterExample(toolName: string, filterProp: string): ToolUsageExample {\n return {\n description: `Filter by ${filterProp}`,\n code: `const filtered = await callTool('${toolName}', { ${filterProp}: 'value' });\nreturn filtered.items || filtered;`,\n };\n}\n\n// ==========================================\n// Intent-Specific Example Generators\n// ==========================================\n\n/**\n * Extract entity name from tool name (e.g., \"users:create\" -> \"user\")\n */\nfunction extractEntityName(toolName: string): string {\n const parts = toolName.split(':');\n const entity = parts.length > 1 ? parts[0] : toolName;\n // Singularize simple plurals\n return entity.endsWith('s') && !entity.endsWith('ss') ? entity.slice(0, -1) : entity;\n}\n\n/**\n * Generate a create example for a tool.\n * Shows required parameters with contextual sample values.\n */\nexport function generateCreateExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const entity = extractEntityName(toolName);\n const params = generateSampleParams(inputSchema);\n const paramsStr = params ? JSON.stringify(params, null, 2) : '{ /* required fields */ }';\n\n return {\n description: `Create a new ${entity}`,\n code: `const result = await callTool('${toolName}', ${paramsStr});\nreturn result;`,\n };\n}\n\n/**\n * Generate a get (retrieve single item) example for a tool.\n */\nexport function generateGetExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const entity = extractEntityName(toolName);\n const idParam = findIdParameter(inputSchema);\n\n if (idParam) {\n return {\n description: `Get ${entity} by ${idParam}`,\n code: `const ${entity} = await callTool('${toolName}', { ${idParam}: 'abc123' });\nreturn ${entity};`,\n };\n }\n\n // Fallback to basic example if no ID parameter found\n const params = generateSampleParams(inputSchema);\n const paramsStr = params ? JSON.stringify(params, null, 2) : '{}';\n\n return {\n description: `Get ${entity} details`,\n code: `const ${entity} = await callTool('${toolName}', ${paramsStr});\nreturn ${entity};`,\n };\n}\n\n/**\n * Generate a list example for a tool.\n */\nexport function generateListExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const entity = extractEntityName(toolName);\n\n return {\n description: `List all ${entity}s`,\n code: `const result = await callTool('${toolName}', {});\nreturn result.items || result;`,\n };\n}\n\n/**\n * Generate an update example for a tool.\n */\nexport function generateUpdateExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const entity = extractEntityName(toolName);\n const idParam = findIdParameter(inputSchema);\n\n // Generate sample update fields (excluding ID fields)\n const updateFields = generateUpdateFields(inputSchema);\n const fieldsStr = updateFields\n ? JSON.stringify(updateFields, null, 2).replace(/\\n/g, '\\n ')\n : '{ /* fields to update */ }';\n\n if (idParam) {\n return {\n description: `Update ${entity} by ${idParam}`,\n code: `const updated = await callTool('${toolName}', {\n ${idParam}: 'abc123',\n ...${fieldsStr}\n});\nreturn updated;`,\n };\n }\n\n return {\n description: `Update ${entity}`,\n code: `const updated = await callTool('${toolName}', ${fieldsStr});\nreturn updated;`,\n };\n}\n\n/**\n * Generate a delete example for a tool.\n */\nexport function generateDeleteExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const entity = extractEntityName(toolName);\n const idParam = findIdParameter(inputSchema);\n\n if (idParam) {\n return {\n description: `Delete ${entity} by ${idParam}`,\n code: `const result = await callTool('${toolName}', { ${idParam}: 'abc123' });\nreturn result;`,\n };\n }\n\n const params = generateSampleParams(inputSchema);\n const paramsStr = params ? JSON.stringify(params, null, 2) : '{ /* identifier */ }';\n\n return {\n description: `Delete ${entity}`,\n code: `const result = await callTool('${toolName}', ${paramsStr});\nreturn result;`,\n };\n}\n\n/**\n * Generate a search example for a tool.\n */\nexport function generateSearchExample(toolName: string, inputSchema?: JsonSchema): ToolUsageExample {\n const entity = extractEntityName(toolName);\n const queryParam = findQueryParameter(inputSchema);\n\n if (queryParam) {\n return {\n description: `Search for ${entity}s`,\n code: `const results = await callTool('${toolName}', { ${queryParam}: 'search term' });\nreturn results.items || results;`,\n };\n }\n\n return {\n description: `Search for ${entity}s`,\n code: `const results = await callTool('${toolName}', { query: 'search term' });\nreturn results.items || results;`,\n };\n}\n\n/**\n * Find an ID-like parameter in the schema.\n */\nfunction findIdParameter(schema?: JsonSchema): string | null {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return null;\n }\n\n const props = Object.keys(schema.properties);\n const required = new Set(schema.required || []);\n\n // Prioritize required ID fields\n const idPatterns = ['id', 'Id', 'ID', '_id', 'uuid', 'key'];\n for (const pattern of idPatterns) {\n const found = props.find((p) => (p === pattern || p.endsWith(pattern)) && required.has(p));\n if (found) return found;\n }\n\n // Fall back to any ID-like field\n for (const pattern of idPatterns) {\n const found = props.find((p) => p === pattern || p.endsWith(pattern));\n if (found) return found;\n }\n\n return null;\n}\n\n/**\n * Find a query-like parameter in the schema.\n */\nfunction findQueryParameter(schema?: JsonSchema): string | null {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return null;\n }\n\n const props = Object.keys(schema.properties);\n const queryPatterns = ['query', 'search', 'q', 'term', 'keyword', 'filter'];\n\n for (const pattern of queryPatterns) {\n const found = props.find((p) => p.toLowerCase() === pattern || p.toLowerCase().includes(pattern));\n if (found) return found;\n }\n\n return null;\n}\n\n/**\n * Generate sample update fields (excluding ID-like fields).\n */\nfunction generateUpdateFields(schema?: JsonSchema): Record<string, unknown> | null {\n if (!schema || schema.type !== 'object' || !schema.properties) {\n return null;\n }\n\n const fields: Record<string, unknown> = {};\n const idPatterns = ['id', 'Id', 'ID', '_id', 'uuid', 'key'];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n if (typeof propSchema === 'boolean') continue;\n\n // Skip ID-like fields\n const isIdField = idPatterns.some((p) => key === p || key.endsWith(p));\n if (isIdField) continue;\n\n // Include a few non-ID fields for the update example\n if (Object.keys(fields).length < 2) {\n fields[key] = getSampleValue(propSchema, key);\n }\n }\n\n return Object.keys(fields).length > 0 ? fields : null;\n}\n\n/**\n * Smart example generator that uses intent detection.\n * This is the main entry point for generating examples.\n */\nexport function generateSmartExample(\n toolName: string,\n inputSchema?: JsonSchema,\n description?: string,\n): ToolUsageExample {\n const intent = detectToolIntent(toolName, description);\n\n switch (intent) {\n case 'create':\n return generateCreateExample(toolName, inputSchema);\n case 'get':\n return generateGetExample(toolName, inputSchema);\n case 'list':\n // For list tools, still use pagination example if available\n return hasPaginationParams(inputSchema)\n ? generatePaginationExample(toolName)\n : generateListExample(toolName, inputSchema);\n case 'update':\n return generateUpdateExample(toolName, inputSchema);\n case 'delete':\n return generateDeleteExample(toolName, inputSchema);\n case 'search':\n return generateSearchExample(toolName, inputSchema);\n default:\n // Fallback to basic example for unknown intents\n return generateBasicExample(toolName, inputSchema);\n }\n}\n"]}
@@ -1,7 +0,0 @@
1
- "use strict";
2
- // file: libs/plugins/src/codecall/utils/index.ts
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const tslib_1 = require("tslib");
5
- tslib_1.__exportStar(require("./describe.utils"), exports);
6
- tslib_1.__exportStar(require("./mcp-result"), exports);
7
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/codecall/utils/index.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAEjD,2DAAiC;AACjC,uDAA6B","sourcesContent":["// file: libs/plugins/src/codecall/utils/index.ts\n\nexport * from './describe.utils';\nexport * from './mcp-result';\n"]}
@@ -1,36 +0,0 @@
1
- "use strict";
2
- // file: libs/plugins/src/codecall/utils/mcp-result.ts
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.extractResultFromCallToolResult = extractResultFromCallToolResult;
5
- /**
6
- * Extract the actual result from a CallToolResult.
7
- * MCP returns results wrapped in content array format.
8
- */
9
- function extractResultFromCallToolResult(mcpResult) {
10
- // MCP CallToolResult has { content: [...], isError?: boolean }
11
- if (mcpResult.isError) {
12
- // If it's an error, extract the error message from content
13
- const errorContent = mcpResult.content?.[0];
14
- if (errorContent && 'text' in errorContent) {
15
- throw new Error(errorContent.text);
16
- }
17
- throw new Error('Tool execution failed');
18
- }
19
- // For successful results, try to extract the actual data
20
- const content = mcpResult.content;
21
- if (!content || content.length === 0) {
22
- return undefined;
23
- }
24
- // If there's a single text content, try to parse as JSON
25
- if (content.length === 1 && content[0].type === 'text') {
26
- try {
27
- return JSON.parse(content[0].text);
28
- }
29
- catch {
30
- return content[0].text;
31
- }
32
- }
33
- // Return the raw content for complex results
34
- return content;
35
- }
36
- //# sourceMappingURL=mcp-result.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-result.js","sourceRoot":"","sources":["../../../../src/codecall/utils/mcp-result.ts"],"names":[],"mappings":";AAAA,sDAAsD;;AAQtD,0EA4BC;AAhCD;;;GAGG;AACH,SAAgB,+BAA+B,CAAC,SAAyB;IACvE,+DAA+D;IAC/D,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,2DAA2D;QAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,YAAY,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,yDAAyD;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAClC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["// file: libs/plugins/src/codecall/utils/mcp-result.ts\n\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Extract the actual result from a CallToolResult.\n * MCP returns results wrapped in content array format.\n */\nexport function extractResultFromCallToolResult(mcpResult: CallToolResult): unknown {\n // MCP CallToolResult has { content: [...], isError?: boolean }\n if (mcpResult.isError) {\n // If it's an error, extract the error message from content\n const errorContent = mcpResult.content?.[0];\n if (errorContent && 'text' in errorContent) {\n throw new Error(errorContent.text);\n }\n throw new Error('Tool execution failed');\n }\n\n // For successful results, try to extract the actual data\n const content = mcpResult.content;\n if (!content || content.length === 0) {\n return undefined;\n }\n\n // If there's a single text content, try to parse as JSON\n if (content.length === 1 && content[0].type === 'text') {\n try {\n return JSON.parse(content[0].text);\n } catch {\n return content[0].text;\n }\n }\n\n // Return the raw content for complex results\n return content;\n}\n"]}