@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.
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/data/metadata.d.ts +36 -0
- package/dist/data/metadata.d.ts.map +1 -0
- package/dist/data/metadata.js +98 -0
- package/dist/data/metadata.js.map +1 -0
- package/dist/data/paths.d.ts +17 -0
- package/dist/data/paths.d.ts.map +1 -0
- package/dist/data/paths.js +99 -0
- package/dist/data/paths.js.map +1 -0
- package/dist/data/registry.d.ts +48 -0
- package/dist/data/registry.d.ts.map +1 -0
- package/dist/data/registry.js +193 -0
- package/dist/data/registry.js.map +1 -0
- package/dist/data/schema.d.ts +4924 -0
- package/dist/data/schema.d.ts.map +1 -0
- package/dist/data/schema.js +356 -0
- package/dist/data/schema.js.map +1 -0
- package/dist/domain/context.d.ts +11 -0
- package/dist/domain/context.d.ts.map +1 -0
- package/dist/domain/context.js +168 -0
- package/dist/domain/context.js.map +1 -0
- package/dist/domain/formatters.d.ts +64 -0
- package/dist/domain/formatters.d.ts.map +1 -0
- package/dist/domain/formatters.js +607 -0
- package/dist/domain/formatters.js.map +1 -0
- package/dist/domain/resolver.d.ts +19 -0
- package/dist/domain/resolver.d.ts.map +1 -0
- package/dist/domain/resolver.js +146 -0
- package/dist/domain/resolver.js.map +1 -0
- package/dist/domain/search.d.ts +25 -0
- package/dist/domain/search.d.ts.map +1 -0
- package/dist/domain/search.js +177 -0
- package/dist/domain/search.js.map +1 -0
- package/dist/handlers.d.ts +24 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +378 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|