@decodo/mcp-server 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -34
- package/build/clients/scraper-api-client.js +78 -16
- package/build/clients/scraper-api-client.js.map +1 -1
- package/build/constants.js +35 -1
- package/build/constants.js.map +1 -1
- package/build/index.js +11 -11
- package/build/index.js.map +1 -1
- package/build/server/sapi-base-server.js +76 -0
- package/build/server/sapi-base-server.js.map +1 -0
- package/build/server/sapi-http-server.js +11 -0
- package/build/server/sapi-http-server.js.map +1 -0
- package/build/server/sapi-stdio-server.js +11 -0
- package/build/server/sapi-stdio-server.js.map +1 -0
- package/build/server.js +53 -0
- package/build/server.js.map +1 -0
- package/build/tools/amazon-bestsellers/amazon-bestsellers-tool.js +55 -0
- package/build/tools/amazon-bestsellers/amazon-bestsellers-tool.js.map +1 -0
- package/build/tools/amazon-bestsellers/index.js +18 -0
- package/build/tools/amazon-bestsellers/index.js.map +1 -0
- package/build/tools/amazon-pricing/amazon-pricing-tool.js +67 -0
- package/build/tools/amazon-pricing/amazon-pricing-tool.js.map +1 -0
- package/build/tools/amazon-pricing/index.js +18 -0
- package/build/tools/amazon-pricing/index.js.map +1 -0
- package/build/tools/amazon-product/amazon-product-tool.js +62 -0
- package/build/tools/amazon-product/amazon-product-tool.js.map +1 -0
- package/build/tools/amazon-product/index.js +18 -0
- package/build/tools/amazon-product/index.js.map +1 -0
- package/build/tools/amazon-search/amazon-search-tool.js +63 -0
- package/build/tools/amazon-search/amazon-search-tool.js.map +1 -0
- package/build/tools/amazon-search/index.js +18 -0
- package/build/tools/amazon-search/index.js.map +1 -0
- package/build/tools/amazon-sellers/amazon-sellers-tool.js +56 -0
- package/build/tools/amazon-sellers/amazon-sellers-tool.js.map +1 -0
- package/build/tools/amazon-sellers/index.js +18 -0
- package/build/tools/amazon-sellers/index.js.map +1 -0
- package/build/tools/bing-search/bing-search-tool.js +64 -0
- package/build/tools/bing-search/bing-search-tool.js.map +1 -0
- package/build/tools/bing-search/index.js +18 -0
- package/build/tools/bing-search/index.js.map +1 -0
- package/build/tools/chatgpt/chatgpt-tool.js +47 -0
- package/build/tools/chatgpt/chatgpt-tool.js.map +1 -0
- package/build/tools/chatgpt/index.js +18 -0
- package/build/tools/chatgpt/index.js.map +1 -0
- package/build/tools/google-ads/google-ads-tool.js +59 -0
- package/build/tools/google-ads/google-ads-tool.js.map +1 -0
- package/build/tools/google-ads/index.js +18 -0
- package/build/tools/google-ads/index.js.map +1 -0
- package/build/tools/google-ai-mode/google-ai-mode-tool.js +50 -0
- package/build/tools/google-ai-mode/google-ai-mode-tool.js.map +1 -0
- package/build/tools/google-ai-mode/index.js +18 -0
- package/build/tools/google-ai-mode/index.js.map +1 -0
- package/build/tools/google-lens/google-lens-tool.js +52 -0
- package/build/tools/google-lens/google-lens-tool.js.map +1 -0
- package/build/tools/google-lens/index.js +18 -0
- package/build/tools/google-lens/index.js.map +1 -0
- package/build/tools/google-search/google-search-tool.js +60 -0
- package/build/tools/google-search/google-search-tool.js.map +1 -0
- package/build/tools/google-search/index.js +18 -0
- package/build/tools/google-search/index.js.map +1 -0
- package/build/tools/google-travel-hotels/google-travel-hotels-tool.js +52 -0
- package/build/tools/google-travel-hotels/google-travel-hotels-tool.js.map +1 -0
- package/build/tools/google-travel-hotels/index.js +18 -0
- package/build/tools/google-travel-hotels/index.js.map +1 -0
- package/build/tools/index.js +30 -5
- package/build/tools/index.js.map +1 -1
- package/build/tools/perplexity/index.js +18 -0
- package/build/tools/perplexity/index.js.map +1 -0
- package/build/tools/perplexity/perplexity-tool.js +46 -0
- package/build/tools/perplexity/perplexity-tool.js.map +1 -0
- package/build/tools/reddit-post/index.js +18 -0
- package/build/tools/reddit-post/index.js.map +1 -0
- package/build/tools/reddit-post/reddit-post-tool.js +51 -0
- package/build/tools/reddit-post/reddit-post-tool.js.map +1 -0
- package/build/tools/reddit-subreddit/index.js +18 -0
- package/build/tools/reddit-subreddit/index.js.map +1 -0
- package/build/tools/reddit-subreddit/reddit-subreddit-tool.js +49 -0
- package/build/tools/reddit-subreddit/reddit-subreddit-tool.js.map +1 -0
- package/build/tools/reddit-user/index.js +18 -0
- package/build/tools/reddit-user/index.js.map +1 -0
- package/build/tools/reddit-user/reddit-user-tool.js +55 -0
- package/build/tools/reddit-user/reddit-user-tool.js.map +1 -0
- package/build/tools/scrape-as-markdown/index.js +18 -0
- package/build/tools/scrape-as-markdown/index.js.map +1 -0
- package/build/tools/scrape-as-markdown/scrape-as-markdown-tool.js +79 -0
- package/build/tools/scrape-as-markdown/scrape-as-markdown-tool.js.map +1 -0
- package/build/tools/screenshot/index.js +18 -0
- package/build/tools/screenshot/index.js.map +1 -0
- package/build/tools/screenshot/screenshot-tool.js +48 -0
- package/build/tools/screenshot/screenshot-tool.js.map +1 -0
- package/build/tools/target-product/index.js +18 -0
- package/build/tools/target-product/index.js.map +1 -0
- package/build/tools/target-product/target-product-tool.js +50 -0
- package/build/tools/target-product/target-product-tool.js.map +1 -0
- package/build/tools/target-search/index.js +18 -0
- package/build/tools/target-search/index.js.map +1 -0
- package/build/tools/target-search/target-search-tool.js +56 -0
- package/build/tools/target-search/target-search-tool.js.map +1 -0
- package/build/tools/tiktok-post/index.js +18 -0
- package/build/tools/tiktok-post/index.js.map +1 -0
- package/build/tools/tiktok-post/tiktok-post-tool.js +48 -0
- package/build/tools/tiktok-post/tiktok-post-tool.js.map +1 -0
- package/build/tools/tiktok-shop-product/index.js +18 -0
- package/build/tools/tiktok-shop-product/index.js.map +1 -0
- package/build/tools/tiktok-shop-product/tiktok-shop-product-tool.js +47 -0
- package/build/tools/tiktok-shop-product/tiktok-shop-product-tool.js.map +1 -0
- package/build/tools/tiktok-shop-search/index.js +18 -0
- package/build/tools/tiktok-shop-search/index.js.map +1 -0
- package/build/tools/tiktok-shop-search/tiktok-shop-search-tool.js +54 -0
- package/build/tools/tiktok-shop-search/tiktok-shop-search-tool.js.map +1 -0
- package/build/tools/tiktok-shop-url/index.js +18 -0
- package/build/tools/tiktok-shop-url/index.js.map +1 -0
- package/build/tools/tiktok-shop-url/tiktok-shop-url-tool.js +45 -0
- package/build/tools/tiktok-shop-url/tiktok-shop-url-tool.js.map +1 -0
- package/build/tools/tool.js +7 -0
- package/build/tools/tool.js.map +1 -0
- package/build/tools/walmart-product/index.js +18 -0
- package/build/tools/walmart-product/index.js.map +1 -0
- package/build/tools/walmart-product/walmart-product-tool.js +61 -0
- package/build/tools/walmart-product/walmart-product-tool.js.map +1 -0
- package/build/tools/walmart-search/index.js +18 -0
- package/build/tools/walmart-search/index.js.map +1 -0
- package/build/tools/walmart-search/walmart-search-tool.js +62 -0
- package/build/tools/walmart-search/walmart-search-tool.js.map +1 -0
- package/build/tools/youtube-channel/index.js +18 -0
- package/build/tools/youtube-channel/index.js.map +1 -0
- package/build/tools/youtube-channel/youtube-channel-tool.js +48 -0
- package/build/tools/youtube-channel/youtube-channel-tool.js.map +1 -0
- package/build/tools/youtube-metadata/index.js +18 -0
- package/build/tools/youtube-metadata/index.js.map +1 -0
- package/build/tools/youtube-metadata/youtube-metadata-tool.js +43 -0
- package/build/tools/youtube-metadata/youtube-metadata-tool.js.map +1 -0
- package/build/tools/youtube-search/index.js +18 -0
- package/build/tools/youtube-search/index.js.map +1 -0
- package/build/tools/youtube-search/youtube-search-tool.js +43 -0
- package/build/tools/youtube-search/youtube-search-tool.js.map +1 -0
- package/build/tools/youtube-subtitles/index.js +18 -0
- package/build/tools/youtube-subtitles/index.js.map +1 -0
- package/build/tools/youtube-subtitles/youtube-subtitles-tool.js +48 -0
- package/build/tools/youtube-subtitles/youtube-subtitles-tool.js.map +1 -0
- package/build/utils.js +14 -3
- package/build/utils.js.map +1 -1
- package/build/zod/zod-types.js +12 -4
- package/build/zod/zod-types.js.map +1 -1
- package/package.json +37 -12
- package/build/sapi-mcp-server.js +0 -40
- package/build/sapi-mcp-server.js.map +0 -1
- package/build/tools/amazon-search-parsed-tool.js +0 -46
- package/build/tools/amazon-search-parsed-tool.js.map +0 -1
- package/build/tools/google-search-parsed-tool.js +0 -54
- package/build/tools/google-search-parsed-tool.js.map +0 -1
- package/build/tools/reddit-post-tool.js +0 -34
- package/build/tools/reddit-post-tool.js.map +0 -1
- package/build/tools/reddit-subreddit-tool.js +0 -34
- package/build/tools/reddit-subreddit-tool.js.map +0 -1
- package/build/tools/scrape-as-markdown-tool.js +0 -70
- package/build/tools/scrape-as-markdown-tool.js.map +0 -1
- package/build/tools/scrape-tool.js +0 -70
- package/build/tools/scrape-tool.js.map +0 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./youtube-subtitles-tool"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/youtube-subtitles/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.YoutubeSubtitlesTool = void 0;
|
|
7
|
+
const zod_1 = __importDefault(require("zod"));
|
|
8
|
+
const constants_1 = require("../../constants");
|
|
9
|
+
const tool_1 = require("../tool");
|
|
10
|
+
const zodLanguageCode = zod_1.default
|
|
11
|
+
.string()
|
|
12
|
+
.describe('Language code for subtitles (e.g., "en", "es")')
|
|
13
|
+
.optional();
|
|
14
|
+
class YoutubeSubtitlesTool extends tool_1.Tool {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.toolset = constants_1.TOOLSET.SOCIAL_MEDIA;
|
|
18
|
+
this.transformResponse = ({ data }) => {
|
|
19
|
+
return { data: JSON.stringify(data) };
|
|
20
|
+
};
|
|
21
|
+
this.register = ({ server, sapiClient, auth }) => {
|
|
22
|
+
server.registerTool('youtube_subtitles', {
|
|
23
|
+
description: 'Scrape YouTube video subtitles',
|
|
24
|
+
inputSchema: {
|
|
25
|
+
query: zod_1.default.string().describe('YouTube video ID (e.g., "L8zSWbQN-v8")'),
|
|
26
|
+
language_code: zodLanguageCode,
|
|
27
|
+
},
|
|
28
|
+
annotations: {
|
|
29
|
+
readOnlyHint: true,
|
|
30
|
+
openWorldHint: true,
|
|
31
|
+
},
|
|
32
|
+
}, async (scrapingParams) => {
|
|
33
|
+
const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.YOUTUBE_SUBTITLES });
|
|
34
|
+
const { data } = await sapiClient.scrape({ auth, scrapingParams: params });
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: 'text',
|
|
39
|
+
text: JSON.stringify(data),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.YoutubeSubtitlesTool = YoutubeSubtitlesTool;
|
|
48
|
+
//# sourceMappingURL=youtube-subtitles-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube-subtitles-tool.js","sourceRoot":"","sources":["../../../src/tools/youtube-subtitles/youtube-subtitles-tool.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEpB,+CAA+D;AAC/D,kCAAqD;AAErD,MAAM,eAAe,GAAG,aAAC;KACtB,MAAM,EAAE;KACR,QAAQ,CAAC,gDAAgD,CAAC;KAC1D,QAAQ,EAAE,CAAC;AAEd,MAAa,oBAAqB,SAAQ,WAAI;IAA9C;;QACE,YAAO,GAAG,mBAAO,CAAC,YAAY,CAAC;QAE/B,sBAAiB,GAAG,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE;YACjD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,CAAC,CAAC;QAEF,aAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAwB,EAAE,EAAE;YAChE,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;gBACE,WAAW,EAAE,gCAAgC;gBAC7C,WAAW,EAAE;oBACX,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;oBACpE,aAAa,EAAE,eAAe;iBAC/B;gBACD,WAAW,EAAE;oBACX,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE,IAAI;iBACpB;aACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;gBAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,iBAAiB,GACnB,CAAC;gBAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;gBAEnF,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;yBAC3B;qBACF;iBACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CAAA;AAxCD,oDAwCC"}
|
package/build/utils.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.removeKeyFromNestedObject = void 0;
|
|
3
|
+
exports.removeKeyFromNestedObject = exports.resolveToolsets = void 0;
|
|
4
|
+
const resolveToolsets = (toolsets) => {
|
|
5
|
+
if (!(toolsets === null || toolsets === void 0 ? void 0 : toolsets.trim())) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
return toolsets
|
|
9
|
+
.split(',')
|
|
10
|
+
.map(s => s.trim())
|
|
11
|
+
.filter(Boolean);
|
|
12
|
+
};
|
|
13
|
+
exports.resolveToolsets = resolveToolsets;
|
|
4
14
|
const removeKeyFromNestedObject = ({ obj, keyToRemove, }) => {
|
|
5
15
|
if (typeof obj !== 'object' || obj === null) {
|
|
6
16
|
return obj;
|
|
@@ -8,12 +18,13 @@ const removeKeyFromNestedObject = ({ obj, keyToRemove, }) => {
|
|
|
8
18
|
if (Array.isArray(obj)) {
|
|
9
19
|
return obj.map(item => (0, exports.removeKeyFromNestedObject)({ obj: item, keyToRemove }));
|
|
10
20
|
}
|
|
21
|
+
const record = obj;
|
|
11
22
|
const newObj = {};
|
|
12
|
-
for (const key in
|
|
23
|
+
for (const key in record) {
|
|
13
24
|
if (key === keyToRemove) {
|
|
14
25
|
continue;
|
|
15
26
|
}
|
|
16
|
-
newObj[key] = (0, exports.removeKeyFromNestedObject)({ obj:
|
|
27
|
+
newObj[key] = (0, exports.removeKeyFromNestedObject)({ obj: record[key], keyToRemove });
|
|
17
28
|
}
|
|
18
29
|
return newObj;
|
|
19
30
|
};
|
package/build/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAEO,MAAM,eAAe,GAAG,CAAC,QAAiB,EAAa,EAAE;IAC9D,IAAI,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,OAAO,CAAc,CAAC;AAClC,CAAC,CAAC;AATW,QAAA,eAAe,mBAS1B;AAEK,MAAM,yBAAyB,GAAG,CAAC,EACxC,GAAG,EACH,WAAW,GAIZ,EAAU,EAAE;IACX,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA3BW,QAAA,yBAAyB,6BA2BpC"}
|
package/build/zod/zod-types.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.zodDeviceType = exports.zodCountry = exports.zodTokenLimit = exports.zodXhr = exports.zodJsRender = exports.zodLocale = exports.zodGeo = void 0;
|
|
7
7
|
const zod_1 = __importDefault(require("zod"));
|
|
8
8
|
exports.zodGeo = zod_1.default
|
|
9
9
|
.string()
|
|
@@ -14,12 +14,20 @@ exports.zodJsRender = zod_1.default
|
|
|
14
14
|
.boolean()
|
|
15
15
|
.describe('Should the request be opened in a headless browser, false by default')
|
|
16
16
|
.optional();
|
|
17
|
+
exports.zodXhr = zod_1.default
|
|
18
|
+
.boolean()
|
|
19
|
+
.describe('When true, includes XHR/fetch responses in the scrape result where supported by the target')
|
|
20
|
+
.optional();
|
|
17
21
|
exports.zodTokenLimit = zod_1.default
|
|
18
22
|
.number()
|
|
19
23
|
.describe(`The number of tokens to return in the response - anything above this limit will be truncated`)
|
|
20
24
|
.optional();
|
|
21
|
-
exports.
|
|
22
|
-
.
|
|
23
|
-
.describe(
|
|
25
|
+
exports.zodCountry = zod_1.default
|
|
26
|
+
.string()
|
|
27
|
+
.describe('Country code for the request (e.g., US, GB, DE)')
|
|
28
|
+
.optional();
|
|
29
|
+
exports.zodDeviceType = zod_1.default
|
|
30
|
+
.enum(['desktop', 'mobile', 'tablet'])
|
|
31
|
+
.describe('Device type to emulate for the request')
|
|
24
32
|
.optional();
|
|
25
33
|
//# sourceMappingURL=zod-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-types.js","sourceRoot":"","sources":["../../src/zod/zod-types.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,MAAM,GAAG,aAAC;KACpB,MAAM,EAAE;KACR,QAAQ,CAAC,iEAAiE,CAAC;KAC3E,QAAQ,EAAE,CAAC;AAED,QAAA,SAAS,GAAG,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE5E,QAAA,WAAW,GAAG,aAAC;KACzB,OAAO,EAAE;KACT,QAAQ,CAAC,sEAAsE,CAAC;KAChF,QAAQ,EAAE,CAAC;AAED,QAAA,aAAa,GAAG,aAAC;KAC3B,MAAM,EAAE;KACR,QAAQ,CACP,8FAA8F,CAC/F;KACA,QAAQ,EAAE,CAAC;AAED,QAAA,
|
|
1
|
+
{"version":3,"file":"zod-types.js","sourceRoot":"","sources":["../../src/zod/zod-types.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,MAAM,GAAG,aAAC;KACpB,MAAM,EAAE;KACR,QAAQ,CAAC,iEAAiE,CAAC;KAC3E,QAAQ,EAAE,CAAC;AAED,QAAA,SAAS,GAAG,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE5E,QAAA,WAAW,GAAG,aAAC;KACzB,OAAO,EAAE;KACT,QAAQ,CAAC,sEAAsE,CAAC;KAChF,QAAQ,EAAE,CAAC;AAED,QAAA,MAAM,GAAG,aAAC;KACpB,OAAO,EAAE;KACT,QAAQ,CACP,4FAA4F,CAC7F;KACA,QAAQ,EAAE,CAAC;AAED,QAAA,aAAa,GAAG,aAAC;KAC3B,MAAM,EAAE;KACR,QAAQ,CACP,8FAA8F,CAC/F;KACA,QAAQ,EAAE,CAAC;AAED,QAAA,UAAU,GAAG,aAAC;KACxB,MAAM,EAAE;KACR,QAAQ,CAAC,iDAAiD,CAAC;KAC3D,QAAQ,EAAE,CAAC;AAED,QAAA,aAAa,GAAG,aAAC;KAC3B,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KACrC,QAAQ,CAAC,wCAAwC,CAAC;KAClD,QAAQ,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,37 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decodo/mcp-server",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "",
|
|
3
|
+
"version": "1.1.1",
|
|
4
|
+
"description": "Decodo MCP Server",
|
|
5
5
|
"bin": {
|
|
6
6
|
"decodo-mcp": "./build/index.js"
|
|
7
7
|
},
|
|
8
8
|
"main": "index.js",
|
|
9
9
|
"mcpName": "io.github.Decodo/mcp-web-scraper",
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "tsc && chmod 755 build/
|
|
12
|
-
"dev": "
|
|
13
|
-
"
|
|
11
|
+
"build": "tsc && chmod 755 build/server.js",
|
|
12
|
+
"dev": "nodemon --watch src -e ts --exec 'tsx src/server.ts'",
|
|
13
|
+
"start": "node build/server.js",
|
|
14
|
+
"inspect": "mcp-inspector",
|
|
15
|
+
"test": "jest",
|
|
16
|
+
"lint": "eslint src/",
|
|
17
|
+
"release": "semantic-release"
|
|
14
18
|
},
|
|
15
19
|
"keywords": [],
|
|
16
20
|
"author": "",
|
|
17
21
|
"license": "ISC",
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
18
25
|
"files": [
|
|
19
26
|
"build"
|
|
20
27
|
],
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.12.3",
|
|
30
|
+
"axios": "^1.15.0",
|
|
31
|
+
"dotenv": "^16.5.0",
|
|
32
|
+
"node-html-markdown": "^1.3.0",
|
|
33
|
+
"tsx": "^4.21.0"
|
|
34
|
+
},
|
|
21
35
|
"devDependencies": {
|
|
22
|
-
"@
|
|
36
|
+
"@eslint/js": "^10.0.1",
|
|
37
|
+
"@modelcontextprotocol/inspector": "^0.21.1",
|
|
38
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
39
|
+
"@semantic-release/git": "^10.0.1",
|
|
40
|
+
"@semantic-release/github": "^12.0.6",
|
|
41
|
+
"@semantic-release/npm": "^13.1.5",
|
|
42
|
+
"@types/express": "^5.0.1",
|
|
23
43
|
"@types/jest": "^30.0.0",
|
|
24
44
|
"@types/node": "^24.0.0",
|
|
45
|
+
"eslint": "^10.2.1",
|
|
25
46
|
"jest": "^30.0.0",
|
|
26
|
-
"
|
|
47
|
+
"nodemon": "^3.1.14",
|
|
48
|
+
"semantic-release": "^25.0.3",
|
|
27
49
|
"ts-jest": "^29.4.0",
|
|
28
50
|
"typescript": "^5.8.3",
|
|
51
|
+
"typescript-eslint": "^8.58.2",
|
|
29
52
|
"zod": "^3.25.57"
|
|
30
53
|
},
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "https://github.com/Decodo/mcp-server.git"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://github.com/Decodo/mcp-server#readme",
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/Decodo/mcp-server/issues"
|
|
36
61
|
}
|
|
37
62
|
}
|
package/build/sapi-mcp-server.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ScraperAPIMCPServer = void 0;
|
|
4
|
-
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
-
const scraper_api_client_1 = require("./clients/scraper-api-client");
|
|
6
|
-
const tools_1 = require("./tools");
|
|
7
|
-
class ScraperAPIMCPServer {
|
|
8
|
-
constructor({ sapiUsername, sapiPassword }) {
|
|
9
|
-
this.server = new mcp_js_1.McpServer({
|
|
10
|
-
name: 'decodo',
|
|
11
|
-
version: '0.1.0',
|
|
12
|
-
capabilities: {
|
|
13
|
-
logging: {},
|
|
14
|
-
resources: {},
|
|
15
|
-
tools: {},
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
const auth = Buffer.from(`${sapiUsername}:${sapiPassword}`).toString('base64');
|
|
19
|
-
this.sapiClient = new scraper_api_client_1.ScraperApiClient({ auth });
|
|
20
|
-
this.registerTools();
|
|
21
|
-
this.registerResources();
|
|
22
|
-
}
|
|
23
|
-
connect(transport) {
|
|
24
|
-
this.server.connect(transport);
|
|
25
|
-
}
|
|
26
|
-
registerTools() {
|
|
27
|
-
// scrape
|
|
28
|
-
tools_1.ScrapeAsMarkdownTool.register({ server: this.server, sapiClient: this.sapiClient });
|
|
29
|
-
// targets
|
|
30
|
-
tools_1.GoogleSearchParsedTool.register({ server: this.server, sapiClient: this.sapiClient });
|
|
31
|
-
tools_1.AmazonSearchParsedTool.register({ server: this.server, sapiClient: this.sapiClient });
|
|
32
|
-
tools_1.RedditPostTool.register({ server: this.server, sapiClient: this.sapiClient });
|
|
33
|
-
tools_1.RedditSubredditTool.register({ server: this.server, sapiClient: this.sapiClient });
|
|
34
|
-
}
|
|
35
|
-
registerResources() {
|
|
36
|
-
// todo: expose info about all targets available
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.ScraperAPIMCPServer = ScraperAPIMCPServer;
|
|
40
|
-
//# sourceMappingURL=sapi-mcp-server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sapi-mcp-server.js","sourceRoot":"","sources":["../src/sapi-mcp-server.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AAEpE,qEAAgE;AAChE,mCAMiB;AAEjB,MAAa,mBAAmB;IAK9B,YAAY,EAAE,YAAY,EAAE,YAAY,EAAkD;QACxF,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAS,CAAC;YAC1B,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE;gBACZ,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE/E,IAAI,CAAC,UAAU,GAAG,IAAI,qCAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,SAA+B;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,aAAa;QACX,SAAS;QACT,4BAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEpF,UAAU;QACV,8BAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,8BAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,sBAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9E,2BAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,iBAAiB;QACf,gDAAgD;IAClD,CAAC;CACF;AA1CD,kDA0CC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
var _a;
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.AmazonSearchParsedTool = void 0;
|
|
8
|
-
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const constants_1 = require("../constants");
|
|
10
|
-
const utils_1 = require("../utils");
|
|
11
|
-
const zod_types_1 = require("../zod/zod-types");
|
|
12
|
-
class AmazonSearchParsedTool {
|
|
13
|
-
}
|
|
14
|
-
exports.AmazonSearchParsedTool = AmazonSearchParsedTool;
|
|
15
|
-
_a = AmazonSearchParsedTool;
|
|
16
|
-
AmazonSearchParsedTool.FIELDS_WITH_HIGH_CHAR_COUNT = ['suggested', 'amazons_choices', 'refinements'];
|
|
17
|
-
AmazonSearchParsedTool.transformAutoParsedResponse = ({ obj }) => {
|
|
18
|
-
for (const fieldToRemove of _a.FIELDS_WITH_HIGH_CHAR_COUNT) {
|
|
19
|
-
obj = (0, utils_1.removeKeyFromNestedObject)({ obj, keyToRemove: fieldToRemove });
|
|
20
|
-
}
|
|
21
|
-
const text = JSON.stringify(obj);
|
|
22
|
-
return text;
|
|
23
|
-
};
|
|
24
|
-
AmazonSearchParsedTool.register = ({ server, sapiClient, }) => {
|
|
25
|
-
server.registerTool('amazon_search_parsed', {
|
|
26
|
-
description: 'Scrape Amazon Search results with automatic parsing',
|
|
27
|
-
inputSchema: {
|
|
28
|
-
query: zod_1.default.string().describe('Search query'),
|
|
29
|
-
geo: zod_types_1.zodGeo,
|
|
30
|
-
jsRender: zod_types_1.zodJsRender,
|
|
31
|
-
},
|
|
32
|
-
}, async (scrapingParams) => {
|
|
33
|
-
const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.AMAZON_SEARCH, parse: true });
|
|
34
|
-
const { data } = await sapiClient.scrape({ scrapingParams: params });
|
|
35
|
-
const text = _a.transformAutoParsedResponse({ obj: data });
|
|
36
|
-
return {
|
|
37
|
-
content: [
|
|
38
|
-
{
|
|
39
|
-
type: 'text',
|
|
40
|
-
text,
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
};
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
//# sourceMappingURL=amazon-search-parsed-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amazon-search-parsed-tool.js","sourceRoot":"","sources":["../../src/tools/amazon-search-parsed-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AACnD,oCAAqD;AACrD,gDAAkE;AAElE,MAAa,sBAAsB;;AAAnC,wDAoDC;;AAnDQ,kDAA2B,GAAG,CAAC,WAAW,EAAE,iBAAiB,EAAE,aAAa,CAAC,AAAlD,CAAmD;AAE9E,kDAA2B,GAAG,CAAC,EAAE,GAAG,EAAmB,EAAU,EAAE;IACxE,KAAK,MAAM,aAAa,IAAI,EAAsB,CAAC,2BAA2B,EAAE,CAAC;QAC/E,GAAG,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC,AARiC,CAQhC;AAEK,+BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC1C,GAAG,EAAE,kBAAM;YACX,QAAQ,EAAE,uBAAW;SACtB;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,aAAa,EACzC,KAAK,EAAE,IAAI,GACe,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,EAAI,CAAC,2BAA2B,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAtCc,CAsCb"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
var _a;
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.GoogleSearchParsedTool = void 0;
|
|
8
|
-
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const constants_1 = require("../constants");
|
|
10
|
-
const utils_1 = require("../utils");
|
|
11
|
-
const zod_types_1 = require("../zod/zod-types");
|
|
12
|
-
class GoogleSearchParsedTool {
|
|
13
|
-
}
|
|
14
|
-
exports.GoogleSearchParsedTool = GoogleSearchParsedTool;
|
|
15
|
-
_a = GoogleSearchParsedTool;
|
|
16
|
-
GoogleSearchParsedTool.FIELDS_WITH_HIGH_CHAR_COUNT = [
|
|
17
|
-
'images',
|
|
18
|
-
'image_data',
|
|
19
|
-
'related_searches_urls',
|
|
20
|
-
'factoids',
|
|
21
|
-
'people_also_buy_from',
|
|
22
|
-
'what_people_are_saying',
|
|
23
|
-
];
|
|
24
|
-
GoogleSearchParsedTool.transformAutoParsedResponse = ({ obj }) => {
|
|
25
|
-
for (const fieldToRemove of _a.FIELDS_WITH_HIGH_CHAR_COUNT) {
|
|
26
|
-
obj = (0, utils_1.removeKeyFromNestedObject)({ obj, keyToRemove: fieldToRemove });
|
|
27
|
-
}
|
|
28
|
-
const text = JSON.stringify(obj);
|
|
29
|
-
return text;
|
|
30
|
-
};
|
|
31
|
-
GoogleSearchParsedTool.register = ({ server, sapiClient, }) => {
|
|
32
|
-
server.registerTool('google_search_parsed', {
|
|
33
|
-
description: 'Scrape Google Search results with automatic parsing',
|
|
34
|
-
inputSchema: {
|
|
35
|
-
query: zod_1.default.string().describe('Search query'),
|
|
36
|
-
geo: zod_types_1.zodGeo,
|
|
37
|
-
locale: zod_types_1.zodLocale,
|
|
38
|
-
jsRender: zod_types_1.zodJsRender,
|
|
39
|
-
},
|
|
40
|
-
}, async (scrapingParams) => {
|
|
41
|
-
const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.GOOGLE_SEARCH, parse: true });
|
|
42
|
-
const { data } = await sapiClient.scrape({ scrapingParams: params });
|
|
43
|
-
const text = _a.transformAutoParsedResponse({ obj: data });
|
|
44
|
-
return {
|
|
45
|
-
content: [
|
|
46
|
-
{
|
|
47
|
-
type: 'text',
|
|
48
|
-
text,
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
};
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=google-search-parsed-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-search-parsed-tool.js","sourceRoot":"","sources":["../../src/tools/google-search-parsed-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AACnD,oCAAqD;AACrD,gDAAkE;AAElE,MAAa,sBAAsB;;AAAnC,wDA4DC;;AA3DQ,kDAA2B,GAAG;IACnC,QAAQ;IACR,YAAY;IACZ,uBAAuB;IACvB,UAAU;IACV,sBAAsB;IACtB,wBAAwB;CACzB,AAPiC,CAOhC;AAEK,kDAA2B,GAAG,CAAC,EAAE,GAAG,EAAmB,EAAU,EAAE;IACxE,KAAK,MAAM,aAAa,IAAI,EAAsB,CAAC,2BAA2B,EAAE,CAAC;QAC/E,GAAG,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC,AARiC,CAQhC;AAEK,+BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC1C,GAAG,EAAE,kBAAM;YACX,MAAM,EAAE,qBAAS;YACjB,QAAQ,EAAE,uBAAW;SACtB;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,aAAa,EACzC,KAAK,EAAE,IAAI,GACe,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,EAAI,CAAC,2BAA2B,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAvCc,CAuCb"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
var _a;
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.RedditPostTool = void 0;
|
|
8
|
-
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const constants_1 = require("../constants");
|
|
10
|
-
class RedditPostTool {
|
|
11
|
-
}
|
|
12
|
-
exports.RedditPostTool = RedditPostTool;
|
|
13
|
-
_a = RedditPostTool;
|
|
14
|
-
RedditPostTool.register = ({ server, sapiClient, }) => {
|
|
15
|
-
server.registerTool('reddit_post', {
|
|
16
|
-
description: 'Scrape a specific Reddit post',
|
|
17
|
-
inputSchema: {
|
|
18
|
-
url: zod_1.default.string().describe('reddit post URL'),
|
|
19
|
-
},
|
|
20
|
-
}, async (scrapingParams) => {
|
|
21
|
-
const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.REDDIT_POST });
|
|
22
|
-
const { data } = await sapiClient.scrape({ scrapingParams: params });
|
|
23
|
-
const text = JSON.stringify(data, null, 2);
|
|
24
|
-
return {
|
|
25
|
-
content: [
|
|
26
|
-
{
|
|
27
|
-
type: 'text',
|
|
28
|
-
text,
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=reddit-post-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reddit-post-tool.js","sourceRoot":"","sources":["../../src/tools/reddit-post-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AAEnD,MAAa,cAAc;;AAA3B,wCAqCC;;AApCQ,uBAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE;YACX,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SAC5C;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,WAAW,GACb,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAnCc,CAmCb"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
var _a;
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.RedditSubredditTool = void 0;
|
|
8
|
-
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const constants_1 = require("../constants");
|
|
10
|
-
class RedditSubredditTool {
|
|
11
|
-
}
|
|
12
|
-
exports.RedditSubredditTool = RedditSubredditTool;
|
|
13
|
-
_a = RedditSubredditTool;
|
|
14
|
-
RedditSubredditTool.register = ({ server, sapiClient, }) => {
|
|
15
|
-
server.registerTool('reddit_subreddit', {
|
|
16
|
-
description: 'Scrape Reddit subreddit results with automatic parsing',
|
|
17
|
-
inputSchema: {
|
|
18
|
-
url: zod_1.default.string().describe('URL to subreddit'),
|
|
19
|
-
},
|
|
20
|
-
}, async (scrapingParams) => {
|
|
21
|
-
const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.REDDIT_SUBREDDIT });
|
|
22
|
-
const { data } = await sapiClient.scrape({ scrapingParams: params });
|
|
23
|
-
const text = JSON.stringify(data, null, 2);
|
|
24
|
-
return {
|
|
25
|
-
content: [
|
|
26
|
-
{
|
|
27
|
-
type: 'text',
|
|
28
|
-
text,
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=reddit-subreddit-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reddit-subreddit-tool.js","sourceRoot":"","sources":["../../src/tools/reddit-subreddit-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AAEnD,MAAa,mBAAmB;;AAAhC,kDAqCC;;AApCQ,4BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACX,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SAC7C;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,gBAAgB,GAClB,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAnCc,CAmCb"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
var _a;
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ScrapeAsMarkdownTool = void 0;
|
|
8
|
-
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const node_html_markdown_1 = require("node-html-markdown");
|
|
10
|
-
const zod_types_1 = require("../zod/zod-types");
|
|
11
|
-
class ScrapeAsMarkdownTool {
|
|
12
|
-
}
|
|
13
|
-
exports.ScrapeAsMarkdownTool = ScrapeAsMarkdownTool;
|
|
14
|
-
_a = ScrapeAsMarkdownTool;
|
|
15
|
-
ScrapeAsMarkdownTool.LARGE_CONTENT_SYMBOL_COUNT = 10000;
|
|
16
|
-
ScrapeAsMarkdownTool.isResponseOverLimit = (content) => {
|
|
17
|
-
return content.length > _a.LARGE_CONTENT_SYMBOL_COUNT;
|
|
18
|
-
};
|
|
19
|
-
ScrapeAsMarkdownTool.shouldTruncateResponse = ({ content, shouldShowFullResponse, }) => {
|
|
20
|
-
if (shouldShowFullResponse) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
return _a.isResponseOverLimit(content);
|
|
24
|
-
};
|
|
25
|
-
ScrapeAsMarkdownTool.truncateResponse = ({ content, limit }) => {
|
|
26
|
-
return content.substring(0, limit);
|
|
27
|
-
};
|
|
28
|
-
ScrapeAsMarkdownTool.transformResponse = ({ html, tokenLimit, shouldShowFullResponse, }) => {
|
|
29
|
-
const markdown = node_html_markdown_1.NodeHtmlMarkdown.translate(html, {});
|
|
30
|
-
if (_a.shouldTruncateResponse({ content: markdown, shouldShowFullResponse })) {
|
|
31
|
-
const truncated = _a.truncateResponse({
|
|
32
|
-
content: markdown,
|
|
33
|
-
limit: tokenLimit || _a.LARGE_CONTENT_SYMBOL_COUNT,
|
|
34
|
-
});
|
|
35
|
-
return { markdown: truncated, isTruncated: true };
|
|
36
|
-
}
|
|
37
|
-
return { markdown, isTruncated: false };
|
|
38
|
-
};
|
|
39
|
-
ScrapeAsMarkdownTool.register = ({ server, sapiClient, }) => {
|
|
40
|
-
server.tool('scrape_as_markdown', 'Scrape the contents of a website and return Markdown-formatted results', {
|
|
41
|
-
url: zod_1.default.string().describe('URL to scrape'),
|
|
42
|
-
geo: zod_types_1.zodGeo,
|
|
43
|
-
locale: zod_types_1.zodLocale,
|
|
44
|
-
jsRender: zod_types_1.zodJsRender,
|
|
45
|
-
tokenLimit: zod_types_1.zodTokenLimit,
|
|
46
|
-
fullResponse: zod_types_1.zodFullResponse,
|
|
47
|
-
}, async (scrapingParams) => {
|
|
48
|
-
const { data } = await sapiClient.scrape({ scrapingParams });
|
|
49
|
-
const { markdown, isTruncated } = _a.transformResponse({
|
|
50
|
-
html: data,
|
|
51
|
-
tokenLimit: scrapingParams.tokenLimit,
|
|
52
|
-
shouldShowFullResponse: scrapingParams.fullResponse,
|
|
53
|
-
});
|
|
54
|
-
return {
|
|
55
|
-
content: [
|
|
56
|
-
{
|
|
57
|
-
type: 'text',
|
|
58
|
-
text: isTruncated
|
|
59
|
-
? `The website content is over ${_a.LARGE_CONTENT_SYMBOL_COUNT} symbols, therefore, the content has been truncated. If you wish to obtain the full response, just say "full response". Alternatively, you say a specific token limit in the prompt.`
|
|
60
|
-
: 'Full website content retrieved.',
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
type: 'text',
|
|
64
|
-
text: markdown,
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=scrape-as-markdown-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scrape-as-markdown-tool.js","sourceRoot":"","sources":["../../src/tools/scrape-as-markdown-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,2DAAsD;AACtD,gDAAkG;AAElG,MAAa,oBAAoB;;AAAjC,oDA4FC;;AA3FQ,+CAA0B,GAAG,KAAM,AAAT,CAAU;AAEpC,wCAAmB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC/C,OAAO,OAAO,CAAC,MAAM,GAAG,EAAI,CAAC,0BAA0B,CAAC;AAC1D,CAAC,AAFyB,CAExB;AAEK,2CAAsB,GAAG,CAAC,EAC/B,OAAO,EACP,sBAAsB,GAIvB,EAAE,EAAE;IACH,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC,AAZ4B,CAY3B;AAEK,qCAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAsC,EAAE,EAAE;IACnF,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,AAFsB,CAErB;AAEK,sCAAiB,GAAG,CAAC,EAC1B,IAAI,EACJ,UAAU,EACV,sBAAsB,GAKvB,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,qCAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,EAAI,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,SAAS,GAAG,EAAI,CAAC,gBAAgB,CAAC;YACtC,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,UAAU,IAAI,EAAI,CAAC,0BAA0B;SACrD,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC,AArBuB,CAqBtB;AAEK,6BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,wEAAwE,EACxE;QACE,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,GAAG,EAAE,kBAAM;QACX,MAAM,EAAE,qBAAS;QACjB,QAAQ,EAAE,uBAAW;QACrB,UAAU,EAAE,yBAAa;QACzB,YAAY,EAAE,2BAAe;KAC9B,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAE7D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAI,CAAC,iBAAiB,CAAC;YACvD,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,sBAAsB,EAAE,cAAc,CAAC,YAAY;SACpD,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW;wBACf,CAAC,CAAC,+BAA+B,EAAI,CAAC,0BAA0B,sLAAsL;wBACtP,CAAC,CAAC,iCAAiC;iBACtC;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AA3Cc,CA2Cb"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
var _a;
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ScrapeTool = void 0;
|
|
8
|
-
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const node_html_markdown_1 = require("node-html-markdown");
|
|
10
|
-
const zod_types_1 = require("../zod/zod-types");
|
|
11
|
-
class ScrapeTool {
|
|
12
|
-
}
|
|
13
|
-
exports.ScrapeTool = ScrapeTool;
|
|
14
|
-
_a = ScrapeTool;
|
|
15
|
-
ScrapeTool.LARGE_CONTENT_SYMBOL_COUNT = 10000;
|
|
16
|
-
ScrapeTool.isResponseOverLimit = (content) => {
|
|
17
|
-
return content.length > _a.LARGE_CONTENT_SYMBOL_COUNT;
|
|
18
|
-
};
|
|
19
|
-
ScrapeTool.shouldTruncateResponse = ({ content, shouldShowFullResponse, }) => {
|
|
20
|
-
if (shouldShowFullResponse) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
return _a.isResponseOverLimit(content);
|
|
24
|
-
};
|
|
25
|
-
ScrapeTool.truncateResponse = ({ content, limit }) => {
|
|
26
|
-
return content.substring(0, limit);
|
|
27
|
-
};
|
|
28
|
-
ScrapeTool.transformResponse = ({ html, tokenLimit, shouldShowFullResponse, }) => {
|
|
29
|
-
const markdown = node_html_markdown_1.NodeHtmlMarkdown.translate(html, {});
|
|
30
|
-
if (_a.shouldTruncateResponse({ content: markdown, shouldShowFullResponse })) {
|
|
31
|
-
const truncated = _a.truncateResponse({
|
|
32
|
-
content: markdown,
|
|
33
|
-
limit: tokenLimit || _a.LARGE_CONTENT_SYMBOL_COUNT,
|
|
34
|
-
});
|
|
35
|
-
return { markdown: truncated, isTruncated: true };
|
|
36
|
-
}
|
|
37
|
-
return { markdown, isTruncated: false };
|
|
38
|
-
};
|
|
39
|
-
ScrapeTool.register = ({ server, sapiClient, }) => {
|
|
40
|
-
server.tool('scrape', 'Scrape the contents of a website', {
|
|
41
|
-
url: zod_1.default.string().describe('URL to scrape'),
|
|
42
|
-
geo: zod_types_1.zodGeo,
|
|
43
|
-
locale: zod_types_1.zodLocale,
|
|
44
|
-
jsRender: zod_types_1.zodJsRender,
|
|
45
|
-
tokenLimit: zod_types_1.zodTokenLimit,
|
|
46
|
-
fullResponse: zod_types_1.zodFullResponse,
|
|
47
|
-
}, async (scrapingParams) => {
|
|
48
|
-
const { data } = await sapiClient.scrape({ scrapingParams });
|
|
49
|
-
const { markdown, isTruncated } = _a.transformResponse({
|
|
50
|
-
html: data,
|
|
51
|
-
tokenLimit: scrapingParams.tokenLimit,
|
|
52
|
-
shouldShowFullResponse: scrapingParams.fullResponse,
|
|
53
|
-
});
|
|
54
|
-
return {
|
|
55
|
-
content: [
|
|
56
|
-
{
|
|
57
|
-
type: 'text',
|
|
58
|
-
text: isTruncated
|
|
59
|
-
? `The website content is over ${_a.LARGE_CONTENT_SYMBOL_COUNT} symbols, therefore, I have truncated the content. If you wish to obtain the full response, just say "full response". Alternatively, you can tell me a specific token limit.`
|
|
60
|
-
: 'Full website content retrieved.',
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
type: 'text',
|
|
64
|
-
text: markdown,
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=scrape-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scrape-tool.js","sourceRoot":"","sources":["../../src/tools/scrape-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,2DAAsD;AACtD,gDAAkG;AAElG,MAAa,UAAU;;AAAvB,gCA4FC;;AA3FQ,qCAA0B,GAAG,KAAM,AAAT,CAAU;AAEpC,8BAAmB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC/C,OAAO,OAAO,CAAC,MAAM,GAAG,EAAI,CAAC,0BAA0B,CAAC;AAC1D,CAAC,AAFyB,CAExB;AAEK,iCAAsB,GAAG,CAAC,EAC/B,OAAO,EACP,sBAAsB,GAIvB,EAAE,EAAE;IACH,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC,AAZ4B,CAY3B;AAEK,2BAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAsC,EAAE,EAAE;IACnF,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,AAFsB,CAErB;AAEK,4BAAiB,GAAG,CAAC,EAC1B,IAAI,EACJ,UAAU,EACV,sBAAsB,GAKvB,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,qCAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,EAAI,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,SAAS,GAAG,EAAI,CAAC,gBAAgB,CAAC;YACtC,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,UAAU,IAAI,EAAI,CAAC,0BAA0B;SACrD,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC,AArBuB,CAqBtB;AAEK,mBAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,kCAAkC,EAClC;QACE,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,GAAG,EAAE,kBAAM;QACX,MAAM,EAAE,qBAAS;QACjB,QAAQ,EAAE,uBAAW;QACrB,UAAU,EAAE,yBAAa;QACzB,YAAY,EAAE,2BAAe;KAC9B,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAE7D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAI,CAAC,iBAAiB,CAAC;YACvD,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,sBAAsB,EAAE,cAAc,CAAC,YAAY;SACpD,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW;wBACf,CAAC,CAAC,+BAA+B,EAAI,CAAC,0BAA0B,8KAA8K;wBAC9O,CAAC,CAAC,iCAAiC;iBACtC;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AA3Cc,CA2Cb"}
|