@creatorem/mcp-server 0.1.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/README.md +29 -0
- package/dist/src/cache.d.ts +8 -0
- package/dist/src/cache.d.ts.map +1 -0
- package/dist/src/cache.js +28 -0
- package/dist/src/cache.js.map +1 -0
- package/dist/src/capability-search.d.ts +7 -0
- package/dist/src/capability-search.d.ts.map +1 -0
- package/dist/src/capability-search.js +50 -0
- package/dist/src/capability-search.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +37 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/docs-client.d.ts +17 -0
- package/dist/src/docs-client.d.ts.map +1 -0
- package/dist/src/docs-client.js +164 -0
- package/dist/src/docs-client.js.map +1 -0
- package/dist/src/env.d.ts +3 -0
- package/dist/src/env.d.ts.map +1 -0
- package/dist/src/env.js +36 -0
- package/dist/src/env.js.map +1 -0
- package/dist/src/errors.d.ts +11 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +21 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/rpc-server.d.ts +15 -0
- package/dist/src/rpc-server.d.ts.map +1 -0
- package/dist/src/rpc-server.js +189 -0
- package/dist/src/rpc-server.js.map +1 -0
- package/dist/src/tools.d.ts +8 -0
- package/dist/src/tools.d.ts.map +1 -0
- package/dist/src/tools.js +268 -0
- package/dist/src/tools.js.map +1 -0
- package/dist/src/types.d.ts +53 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/url-utils.d.ts +3 -0
- package/dist/src/url-utils.d.ts.map +1 -0
- package/dist/src/url-utils.js +31 -0
- package/dist/src/url-utils.js.map +1 -0
- package/dist/tests/capability-search.test.d.ts +2 -0
- package/dist/tests/capability-search.test.d.ts.map +1 -0
- package/dist/tests/capability-search.test.js +40 -0
- package/dist/tests/capability-search.test.js.map +1 -0
- package/dist/tests/url-utils.test.d.ts +2 -0
- package/dist/tests/url-utils.test.d.ts.map +1 -0
- package/dist/tests/url-utils.test.js +22 -0
- package/dist/tests/url-utils.test.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @creatorem/mcp-server
|
|
2
|
+
|
|
3
|
+
Installable MCP server exposing Creatorem documentation capabilities for coding agents.
|
|
4
|
+
|
|
5
|
+
## Run
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx @creatorem/mcp-server
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or in this monorepo:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm --filter @creatorem/mcp-server build
|
|
15
|
+
pnpm --filter @creatorem/mcp-server start
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Environment Variables
|
|
19
|
+
|
|
20
|
+
- `CREATOREM_MCP_BASE_URL`: Base URL for docs endpoints (default: `https://creatorem.com`)
|
|
21
|
+
- `CREATOREM_MCP_TIMEOUT_MS`: Upstream HTTP timeout in ms (default: `10000`)
|
|
22
|
+
- `CREATOREM_MCP_CACHE_TTL_MS`: In-memory cache TTL in ms (default: `60000`)
|
|
23
|
+
|
|
24
|
+
## Tools
|
|
25
|
+
|
|
26
|
+
- `creatorem.list_capabilities`
|
|
27
|
+
- `creatorem.get_capability`
|
|
28
|
+
- `creatorem.get_page_content`
|
|
29
|
+
- `creatorem.search_capabilities`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAKA,qBAAa,QAAQ,CAAC,MAAM;;gBAIZ,KAAK,EAAE,MAAM;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAcpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAO9B,KAAK;CAGR"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class TtlCache {
|
|
2
|
+
#ttlMs;
|
|
3
|
+
#store = new Map();
|
|
4
|
+
constructor(ttlMs) {
|
|
5
|
+
this.#ttlMs = ttlMs;
|
|
6
|
+
}
|
|
7
|
+
get(key) {
|
|
8
|
+
const entry = this.#store.get(key);
|
|
9
|
+
if (!entry) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
if (Date.now() >= entry.expiresAt) {
|
|
13
|
+
this.#store.delete(key);
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return entry.value;
|
|
17
|
+
}
|
|
18
|
+
set(key, value) {
|
|
19
|
+
this.#store.set(key, {
|
|
20
|
+
expiresAt: Date.now() + this.#ttlMs,
|
|
21
|
+
value,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
clear() {
|
|
25
|
+
this.#store.clear();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,QAAQ;IACR,MAAM,CAAS;IACf,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAExD,YAAY,KAAa;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,GAAG,CAAC,GAAW;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAa;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM;YACnC,KAAK;SACR,CAAC,CAAC;IACP,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpCapability } from './types.js';
|
|
2
|
+
export declare function scoreCapabilityForQuery(capability: McpCapability, query: string): number;
|
|
3
|
+
export declare function searchCapabilities(capabilities: McpCapability[], query: string): {
|
|
4
|
+
capability: McpCapability;
|
|
5
|
+
score: number;
|
|
6
|
+
}[];
|
|
7
|
+
//# sourceMappingURL=capability-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-search.d.ts","sourceRoot":"","sources":["../../src/capability-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAUhD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,UAwB/E;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM;;;IAgB9E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function includesTerm(value, query) {
|
|
2
|
+
return value?.toLowerCase().includes(query) ?? false;
|
|
3
|
+
}
|
|
4
|
+
function includesArray(values, query) {
|
|
5
|
+
return values?.some((value) => value.toLowerCase().includes(query)) ?? false;
|
|
6
|
+
}
|
|
7
|
+
export function scoreCapabilityForQuery(capability, query) {
|
|
8
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
9
|
+
if (normalizedQuery.length === 0) {
|
|
10
|
+
return 0;
|
|
11
|
+
}
|
|
12
|
+
const id = capability.id.toLowerCase();
|
|
13
|
+
const title = capability.title.toLowerCase();
|
|
14
|
+
let score = 0;
|
|
15
|
+
if (id === normalizedQuery)
|
|
16
|
+
score += 260;
|
|
17
|
+
else if (id.startsWith(normalizedQuery))
|
|
18
|
+
score += 120;
|
|
19
|
+
else if (id.includes(normalizedQuery))
|
|
20
|
+
score += 75;
|
|
21
|
+
if (title === normalizedQuery)
|
|
22
|
+
score += 45;
|
|
23
|
+
else if (title.includes(normalizedQuery))
|
|
24
|
+
score += 35;
|
|
25
|
+
if (includesTerm(capability.description, normalizedQuery))
|
|
26
|
+
score += 18;
|
|
27
|
+
if (includesArray(capability.aliases, normalizedQuery))
|
|
28
|
+
score += 28;
|
|
29
|
+
if (includesArray(capability.tags, normalizedQuery))
|
|
30
|
+
score += 20;
|
|
31
|
+
if (includesTerm(capability.status, normalizedQuery))
|
|
32
|
+
score += 8;
|
|
33
|
+
return score;
|
|
34
|
+
}
|
|
35
|
+
export function searchCapabilities(capabilities, query) {
|
|
36
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
37
|
+
return capabilities
|
|
38
|
+
.map((capability) => ({
|
|
39
|
+
capability,
|
|
40
|
+
score: scoreCapabilityForQuery(capability, normalizedQuery),
|
|
41
|
+
}))
|
|
42
|
+
.filter((entry) => entry.score > 0)
|
|
43
|
+
.sort((left, right) => {
|
|
44
|
+
if (left.score !== right.score) {
|
|
45
|
+
return right.score - left.score;
|
|
46
|
+
}
|
|
47
|
+
return left.capability.id.localeCompare(right.capability.id);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=capability-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-search.js","sourceRoot":"","sources":["../../src/capability-search.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,KAAyB,EAAE,KAAa;IAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,MAA4B,EAAE,KAAa;IAC9D,OAAO,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAyB,EAAE,KAAa;IAC5E,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC;IACb,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAE7C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,EAAE,KAAK,eAAe;QAAE,KAAK,IAAI,GAAG,CAAC;SACpC,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;SACjD,IAAI,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAEnD,IAAI,KAAK,KAAK,eAAe;QAAE,KAAK,IAAI,EAAE,CAAC;SACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAEtD,IAAI,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,eAAe,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACvE,IAAI,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACpE,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACjE,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAEjE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAA6B,EAAE,KAAa;IAC3E,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEnD,OAAO,YAAY;SACd,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClB,UAAU;QACV,KAAK,EAAE,uBAAuB,CAAC,UAAU,EAAE,eAAe,CAAC;KAC9D,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SAClC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { DocsClient } from './docs-client.js';
|
|
3
|
+
import { readServerConfig } from './env.js';
|
|
4
|
+
import { RpcServer } from './rpc-server.js';
|
|
5
|
+
import { TOOL_DEFINITIONS, callTool, createToolHandlers } from './tools.js';
|
|
6
|
+
const SERVER_NAME = '@creatorem/mcp-server';
|
|
7
|
+
const SERVER_VERSION = '0.1.0';
|
|
8
|
+
function printHelp() {
|
|
9
|
+
process.stdout.write(`${SERVER_NAME}\n\n`);
|
|
10
|
+
process.stdout.write('Creatorem MCP server exposing docs capability tools.\n\n');
|
|
11
|
+
process.stdout.write('Environment variables:\n');
|
|
12
|
+
process.stdout.write('- CREATOREM_MCP_BASE_URL (default: https://creatorem.com)\n');
|
|
13
|
+
process.stdout.write('- CREATOREM_MCP_TIMEOUT_MS (default: 10000)\n');
|
|
14
|
+
process.stdout.write('- CREATOREM_MCP_CACHE_TTL_MS (default: 60000)\n');
|
|
15
|
+
}
|
|
16
|
+
async function main() {
|
|
17
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
18
|
+
printHelp();
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
const config = readServerConfig(process.env);
|
|
22
|
+
const docsClient = new DocsClient(config);
|
|
23
|
+
const toolHandlers = createToolHandlers(docsClient);
|
|
24
|
+
const rpcServer = new RpcServer({
|
|
25
|
+
serverName: SERVER_NAME,
|
|
26
|
+
serverVersion: SERVER_VERSION,
|
|
27
|
+
tools: TOOL_DEFINITIONS,
|
|
28
|
+
callTool: (name, args) => callTool(toolHandlers, name, args),
|
|
29
|
+
});
|
|
30
|
+
rpcServer.start();
|
|
31
|
+
}
|
|
32
|
+
void main().catch((error) => {
|
|
33
|
+
const message = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
34
|
+
process.stderr.write(`[mcp-server] fatal startup error: ${message}\n`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,SAAS,SAAS;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,IAAI;IACf,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;QAC5B,UAAU,EAAE,WAAW;QACvB,aAAa,EAAE,cAAc;QAC7B,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC;KAC/D,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,OAAO,IAAI,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { McpCapability, McpIndex, McpPage, ServerConfig } from './types.js';
|
|
2
|
+
type FetchLike = typeof fetch;
|
|
3
|
+
export declare class DocsClient {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(config: ServerConfig, fetchImpl?: FetchLike);
|
|
6
|
+
getIndex(): Promise<McpIndex>;
|
|
7
|
+
getCapability(capabilityId: string): Promise<McpCapability>;
|
|
8
|
+
getPageByUrl(pageUrl: string): Promise<McpPage | undefined>;
|
|
9
|
+
getLlmByDocsUrl(pageUrl: string): Promise<{
|
|
10
|
+
llmUrl: string;
|
|
11
|
+
page: McpPage | undefined;
|
|
12
|
+
text: string;
|
|
13
|
+
}>;
|
|
14
|
+
getLlmByUrl(llmUrl: string): Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=docs-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-client.d.ts","sourceRoot":"","sources":["../../src/docs-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIjF,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAkF9B,qBAAa,UAAU;;gBAMP,MAAM,EAAE,YAAY,EAAE,SAAS,GAAE,SAAiB;IAOxD,QAAQ;IAaR,aAAa,CAAC,YAAY,EAAE,MAAM;IAalC,YAAY,CAAC,OAAO,EAAE,MAAM;IAK5B,eAAe,CAAC,OAAO,EAAE,MAAM;;;;;IAY/B,WAAW,CAAC,MAAM,EAAE,MAAM;CAuDnC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { TtlCache } from './cache.js';
|
|
2
|
+
import { NotFoundError, UpstreamUnavailableError } from './errors.js';
|
|
3
|
+
import { toLlmUrlFromDocs } from './url-utils.js';
|
|
4
|
+
const INDEX_PATH = '/mcp-index.json';
|
|
5
|
+
function isStringArray(value) {
|
|
6
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
7
|
+
}
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return typeof value === 'object' && value !== null;
|
|
10
|
+
}
|
|
11
|
+
function assertValidCapability(value) {
|
|
12
|
+
if (!isRecord(value)) {
|
|
13
|
+
throw new UpstreamUnavailableError('Invalid capability payload from mcp-index.json');
|
|
14
|
+
}
|
|
15
|
+
if (typeof value.id !== 'string' || typeof value.title !== 'string') {
|
|
16
|
+
throw new UpstreamUnavailableError('Capability payload is missing required fields');
|
|
17
|
+
}
|
|
18
|
+
if (typeof value.pageUrl !== 'string' || typeof value.llmUrl !== 'string') {
|
|
19
|
+
throw new UpstreamUnavailableError('Capability payload has invalid URLs');
|
|
20
|
+
}
|
|
21
|
+
if (!isStringArray(value.relatedPageUrls)) {
|
|
22
|
+
throw new UpstreamUnavailableError('Capability payload has invalid relatedPageUrls');
|
|
23
|
+
}
|
|
24
|
+
for (const key of ['entrypoints', 'inputs', 'outputs', 'constraints', 'sideEffects']) {
|
|
25
|
+
if (!isStringArray(value[key])) {
|
|
26
|
+
throw new UpstreamUnavailableError(`Capability payload has invalid "${key}" field`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function assertValidPage(value) {
|
|
31
|
+
if (!isRecord(value)) {
|
|
32
|
+
throw new UpstreamUnavailableError('Invalid page payload from mcp-index.json');
|
|
33
|
+
}
|
|
34
|
+
if (typeof value.title !== 'string' ||
|
|
35
|
+
typeof value.pageUrl !== 'string' ||
|
|
36
|
+
typeof value.llmUrl !== 'string' ||
|
|
37
|
+
typeof value.sourcePath !== 'string' ||
|
|
38
|
+
typeof value.capability !== 'string') {
|
|
39
|
+
throw new UpstreamUnavailableError('Page payload has missing required fields');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function parseMcpIndex(payload) {
|
|
43
|
+
if (!isRecord(payload)) {
|
|
44
|
+
throw new UpstreamUnavailableError('Invalid mcp-index.json response');
|
|
45
|
+
}
|
|
46
|
+
if (!Array.isArray(payload.capabilities) || !Array.isArray(payload.pages)) {
|
|
47
|
+
throw new UpstreamUnavailableError('mcp-index.json is missing capabilities/pages arrays');
|
|
48
|
+
}
|
|
49
|
+
const capabilities = payload.capabilities.map((capability) => {
|
|
50
|
+
assertValidCapability(capability);
|
|
51
|
+
return capability;
|
|
52
|
+
});
|
|
53
|
+
const pages = payload.pages.map((page) => {
|
|
54
|
+
assertValidPage(page);
|
|
55
|
+
return page;
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
version: typeof payload.version === 'number' ? payload.version : 1,
|
|
59
|
+
generatedAt: typeof payload.generatedAt === 'string' ? payload.generatedAt : new Date(0).toISOString(),
|
|
60
|
+
scope: isStringArray(payload.scope) ? payload.scope : [],
|
|
61
|
+
capabilities,
|
|
62
|
+
pages,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function toAbsoluteUrl(baseUrl, path) {
|
|
66
|
+
return new URL(path, baseUrl).toString();
|
|
67
|
+
}
|
|
68
|
+
export class DocsClient {
|
|
69
|
+
#config;
|
|
70
|
+
#fetchImpl;
|
|
71
|
+
#indexCache;
|
|
72
|
+
#llmCache;
|
|
73
|
+
constructor(config, fetchImpl = fetch) {
|
|
74
|
+
this.#config = config;
|
|
75
|
+
this.#fetchImpl = fetchImpl;
|
|
76
|
+
this.#indexCache = new TtlCache(config.cacheTtlMs);
|
|
77
|
+
this.#llmCache = new TtlCache(config.cacheTtlMs);
|
|
78
|
+
}
|
|
79
|
+
async getIndex() {
|
|
80
|
+
const cacheKey = 'index';
|
|
81
|
+
const cached = this.#indexCache.get(cacheKey);
|
|
82
|
+
if (cached) {
|
|
83
|
+
return cached;
|
|
84
|
+
}
|
|
85
|
+
const payload = await this.#fetchJson(INDEX_PATH);
|
|
86
|
+
const parsed = parseMcpIndex(payload);
|
|
87
|
+
this.#indexCache.set(cacheKey, parsed);
|
|
88
|
+
return parsed;
|
|
89
|
+
}
|
|
90
|
+
async getCapability(capabilityId) {
|
|
91
|
+
const index = await this.getIndex();
|
|
92
|
+
const match = index.capabilities.find((capability) => capability.id === capabilityId) ??
|
|
93
|
+
index.capabilities.find((capability) => capability.id.toLowerCase() === capabilityId.toLowerCase());
|
|
94
|
+
if (!match) {
|
|
95
|
+
throw new NotFoundError(`Capability not found: ${capabilityId}`);
|
|
96
|
+
}
|
|
97
|
+
return match;
|
|
98
|
+
}
|
|
99
|
+
async getPageByUrl(pageUrl) {
|
|
100
|
+
const index = await this.getIndex();
|
|
101
|
+
return index.pages.find((page) => page.pageUrl === pageUrl);
|
|
102
|
+
}
|
|
103
|
+
async getLlmByDocsUrl(pageUrl) {
|
|
104
|
+
const index = await this.getIndex();
|
|
105
|
+
const matchedPage = index.pages.find((page) => page.pageUrl === pageUrl);
|
|
106
|
+
const llmUrl = matchedPage?.llmUrl ?? toLlmUrlFromDocs(pageUrl);
|
|
107
|
+
return {
|
|
108
|
+
llmUrl,
|
|
109
|
+
page: matchedPage,
|
|
110
|
+
text: await this.getLlmByUrl(llmUrl),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async getLlmByUrl(llmUrl) {
|
|
114
|
+
const cached = this.#llmCache.get(llmUrl);
|
|
115
|
+
if (cached) {
|
|
116
|
+
return cached;
|
|
117
|
+
}
|
|
118
|
+
const text = await this.#fetchText(llmUrl);
|
|
119
|
+
this.#llmCache.set(llmUrl, text);
|
|
120
|
+
return text;
|
|
121
|
+
}
|
|
122
|
+
async #fetchJson(path) {
|
|
123
|
+
const response = await this.#fetchWithTimeout(path);
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
throw new UpstreamUnavailableError(`Upstream request failed: ${response.status} ${response.statusText}`, response.status);
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
return (await response.json());
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
throw new UpstreamUnavailableError(`Invalid JSON response from ${path}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async #fetchText(path) {
|
|
135
|
+
const response = await this.#fetchWithTimeout(path);
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
throw new UpstreamUnavailableError(`Upstream request failed: ${response.status} ${response.statusText}`, response.status);
|
|
138
|
+
}
|
|
139
|
+
return response.text();
|
|
140
|
+
}
|
|
141
|
+
async #fetchWithTimeout(path) {
|
|
142
|
+
const controller = new AbortController();
|
|
143
|
+
const timeout = setTimeout(() => controller.abort(), this.#config.timeoutMs);
|
|
144
|
+
try {
|
|
145
|
+
return await this.#fetchImpl(toAbsoluteUrl(this.#config.baseUrl, path), {
|
|
146
|
+
signal: controller.signal,
|
|
147
|
+
headers: {
|
|
148
|
+
'user-agent': '@creatorem/mcp-server',
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
154
|
+
throw new UpstreamUnavailableError(`Timeout while requesting ${path}`);
|
|
155
|
+
}
|
|
156
|
+
const message = error instanceof Error ? error.message : 'Unknown fetch failure';
|
|
157
|
+
throw new UpstreamUnavailableError(`Failed to request ${path}: ${message}`);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
clearTimeout(timeout);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=docs-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-client.js","sourceRoot":"","sources":["../../src/docs-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqC/C,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAMnF"}
|
package/dist/src/env.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = 'https://creatorem.com';
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
3
|
+
const DEFAULT_CACHE_TTL_MS = 60_000;
|
|
4
|
+
function parsePositiveInt(raw, fallback) {
|
|
5
|
+
if (!raw) {
|
|
6
|
+
return fallback;
|
|
7
|
+
}
|
|
8
|
+
const parsed = Number.parseInt(raw, 10);
|
|
9
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
function normalizeBaseUrl(raw) {
|
|
15
|
+
const fallback = DEFAULT_BASE_URL;
|
|
16
|
+
const value = raw?.trim() || fallback;
|
|
17
|
+
let url;
|
|
18
|
+
try {
|
|
19
|
+
url = new URL(value);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return fallback;
|
|
23
|
+
}
|
|
24
|
+
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
25
|
+
return fallback;
|
|
26
|
+
}
|
|
27
|
+
return url.origin.replace(/\/$/, '');
|
|
28
|
+
}
|
|
29
|
+
export function readServerConfig(env = process.env) {
|
|
30
|
+
return {
|
|
31
|
+
baseUrl: normalizeBaseUrl(env.CREATOREM_MCP_BASE_URL),
|
|
32
|
+
timeoutMs: parsePositiveInt(env.CREATOREM_MCP_TIMEOUT_MS, DEFAULT_TIMEOUT_MS),
|
|
33
|
+
cacheTtlMs: parsePositiveInt(env.CREATOREM_MCP_CACHE_TTL_MS, DEFAULT_CACHE_TTL_MS),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,SAAS,gBAAgB,CAAC,GAAuB,EAAE,QAAgB;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC7C,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAClC,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC;IAEtC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,OAAO;QACH,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACrD,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,wBAAwB,EAAE,kBAAkB,CAAC;QAC7E,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;KACrF,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class ValidationError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class NotFoundError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class UpstreamUnavailableError extends Error {
|
|
8
|
+
readonly status?: number;
|
|
9
|
+
constructor(message: string, status?: number);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,aAAc,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAK/C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class ValidationError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'ValidationError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class NotFoundError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'NotFoundError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class UpstreamUnavailableError extends Error {
|
|
14
|
+
status;
|
|
15
|
+
constructor(message, status) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'UpstreamUnavailableError';
|
|
18
|
+
this.status = status;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACtC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACtC,MAAM,CAAU;IAEzB,YAAY,OAAe,EAAE,MAAe;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;CACJ"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { DocsClient } from './docs-client.js';
|
|
2
|
+
export { readServerConfig } from './env.js';
|
|
3
|
+
export { RpcServer } from './rpc-server.js';
|
|
4
|
+
export { TOOL_DEFINITIONS, callTool, createToolHandlers } from './tools.js';
|
|
5
|
+
export { normalizeDocsUrl, toLlmUrlFromDocs } from './url-utils.js';
|
|
6
|
+
export { searchCapabilities, scoreCapabilityForQuery } from './capability-search.js';
|
|
7
|
+
export type { McpCapability, McpIndex, McpPage, ServerConfig, ToolDefinition, ToolResult } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACrF,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DocsClient } from './docs-client.js';
|
|
2
|
+
export { readServerConfig } from './env.js';
|
|
3
|
+
export { RpcServer } from './rpc-server.js';
|
|
4
|
+
export { TOOL_DEFINITIONS, callTool, createToolHandlers } from './tools.js';
|
|
5
|
+
export { normalizeDocsUrl, toLlmUrlFromDocs } from './url-utils.js';
|
|
6
|
+
export { searchCapabilities, scoreCapabilityForQuery } from './capability-search.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ToolDefinition, ToolResult } from './types.js';
|
|
2
|
+
type ServerOptions = {
|
|
3
|
+
serverName: string;
|
|
4
|
+
serverVersion: string;
|
|
5
|
+
tools: ToolDefinition[];
|
|
6
|
+
callTool: (name: string, args: unknown) => Promise<ToolResult>;
|
|
7
|
+
defaultProtocolVersion?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare class RpcServer {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(options: ServerOptions);
|
|
12
|
+
start(): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=rpc-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../src/rpc-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA2B7D,KAAK,aAAa,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAMF,qBAAa,SAAS;;gBAUN,OAAO,EAAE,aAAa;IAQlC,KAAK;CA6MR"}
|