mcmodding-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +324 -0
  3. package/dist/db-versioning.d.ts +31 -0
  4. package/dist/db-versioning.d.ts.map +1 -0
  5. package/dist/db-versioning.js +206 -0
  6. package/dist/db-versioning.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +202 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/indexer/chunker.d.ts +32 -0
  12. package/dist/indexer/chunker.d.ts.map +1 -0
  13. package/dist/indexer/chunker.js +157 -0
  14. package/dist/indexer/chunker.js.map +1 -0
  15. package/dist/indexer/crawler.d.ts +28 -0
  16. package/dist/indexer/crawler.d.ts.map +1 -0
  17. package/dist/indexer/crawler.js +550 -0
  18. package/dist/indexer/crawler.js.map +1 -0
  19. package/dist/indexer/embeddings.d.ts +56 -0
  20. package/dist/indexer/embeddings.d.ts.map +1 -0
  21. package/dist/indexer/embeddings.js +200 -0
  22. package/dist/indexer/embeddings.js.map +1 -0
  23. package/dist/indexer/sitemap.d.ts +35 -0
  24. package/dist/indexer/sitemap.d.ts.map +1 -0
  25. package/dist/indexer/sitemap.js +263 -0
  26. package/dist/indexer/sitemap.js.map +1 -0
  27. package/dist/indexer/store.d.ts +237 -0
  28. package/dist/indexer/store.d.ts.map +1 -0
  29. package/dist/indexer/store.js +857 -0
  30. package/dist/indexer/store.js.map +1 -0
  31. package/dist/indexer/types.d.ts +77 -0
  32. package/dist/indexer/types.d.ts.map +1 -0
  33. package/dist/indexer/types.js +2 -0
  34. package/dist/indexer/types.js.map +1 -0
  35. package/dist/indexer/updater.d.ts +52 -0
  36. package/dist/indexer/updater.d.ts.map +1 -0
  37. package/dist/indexer/updater.js +263 -0
  38. package/dist/indexer/updater.js.map +1 -0
  39. package/dist/services/concept-service.d.ts +49 -0
  40. package/dist/services/concept-service.d.ts.map +1 -0
  41. package/dist/services/concept-service.js +554 -0
  42. package/dist/services/concept-service.js.map +1 -0
  43. package/dist/services/example-service.d.ts +52 -0
  44. package/dist/services/example-service.d.ts.map +1 -0
  45. package/dist/services/example-service.js +302 -0
  46. package/dist/services/example-service.js.map +1 -0
  47. package/dist/services/search-service.d.ts +54 -0
  48. package/dist/services/search-service.d.ts.map +1 -0
  49. package/dist/services/search-service.js +519 -0
  50. package/dist/services/search-service.js.map +1 -0
  51. package/dist/services/search-utils.d.ts +34 -0
  52. package/dist/services/search-utils.d.ts.map +1 -0
  53. package/dist/services/search-utils.js +239 -0
  54. package/dist/services/search-utils.js.map +1 -0
  55. package/dist/tools/explainConcept.d.ts +9 -0
  56. package/dist/tools/explainConcept.d.ts.map +1 -0
  57. package/dist/tools/explainConcept.js +93 -0
  58. package/dist/tools/explainConcept.js.map +1 -0
  59. package/dist/tools/getExample.d.ts +20 -0
  60. package/dist/tools/getExample.d.ts.map +1 -0
  61. package/dist/tools/getExample.js +88 -0
  62. package/dist/tools/getExample.js.map +1 -0
  63. package/dist/tools/getMinecraftVersion.d.ts +6 -0
  64. package/dist/tools/getMinecraftVersion.d.ts.map +1 -0
  65. package/dist/tools/getMinecraftVersion.js +57 -0
  66. package/dist/tools/getMinecraftVersion.js.map +1 -0
  67. package/dist/tools/searchDocs.d.ts +15 -0
  68. package/dist/tools/searchDocs.d.ts.map +1 -0
  69. package/dist/tools/searchDocs.js +144 -0
  70. package/dist/tools/searchDocs.js.map +1 -0
  71. package/package.json +111 -0
  72. package/scripts/postinstall.js +859 -0
