@cl-mcp/core 2.0.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/config.d.ts +18 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +23 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/data/metadata.d.ts +36 -0
  8. package/dist/data/metadata.d.ts.map +1 -0
  9. package/dist/data/metadata.js +98 -0
  10. package/dist/data/metadata.js.map +1 -0
  11. package/dist/data/paths.d.ts +17 -0
  12. package/dist/data/paths.d.ts.map +1 -0
  13. package/dist/data/paths.js +99 -0
  14. package/dist/data/paths.js.map +1 -0
  15. package/dist/data/registry.d.ts +48 -0
  16. package/dist/data/registry.d.ts.map +1 -0
  17. package/dist/data/registry.js +193 -0
  18. package/dist/data/registry.js.map +1 -0
  19. package/dist/data/schema.d.ts +4924 -0
  20. package/dist/data/schema.d.ts.map +1 -0
  21. package/dist/data/schema.js +356 -0
  22. package/dist/data/schema.js.map +1 -0
  23. package/dist/domain/context.d.ts +11 -0
  24. package/dist/domain/context.d.ts.map +1 -0
  25. package/dist/domain/context.js +168 -0
  26. package/dist/domain/context.js.map +1 -0
  27. package/dist/domain/formatters.d.ts +64 -0
  28. package/dist/domain/formatters.d.ts.map +1 -0
  29. package/dist/domain/formatters.js +607 -0
  30. package/dist/domain/formatters.js.map +1 -0
  31. package/dist/domain/resolver.d.ts +19 -0
  32. package/dist/domain/resolver.d.ts.map +1 -0
  33. package/dist/domain/resolver.js +146 -0
  34. package/dist/domain/resolver.js.map +1 -0
  35. package/dist/domain/search.d.ts +25 -0
  36. package/dist/domain/search.d.ts.map +1 -0
  37. package/dist/domain/search.js +177 -0
  38. package/dist/domain/search.js.map +1 -0
  39. package/dist/handlers.d.ts +24 -0
  40. package/dist/handlers.d.ts.map +1 -0
  41. package/dist/handlers.js +378 -0
  42. package/dist/handlers.js.map +1 -0
  43. package/dist/index.d.ts +25 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +28 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/types.d.ts +7 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +6 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +44 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Component name resolution for @cl-mcp/mcp-server.
