@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.
- package/README.md +220 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +153 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +375 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/api-parser.d.ts +23 -0
- package/dist/indexer/api-parser.d.ts.map +1 -0
- package/dist/indexer/api-parser.js +404 -0
- package/dist/indexer/api-parser.js.map +1 -0
- package/dist/indexer/doc-parser.d.ts +38 -0
- package/dist/indexer/doc-parser.d.ts.map +1 -0
- package/dist/indexer/doc-parser.js +359 -0
- package/dist/indexer/doc-parser.js.map +1 -0
- package/dist/indexer/index.d.ts +54 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +151 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/search.d.ts +36 -0
- package/dist/indexer/search.d.ts.map +1 -0
- package/dist/indexer/search.js +511 -0
- package/dist/indexer/search.js.map +1 -0
- package/dist/tools/get-api.d.ts +26 -0
- package/dist/tools/get-api.d.ts.map +1 -0
- package/dist/tools/get-api.js +229 -0
- package/dist/tools/get-api.js.map +1 -0
- package/dist/tools/list-apis.d.ts +32 -0
- package/dist/tools/list-apis.d.ts.map +1 -0
- package/dist/tools/list-apis.js +210 -0
- package/dist/tools/list-apis.js.map +1 -0
- package/dist/tools/search-docs.d.ts +32 -0
- package/dist/tools/search-docs.d.ts.map +1 -0
- package/dist/tools/search-docs.js +148 -0
- package/dist/tools/search-docs.js.map +1 -0
- package/dist/types/index.d.ts +166 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- 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":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyGH,8CAGC;AAKD,oDA8FC;AAKD,gDA2BC;AAQD,oCAcC;AAQD,kCAsBC;AAKD,wEAuEC;AA7WD,uCAAyB;AACzB,2CAA6B;AAG7B;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,IACE,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;QACtC,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACxC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC;QACtC,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAC1C,CAAC;QACD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IACE,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;QACjC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9B,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,EACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IACE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC7B,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,yCAAyC;IACzC,MAAM,aAAa,GAAG;QACpB,KAAK;QACL,QAAQ;QACR,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,WAAW;QACX,WAAW;KACZ,CAAC;IACF,MAAM,iBAAiB,GAAG;QACxB,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,UAAU;QACV,aAAa;KACd,CAAC;IAEF,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAChD,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC3B,CAAC;IAEF,IAAI,MAAM;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,UAAU;QAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE1C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAe;IAC3C,+CAA+C;IAC/C,MAAM,UAAU,GACd,uEAAuE,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAEhD,qCAAqC;IACrC,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,kCAAkC;QAClC,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,CACL,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAClK,CAAC,CAAC,MAAM,GAAG,CAAC,CACb,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,OAAe,EACf,SAAiB,SAAS;IAE1B,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,4BAA4B;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,YAAY,GAKL,IAAI,CAAC;IAChB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,mCAAmC;IACnC,MAAM,WAAW,GAAoC,EAAE,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,oBAAoB;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAErD,IAAI,YAAY,EAAE,CAAC;YACjB,sBAAsB;YACtB,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE;wBACnD,MAAM;wBACN,KAAK,EAAE,YAAY,CAAC,KAAK;wBACzB,OAAO,EAAE,YAAY;wBACrB,IAAI,EAAE,OAAO;wBACb,YAAY,EAAE,YAAY,CAAC,KAAK;wBAChC,QAAQ,EAAE,YAAY,CAAC,QAAQ;wBAC/B,aAAa,EAAE,oBAAoB,CAAC,YAAY,CAAC;wBACjD,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC;qBAC1C,CAAC,CAAC;oBACH,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAErC,sBAAsB;YACtB,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBACpF,WAAW,CAAC,GAAG,EAAE,CAAC;YACpB,CAAC;YAED,MAAM,QAAQ,GACZ,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;gBACxC,CAAC,CAAC,SAAS,CAAC;YAEhB,YAAY,GAAG;gBACb,KAAK;gBACL,OAAO,EAAE,EAAE;gBACX,KAAK;gBACL,QAAQ;aACT,CAAC;YAEF,sCAAsC;YACtC,WAAW,CAAC,IAAI,CAAC;gBACf,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE;gBACnD,KAAK;aACN,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,4BAA4B;YAC5B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE;gBACnD,MAAM;gBACN,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,YAAY,CAAC,KAAK;gBAChC,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,aAAa,EAAE,oBAAoB,CAAC,YAAY,CAAC;gBACjD,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAyB,EAAE,CAAC;IAExC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,mCAAmC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,WAAmB;IAC9C,MAAM,aAAa,GAAG;QACpB,2DAA2D;QAC3D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;QAChD,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;QAC1C,eAAe;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;KAC/B,CAAC;IAEF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,WAAmB;IAC7C,MAAM,aAAa,GAAG;QACpB,2DAA2D;QAC3D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QACrD,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAC/C,eAAe;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;KACpC,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAgB,8BAA8B;IAC5C,OAAO;QACL;YACE,EAAE,EAAE,0BAA0B;YAC9B,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,0BAA0B;YACjC,OAAO,EAAE;;;;;;;;;;;;;;;;OAgBR,CAAC,IAAI,EAAE;YACR,IAAI,EAAE,iBAAiB;YACvB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE;gBACb,eAAe;gBACf,mBAAmB;gBACnB,WAAW;gBACX,cAAc;gBACd,oBAAoB;gBACpB,YAAY;gBACZ,cAAc;gBACd,eAAe;gBACf,iBAAiB;aAClB;YACD,SAAS,EAAE,CAAC,KAAK,CAAC;SACnB;QACD;YACE,EAAE,EAAE,8BAA8B;YAClC,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,8BAA8B;YACrC,OAAO,EAAE;;;;;;;;;;;;;;;OAeR,CAAC,IAAI,EAAE;YACR,IAAI,EAAE,iBAAiB;YACvB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE;gBACb,eAAe;gBACf,iBAAiB;gBACjB,aAAa;gBACb,qBAAqB;gBACrB,cAAc;gBACd,WAAW;aACZ;YACD,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|