@@ -0,0 +1,200 @@
1
+ import { pipeline, env } from '@xenova/transformers';
2
+ env.allowLocalModels = true;
3
+ env.allowRemoteModels = true;
4
+ export class EmbeddingGenerator {
5
+ pipeline = null;
6
+ modelName = 'Xenova/all-MiniLM-L6-v2';
7
+ initialized = false;
8
+ async initialize() {
9
+ if (this.initialized)
10
+ return;
11
+ console.error('Initializing embedding model...');
12
+ console.error(`Model: ${this.modelName}`);
13
+ try {
14
+ this.pipeline = await pipeline('feature-extraction', this.modelName);
15
+ this.initialized = true;
16
+ console.error('Embedding model initialized successfully');
17
+ }
18
+ catch (error) {
19
+ console.error('Failed to initialize embedding model:', error);
20
+ throw error;
21
+ }
22
+ }
23
+ async generateEmbedding(text) {
24
+ if (!this.initialized || !this.pipeline) {
25
+ await this.initialize();
26
+ }
27
+ if (!this.pipeline) {
28
+ throw new Error('Embedding pipeline not initialized');
29
+ }
30
+ try {
31
+ const output = await this.pipeline(text, {
32
+ pooling: 'mean',
33
+ normalize: true,
34
+ });
35
+ const embedding = Array.from(output.data);
36
+ return embedding;
37
+ }
38
+ catch (error) {
39
+ console.error('Failed to generate embedding:', error);
40
+ throw error;
41
+ }
42
+ }
43
+ async generateEmbeddings(texts, batchSize = 32) {
44
+ if (!this.initialized || !this.pipeline) {
45
+ await this.initialize();
46
+ }
47
+ const embeddings = [];
48
+ for (let i = 0; i < texts.length; i += batchSize) {
49
+ const batch = texts.slice(i, i + batchSize);
50
+ const batchPromises = batch.map((text) => this.generateEmbedding(text));
51
+ const batchResults = await Promise.all(batchPromises);
52
+ embeddings.push(...batchResults);
53
+ if (i + batchSize < texts.length) {
54
+ process.stdout.write(`\r Generating embeddings: ${Math.min(i + batchSize, texts.length)}/${texts.length} `);
55
+ }
56
+ }
57
+ console.log();
58
+ return embeddings;
59
+ }
60
+ static cosineSimilarity(a, b) {
61
+ if (a.length !== b.length) {
62
+ throw new Error('Vectors must have the same length');
63
+ }
64
+ let dotProduct = 0;
65
+ let normA = 0;
66
+ let normB = 0;
67
+ for (let i = 0; i < a.length; i++) {
68
+ dotProduct += a[i] * b[i];
69
+ normA += a[i] * a[i];
70
+ normB += b[i] * b[i];
71
+ }
72
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
73
+ }
74
+ static findTopK(queryEmbedding, embeddings, k = 10) {
75
+ const results = [];
76
+ for (const item of embeddings) {
77
+ const similarity = this.cosineSimilarity(queryEmbedding, item.embedding);
78
+ results.push({
79
+ chunkId: item.chunkId,
80
+ similarity,
81
+ });
82
+ }
83
+ results.sort((a, b) => b.similarity - a.similarity);
84
+ return results.slice(0, k);
85
+ }
86
+ }
87
+ export class InMemoryEmbeddingCache {
88
+ embeddings = new Map();
89
+ async storeEmbeddings(embeddings) {
90
+ for (const item of embeddings) {
91
+ this.embeddings.set(item.chunkId, item.embedding);
92
+ }
93
+ }
94
+ async getAllEmbeddings() {
95
+ const results = [];
96
+ for (const [chunkId, embedding] of this.embeddings.entries()) {
97
+ results.push({ chunkId, embedding });
98
+ }
99
+ return results;
100
+ }
101
+ async getEmbedding(chunkId) {
102
+ const embedding = this.embeddings.get(chunkId);
103
+ return embedding ? { chunkId, embedding } : undefined;
104
+ }
105
+ async deleteEmbeddings(documentId) {
106
+ const documentPrefix = documentId.toString();
107
+ for (const chunkId of this.embeddings.keys()) {
108
+ if (chunkId.startsWith(documentPrefix)) {
109
+ this.embeddings.delete(chunkId);
110
+ }
111
+ }
112
+ }
113
+ async searchSemantic(queryEmbedding, limit) {
114
+ const allEmbeddings = await this.getAllEmbeddings();
115
+ return EmbeddingGenerator.findTopK(queryEmbedding, allEmbeddings, limit);
116
+ }
117
+ size() {
118
+ return this.embeddings.size;
119
+ }
120
+ clear() {
121
+ this.embeddings.clear();
122
+ }
123
+ async saveToFile(path) {
124
+ const data = Array.from(this.embeddings.entries());
125
+ const json = JSON.stringify(data);
126
+ const { writeFile } = await import('fs/promises');
127
+ await writeFile(path, json, 'utf-8');
128
+ }
129
+ async loadFromFile(path) {
130
+ const { readFile } = await import('fs/promises');
131
+ const json = await readFile(path, 'utf-8');
132
+ const data = JSON.parse(json);
133
+ this.embeddings.clear();
134
+ for (const [chunkId, embedding] of data) {
135
+ this.embeddings.set(chunkId, embedding);
136
+ }
137
+ }
138
+ }
139
+ export class HybridSearch {
140
+ static combine(ftsResults, semanticResults, ftsWeight = 0.5, semanticWeight = 0.5) {
141
+ const totalWeight = ftsWeight + semanticWeight;
142
+ const normFtsWeight = ftsWeight / totalWeight;
143
+ const normSemanticWeight = semanticWeight / totalWeight;
144
+ const resultMap = new Map();
145
+ const maxFtsRank = Math.max(...ftsResults.map((r) => Math.abs(r.rank)));
146
+ for (const result of ftsResults) {
147
+ const normalizedScore = 1 - Math.abs(result.rank) / maxFtsRank;
148
+ resultMap.set(result.id, {
149
+ chunkId: result.id,
150
+ ftsScore: normalizedScore,
151
+ semanticScore: 0,
152
+ combinedScore: normalizedScore * normFtsWeight,
153
+ });
154
+ }
155
+ for (const result of semanticResults) {
156
+ const existing = resultMap.get(result.chunkId);
157
+ if (existing) {
158
+ existing.semanticScore = result.similarity;
159
+ existing.combinedScore += result.similarity * normSemanticWeight;
160
+ }
161
+ else {
162
+ resultMap.set(result.chunkId, {
163
+ chunkId: result.chunkId,
164
+ ftsScore: 0,
165
+ semanticScore: result.similarity,
166
+ combinedScore: result.similarity * normSemanticWeight,
167
+ });
168
+ }
169
+ }
170
+ const results = Array.from(resultMap.values());
171
+ results.sort((a, b) => b.combinedScore - a.combinedScore);
172
+ return results;
173
+ }
174
+ static reciprocalRankFusion(ftsResults, semanticResults, k = 60) {
175
+ const scores = new Map();
176
+ ftsResults.forEach((result, index) => {
177
+ const score = 1 / (k + index + 1);
178
+ scores.set(result.id, score);
179
+ });
180
+ semanticResults.forEach((result, index) => {
181
+ const score = 1 / (k + index + 1);
182
+ const existing = scores.get(result.chunkId) || 0;
183
+ scores.set(result.chunkId, existing + score);
184
+ });
185
+ const results = [];
186
+ for (const [chunkId, combinedScore] of scores.entries()) {
187
+ const ftsResult = ftsResults.find((r) => r.id === chunkId);
188
+ const semanticResult = semanticResults.find((r) => r.chunkId === chunkId);
189
+ results.push({
190
+ chunkId,
191
+ ftsScore: ftsResult ? 1 : 0,
192
+ semanticScore: semanticResult ? semanticResult.similarity : 0,
193
+ combinedScore,
194
+ });
195
+ }
196
+ results.sort((a, b) => b.combinedScore - a.combinedScore);
197
+ return results;
198
+ }
199
+ }
200
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/indexer/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface SitemapEntry {
2
+ url: string;
3
+ lastModified?: Date;
4
+ changeFreq?: string;
5
+ priority?: number;
6
+ }
7
+ export interface SitemapFilter {
8
+ includeLocales?: string[];
9
+ includePatterns?: RegExp[];
10
+ excludePatterns?: RegExp[];
11
+ }
12
+ export declare class SitemapParser {
13
+ private sitemapUrl;
14
+ private filter;
15
+ constructor(sitemapUrl: string, filter?: SitemapFilter);
16
+ parse(): Promise<SitemapEntry[]>;
17
+ private parseSitemapXML;
18
+ private applyFilters;
19
+ private isEnglishUrl;
20
+ static parseRawSitemap(content: string): SitemapEntry[];
21
+ }
22
+ export declare function getFabricUrlsFromSitemap(): Promise<string[]>;
23
+ export declare function getNeoforgeUrlsFromSitemap(): Promise<string[]>;
24
+ export declare function getFabricWikiUrlsFromSitemap(): Promise<string[]>;
25
+ export declare function detectMinecraftVersion(url: string, content: string): string | undefined;
26
+ export interface VersionInfo {
27
+ version: string;
28
+ releaseDate?: Date;
29
+ isLatest: boolean;
30
+ isLTS?: boolean;
31
+ }
32
+ export declare function parseVersionFromUrl(url: string): string | undefined;
33
+ export declare function compareVersions(v1: string, v2: string): number;
34
+ export declare function getLatestVersion(versions: string[]): string | undefined;
35
+ //# sourceMappingURL=sitemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/indexer/sitemap.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAgB;gBAElB,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB;IAapD,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAkDtC,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,YAAY;IASpB,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;CAmBxD;AAKD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBlE;AAKD,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBpE;AAMD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCtE;AA8BD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAwBvF;AAKD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAInE;AAKD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAa9D;AAKD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAIvE"}
@@ -0,0 +1,263 @@
1
+ import fetch from 'node-fetch';
2
+ import { load } from 'cheerio';
3
+ import { gunzipSync } from 'zlib';
4
+ export class SitemapParser {
5
+ sitemapUrl;
6
+ filter;
7
+ constructor(sitemapUrl, filter = {}) {
8
+ this.sitemapUrl = sitemapUrl;
9
+ this.filter = {
10
+ includeLocales: filter.includeLocales || [],
11
+ includePatterns: filter.includePatterns || [],
12
+ excludePatterns: filter.excludePatterns || [],
13
+ };
14
+ }
15
+ async parse() {
16
+ console.error(`Fetching sitemap from: ${this.sitemapUrl}`);
17
+ const response = await fetch(this.sitemapUrl);
18
+ if (!response.ok) {
19
+ throw new Error(`Failed to fetch sitemap: ${response.statusText}`);
20
+ }
21
+ const contentType = response.headers.get('content-type') || '';
22
+ const contentEncoding = response.headers.get('content-encoding') || '';
23
+ const isGzipped = contentType.includes('gzip') ||
24
+ contentType.includes('application/x-gzip') ||
25
+ contentEncoding.includes('gzip') ||
26
+ this.sitemapUrl.endsWith('.gz') ||
27
+ this.sitemapUrl.includes('do=sitemap');
28
+ let xml;
29
+ if (isGzipped) {
30
+ console.error('Detected gzipped sitemap, decompressing...');
31
+ const buffer = await response.arrayBuffer();
32
+ try {
33
+ const decompressed = gunzipSync(Buffer.from(buffer));
34
+ xml = decompressed.toString('utf-8');
35
+ }
36
+ catch {
37
+ console.error('Gzip decompression failed, trying as plain text...');
38
+ xml = Buffer.from(buffer).toString('utf-8');
39
+ }
40
+ }
41
+ else {
42
+ xml = await response.text();
43
+ }
44
+ const entries = this.parseSitemapXML(xml);
45
+ console.error(`Found ${entries.length} entries in sitemap`);
46
+ const filtered = this.applyFilters(entries);
47
+ console.error(`Filtered to ${filtered.length} entries`);
48
+ return filtered;
49
+ }
50
+ parseSitemapXML(xml) {
51
+ const $ = load(xml, { xmlMode: true });
52
+ const entries = [];
53
+ $('sitemap').each((_, elem) => {
54
+ const loc = $(elem)
55
+ .find('loc')
56
+ .text()
57
+ .trim();
58
+ if (loc) {
59
+ console.error(`Found sitemap index entry: ${loc}`);
60
+ }
61
+ });
62
+ $('url').each((_, elem) => {
63
+ const $url = $(elem);
64
+ const loc = $url.find('loc').text().trim();
65
+ if (!loc)
66
+ return;
67
+ const lastmod = $url.find('lastmod').text().trim();
68
+ const changefreq = $url.find('changefreq').text().trim();
69
+ const priority = $url.find('priority').text().trim();
70
+ entries.push({
71
+ url: loc,
72
+ lastModified: lastmod ? new Date(lastmod) : undefined,
73
+ changeFreq: changefreq || undefined,
74
+ priority: priority ? parseFloat(priority) : undefined,
75
+ });
76
+ });
77
+ return entries;
78
+ }
79
+ applyFilters(entries) {
80
+ return entries.filter((entry) => {
81
+ const url = entry.url;
82
+ if (this.filter.includeLocales && this.filter.includeLocales.length > 0) {
83
+ const hasLocale = this.filter.includeLocales.some((locale) => url.includes(`/${locale}_`));
84
+ if (!hasLocale && !this.isEnglishUrl(url)) {
85
+ return false;
86
+ }
87
+ }
88
+ else {
89
+ if (!this.isEnglishUrl(url)) {
90
+ return false;
91
+ }
92
+ }
93
+ if (this.filter.includePatterns && this.filter.includePatterns.length > 0) {
94
+ const matches = this.filter.includePatterns.some((pattern) => pattern.test(url));
95
+ if (!matches) {
96
+ return false;
97
+ }
98
+ }
99
+ if (this.filter.excludePatterns && this.filter.excludePatterns.length > 0) {
100
+ const excluded = this.filter.excludePatterns.some((pattern) => pattern.test(url));
101
+ if (excluded) {
102
+ return false;
103
+ }
104
+ }
105
+ return true;
106
+ });
107
+ }
108
+ isEnglishUrl(url) {
109
+ const localePattern = /\/[a-z]{2}_[a-z]{2}\//;
110
+ return !localePattern.test(url);
111
+ }
112
+ static parseRawSitemap(content) {
113
+ const entries = [];
114
+ const urlPattern = /(https?:\/\/[^\s]+?)(\d{4}-\d{2}-\d{2}T[\d:]+\.\d{3}Z)/g;
115
+ let match;
116
+ while ((match = urlPattern.exec(content)) !== null) {
117
+ const url = match[1];
118
+ const date = match[2];
119
+ if (url && date) {
120
+ entries.push({
121
+ url: url,
122
+ lastModified: new Date(date),
123
+ });
124
+ }
125
+ }
126
+ return entries;
127
+ }
128
+ }
129
+ export async function getFabricUrlsFromSitemap() {
130
+ const parser = new SitemapParser('https://docs.fabricmc.net/sitemap.xml', {
131
+ includeLocales: [],
132
+ includePatterns: [/\/develop\//],
133
+ excludePatterns: [
134
+ /\/contributing/,
135
+ /\/#/,
136
+ ],
137
+ });
138
+ try {
139
+ const entries = await parser.parse();
140
+ return entries.map((e) => e.url).sort();
141
+ }
142
+ catch (error) {
143
+ console.error('Failed to fetch sitemap, falling back to static list:', error);
144
+ return [];
145
+ }
146
+ }
147
+ export async function getNeoforgeUrlsFromSitemap() {
148
+ const parser = new SitemapParser('https://docs.neoforged.net/sitemap.xml', {
149
+ includeLocales: [],
150
+ includePatterns: [/\/docs\//],
151
+ excludePatterns: [
152
+ /\/contributing/,
153
+ /\/#/,
154
+ ],
155
+ });
156
+ try {
157
+ const entries = await parser.parse();
158
+ return entries.map((e) => e.url).sort();
159
+ }
160
+ catch (error) {
161
+ console.error('Failed to fetch sitemap, falling back to static list:', error);
162
+ return [];
163
+ }
164
+ }
165
+ export async function getFabricWikiUrlsFromSitemap() {
166
+ const sitemapUrl = 'https://wiki.fabricmc.net/start?do=sitemap';
167
+ const parser = new SitemapParser(sitemapUrl, {
168
+ includeLocales: [],
169
+ includePatterns: [],
170
+ excludePatterns: [
171
+ /\?do=/,
172
+ /\?rev=/,
173
+ /\?idx=/,
174
+ /\/playground/,
175
+ /\/wiki\/wiki/,
176
+ /\/start$/,
177
+ /\/de:/,
178
+ /\/es:/,
179
+ /\/fr:/,
180
+ /\/ja:/,
181
+ /\/ru:/,
182
+ /\/zh_cn:/,
183
+ /\/it:/,
184
+ /\/ko_kr:/,
185
+ /\/pt_br:/,
186
+ /\/archive\//,
187
+ /\/drafts:/,
188
+ ],
189
+ });
190
+ try {
191
+ const entries = await parser.parse();
192
+ const urls = entries.map((e) => e.url).sort();
193
+ console.error(`Found ${urls.length} Fabric Wiki URLs`);
194
+ return urls;
195
+ }
196
+ catch (error) {
197
+ console.error('Failed to fetch Fabric wiki sitemap:', error);
198
+ return getFabricWikiStaticUrls();
199
+ }
200
+ }
201
+ function getFabricWikiStaticUrls() {
202
+ const baseUrl = 'https://wiki.fabricmc.net';
203
+ return [
204
+ `${baseUrl}/tutorial/setup`,
205
+ `${baseUrl}/tutorial/items`,
206
+ `${baseUrl}/tutorial/blocks`,
207
+ `${baseUrl}/tutorial/blockentity`,
208
+ `${baseUrl}/tutorial/entity`,
209
+ `${baseUrl}/tutorial/mixin`,
210
+ `${baseUrl}/tutorial/networking`,
211
+ `${baseUrl}/tutorial/recipes`,
212
+ `${baseUrl}/tutorial/commands`,
213
+ `${baseUrl}/tutorial/events`,
214
+ `${baseUrl}/tutorial/keybinds`,
215
+ `${baseUrl}/tutorial/sounds`,
216
+ `${baseUrl}/tutorial/screen`,
217
+ `${baseUrl}/tutorial/enchantments`,
218
+ `${baseUrl}/documentation/fabric_mod_json`,
219
+ `${baseUrl}/documentation/entrypoint`,
220
+ ];
221
+ }
222
+ export function detectMinecraftVersion(url, content) {
223
+ const urlVersionMatch = url.match(/\/(\d+\.\d+(?:\.\d+)?)\//);
224
+ if (urlVersionMatch) {
225
+ return urlVersionMatch[1];
226
+ }
227
+ const contentPatterns = [
228
+ /Minecraft\s+(\d+\.\d+(?:\.\d+)?)/i,
229
+ /MC\s+(\d+\.\d+(?:\.\d+)?)/i,
230
+ /version\s+(\d+\.\d+(?:\.\d+)?)/i,
231
+ /for\s+(\d+\.\d+(?:\.\d+)?)/i,
232
+ ];
233
+ for (const pattern of contentPatterns) {
234
+ const match = content.match(pattern);
235
+ if (match) {
236
+ return match[1];
237
+ }
238
+ }
239
+ return '1.21.10';
240
+ }
241
+ export function parseVersionFromUrl(url) {
242
+ const match = url.match(/\/(\d+\.\d+(?:\.\d+)?)\//);
243
+ return match ? match[1] : undefined;
244
+ }
245
+ export function compareVersions(v1, v2) {
246
+ const parts1 = v1.split('.').map(Number);
247
+ const parts2 = v2.split('.').map(Number);
248
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
249
+ const part1 = parts1[i] || 0;
250
+ const part2 = parts2[i] || 0;
251
+ if (part1 > part2)
252
+ return 1;
253
+ if (part1 < part2)
254
+ return -1;
255
+ }
256
+ return 0;
257
+ }
258
+ export function getLatestVersion(versions) {
259
+ if (versions.length === 0)
260
+ return undefined;
261
+ return versions.sort((a, b) => compareVersions(b, a))[0];
262
+ }
263
+ //# sourceMappingURL=sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/indexer/sitemap.ts"],"names":[],"mappings":"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"}