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,519 @@
1
+ import { DocumentStore } from '../indexer/store.js';
2
+ import { EmbeddingGenerator } from '../indexer/embeddings.js';
3
+ import { tokenizeQuery, calculateRelevanceScore, } from './search-utils.js';
4
+ import path from 'path';
5
+ const NOISE_PATTERNS = [
6
+ /Search🇺🇸.*?(?=\n|$)/gi,
7
+ /🇺🇸\s*English.*?(?=\n|$)/gi,
8
+ /🇨🇿\s*Čeština.*?(?=\n|$)/gi,
9
+ /🇩🇪\s*Deutsch.*?(?=\n|$)/gi,
10
+ /🇬🇷\s*Ελληνικά.*?(?=\n|$)/gi,
11
+ /🇪🇸\s*Español.*?(?=\n|$)/gi,
12
+ /🇫🇷\s*Français.*?(?=\n|$)/gi,
13
+ /🇮🇹\s*Italiano.*?(?=\n|$)/gi,
14
+ /🇯🇵\s*日本語.*?(?=\n|$)/gi,
15
+ /🇰🇷\s*한국어.*?(?=\n|$)/gi,
16
+ /🇵🇱\s*Polski.*?(?=\n|$)/gi,
17
+ /🇧🇷\s*Português.*?(?=\n|$)/gi,
18
+ /🇷🇺\s*Русский.*?(?=\n|$)/gi,
19
+ /🇺🇦\s*Українська.*?(?=\n|$)/gi,
20
+ /🇻🇳\s*Tiếng Việt.*?(?=\n|$)/gi,
21
+ /\(US\).*?\(Việt.*?\)/gs,
22
+ /English \(US\).*$/gm,
23
+ /[\u{1F1E6}-\u{1F1FF}]{2}\s*[A-Za-zÀ-ÿ\u0400-\u04FF\u0370-\u03FF\u4E00-\u9FFF\uAC00-\uD7AF]+\s*\([^)]+\)/gu,
24
+ ];
25
+ const VERSION_PATTERN = /\b(1\.(?:2[0-9]|1[0-9]|[0-9])(?:\.[0-9]+)?)\b/;
26
+ export class SearchService {
27
+ store;
28
+ embeddingGenerator;
29
+ constructor(dbPath) {
30
+ const finalPath = dbPath || process.env.DB_PATH || path.join(process.cwd(), 'data', 'mcmodding-docs.db');
31
+ console.error(`[SearchService] Using database at: ${finalPath}`);
32
+ this.store = new DocumentStore(finalPath);
33
+ this.embeddingGenerator = new EmbeddingGenerator();
34
+ }
35
+ async search(options) {
36
+ const { query, category, loader, includeCode = true, limit = 10 } = options;
37
+ let { minecraftVersion } = options;
38
+ console.error(`[SearchService] Searching for: "${query}"`);
39
+ const extractedVersion = this.extractVersionFromQuery(query);
40
+ if (!minecraftVersion && extractedVersion) {
41
+ console.error(`[SearchService] Extracted version from query: ${extractedVersion}`);
42
+ minecraftVersion = extractedVersion;
43
+ }
44
+ const tokenized = tokenizeQuery(query);
45
+ console.error(`[SearchService] Tokens: ${tokenized.tokens.join(', ')}`);
46
+ console.error(`[SearchService] FTS Query: ${tokenized.ftsQuery}`);
47
+ const allResults = [];
48
+ const versionFilter = minecraftVersion ? this.getVersionFilter(minecraftVersion) : undefined;
49
+ const chunkResults = this.searchViaChunks(tokenized, {
50
+ category,
51
+ loader,
52
+ minecraftVersion: versionFilter,
53
+ includeCode,
54
+ });
55
+ allResults.push(...chunkResults);
56
+ console.error(`[SearchService] Strategy 1 (chunks): ${chunkResults.length} results`);
57
+ const docResults = this.searchViaDocuments(tokenized, {
58
+ category,
59
+ loader,
60
+ minecraftVersion: versionFilter,
61
+ });
62
+ allResults.push(...docResults);
63
+ console.error(`[SearchService] Strategy 2 (documents): ${docResults.length} results`);
64
+ const sectionResults = this.searchViaSections(tokenized, {
65
+ category,
66
+ loader,
67
+ minecraftVersion: versionFilter,
68
+ });
69
+ allResults.push(...sectionResults);
70
+ console.error(`[SearchService] Strategy 3 (sections): ${sectionResults.length} results`);
71
+ try {
72
+ const embeddingResults = await this.searchViaEmbeddings(query, {
73
+ category,
74
+ loader,
75
+ minecraftVersion: versionFilter,
76
+ limit: 20,
77
+ });
78
+ allResults.push(...embeddingResults);
79
+ console.error(`[SearchService] Strategy 4 (embeddings): ${embeddingResults.length} results`);
80
+ }
81
+ catch (error) {
82
+ console.error('[SearchService] Embedding search failed:', error);
83
+ }
84
+ if (minecraftVersion) {
85
+ this.applyVersionBoost(allResults, minecraftVersion);
86
+ }
87
+ const deduplicated = this.deduplicateByUrlPath(allResults, minecraftVersion, limit * 2);
88
+ console.error(`[SearchService] After URL dedup: ${deduplicated.length} results`);
89
+ const ranked = deduplicated.sort((a, b) => b.score - a.score).slice(0, limit);
90
+ console.error(`[SearchService] After final rank: ${ranked.length} results`);
91
+ const results = ranked.map((r) => this.toSearchResult(r, tokenized));
92
+ return results;
93
+ }
94
+ getVersionFilter(version) {
95
+ if (version.split('.').length === 2) {
96
+ return version + '%';
97
+ }
98
+ return version;
99
+ }
100
+ async searchViaEmbeddings(query, options) {
101
+ const results = [];
102
+ const embedding = await this.embeddingGenerator.generateEmbedding(query);
103
+ const chunks = this.store.findSimilarChunks(embedding, {
104
+ loader: options.loader,
105
+ minecraftVersion: options.minecraftVersion,
106
+ category: options.category,
107
+ limit: options.limit || 20,
108
+ });
109
+ const docMap = new Map();
110
+ for (const chunk of chunks) {
111
+ const score = Math.max(0, chunk.similarity) * 100;
112
+ if (score > 50) {
113
+ const existing = docMap.get(chunk.document_id);
114
+ if (existing) {
115
+ existing.score = Math.max(existing.score, score);
116
+ if (!existing.reasons.includes('semantic match')) {
117
+ existing.reasons.push('semantic match');
118
+ }
119
+ }
120
+ else {
121
+ docMap.set(chunk.document_id, {
122
+ doc: {
123
+ id: chunk.document_id,
124
+ url: chunk.url,
125
+ title: chunk.title,
126
+ content: chunk.content,
127
+ category: chunk.category,
128
+ loader: chunk.loader,
129
+ minecraft_version: chunk.minecraft_version,
130
+ },
131
+ score,
132
+ reasons: ['semantic match'],
133
+ });
134
+ }
135
+ }
136
+ }
137
+ for (const entry of docMap.values()) {
138
+ results.push({
139
+ item: entry.doc,
140
+ score: entry.score,
141
+ matchReasons: entry.reasons,
142
+ });
143
+ }
144
+ return results;
145
+ }
146
+ extractVersionFromQuery(query) {
147
+ const match = query.match(VERSION_PATTERN);
148
+ return match?.[1] ?? null;
149
+ }
150
+ applyVersionBoost(results, targetVersion) {
151
+ const targetParts = targetVersion.split('.').map(Number);
152
+ for (const result of results) {
153
+ const docVersion = result.item.minecraft_version;
154
+ if (!docVersion)
155
+ continue;
156
+ const docParts = docVersion.split('.').map(Number);
157
+ if (docVersion === targetVersion) {
158
+ result.score += 50;
159
+ result.matchReasons.push('exact version match');
160
+ continue;
161
+ }
162
+ if (targetParts[0] === docParts[0] && targetParts[1] === docParts[1]) {
163
+ result.score += 30;
164
+ result.matchReasons.push('same minor version');
165
+ continue;
166
+ }
167
+ if (targetParts[0] === docParts[0]) {
168
+ result.score += 10;
169
+ result.matchReasons.push('same major version');
170
+ }
171
+ }
172
+ }
173
+ deduplicateByUrlPath(results, preferredVersion, limit) {
174
+ const getUrlPathKey = (url) => {
175
+ return url.replace(/\/\d+\.\d+(?:\.\d+)?\//, '/');
176
+ };
177
+ const urlGroups = new Map();
178
+ for (const result of results) {
179
+ const pathKey = getUrlPathKey(result.item.url);
180
+ const existing = urlGroups.get(pathKey) || [];
181
+ existing.push(result);
182
+ urlGroups.set(pathKey, existing);
183
+ }
184
+ const deduplicated = [];
185
+ for (const [, group] of urlGroups) {
186
+ if (group.length === 0)
187
+ continue;
188
+ const sorted = group.sort((a, b) => {
189
+ const aVersion = a.item.minecraft_version || '';
190
+ const bVersion = b.item.minecraft_version || '';
191
+ if (preferredVersion) {
192
+ const aExact = aVersion === preferredVersion ? 1 : 0;
193
+ const bExact = bVersion === preferredVersion ? 1 : 0;
194
+ if (aExact !== bExact)
195
+ return bExact - aExact;
196
+ const aSameMinor = this.isSameMinorVersion(aVersion, preferredVersion) ? 1 : 0;
197
+ const bSameMinor = this.isSameMinorVersion(bVersion, preferredVersion) ? 1 : 0;
198
+ if (aSameMinor !== bSameMinor)
199
+ return bSameMinor - aSameMinor;
200
+ }
201
+ const versionCompare = this.compareVersions(bVersion, aVersion);
202
+ if (versionCompare !== 0)
203
+ return versionCompare;
204
+ return b.score - a.score;
205
+ });
206
+ const best = sorted[0];
207
+ if (best) {
208
+ deduplicated.push(best);
209
+ }
210
+ }
211
+ return deduplicated.slice(0, limit);
212
+ }
213
+ isSameMinorVersion(v1, v2) {
214
+ const p1 = v1.split('.').map(Number);
215
+ const p2 = v2.split('.').map(Number);
216
+ return p1[0] === p2[0] && p1[1] === p2[1];
217
+ }
218
+ compareVersions(v1, v2) {
219
+ const p1 = v1.split('.').map(Number);
220
+ const p2 = v2.split('.').map(Number);
221
+ for (let i = 0; i < Math.max(p1.length, p2.length); i++) {
222
+ const n1 = p1[i] || 0;
223
+ const n2 = p2[i] || 0;
224
+ if (n1 !== n2)
225
+ return n1 - n2;
226
+ }
227
+ return 0;
228
+ }
229
+ searchViaChunks(query, options) {
230
+ const results = [];
231
+ const chunks = this.store.searchChunksAdvanced(query.ftsQuery, query.likePatterns, {
232
+ hasCode: false,
233
+ loader: options.loader,
234
+ minecraftVersion: options.minecraftVersion,
235
+ category: options.category,
236
+ limit: 50,
237
+ });
238
+ const docMap = new Map();
239
+ for (const chunk of chunks) {
240
+ const { score, reasons } = calculateRelevanceScore({
241
+ title: chunk.title,
242
+ content: chunk.content,
243
+ section_heading: chunk.section_heading,
244
+ url: chunk.url,
245
+ category: chunk.category,
246
+ }, query);
247
+ if (score > 0) {
248
+ const existing = docMap.get(chunk.document_id);
249
+ if (existing) {
250
+ existing.score = Math.max(existing.score, score);
251
+ existing.chunks.push(chunk);
252
+ for (const reason of reasons) {
253
+ if (!existing.reasons.includes(reason)) {
254
+ existing.reasons.push(reason);
255
+ }
256
+ }
257
+ }
258
+ else {
259
+ docMap.set(chunk.document_id, {
260
+ doc: {
261
+ id: chunk.document_id,
262
+ url: chunk.url,
263
+ title: chunk.title,
264
+ content: chunk.content,
265
+ category: chunk.category,
266
+ loader: chunk.loader,
267
+ minecraft_version: chunk.minecraft_version,
268
+ },
269
+ chunks: [chunk],
270
+ score,
271
+ reasons,
272
+ });
273
+ }
274
+ }
275
+ }
276
+ for (const entry of docMap.values()) {
277
+ results.push({
278
+ item: entry.doc,
279
+ score: entry.score,
280
+ matchReasons: entry.reasons,
281
+ });
282
+ }
283
+ return results;
284
+ }
285
+ searchViaDocuments(query, options) {
286
+ const results = [];
287
+ const docs = this.store.searchDocumentsLike(query.likePatterns, {
288
+ loader: options.loader,
289
+ minecraftVersion: options.minecraftVersion,
290
+ category: options.category,
291
+ limit: 30,
292
+ });
293
+ for (const doc of docs) {
294
+ const { score, reasons } = calculateRelevanceScore({
295
+ title: doc.title,
296
+ content: doc.content,
297
+ url: doc.url,
298
+ category: doc.category,
299
+ }, query);
300
+ if (score > 0) {
301
+ results.push({
302
+ item: doc,
303
+ score,
304
+ matchReasons: reasons,
305
+ });
306
+ }
307
+ }
308
+ return results;
309
+ }
310
+ searchViaSections(query, options) {
311
+ const results = [];
312
+ const sections = this.store.searchSections(query.tokens.join(' '), {
313
+ loader: options.loader,
314
+ minecraftVersion: options.minecraftVersion,
315
+ category: options.category,
316
+ limit: 30,
317
+ });
318
+ const docMap = new Map();
319
+ for (const section of sections) {
320
+ const { score, reasons } = calculateRelevanceScore({
321
+ title: section.document_title,
322
+ content: section.content,
323
+ section_heading: section.heading,
324
+ url: section.document_url,
325
+ category: section.category,
326
+ }, query);
327
+ if (score > 0) {
328
+ const existing = docMap.get(section.document_id);
329
+ if (!existing || score > existing.score) {
330
+ docMap.set(section.document_id, { section, score, reasons });
331
+ }
332
+ }
333
+ }
334
+ for (const entry of docMap.values()) {
335
+ results.push({
336
+ item: {
337
+ id: entry.section.document_id,
338
+ url: entry.section.document_url,
339
+ title: entry.section.document_title,
340
+ content: entry.section.content,
341
+ category: entry.section.category,
342
+ loader: entry.section.loader,
343
+ minecraft_version: entry.section.minecraft_version,
344
+ },
345
+ score: entry.score,
346
+ matchReasons: entry.reasons,
347
+ });
348
+ }
349
+ return results;
350
+ }
351
+ toSearchResult(result, query) {
352
+ const doc = result.item;
353
+ const sections = this.getSectionsForDocument(doc.id, query);
354
+ const cleanContent = this.cleanContent(doc.content);
355
+ const snippet = this.generateSnippet(cleanContent, query, 300);
356
+ return {
357
+ title: doc.title,
358
+ url: doc.url,
359
+ category: doc.category,
360
+ loader: doc.loader,
361
+ minecraftVersion: doc.minecraft_version,
362
+ relevanceScore: result.score,
363
+ matchReasons: result.matchReasons,
364
+ snippet,
365
+ sections,
366
+ };
367
+ }
368
+ cleanContent(content) {
369
+ let cleaned = content;
370
+ for (const pattern of NOISE_PATTERNS) {
371
+ cleaned = cleaned.replace(pattern, '');
372
+ }
373
+ cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
374
+ cleaned = cleaned.replace(/[ \t]+/g, ' ');
375
+ return cleaned.trim();
376
+ }
377
+ getSectionsForDocument(documentId, query) {
378
+ const sections = [];
379
+ const chunks = this.store.searchChunksAdvanced('', [`%${query.tokens[0] || ''}%`], {
380
+ hasCode: false,
381
+ limit: 100,
382
+ });
383
+ const docChunks = chunks
384
+ .filter((c) => c.document_id === documentId)
385
+ .map((c) => ({
386
+ chunk: c,
387
+ score: calculateRelevanceScore({
388
+ content: c.content,
389
+ section_heading: c.section_heading,
390
+ }, query).score,
391
+ }))
392
+ .filter((c) => c.score > 0)
393
+ .sort((a, b) => b.score - a.score)
394
+ .slice(0, 5);
395
+ const seenHeadings = new Set();
396
+ for (const { chunk } of docChunks) {
397
+ const heading = chunk.section_heading || 'Overview';
398
+ if (!seenHeadings.has(heading)) {
399
+ seenHeadings.add(heading);
400
+ const cleanedContent = this.cleanContent(chunk.content);
401
+ sections.push({
402
+ heading,
403
+ content: this.truncateCodeAware(cleanedContent, 400),
404
+ hasCode: chunk.has_code === 1,
405
+ });
406
+ }
407
+ }
408
+ return sections;
409
+ }
410
+ generateSnippet(content, query, maxLength) {
411
+ const contentLower = content.toLowerCase();
412
+ for (const token of query.tokens) {
413
+ if (token.length < 3)
414
+ continue;
415
+ const index = contentLower.indexOf(token.toLowerCase());
416
+ if (index !== -1) {
417
+ const start = Math.max(0, index - 100);
418
+ const end = Math.min(content.length, index + token.length + 200);
419
+ let snippet = content.substring(start, end);
420
+ if (start > 0) {
421
+ const firstSpace = snippet.indexOf(' ');
422
+ if (firstSpace > 0 && firstSpace < 20) {
423
+ snippet = '...' + snippet.substring(firstSpace + 1);
424
+ }
425
+ else {
426
+ snippet = '...' + snippet;
427
+ }
428
+ }
429
+ if (end < content.length) {
430
+ const lastSpace = snippet.lastIndexOf(' ');
431
+ if (lastSpace > snippet.length - 20) {
432
+ snippet = snippet.substring(0, lastSpace) + '...';
433
+ }
434
+ else {
435
+ snippet = snippet + '...';
436
+ }
437
+ }
438
+ const cleaned = snippet.trim();
439
+ if (cleaned.length > 20) {
440
+ return cleaned;
441
+ }
442
+ }
443
+ }
444
+ return this.truncateCodeAware(content, maxLength);
445
+ }
446
+ truncateCodeAware(content, maxLength) {
447
+ if (content.length <= maxLength) {
448
+ return content;
449
+ }
450
+ const truncated = content.substring(0, maxLength);
451
+ const lastSemicolon = truncated.lastIndexOf(';');
452
+ const lastBrace = truncated.lastIndexOf('}');
453
+ const lastPeriod = truncated.lastIndexOf('.');
454
+ const lastNewline = truncated.lastIndexOf('\n');
455
+ const codeEnd = Math.max(lastSemicolon, lastBrace);
456
+ if (codeEnd > maxLength * 0.5) {
457
+ return truncated.substring(0, codeEnd + 1).trim();
458
+ }
459
+ if (lastPeriod > maxLength * 0.6) {
460
+ return truncated.substring(0, lastPeriod + 1);
461
+ }
462
+ if (lastNewline > maxLength * 0.7) {
463
+ return truncated.substring(0, lastNewline).trim() + '...';
464
+ }
465
+ const lastSpace = truncated.lastIndexOf(' ');
466
+ if (lastSpace > maxLength * 0.8) {
467
+ return truncated.substring(0, lastSpace) + '...';
468
+ }
469
+ return truncated + '...';
470
+ }
471
+ getStats() {
472
+ const stats = this.store.getStats();
473
+ const versions = this.store.getAllVersions();
474
+ return {
475
+ totalDocuments: stats.totalDocuments,
476
+ totalSections: stats.totalSections,
477
+ categories: Object.keys(stats.loaders),
478
+ loaders: ['fabric', 'neoforge', 'shared'],
479
+ versions,
480
+ };
481
+ }
482
+ formatForAI(results, query) {
483
+ if (results.length === 0) {
484
+ return `No documentation found for "${query}".`;
485
+ }
486
+ let output = `Found ${results.length} relevant documentation page${results.length > 1 ? 's' : ''} for "${query}":\n\n`;
487
+ for (let i = 0; i < results.length; i++) {
488
+ const result = results[i];
489
+ if (!result)
490
+ continue;
491
+ output += `## ${i + 1}. ${result.title}\n\n`;
492
+ output += `**URL:** ${result.url}\n`;
493
+ output += `**Category:** ${result.category}\n`;
494
+ output += `**Loader:** ${result.loader}\n`;
495
+ if (result.minecraftVersion) {
496
+ output += `**Minecraft Version:** ${result.minecraftVersion}\n`;
497
+ }
498
+ output += `**Relevance:** ${result.relevanceScore} (${result.matchReasons.slice(0, 3).join(', ')})\n\n`;
499
+ if (result.snippet) {
500
+ output += `**Summary:**\n${result.snippet}\n\n`;
501
+ }
502
+ if (result.sections.length > 0) {
503
+ output += `**Key Sections:**\n`;
504
+ for (const section of result.sections.slice(0, 3)) {
505
+ const cleanedSection = this.truncateCodeAware(section.content, 150);
506
+ output += `- **${section.heading}**${section.hasCode ? ' (has code)' : ''}: ${cleanedSection}\n`;
507
+ }
508
+ output += '\n';
509
+ }
510
+ output += '---\n\n';
511
+ }
512
+ output += `\n**Tip:** Use \`get_example\` tool with specific topics to get code examples from these pages.\n`;
513
+ return output;
514
+ }
515
+ close() {
516
+ this.store.close();
517
+ }
518
+ }
519
+ //# sourceMappingURL=search-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-service.js","sourceRoot":"","sources":["../../src/services/search-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface TokenizedQuery {
2
+ original: string;
3
+ tokens: string[];
4
+ expandedTokens: string[];
5
+ ftsQuery: string;
6
+ likePatterns: string[];
7
+ codePatterns: string[];
8
+ }
9
+ export declare function tokenizeQuery(query: string): TokenizedQuery;
10
+ export interface ScoredResult<T> {
11
+ item: T;
12
+ score: number;
13
+ matchReasons: string[];
14
+ }
15
+ export declare function calculateRelevanceScore(item: {
16
+ title?: string;
17
+ content?: string;
18
+ section_heading?: string | null;
19
+ section_content?: string;
20
+ code?: string;
21
+ caption?: string | null;
22
+ category?: string;
23
+ url?: string;
24
+ }, query: TokenizedQuery): {
25
+ score: number;
26
+ reasons: string[];
27
+ };
28
+ export declare function deduplicateAndRank<T extends {
29
+ code?: string;
30
+ url?: string;
31
+ section_heading?: string | null;
32
+ }>(results: ScoredResult<T>[], limit: number): ScoredResult<T>[];
33
+ export declare function normalizeScore(score: number, maxPossible?: number): number;
34
+ //# sourceMappingURL=search-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-utils.d.ts","sourceRoot":"","sources":["../../src/services/search-utils.ts"],"names":[],"mappings":"AAgFA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAqD3D;AAmFD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAKD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,EACD,KAAK,EAAE,cAAc,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA6FtC;AAKD,wBAAgB,kBAAkB,CAChC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1E,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CA2B9D;AAKD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,MAAY,GAAG,MAAM,CAE/E"}