@mapbox/mcp-docs-server 0.2.1 → 0.3.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/dist/commonjs/index.js +3 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.d.ts +6 -2
- package/dist/commonjs/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.d.ts.map +1 -1
- package/dist/commonjs/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.js +12 -23
- package/dist/commonjs/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.js.map +1 -1
- package/dist/commonjs/resources/mapbox-examples-resource/MapboxExamplesResource.d.ts +4 -2
- package/dist/commonjs/resources/mapbox-examples-resource/MapboxExamplesResource.d.ts.map +1 -1
- package/dist/commonjs/resources/mapbox-examples-resource/MapboxExamplesResource.js +9 -18
- package/dist/commonjs/resources/mapbox-examples-resource/MapboxExamplesResource.js.map +1 -1
- package/dist/commonjs/resources/mapbox-guides-resource/MapboxGuidesResource.d.ts +5 -2
- package/dist/commonjs/resources/mapbox-guides-resource/MapboxGuidesResource.d.ts.map +1 -1
- package/dist/commonjs/resources/mapbox-guides-resource/MapboxGuidesResource.js +10 -23
- package/dist/commonjs/resources/mapbox-guides-resource/MapboxGuidesResource.js.map +1 -1
- package/dist/commonjs/resources/mapbox-reference-resource/MapboxReferenceResource.d.ts +6 -2
- package/dist/commonjs/resources/mapbox-reference-resource/MapboxReferenceResource.d.ts.map +1 -1
- package/dist/commonjs/resources/mapbox-reference-resource/MapboxReferenceResource.js +13 -23
- package/dist/commonjs/resources/mapbox-reference-resource/MapboxReferenceResource.js.map +1 -1
- package/dist/commonjs/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.d.ts +6 -2
- package/dist/commonjs/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.d.ts.map +1 -1
- package/dist/commonjs/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.js +13 -23
- package/dist/commonjs/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.js.map +1 -1
- package/dist/commonjs/tools/BaseTool.d.ts.map +1 -1
- package/dist/commonjs/tools/BaseTool.js +18 -10
- package/dist/commonjs/tools/BaseTool.js.map +1 -1
- package/dist/commonjs/tools/batch-get-documents-tool/BatchGetDocumentsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/batch-get-documents-tool/BatchGetDocumentsTool.js +31 -2
- package/dist/commonjs/tools/batch-get-documents-tool/BatchGetDocumentsTool.js.map +1 -1
- package/dist/commonjs/tools/get-document-tool/GetDocumentTool.d.ts.map +1 -1
- package/dist/commonjs/tools/get-document-tool/GetDocumentTool.js +30 -2
- package/dist/commonjs/tools/get-document-tool/GetDocumentTool.js.map +1 -1
- package/dist/commonjs/tools/search-docs-tool/SearchDocsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/search-docs-tool/SearchDocsTool.js +22 -62
- package/dist/commonjs/tools/search-docs-tool/SearchDocsTool.js.map +1 -1
- package/dist/commonjs/utils/docCache.d.ts.map +1 -1
- package/dist/commonjs/utils/docCache.js +7 -2
- package/dist/commonjs/utils/docCache.js.map +1 -1
- package/dist/commonjs/utils/docFetcher.d.ts +10 -1
- package/dist/commonjs/utils/docFetcher.d.ts.map +1 -1
- package/dist/commonjs/utils/docFetcher.js +29 -4
- package/dist/commonjs/utils/docFetcher.js.map +1 -1
- package/dist/commonjs/utils/docsSearchIndex.d.ts +25 -0
- package/dist/commonjs/utils/docsSearchIndex.d.ts.map +1 -0
- package/dist/commonjs/utils/docsSearchIndex.js +146 -0
- package/dist/commonjs/utils/docsSearchIndex.js.map +1 -0
- package/dist/commonjs/utils/index.d.ts +1 -0
- package/dist/commonjs/utils/index.d.ts.map +1 -1
- package/dist/commonjs/utils/index.js +7 -1
- package/dist/commonjs/utils/index.js.map +1 -1
- package/dist/commonjs/utils/tracing.d.ts +18 -0
- package/dist/commonjs/utils/tracing.d.ts.map +1 -0
- package/dist/commonjs/utils/tracing.js +142 -0
- package/dist/commonjs/utils/tracing.js.map +1 -0
- package/dist/commonjs/version.json +3 -3
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.d.ts +6 -2
- package/dist/esm/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.d.ts.map +1 -1
- package/dist/esm/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.js +12 -23
- package/dist/esm/resources/mapbox-api-reference-resource/MapboxApiReferenceResource.js.map +1 -1
- package/dist/esm/resources/mapbox-examples-resource/MapboxExamplesResource.d.ts +4 -2
- package/dist/esm/resources/mapbox-examples-resource/MapboxExamplesResource.d.ts.map +1 -1
- package/dist/esm/resources/mapbox-examples-resource/MapboxExamplesResource.js +9 -18
- package/dist/esm/resources/mapbox-examples-resource/MapboxExamplesResource.js.map +1 -1
- package/dist/esm/resources/mapbox-guides-resource/MapboxGuidesResource.d.ts +5 -2
- package/dist/esm/resources/mapbox-guides-resource/MapboxGuidesResource.d.ts.map +1 -1
- package/dist/esm/resources/mapbox-guides-resource/MapboxGuidesResource.js +10 -23
- package/dist/esm/resources/mapbox-guides-resource/MapboxGuidesResource.js.map +1 -1
- package/dist/esm/resources/mapbox-reference-resource/MapboxReferenceResource.d.ts +6 -2
- package/dist/esm/resources/mapbox-reference-resource/MapboxReferenceResource.d.ts.map +1 -1
- package/dist/esm/resources/mapbox-reference-resource/MapboxReferenceResource.js +13 -23
- package/dist/esm/resources/mapbox-reference-resource/MapboxReferenceResource.js.map +1 -1
- package/dist/esm/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.d.ts +6 -2
- package/dist/esm/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.d.ts.map +1 -1
- package/dist/esm/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.js +13 -23
- package/dist/esm/resources/mapbox-sdk-docs-resource/MapboxSdkDocsResource.js.map +1 -1
- package/dist/esm/tools/BaseTool.d.ts.map +1 -1
- package/dist/esm/tools/BaseTool.js +18 -10
- package/dist/esm/tools/BaseTool.js.map +1 -1
- package/dist/esm/tools/batch-get-documents-tool/BatchGetDocumentsTool.d.ts.map +1 -1
- package/dist/esm/tools/batch-get-documents-tool/BatchGetDocumentsTool.js +31 -2
- package/dist/esm/tools/batch-get-documents-tool/BatchGetDocumentsTool.js.map +1 -1
- package/dist/esm/tools/get-document-tool/GetDocumentTool.d.ts.map +1 -1
- package/dist/esm/tools/get-document-tool/GetDocumentTool.js +30 -2
- package/dist/esm/tools/get-document-tool/GetDocumentTool.js.map +1 -1
- package/dist/esm/tools/search-docs-tool/SearchDocsTool.d.ts.map +1 -1
- package/dist/esm/tools/search-docs-tool/SearchDocsTool.js +22 -62
- package/dist/esm/tools/search-docs-tool/SearchDocsTool.js.map +1 -1
- package/dist/esm/utils/docCache.d.ts.map +1 -1
- package/dist/esm/utils/docCache.js +7 -2
- package/dist/esm/utils/docCache.js.map +1 -1
- package/dist/esm/utils/docFetcher.d.ts +10 -1
- package/dist/esm/utils/docFetcher.d.ts.map +1 -1
- package/dist/esm/utils/docFetcher.js +29 -5
- package/dist/esm/utils/docFetcher.js.map +1 -1
- package/dist/esm/utils/docsSearchIndex.d.ts +25 -0
- package/dist/esm/utils/docsSearchIndex.d.ts.map +1 -0
- package/dist/esm/utils/docsSearchIndex.js +142 -0
- package/dist/esm/utils/docsSearchIndex.js.map +1 -0
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/tracing.d.ts +18 -0
- package/dist/esm/utils/tracing.d.ts.map +1 -0
- package/dist/esm/utils/tracing.js +135 -0
- package/dist/esm/utils/tracing.js.map +1 -0
- package/dist/esm/version.json +3 -3
- package/package.json +16 -9
|
@@ -7,10 +7,27 @@ const docCache_js_1 = require("../../utils/docCache.js");
|
|
|
7
7
|
const docFetcher_js_1 = require("../../utils/docFetcher.js");
|
|
8
8
|
const BaseTool_js_1 = require("../BaseTool.js");
|
|
9
9
|
const BatchGetDocumentsTool_input_schema_js_1 = require("./BatchGetDocumentsTool.input.schema.js");
|
|
10
|
+
// Explicit allowlist of hostnames this docs tool is permitted to fetch.
|
|
11
|
+
// api.mapbox.com is intentionally excluded — it is a live API that requires
|
|
12
|
+
// auth tokens, not a documentation host. Allowing it would let callers poison
|
|
13
|
+
// the shared cache with token-authorized private responses under no-token keys.
|
|
14
|
+
const ALLOWED_DOC_HOSTNAMES = new Set([
|
|
15
|
+
'docs.mapbox.com',
|
|
16
|
+
'mapbox.com',
|
|
17
|
+
'docs.tilestream.net'
|
|
18
|
+
]);
|
|
10
19
|
function isMapboxUrl(url) {
|
|
11
20
|
try {
|
|
12
21
|
const { hostname } = new URL(url);
|
|
13
|
-
return
|
|
22
|
+
return ALLOWED_DOC_HOSTNAMES.has(hostname);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function hasAccessToken(url) {
|
|
29
|
+
try {
|
|
30
|
+
return new URL(url).searchParams.has('access_token');
|
|
14
31
|
}
|
|
15
32
|
catch {
|
|
16
33
|
return false;
|
|
@@ -38,7 +55,19 @@ class BatchGetDocumentsTool extends BaseTool_js_1.BaseTool {
|
|
|
38
55
|
content: [
|
|
39
56
|
{
|
|
40
57
|
type: 'text',
|
|
41
|
-
text: `Invalid URLs: only mapbox.com URLs are supported. Invalid: ${invalidUrls.join(', ')}`
|
|
58
|
+
text: `Invalid URLs: only mapbox.com documentation URLs are supported. Invalid: ${invalidUrls.join(', ')}`
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
isError: true
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const tokenUrls = input.urls.filter(hasAccessToken);
|
|
65
|
+
if (tokenUrls.length > 0) {
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: `Invalid URLs: URLs must not contain access_token. Invalid: ${tokenUrls.join(', ')}`
|
|
42
71
|
}
|
|
43
72
|
],
|
|
44
73
|
isError: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchGetDocumentsTool.js","sourceRoot":"","sources":["../../../../src/tools/batch-get-documents-tool/BatchGetDocumentsTool.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AAGlC,yDAAsE;AACtE,6DAA4D;AAE5D,gDAA0C;AAC1C,mGAGiD;AAEjD,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,QAAQ,KAAK,
|
|
1
|
+
{"version":3,"file":"BatchGetDocumentsTool.js","sourceRoot":"","sources":["../../../../src/tools/batch-get-documents-tool/BatchGetDocumentsTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDocumentTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/get-document-tool/GetDocumentTool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"GetDocumentTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/get-document-tool/GetDocumentTool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AA6B3C,qBAAa,eAAgB,SAAQ,QAAQ,CAAC,OAAO,iBAAiB,CAAC;IACrE,IAAI,SAAuB;IAC3B,WAAW,SAC8P;IACzQ,QAAQ,CAAC,WAAW;;;;;;MAMlB;IAEF,OAAO,CAAC,WAAW,CAAc;gBAErB,MAAM,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE;cAKhC,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CA8C1E"}
|
|
@@ -7,10 +7,27 @@ const docCache_js_1 = require("../../utils/docCache.js");
|
|
|
7
7
|
const docFetcher_js_1 = require("../../utils/docFetcher.js");
|
|
8
8
|
const BaseTool_js_1 = require("../BaseTool.js");
|
|
9
9
|
const GetDocumentTool_input_schema_js_1 = require("./GetDocumentTool.input.schema.js");
|
|
10
|
+
// Explicit allowlist of hostnames this docs tool is permitted to fetch.
|
|
11
|
+
// api.mapbox.com is intentionally excluded — it is a live API that requires
|
|
12
|
+
// auth tokens, not a documentation host. Allowing it would let callers poison
|
|
13
|
+
// the shared cache with token-authorized private responses under no-token keys.
|
|
14
|
+
const ALLOWED_DOC_HOSTNAMES = new Set([
|
|
15
|
+
'docs.mapbox.com',
|
|
16
|
+
'mapbox.com',
|
|
17
|
+
'docs.tilestream.net'
|
|
18
|
+
]);
|
|
10
19
|
function isMapboxUrl(url) {
|
|
11
20
|
try {
|
|
12
21
|
const { hostname } = new URL(url);
|
|
13
|
-
return
|
|
22
|
+
return ALLOWED_DOC_HOSTNAMES.has(hostname);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function hasAccessToken(url) {
|
|
29
|
+
try {
|
|
30
|
+
return new URL(url).searchParams.has('access_token');
|
|
14
31
|
}
|
|
15
32
|
catch {
|
|
16
33
|
return false;
|
|
@@ -37,7 +54,18 @@ class GetDocumentTool extends BaseTool_js_1.BaseTool {
|
|
|
37
54
|
content: [
|
|
38
55
|
{
|
|
39
56
|
type: 'text',
|
|
40
|
-
text: `Invalid URL: only mapbox.com URLs are supported. Received: ${input.url}`
|
|
57
|
+
text: `Invalid URL: only mapbox.com documentation URLs are supported. Received: ${input.url}`
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
isError: true
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (hasAccessToken(input.url)) {
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text: `Invalid URL: URLs must not contain access_token. Received: ${input.url}`
|
|
41
69
|
}
|
|
42
70
|
],
|
|
43
71
|
isError: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDocumentTool.js","sourceRoot":"","sources":["../../../../src/tools/get-document-tool/GetDocumentTool.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AAGlC,yDAAmD;AACnD,6DAA4D;AAE5D,gDAA0C;AAC1C,uFAG2C;AAE3C,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,QAAQ,KAAK,
|
|
1
|
+
{"version":3,"file":"GetDocumentTool.js","sourceRoot":"","sources":["../../../../src/tools/get-document-tool/GetDocumentTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchDocsTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/search-docs-tool/SearchDocsTool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,eAAe,EAChB,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchDocsTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/search-docs-tool/SearchDocsTool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAsB1C,qBAAa,cAAe,SAAQ,QAAQ,CAAC,OAAO,gBAAgB,CAAC;IACnE,IAAI,SAA6B;IACjC,WAAW,SAK2D;IACtE,QAAQ,CAAC,WAAW;;;;;;MAMlB;IAEF,OAAO,CAAC,WAAW,CAAc;gBAErB,MAAM,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE;cAKhC,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAoBzE"}
|
|
@@ -5,38 +5,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
5
5
|
exports.SearchDocsTool = void 0;
|
|
6
6
|
const BaseTool_js_1 = require("../BaseTool.js");
|
|
7
7
|
const SearchDocsTool_input_schema_js_1 = require("./SearchDocsTool.input.schema.js");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const ALGOLIA_SEARCH_KEY = '332b77ce8ccfba082ac50ad2d882c80a';
|
|
12
|
-
const ALGOLIA_INDEX = 'mapbox';
|
|
13
|
-
const ALGOLIA_URL = `https://${ALGOLIA_APP_ID}-dsn.algolia.net/1/indexes/${ALGOLIA_INDEX}/query`;
|
|
14
|
-
function stripHtml(text) {
|
|
15
|
-
return text.replace(/<[^>]+>/g, '');
|
|
16
|
-
}
|
|
17
|
-
function buildTitle(hierarchy) {
|
|
18
|
-
const levels = [
|
|
19
|
-
hierarchy.lvl0,
|
|
20
|
-
hierarchy.lvl1,
|
|
21
|
-
hierarchy.lvl2,
|
|
22
|
-
hierarchy.lvl3,
|
|
23
|
-
hierarchy.lvl4,
|
|
24
|
-
hierarchy.lvl5,
|
|
25
|
-
hierarchy.lvl6
|
|
26
|
-
].filter((lvl) => lvl !== null);
|
|
27
|
-
return levels.map(stripHtml).join(' > ');
|
|
28
|
-
}
|
|
29
|
-
function formatResults(hits) {
|
|
30
|
-
if (hits.length === 0) {
|
|
8
|
+
const docsSearchIndex_js_1 = require("../../utils/docsSearchIndex.js");
|
|
9
|
+
function formatResults(entries) {
|
|
10
|
+
if (entries.length === 0) {
|
|
31
11
|
return 'No results found.';
|
|
32
12
|
}
|
|
33
|
-
return
|
|
34
|
-
.map((
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
13
|
+
return entries
|
|
14
|
+
.map((entry, i) => {
|
|
15
|
+
const lines = [
|
|
16
|
+
`${i + 1}. **${entry.title}** (${entry.product})`,
|
|
17
|
+
` URL: ${entry.url}`
|
|
18
|
+
];
|
|
19
|
+
if (entry.description) {
|
|
20
|
+
lines.push(` > ${entry.description}`);
|
|
40
21
|
}
|
|
41
22
|
return lines.join('\n');
|
|
42
23
|
})
|
|
@@ -44,7 +25,11 @@ function formatResults(hits) {
|
|
|
44
25
|
}
|
|
45
26
|
class SearchDocsTool extends BaseTool_js_1.BaseTool {
|
|
46
27
|
name = 'search_mapbox_docs_tool';
|
|
47
|
-
description = 'Search Mapbox documentation by keyword or natural language query.
|
|
28
|
+
description = 'Search Mapbox documentation by keyword or natural language query. ' +
|
|
29
|
+
'Searches across API reference, GL JS, Help Center, Style Spec, Studio, ' +
|
|
30
|
+
'Search JS, iOS/Android Maps and Navigation SDKs, and Tilesets. ' +
|
|
31
|
+
'Returns ranked results with titles, URLs, and descriptions. ' +
|
|
32
|
+
'Use get_document_tool to fetch the full content of a result page.';
|
|
48
33
|
annotations = {
|
|
49
34
|
readOnlyHint: true,
|
|
50
35
|
destructiveHint: false,
|
|
@@ -58,45 +43,20 @@ class SearchDocsTool extends BaseTool_js_1.BaseTool {
|
|
|
58
43
|
this.httpRequest = params.httpRequest;
|
|
59
44
|
}
|
|
60
45
|
async execute(input) {
|
|
61
|
-
const body = JSON.stringify({
|
|
62
|
-
query: input.query,
|
|
63
|
-
hitsPerPage: input.limit
|
|
64
|
-
});
|
|
65
|
-
let data;
|
|
66
46
|
try {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
'Content-Type': 'application/json'
|
|
73
|
-
},
|
|
74
|
-
body
|
|
75
|
-
});
|
|
76
|
-
if (!response.ok) {
|
|
77
|
-
return {
|
|
78
|
-
content: [
|
|
79
|
-
{
|
|
80
|
-
type: 'text',
|
|
81
|
-
text: `Search request failed: ${response.status} ${response.statusText}`
|
|
82
|
-
}
|
|
83
|
-
],
|
|
84
|
-
isError: true
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
data = (await response.json());
|
|
47
|
+
const results = await (0, docsSearchIndex_js_1.searchDocs)(input.query, input.limit, this.httpRequest);
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: 'text', text: formatResults(results) }],
|
|
50
|
+
isError: false
|
|
51
|
+
};
|
|
88
52
|
}
|
|
89
53
|
catch (error) {
|
|
90
54
|
const message = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
91
55
|
return {
|
|
92
|
-
content: [{ type: 'text', text: `Search
|
|
56
|
+
content: [{ type: 'text', text: `Search failed: ${message}` }],
|
|
93
57
|
isError: true
|
|
94
58
|
};
|
|
95
59
|
}
|
|
96
|
-
return {
|
|
97
|
-
content: [{ type: 'text', text: formatResults(data.hits) }],
|
|
98
|
-
isError: false
|
|
99
|
-
};
|
|
100
60
|
}
|
|
101
61
|
}
|
|
102
62
|
exports.SearchDocsTool = SearchDocsTool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchDocsTool.js","sourceRoot":"","sources":["../../../../src/tools/search-docs-tool/SearchDocsTool.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AAIlC,gDAA0C;AAC1C,qFAG0C;
|
|
1
|
+
{"version":3,"file":"SearchDocsTool.js","sourceRoot":"","sources":["../../../../src/tools/search-docs-tool/SearchDocsTool.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AAIlC,gDAA0C;AAC1C,qFAG0C;AAC1C,uEAA2E;AAE3E,SAAS,aAAa,CAAC,OAAmB;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAChB,MAAM,KAAK,GAAG;YACZ,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG;YACjD,WAAW,KAAK,CAAC,GAAG,EAAE;SACvB,CAAC;QACF,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAa,cAAe,SAAQ,sBAAiC;IACnE,IAAI,GAAG,yBAAyB,CAAC;IACjC,WAAW,GACT,oEAAoE;QACpE,yEAAyE;QACzE,iEAAiE;QACjE,8DAA8D;QAC9D,mEAAmE,CAAC;IAC7D,WAAW,GAAG;QACrB,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,KAAK,EAAE,yBAAyB;KACjC,CAAC;IAEM,WAAW,CAAc;IAEjC,YAAY,MAAoC;QAC9C,KAAK,CAAC,EAAE,WAAW,EAAE,iDAAgB,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,KAAsB;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAU,EAC9B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,KAAK,EACX,IAAI,CAAC,WAAW,CACjB,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;YACpE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,OAAO,EAAE,EAAE,CAAC;gBAC9D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA3CD,wCA2CC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docCache.d.ts","sourceRoot":"","sources":["../../../src/utils/docCache.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe,QAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"docCache.d.ts","sourceRoot":"","sources":["../../../src/utils/docCache.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe,QAAkB,CAAC;AAU/C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,cAAM,QAAQ;IACZ,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAK;IAEvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAe/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAuB,GAAG,IAAI;IAuCvE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,KAAK,IAAI,IAAI;IAKb,gCAAgC;IAChC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,gCAAgC;IAChC,IAAI,iBAAiB,IAAI,MAAM,CAE9B;CACF;AAED,eAAO,MAAM,QAAQ,UAAiB,CAAC;AAEvC;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
|
|
@@ -8,7 +8,8 @@ exports.readBodyWithLimit = readBodyWithLimit;
|
|
|
8
8
|
const DEFAULT_TTL_MS = parseInt(process.env.MAPBOX_DOCS_CACHE_TTL_MS ?? '3600000', 10);
|
|
9
9
|
// Cache limits
|
|
10
10
|
const MAX_ENTRIES = 512;
|
|
11
|
-
exports.MAX_ENTRY_BYTES =
|
|
11
|
+
exports.MAX_ENTRY_BYTES = 5 * 1024 * 1024; // 5 MB hard cap per entry
|
|
12
|
+
const LARGE_ENTRY_WARNING_BYTES = 1 * 1024 * 1024; // warn at 1 MB
|
|
12
13
|
const MAX_TOTAL_BYTES = 50 * 1024 * 1024; // 50 MB total
|
|
13
14
|
/**
|
|
14
15
|
* Normalize a URL for use as a cache key by stripping query parameters
|
|
@@ -47,7 +48,11 @@ class DocCache {
|
|
|
47
48
|
set(url, content, ttlMs = DEFAULT_TTL_MS) {
|
|
48
49
|
const bytes = Buffer.byteLength(content, 'utf8');
|
|
49
50
|
if (bytes > exports.MAX_ENTRY_BYTES) {
|
|
50
|
-
|
|
51
|
+
console.warn(`[docCache] Entry too large to cache (${(bytes / 1024 / 1024).toFixed(1)} MB, limit ${exports.MAX_ENTRY_BYTES / 1024 / 1024} MB): ${url}`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (bytes > LARGE_ENTRY_WARNING_BYTES) {
|
|
55
|
+
console.warn(`[docCache] Caching large entry (${(bytes / 1024 / 1024).toFixed(1)} MB): ${url}`);
|
|
51
56
|
}
|
|
52
57
|
const key = normalizeCacheKey(url);
|
|
53
58
|
// Remove existing entry for this key if present
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docCache.js","sourceRoot":"","sources":["../../../src/utils/docCache.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;
|
|
1
|
+
{"version":3,"file":"docCache.js","sourceRoot":"","sources":["../../../src/utils/docCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,16 +2,25 @@ import type { HttpRequest } from './types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Rewrite a docs.mapbox.com URL to its .md variant, substituting the
|
|
4
4
|
* effective hostname (which may be overridden via MAPBOX_DOCS_HOST_OVERRIDE).
|
|
5
|
-
* Returns null if the URL is not a docs.mapbox.com URL
|
|
5
|
+
* Returns null if the URL is not a docs.mapbox.com URL, or if the URL
|
|
6
|
+
* already ends in a text extension (.md, .txt, .json) — those should be
|
|
7
|
+
* fetched as-is without rewriting.
|
|
6
8
|
*
|
|
7
9
|
* Example (no override):
|
|
8
10
|
* https://docs.mapbox.com/accounts/guides → https://docs.mapbox.com/accounts/guides.md
|
|
9
11
|
* https://docs.mapbox.com/accounts/guides/ → https://docs.mapbox.com/accounts/guides.md
|
|
12
|
+
* https://docs.mapbox.com/mapbox-gl-js/llms.txt → null (already a text file)
|
|
10
13
|
*
|
|
11
14
|
* Example (MAPBOX_DOCS_HOST_OVERRIDE=docs.tilestream.net):
|
|
12
15
|
* https://docs.mapbox.com/accounts/guides → https://docs.tilestream.net/accounts/guides.md
|
|
13
16
|
*/
|
|
14
17
|
export declare function toMarkdownUrl(url: string): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Fetch a URL and cache the result. Intended for fetching llms.txt index
|
|
20
|
+
* files which are small, change infrequently, and are shared across multiple
|
|
21
|
+
* resources and tool calls.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fetchCachedText(url: string, httpRequest: HttpRequest): Promise<string>;
|
|
15
24
|
/**
|
|
16
25
|
* Fetch a Mapbox documentation page, preferring the .md variant for
|
|
17
26
|
* docs.mapbox.com URLs when available. Falls back to the original URL
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/docFetcher.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY9C
|
|
1
|
+
{"version":3,"file":"docFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/docFetcher.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYxD;AAoBD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// Licensed under the MIT License.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.toMarkdownUrl = toMarkdownUrl;
|
|
6
|
+
exports.fetchCachedText = fetchCachedText;
|
|
6
7
|
exports.fetchDocContent = fetchDocContent;
|
|
7
8
|
const docCache_js_1 = require("./docCache.js");
|
|
8
9
|
const DOCS_HOSTNAME = 'docs.mapbox.com';
|
|
@@ -16,11 +17,14 @@ function getDocsHostname() {
|
|
|
16
17
|
/**
|
|
17
18
|
* Rewrite a docs.mapbox.com URL to its .md variant, substituting the
|
|
18
19
|
* effective hostname (which may be overridden via MAPBOX_DOCS_HOST_OVERRIDE).
|
|
19
|
-
* Returns null if the URL is not a docs.mapbox.com URL
|
|
20
|
+
* Returns null if the URL is not a docs.mapbox.com URL, or if the URL
|
|
21
|
+
* already ends in a text extension (.md, .txt, .json) — those should be
|
|
22
|
+
* fetched as-is without rewriting.
|
|
20
23
|
*
|
|
21
24
|
* Example (no override):
|
|
22
25
|
* https://docs.mapbox.com/accounts/guides → https://docs.mapbox.com/accounts/guides.md
|
|
23
26
|
* https://docs.mapbox.com/accounts/guides/ → https://docs.mapbox.com/accounts/guides.md
|
|
27
|
+
* https://docs.mapbox.com/mapbox-gl-js/llms.txt → null (already a text file)
|
|
24
28
|
*
|
|
25
29
|
* Example (MAPBOX_DOCS_HOST_OVERRIDE=docs.tilestream.net):
|
|
26
30
|
* https://docs.mapbox.com/accounts/guides → https://docs.tilestream.net/accounts/guides.md
|
|
@@ -30,6 +34,9 @@ function toMarkdownUrl(url) {
|
|
|
30
34
|
const parsed = new URL(url);
|
|
31
35
|
if (parsed.hostname !== DOCS_HOSTNAME)
|
|
32
36
|
return null;
|
|
37
|
+
// Don't double-extend URLs that are already text/data files
|
|
38
|
+
if (/\.(txt|md|json)$/i.test(parsed.pathname))
|
|
39
|
+
return null;
|
|
33
40
|
parsed.hostname = getDocsHostname();
|
|
34
41
|
parsed.pathname = parsed.pathname.replace(/\/$/, '') + '.md';
|
|
35
42
|
return parsed.toString();
|
|
@@ -57,6 +64,26 @@ function applyHostOverride(url) {
|
|
|
57
64
|
return url;
|
|
58
65
|
}
|
|
59
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Fetch a URL and cache the result. Intended for fetching llms.txt index
|
|
69
|
+
* files which are small, change infrequently, and are shared across multiple
|
|
70
|
+
* resources and tool calls.
|
|
71
|
+
*/
|
|
72
|
+
async function fetchCachedText(url, httpRequest) {
|
|
73
|
+
const cached = docCache_js_1.docCache.get(url);
|
|
74
|
+
if (cached !== null)
|
|
75
|
+
return cached;
|
|
76
|
+
const response = await httpRequest(url, {});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
const content = await response.text();
|
|
81
|
+
if (Buffer.byteLength(content, 'utf8') > docCache_js_1.MAX_ENTRY_BYTES) {
|
|
82
|
+
throw new Error(`Response too large for ${url}`);
|
|
83
|
+
}
|
|
84
|
+
docCache_js_1.docCache.set(url, content);
|
|
85
|
+
return content;
|
|
86
|
+
}
|
|
60
87
|
/**
|
|
61
88
|
* Fetch a Mapbox documentation page, preferring the .md variant for
|
|
62
89
|
* docs.mapbox.com URLs when available. Falls back to the original URL
|
|
@@ -74,9 +101,7 @@ async function fetchDocContent(url, httpRequest) {
|
|
|
74
101
|
}
|
|
75
102
|
}
|
|
76
103
|
const fetchUrl = applyHostOverride(url);
|
|
77
|
-
const response = await httpRequest(fetchUrl, {
|
|
78
|
-
headers: { Accept: 'text/markdown, text/plain;q=0.9, */*;q=0.8' }
|
|
79
|
-
});
|
|
104
|
+
const response = await httpRequest(fetchUrl, {});
|
|
80
105
|
if (!response.ok) {
|
|
81
106
|
throw new Error(`${response.status} ${response.statusText}`);
|
|
82
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docFetcher.js","sourceRoot":"","sources":["../../../src/utils/docFetcher.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;
|
|
1
|
+
{"version":3,"file":"docFetcher.js","sourceRoot":"","sources":["../../../src/utils/docFetcher.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;AA8BlC,sCAYC;AAyBD,0CAmBC;AAUD,0CAqBC;AAnHD,+CAA6E;AAG7E,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC;;;GAGG;AACH,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,aAAa,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,aAAa;YAAE,OAAO,IAAI,CAAC;QACnD,4DAA4D;QAC5D,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,MAAM,CAAC,QAAQ,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;QAC7D,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACtC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,WAAwB;IAExB,MAAM,MAAM,GAAG,sBAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAEnC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAE5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,6BAAe,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,sBAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,WAAwB;IAExB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,IAAA,+BAAiB,EAAC,UAAU,EAAE,6BAAe,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEjD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,IAAA,+BAAiB,EAAC,QAAQ,EAAE,6BAAe,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HttpRequest } from './types.js';
|
|
2
|
+
export interface DocEntry {
|
|
3
|
+
title: string;
|
|
4
|
+
url: string;
|
|
5
|
+
description: string;
|
|
6
|
+
product: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parse a product-level llms.txt file into searchable entries.
|
|
10
|
+
* Each `- [Title](URL): description` line becomes one entry.
|
|
11
|
+
* Lines that don't match (headers, blanks, root index links) are skipped.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseLlmsTxtEntries(content: string, product: string): DocEntry[];
|
|
14
|
+
/**
|
|
15
|
+
* Search across all indexed llms.txt files.
|
|
16
|
+
*
|
|
17
|
+
* All source files are fetched in parallel and cached via docCache.
|
|
18
|
+
* First call may take ~500ms while files are fetched; subsequent calls
|
|
19
|
+
* are instant since all content is in-memory.
|
|
20
|
+
*
|
|
21
|
+
* Failed sources are skipped gracefully so a single unavailable file
|
|
22
|
+
* doesn't break the entire search.
|
|
23
|
+
*/
|
|
24
|
+
export declare function searchDocs(query: string, limit: number, httpRequest: HttpRequest): Promise<DocEntry[]>;
|
|
25
|
+
//# sourceMappingURL=docsSearchIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docsSearchIndex.d.ts","sourceRoot":"","sources":["../../../src/utils/docsSearchIndex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AA8DD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,QAAQ,EAAE,CAYZ;AAoBD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoCrB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Mapbox, Inc.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.parseLlmsTxtEntries = parseLlmsTxtEntries;
|
|
6
|
+
exports.searchDocs = searchDocs;
|
|
7
|
+
const docFetcher_js_1 = require("./docFetcher.js");
|
|
8
|
+
/**
|
|
9
|
+
* Curated set of product llms.txt files to include in the search index.
|
|
10
|
+
* Each file is fetched once and cached for the duration of the TTL.
|
|
11
|
+
* Files are fetched in parallel on first search then served from cache.
|
|
12
|
+
*/
|
|
13
|
+
const INDEX_SOURCES = [
|
|
14
|
+
{
|
|
15
|
+
url: 'https://docs.mapbox.com/api/llms.txt',
|
|
16
|
+
product: 'API Reference'
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
url: 'https://docs.mapbox.com/mapbox-gl-js/llms.txt',
|
|
20
|
+
product: 'Mapbox GL JS'
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
url: 'https://docs.mapbox.com/help/llms.txt',
|
|
24
|
+
product: 'Help Center'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
url: 'https://docs.mapbox.com/style-spec/llms.txt',
|
|
28
|
+
product: 'Style Specification'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
url: 'https://docs.mapbox.com/studio-manual/llms.txt',
|
|
32
|
+
product: 'Studio Manual'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
url: 'https://docs.mapbox.com/mapbox-search-js/llms.txt',
|
|
36
|
+
product: 'Mapbox Search JS'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
url: 'https://docs.mapbox.com/ios/maps/llms.txt',
|
|
40
|
+
product: 'Maps SDK for iOS'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
url: 'https://docs.mapbox.com/android/maps/llms.txt',
|
|
44
|
+
product: 'Maps SDK for Android'
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
url: 'https://docs.mapbox.com/ios/navigation/llms.txt',
|
|
48
|
+
product: 'Navigation SDK for iOS'
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
url: 'https://docs.mapbox.com/android/navigation/llms.txt',
|
|
52
|
+
product: 'Navigation SDK for Android'
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
url: 'https://docs.mapbox.com/mapbox-tiling-service/llms.txt',
|
|
56
|
+
product: 'Mapbox Tiling Service'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
url: 'https://docs.mapbox.com/data/tilesets/llms.txt',
|
|
60
|
+
product: 'Tilesets'
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
// Matches: - [Title](URL): optional description
|
|
64
|
+
// or: - [Title](URL)
|
|
65
|
+
const ENTRY_RE = /^-\s+\[([^\]]+)\]\(([^)]+)\)(?::\s*(.+))?$/;
|
|
66
|
+
/**
|
|
67
|
+
* Parse a product-level llms.txt file into searchable entries.
|
|
68
|
+
* Each `- [Title](URL): description` line becomes one entry.
|
|
69
|
+
* Lines that don't match (headers, blanks, root index links) are skipped.
|
|
70
|
+
*/
|
|
71
|
+
function parseLlmsTxtEntries(content, product) {
|
|
72
|
+
const entries = [];
|
|
73
|
+
for (const rawLine of content.split('\n')) {
|
|
74
|
+
const line = rawLine.trim();
|
|
75
|
+
const match = ENTRY_RE.exec(line);
|
|
76
|
+
if (!match)
|
|
77
|
+
continue;
|
|
78
|
+
const [, title, url, description = ''] = match;
|
|
79
|
+
// Skip links to other llms.txt files (those are index links, not doc pages)
|
|
80
|
+
if (url.endsWith('/llms.txt') || url.endsWith('/llms-full.txt'))
|
|
81
|
+
continue;
|
|
82
|
+
entries.push({ title, url, description, product });
|
|
83
|
+
}
|
|
84
|
+
return entries;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Score an entry against the query words.
|
|
88
|
+
* Title matches are weighted 3x, description and URL path matches 1x each.
|
|
89
|
+
*/
|
|
90
|
+
function scoreEntry(entry, queryWords) {
|
|
91
|
+
const titleLower = entry.title.toLowerCase();
|
|
92
|
+
const descLower = entry.description.toLowerCase();
|
|
93
|
+
const urlLower = entry.url.toLowerCase();
|
|
94
|
+
let score = 0;
|
|
95
|
+
for (const word of queryWords) {
|
|
96
|
+
if (titleLower.includes(word))
|
|
97
|
+
score += 3;
|
|
98
|
+
if (descLower.includes(word))
|
|
99
|
+
score += 1;
|
|
100
|
+
if (urlLower.includes(word))
|
|
101
|
+
score += 1;
|
|
102
|
+
}
|
|
103
|
+
return score;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Search across all indexed llms.txt files.
|
|
107
|
+
*
|
|
108
|
+
* All source files are fetched in parallel and cached via docCache.
|
|
109
|
+
* First call may take ~500ms while files are fetched; subsequent calls
|
|
110
|
+
* are instant since all content is in-memory.
|
|
111
|
+
*
|
|
112
|
+
* Failed sources are skipped gracefully so a single unavailable file
|
|
113
|
+
* doesn't break the entire search.
|
|
114
|
+
*/
|
|
115
|
+
async function searchDocs(query, limit, httpRequest) {
|
|
116
|
+
const allEntries = (await Promise.all(INDEX_SOURCES.map(async ({ url, product }) => {
|
|
117
|
+
try {
|
|
118
|
+
const content = await (0, docFetcher_js_1.fetchCachedText)(url, httpRequest);
|
|
119
|
+
return parseLlmsTxtEntries(content, product);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}))).flat();
|
|
125
|
+
const queryWords = query
|
|
126
|
+
.toLowerCase()
|
|
127
|
+
.split(/\s+/)
|
|
128
|
+
.filter((w) => w.length > 1); // skip single-char words
|
|
129
|
+
const scored = allEntries
|
|
130
|
+
.map((entry) => ({ entry, score: scoreEntry(entry, queryWords) }))
|
|
131
|
+
.filter(({ score }) => score > 0)
|
|
132
|
+
.sort((a, b) => b.score - a.score);
|
|
133
|
+
// Deduplicate by URL (same page can appear across multiple sources)
|
|
134
|
+
const seen = new Set();
|
|
135
|
+
const results = [];
|
|
136
|
+
for (const { entry } of scored) {
|
|
137
|
+
if (!seen.has(entry.url)) {
|
|
138
|
+
seen.add(entry.url);
|
|
139
|
+
results.push(entry);
|
|
140
|
+
if (results.length >= limit)
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=docsSearchIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docsSearchIndex.js","sourceRoot":"","sources":["../../../src/utils/docsSearchIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { systemHttpPipeline, httpRequest, UserAgentPolicy } from './httpPipeline.js';
|
|
2
2
|
export { getVersionInfo } from './versionUtils.js';
|
|
3
3
|
export type { VersionInfo } from './versionUtils.js';
|
|
4
|
+
export { initializeTracing, shutdownTracing, isTracingInitialized, getTracer, withToolSpan } from './tracing.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|