@po-ui/mcp 21.8.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/docs-client.d.ts +4 -0
- package/docs-client.js +75 -0
- package/docs-client.js.map +1 -0
- package/index.d.ts +14 -0
- package/index.js +28 -0
- package/index.js.map +1 -0
- package/llms-parser.d.ts +8 -0
- package/llms-parser.js +42 -0
- package/llms-parser.js.map +1 -0
- package/package.json +32 -0
- package/server.d.ts +22 -0
- package/server.js +301 -0
- package/server.js.map +1 -0
package/docs-client.d.ts
ADDED
package/docs-client.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchLlmsTxt = fetchLlmsTxt;
|
|
4
|
+
exports.fetchLlmsFullTxt = fetchLlmsFullTxt;
|
|
5
|
+
exports.fetchComponentDoc = fetchComponentDoc;
|
|
6
|
+
exports.fetchGuide = fetchGuide;
|
|
7
|
+
const https = require("node:https");
|
|
8
|
+
const http = require("node:http");
|
|
9
|
+
const BASE_URL = 'https://po-ui.io';
|
|
10
|
+
const GITHUB_RAW = 'https://raw.githubusercontent.com/po-ui/po-angular/master';
|
|
11
|
+
const FETCH_TIMEOUT_MS = 10_000;
|
|
12
|
+
function fetchUrl(url) {
|
|
13
|
+
return new Promise(resolve => {
|
|
14
|
+
const client = url.startsWith('https') ? https : http;
|
|
15
|
+
const req = client.get(url, { timeout: FETCH_TIMEOUT_MS }, res => {
|
|
16
|
+
// Follow redirects (301/302)
|
|
17
|
+
if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
18
|
+
resolve(fetchUrl(res.headers.location));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const chunks = [];
|
|
22
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
23
|
+
res.on('end', () => {
|
|
24
|
+
const text = Buffer.concat(chunks).toString('utf-8');
|
|
25
|
+
resolve({
|
|
26
|
+
ok: res.statusCode !== undefined && res.statusCode >= 200 && res.statusCode < 300,
|
|
27
|
+
statusCode: res.statusCode,
|
|
28
|
+
text
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
res.on('error', () => resolve({ ok: false, text: '' }));
|
|
32
|
+
});
|
|
33
|
+
req.on('timeout', () => {
|
|
34
|
+
req.destroy();
|
|
35
|
+
resolve({ ok: false, text: 'Request timed out' });
|
|
36
|
+
});
|
|
37
|
+
req.on('error', (err) => resolve({ ok: false, text: err.message }));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function fetchLlmsTxt() {
|
|
41
|
+
const result = await fetchUrl(`${BASE_URL}/llms.txt`);
|
|
42
|
+
if (result.ok)
|
|
43
|
+
return result.text;
|
|
44
|
+
throw new Error(`Falha ao buscar llms.txt (HTTP ${result.statusCode ?? 'desconhecido'})`);
|
|
45
|
+
}
|
|
46
|
+
async function fetchLlmsFullTxt() {
|
|
47
|
+
const result = await fetchUrl(`${BASE_URL}/llms-full.txt`);
|
|
48
|
+
if (result.ok)
|
|
49
|
+
return result.text;
|
|
50
|
+
throw new Error(`Falha ao buscar llms-full.txt (HTTP ${result.statusCode ?? 'desconhecido'})`);
|
|
51
|
+
}
|
|
52
|
+
async function fetchComponentDoc(slug) {
|
|
53
|
+
const primaryUrl = `${BASE_URL}/llms-generated/${slug}.md`;
|
|
54
|
+
const primary = await fetchUrl(primaryUrl);
|
|
55
|
+
if (primary.ok)
|
|
56
|
+
return primary.text;
|
|
57
|
+
// Fallback: GitHub raw
|
|
58
|
+
const fallbackUrl = `${GITHUB_RAW}/projects/portal/src/llms-generated/${slug}.md`;
|
|
59
|
+
const fallback = await fetchUrl(fallbackUrl);
|
|
60
|
+
if (fallback.ok)
|
|
61
|
+
return fallback.text;
|
|
62
|
+
throw new Error(`Documentação não encontrada para o slug "${slug}".\n` +
|
|
63
|
+
`Tentativas:\n` +
|
|
64
|
+
` - ${primaryUrl} (HTTP ${primary.statusCode ?? 'erro'})\n` +
|
|
65
|
+
` - ${fallbackUrl} (HTTP ${fallback.statusCode ?? 'erro'})`);
|
|
66
|
+
}
|
|
67
|
+
async function fetchGuide(name) {
|
|
68
|
+
const guideName = name.endsWith('.md') ? name.slice(0, -3) : name;
|
|
69
|
+
const url = `${GITHUB_RAW}/docs/guides/${guideName}.md`;
|
|
70
|
+
const result = await fetchUrl(url);
|
|
71
|
+
if (result.ok)
|
|
72
|
+
return result.text;
|
|
73
|
+
throw new Error(`Guia "${guideName}" não encontrado (HTTP ${result.statusCode ?? 'desconhecido'}).\n` + `URL tentada: ${url}`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=docs-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-client.js","sourceRoot":"","sources":["../../projects/mcp/src/docs-client.ts"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @po-ui/mcp — MCP Server para documentação do PO UI
|
|
3
|
+
*
|
|
4
|
+
* Configuração (claude_desktop_config.json / cursor settings):
|
|
5
|
+
* {
|
|
6
|
+
* "mcpServers": {
|
|
7
|
+
* "po-ui": {
|
|
8
|
+
* "command": "npx",
|
|
9
|
+
* "args": ["-y", "@po-ui/mcp"]
|
|
10
|
+
* }
|
|
11
|
+
* }
|
|
12
|
+
* }
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
package/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* @po-ui/mcp — MCP Server para documentação do PO UI
|
|
5
|
+
*
|
|
6
|
+
* Configuração (claude_desktop_config.json / cursor settings):
|
|
7
|
+
* {
|
|
8
|
+
* "mcpServers": {
|
|
9
|
+
* "po-ui": {
|
|
10
|
+
* "command": "npx",
|
|
11
|
+
* "args": ["-y", "@po-ui/mcp"]
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
18
|
+
const server_1 = require("./server");
|
|
19
|
+
async function main() {
|
|
20
|
+
const server = (0, server_1.createServer)();
|
|
21
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
22
|
+
await server.connect(transport);
|
|
23
|
+
}
|
|
24
|
+
main().catch(err => {
|
|
25
|
+
process.stderr.write(`[po-ui-mcp] Erro fatal: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../projects/mcp/src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAEH,wEAAiF;AACjF,qCAAwC;AAExC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/llms-parser.d.ts
ADDED
package/llms-parser.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseLlmsTxt = parseLlmsTxt;
|
|
4
|
+
const SECTION_MAP = {
|
|
5
|
+
'componentes e diretivas': 'components',
|
|
6
|
+
'serviços': 'services',
|
|
7
|
+
'interfaces e modelos': 'interfaces',
|
|
8
|
+
'enums': 'enums',
|
|
9
|
+
'guias': 'guides'
|
|
10
|
+
};
|
|
11
|
+
// Matches: - [Name](URL): description OR - [Name](URL)
|
|
12
|
+
const ENTRY_RE = /^- \[([^\]]+)\]\(([^)]+)\)(?::(.*))?$/;
|
|
13
|
+
function parseLlmsTxt(text) {
|
|
14
|
+
const entries = [];
|
|
15
|
+
let currentSection = 'unknown';
|
|
16
|
+
for (const rawLine of text.split('\n')) {
|
|
17
|
+
const line = rawLine.trim();
|
|
18
|
+
if (line.startsWith('## ')) {
|
|
19
|
+
const label = line.slice(3).toLowerCase().trim();
|
|
20
|
+
currentSection = SECTION_MAP[label] ?? label;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const match = ENTRY_RE.exec(line);
|
|
24
|
+
if (!match)
|
|
25
|
+
continue;
|
|
26
|
+
const [, name, url, description = ''] = match;
|
|
27
|
+
// Extract slug from URL path:
|
|
28
|
+
// https://po-ui.io/llms-generated/po-button.md → po-button
|
|
29
|
+
// https://po-ui.io/guides/getting-started → getting-started
|
|
30
|
+
const lastSegment = url.split('/').pop() ?? '';
|
|
31
|
+
const slug = lastSegment.endsWith('.md') ? lastSegment.slice(0, -3) : lastSegment;
|
|
32
|
+
entries.push({
|
|
33
|
+
name,
|
|
34
|
+
slug,
|
|
35
|
+
url,
|
|
36
|
+
description: description.trim(),
|
|
37
|
+
section: currentSection
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return entries;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=llms-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-parser.js","sourceRoot":"","sources":["../../projects/mcp/src/llms-parser.ts"],"names":[],"mappings":";;AAmBA,oCAkCC;AA7CD,MAAM,WAAW,GAA2B;IAC1C,yBAAyB,EAAE,YAAY;IACvC,UAAU,EAAE,UAAU;IACtB,sBAAsB,EAAE,YAAY;IACpC,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,yDAAyD;AACzD,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AAEzD,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,cAAc,GAAG,SAAS,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YACjD,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAE9C,8BAA8B;QAC9B,4DAA4D;QAC5D,mEAAmE;QACnE,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAElF,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@po-ui/mcp",
|
|
3
|
+
"version": "21.8.0",
|
|
4
|
+
"description": "MCP Server para documentação do PO UI — acessa componentes, guias e busca via Model Context Protocol",
|
|
5
|
+
"main": "./index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"po-ui-mcp": "./index.js"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"po-ui",
|
|
11
|
+
"mcp",
|
|
12
|
+
"model-context-protocol",
|
|
13
|
+
"angular",
|
|
14
|
+
"components",
|
|
15
|
+
"documentation",
|
|
16
|
+
"ai"
|
|
17
|
+
],
|
|
18
|
+
"author": "PO UI",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"homepage": "https://po-ui.io",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/po-ui/po-angular"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=18.0.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
30
|
+
"zod": "^3.23.0"
|
|
31
|
+
}
|
|
32
|
+
}
|
package/server.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/** Convert a user-supplied identifier to a slug.
|
|
3
|
+
* Handles: "po-button", "<po-button>", "PoButtonComponent", "PoDialogService"
|
|
4
|
+
*/
|
|
5
|
+
export declare function normaliseSlug(input: string): string;
|
|
6
|
+
interface SearchResult {
|
|
7
|
+
componentName: string;
|
|
8
|
+
context: string;
|
|
9
|
+
}
|
|
10
|
+
/** Extract the heading text from the first `# ...` line, or fallback. */
|
|
11
|
+
export declare function extractHeading(lines: string[]): string;
|
|
12
|
+
/** Return indexes of lines that contain the query (case-insensitive). */
|
|
13
|
+
export declare function findMatchingLineIndexes(lines: string[], lowerQuery: string): number[];
|
|
14
|
+
/** Build a context snippet with ±2 lines around each of the first 3 matches. */
|
|
15
|
+
export declare function buildContextSnippet(lines: string[], matchingIndexes: number[]): string;
|
|
16
|
+
/**
|
|
17
|
+
* Split llms-full.txt into sections by "---" separator,
|
|
18
|
+
* then find sections matching the query and extract context snippets.
|
|
19
|
+
*/
|
|
20
|
+
export declare function searchFullText(fullText: string, query: string, maxResults: number): SearchResult[];
|
|
21
|
+
export declare function createServer(): McpServer;
|
|
22
|
+
export {};
|
package/server.js
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normaliseSlug = normaliseSlug;
|
|
4
|
+
exports.extractHeading = extractHeading;
|
|
5
|
+
exports.findMatchingLineIndexes = findMatchingLineIndexes;
|
|
6
|
+
exports.buildContextSnippet = buildContextSnippet;
|
|
7
|
+
exports.searchFullText = searchFullText;
|
|
8
|
+
exports.createServer = createServer;
|
|
9
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const docs_client_1 = require("./docs-client");
|
|
12
|
+
const llms_parser_1 = require("./llms-parser");
|
|
13
|
+
// Session-scoped cache for the llms.txt index
|
|
14
|
+
let cachedEntries = null;
|
|
15
|
+
async function getLlmsEntries() {
|
|
16
|
+
if (!cachedEntries) {
|
|
17
|
+
const text = await (0, docs_client_1.fetchLlmsTxt)();
|
|
18
|
+
cachedEntries = (0, llms_parser_1.parseLlmsTxt)(text);
|
|
19
|
+
}
|
|
20
|
+
return cachedEntries;
|
|
21
|
+
}
|
|
22
|
+
const SECTION_LABELS = {
|
|
23
|
+
components: 'Componentes e Diretivas',
|
|
24
|
+
services: 'Serviços',
|
|
25
|
+
interfaces: 'Interfaces e Modelos',
|
|
26
|
+
enums: 'Enums',
|
|
27
|
+
guides: 'Guias'
|
|
28
|
+
};
|
|
29
|
+
/** Convert a user-supplied identifier to a slug.
|
|
30
|
+
* Handles: "po-button", "<po-button>", "PoButtonComponent", "PoDialogService"
|
|
31
|
+
*/
|
|
32
|
+
function normaliseSlug(input) {
|
|
33
|
+
let s = input.trim();
|
|
34
|
+
// Strip angle brackets: <po-button> → po-button
|
|
35
|
+
if (s.startsWith('<') && s.endsWith('>')) {
|
|
36
|
+
s = s.slice(1, -1);
|
|
37
|
+
}
|
|
38
|
+
// Convert CamelCase class names to kebab-case
|
|
39
|
+
if (/^[A-Z]/.test(s)) {
|
|
40
|
+
s = s
|
|
41
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
42
|
+
.replace(/(?<=[A-Z])(?=[A-Z][a-z])/g, '-')
|
|
43
|
+
.toLowerCase();
|
|
44
|
+
// Remove trailing "-component" suffix (components use selector as slug, not class name)
|
|
45
|
+
s = s.replace(/-component$/, '');
|
|
46
|
+
}
|
|
47
|
+
return s;
|
|
48
|
+
}
|
|
49
|
+
/** Extract the heading text from the first `# ...` line, or fallback. */
|
|
50
|
+
function extractHeading(lines) {
|
|
51
|
+
return (lines
|
|
52
|
+
.find(l => l.startsWith('# '))
|
|
53
|
+
?.slice(2)
|
|
54
|
+
.trim() ?? 'Desconhecido');
|
|
55
|
+
}
|
|
56
|
+
/** Return indexes of lines that contain the query (case-insensitive). */
|
|
57
|
+
function findMatchingLineIndexes(lines, lowerQuery) {
|
|
58
|
+
const indexes = [];
|
|
59
|
+
for (let i = 0; i < lines.length; i++) {
|
|
60
|
+
if (lines[i].toLowerCase().includes(lowerQuery)) {
|
|
61
|
+
indexes.push(i);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return indexes;
|
|
65
|
+
}
|
|
66
|
+
/** Build a context snippet with ±2 lines around each of the first 3 matches. */
|
|
67
|
+
function buildContextSnippet(lines, matchingIndexes) {
|
|
68
|
+
const contextParts = [];
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
for (const idx of matchingIndexes.slice(0, 3)) {
|
|
71
|
+
const start = Math.max(0, idx - 2);
|
|
72
|
+
const end = Math.min(lines.length - 1, idx + 2);
|
|
73
|
+
for (let i = start; i <= end; i++) {
|
|
74
|
+
if (!seen.has(i)) {
|
|
75
|
+
seen.add(i);
|
|
76
|
+
contextParts.push(lines[i]);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
contextParts.push('...');
|
|
80
|
+
}
|
|
81
|
+
return contextParts.join('\n').trim();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Split llms-full.txt into sections by "---" separator,
|
|
85
|
+
* then find sections matching the query and extract context snippets.
|
|
86
|
+
*/
|
|
87
|
+
function searchFullText(fullText, query, maxResults) {
|
|
88
|
+
const lowerQuery = query.toLowerCase();
|
|
89
|
+
const sections = fullText.split(/\n\n---\n\n/);
|
|
90
|
+
const results = [];
|
|
91
|
+
for (const section of sections) {
|
|
92
|
+
if (!section.toLowerCase().includes(lowerQuery))
|
|
93
|
+
continue;
|
|
94
|
+
const lines = section.split('\n');
|
|
95
|
+
const matchingIndexes = findMatchingLineIndexes(lines, lowerQuery);
|
|
96
|
+
if (matchingIndexes.length === 0)
|
|
97
|
+
continue;
|
|
98
|
+
results.push({
|
|
99
|
+
componentName: extractHeading(lines),
|
|
100
|
+
context: buildContextSnippet(lines, matchingIndexes)
|
|
101
|
+
});
|
|
102
|
+
if (results.length >= maxResults)
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
return results;
|
|
106
|
+
}
|
|
107
|
+
function createServer() {
|
|
108
|
+
const server = new mcp_js_1.McpServer({
|
|
109
|
+
name: 'po-ui',
|
|
110
|
+
version: '1.0.0'
|
|
111
|
+
});
|
|
112
|
+
// ── list_components ─────────────────────────────────────────────────────────
|
|
113
|
+
// @ts-ignore — TS2589: limitação de inferência genérica do @modelcontextprotocol/sdk com zod
|
|
114
|
+
server.registerTool('list_components', {
|
|
115
|
+
description: 'Lista todos os componentes, diretivas, serviços, interfaces e enums do PO UI com descrições resumidas. ' +
|
|
116
|
+
'Use para descobrir quais APIs existem antes de buscar detalhes.',
|
|
117
|
+
inputSchema: {
|
|
118
|
+
section: zod_1.z
|
|
119
|
+
.enum(['components', 'services', 'interfaces', 'enums', 'guides', 'all'])
|
|
120
|
+
.optional()
|
|
121
|
+
.describe('Filtrar por seção: "components", "services", "interfaces", "enums", "guides" ou "all" (padrão).'),
|
|
122
|
+
filter: zod_1.z.string().optional().describe('Filtro de texto livre no nome ou descrição (case-insensitive).')
|
|
123
|
+
}
|
|
124
|
+
}, async ({ section, filter }) => {
|
|
125
|
+
const resolvedSection = section ?? 'all';
|
|
126
|
+
let entries;
|
|
127
|
+
try {
|
|
128
|
+
entries = await getLlmsEntries();
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
132
|
+
return { content: [{ type: 'text', text: `Erro ao carregar índice: ${msg}` }] };
|
|
133
|
+
}
|
|
134
|
+
let results = resolvedSection === 'all' ? entries : entries.filter(e => e.section === resolvedSection);
|
|
135
|
+
if (filter) {
|
|
136
|
+
const q = filter.toLowerCase();
|
|
137
|
+
results = results.filter(e => e.name.toLowerCase().includes(q) || e.description.toLowerCase().includes(q));
|
|
138
|
+
}
|
|
139
|
+
if (results.length === 0) {
|
|
140
|
+
return { content: [{ type: 'text', text: 'Nenhum resultado encontrado.' }] };
|
|
141
|
+
}
|
|
142
|
+
// Group by section
|
|
143
|
+
const grouped = new Map();
|
|
144
|
+
for (const e of results) {
|
|
145
|
+
const arr = grouped.get(e.section) ?? [];
|
|
146
|
+
arr.push(e);
|
|
147
|
+
grouped.set(e.section, arr);
|
|
148
|
+
}
|
|
149
|
+
const lines = [];
|
|
150
|
+
for (const [sec, items] of grouped) {
|
|
151
|
+
lines.push(`## ${SECTION_LABELS[sec] ?? sec}`);
|
|
152
|
+
lines.push('');
|
|
153
|
+
for (const e of items) {
|
|
154
|
+
lines.push(`- **${e.name}** (\`${e.slug}\`): ${e.description}`);
|
|
155
|
+
}
|
|
156
|
+
lines.push('');
|
|
157
|
+
}
|
|
158
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
159
|
+
});
|
|
160
|
+
// ── get_component_docs ───────────────────────────────────────────────────────
|
|
161
|
+
server.registerTool('get_component_docs', {
|
|
162
|
+
description: 'Retorna a documentação completa em Markdown para um componente, serviço, interface ou enum do PO UI. ' +
|
|
163
|
+
'Inclui descrição, tabelas de inputs/outputs/propriedades, tipos e exemplos de uso.',
|
|
164
|
+
inputSchema: {
|
|
165
|
+
slug: zod_1.z
|
|
166
|
+
.string()
|
|
167
|
+
.describe('Slug do componente. Exemplos: "po-button", "po-table", "po-dialog-service", "po-table-column". ' +
|
|
168
|
+
'Aceita também nomes de classe ("PoButtonComponent") e seletores HTML ("<po-button>"). ' +
|
|
169
|
+
'Use list_components para descobrir slugs disponíveis.')
|
|
170
|
+
}
|
|
171
|
+
}, async ({ slug }) => {
|
|
172
|
+
const normalised = normaliseSlug(slug);
|
|
173
|
+
try {
|
|
174
|
+
const markdown = await (0, docs_client_1.fetchComponentDoc)(normalised);
|
|
175
|
+
return { content: [{ type: 'text', text: markdown }] };
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// If normalised slug failed, try the original input as-is
|
|
179
|
+
if (normalised !== slug) {
|
|
180
|
+
try {
|
|
181
|
+
const markdown = await (0, docs_client_1.fetchComponentDoc)(slug);
|
|
182
|
+
return { content: [{ type: 'text', text: markdown }] };
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Fall through to error with suggestions
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Provide helpful suggestions from the index
|
|
189
|
+
try {
|
|
190
|
+
const entries = await getLlmsEntries();
|
|
191
|
+
const q = normalised.toLowerCase();
|
|
192
|
+
const suggestions = entries
|
|
193
|
+
.filter(e => e.slug.includes(q) || q.includes(e.slug.split('-')[0] ?? ''))
|
|
194
|
+
.slice(0, 5)
|
|
195
|
+
.map(e => `- ${e.name} (\`${e.slug}\`)`)
|
|
196
|
+
.join('\n');
|
|
197
|
+
return {
|
|
198
|
+
content: [
|
|
199
|
+
{
|
|
200
|
+
type: 'text',
|
|
201
|
+
text: `Componente "${slug}" não encontrado.\n\n` +
|
|
202
|
+
(suggestions
|
|
203
|
+
? `Sugestões:\n${suggestions}\n\nUse list_components para ver todos.`
|
|
204
|
+
: 'Use list_components para ver todos os slugs disponíveis.')
|
|
205
|
+
}
|
|
206
|
+
]
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return {
|
|
211
|
+
content: [
|
|
212
|
+
{
|
|
213
|
+
type: 'text',
|
|
214
|
+
text: `Componente "${slug}" não encontrado. Use list_components para ver os slugs disponíveis.`
|
|
215
|
+
}
|
|
216
|
+
]
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
// ── search_docs ──────────────────────────────────────────────────────────────
|
|
222
|
+
// @ts-ignore — TS2589: limitação de inferência genérica do @modelcontextprotocol/sdk com zod
|
|
223
|
+
server.registerTool('search_docs', {
|
|
224
|
+
description: 'Busca texto em toda a documentação do PO UI. Útil para encontrar componentes que suportem ' +
|
|
225
|
+
'uma propriedade específica, um comportamento ou um padrão de uso.',
|
|
226
|
+
inputSchema: {
|
|
227
|
+
query: zod_1.z
|
|
228
|
+
.string()
|
|
229
|
+
.min(2)
|
|
230
|
+
.describe('Texto a buscar (case-insensitive). Ex: "upload de arquivo", "p-loading", "lazy load".'),
|
|
231
|
+
max_results: zod_1.z
|
|
232
|
+
.number()
|
|
233
|
+
.int()
|
|
234
|
+
.min(1)
|
|
235
|
+
.max(50)
|
|
236
|
+
.optional()
|
|
237
|
+
.describe('Número máximo de resultados (padrão: 10, máximo: 50).')
|
|
238
|
+
}
|
|
239
|
+
}, async ({ query, max_results }) => {
|
|
240
|
+
const limit = max_results ?? 10;
|
|
241
|
+
let fullText;
|
|
242
|
+
try {
|
|
243
|
+
fullText = await (0, docs_client_1.fetchLlmsFullTxt)();
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
247
|
+
return { content: [{ type: 'text', text: `Erro ao carregar documentação completa: ${msg}` }] };
|
|
248
|
+
}
|
|
249
|
+
const results = searchFullText(fullText, query, limit);
|
|
250
|
+
if (results.length === 0) {
|
|
251
|
+
return {
|
|
252
|
+
content: [{ type: 'text', text: `Nenhum resultado encontrado para "${query}".` }]
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const output = [
|
|
256
|
+
`Encontrados ${results.length} resultado(s) para "${query}":\n`,
|
|
257
|
+
...results.map((r, i) => `### Resultado ${i + 1}: ${r.componentName}\n\`\`\`\n${r.context}\n\`\`\``)
|
|
258
|
+
].join('\n\n');
|
|
259
|
+
return { content: [{ type: 'text', text: output }] };
|
|
260
|
+
});
|
|
261
|
+
// ── get_guide ────────────────────────────────────────────────────────────────
|
|
262
|
+
server.registerTool('get_guide', {
|
|
263
|
+
description: 'Retorna o conteúdo completo de um guia de documentação do PO UI (ex: getting-started, schematics, theme-service). ' +
|
|
264
|
+
'Use list_components com section="guides" para ver os guias disponíveis.',
|
|
265
|
+
inputSchema: {
|
|
266
|
+
guide: zod_1.z
|
|
267
|
+
.string()
|
|
268
|
+
.describe('Nome do guia sem extensão. Exemplos: "getting-started", "schematics", "browser-support", "llms". ' +
|
|
269
|
+
'Aceita também com extensão: "getting-started.md".')
|
|
270
|
+
}
|
|
271
|
+
}, async ({ guide }) => {
|
|
272
|
+
try {
|
|
273
|
+
const content = await (0, docs_client_1.fetchGuide)(guide);
|
|
274
|
+
return { content: [{ type: 'text', text: content }] };
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
278
|
+
// Build helpful error with guide list from the index
|
|
279
|
+
try {
|
|
280
|
+
const entries = await getLlmsEntries();
|
|
281
|
+
const guideList = entries
|
|
282
|
+
.filter(e => e.section === 'guides')
|
|
283
|
+
.map(e => `- ${e.name} (\`${e.slug}\`)`)
|
|
284
|
+
.join('\n');
|
|
285
|
+
return {
|
|
286
|
+
content: [
|
|
287
|
+
{
|
|
288
|
+
type: 'text',
|
|
289
|
+
text: `Erro: ${msg}\n\nGuias disponíveis:\n${guideList || 'Nenhum guia no índice.'}`
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return { content: [{ type: 'text', text: `Erro: ${msg}` }] };
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
return server;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=server.js.map
|
package/server.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../projects/mcp/src/server.ts"],"names":[],"mappings":";;AA2BA,sCAmBC;AAQD,wCAOC;AAGD,0DAQC;AAGD,kDAiBC;AAMD,wCAsBC;AAED,oCAuOC;AAjWD,oEAAoE;AACpE,6BAAwB;AACxB,+CAA8F;AAC9F,+CAAwD;AAExD,8CAA8C;AAC9C,IAAI,aAAa,GAAuB,IAAI,CAAC;AAE7C,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAY,GAAE,CAAC;QAClC,aAAa,GAAG,IAAA,0BAAY,EAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,cAAc,GAA2B;IAC7C,UAAU,EAAE,yBAAyB;IACrC,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,sBAAsB;IAClC,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO;CAChB,CAAC;AAEF;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAErB,gDAAgD;IAChD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,8CAA8C;IAC9C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,CAAC,GAAG,CAAC;aACF,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;aACtC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;aACzC,WAAW,EAAE,CAAC;QACjB,wFAAwF;QACxF,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAOD,yEAAyE;AACzE,SAAgB,cAAc,CAAC,KAAe;IAC5C,OAAO,CACL,KAAK;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,EAAE,KAAK,CAAC,CAAC,CAAC;SACT,IAAI,EAAE,IAAI,cAAc,CAC5B,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAgB,uBAAuB,CAAC,KAAe,EAAE,UAAkB;IACzE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,SAAgB,mBAAmB,CAAC,KAAe,EAAE,eAAyB;IAC5E,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACZ,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,QAAgB,EAAE,KAAa,EAAE,UAAkB;IAChF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS;QAE1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,eAAe,GAAG,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAEnE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE3C,OAAO,CAAC,IAAI,CAAC;YACX,aAAa,EAAE,cAAc,CAAC,KAAK,CAAC;YACpC,OAAO,EAAE,mBAAmB,CAAC,KAAK,EAAE,eAAe,CAAC;SACrD,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,MAAM;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,+EAA+E;IAC/E,6FAA6F;IAC7F,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,yGAAyG;YACzG,iEAAiE;QACnE,WAAW,EAAE;YACX,OAAO,EAAE,OAAC;iBACP,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;iBACxE,QAAQ,EAAE;iBACV,QAAQ,CAAC,iGAAiG,CAAC;YAC9G,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;SACzG;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5B,MAAM,eAAe,GAAG,OAAO,IAAI,KAAK,CAAC;QACzC,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAClF,CAAC;QAED,IAAI,OAAO,GAAG,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC;QAEvG,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE,CAAC;QAC/E,CAAC;QAED,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,gFAAgF;IAChF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,uGAAuG;YACvG,oFAAoF;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CACP,iGAAiG;gBAC/F,wFAAwF;gBACxF,uDAAuD,CAC1D;SACJ;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;YAC1D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAiB,EAAC,IAAI,CAAC,CAAC;oBAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC;oBACP,yCAAyC;gBAC3C,CAAC;YACH,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,OAAO;qBACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBACzE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;qBACvC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,eAAe,IAAI,uBAAuB;gCAC1C,CAAC,WAAW;oCACV,CAAC,CAAC,eAAe,WAAW,yCAAyC;oCACrE,CAAC,CAAC,0DAA0D,CAAC;yBAClE;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,eAAe,IAAI,sEAAsE;yBAChG;qBACF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gFAAgF;IAChF,6FAA6F;IAC7F,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EACT,4FAA4F;YAC5F,mEAAmE;QACrE,WAAW,EAAE;YACX,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,uFAAuF,CAAC;YACpG,WAAW,EAAE,OAAC;iBACX,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACrE;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,WAAW,IAAI,EAAE,CAAC;QAChC,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAA,8BAAgB,GAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACjG,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,KAAK,IAAI,EAAE,CAAC;aAClF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG;YACb,eAAe,OAAO,CAAC,MAAM,uBAAuB,KAAK,MAAM;YAC/D,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,aAAa,aAAa,CAAC,CAAC,OAAO,UAAU,CAAC;SACrG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC,CACF,CAAC;IAEF,gFAAgF;IAChF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,WAAW,EACT,oHAAoH;YACpH,yEAAyE;QAC3E,WAAW,EAAE;YACX,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACP,mGAAmG;gBACjG,mDAAmD,CACtD;SACJ;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,wBAAU,EAAC,KAAK,CAAC,CAAC;YACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE7D,qDAAqD;YACrD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;gBACvC,MAAM,SAAS,GAAG,OAAO;qBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC;qBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;qBACvC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,SAAS,GAAG,2BAA2B,SAAS,IAAI,wBAAwB,EAAE;yBACrF;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|