@intlayer/mcp 5.5.11 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +167 -17
  2. package/dist/cjs/client/client.cjs +44 -0
  3. package/dist/cjs/client/client.cjs.map +1 -0
  4. package/dist/cjs/client/sse.cjs +61 -0
  5. package/dist/cjs/client/sse.cjs.map +1 -0
  6. package/dist/cjs/server/server.cjs +56 -0
  7. package/dist/cjs/server/server.cjs.map +1 -0
  8. package/dist/cjs/server/sse.cjs +123 -0
  9. package/dist/cjs/server/sse.cjs.map +1 -0
  10. package/dist/cjs/server/stdio.cjs +15 -0
  11. package/dist/cjs/server/stdio.cjs.map +1 -0
  12. package/dist/cjs/tools/cli.cjs +188 -0
  13. package/dist/cjs/tools/cli.cjs.map +1 -0
  14. package/dist/cjs/tools/docs.cjs +148 -0
  15. package/dist/cjs/tools/docs.cjs.map +1 -0
  16. package/dist/esm/client/client.mjs +18 -0
  17. package/dist/esm/client/client.mjs.map +1 -0
  18. package/dist/esm/client/sse.mjs +60 -0
  19. package/dist/esm/client/sse.mjs.map +1 -0
  20. package/dist/esm/server/server.mjs +30 -0
  21. package/dist/esm/server/server.mjs.map +1 -0
  22. package/dist/esm/server/sse.mjs +100 -0
  23. package/dist/esm/server/sse.mjs.map +1 -0
  24. package/dist/esm/server/stdio.mjs +14 -0
  25. package/dist/esm/server/stdio.mjs.map +1 -0
  26. package/dist/esm/tools/cli.mjs +154 -0
  27. package/dist/esm/tools/cli.mjs.map +1 -0
  28. package/dist/esm/tools/docs.mjs +114 -0
  29. package/dist/esm/tools/docs.mjs.map +1 -0
  30. package/dist/types/client/client.d.ts +26 -0
  31. package/dist/types/client/client.d.ts.map +1 -0
  32. package/dist/types/client/sse.d.ts +2 -0
  33. package/dist/types/client/sse.d.ts.map +1 -0
  34. package/dist/types/server/server.d.ts +4 -0
  35. package/dist/types/server/server.d.ts.map +1 -0
  36. package/dist/types/server/sse.d.ts +3 -0
  37. package/dist/types/server/sse.d.ts.map +1 -0
  38. package/dist/types/server/stdio.d.ts +3 -0
  39. package/dist/types/server/stdio.d.ts.map +1 -0
  40. package/dist/types/tools/cli.d.ts +3 -0
  41. package/dist/types/tools/cli.d.ts.map +1 -0
  42. package/dist/types/tools/docs.d.ts +3 -0
  43. package/dist/types/tools/docs.d.ts.map +1 -0
  44. package/package.json +39 -22
  45. package/dist/cjs/index.cjs +0 -314
  46. package/dist/cjs/index.cjs.map +0 -1
  47. package/dist/esm/index.mjs +0 -289
  48. package/dist/esm/index.mjs.map +0 -1
  49. package/dist/types/index.d.ts +0 -3
  50. package/dist/types/index.d.ts.map +0 -1
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var cli_exports = {};
30
+ __export(cli_exports, {
31
+ loadCLITools: () => loadCLITools
32
+ });
33
+ module.exports = __toCommonJS(cli_exports);
34
+ var import_cli = require("@intlayer/cli");
35
+ var import_config = require("@intlayer/config");
36
+ var import_zod = __toESM(require("zod"));
37
+ const loadCLITools = async (server) => {
38
+ server.tool(
39
+ "intlayer-fill",
40
+ "Fill the dictionaries with missing translations / review translations using Intlayer servers",
41
+ {
42
+ sourceLocale: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Source locale"),
43
+ outputLocales: import_zod.default.union([import_zod.default.nativeEnum(import_config.Locales), import_zod.default.array(import_zod.default.nativeEnum(import_config.Locales))]).optional().describe("Output locales"),
44
+ file: import_zod.default.union([import_zod.default.string(), import_zod.default.array(import_zod.default.string())]).optional().describe("File path"),
45
+ mode: import_zod.default.enum(["complete", "review"]).optional().describe("Fill mode"),
46
+ keys: import_zod.default.union([import_zod.default.string(), import_zod.default.array(import_zod.default.string())]).optional().describe("Keys to include"),
47
+ excludedKeys: import_zod.default.union([import_zod.default.string(), import_zod.default.array(import_zod.default.string())]).optional().describe("Keys to exclude"),
48
+ pathFilter: import_zod.default.union([import_zod.default.string(), import_zod.default.array(import_zod.default.string())]).optional().describe("Path filter"),
49
+ gitOptions: import_zod.default.object({
50
+ gitDiff: import_zod.default.boolean().optional(),
51
+ gitDiffBase: import_zod.default.string().optional(),
52
+ gitDiffCurrent: import_zod.default.string().optional(),
53
+ uncommitted: import_zod.default.boolean().optional(),
54
+ unpushed: import_zod.default.boolean().optional(),
55
+ untracked: import_zod.default.boolean().optional()
56
+ }).optional().describe("Git options"),
57
+ aiOptions: import_zod.default.object({
58
+ provider: import_zod.default.string().optional(),
59
+ temperature: import_zod.default.number().optional(),
60
+ model: import_zod.default.string().optional(),
61
+ apiKey: import_zod.default.string().optional(),
62
+ customPrompt: import_zod.default.string().optional(),
63
+ applicationContext: import_zod.default.string().optional()
64
+ }).optional().describe("AI options")
65
+ },
66
+ async (props) => {
67
+ try {
68
+ const { gitOptions, ...rest } = props;
69
+ const fillOptions = { ...rest, gitOptions: void 0 };
70
+ if (gitOptions) {
71
+ const { gitDiff, uncommitted, unpushed, untracked, ...restGit } = gitOptions;
72
+ const mode = [];
73
+ if (gitDiff) mode.push("gitDiff");
74
+ if (uncommitted) mode.push("uncommitted");
75
+ if (unpushed) mode.push("unpushed");
76
+ if (untracked) mode.push("untracked");
77
+ fillOptions.gitOptions = { ...restGit, mode };
78
+ }
79
+ await (0, import_cli.fill)(fillOptions);
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: "Fill successful."
85
+ }
86
+ ]
87
+ };
88
+ } catch (error) {
89
+ const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
90
+ return {
91
+ content: [
92
+ {
93
+ type: "text",
94
+ text: `Fill failed: ${errorMessage}`
95
+ }
96
+ ]
97
+ };
98
+ }
99
+ }
100
+ );
101
+ server.tool(
102
+ "intlayer-push",
103
+ "Push locale dictionaries to the server",
104
+ {
105
+ deleteLocaleDictionary: import_zod.default.boolean().optional().describe("Delete local dictionary after push"),
106
+ keepLocaleDictionary: import_zod.default.boolean().optional().describe("Keep local dictionary after push"),
107
+ dictionaries: import_zod.default.array(import_zod.default.string()).optional().describe("List of dictionaries to push"),
108
+ gitOptions: import_zod.default.object({
109
+ gitDiff: import_zod.default.boolean().optional(),
110
+ gitDiffBase: import_zod.default.string().optional(),
111
+ gitDiffCurrent: import_zod.default.string().optional(),
112
+ uncommitted: import_zod.default.boolean().optional(),
113
+ unpushed: import_zod.default.boolean().optional(),
114
+ untracked: import_zod.default.boolean().optional()
115
+ }).optional().describe("Git options")
116
+ },
117
+ async (props) => {
118
+ try {
119
+ const { gitOptions, ...rest } = props;
120
+ const pushOptions = { ...rest, gitOptions: void 0 };
121
+ if (gitOptions) {
122
+ const { gitDiff, uncommitted, unpushed, untracked, ...restGit } = gitOptions;
123
+ const mode = [];
124
+ if (gitDiff) mode.push("gitDiff");
125
+ if (uncommitted) mode.push("uncommitted");
126
+ if (unpushed) mode.push("unpushed");
127
+ if (untracked) mode.push("untracked");
128
+ pushOptions.gitOptions = { ...restGit, mode };
129
+ }
130
+ await (0, import_cli.push)(pushOptions);
131
+ return {
132
+ content: [
133
+ {
134
+ type: "text",
135
+ text: "Push successful."
136
+ }
137
+ ]
138
+ };
139
+ } catch (error) {
140
+ const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
141
+ return {
142
+ content: [
143
+ {
144
+ type: "text",
145
+ text: `Push failed: ${errorMessage}`
146
+ }
147
+ ]
148
+ };
149
+ }
150
+ }
151
+ );
152
+ server.tool(
153
+ "intlayer-pull",
154
+ "Pull dictionaries from the CMS",
155
+ {
156
+ dictionaries: import_zod.default.array(import_zod.default.string()).optional().describe("List of dictionaries to pull"),
157
+ newDictionariesPath: import_zod.default.string().optional().describe("Path to save new dictionaries")
158
+ },
159
+ async (props) => {
160
+ try {
161
+ await (0, import_cli.pull)(props);
162
+ return {
163
+ content: [
164
+ {
165
+ type: "text",
166
+ text: "Pull successful."
167
+ }
168
+ ]
169
+ };
170
+ } catch (error) {
171
+ const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
172
+ return {
173
+ content: [
174
+ {
175
+ type: "text",
176
+ text: `Pull failed: ${errorMessage}`
177
+ }
178
+ ]
179
+ };
180
+ }
181
+ }
182
+ );
183
+ };
184
+ // Annotate the CommonJS export names for ESM import in node:
185
+ 0 && (module.exports = {
186
+ loadCLITools
187
+ });
188
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import { fill, pull, push } from '@intlayer/cli';\nimport { Locales } from '@intlayer/config';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadCLITools = async (server: McpServer) => {\n server.tool(\n 'intlayer-fill',\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n {\n sourceLocale: z.nativeEnum(Locales).optional().describe('Source locale'),\n outputLocales: z\n .union([z.nativeEnum(Locales), z.array(z.nativeEnum(Locales))])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-push',\n 'Push locale dictionaries to the server',\n {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-pull',\n 'Pull dictionaries from the CMS',\n {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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","names":["z"]}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var docs_exports = {};
30
+ __export(docs_exports, {
31
+ loadDocsTools: () => loadDocsTools
32
+ });
33
+ module.exports = __toCommonJS(docs_exports);
34
+ var import_cli = require("@intlayer/cli");
35
+ var import_config = require("@intlayer/config");
36
+ var import_docs = require("@intlayer/docs");
37
+ var import_zod = __toESM(require("zod"));
38
+ const loadDocsTools = async (server) => {
39
+ server.tool(
40
+ "intlayer-build",
41
+ "Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.",
42
+ {
43
+ watch: import_zod.default.boolean().optional().describe("Watch for changes"),
44
+ baseDir: import_zod.default.string().optional().describe("Base directory"),
45
+ env: import_zod.default.string().optional().describe("Environment"),
46
+ envFile: import_zod.default.string().optional().describe("Environment file"),
47
+ verbose: import_zod.default.boolean().optional().describe("Verbose output"),
48
+ prefix: import_zod.default.string().optional().describe("Log prefix")
49
+ },
50
+ async ({ watch, baseDir, env, envFile, verbose, prefix }) => {
51
+ try {
52
+ const log = {};
53
+ if (verbose) {
54
+ log.mode = "verbose";
55
+ }
56
+ if (prefix) {
57
+ log.prefix = prefix;
58
+ }
59
+ await (0, import_cli.build)({
60
+ watch,
61
+ configOptions: {
62
+ baseDir,
63
+ env,
64
+ envFile,
65
+ override: {
66
+ log
67
+ }
68
+ }
69
+ });
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: "Build successful."
75
+ }
76
+ ]
77
+ };
78
+ } catch (error) {
79
+ const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: `Build failed: ${errorMessage}`
85
+ }
86
+ ]
87
+ };
88
+ }
89
+ }
90
+ );
91
+ server.tool(
92
+ "get-doc-list",
93
+ "Get the list of docs names and their metadata to get more details about what doc to retrieve",
94
+ {
95
+ lang: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Language of the docs")
96
+ },
97
+ async ({ lang }) => {
98
+ const docsMetadataRecord = await (0, import_docs.getDocMetadataRecord)(lang);
99
+ return {
100
+ content: [
101
+ {
102
+ type: "text",
103
+ text: JSON.stringify(docsMetadataRecord, null, 2)
104
+ }
105
+ ]
106
+ };
107
+ }
108
+ );
109
+ server.tool(
110
+ "get-doc",
111
+ "Get a doc by his key. Example: `./docs/en/getting-started.md`. List all docs metadata first to get more details about what doc key to retrieve.",
112
+ {
113
+ docKey: import_zod.default.string(),
114
+ lang: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Language of the docs")
115
+ },
116
+ async ({ docKey, lang }) => {
117
+ const doc = await (0, import_docs.getDoc)(docKey, lang);
118
+ return {
119
+ content: [{ type: "text", text: doc }]
120
+ };
121
+ }
122
+ );
123
+ server.tool(
124
+ "get-doc-by-slug",
125
+ "Get an array of docs by their slugs. If not slug is provided, return all docs (1.2Mb). List all docs metadata first to get more details about what doc to retrieve.",
126
+ {
127
+ slug: import_zod.default.union([import_zod.default.string(), import_zod.default.array(import_zod.default.string())]).optional().describe(
128
+ "Slug of the docs. If not provided, return all docs. If not provided, return all docs."
129
+ ),
130
+ lang: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Language of the docs"),
131
+ strict: import_zod.default.boolean().optional().describe(
132
+ "Strict mode - only return docs that match all slugs, by excluding additional slugs"
133
+ ),
134
+ description: "Get an array of docs by their slugs"
135
+ },
136
+ async ({ slug, lang, strict }) => {
137
+ const doc = await (0, import_docs.getDocBySlug)(slug, lang, strict);
138
+ return {
139
+ content: doc.map((d) => ({ type: "text", text: d }))
140
+ };
141
+ }
142
+ );
143
+ };
144
+ // Annotate the CommonJS export names for ESM import in node:
145
+ 0 && (module.exports = {
146
+ loadDocsTools
147
+ });
148
+ //# sourceMappingURL=docs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/tools/docs.ts"],"sourcesContent":["import { build } from '@intlayer/cli';\nimport { Locales, LogConfig } from '@intlayer/config';\nimport { getDoc, getDocBySlug, getDocMetadataRecord } from '@intlayer/docs';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadDocsTools = async (server: McpServer) => {\n server.tool(\n 'intlayer-build',\n 'Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.',\n {\n watch: z.boolean().optional().describe('Watch for changes'),\n baseDir: z.string().optional().describe('Base directory'),\n env: z.string().optional().describe('Environment'),\n envFile: z.string().optional().describe('Environment file'),\n verbose: z.boolean().optional().describe('Verbose output'),\n prefix: z.string().optional().describe('Log prefix'),\n },\n async ({ watch, baseDir, env, envFile, verbose, prefix }) => {\n try {\n const log: Partial<LogConfig> = {};\n if (verbose) {\n log.mode = 'verbose';\n }\n if (prefix) {\n log.prefix = prefix;\n }\n\n await build({\n watch,\n configOptions: {\n baseDir,\n env,\n envFile,\n override: {\n log,\n },\n },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Build successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Build failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'get-doc-list',\n 'Get the list of docs names and their metadata to get more details about what doc to retrieve',\n {\n lang: z.nativeEnum(Locales).optional().describe('Language of the docs'),\n },\n async ({ lang }) => {\n const docsMetadataRecord = await getDocMetadataRecord(lang);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(docsMetadataRecord, null, 2),\n },\n ],\n };\n }\n );\n\n server.tool(\n 'get-doc',\n 'Get a doc by his key. Example: `./docs/en/getting-started.md`. List all docs metadata first to get more details about what doc key to retrieve.',\n {\n docKey: z.string(),\n lang: z.nativeEnum(Locales).optional().describe('Language of the docs'),\n },\n async ({ docKey, lang }) => {\n const doc = await getDoc(docKey as any, lang);\n return {\n content: [{ type: 'text', text: doc }],\n };\n }\n );\n\n server.tool(\n 'get-doc-by-slug',\n 'Get an array of docs by their slugs. If not slug is provided, return all docs (1.2Mb). List all docs metadata first to get more details about what doc to retrieve.',\n {\n slug: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\n 'Slug of the docs. If not provided, return all docs. If not provided, return all docs.'\n ),\n lang: z.nativeEnum(Locales).optional().describe('Language of the docs'),\n strict: z\n .boolean()\n .optional()\n .describe(\n 'Strict mode - only return docs that match all slugs, by excluding additional slugs'\n ),\n description: 'Get an array of docs by their slugs',\n },\n async ({ slug, lang, strict }) => {\n const doc = await getDocBySlug(slug, lang, strict);\n return {\n content: doc.map((d) => ({ type: 'text', text: d })),\n };\n }\n );\n};\n"],"mappings":"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","names":["z"]}
@@ -0,0 +1,18 @@
1
+ import { isESModule } from "@intlayer/config";
2
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
3
+ import { readFileSync } from "fs";
4
+ import { dirname as pathDirname, resolve } from "path";
5
+ import { fileURLToPath } from "url";
6
+ const dirname = isESModule ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;
7
+ const packageJson = JSON.parse(
8
+ readFileSync(resolve(dirname, "../../../package.json"), "utf8")
9
+ );
10
+ const loadClient = () => new Client({
11
+ name: `mcp-client-for-intlayer-mcp-server`,
12
+ version: packageJson.version
13
+ });
14
+ export {
15
+ dirname,
16
+ loadClient
17
+ };
18
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/client/client.ts"],"sourcesContent":["import { isESModule } from '@intlayer/config';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { readFileSync } from 'fs';\nimport { dirname as pathDirname, resolve } from 'path';\nimport { fileURLToPath } from 'url';\n\nexport const dirname = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\nexport const loadClient = () =>\n new Client({\n name: `mcp-client-for-intlayer-mcp-server`,\n version: packageJson.version,\n });\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,WAAW,aAAa,eAAe;AAChD,SAAS,qBAAqB;AAEvB,MAAM,UAAU,aACnB,YAAY,cAAc,YAAY,GAAG,CAAC,IAC1C;AAEJ,MAAM,cAAc,KAAK;AAAA,EACvB,aAAa,QAAQ,SAAS,uBAAuB,GAAG,MAAM;AAChE;AAEO,MAAM,aAAa,MACxB,IAAI,OAAO;AAAA,EACT,MAAM;AAAA,EACN,SAAS,YAAY;AACvB,CAAC;","names":[]}
@@ -0,0 +1,60 @@
1
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
2
+ import { URL } from "url";
3
+ import { loadClient } from "./client.mjs";
4
+ class SSEClient {
5
+ client;
6
+ transport = null;
7
+ isCompleted = false;
8
+ constructor() {
9
+ this.client = loadClient();
10
+ }
11
+ async connectToServer() {
12
+ const mcpServerURL = process.env.MCP_SERVER_URL ?? "https://mcp.intlayer.org";
13
+ const url = new URL(mcpServerURL);
14
+ try {
15
+ console.info(`Connecting to server - ${mcpServerURL}`);
16
+ this.transport = new SSEClientTransport(url);
17
+ await this.client.connect(this.transport);
18
+ console.info("Connected to MCP server");
19
+ this.setUpTransport();
20
+ } catch (e) {
21
+ console.info("Failed to connect to MCP server: ", e);
22
+ throw e;
23
+ }
24
+ }
25
+ setUpTransport() {
26
+ if (this.transport === null) {
27
+ return;
28
+ }
29
+ this.transport.onclose = () => {
30
+ console.info("SSE transport closed.");
31
+ this.isCompleted = true;
32
+ };
33
+ this.transport.onerror = async (error) => {
34
+ console.info("SSE transport error: ", error);
35
+ await this.cleanup();
36
+ };
37
+ this.transport.onmessage = (message) => {
38
+ console.info("message received: ", message);
39
+ };
40
+ }
41
+ async waitForCompletion() {
42
+ while (!this.isCompleted) {
43
+ await new Promise((resolve) => setTimeout(resolve, 100));
44
+ }
45
+ }
46
+ async cleanup() {
47
+ await this.client.close();
48
+ }
49
+ }
50
+ const main = async () => {
51
+ const client = new SSEClient();
52
+ try {
53
+ await client.connectToServer();
54
+ await client.waitForCompletion();
55
+ } finally {
56
+ await client.cleanup();
57
+ }
58
+ };
59
+ main();
60
+ //# sourceMappingURL=sse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/client/sse.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { URL } from 'url';\nimport { loadClient } from './client';\n\nclass SSEClient {\n private client: Client;\n private transport: Transport | null = null;\n private isCompleted = false;\n\n constructor() {\n this.client = loadClient();\n }\n\n async connectToServer() {\n const mcpServerURL =\n process.env.MCP_SERVER_URL ?? 'https://mcp.intlayer.org';\n\n const url = new URL(mcpServerURL);\n try {\n console.info(`Connecting to server - ${mcpServerURL}`);\n this.transport = new SSEClientTransport(url);\n await this.client.connect(this.transport);\n console.info('Connected to MCP server');\n\n this.setUpTransport();\n } catch (e) {\n console.info('Failed to connect to MCP server: ', e);\n throw e;\n }\n }\n\n private setUpTransport() {\n if (this.transport === null) {\n return;\n }\n this.transport.onclose = () => {\n console.info('SSE transport closed.');\n this.isCompleted = true;\n };\n\n this.transport.onerror = async (error) => {\n console.info('SSE transport error: ', error);\n await this.cleanup();\n };\n\n this.transport.onmessage = (message) => {\n console.info('message received: ', message);\n };\n }\n\n async waitForCompletion() {\n while (!this.isCompleted) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n async cleanup() {\n await this.client.close();\n }\n}\n\nconst main = async () => {\n const client = new SSEClient();\n\n try {\n await client.connectToServer();\n await client.waitForCompletion();\n } finally {\n await client.cleanup();\n }\n};\n\nmain();\n"],"mappings":"AACA,SAAS,0BAA0B;AAEnC,SAAS,WAAW;AACpB,SAAS,kBAAkB;AAE3B,MAAM,UAAU;AAAA,EACN;AAAA,EACA,YAA8B;AAAA,EAC9B,cAAc;AAAA,EAEtB,cAAc;AACZ,SAAK,SAAS,WAAW;AAAA,EAC3B;AAAA,EAEA,MAAM,kBAAkB;AACtB,UAAM,eACJ,QAAQ,IAAI,kBAAkB;AAEhC,UAAM,MAAM,IAAI,IAAI,YAAY;AAChC,QAAI;AACF,cAAQ,KAAK,0BAA0B,YAAY,EAAE;AACrD,WAAK,YAAY,IAAI,mBAAmB,GAAG;AAC3C,YAAM,KAAK,OAAO,QAAQ,KAAK,SAAS;AACxC,cAAQ,KAAK,yBAAyB;AAEtC,WAAK,eAAe;AAAA,IACtB,SAAS,GAAG;AACV,cAAQ,KAAK,qCAAqC,CAAC;AACnD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,QAAI,KAAK,cAAc,MAAM;AAC3B;AAAA,IACF;AACA,SAAK,UAAU,UAAU,MAAM;AAC7B,cAAQ,KAAK,uBAAuB;AACpC,WAAK,cAAc;AAAA,IACrB;AAEA,SAAK,UAAU,UAAU,OAAO,UAAU;AACxC,cAAQ,KAAK,yBAAyB,KAAK;AAC3C,YAAM,KAAK,QAAQ;AAAA,IACrB;AAEA,SAAK,UAAU,YAAY,CAAC,YAAY;AACtC,cAAQ,KAAK,sBAAsB,OAAO;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB;AACxB,WAAO,CAAC,KAAK,aAAa;AACxB,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AACd,UAAM,KAAK,OAAO,MAAM;AAAA,EAC1B;AACF;AAEA,MAAM,OAAO,YAAY;AACvB,QAAM,SAAS,IAAI,UAAU;AAE7B,MAAI;AACF,UAAM,OAAO,gBAAgB;AAC7B,UAAM,OAAO,kBAAkB;AAAA,EACjC,UAAE;AACA,UAAM,OAAO,QAAQ;AAAA,EACvB;AACF;AAEA,KAAK;","names":[]}
@@ -0,0 +1,30 @@
1
+ import { isESModule } from "@intlayer/config";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { readFileSync } from "fs";
4
+ import { dirname as pathDirname, resolve } from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { loadCLITools } from "../tools/cli.mjs";
7
+ import { loadDocsTools } from "../tools/docs.mjs";
8
+ const dirname = isESModule ? pathDirname(fileURLToPath(import.meta.url)) : __dirname;
9
+ const packageJson = JSON.parse(
10
+ readFileSync(resolve(dirname, "../../../package.json"), "utf8")
11
+ );
12
+ const loadServer = (isLocal) => {
13
+ const server = new McpServer({
14
+ name: "intlayer",
15
+ version: packageJson.version,
16
+ capabilities: {
17
+ resources: {}
18
+ }
19
+ });
20
+ if (!isLocal) {
21
+ loadCLITools(server);
22
+ }
23
+ loadDocsTools(server);
24
+ return server;
25
+ };
26
+ export {
27
+ dirname,
28
+ loadServer
29
+ };
30
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/server.ts"],"sourcesContent":["import { isESModule } from '@intlayer/config';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync } from 'fs';\nimport { dirname as pathDirname, resolve } from 'path';\nimport { fileURLToPath } from 'url';\nimport { loadCLITools } from '../tools/cli';\nimport { loadDocsTools } from '../tools/docs';\n\nexport const dirname = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\nexport const loadServer = (isLocal: boolean): McpServer => {\n const server = new McpServer({\n name: 'intlayer',\n version: packageJson.version,\n capabilities: {\n resources: {},\n },\n });\n\n if (!isLocal) {\n loadCLITools(server);\n }\n\n loadDocsTools(server);\n\n return server;\n};\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,WAAW,aAAa,eAAe;AAChD,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAEvB,MAAM,UAAU,aACnB,YAAY,cAAc,YAAY,GAAG,CAAC,IAC1C;AAEJ,MAAM,cAAc,KAAK;AAAA,EACvB,aAAa,QAAQ,SAAS,uBAAuB,GAAG,MAAM;AAChE;AAEO,MAAM,aAAa,CAAC,YAAgC;AACzD,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS,YAAY;AAAA,IACrB,cAAc;AAAA,MACZ,WAAW,CAAC;AAAA,IACd;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS;AACZ,iBAAa,MAAM;AAAA,EACrB;AAEA,gBAAc,MAAM;AAEpB,SAAO;AACT;","names":[]}
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env node
2
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
3
+ import dotenv from "dotenv";
4
+ import express from "express";
5
+ import { loadServer } from "./server.mjs";
6
+ const server = loadServer(false);
7
+ const app = express();
8
+ const env = app.get("env");
9
+ dotenv.config({
10
+ path: [`.env.${env}.local`, `.env.${env}`, ".env.local", ".env"]
11
+ });
12
+ app.use((req, res, next) => {
13
+ res.header("Access-Control-Allow-Origin", "*");
14
+ res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
15
+ res.header("Access-Control-Allow-Headers", "Content-Type");
16
+ if (req.method === "OPTIONS") {
17
+ res.sendStatus(200);
18
+ return;
19
+ }
20
+ next();
21
+ });
22
+ app.use(express.json());
23
+ const router = express.Router();
24
+ const transports = {};
25
+ const POST_ENDPOINT = "/messages";
26
+ router.post(POST_ENDPOINT, async (req, res) => {
27
+ console.info("message request received: ", req.body);
28
+ const sessionId = req.query.sessionId;
29
+ if (typeof sessionId != "string") {
30
+ res.status(400).send({ messages: "Bad session id." });
31
+ return;
32
+ }
33
+ const transport = transports[sessionId];
34
+ if (!transport) {
35
+ res.status(400).send({ messages: "No transport found for sessionId." });
36
+ return;
37
+ }
38
+ await transport.handlePostMessage(req, res, req.body);
39
+ return;
40
+ });
41
+ router.get("/", async (_req, res) => {
42
+ console.info("connection request received");
43
+ const transport = new SSEServerTransport(POST_ENDPOINT, res);
44
+ console.info("new transport created with session id: ", transport.sessionId);
45
+ transports[transport.sessionId] = transport;
46
+ console.info(`${Object.keys(transports).length} sessions active`);
47
+ res.on("close", () => {
48
+ console.info("SSE connection closed");
49
+ delete transports[transport.sessionId];
50
+ });
51
+ await server.connect(transport);
52
+ await sendMessages(transport);
53
+ return;
54
+ });
55
+ const sendMessages = async (transport) => {
56
+ try {
57
+ await transport.send({
58
+ jsonrpc: "2.0",
59
+ method: "sse/connection",
60
+ params: { message: "Stream started" }
61
+ });
62
+ console.info("Stream started");
63
+ let messageCount = 0;
64
+ const interval = setInterval(async () => {
65
+ messageCount++;
66
+ const message = `Message ${messageCount} at ${(/* @__PURE__ */ new Date()).toISOString()}`;
67
+ try {
68
+ await transport.send({
69
+ jsonrpc: "2.0",
70
+ method: "sse/message",
71
+ params: { data: message }
72
+ });
73
+ console.info(`Sent: ${message}`);
74
+ if (messageCount === 2) {
75
+ clearInterval(interval);
76
+ await transport.send({
77
+ jsonrpc: "2.0",
78
+ method: "sse/complete",
79
+ params: { message: "Stream completed" }
80
+ });
81
+ console.info("Stream completed");
82
+ }
83
+ } catch (error) {
84
+ console.error("Error sending message:", error);
85
+ clearInterval(interval);
86
+ }
87
+ }, 1e3);
88
+ } catch (error) {
89
+ console.error("Error in startSending:", error);
90
+ }
91
+ };
92
+ app.use("/", router);
93
+ app.use("/health", (_req, res) => {
94
+ res.send("OK");
95
+ });
96
+ const PORT = process.env.PORT ?? 3e3;
97
+ app.listen(PORT, () => {
98
+ console.info(`MCP Streamable HTTP Server listening on port ${PORT}`);
99
+ });
100
+ //# sourceMappingURL=sse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/sse.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport dotenv from 'dotenv';\nimport express, { type Request, type Response } from 'express';\nimport { loadServer } from './server';\n\n/*******************************/\n/******* Server Set Up *******/\n/*******************************/\n\nconst server = loadServer(false);\n\n/*******************************/\n/******* Express App Set Up *******/\n/*******************************/\n\nconst app = express();\n\n// Environment variables\nconst env = app.get('env');\n\ndotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n});\n\n// Enable CORS for development\napp.use((req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.sendStatus(200);\n return;\n }\n\n next();\n});\n\napp.use(express.json());\nconst router = express.Router();\n\n// to support multiple simultaneous connections we have a lookup object from\n// sessionId to transport\nconst transports: { [sessionId: string]: SSEServerTransport } = {};\n\n// endpoint for the client to use for sending messages\nconst POST_ENDPOINT = '/messages';\n\nrouter.post(POST_ENDPOINT, async (req: Request, res: Response) => {\n console.info('message request received: ', req.body);\n // when client sends messages with `SSEClientTransport`,\n // the sessionId will be atomically set as query parameter.\n const sessionId = req.query.sessionId;\n\n if (typeof sessionId != 'string') {\n res.status(400).send({ messages: 'Bad session id.' });\n return;\n }\n const transport = transports[sessionId];\n if (!transport) {\n res.status(400).send({ messages: 'No transport found for sessionId.' });\n return;\n }\n\n // IMPORTANT!\n // using `await transport.handlePostMessage(req, res)` will cause\n // `SSE transport error: Error: Error POSTing to endpoint (HTTP 400): InternalServerError: stream is not readable`\n // on the client side\n await transport.handlePostMessage(req, res, req.body);\n\n return;\n});\n\n// initialization:\n// create a new transport to connect and\n// send an endpoint event containing a URI for the client to use for sending messages\nrouter.get('/', async (_req: Request, res: Response) => {\n console.info('connection request received');\n // tells the client to send messages to the `POST_ENDPOINT`\n const transport = new SSEServerTransport(POST_ENDPOINT, res);\n console.info('new transport created with session id: ', transport.sessionId);\n\n transports[transport.sessionId] = transport;\n\n console.info(`${Object.keys(transports).length} sessions active`);\n\n res.on('close', () => {\n console.info('SSE connection closed');\n delete transports[transport.sessionId];\n });\n\n await server.connect(transport);\n\n // an exmaple of a server-sent-event (message) to client\n await sendMessages(transport);\n\n return;\n});\n\nconst sendMessages = async (transport: SSEServerTransport) => {\n try {\n // some messages will proabaly not be able to observed on the client side\n // becasue an open SSE Stream is not yet established\n // by receving the `initialize` POST request and the `notifications/initialized` POST request\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/connection',\n params: { message: 'Stream started' },\n });\n console.info('Stream started');\n\n let messageCount = 0;\n const interval = setInterval(async () => {\n messageCount++;\n\n const message = `Message ${messageCount} at ${new Date().toISOString()}`;\n\n try {\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/message',\n params: { data: message },\n });\n\n console.info(`Sent: ${message}`);\n\n if (messageCount === 2) {\n clearInterval(interval);\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/complete',\n params: { message: 'Stream completed' },\n });\n console.info('Stream completed');\n }\n } catch (error) {\n console.error('Error sending message:', error);\n clearInterval(interval);\n }\n }, 1000);\n } catch (error) {\n console.error('Error in startSending:', error);\n }\n};\n\napp.use('/', router);\n\napp.use('/health', (_req: Request, res: Response) => {\n res.send('OK');\n});\n\nconst PORT = process.env.PORT ?? 3000;\n\napp.listen(PORT, () => {\n console.info(`MCP Streamable HTTP Server listening on port ${PORT}`);\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { loadServer } from "./server.mjs";
4
+ const server = loadServer(true);
5
+ const main = async () => {
6
+ const transport = new StdioServerTransport();
7
+ await server.connect(transport);
8
+ console.error("Intlayer MCP Server running on stdio");
9
+ };
10
+ main().catch((error) => {
11
+ console.error("Fatal error in main():", error);
12
+ process.exit(1);
13
+ });
14
+ //# sourceMappingURL=stdio.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/stdio.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadServer } from './server';\n\nconst server = loadServer(true);\n\nconst main = async () => {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Intlayer MCP Server running on stdio');\n};\n\nmain().catch((error) => {\n console.error('Fatal error in main():', error);\n process.exit(1);\n});\n"],"mappings":";AAEA,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAE3B,MAAM,SAAS,WAAW,IAAI;AAE9B,MAAM,OAAO,YAAY;AACvB,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAC9B,UAAQ,MAAM,sCAAsC;AACtD;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,0BAA0B,KAAK;AAC7C,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}