@zeroheight/mcp-server 1.2.0 → 1.3.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/CHANGELOG.md +4 -0
- package/dist/api/api.js +48 -11
- package/dist/api/api.js.map +1 -1
- package/dist/api/page.js +7 -8
- package/dist/api/page.js.map +1 -1
- package/dist/api/sentry.js +8 -3
- package/dist/api/sentry.js.map +1 -1
- package/dist/api/styleguide.js +11 -8
- package/dist/api/styleguide.js.map +1 -1
- package/dist/common/credentials.js +17 -2
- package/dist/common/credentials.js.map +1 -1
- package/dist/{index.js → mcp-server.js} +4 -25
- package/dist/mcp-server.js.map +1 -0
- package/dist/resources/page.js +10 -24
- package/dist/resources/page.js.map +1 -1
- package/dist/resources/styleguide.js +14 -24
- package/dist/resources/styleguide.js.map +1 -1
- package/dist/stdio.js +27 -0
- package/dist/stdio.js.map +1 -0
- package/dist/tools/page.js +24 -6
- package/dist/tools/page.js.map +1 -1
- package/dist/tools/styleguide.js +9 -6
- package/dist/tools/styleguide.js.map +1 -1
- package/package.json +16 -6
- package/dist/api/api.test.js +0 -16
- package/dist/api/api.test.js.map +0 -1
- package/dist/common/formatters/styleguide.test.js +0 -453
- package/dist/common/formatters/styleguide.test.js.map +0 -1
- package/dist/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
## Release notes
|
|
2
2
|
|
|
3
|
+
## [1.3.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.3.0) - 12th November 2025
|
|
4
|
+
|
|
5
|
+
- Only return published pages, categories and navigations to MCP clients
|
|
6
|
+
|
|
3
7
|
## [1.2.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.2.0) - 9th September 2025
|
|
4
8
|
|
|
5
9
|
- Reduce number of tokens used by `get-styleguide-tree`
|
package/dist/api/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f5f62ed6-e304-59a4-a788-c025be616649")}catch(e){}}();
|
|
3
3
|
import * as Sentry from "@sentry/node";
|
|
4
4
|
import { IncorrectScopeError, MaxRetriesError, UnauthorizedError, UnknownError, } from "./errors.js";
|
|
5
5
|
import packageJson from "../../package.json" with { type: "json" };
|
|
@@ -36,18 +36,24 @@ export async function request(path, credentials, init, search) {
|
|
|
36
36
|
}
|
|
37
37
|
const maxRetries = 3;
|
|
38
38
|
let retries = 0;
|
|
39
|
+
const headers = {
|
|
40
|
+
"X-API-CLIENT-NAME": "mcp-server",
|
|
41
|
+
"X-API-CLIENT-VERSION": packageJson.version,
|
|
42
|
+
"User-Agent": USER_AGENT,
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
Accept: "application/json",
|
|
45
|
+
};
|
|
46
|
+
if (credentials.type === "jwt") {
|
|
47
|
+
headers["Authorization"] = `Bearer ${credentials.jwt}`;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
headers["X-API-CLIENT"] = credentials.client;
|
|
51
|
+
headers["X-API-KEY"] = credentials.token;
|
|
52
|
+
}
|
|
39
53
|
while (retries < maxRetries) {
|
|
40
54
|
const response = await fetch(url, {
|
|
41
55
|
...init,
|
|
42
|
-
headers
|
|
43
|
-
"X-API-CLIENT-NAME": "mcp-server",
|
|
44
|
-
"X-API-CLIENT": credentials.client,
|
|
45
|
-
"X-API-KEY": credentials.token,
|
|
46
|
-
"X-API-CLIENT-VERSION": packageJson.version,
|
|
47
|
-
"User-Agent": USER_AGENT,
|
|
48
|
-
"Content-Type": "application/json",
|
|
49
|
-
Accept: "application/json",
|
|
50
|
-
},
|
|
56
|
+
headers,
|
|
51
57
|
});
|
|
52
58
|
if (response.status === 401) {
|
|
53
59
|
console.error("Unauthorized response from API", {
|
|
@@ -79,5 +85,36 @@ export async function request(path, credentials, init, search) {
|
|
|
79
85
|
}
|
|
80
86
|
throw new MaxRetriesError();
|
|
81
87
|
}
|
|
88
|
+
export async function internalRequest(path, method, body) {
|
|
89
|
+
const url = getZeroheightURL();
|
|
90
|
+
url.pathname = "/api" + path;
|
|
91
|
+
if (process.env["NODE_ENV"] === "dev") {
|
|
92
|
+
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";
|
|
93
|
+
}
|
|
94
|
+
const response = await fetch(url, {
|
|
95
|
+
method,
|
|
96
|
+
headers: {
|
|
97
|
+
"Content-Type": "application/json",
|
|
98
|
+
Accept: "application/json",
|
|
99
|
+
"User-Agent": USER_AGENT,
|
|
100
|
+
"X-API-KEY": process.env["INTERNAL_API_KEY"] || "",
|
|
101
|
+
},
|
|
102
|
+
body: JSON.stringify(body),
|
|
103
|
+
});
|
|
104
|
+
if (response.status < 200 || response.status >= 300) {
|
|
105
|
+
console.error("Internal API request failed", {
|
|
106
|
+
response: { status: response.status, body: await response.text() },
|
|
107
|
+
});
|
|
108
|
+
if (response.status === 401) {
|
|
109
|
+
throw new UnauthorizedError();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
Sentry.captureMessage(`Unknown error occurred making internal request to: ${url}`);
|
|
113
|
+
throw new UnknownError();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const responseJson = await response.json();
|
|
117
|
+
return responseJson;
|
|
118
|
+
}
|
|
82
119
|
//# sourceMappingURL=api.js.map
|
|
83
|
-
//# debugId=
|
|
120
|
+
//# debugId=f5f62ed6-e304-59a4-a788-c025be616649
|
package/dist/api/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n
|
|
1
|
+
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n const headers: Record<string, string> = {\n \"X-API-CLIENT-NAME\": \"mcp-server\",\n \"X-API-CLIENT-VERSION\": packageJson.version,\n \"User-Agent\": USER_AGENT,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n if (credentials.type === \"jwt\") {\n headers[\"Authorization\"] = `Bearer ${credentials.jwt}`;\n } else {\n headers[\"X-API-CLIENT\"] = credentials.client;\n headers[\"X-API-KEY\"] = credentials.token;\n }\n\n while (retries < maxRetries) {\n const response = await fetch(url, {\n ...init,\n headers,\n });\n\n if (response.status === 401) {\n console.error(\"Unauthorized response from API\", {\n response: { status: response.status, body: await response.text() },\n });\n throw new UnauthorizedError();\n } else if (response.status === 429) {\n retries++;\n const responseData = await response.json();\n const waitTime = responseData.data.reset_time * 1000 - Date.now();\n await sleep(waitTime);\n continue;\n } else if (response.status < 200 || response.status >= 300) {\n console.error(\"API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 403) {\n throw new IncorrectScopeError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n }\n\n throw new MaxRetriesError();\n}\n\nexport async function internalRequest<R>(\n path: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n body: any,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = \"/api\" + path;\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": USER_AGENT,\n \"X-API-KEY\": process.env[\"INTERNAL_API_KEY\"] || \"\",\n },\n body: JSON.stringify(body),\n });\n\n if (response.status < 200 || response.status >= 300) {\n console.error(\"Internal API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 401) {\n throw new UnauthorizedError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making internal request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n}\n"],"names":[],"mappings":"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","debug_id":"f5f62ed6-e304-59a4-a788-c025be616649"}
|
package/dist/api/page.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
-
import { getCredentialsFromEnvironment } from "../common/credentials.js";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="97ac3c8e-e27e-5358-8ee5-253e2b44406b")}catch(e){}}();
|
|
4
3
|
import { request } from "./api.js";
|
|
5
4
|
import { UnknownError } from "./errors.js";
|
|
6
5
|
import { captureException } from "../common/errors.js";
|
|
7
|
-
export async function listPages(styleguideId, optionalParams = {}) {
|
|
6
|
+
export async function listPages(credentials, styleguideId, optionalParams = {}) {
|
|
8
7
|
try {
|
|
9
|
-
const
|
|
10
|
-
|
|
8
|
+
const searchParams = new URLSearchParams({
|
|
9
|
+
show_hidden: "false",
|
|
10
|
+
});
|
|
11
11
|
if (optionalParams.releaseId) {
|
|
12
12
|
searchParams.set("release_id", optionalParams.releaseId.toString());
|
|
13
13
|
}
|
|
@@ -27,9 +27,8 @@ export async function listPages(styleguideId, optionalParams = {}) {
|
|
|
27
27
|
return [];
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
export async function getPage(pageId, optionalParams = {}) {
|
|
30
|
+
export async function getPage(credentials, pageId, optionalParams = {}) {
|
|
31
31
|
try {
|
|
32
|
-
const credentials = getCredentialsFromEnvironment();
|
|
33
32
|
const searchParams = new URLSearchParams();
|
|
34
33
|
if (optionalParams.releaseId) {
|
|
35
34
|
searchParams.set("release_id", optionalParams.releaseId.toString());
|
|
@@ -48,4 +47,4 @@ export async function getPage(pageId, optionalParams = {}) {
|
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
//# sourceMappingURL=page.js.map
|
|
51
|
-
//# debugId=
|
|
50
|
+
//# debugId=97ac3c8e-e27e-5358-8ee5-253e2b44406b
|
package/dist/api/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import {\n Credentials,\n} from \"../common/credentials.js\";\nimport { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { Page, PageListItem } from \"./types/page.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface PageListSuccessResponse {\n pages: PageListItem[];\n}\n\ninterface PageListOptionalParams {\n searchTerm: string;\n releaseId: number;\n}\n\nexport async function listPages(\n credentials: Credentials,\n styleguideId: number,\n optionalParams: Partial<PageListOptionalParams> = {},\n) {\n try {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n if (optionalParams.searchTerm) {\n searchParams.set(\"search\", optionalParams.searchTerm);\n }\n\n const response = await request<\n APIResponse<PageListSuccessResponse, {}, {}>\n >(\n `/styleguides/${styleguideId}/pages`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"pages\" in response.data) {\n return response.data.pages;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface PageSuccessResponse {\n page: Page;\n}\n\ninterface PageOptionalParams {\n releaseId: number;\n}\n\nexport async function getPage(\n credentials: Credentials,\n pageId: number | string,\n optionalParams: Partial<PageOptionalParams> = {},\n) {\n try {\n const searchParams = new URLSearchParams();\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n const response = await request<APIResponse<PageSuccessResponse, {}, {}>>(\n `/pages/${pageId}`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"page\" in response.data) {\n return response.data.page;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return null;\n }\n}\n"],"names":[],"mappings":";;AAGA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAwB,EACxB,YAAoB,EACpB,iBAAkD,EAAE;IAEpD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;YACvC,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,YAAY,QAAQ,EACpC,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,WAAwB,EACxB,MAAuB,EACvB,iBAA8C,EAAE;IAEhD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,UAAU,MAAM,EAAE,EAClB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","debug_id":"97ac3c8e-e27e-5358-8ee5-253e2b44406b"}
|
package/dist/api/sentry.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0eb379a8-8e6d-5b39-b1bb-86921b7d2d15")}catch(e){}}();
|
|
3
3
|
import * as Sentry from "@sentry/node";
|
|
4
4
|
export function initSentry() {
|
|
5
|
+
const sentryDSN = process.env.SENTRY_DSN;
|
|
6
|
+
if (!sentryDSN) {
|
|
7
|
+
console.error("Sentry DSN is not set");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
5
10
|
Sentry.init({
|
|
6
11
|
environment: process.env.NODE_ENV ?? "production",
|
|
7
|
-
dsn:
|
|
12
|
+
dsn: sentryDSN,
|
|
8
13
|
sendDefaultPii: true,
|
|
9
14
|
tracesSampleRate: 1.0,
|
|
10
15
|
});
|
|
11
16
|
}
|
|
12
17
|
//# sourceMappingURL=sentry.js.map
|
|
13
|
-
//# debugId=
|
|
18
|
+
//# debugId=0eb379a8-8e6d-5b39-b1bb-86921b7d2d15
|
package/dist/api/sentry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry.js","sources":["api/sentry.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\n\nexport function initSentry() {\n Sentry.init({\n environment: process.env.NODE_ENV ?? \"production\",\n dsn:
|
|
1
|
+
{"version":3,"file":"sentry.js","sources":["api/sentry.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\n\nexport function initSentry() {\n const sentryDSN = process.env.SENTRY_DSN;\n\n if (!sentryDSN) {\n console.error(\"Sentry DSN is not set\");\n return;\n }\n\n Sentry.init({\n environment: process.env.NODE_ENV ?? \"production\",\n dsn: sentryDSN,\n sendDefaultPii: true,\n tracesSampleRate: 1.0,\n });\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,YAAY;QACjD,GAAG,EAAE,SAAS;QACd,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,GAAG;KACtB,CAAC,CAAC;AACL,CAAC","debug_id":"0eb379a8-8e6d-5b39-b1bb-86921b7d2d15"}
|
package/dist/api/styleguide.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e5eec58f-0a29-5ede-91ca-d9450e4f4bc2")}catch(e){}}();
|
|
3
3
|
import { request } from "./api.js";
|
|
4
4
|
import { UnknownError } from "./errors.js";
|
|
5
|
-
import { getCredentialsFromEnvironment } from "../common/credentials.js";
|
|
6
5
|
import { captureException } from "../common/errors.js";
|
|
7
|
-
export async function listStyleguides() {
|
|
6
|
+
export async function listStyleguides(credentials) {
|
|
8
7
|
try {
|
|
9
|
-
const credentials = getCredentialsFromEnvironment();
|
|
10
8
|
const response = await request("/styleguides", credentials, {
|
|
11
9
|
method: "GET",
|
|
12
10
|
});
|
|
13
11
|
if ("styleguides" in response.data) {
|
|
12
|
+
if (credentials.type === "jwt") {
|
|
13
|
+
return response.data.styleguides.filter((sg) => sg.id === credentials.styleguideId);
|
|
14
|
+
}
|
|
14
15
|
return response.data.styleguides;
|
|
15
16
|
}
|
|
16
17
|
throw new UnknownError();
|
|
@@ -20,12 +21,14 @@ export async function listStyleguides() {
|
|
|
20
21
|
return [];
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
export async function getStyleguideTree(id) {
|
|
24
|
+
export async function getStyleguideTree(credentials, id) {
|
|
24
25
|
try {
|
|
25
|
-
const
|
|
26
|
+
const searchParams = new URLSearchParams({
|
|
27
|
+
show_hidden: "false",
|
|
28
|
+
});
|
|
26
29
|
const response = await request(`/styleguides/${id}/tree`, credentials, {
|
|
27
30
|
method: "GET",
|
|
28
|
-
});
|
|
31
|
+
}, searchParams);
|
|
29
32
|
if ("tree" in response.data) {
|
|
30
33
|
return response.data.tree;
|
|
31
34
|
}
|
|
@@ -38,4 +41,4 @@ export async function getStyleguideTree(id) {
|
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
//# sourceMappingURL=styleguide.js.map
|
|
41
|
-
//# debugId=
|
|
44
|
+
//# debugId=e5eec58f-0a29-5ede-91ca-d9450e4f4bc2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["api/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["api/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { Credentials } from \"../common/credentials.js\";\nimport {\n CategoryNode,\n NavigationNode,\n PageNode,\n Styleguide,\n} from \"./types/styleguide.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface StyleguideListSuccessResponse {\n styleguides: Styleguide[];\n}\n\nexport async function listStyleguides(credentials: Credentials) {\n try {\n const response = await request<\n APIResponse<StyleguideListSuccessResponse, {}, {}>\n >(\"/styleguides\", credentials, {\n method: \"GET\",\n });\n\n if (\"styleguides\" in response.data) {\n if (credentials.type === \"jwt\") {\n return response.data.styleguides.filter(\n (sg) => sg.id === credentials.styleguideId,\n );\n }\n\n return response.data.styleguides;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface SyleguideTreeSuccessResponse {\n tree: (PageNode | CategoryNode | NavigationNode)[];\n}\n\nexport async function getStyleguideTree(credentials: Credentials, id: number) {\n try {\n const searchParams = new URLSearchParams({\n show_hidden: \"false\",\n });\n\n const response = await request<\n APIResponse<SyleguideTreeSuccessResponse, {}, {}>\n >(\n `/styleguides/${id}/tree`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"tree\" in response.data) {\n return response.data.tree;\n }\n\n console.error(response);\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAwB;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAE5B,cAAc,EAAE,WAAW,EAAE;YAC7B,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CACrC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,CAC3C,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAwB,EAAE,EAAU;IAC1E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;YACvC,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC","debug_id":"e5eec58f-0a29-5ede-91ca-d9450e4f4bc2"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="56e783cf-38bc-50a3-a885-f48fe491817a")}catch(e){}}();
|
|
3
3
|
import { MissingCredentialsError } from "./errors.js";
|
|
4
|
+
import { internalRequest } from "../api/api.js";
|
|
4
5
|
export function getCredentialsFromEnvironment() {
|
|
5
6
|
const token = process.env["ZEROHEIGHT_ACCESS_TOKEN"];
|
|
6
7
|
const client = process.env["ZEROHEIGHT_CLIENT_ID"];
|
|
@@ -8,9 +9,23 @@ export function getCredentialsFromEnvironment() {
|
|
|
8
9
|
throw new MissingCredentialsError();
|
|
9
10
|
}
|
|
10
11
|
return {
|
|
12
|
+
type: "client_token",
|
|
11
13
|
token,
|
|
12
14
|
client,
|
|
13
15
|
};
|
|
14
16
|
}
|
|
17
|
+
export async function getCredentials(authInfo) {
|
|
18
|
+
if (!authInfo) {
|
|
19
|
+
return getCredentialsFromEnvironment();
|
|
20
|
+
}
|
|
21
|
+
const res = await internalRequest("/mcp_url/exchange_token", "POST", {
|
|
22
|
+
token: authInfo.token,
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
type: "jwt",
|
|
26
|
+
jwt: res.jwt,
|
|
27
|
+
styleguideId: res.styleguide_id,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
15
30
|
//# sourceMappingURL=credentials.js.map
|
|
16
|
-
//# debugId=
|
|
31
|
+
//# debugId=56e783cf-38bc-50a3-a885-f48fe491817a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sources":["common/credentials.ts"],"sourceRoot":"/","sourcesContent":["import { MissingCredentialsError } from \"./errors.js\";\n\nexport
|
|
1
|
+
{"version":3,"file":"credentials.js","sources":["common/credentials.ts"],"sourceRoot":"/","sourcesContent":["import { AuthInfo } from \"@modelcontextprotocol/sdk/server/auth/types.js\";\nimport { MissingCredentialsError } from \"./errors.js\";\nimport { internalRequest } from \"../api/api.js\";\n\nexport type Credentials =\n | {\n type: \"client_token\";\n token: string;\n client: string;\n }\n | {\n type: \"jwt\";\n jwt: string;\n styleguideId: number;\n };\n\nexport function getCredentialsFromEnvironment(): Credentials {\n const token = process.env[\"ZEROHEIGHT_ACCESS_TOKEN\"];\n const client = process.env[\"ZEROHEIGHT_CLIENT_ID\"];\n if (!token || !client) {\n throw new MissingCredentialsError();\n }\n\n return {\n type: \"client_token\",\n token,\n client,\n };\n}\n\ninterface JwtResponse {\n jwt: string;\n styleguide_id: number;\n}\n\nexport async function getCredentials(\n authInfo?: AuthInfo,\n): Promise<Credentials> {\n if (!authInfo) {\n return getCredentialsFromEnvironment();\n }\n\n const res = await internalRequest<JwtResponse>(\n \"/mcp_url/exchange_token\",\n \"POST\",\n {\n token: authInfo.token,\n },\n );\n\n return {\n type: \"jwt\",\n jwt: res.jwt,\n styleguideId: res.styleguide_id,\n };\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAchD,MAAM,UAAU,6BAA6B;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,uBAAuB,EAAE,CAAC;IACtC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAmB;IAEnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAC/B,yBAAyB,EACzB,MAAM,EACN;QACE,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,YAAY,EAAE,GAAG,CAAC,aAAa;KAChC,CAAC;AACJ,CAAC","debug_id":"56e783cf-38bc-50a3-a885-f48fe491817a"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="86e0b46d-45ed-57dd-b85a-47e051420308")}catch(e){}}();
|
|
4
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
4
|
import packageJson from "../package.json" with { type: "json" };
|
|
7
5
|
import { registerStyleguideListResource, registerStyleguideResource, } from "./resources/styleguide.js";
|
|
8
6
|
import { registerListPagesResource, registerPageResource, } from "./resources/page.js";
|
|
@@ -10,10 +8,7 @@ import { registerGetStyleguideTreeTool, registerListStyleguidesTool, } from "./t
|
|
|
10
8
|
import { registerGetPageTool, registerListPagesTool } from "./tools/page.js";
|
|
11
9
|
import { recommendSummarizePagePrompt } from "./prompts/page.js";
|
|
12
10
|
import { registerRecommendPagesPrompt } from "./prompts/styleguide.js";
|
|
13
|
-
|
|
14
|
-
import { captureException } from "./common/errors.js";
|
|
15
|
-
function createServer() {
|
|
16
|
-
// Create server instance
|
|
11
|
+
export function createServer() {
|
|
17
12
|
const server = new McpServer({
|
|
18
13
|
name: "zeroheight",
|
|
19
14
|
version: packageJson.version,
|
|
@@ -40,21 +35,5 @@ function createServer() {
|
|
|
40
35
|
[registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) => fn(server));
|
|
41
36
|
return server;
|
|
42
37
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const disableTelemetry = process.env["ZEROHEIGHT_MCP_DISABLE_TELEMETRY"];
|
|
46
|
-
if (!disableTelemetry) {
|
|
47
|
-
initSentry();
|
|
48
|
-
}
|
|
49
|
-
const server = createServer();
|
|
50
|
-
const transport = new StdioServerTransport();
|
|
51
|
-
await server.connect(transport);
|
|
52
|
-
console.error("zeroheight MCP Server running on stdio");
|
|
53
|
-
}
|
|
54
|
-
main().catch((error) => {
|
|
55
|
-
console.error("Fatal error in main():", error);
|
|
56
|
-
captureException(error);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=index.js.map
|
|
60
|
-
//# debugId=c0c825d2-da83-500a-98f6-80086abbe1a6
|
|
38
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
39
|
+
//# debugId=86e0b46d-45ed-57dd-b85a-47e051420308
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sources":["mcp-server.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n registerStyleguideListResource,\n registerStyleguideResource,\n} from \"./resources/styleguide.js\";\nimport {\n registerListPagesResource,\n registerPageResource,\n} from \"./resources/page.js\";\nimport {\n registerGetStyleguideTreeTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport { registerGetPageTool, registerListPagesTool } from \"./tools/page.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\n\nexport function createServer() {\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n\n // Register all tools\n [\n registerListPagesTool,\n registerGetPageTool,\n registerListStyleguidesTool,\n registerGetStyleguideTreeTool,\n ].forEach((fn) => fn(server));\n\n // Register all resources\n [\n registerStyleguideListResource,\n registerStyleguideResource,\n registerListPagesResource,\n registerPageResource,\n ].forEach((fn) => fn(server));\n\n // Register all prompts\n [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) =>\n fn(server)\n );\n\n return server;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvE,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,qBAAqB;IACrB;QACE,qBAAqB;QACrB,mBAAmB;QACnB,2BAA2B;QAC3B,6BAA6B;KAC9B,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,yBAAyB;IACzB;QACE,8BAA8B;QAC9B,0BAA0B;QAC1B,yBAAyB;QACzB,oBAAoB;KACrB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,uBAAuB;IACvB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1E,EAAE,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","debug_id":"86e0b46d-45ed-57dd-b85a-47e051420308"}
|
package/dist/resources/page.js
CHANGED
|
@@ -2,27 +2,26 @@
|
|
|
2
2
|
* Page Resources
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4a5c5d30-f2cc-5f45-9d88-37c63f6066a6")}catch(e){}}();
|
|
6
6
|
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
-
import {
|
|
7
|
+
import { listStyleguideResources } from "./styleguide.js";
|
|
8
8
|
import { getPage, listPages } from "../api/page.js";
|
|
9
9
|
import { formatPageAsMarkdown } from "../common/formatters/page.js";
|
|
10
|
+
import { getCredentials } from "../common/credentials.js";
|
|
10
11
|
export function registerListPagesResource(server) {
|
|
11
12
|
server.registerResource("styleguide-page-list", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page-list", {
|
|
12
13
|
list: listStyleguideResources,
|
|
13
|
-
complete: {
|
|
14
|
-
styleguideId: completionForStyleduideId,
|
|
15
|
-
},
|
|
16
14
|
}), {
|
|
17
15
|
title: "List the pages for a styleguide",
|
|
18
16
|
description: "List all pages in a styleguide",
|
|
19
17
|
mimeType: "text/markdown",
|
|
20
|
-
}, async (uri, { styleguideId }) => {
|
|
18
|
+
}, async (uri, { styleguideId }, { authInfo }) => {
|
|
21
19
|
const selectedId = Array.isArray(styleguideId)
|
|
22
20
|
? styleguideId[0]
|
|
23
21
|
: styleguideId;
|
|
24
22
|
const parsedStyleguideId = parseInt(selectedId, 10);
|
|
25
|
-
const
|
|
23
|
+
const credentials = await getCredentials(authInfo);
|
|
24
|
+
const pages = await listPages(credentials, parsedStyleguideId);
|
|
26
25
|
return {
|
|
27
26
|
contents: [
|
|
28
27
|
{
|
|
@@ -38,18 +37,15 @@ export function registerListPagesResource(server) {
|
|
|
38
37
|
export function registerPageResource(server) {
|
|
39
38
|
server.registerResource("page", new ResourceTemplate("zeroheight://styleguide/{styleguideId}/page/{pageId}", {
|
|
40
39
|
list: undefined,
|
|
41
|
-
complete: {
|
|
42
|
-
styleguideId: completionForStyleduideId,
|
|
43
|
-
pageId: completionForStyleduideId,
|
|
44
|
-
},
|
|
45
40
|
}), {
|
|
46
41
|
title: "Page",
|
|
47
42
|
description: "Design system page",
|
|
48
43
|
mimeType: "text/markdown",
|
|
49
|
-
}, async (uri, { pageId }) => {
|
|
44
|
+
}, async (uri, { pageId }, { authInfo }) => {
|
|
50
45
|
const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;
|
|
51
46
|
const parsedPageId = parseInt(selectedId, 10);
|
|
52
|
-
const
|
|
47
|
+
const credentials = await getCredentials(authInfo);
|
|
48
|
+
const page = await getPage(credentials, parsedPageId);
|
|
53
49
|
if (!page) {
|
|
54
50
|
throw new Error("Couldn't find the page");
|
|
55
51
|
}
|
|
@@ -64,15 +60,5 @@ export function registerPageResource(server) {
|
|
|
64
60
|
};
|
|
65
61
|
});
|
|
66
62
|
}
|
|
67
|
-
/** Utils */
|
|
68
|
-
export async function completionForPageId(searchTerm, context) {
|
|
69
|
-
const styleguideId = parseInt(context.arguments?.styleguideId ?? "", 10);
|
|
70
|
-
const pageList = await listPages(styleguideId);
|
|
71
|
-
const matchingPages = pageList.filter((page) => page.id
|
|
72
|
-
.toString()
|
|
73
|
-
.toLocaleLowerCase()
|
|
74
|
-
.includes(searchTerm.toLocaleLowerCase()));
|
|
75
|
-
return matchingPages.map((page) => page.id.toString());
|
|
76
|
-
}
|
|
77
63
|
//# sourceMappingURL=page.js.map
|
|
78
|
-
//# debugId=
|
|
64
|
+
//# debugId=4a5c5d30-f2cc-5f45-9d88-37c63f6066a6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sources":["resources/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"page.js","sources":["resources/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { listStyleguideResources } from \"./styleguide.js\";\nimport { getPage, listPages } from \"../api/page.js\";\nimport { formatPageAsMarkdown } from \"../common/formatters/page.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerListPagesResource(server: McpServer) {\n server.registerResource(\n \"styleguide-page-list\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}/page-list\", {\n list: listStyleguideResources,\n }),\n {\n title: \"List the pages for a styleguide\",\n description: \"List all pages in a styleguide\",\n mimeType: \"text/markdown\",\n },\n async (uri, { styleguideId }, { authInfo }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n const credentials = await getCredentials(authInfo);\n const pages = await listPages(credentials, parsedStyleguideId);\n\n return {\n contents: [\n {\n uri: uri.href,\n text: pages\n .map((page) => `- ${page.name} (id: ${page.id})`)\n .join(\"\\n\"),\n },\n ],\n };\n },\n );\n}\n\nexport function registerPageResource(server: McpServer) {\n server.registerResource(\n \"page\",\n new ResourceTemplate(\n \"zeroheight://styleguide/{styleguideId}/page/{pageId}\",\n {\n list: undefined,\n },\n ),\n {\n title: \"Page\",\n description: \"Design system page\",\n mimeType: \"text/markdown\",\n },\n async (uri, { pageId }, { authInfo }) => {\n const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;\n const parsedPageId = parseInt(selectedId, 10);\n const credentials = await getCredentials(authInfo);\n const page = await getPage(credentials, parsedPageId);\n\n if (!page) {\n throw new Error(\"Couldn't find the page\");\n }\n\n return {\n contents: [\n {\n uri: uri.href,\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,IAAI,gBAAgB,CAAC,kDAAkD,EAAE;QACvE,IAAI,EAAE,uBAAuB;KAC9B,CAAC,EACF;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,YAAY,CAAC;QAEjB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAE/D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,KAAK;yBACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC;yBAChD,IAAI,CAAC,IAAI,CAAC;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,IAAI,gBAAgB,CAClB,sDAAsD,EACtD;QACE,IAAI,EAAE,SAAS;KAChB,CACF,EACD;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;oBAChC,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"4a5c5d30-f2cc-5f45-9d88-37c63f6066a6"}
|
|
@@ -2,17 +2,19 @@
|
|
|
2
2
|
* Styleguide Resources
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="522aedc5-1222-58f7-a417-ad02a0f76dbb")}catch(e){}}();
|
|
6
6
|
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
7
|
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
8
8
|
import { DEFAULT_NAME, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
9
|
+
import { getCredentials } from "../common/credentials.js";
|
|
9
10
|
export function registerStyleguideListResource(server) {
|
|
10
11
|
server.registerResource("styleguide-list", "zeroheight://styleguide/list", {
|
|
11
12
|
title: "Styleguide list",
|
|
12
13
|
description: "List all accessible styleguides",
|
|
13
14
|
mimeType: "application/json",
|
|
14
|
-
}, async (uri) => {
|
|
15
|
-
const
|
|
15
|
+
}, async (uri, { authInfo }) => {
|
|
16
|
+
const credentials = await getCredentials(authInfo);
|
|
17
|
+
const styleguideList = await listStyleguides(credentials);
|
|
16
18
|
const styleguideResources = styleguideList.map((styleguide) => ({
|
|
17
19
|
id: styleguide.id,
|
|
18
20
|
name: styleguide.name ?? DEFAULT_NAME,
|
|
@@ -31,27 +33,22 @@ export function registerStyleguideListResource(server) {
|
|
|
31
33
|
export function registerStyleguideResource(server) {
|
|
32
34
|
server.registerResource("styleguide", new ResourceTemplate("zeroheight://styleguide/{styleguideId}", {
|
|
33
35
|
list: undefined,
|
|
34
|
-
complete: {
|
|
35
|
-
styleguideId: completionForStyleduideId,
|
|
36
|
-
},
|
|
37
36
|
}), {
|
|
38
37
|
title: "Styleguide Navigation",
|
|
39
38
|
description: "Access the styleguide's navigation including categories, pages and tabs",
|
|
40
|
-
}, async (uri, { styleguideId }) => {
|
|
41
|
-
console.log({ uri, styleguideId });
|
|
39
|
+
}, async (uri, { styleguideId }, { authInfo }) => {
|
|
42
40
|
const selectedId = Array.isArray(styleguideId)
|
|
43
41
|
? styleguideId[0]
|
|
44
42
|
: styleguideId;
|
|
45
|
-
console.log({ selectedId });
|
|
46
43
|
const parsedStyleguideId = parseInt(selectedId, 10);
|
|
47
44
|
// TODO: Make endpoint to get basic styleguide info instead
|
|
48
|
-
const
|
|
49
|
-
|
|
45
|
+
const credentials = await getCredentials(authInfo);
|
|
46
|
+
const styleguideList = await listStyleguides(credentials);
|
|
50
47
|
const currentStyleguide = styleguideList.find((styleguide) => styleguide.id === parsedStyleguideId);
|
|
51
48
|
if (!currentStyleguide) {
|
|
52
49
|
return { contents: [] };
|
|
53
50
|
}
|
|
54
|
-
const tree = await getStyleguideTree(parsedStyleguideId);
|
|
51
|
+
const tree = await getStyleguideTree(credentials, parsedStyleguideId);
|
|
55
52
|
const formattedTree = formatTreeAsJson(tree);
|
|
56
53
|
return {
|
|
57
54
|
contents: [
|
|
@@ -65,16 +62,9 @@ export function registerStyleguideResource(server) {
|
|
|
65
62
|
});
|
|
66
63
|
}
|
|
67
64
|
/** Utils */
|
|
68
|
-
export async
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
.toString()
|
|
72
|
-
.toLocaleLowerCase()
|
|
73
|
-
.includes(searchTerm.toLocaleLowerCase()));
|
|
74
|
-
return matchingStyleguides.map((styleguide) => styleguide.id.toString());
|
|
75
|
-
}
|
|
76
|
-
export async function listStyleguideResources() {
|
|
77
|
-
const styleguideList = await listStyleguides();
|
|
65
|
+
export const listStyleguideResources = async ({ authInfo, }) => {
|
|
66
|
+
const credentials = await getCredentials(authInfo);
|
|
67
|
+
const styleguideList = await listStyleguides(credentials);
|
|
78
68
|
const resources = styleguideList.map((styleguide) => ({
|
|
79
69
|
uri: `zeroheight://styleguide/${styleguide.id}`,
|
|
80
70
|
name: `${styleguide.name ?? DEFAULT_NAME}`,
|
|
@@ -86,6 +76,6 @@ export async function listStyleguideResources() {
|
|
|
86
76
|
return {
|
|
87
77
|
resources,
|
|
88
78
|
};
|
|
89
|
-
}
|
|
79
|
+
};
|
|
90
80
|
//# sourceMappingURL=styleguide.js.map
|
|
91
|
-
//# debugId=
|
|
81
|
+
//# debugId=522aedc5-1222-58f7-a417-ad02a0f76dbb
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleguide.js","sources":["resources/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\n\nexport function registerStyleguideListResource(server: McpServer) {\n server.registerResource(\n \"styleguide-list\",\n \"zeroheight://styleguide/list\",\n {\n title: \"Styleguide list\",\n description: \"List all accessible styleguides\",\n mimeType: \"application/json\",\n },\n async (uri) => {\n const styleguideList = await listStyleguides();\n const styleguideResources = styleguideList.map((styleguide) => ({\n id: styleguide.id,\n name: styleguide.name ?? DEFAULT_NAME,\n }));\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(styleguideResources, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n }
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["resources/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Resources\n */\n\nimport {\n ListResourcesCallback,\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\nimport { getCredentials } from \"../common/credentials.js\";\n\nexport function registerStyleguideListResource(server: McpServer) {\n server.registerResource(\n \"styleguide-list\",\n \"zeroheight://styleguide/list\",\n {\n title: \"Styleguide list\",\n description: \"List all accessible styleguides\",\n mimeType: \"application/json\",\n },\n async (uri, { authInfo }) => {\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n const styleguideResources = styleguideList.map((styleguide) => ({\n id: styleguide.id,\n name: styleguide.name ?? DEFAULT_NAME,\n }));\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(styleguideResources, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n }\n );\n}\n\nexport function registerStyleguideResource(server: McpServer) {\n server.registerResource(\n \"styleguide\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}\", {\n list: undefined,\n }),\n {\n title: \"Styleguide Navigation\",\n description:\n \"Access the styleguide's navigation including categories, pages and tabs\",\n },\n async (uri, { styleguideId }, { authInfo }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n\n // TODO: Make endpoint to get basic styleguide info instead\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n\n const currentStyleguide = styleguideList.find(\n (styleguide) => styleguide.id === parsedStyleguideId\n );\n\n if (!currentStyleguide) {\n return { contents: [] };\n }\n\n const tree = await getStyleguideTree(credentials, parsedStyleguideId);\n\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n contents: [\n {\n mimeType: \"application/json\",\n uri: uri.href,\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n }\n );\n}\n\n/** Utils */\n\nexport const listStyleguideResources: ListResourcesCallback = async ({\n authInfo,\n}) => {\n const credentials = await getCredentials(authInfo);\n const styleguideList = await listStyleguides(credentials);\n const resources = styleguideList.map((styleguide) => ({\n uri: `zeroheight://styleguide/${styleguide.id}`,\n name: `${styleguide.name ?? DEFAULT_NAME}`,\n _meta: {\n id: styleguide.id,\n shareId: styleguide.share_id,\n },\n }));\n\n return {\n resources,\n };\n};\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,EAGL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,8BAA8B,CAAC,MAAiB;IAC9D,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,EACjB,8BAA8B,EAC9B;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iCAAiC;QAC9C,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC9D,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,YAAY;SACtC,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,QAAQ,EAAE,kBAAkB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,IAAI,gBAAgB,CAAC,wCAAwC,EAAE;QAC7D,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,yEAAyE;KAC5E,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,YAAY,CAAC;QAEjB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEpD,2DAA2D;QAC3D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QAE1D,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,CAC3C,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,kBAAkB,CACrD,CAAC;QAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAEtE,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,QAAQ,EAAE,kBAAkB;oBAC5B,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC7C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,YAAY;AAEZ,MAAM,CAAC,MAAM,uBAAuB,GAA0B,KAAK,EAAE,EACnE,QAAQ,GACT,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,GAAG,EAAE,2BAA2B,UAAU,CAAC,EAAE,EAAE;QAC/C,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,IAAI,YAAY,EAAE;QAC1C,KAAK,EAAE;YACL,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,OAAO,EAAE,UAAU,CAAC,QAAQ;SAC7B;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,SAAS;KACV,CAAC;AACJ,CAAC,CAAC","debug_id":"522aedc5-1222-58f7-a417-ad02a0f76dbb"}
|