3
+ *
4
+ * Smart-resolves user input to component names using a cascade of strategies:
5
+ * exact match -> selector match -> normalized selector -> word-subset -> fuzzy substring.
6
+ *
7
+ * Parametric — selector prefix comes from config, not hardcoded.
8
+ */
9
+ export type ResolveResult = {
10
+ resolved: string;
11
+ matchedSelector?: string;
12
+ type?: "component" | "directive";
13
+ } | {
14
+ suggestions: string[];
15
+ } | {
16
+ error: string;
17
+ };
18
+ export declare function resolveComponentName(input: string): ResolveResult;
19
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/domain/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,GAChF;IAAE,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GACzB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAejE"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Component name resolution for @cl-mcp/mcp-server.
3
+ *
4
+ * Smart-resolves user input to component names using a cascade of strategies:
5
+ * exact match -> selector match -> normalized selector -> word-subset -> fuzzy substring.
6
+ *
7
+ * Parametric — selector prefix comes from config, not hardcoded.
8
+ */
9
+ import { getLibraryConfig } from "../config.js";
10
+ import { buildSearchMetadataMap, componentExists, getAvailableComponents, getMetadata } from "../data/metadata.js";
11
+ import { getSearchOptions, searchComponents } from "./search.js";
12
+ export function resolveComponentName(input) {
13
+ // 1. Exact match
14
+ if (componentExists(input)) {
15
+ return { resolved: input };
16
+ }
17
+ const components = getAvailableComponents();
18
+ const metadata = getMetadata();
19
+ // 2. Selector match
20
+ const selectorResult = matchBySelector(input, metadata);
21
+ if (selectorResult)
22
+ return selectorResult;
23
+ // 3. Fuzzy substring match
24
+ return matchBySubstring(input, components);
25
+ }
26
+ // ── Private helpers ─────────────────────────────────────────────────
27
+ function escapeRegex(s) {
28
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
29
+ }
30
+ function matchBySelector(input, metadata) {
31
+ if (!metadata.selectorMap)
32
+ return null;
33
+ const config = getLibraryConfig();
34
+ const selectorPrefix = config.selectorPrefix;
35
+ const prefixRegex = selectorPrefix ? new RegExp(`^${escapeRegex(selectorPrefix)}`) : null;
36
+ const cleanSelector = input.replace(/^</, "").replace(/>$/, "");
37
+ // Direct selector lookup
38
+ const directEntry = metadata.selectorMap[cleanSelector];
39
+ if (directEntry && componentExists(directEntry.component)) {
40
+ return { resolved: directEntry.component, matchedSelector: cleanSelector, type: directEntry.type || "component" };
41
+ }
42
+ // Try with brackets for attribute selectors
43
+ if (!directEntry) {
44
+ const bracketSelector = `[${cleanSelector}]`;
45
+ const bracketEntry = metadata.selectorMap[bracketSelector];
46
+ if (bracketEntry && componentExists(bracketEntry.component)) {
47
+ return {
48
+ resolved: bracketEntry.component,
49
+ matchedSelector: bracketSelector,
50
+ type: bracketEntry.type || "directive",
51
+ };
52
+ }
53
+ }
54
+ // Try with prefix + brackets
55
+ if (!directEntry && selectorPrefix) {
56
+ const prefixedBracketSelector = `[${selectorPrefix.replace(/-$/, "")}${cleanSelector.charAt(0).toUpperCase()}${cleanSelector.slice(1)}]`;
57
+ const prefixedEntry = metadata.selectorMap[prefixedBracketSelector];
58
+ if (prefixedEntry && componentExists(prefixedEntry.component)) {
59
+ return {
60
+ resolved: prefixedEntry.component,
61
+ matchedSelector: prefixedBracketSelector,
62
+ type: prefixedEntry.type || "directive",
63
+ };
64
+ }
65
+ }
66
+ // Normalize input into word parts
67
+ const words = cleanSelector
68
+ .toLowerCase()
69
+ .replace(prefixRegex ?? /(?:)/, "")
70
+ .replace(/[\s_]+/g, "-")
71
+ .split("-")
72
+ .filter(Boolean);
73
+ if (words.length === 0)
74
+ return null;
75
+ // Try exact word order with prefix
76
+ if (selectorPrefix) {
77
+ const directSelector = `${selectorPrefix}${words.join("-")}`;
78
+ const directMatch = metadata.selectorMap[directSelector];
79
+ if (directMatch && componentExists(directMatch.component)) {
80
+ return {
81
+ resolved: directMatch.component,
82
+ matchedSelector: directSelector,
83
+ type: directMatch.type || "component",
84
+ };
85
+ }
86
+ // Try sorted word order
87
+ const sortedSelector = `${selectorPrefix}${[...words].sort().join("-")}`;
88
+ if (sortedSelector !== directSelector) {
89
+ const sortedMatch = metadata.selectorMap[sortedSelector];
90
+ if (sortedMatch && componentExists(sortedMatch.component)) {
91
+ return {
92
+ resolved: sortedMatch.component,
93
+ matchedSelector: sortedSelector,
94
+ type: sortedMatch.type || "component",
95
+ };
96
+ }
97
+ }
98
+ }
99
+ // Word-subset match against all selectors
100
+ const inputSorted = [...words].sort();
101
+ for (const [selector, entry] of Object.entries(metadata.selectorMap)) {
102
+ const selectorClean = prefixRegex ? selector.replace(prefixRegex, "") : selector;
103
+ const selectorWords = selectorClean.split("-").sort();
104
+ const isExactWordMatch = inputSorted.length === selectorWords.length && inputSorted.every((w, i) => w === selectorWords[i]);
105
+ if (isExactWordMatch && componentExists(entry.component)) {
106
+ return { resolved: entry.component, matchedSelector: selector, type: entry.type || "component" };
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ function matchBySubstring(input, components) {
112
+ // "." is stripped so compound React names resolve both ways:
113
+ // "DialogRoot" ↔ "Dialog.Root".
114
+ const normalize = (s) => s.toLowerCase().replace(/[-_.]/g, "");
115
+ const normalizedInput = normalize(input);
116
+ // Exact normalized equality wins before substring containment — otherwise
117
+ // "DialogRoot" is ambiguous between "Dialog.Root" and "AlertDialog.Root".
118
+ const exact = components.filter((name) => normalize(name) === normalizedInput);
119
+ if (exact.length === 1) {
120
+ return { resolved: exact[0] };
121
+ }
122
+ const candidates = components.filter((name) => {
123
+ const normalizedName = normalize(name);
124
+ return normalizedName.includes(normalizedInput) || normalizedInput.includes(normalizedName);
125
+ });
126
+ if (candidates.length === 1) {
127
+ return { resolved: candidates[0] };
128
+ }
129
+ if (candidates.length > 1) {
130
+ return { suggestions: candidates };
131
+ }
132
+ return matchBySemanticSearch(input, components);
133
+ }
134
+ function matchBySemanticSearch(input, components) {
135
+ const metadataMap = buildSearchMetadataMap(components);
136
+ const options = getSearchOptions();
137
+ const results = searchComponents(input, components, metadataMap, options);
138
+ if (results.length === 1) {
139
+ return { resolved: results[0].name, matchedSelector: results[0].matchedSelector };
140
+ }
141
+ if (results.length > 1) {
142
+ return { suggestions: results.map((r) => r.name) };
143
+ }
144
+ return { error: `Component "${input}" does not exist.\n\nAvailable components:\n${components.join(", ")}` };
145
+ }
146
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/domain/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Semantic Search Engine
3
+ *
4
+ * Generic keyword expansion and fuzzy matching for component discovery.
5
+ * Parametric selector prefix — no hardcoded library values.
6
+ */
7
+ export interface ComponentSearchMeta {
8
+ llmSummary?: string;
9
+ selectors?: string[];
10
+ }
11
+ export interface SearchResult {
12
+ name: string;
13
+ score: number;
14
+ reasons: string[];
15
+ matchedSelector?: string;
16
+ }
17
+ export interface SearchOptions {
18
+ selectorPrefix: string;
19
+ keywordExpansions: Record<string, string[]>;
20
+ }
21
+ export declare function searchComponents(query: string, components: string[], componentMetadata: Map<string, ComponentSearchMeta> | undefined, options: SearchOptions): SearchResult[];
22
+ export declare const DEFAULT_KEYWORD_EXPANSIONS: Record<string, string[]>;
23
+ /** Build search options using the current library config and default expansions. */
24
+ export declare function getSearchOptions(): SearchOptions;
25
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/domain/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC7C;AAgKD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAAE,EACpB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,EAC/D,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CAShB;AAID,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA2C/D,CAAC;AAEF,oFAAoF;AACpF,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Semantic Search Engine
3
+ *
4
+ * Generic keyword expansion and fuzzy matching for component discovery.
5
+ * Parametric selector prefix — no hardcoded library values.
6
+ */
7
+ import { getLibraryConfig } from "../config.js";
8
+ // ── Score weights ────────────────────────────────────────────────
9
+ const SCORE = {
10
+ EXACT_SELECTOR: 20,
11
+ PARTIAL_SELECTOR: 15,
12
+ NAME: 10,
13
+ KEYWORD: 8,
14
+ SELECTOR_SUBSTRING: 5,
15
+ SUMMARY: 3,
16
+ };
17
+ // ── Internal helpers ─────────────────────────────────────────────
18
+ function escapeRegex(s) {
19
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
20
+ }
21
+ function buildPrefixRegex(prefix) {
22
+ return prefix ? new RegExp(`^${escapeRegex(prefix)}`) : null;
23
+ }
24
+ function toSortedKey(s) {
25
+ return s.split("-").sort().join("-");
26
+ }
27
+ function normalizeQuery(query, prefixRegex) {
28
+ let q = query.trim();
29
+ q = q.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
30
+ if (prefixRegex) {
31
+ q = q.replace(prefixRegex, "");
32
+ }
33
+ // "." splits compound React names ("Dialog.Root" → dialog, root).
34
+ const words = q.split(/[\s\-_.]+/).filter(Boolean);
35
+ return { normalized: words.join("-"), words };
36
+ }
37
+ function stripPrefix(selector, prefixRegex) {
38
+ return prefixRegex ? selector.replace(prefixRegex, "").toLowerCase() : selector.toLowerCase();
39
+ }
40
+ function matchSelectorExact(selectors, normalized, prefixRegex) {
41
+ const normalizedSorted = toSortedKey(normalized);
42
+ for (const selector of selectors) {
43
+ const stripped = stripPrefix(selector, prefixRegex);
44
+ if (stripped === normalized || toSortedKey(stripped) === normalizedSorted) {
45
+ return { selector, score: SCORE.EXACT_SELECTOR, reason: "exact selector match" };
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ function matchSelectorPartial(selectors, normalized, prefixRegex) {
51
+ const queryWords = normalized.split("-");
52
+ for (const selector of selectors) {
53
+ const stripped = stripPrefix(selector, prefixRegex);
54
+ const selectorWords = stripped.split("-");
55
+ const isWordSubset = queryWords.every((w) => selectorWords.includes(w)) || selectorWords.every((w) => queryWords.includes(w));
56
+ const isStringSubset = stripped.includes(normalized) || normalized.includes(stripped);
57
+ if (isWordSubset || isStringSubset) {
58
+ return { selector, score: SCORE.PARTIAL_SELECTOR, reason: "partial selector match" };
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ function matchSelectorSubstring(selectors, words) {
64
+ for (const selector of selectors) {
65
+ if (words.every((w) => selector.toLowerCase().includes(w))) {
66
+ return { selector, score: SCORE.SELECTOR_SUBSTRING, reason: "selector keyword match" };
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ function matchSelector(selectors, normalized, words, componentName, prefixRegex) {
72
+ const exact = matchSelectorExact(selectors, normalized, prefixRegex);
73
+ if (exact)
74
+ return exact;
75
+ if (normalized === componentName.toLowerCase())
76
+ return null;
77
+ return matchSelectorPartial(selectors, normalized, prefixRegex) ?? matchSelectorSubstring(selectors, words);
78
+ }
79
+ function scoreComponent(componentName, meta, ctx) {
80
+ let score = 0;
81
+ const reasons = [];
82
+ let matchedSelector;
83
+ if (meta?.selectors) {
84
+ const hit = matchSelector(meta.selectors, ctx.normalized, ctx.words, componentName, ctx.prefixRegex);
85
+ if (hit) {
86
+ score += hit.score;
87
+ reasons.push(hit.reason);
88
+ matchedSelector = hit.selector;
89
+ }
90
+ }
91
+ const nameLower = componentName.toLowerCase();
92
+ if (nameLower.includes(ctx.normalized) || ctx.normalized.includes(nameLower)) {
93
+ score += SCORE.NAME;
94
+ reasons.push("name match");
95
+ }
96
+ for (const word of ctx.words) {
97
+ const expanded = ctx.keywordExpansions[word];
98
+ if (expanded?.includes(componentName)) {
99
+ score += SCORE.KEYWORD;
100
+ reasons.push(`keyword "${word}"`);
101
+ }
102
+ }
103
+ if (meta?.llmSummary) {
104
+ const summaryLower = meta.llmSummary.toLowerCase();
105
+ if (ctx.words.some((w) => summaryLower.includes(w))) {
106
+ score += SCORE.SUMMARY;
107
+ reasons.push("summary match");
108
+ }
109
+ }
110
+ if (score === 0)
111
+ return null;
112
+ return { name: componentName, score, reasons: [...new Set(reasons)], matchedSelector };
113
+ }
114
+ // ── Public API ───────────────────────────────────────────────────
115
+ export function searchComponents(query, components, componentMetadata, options) {
116
+ const prefixRegex = buildPrefixRegex(options.selectorPrefix);
117
+ const { normalized, words } = normalizeQuery(query, prefixRegex);
118
+ const ctx = { normalized, words, prefixRegex, keywordExpansions: options.keywordExpansions };
119
+ return components
120
+ .map((name) => scoreComponent(name, componentMetadata?.get(name), ctx))
121
+ .filter((result) => result !== null)
122
+ .sort((a, b) => b.score - a.score);
123
+ }
124
+ // ── Default keyword expansions ───────────────────────────────────
125
+ export const DEFAULT_KEYWORD_EXPANSIONS = {
126
+ dropdown: ["select", "autocomplete", "listbox"],
127
+ notification: ["toast", "feedback-panel", "snackbar", "snack-bar"],
128
+ modal: ["modals", "dialog"],
129
+ popup: ["modals", "tooltip", "dialog"],
130
+ dialog: ["modals", "dialog"],
131
+ button: ["buttons", "button"],
132
+ table: ["tables", "table"],
133
+ date: ["datepicker", "month-picker", "calendar"],
134
+ calendar: ["datepicker", "month-picker"],
135
+ file: ["file-picker"],
136
+ upload: ["file-picker"],
137
+ switch: ["content-switcher", "switchers", "slide-toggle"],
138
+ toggle: ["content-switcher", "checkbox", "slide-toggle"],
139
+ icon: ["icons", "icon"],
140
+ tab: ["tabs"],
141
+ chip: ["tag", "chips"],
142
+ tag: ["tag", "chips"],
143
+ badge: ["badge"],
144
+ tooltip: ["tooltip"],
145
+ spinner: ["spinner", "progress-spinner"],
146
+ loader: ["spinner", "progress-spinner", "progress-bar"],
147
+ progress: ["spinner", "progress-spinner", "progress-bar"],
148
+ radio: ["radio"],
149
+ check: ["checkbox"],
150
+ text: ["input"],
151
+ input: ["input"],
152
+ textarea: ["textarea"],
153
+ menu: ["context-menu", "menu"],
154
+ panel: ["drawer", "feedback-panel", "expansion-panel"],
155
+ sidebar: ["drawer", "sidenav"],
156
+ form: ["input", "labels", "checkbox", "radio", "form-field"],
157
+ label: ["labels", "form-field"],
158
+ search: ["autocomplete"],
159
+ nav: ["tabs", "sidenav", "toolbar"],
160
+ list: ["list"],
161
+ card: ["card"],
162
+ divider: ["divider"],
163
+ accordion: ["expansion-panel"],
164
+ stepper: ["stepper"],
165
+ paginator: ["paginator"],
166
+ sort: ["sort"],
167
+ tree: ["tree"],
168
+ };
169
+ /** Build search options using the current library config and default expansions. */
170
+ export function getSearchOptions() {
171
+ const config = getLibraryConfig();
172
+ return {
173
+ selectorPrefix: config.selectorPrefix,
174
+ keywordExpansions: DEFAULT_KEYWORD_EXPANSIONS,
175
+ };
176
+ }
177
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/domain/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAqBhD,oEAAoE;AAEpE,MAAM,KAAK,GAAG;IACZ,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,EAAE;IACpB,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,CAAC;IACV,kBAAkB,EAAE,CAAC;IACrB,OAAO,EAAE,CAAC;CACF,CAAC;AAEX,oEAAoE;AAEpE,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,WAA0B;IAC/D,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,WAAW,EAAE,CAAC;QAChB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,kEAAkE;IAClE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,WAA0B;IAC/D,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChG,CAAC;AAUD,SAAS,kBAAkB,CAAC,SAAmB,EAAE,UAAkB,EAAE,WAA0B;IAC7F,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpD,IAAI,QAAQ,KAAK,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAC1E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;QACnF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAAmB,EACnB,UAAkB,EAClB,WAA0B;IAE1B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,YAAY,GAChB,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,YAAY,IAAI,cAAc,EAAE,CAAC;YACnC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QACvF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAmB,EAAE,KAAe;IAClE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CACpB,SAAmB,EACnB,UAAkB,EAClB,KAAe,EACf,aAAqB,EACrB,WAA0B;IAE1B,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACrE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,UAAU,KAAK,aAAa,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IAE5D,OAAO,oBAAoB,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,IAAI,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC9G,CAAC;AAWD,SAAS,cAAc,CACrB,aAAqB,EACrB,IAAqC,EACrC,GAAiB;IAEjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,eAAmC,CAAC;IAExC,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACrG,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7E,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;AACzF,CAAC;AAED,oEAAoE;AAEpE,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,UAAoB,EACpB,iBAA+D,EAC/D,OAAsB;IAEtB,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACjE,MAAM,GAAG,GAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAE3G,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;SACtE,MAAM,CAAC,CAAC,MAAM,EAA0B,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC;SAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,oEAAoE;AAEpE,MAAM,CAAC,MAAM,0BAA0B,GAA6B;IAClE,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC;IAC/C,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,CAAC;IAClE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC3B,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;IACtC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC1B,IAAI,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,CAAC;IAChD,QAAQ,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC;IACxC,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,MAAM,EAAE,CAAC,aAAa,CAAC;IACvB,MAAM,EAAE,CAAC,kBAAkB,EAAE,WAAW,EAAE,cAAc,CAAC;IACzD,MAAM,EAAE,CAAC,kBAAkB,EAAE,UAAU,EAAE,cAAc,CAAC;IACxD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,CAAC,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;IACtB,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,OAAO,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACxC,MAAM,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,cAAc,CAAC;IACvD,QAAQ,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,cAAc,CAAC;IACzD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,IAAI,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;IACtD,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC9B,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC;IAC5D,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC/B,MAAM,EAAE,CAAC,cAAc,CAAC;IACxB,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;IACnC,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,SAAS,EAAE,CAAC,iBAAiB,CAAC;IAC9B,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,CAAC;CACf,CAAC;AAEF,oFAAoF;AACpF,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,iBAAiB,EAAE,0BAA0B;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Tool handlers — the application layer of cl-mcp.
3
+ *
4
+ * Transport-agnostic: every handler is a pure `args → ToolResponse` function
5
+ * with NO dependency on the MCP SDK or any I/O channel. The MCP server
6
+ * (`@cl-mcp/mcp-server`) registers these behind `tools/call`; the CLI
7
+ * (`@cl-mcp/cli`) invokes them directly. Both frontends therefore share one
8
+ * implementation by construction.
9
+ *
10
+ * Multi-library mode: every tool accepts an optional `library` argument, and
11
+ * component names accept a `lib:Name` qualifier. When neither is given, the
12
+ * handler resolves the component across ALL loaded libraries (unambiguous hit
13
+ * wins; ambiguity returns qualified suggestions). Handlers compute
14
+ * synchronously, so switching the active library per request is safe.
15
+ */
16
+ export interface ToolResponse {
17
+ content: Array<{
18
+ type: "text";
19
+ text: string;
20
+ }>;
21
+ isError?: true;
22
+ }
23
+ export declare const TOOL_HANDLERS: Record<string, (args: Record<string, unknown>) => ToolResponse>;
24
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAyBH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AA6ZD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,YAAY,CAOzF,CAAC"}