@react-native-nitro-device-info/mcp-server 1.0.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 (42) hide show
  1. package/README.md +220 -0
  2. package/dist/cli/init.d.ts +12 -0
  3. package/dist/cli/init.d.ts.map +1 -0
  4. package/dist/cli/init.js +153 -0
  5. package/dist/cli/init.js.map +1 -0
  6. package/dist/index.d.ts +14 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +375 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/indexer/api-parser.d.ts +23 -0
  11. package/dist/indexer/api-parser.d.ts.map +1 -0
  12. package/dist/indexer/api-parser.js +404 -0
  13. package/dist/indexer/api-parser.js.map +1 -0
  14. package/dist/indexer/doc-parser.d.ts +38 -0
  15. package/dist/indexer/doc-parser.d.ts.map +1 -0
  16. package/dist/indexer/doc-parser.js +359 -0
  17. package/dist/indexer/doc-parser.js.map +1 -0
  18. package/dist/indexer/index.d.ts +54 -0
  19. package/dist/indexer/index.d.ts.map +1 -0
  20. package/dist/indexer/index.js +151 -0
  21. package/dist/indexer/index.js.map +1 -0
  22. package/dist/indexer/search.d.ts +36 -0
  23. package/dist/indexer/search.d.ts.map +1 -0
  24. package/dist/indexer/search.js +511 -0
  25. package/dist/indexer/search.js.map +1 -0
  26. package/dist/tools/get-api.d.ts +26 -0
  27. package/dist/tools/get-api.d.ts.map +1 -0
  28. package/dist/tools/get-api.js +229 -0
  29. package/dist/tools/get-api.js.map +1 -0
  30. package/dist/tools/list-apis.d.ts +32 -0
  31. package/dist/tools/list-apis.d.ts.map +1 -0
  32. package/dist/tools/list-apis.js +210 -0
  33. package/dist/tools/list-apis.js.map +1 -0
  34. package/dist/tools/search-docs.d.ts +32 -0
  35. package/dist/tools/search-docs.d.ts.map +1 -0
  36. package/dist/tools/search-docs.js +148 -0
  37. package/dist/tools/search-docs.js.map +1 -0
  38. package/dist/types/index.d.ts +166 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/index.js +9 -0
  41. package/dist/types/index.js.map +1 -0
  42. package/package.json +59 -0
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ /**
3
+ * Documentation Parser
4
+ *
5
+ * Parses markdown documentation files with heading-based chunking
6
+ * for searchable documentation sections.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.parseMarkdownFile = parseMarkdownFile;
43
+ exports.parseMarkdownContent = parseMarkdownContent;
44
+ exports.parseDocsDirectory = parseDocsDirectory;
45
+ exports.getDocsPaths = getDocsPaths;
46
+ exports.parseReadme = parseReadme;
47
+ exports.createPlatformLimitationChunks = createPlatformLimitationChunks;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ /**
51
+ * Determine document type from file path and content
52
+ */
53
+ function determineDocType(filePath, content) {
54
+ const fileNameLower = filePath.toLowerCase();
55
+ const contentLower = content.toLowerCase();
56
+ if (fileNameLower.includes('troubleshoot') ||
57
+ contentLower.includes('troubleshooting') ||
58
+ contentLower.includes('common issues') ||
59
+ contentLower.includes('known limitations')) {
60
+ return 'troubleshooting';
61
+ }
62
+ if (fileNameLower.includes('example') ||
63
+ fileNameLower.includes('demo') ||
64
+ contentLower.includes('example usage')) {
65
+ return 'example';
66
+ }
67
+ if (fileNameLower.includes('api') ||
68
+ fileNameLower.includes('reference')) {
69
+ return 'api';
70
+ }
71
+ return 'guide';
72
+ }
73
+ /**
74
+ * Extract platform mentions from content
75
+ */
76
+ function extractPlatforms(content) {
77
+ const platforms = [];
78
+ const contentLower = content.toLowerCase();
79
+ // Check for platform-specific indicators
80
+ const iosIndicators = [
81
+ 'ios',
82
+ 'iphone',
83
+ 'ipad',
84
+ 'swift',
85
+ 'xcode',
86
+ 'apple',
87
+ 'cocoapods',
88
+ 'simulator',
89
+ ];
90
+ const androidIndicators = [
91
+ 'android',
92
+ 'kotlin',
93
+ 'gradle',
94
+ 'java',
95
+ 'emulator',
96
+ 'google play',
97
+ ];
98
+ const hasIos = iosIndicators.some((ind) => contentLower.includes(ind));
99
+ const hasAndroid = androidIndicators.some((ind) => contentLower.includes(ind));
100
+ if (hasIos)
101
+ platforms.push('ios');
102
+ if (hasAndroid)
103
+ platforms.push('android');
104
+ return platforms;
105
+ }
106
+ /**
107
+ * Extract API names mentioned in content
108
+ */
109
+ function extractMentionedApis(content) {
110
+ // Match camelCase or PascalCase API-like names
111
+ const apiPattern = /\b(get[A-Z]\w+|is[A-Z]\w+|has[A-Z]\w+|sync[A-Z]\w+|[a-z]+[A-Z]\w*)\b/g;
112
+ const matches = content.match(apiPattern) || [];
113
+ // Filter to unique, likely API names
114
+ const uniqueApis = new Set(matches.filter((m) => {
115
+ // Filter out common non-API words
116
+ const lower = m.toLowerCase();
117
+ return (!['true', 'false', 'null', 'undefined', 'return', 'import', 'export', 'const', 'let', 'var', 'function', 'async', 'await', 'typeof', 'instanceof'].includes(lower) &&
118
+ m.length > 3);
119
+ }));
120
+ return Array.from(uniqueApis);
121
+ }
122
+ /**
123
+ * Parse a single markdown file into documentation chunks
124
+ */
125
+ function parseMarkdownFile(filePath) {
126
+ const content = fs.readFileSync(filePath, 'utf-8');
127
+ return parseMarkdownContent(content, filePath);
128
+ }
129
+ /**
130
+ * Parse markdown content string into documentation chunks
131
+ */
132
+ function parseMarkdownContent(content, source = 'unknown') {
133
+ const chunks = [];
134
+ const docType = determineDocType(source, content);
135
+ // Split content by headings
136
+ const lines = content.split('\n');
137
+ let currentChunk = null;
138
+ let chunkIndex = 0;
139
+ // Track parent chain for hierarchy
140
+ const parentStack = [];
141
+ for (const line of lines) {
142
+ // Check for heading
143
+ const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
144
+ if (headingMatch) {
145
+ // Save previous chunk
146
+ if (currentChunk && currentChunk.content.length > 0) {
147
+ const chunkContent = currentChunk.content.join('\n').trim();
148
+ if (chunkContent.length > 0) {
149
+ chunks.push({
150
+ id: `${path.basename(source, '.md')}-${chunkIndex}`,
151
+ source,
152
+ title: currentChunk.title,
153
+ content: chunkContent,
154
+ type: docType,
155
+ headingLevel: currentChunk.level,
156
+ parentId: currentChunk.parentId,
157
+ mentionedApis: extractMentionedApis(chunkContent),
158
+ platforms: extractPlatforms(chunkContent),
159
+ });
160
+ chunkIndex++;
161
+ }
162
+ }
163
+ const level = headingMatch[1].length;
164
+ const title = headingMatch[2].trim();
165
+ // Update parent stack
166
+ while (parentStack.length > 0 && parentStack[parentStack.length - 1].level >= level) {
167
+ parentStack.pop();
168
+ }
169
+ const parentId = parentStack.length > 0
170
+ ? parentStack[parentStack.length - 1].id
171
+ : undefined;
172
+ currentChunk = {
173
+ title,
174
+ content: [],
175
+ level,
176
+ parentId,
177
+ };
178
+ // Add current heading to parent stack
179
+ parentStack.push({
180
+ id: `${path.basename(source, '.md')}-${chunkIndex}`,
181
+ level,
182
+ });
183
+ }
184
+ else if (currentChunk) {
185
+ // Add line to current chunk
186
+ currentChunk.content.push(line);
187
+ }
188
+ }
189
+ // Save last chunk
190
+ if (currentChunk && currentChunk.content.length > 0) {
191
+ const chunkContent = currentChunk.content.join('\n').trim();
192
+ if (chunkContent.length > 0) {
193
+ chunks.push({
194
+ id: `${path.basename(source, '.md')}-${chunkIndex}`,
195
+ source,
196
+ title: currentChunk.title,
197
+ content: chunkContent,
198
+ type: docType,
199
+ headingLevel: currentChunk.level,
200
+ parentId: currentChunk.parentId,
201
+ mentionedApis: extractMentionedApis(chunkContent),
202
+ platforms: extractPlatforms(chunkContent),
203
+ });
204
+ }
205
+ }
206
+ return chunks;
207
+ }
208
+ /**
209
+ * Parse all markdown files in a directory
210
+ */
211
+ function parseDocsDirectory(dirPath) {
212
+ const chunks = [];
213
+ if (!fs.existsSync(dirPath)) {
214
+ console.warn(`Documentation directory not found: ${dirPath}`);
215
+ return chunks;
216
+ }
217
+ const files = fs.readdirSync(dirPath);
218
+ for (const file of files) {
219
+ const filePath = path.join(dirPath, file);
220
+ const stat = fs.statSync(filePath);
221
+ if (stat.isDirectory()) {
222
+ // Recursively parse subdirectories
223
+ chunks.push(...parseDocsDirectory(filePath));
224
+ }
225
+ else if (file.endsWith('.md') || file.endsWith('.mdx')) {
226
+ try {
227
+ chunks.push(...parseMarkdownFile(filePath));
228
+ }
229
+ catch (error) {
230
+ console.warn(`Failed to parse ${filePath}: ${error}`);
231
+ }
232
+ }
233
+ }
234
+ return chunks;
235
+ }
236
+ /**
237
+ * Get documentation paths relative to package root
238
+ *
239
+ * When running from dist (packages/mcp-server/dist), we need to go up 3 levels
240
+ * to reach the repository root where docs/ lives.
241
+ */
242
+ function getDocsPaths(packageRoot) {
243
+ const possiblePaths = [
244
+ // From packages/mcp-server/dist -> repo root (3 levels up)
245
+ path.join(packageRoot, '..', '..', '..', 'docs', 'docs'),
246
+ path.join(packageRoot, '..', '..', '..', 'docs'),
247
+ // From packages/mcp-server -> repo root (2 levels up)
248
+ path.join(packageRoot, '..', '..', 'docs', 'docs'),
249
+ path.join(packageRoot, '..', '..', 'docs'),
250
+ // Legacy paths
251
+ path.join(packageRoot, '..', 'docs'),
252
+ path.join(packageRoot, 'docs'),
253
+ ];
254
+ return possiblePaths.filter((p) => fs.existsSync(p));
255
+ }
256
+ /**
257
+ * Parse README file for quick reference content
258
+ *
259
+ * When running from dist (packages/mcp-server/dist), we need to go up 3 levels
260
+ * to reach the repository root where README.md lives.
261
+ */
262
+ function parseReadme(packageRoot) {
263
+ const possiblePaths = [
264
+ // From packages/mcp-server/dist -> repo root (3 levels up)
265
+ path.join(packageRoot, '..', '..', '..', 'README.md'),
266
+ // From packages/mcp-server -> repo root (2 levels up)
267
+ path.join(packageRoot, '..', '..', 'README.md'),
268
+ // Legacy paths
269
+ path.join(packageRoot, '..', 'README.md'),
270
+ path.join(packageRoot, 'README.md'),
271
+ ];
272
+ for (const readmePath of possiblePaths) {
273
+ if (fs.existsSync(readmePath)) {
274
+ try {
275
+ return parseMarkdownFile(readmePath);
276
+ }
277
+ catch (error) {
278
+ console.warn(`Failed to parse README: ${error}`);
279
+ }
280
+ }
281
+ }
282
+ return [];
283
+ }
284
+ /**
285
+ * Create platform limitation documentation chunks
286
+ */
287
+ function createPlatformLimitationChunks() {
288
+ return [
289
+ {
290
+ id: 'platform-ios-limitations',
291
+ source: 'internal',
292
+ title: 'iOS Platform Limitations',
293
+ content: `
294
+ Known iOS limitations and platform-specific behaviors:
295
+
296
+ - **getMacAddress**: Always returns "02:00:00:00:00:00" due to iOS privacy restrictions since iOS 7
297
+ - **getIsAirplaneMode**: Returns false on iOS (not accessible due to privacy APIs)
298
+ - **androidId, serialNumber**: Returns "unknown" on iOS (Android-specific)
299
+ - **lastUpdateTimeSync**: Returns -1 on iOS
300
+ - **isEmulator**: Detects iOS Simulator
301
+ - **getIpAddress on Simulator**: May return empty or localhost depending on network configuration
302
+ - **getBrightness**: Works on iOS, returns -1 on Android
303
+ - **isDisplayZoomed**: iOS-only feature
304
+
305
+ For iOS-specific issues, check that:
306
+ 1. Your app has the required permissions in Info.plist
307
+ 2. You're testing on a physical device for hardware-dependent features
308
+ 3. Network settings are properly configured for IP/carrier APIs
309
+ `.trim(),
310
+ type: 'troubleshooting',
311
+ headingLevel: 1,
312
+ mentionedApis: [
313
+ 'getMacAddress',
314
+ 'getIsAirplaneMode',
315
+ 'androidId',
316
+ 'serialNumber',
317
+ 'lastUpdateTimeSync',
318
+ 'isEmulator',
319
+ 'getIpAddress',
320
+ 'getBrightness',
321
+ 'isDisplayZoomed',
322
+ ],
323
+ platforms: ['ios'],
324
+ },
325
+ {
326
+ id: 'platform-android-limitations',
327
+ source: 'internal',
328
+ title: 'Android Platform Limitations',
329
+ content: `
330
+ Known Android limitations and platform-specific behaviors:
331
+
332
+ - **getBrightness**: Returns -1 on Android (iOS-only)
333
+ - **isDisplayZoomed**: Returns false on Android (iOS-only)
334
+ - **getHasNotch**: Complex detection not fully implemented for all Android devices
335
+ - **getHasDynamicIsland**: Returns false on Android (iPhone-only feature)
336
+ - **serialNumber**: Requires READ_PHONE_STATE permission on Android 8.0+
337
+ - **androidId**: Unique per device/app/user combination, may reset on factory reset
338
+
339
+ For Android-specific issues, check that:
340
+ 1. Required permissions are declared in AndroidManifest.xml
341
+ 2. Runtime permissions are requested for sensitive APIs
342
+ 3. Google Play Services is available for GMS-dependent features
343
+ 4. Minimum API level requirements are met
344
+ `.trim(),
345
+ type: 'troubleshooting',
346
+ headingLevel: 1,
347
+ mentionedApis: [
348
+ 'getBrightness',
349
+ 'isDisplayZoomed',
350
+ 'getHasNotch',
351
+ 'getHasDynamicIsland',
352
+ 'serialNumber',
353
+ 'androidId',
354
+ ],
355
+ platforms: ['android'],
356
+ },
357
+ ];
358
+ }
359
+ //# sourceMappingURL=doc-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-parser.js","sourceRoot":"","sources":["../../src/indexer/doc-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Search Index Builder
3
+ *
4
+ * Combines API and documentation parsers to build a complete search index.
5
+ */
6
+ import type { SearchIndex, DocumentationChunk } from '../types/index.js';
7
+ export { buildSearchIndex, search, findSimilarApis, levenshteinDistance } from './search.js';
8
+ export { parseDeviceInfoFile, parseDeviceInfoContent } from './api-parser.js';
9
+ export { parseMarkdownFile, parseMarkdownContent, parseDocsDirectory } from './doc-parser.js';
10
+ /**
11
+ * Index building options
12
+ */
13
+ export interface IndexOptions {
14
+ /** Path to DeviceInfo.nitro.ts (auto-detected if not provided) */
15
+ deviceInfoPath?: string;
16
+ /** Paths to documentation directories (auto-detected if not provided) */
17
+ docsPaths?: string[];
18
+ /** Include README in index */
19
+ includeReadme?: boolean;
20
+ /** Include platform limitation documentation */
21
+ includePlatformLimitations?: boolean;
22
+ /** DeviceInfo content string (for testing without file access) */
23
+ deviceInfoContent?: string;
24
+ /** Documentation chunks (for testing without file access) */
25
+ documentationChunks?: DocumentationChunk[];
26
+ }
27
+ /**
28
+ * Build a complete search index from source files
29
+ */
30
+ export declare function buildIndex(packageRoot?: string, options?: IndexOptions): SearchIndex;
31
+ /**
32
+ * Get index statistics
33
+ */
34
+ export declare function getIndexStats(index: SearchIndex): {
35
+ apiCount: number;
36
+ chunkCount: number;
37
+ totalDocuments: number;
38
+ averageDocumentLength: number;
39
+ termCount: number;
40
+ categoryCounts: Record<string, number>;
41
+ };
42
+ /**
43
+ * Validate index meets minimum requirements
44
+ */
45
+ export declare function validateIndex(index: SearchIndex): {
46
+ valid: boolean;
47
+ errors: string[];
48
+ warnings: string[];
49
+ };
50
+ /**
51
+ * Create index from DeviceInfo content string (for embedded content)
52
+ */
53
+ export declare function createEmbeddedIndex(deviceInfoContent: string): SearchIndex;
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAiB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAUxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,gDAAgD;IAChD,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,6DAA6D;IAC7D,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,WAAW,GAAE,MAAsB,EACnC,OAAO,GAAE,YAAiB,GACzB,WAAW,CAsDb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAcA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG;IACjD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CA8CA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,CAI1E"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * Search Index Builder
4
+ *
5
+ * Combines API and documentation parsers to build a complete search index.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.parseDocsDirectory = exports.parseMarkdownContent = exports.parseMarkdownFile = exports.parseDeviceInfoContent = exports.parseDeviceInfoFile = exports.levenshteinDistance = exports.findSimilarApis = exports.search = exports.buildSearchIndex = void 0;
9
+ exports.buildIndex = buildIndex;
10
+ exports.getIndexStats = getIndexStats;
11
+ exports.validateIndex = validateIndex;
12
+ exports.createEmbeddedIndex = createEmbeddedIndex;
13
+ const api_parser_js_1 = require("./api-parser.js");
14
+ const doc_parser_js_1 = require("./doc-parser.js");
15
+ const search_js_1 = require("./search.js");
16
+ var search_js_2 = require("./search.js");
17
+ Object.defineProperty(exports, "buildSearchIndex", { enumerable: true, get: function () { return search_js_2.buildSearchIndex; } });
18
+ Object.defineProperty(exports, "search", { enumerable: true, get: function () { return search_js_2.search; } });
19
+ Object.defineProperty(exports, "findSimilarApis", { enumerable: true, get: function () { return search_js_2.findSimilarApis; } });
20
+ Object.defineProperty(exports, "levenshteinDistance", { enumerable: true, get: function () { return search_js_2.levenshteinDistance; } });
21
+ var api_parser_js_2 = require("./api-parser.js");
22
+ Object.defineProperty(exports, "parseDeviceInfoFile", { enumerable: true, get: function () { return api_parser_js_2.parseDeviceInfoFile; } });
23
+ Object.defineProperty(exports, "parseDeviceInfoContent", { enumerable: true, get: function () { return api_parser_js_2.parseDeviceInfoContent; } });
24
+ var doc_parser_js_2 = require("./doc-parser.js");
25
+ Object.defineProperty(exports, "parseMarkdownFile", { enumerable: true, get: function () { return doc_parser_js_2.parseMarkdownFile; } });
26
+ Object.defineProperty(exports, "parseMarkdownContent", { enumerable: true, get: function () { return doc_parser_js_2.parseMarkdownContent; } });
27
+ Object.defineProperty(exports, "parseDocsDirectory", { enumerable: true, get: function () { return doc_parser_js_2.parseDocsDirectory; } });
28
+ /**
29
+ * Build a complete search index from source files
30
+ */
31
+ function buildIndex(packageRoot = process.cwd(), options = {}) {
32
+ const apis = [];
33
+ const chunks = [];
34
+ // Parse DeviceInfo.nitro.ts
35
+ if (options.deviceInfoContent) {
36
+ // Use provided content (for testing)
37
+ apis.push(...(0, api_parser_js_1.parseDeviceInfoContent)(options.deviceInfoContent));
38
+ }
39
+ else {
40
+ try {
41
+ const deviceInfoPath = options.deviceInfoPath || (0, api_parser_js_1.getDeviceInfoPath)(packageRoot);
42
+ apis.push(...(0, api_parser_js_1.parseDeviceInfoFile)(deviceInfoPath));
43
+ console.error(`Indexed ${apis.length} APIs from DeviceInfo.nitro.ts`);
44
+ }
45
+ catch (error) {
46
+ console.error(`Warning: Could not parse DeviceInfo.nitro.ts: ${error}`);
47
+ }
48
+ }
49
+ // Parse documentation
50
+ if (options.documentationChunks) {
51
+ // Use provided chunks (for testing)
52
+ chunks.push(...options.documentationChunks);
53
+ }
54
+ else {
55
+ const docsPaths = options.docsPaths || (0, doc_parser_js_1.getDocsPaths)(packageRoot);
56
+ for (const docsPath of docsPaths) {
57
+ try {
58
+ const docChunks = (0, doc_parser_js_1.parseDocsDirectory)(docsPath);
59
+ chunks.push(...docChunks);
60
+ console.error(`Indexed ${docChunks.length} documentation chunks from ${docsPath}`);
61
+ }
62
+ catch (error) {
63
+ console.error(`Warning: Could not parse docs at ${docsPath}: ${error}`);
64
+ }
65
+ }
66
+ }
67
+ // Parse README
68
+ if (options.includeReadme !== false && !options.documentationChunks) {
69
+ try {
70
+ const readmeChunks = (0, doc_parser_js_1.parseReadme)(packageRoot);
71
+ chunks.push(...readmeChunks);
72
+ console.error(`Indexed ${readmeChunks.length} README chunks`);
73
+ }
74
+ catch (error) {
75
+ console.error(`Warning: Could not parse README: ${error}`);
76
+ }
77
+ }
78
+ // Add platform limitation documentation
79
+ if (options.includePlatformLimitations !== false) {
80
+ chunks.push(...(0, doc_parser_js_1.createPlatformLimitationChunks)());
81
+ }
82
+ // Build and return search index
83
+ return (0, search_js_1.buildSearchIndex)(apis, chunks);
84
+ }
85
+ /**
86
+ * Get index statistics
87
+ */
88
+ function getIndexStats(index) {
89
+ const categoryCounts = {};
90
+ for (const [, api] of index.apis) {
91
+ categoryCounts[api.category] = (categoryCounts[api.category] || 0) + 1;
92
+ }
93
+ return {
94
+ apiCount: index.apis.size,
95
+ chunkCount: index.chunks.length,
96
+ totalDocuments: index.documentCount,
97
+ averageDocumentLength: Math.round(index.averageDocumentLength),
98
+ termCount: index.invertedIndex.size,
99
+ categoryCounts,
100
+ };
101
+ }
102
+ /**
103
+ * Validate index meets minimum requirements
104
+ */
105
+ function validateIndex(index) {
106
+ const errors = [];
107
+ const warnings = [];
108
+ // Check minimum API count (spec requires 80+)
109
+ if (index.apis.size < 80) {
110
+ errors.push(`API count (${index.apis.size}) is below minimum requirement (80)`);
111
+ }
112
+ // Check for empty index
113
+ if (index.documentCount === 0) {
114
+ errors.push('Index is empty - no documents indexed');
115
+ }
116
+ // Check for missing categories
117
+ const expectedCategories = [
118
+ 'device-info',
119
+ 'battery',
120
+ 'memory',
121
+ 'storage',
122
+ 'network',
123
+ 'capabilities',
124
+ ];
125
+ for (const category of expectedCategories) {
126
+ const hasCategory = Array.from(index.apis.values()).some((api) => api.category === category);
127
+ if (!hasCategory) {
128
+ warnings.push(`No APIs found in category: ${category}`);
129
+ }
130
+ }
131
+ // Check for APIs without descriptions
132
+ for (const [name, api] of index.apis) {
133
+ if (!api.description || api.description.length < 10) {
134
+ warnings.push(`API '${name}' has missing or short description`);
135
+ }
136
+ }
137
+ return {
138
+ valid: errors.length === 0,
139
+ errors,
140
+ warnings,
141
+ };
142
+ }
143
+ /**
144
+ * Create index from DeviceInfo content string (for embedded content)
145
+ */
146
+ function createEmbeddedIndex(deviceInfoContent) {
147
+ const apis = (0, api_parser_js_1.parseDeviceInfoContent)(deviceInfoContent);
148
+ const chunks = (0, doc_parser_js_1.createPlatformLimitationChunks)();
149
+ return (0, search_js_1.buildSearchIndex)(apis, chunks);
150
+ }
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * BM25 Search Implementation
3
+ *
4
+ * Implements the BM25 (Best Matching 25) ranking function for
5
+ * document retrieval with term frequency and document length normalization.
6
+ */
7
+ import type { SearchIndex, SearchResult, ApiDefinition, DocumentationChunk, SearchFilters } from '../types/index.js';
8
+ /**
9
+ * Tokenize text into normalized terms
10
+ */
11
+ export declare function tokenize(text: string): string[];
12
+ /**
13
+ * Apply simple stemming (suffix stripping)
14
+ */
15
+ export declare function stem(word: string): string;
16
+ /**
17
+ * Tokenize and stem text
18
+ */
19
+ export declare function processText(text: string): string[];
20
+ /**
21
+ * Search the index with BM25 ranking
22
+ */
23
+ export declare function search(index: SearchIndex, query: string, limit?: number, filters?: SearchFilters): SearchResult[];
24
+ /**
25
+ * Build search index from APIs and documentation chunks
26
+ */
27
+ export declare function buildSearchIndex(apis: ApiDefinition[], chunks: DocumentationChunk[]): SearchIndex;
28
+ /**
29
+ * Calculate Levenshtein distance between two strings
30
+ */
31
+ export declare function levenshteinDistance(a: string, b: string): number;
32
+ /**
33
+ * Find similar API names using fuzzy matching
34
+ */
35
+ export declare function findSimilarApis(query: string, apis: Map<string, ApiDefinition>, maxDistance?: number, limit?: number): ApiDefinition[];
36
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/indexer/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,aAAa,EACd,MAAM,mBAAmB,CAAC;AA2H3B;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAElD;AA+ED;;GAEG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAU,EACjB,OAAO,GAAE,aAAkB,GAC1B,YAAY,EAAE,CAiJhB;AAwED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EAAE,EACrB,MAAM,EAAE,kBAAkB,EAAE,GAC3B,WAAW,CAwEb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAChC,WAAW,GAAE,MAAU,EACvB,KAAK,GAAE,MAAU,GAChB,aAAa,EAAE,CAkCjB"}