@pinepaper.studio/mcp-server 1.3.0 → 1.3.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 (48) hide show
  1. package/dist/taxonomy/classifier.d.ts +74 -0
  2. package/dist/taxonomy/classifier.d.ts.map +1 -0
  3. package/dist/taxonomy/classifier.js +448 -0
  4. package/dist/taxonomy/classifier.js.map +1 -0
  5. package/dist/taxonomy/error-recovery.d.ts +55 -0
  6. package/dist/taxonomy/error-recovery.d.ts.map +1 -0
  7. package/dist/taxonomy/error-recovery.js +205 -0
  8. package/dist/taxonomy/error-recovery.js.map +1 -0
  9. package/dist/taxonomy/index.d.ts +24 -0
  10. package/dist/taxonomy/index.d.ts.map +1 -0
  11. package/dist/taxonomy/index.js +25 -0
  12. package/dist/taxonomy/index.js.map +1 -0
  13. package/dist/taxonomy/matcher.d.ts +104 -0
  14. package/dist/taxonomy/matcher.d.ts.map +1 -0
  15. package/dist/taxonomy/matcher.js +473 -0
  16. package/dist/taxonomy/matcher.js.map +1 -0
  17. package/dist/taxonomy/registry.d.ts +56 -0
  18. package/dist/taxonomy/registry.d.ts.map +1 -0
  19. package/dist/taxonomy/registry.js +950 -0
  20. package/dist/taxonomy/registry.js.map +1 -0
  21. package/dist/taxonomy/types.d.ts +207 -0
  22. package/dist/taxonomy/types.d.ts.map +1 -0
  23. package/dist/taxonomy/types.js +29 -0
  24. package/dist/taxonomy/types.js.map +1 -0
  25. package/dist/tools/definitions.d.ts.map +1 -1
  26. package/dist/tools/definitions.js +266 -0
  27. package/dist/tools/definitions.js.map +1 -1
  28. package/dist/tools/handlers.d.ts.map +1 -1
  29. package/dist/tools/handlers.js +19 -1
  30. package/dist/tools/handlers.js.map +1 -1
  31. package/dist/tools/p5-compat/index.d.ts +8 -0
  32. package/dist/tools/p5-compat/index.d.ts.map +1 -0
  33. package/dist/tools/p5-compat/index.js +8 -0
  34. package/dist/tools/p5-compat/index.js.map +1 -0
  35. package/dist/tools/p5-compat/p5-helpers.d.ts +25 -0
  36. package/dist/tools/p5-compat/p5-helpers.d.ts.map +1 -0
  37. package/dist/tools/p5-compat/p5-helpers.js +399 -0
  38. package/dist/tools/p5-compat/p5-helpers.js.map +1 -0
  39. package/dist/types/code-generator.d.ts +9 -1
  40. package/dist/types/code-generator.d.ts.map +1 -1
  41. package/dist/types/code-generator.js +176 -1
  42. package/dist/types/code-generator.js.map +1 -1
  43. package/dist/types/schemas.d.ts +227 -0
  44. package/dist/types/schemas.d.ts.map +1 -1
  45. package/dist/types/schemas.js +57 -0
  46. package/dist/types/schemas.js.map +1 -1
  47. package/manifest.json +9 -1
  48. package/package.json +1 -1
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Intent Classifier
3
+ *
4
+ * High-level classifier that combines taxonomy matching, modifier detection,
5
+ * entity extraction, and parameter inference to understand user intent
6
+ * and recommend the best MCP tool.
7
+ */
8
+ import type { SupportedLocale } from '../i18n/types.js';
9
+ import type { IntentAnalysis, TaxonomyError, TaxonomyConfig } from './types.js';
10
+ /**
11
+ * Intent Classifier
12
+ *
13
+ * Analyzes user input to determine intent and recommend appropriate MCP tools.
14
+ */
15
+ export declare class IntentClassifier {
16
+ private matcher;
17
+ private config;
18
+ private initialized;
19
+ constructor(config?: Partial<TaxonomyConfig>);
20
+ /**
21
+ * Initialize the classifier
22
+ */
23
+ initialize(): Promise<void>;
24
+ /**
25
+ * Classify user input and recommend tool
26
+ */
27
+ classify(input: string, providedLocale?: SupportedLocale): Promise<IntentAnalysis>;
28
+ /**
29
+ * Extract entities from user input
30
+ */
31
+ private extractEntities;
32
+ /**
33
+ * Build tool parameters from classification and entities
34
+ */
35
+ private buildToolParams;
36
+ /**
37
+ * Convert position keyword to coordinates
38
+ */
39
+ private positionKeywordToCoordinates;
40
+ /**
41
+ * Check if clarification is needed
42
+ */
43
+ private needsClarification;
44
+ /**
45
+ * Build clarification prompt
46
+ */
47
+ private buildClarificationPrompt;
48
+ /**
49
+ * Get suggestions when no match is found
50
+ */
51
+ private getSuggestions;
52
+ /**
53
+ * Validate a tool selection against the taxonomy
54
+ */
55
+ validateToolSelection(toolName: string, userInput: string): Promise<TaxonomyError | null>;
56
+ /**
57
+ * Get tool recommendation with rich context
58
+ */
59
+ getRecommendation(input: string, locale?: SupportedLocale): Promise<{
60
+ tool: string;
61
+ params: Record<string, unknown>;
62
+ confidence: number;
63
+ explanation: string;
64
+ } | null>;
65
+ }
66
+ /**
67
+ * Get or create the singleton IntentClassifier instance
68
+ */
69
+ export declare function getIntentClassifier(config?: Partial<TaxonomyConfig>): IntentClassifier;
70
+ /**
71
+ * Reset the singleton instance (for testing)
72
+ */
73
+ export declare function resetIntentClassifier(): void;
74
+ //# sourceMappingURL=classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/taxonomy/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAEV,cAAc,EAId,aAAa,EAEb,cAAc,EACf,MAAM,YAAY,CAAC;AAuFpB;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAY5C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA4ExF;;OAEG;IACH,OAAO,CAAC,eAAe;IAwFvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwDvB;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAqBpC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA6B/F;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;QACxE,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI,CAAC;CAmBV;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAKtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,448 @@
1
+ /**
2
+ * Intent Classifier
3
+ *
4
+ * High-level classifier that combines taxonomy matching, modifier detection,
5
+ * entity extraction, and parameter inference to understand user intent
6
+ * and recommend the best MCP tool.
7
+ */
8
+ import { getTaxonomyMatcher } from './matcher.js';
9
+ import { ANIMATION_TAXONOMY } from './registry.js';
10
+ /**
11
+ * Color name to hex mapping for common colors
12
+ */
13
+ const COLOR_MAP = {
14
+ // Basic colors
15
+ red: '#ff0000',
16
+ green: '#00ff00',
17
+ blue: '#0000ff',
18
+ yellow: '#ffff00',
19
+ orange: '#ffa500',
20
+ purple: '#800080',
21
+ pink: '#ffc0cb',
22
+ white: '#ffffff',
23
+ black: '#000000',
24
+ gray: '#808080',
25
+ grey: '#808080',
26
+ brown: '#a52a2a',
27
+ cyan: '#00ffff',
28
+ magenta: '#ff00ff',
29
+ // Extended colors
30
+ gold: '#ffd700',
31
+ silver: '#c0c0c0',
32
+ navy: '#000080',
33
+ teal: '#008080',
34
+ maroon: '#800000',
35
+ olive: '#808000',
36
+ lime: '#00ff00',
37
+ aqua: '#00ffff',
38
+ coral: '#ff7f50',
39
+ salmon: '#fa8072',
40
+ turquoise: '#40e0d0',
41
+ violet: '#ee82ee',
42
+ indigo: '#4b0082',
43
+ crimson: '#dc143c',
44
+ beige: '#f5f5dc',
45
+ ivory: '#fffff0',
46
+ lavender: '#e6e6fa',
47
+ // Multilingual color names
48
+ rojo: '#ff0000',
49
+ verde: '#00ff00',
50
+ azul: '#0000ff',
51
+ amarillo: '#ffff00',
52
+ naranja: '#ffa500',
53
+ morado: '#800080',
54
+ blanco: '#ffffff',
55
+ negro: '#000000',
56
+ rouge: '#ff0000',
57
+ vert: '#00ff00',
58
+ bleu: '#0000ff',
59
+ jaune: '#ffff00',
60
+ blanc: '#ffffff',
61
+ noir: '#000000',
62
+ rot: '#ff0000',
63
+ grün: '#00ff00',
64
+ blau: '#0000ff',
65
+ gelb: '#ffff00',
66
+ weiss: '#ffffff',
67
+ schwarz: '#000000',
68
+ };
69
+ /**
70
+ * Patterns for extracting entities from user input
71
+ */
72
+ const ENTITY_PATTERNS = {
73
+ // Hex color (#fff, #ffffff)
74
+ hexColor: /#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b/g,
75
+ // RGB/RGBA
76
+ rgbColor: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/gi,
77
+ // Numbers with optional units
78
+ number: /\b(\d+(?:\.\d+)?)\s*(px|%|deg|s|ms|seconds?)?\b/gi,
79
+ // Position keywords
80
+ position: /\b(center|top|bottom|left|right|top-left|top-right|bottom-left|bottom-right|middle)\b/gi,
81
+ // Named items (quoted strings or specific patterns)
82
+ quotedString: /"([^"]+)"|'([^']+)'/g,
83
+ };
84
+ /**
85
+ * Intent Classifier
86
+ *
87
+ * Analyzes user input to determine intent and recommend appropriate MCP tools.
88
+ */
89
+ export class IntentClassifier {
90
+ matcher;
91
+ config;
92
+ initialized = false;
93
+ constructor(config) {
94
+ this.config = {
95
+ minConfidence: 0.6,
96
+ useSemanticSearch: false,
97
+ maxSuggestions: 3,
98
+ defaultLocale: 'en',
99
+ debug: false,
100
+ ...config,
101
+ };
102
+ this.matcher = getTaxonomyMatcher(config);
103
+ }
104
+ /**
105
+ * Initialize the classifier
106
+ */
107
+ async initialize() {
108
+ if (this.initialized)
109
+ return;
110
+ await this.matcher.initialize();
111
+ this.initialized = true;
112
+ }
113
+ /**
114
+ * Classify user input and recommend tool
115
+ */
116
+ async classify(input, providedLocale) {
117
+ if (!this.initialized) {
118
+ await this.initialize();
119
+ }
120
+ // 1. Detect language
121
+ const detectedLocale = providedLocale || this.matcher.detectLocale(input);
122
+ // 2. Find taxonomy matches
123
+ const matches = await this.matcher.findMatches(input, detectedLocale);
124
+ // 3. Detect modifiers
125
+ const modifierMatches = this.matcher.detectModifiers(input, detectedLocale);
126
+ const activeModifiers = modifierMatches.map((m) => m.modifier);
127
+ // 4. Extract entities
128
+ const entities = this.extractEntities(input);
129
+ // 5. Build classification result
130
+ let classification;
131
+ if (matches.length === 0) {
132
+ classification = {
133
+ method: 'unknown',
134
+ confidence: 0,
135
+ suggestions: this.getSuggestions(input),
136
+ detectedLocale,
137
+ };
138
+ }
139
+ else {
140
+ const bestMatch = matches[0];
141
+ classification = {
142
+ method: bestMatch.similarity > 0.85 ? 'keyword' : 'pattern',
143
+ confidence: bestMatch.similarity,
144
+ node: bestMatch.node,
145
+ modifiers: activeModifiers,
146
+ extractedParams: this.matcher.extractParameters(input, bestMatch.node, detectedLocale),
147
+ detectedLocale,
148
+ };
149
+ }
150
+ // 6. Build recommended tool call
151
+ let recommendedTool;
152
+ if (classification.node) {
153
+ const params = this.buildToolParams(classification.node, classification, entities, activeModifiers);
154
+ recommendedTool = {
155
+ name: classification.node.tool.tool,
156
+ params,
157
+ };
158
+ }
159
+ // 7. Check if clarification is needed
160
+ const needsClarification = this.needsClarification(classification, matches);
161
+ // 8. Build alternatives
162
+ const alternatives = matches.length > 1
163
+ ? matches.slice(1).map((m) => ({
164
+ method: 'pattern',
165
+ confidence: m.similarity,
166
+ node: m.node,
167
+ detectedLocale,
168
+ }))
169
+ : undefined;
170
+ return {
171
+ classification,
172
+ entities,
173
+ recommendedTool,
174
+ alternatives,
175
+ needsClarification,
176
+ clarificationPrompt: needsClarification ? this.buildClarificationPrompt(matches, input) : undefined,
177
+ };
178
+ }
179
+ /**
180
+ * Extract entities from user input
181
+ */
182
+ extractEntities(input) {
183
+ const entities = [];
184
+ // Extract hex colors
185
+ const hexMatches = input.matchAll(ENTITY_PATTERNS.hexColor);
186
+ for (const match of hexMatches) {
187
+ entities.push({
188
+ type: 'color',
189
+ value: match[0],
190
+ normalized: match[0].toLowerCase(),
191
+ position: { start: match.index, end: match.index + match[0].length },
192
+ });
193
+ }
194
+ // Extract RGB colors
195
+ const rgbMatches = input.matchAll(ENTITY_PATTERNS.rgbColor);
196
+ for (const match of rgbMatches) {
197
+ const r = parseInt(match[1], 10);
198
+ const g = parseInt(match[2], 10);
199
+ const b = parseInt(match[3], 10);
200
+ const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
201
+ entities.push({
202
+ type: 'color',
203
+ value: match[0],
204
+ normalized: hex,
205
+ position: { start: match.index, end: match.index + match[0].length },
206
+ });
207
+ }
208
+ // Extract named colors
209
+ const lowerInput = input.toLowerCase();
210
+ for (const [name, hex] of Object.entries(COLOR_MAP)) {
211
+ const index = lowerInput.indexOf(name);
212
+ if (index !== -1) {
213
+ // Check it's a word boundary
214
+ const before = index > 0 ? lowerInput[index - 1] : ' ';
215
+ const after = lowerInput[index + name.length] || ' ';
216
+ if (/\s|^/.test(before) && /\s|$|[.,!?;:]/.test(after)) {
217
+ entities.push({
218
+ type: 'color',
219
+ value: name,
220
+ normalized: hex,
221
+ position: { start: index, end: index + name.length },
222
+ });
223
+ }
224
+ }
225
+ }
226
+ // Extract numbers
227
+ const numberMatches = input.matchAll(ENTITY_PATTERNS.number);
228
+ for (const match of numberMatches) {
229
+ const value = parseFloat(match[1]);
230
+ const unit = match[2]?.toLowerCase();
231
+ entities.push({
232
+ type: 'number',
233
+ value: match[0],
234
+ normalized: { value, unit },
235
+ position: { start: match.index, end: match.index + match[0].length },
236
+ });
237
+ }
238
+ // Extract positions
239
+ const positionMatches = input.matchAll(ENTITY_PATTERNS.position);
240
+ for (const match of positionMatches) {
241
+ entities.push({
242
+ type: 'position',
243
+ value: match[0],
244
+ normalized: match[0].toLowerCase(),
245
+ position: { start: match.index, end: match.index + match[0].length },
246
+ });
247
+ }
248
+ // Extract quoted strings (names, labels)
249
+ const quotedMatches = input.matchAll(ENTITY_PATTERNS.quotedString);
250
+ for (const match of quotedMatches) {
251
+ const content = match[1] || match[2];
252
+ entities.push({
253
+ type: 'name',
254
+ value: content,
255
+ normalized: content,
256
+ position: { start: match.index, end: match.index + match[0].length },
257
+ });
258
+ }
259
+ return entities;
260
+ }
261
+ /**
262
+ * Build tool parameters from classification and entities
263
+ */
264
+ buildToolParams(node, classification, entities, modifiers) {
265
+ const params = {
266
+ ...node.tool.defaultParams,
267
+ ...classification.extractedParams,
268
+ };
269
+ // Apply modifier modifications
270
+ for (const modifier of modifiers) {
271
+ Object.assign(params, modifier.modifications);
272
+ }
273
+ // Apply entities
274
+ const colorEntity = entities.find((e) => e.type === 'color');
275
+ if (colorEntity && !params.fillColor) {
276
+ params.fillColor = colorEntity.normalized;
277
+ }
278
+ // Apply position if found
279
+ const positionEntity = entities.find((e) => e.type === 'position');
280
+ if (positionEntity && !params.position) {
281
+ params.position = this.positionKeywordToCoordinates(positionEntity.normalized);
282
+ }
283
+ // Apply size/radius from numbers
284
+ const numberEntities = entities.filter((e) => e.type === 'number');
285
+ for (const numEntity of numberEntities) {
286
+ const { value, unit } = numEntity.normalized;
287
+ if (unit === 'px' || unit === undefined) {
288
+ // Could be radius or size
289
+ if (!params.radius && node.id.includes('circle')) {
290
+ params.radius = value;
291
+ }
292
+ else if (!params.size) {
293
+ params.size = value;
294
+ }
295
+ }
296
+ else if (unit === 's' || unit === 'seconds') {
297
+ params.duration = value;
298
+ }
299
+ else if (unit === 'deg') {
300
+ params.angle = value;
301
+ }
302
+ }
303
+ // Apply name/content from quoted strings
304
+ const nameEntity = entities.find((e) => e.type === 'name');
305
+ if (nameEntity && node.id === 'create_text') {
306
+ params.content = nameEntity.normalized;
307
+ }
308
+ return params;
309
+ }
310
+ /**
311
+ * Convert position keyword to coordinates
312
+ */
313
+ positionKeywordToCoordinates(keyword) {
314
+ // Default canvas size assumptions (can be made configurable)
315
+ const width = 1920;
316
+ const height = 1080;
317
+ const positions = {
318
+ center: { x: width / 2, y: height / 2 },
319
+ middle: { x: width / 2, y: height / 2 },
320
+ top: { x: width / 2, y: 100 },
321
+ bottom: { x: width / 2, y: height - 100 },
322
+ left: { x: 100, y: height / 2 },
323
+ right: { x: width - 100, y: height / 2 },
324
+ 'top-left': { x: 100, y: 100 },
325
+ 'top-right': { x: width - 100, y: 100 },
326
+ 'bottom-left': { x: 100, y: height - 100 },
327
+ 'bottom-right': { x: width - 100, y: height - 100 },
328
+ };
329
+ return positions[keyword] || positions.center;
330
+ }
331
+ /**
332
+ * Check if clarification is needed
333
+ */
334
+ needsClarification(classification, matches) {
335
+ // Unknown classification
336
+ if (classification.method === 'unknown') {
337
+ return true;
338
+ }
339
+ // Low confidence
340
+ if (classification.confidence < this.config.minConfidence) {
341
+ return true;
342
+ }
343
+ // Multiple high-confidence matches (ambiguous)
344
+ if (matches.length >= 2) {
345
+ const secondBest = matches[1];
346
+ if (secondBest.similarity > 0.7 && classification.confidence - secondBest.similarity < 0.1) {
347
+ return true;
348
+ }
349
+ }
350
+ return false;
351
+ }
352
+ /**
353
+ * Build clarification prompt
354
+ */
355
+ buildClarificationPrompt(matches, input) {
356
+ if (matches.length === 0) {
357
+ return `I couldn't understand what you want to do with "${input}". Could you rephrase or be more specific?`;
358
+ }
359
+ if (matches.length === 1 && matches[0].similarity < this.config.minConfidence) {
360
+ return `Did you mean "${matches[0].node.id.replace(/_/g, ' ')}"? (Confidence: ${Math.round(matches[0].similarity * 100)}%)`;
361
+ }
362
+ // Multiple ambiguous matches
363
+ const options = matches
364
+ .slice(0, 3)
365
+ .map((m, i) => `${i + 1}. ${m.node.id.replace(/_/g, ' ')} (${Math.round(m.similarity * 100)}%)`)
366
+ .join('\n');
367
+ return `I found multiple possible interpretations:\n${options}\n\nWhich one did you mean?`;
368
+ }
369
+ /**
370
+ * Get suggestions when no match is found
371
+ */
372
+ getSuggestions(input) {
373
+ // Return common concepts as suggestions
374
+ const commonConcepts = [
375
+ 'create_circle',
376
+ 'create_rectangle',
377
+ 'create_text',
378
+ 'rotation',
379
+ 'orbital_motion',
380
+ 'pulse',
381
+ 'fade',
382
+ ];
383
+ return commonConcepts.slice(0, this.config.maxSuggestions);
384
+ }
385
+ /**
386
+ * Validate a tool selection against the taxonomy
387
+ */
388
+ async validateToolSelection(toolName, userInput) {
389
+ // Find taxonomy node for this tool
390
+ const matchingNode = ANIMATION_TAXONOMY.find((n) => n.tool.tool === toolName);
391
+ if (!matchingNode) {
392
+ // Tool not in taxonomy, can't validate
393
+ return null;
394
+ }
395
+ // Check if user input aligns with this tool's concept
396
+ const matches = await this.matcher.findMatches(userInput);
397
+ const topMatch = matches[0];
398
+ if (!topMatch) {
399
+ return null; // Can't determine mismatch
400
+ }
401
+ if (topMatch.node.tool.tool !== toolName && topMatch.similarity > 0.8) {
402
+ return {
403
+ code: 'TAXONOMY_AMBIGUOUS',
404
+ message: `Tool "${toolName}" may not be the best choice for this request`,
405
+ suggestions: [topMatch.node.tool.tool],
406
+ hint: `Consider using "${topMatch.node.tool.tool}" instead (matched "${topMatch.matchedTerm}" with ${Math.round(topMatch.similarity * 100)}% confidence)`,
407
+ };
408
+ }
409
+ return null;
410
+ }
411
+ /**
412
+ * Get tool recommendation with rich context
413
+ */
414
+ async getRecommendation(input, locale) {
415
+ const analysis = await this.classify(input, locale);
416
+ if (!analysis.recommendedTool) {
417
+ return null;
418
+ }
419
+ const explanation = analysis.classification.node
420
+ ? `Matched "${analysis.classification.node.id}" via ${analysis.classification.method} ` +
421
+ `(${Math.round(analysis.classification.confidence * 100)}% confidence)`
422
+ : 'No specific match found';
423
+ return {
424
+ tool: analysis.recommendedTool.name,
425
+ params: analysis.recommendedTool.params,
426
+ confidence: analysis.classification.confidence,
427
+ explanation,
428
+ };
429
+ }
430
+ }
431
+ // Singleton instance
432
+ let classifierInstance = null;
433
+ /**
434
+ * Get or create the singleton IntentClassifier instance
435
+ */
436
+ export function getIntentClassifier(config) {
437
+ if (!classifierInstance) {
438
+ classifierInstance = new IntentClassifier(config);
439
+ }
440
+ return classifierInstance;
441
+ }
442
+ /**
443
+ * Reset the singleton instance (for testing)
444
+ */
445
+ export function resetIntentClassifier() {
446
+ classifierInstance = null;
447
+ }
448
+ //# sourceMappingURL=classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/taxonomy/classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Rich Error Recovery with Taxonomy Suggestions
3
+ *
4
+ * Provides intelligent error messages with suggestions based on
5
+ * the semantic taxonomy. Helps users and AI understand how to
6
+ * fix mistakes and find the right tools.
7
+ */
8
+ import type { SupportedLocale } from '../i18n/types.js';
9
+ import type { TaxonomyErrorCode, TaxonomyMatch } from './types.js';
10
+ /**
11
+ * Error recovery context with rich suggestions
12
+ */
13
+ export interface ErrorRecoveryContext {
14
+ /** The original error */
15
+ error: string;
16
+ /** Error code for programmatic handling */
17
+ code: TaxonomyErrorCode | string;
18
+ /** Human-readable hint */
19
+ hint?: string;
20
+ /** Suggested alternative tools or actions */
21
+ suggestions?: string[];
22
+ /** Available items that might be relevant */
23
+ availableItems?: Array<{
24
+ id: string;
25
+ type: string;
26
+ }>;
27
+ /** Similar concepts from taxonomy */
28
+ similarConcepts?: TaxonomyMatch[];
29
+ /** Did you mean this item? */
30
+ didYouMean?: string;
31
+ /** Example of correct usage */
32
+ example?: string;
33
+ }
34
+ /**
35
+ * Build rich error recovery context for common errors
36
+ */
37
+ export declare function buildErrorRecovery(errorType: string, context: {
38
+ failedId?: string;
39
+ availableItems?: Array<{
40
+ id: string;
41
+ type: string;
42
+ }>;
43
+ userInput?: string;
44
+ toolName?: string;
45
+ locale?: SupportedLocale;
46
+ }): ErrorRecoveryContext;
47
+ /**
48
+ * Format error context for MCP response
49
+ */
50
+ export declare function formatRichError(context: ErrorRecoveryContext): string;
51
+ /**
52
+ * Build taxonomy-aware error for tool validation
53
+ */
54
+ export declare function validateToolWithTaxonomy(toolName: string, userInput: string, locale?: SupportedLocale): Promise<ErrorRecoveryContext | null>;
55
+ //# sourceMappingURL=error-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-recovery.d.ts","sourceRoot":"","sources":["../../src/taxonomy/error-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAiB,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIlF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACjC,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,qCAAqC;IACrC,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,GACA,oBAAoB,CA0FtB;AA6ED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CA2BrE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAyBtC"}