@neuledge/context 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.
package/dist/cli.js ADDED
@@ -0,0 +1,454 @@
1
+ #!/usr/bin/env node
2
+ import { copyFileSync, createWriteStream, existsSync, mkdirSync, readdirSync, renameSync, statSync, unlinkSync, } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { basename, join, resolve } from "node:path";
5
+ import { pipeline } from "node:stream/promises";
6
+ import { Command } from "commander";
7
+ import { cloneRepository, detectLocalDocsFolder, detectVersion, extractRepoName, extractVersion, isGitUrl, parseGitUrl, readLocalDocsFiles, } from "./git.js";
8
+ import { buildPackage } from "./package-builder.js";
9
+ import { search } from "./search.js";
10
+ import { ContextServer } from "./server.js";
11
+ import { PackageStore, readPackageInfo } from "./store.js";
12
+ /** Detect the type of source based on the input string. */
13
+ export function detectSourceType(source) {
14
+ // Handle empty or whitespace-only strings as file
15
+ if (!source.trim()) {
16
+ return "file";
17
+ }
18
+ // Git: any git-compatible URL (git://, ssh://, git@, .git suffix, or known hosts)
19
+ if (isGitUrl(source)) {
20
+ return "git";
21
+ }
22
+ // URL: starts with http:// or https:// (for downloading .db files)
23
+ if (source.startsWith("http://") || source.startsWith("https://")) {
24
+ return "url";
25
+ }
26
+ // Local directory: check if path exists and is a directory
27
+ const resolvedPath = resolve(source);
28
+ try {
29
+ const stat = statSync(resolvedPath);
30
+ if (stat.isDirectory()) {
31
+ return "local-dir";
32
+ }
33
+ }
34
+ catch {
35
+ // Path doesn't exist or can't be accessed - treat as file
36
+ }
37
+ // Default: local file (.db package)
38
+ return "file";
39
+ }
40
+ /** Download a file from a URL to a local path. */
41
+ async function downloadFile(url, destPath) {
42
+ const response = await fetch(url);
43
+ if (!response.ok) {
44
+ throw new Error(`Download failed: ${response.status} ${response.statusText}`);
45
+ }
46
+ if (!response.body) {
47
+ throw new Error("Download failed: No response body");
48
+ }
49
+ const fileStream = createWriteStream(destPath);
50
+ // Convert web ReadableStream to Node stream
51
+ const { Readable } = await import("node:stream");
52
+ const nodeStream = Readable.fromWeb(response.body);
53
+ await pipeline(nodeStream, fileStream);
54
+ }
55
+ const DATA_DIR = join(homedir(), ".context", "packages");
56
+ function formatBytes(bytes) {
57
+ if (bytes < 1024)
58
+ return `${bytes} B`;
59
+ if (bytes < 1024 * 1024)
60
+ return `${(bytes / 1024).toFixed(1)} KB`;
61
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
62
+ }
63
+ const LOW_DOCS_THRESHOLD = 50;
64
+ /** Build a Google search URL to help find documentation repos. */
65
+ function buildDocsSearchUrl(repoName) {
66
+ const query = `${repoName} documentation site github.com`;
67
+ return `https://www.google.com/search?q=${encodeURIComponent(query)}`;
68
+ }
69
+ /** Warn if package has few sections (docs may live elsewhere). */
70
+ function warnIfLowDocs(sectionCount, repoName) {
71
+ if (sectionCount < LOW_DOCS_THRESHOLD) {
72
+ const searchUrl = buildDocsSearchUrl(repoName);
73
+ console.log(`
74
+ ⚠️ Warning: Only ${sectionCount} sections found (threshold: ${LOW_DOCS_THRESHOLD})
75
+ This repository may not contain substantial documentation.
76
+ Many projects keep docs in a separate repository.
77
+
78
+ 🔍 Search for the docs repo: ${searchUrl}
79
+
80
+ Or try:
81
+ - Use --docs-path to specify a different docs folder
82
+ - Check for a dedicated docs repo (e.g., ${repoName}-docs, ${repoName}.github.io)`);
83
+ }
84
+ }
85
+ /** Save a copy of the package to the specified path. */
86
+ function savePackageCopy(sourcePath, savePath, packageName, version) {
87
+ const resolvedSavePath = resolve(savePath);
88
+ let destPath;
89
+ if (existsSync(resolvedSavePath) &&
90
+ statSync(resolvedSavePath).isDirectory()) {
91
+ // Save to directory with standard name
92
+ destPath = join(resolvedSavePath, `${packageName}@${version}.db`);
93
+ }
94
+ else if (savePath.endsWith(".db")) {
95
+ // Use exact path
96
+ destPath = resolvedSavePath;
97
+ // Ensure parent directory exists
98
+ const parentDir = resolve(destPath, "..");
99
+ if (!existsSync(parentDir)) {
100
+ mkdirSync(parentDir, { recursive: true });
101
+ }
102
+ }
103
+ else {
104
+ // Treat as directory, create it
105
+ mkdirSync(resolvedSavePath, { recursive: true });
106
+ destPath = join(resolvedSavePath, `${packageName}@${version}.db`);
107
+ }
108
+ copyFileSync(sourcePath, destPath);
109
+ console.log(`✓ Saved to ${destPath}`);
110
+ }
111
+ /** Ensure data directory exists. */
112
+ function ensureDataDir() {
113
+ mkdirSync(DATA_DIR, { recursive: true });
114
+ }
115
+ /** Load all packages from the data directory into the store. */
116
+ function loadPackages(store) {
117
+ if (!existsSync(DATA_DIR))
118
+ return;
119
+ for (const file of readdirSync(DATA_DIR)) {
120
+ if (!file.endsWith(".db"))
121
+ continue;
122
+ try {
123
+ const info = readPackageInfo(join(DATA_DIR, file));
124
+ store.add(info);
125
+ }
126
+ catch {
127
+ // Skip invalid packages
128
+ }
129
+ }
130
+ }
131
+ const program = new Command()
132
+ .name("context")
133
+ .description("Local-first documentation for AI agents")
134
+ .version("0.1.0");
135
+ /** Install a package from a local file path. */
136
+ function addFromFile(source, options) {
137
+ const sourcePath = resolve(source);
138
+ if (!existsSync(sourcePath)) {
139
+ throw new Error(`File not found: ${source}`);
140
+ }
141
+ console.log(`Installing ${source}...`);
142
+ // Read package info and validate
143
+ const info = readPackageInfo(sourcePath);
144
+ // Copy to data directory
145
+ ensureDataDir();
146
+ const destName = `${info.name}@${info.version}.db`;
147
+ const destPath = join(DATA_DIR, destName);
148
+ if (resolve(sourcePath) !== destPath) {
149
+ copyFileSync(sourcePath, destPath);
150
+ console.log(`✓ Copied to ${destPath}`);
151
+ info.path = destPath;
152
+ }
153
+ // Save to custom path if specified
154
+ if (options.save) {
155
+ savePackageCopy(destPath, options.save, info.name, info.version);
156
+ }
157
+ console.log(`\nInstalled: ${info.name}@${info.version} (${formatBytes(info.sizeBytes)}, ${info.sectionCount} sections)`);
158
+ }
159
+ /** Install a package from a URL. */
160
+ async function addFromUrl(url, options) {
161
+ console.log(`Downloading ${url}...`);
162
+ // Extract filename from URL for temp file
163
+ const urlObj = new URL(url);
164
+ const filename = basename(urlObj.pathname) || "package.db";
165
+ // Download to temp location first
166
+ ensureDataDir();
167
+ const tempPath = join(DATA_DIR, `.downloading-${Date.now()}-${filename}`);
168
+ try {
169
+ await downloadFile(url, tempPath);
170
+ console.log(`✓ Downloaded`);
171
+ // Validate the package
172
+ const info = readPackageInfo(tempPath);
173
+ console.log(`✓ Validated package`);
174
+ // Move to final location
175
+ const destName = `${info.name}@${info.version}.db`;
176
+ const destPath = join(DATA_DIR, destName);
177
+ // Remove old version if it exists
178
+ if (existsSync(destPath)) {
179
+ unlinkSync(destPath);
180
+ }
181
+ // Rename temp to final
182
+ renameSync(tempPath, destPath);
183
+ info.path = destPath;
184
+ // Save to custom path if specified
185
+ if (options.save) {
186
+ savePackageCopy(destPath, options.save, info.name, info.version);
187
+ }
188
+ console.log(`\nInstalled: ${info.name}@${info.version} (${formatBytes(info.sizeBytes)}, ${info.sectionCount} sections)`);
189
+ }
190
+ catch (err) {
191
+ // Clean up temp file on error
192
+ if (existsSync(tempPath)) {
193
+ unlinkSync(tempPath);
194
+ }
195
+ throw err;
196
+ }
197
+ }
198
+ /** Install a package from a git repository (via clone). */
199
+ async function addFromGitClone(source, options) {
200
+ const { url, ref } = parseGitUrl(source);
201
+ const repoName = options.name ?? extractRepoName(url);
202
+ console.log(`Cloning ${url}${ref ? ` (${ref})` : ""}...`);
203
+ const { tempDir, cleanup } = cloneRepository(url, ref);
204
+ try {
205
+ // Detect version: explicit > ref > detected from repo > latest
206
+ const versionLabel = options.version ?? (ref ? extractVersion(ref) : detectVersion(tempDir));
207
+ // Detect or use provided docs path
208
+ let docsPath = options.docsPath;
209
+ if (!docsPath) {
210
+ const detected = detectLocalDocsFolder(tempDir);
211
+ if (detected) {
212
+ docsPath = detected;
213
+ }
214
+ }
215
+ if (docsPath) {
216
+ console.log(`✓ Found docs at /${docsPath}`);
217
+ }
218
+ else {
219
+ console.log(`✓ Reading from repository root`);
220
+ }
221
+ // Read all markdown files (filtered by language)
222
+ const files = readLocalDocsFiles(tempDir, { docsPath, lang: options.lang });
223
+ if (files.length === 0) {
224
+ throw new Error(`No markdown files found${docsPath ? ` in ${docsPath}` : ""}. Use --docs-path to specify or --lang all to include all languages.`);
225
+ }
226
+ console.log(`✓ Found ${files.length} markdown files${options.lang ? ` (lang: ${options.lang})` : ""}`);
227
+ // Build the package
228
+ ensureDataDir();
229
+ const outputPath = join(DATA_DIR, `${repoName}@${versionLabel}.db`);
230
+ console.log(`Building package...`);
231
+ const result = buildPackage(outputPath, files, {
232
+ name: repoName,
233
+ version: versionLabel,
234
+ sourceUrl: url,
235
+ });
236
+ console.log(`✓ Built package: ${repoName}@${versionLabel}`);
237
+ console.log(`✓ Saved to ${outputPath}`);
238
+ // Save to custom path if specified
239
+ if (options.save) {
240
+ savePackageCopy(outputPath, options.save, repoName, versionLabel);
241
+ }
242
+ const sizeBytes = statSync(outputPath).size;
243
+ console.log(`\nInstalled: ${repoName}@${versionLabel} (${formatBytes(sizeBytes)}, ${result.sectionCount} sections)`);
244
+ warnIfLowDocs(result.sectionCount, repoName);
245
+ }
246
+ finally {
247
+ cleanup();
248
+ }
249
+ }
250
+ /** Install a package from a local directory. */
251
+ async function addFromLocalDir(source, options) {
252
+ const dirPath = resolve(source);
253
+ const dirName = basename(dirPath);
254
+ const packageName = options.name ?? dirName.toLowerCase().replace(/[^a-z0-9-]/g, "-");
255
+ const versionLabel = options.version ?? detectVersion(dirPath);
256
+ console.log(`Scanning ${dirPath}...`);
257
+ // Detect or use provided docs path
258
+ let docsPath = options.docsPath;
259
+ if (!docsPath) {
260
+ const detected = detectLocalDocsFolder(dirPath);
261
+ if (detected) {
262
+ docsPath = detected;
263
+ }
264
+ }
265
+ if (docsPath) {
266
+ console.log(`✓ Found docs at /${docsPath}`);
267
+ }
268
+ else {
269
+ console.log(`✓ Reading from directory root`);
270
+ }
271
+ // Read all markdown files (filtered by language)
272
+ const files = readLocalDocsFiles(dirPath, { docsPath, lang: options.lang });
273
+ if (files.length === 0) {
274
+ throw new Error(`No markdown files found${docsPath ? ` in ${docsPath}` : ""}. Use --docs-path to specify or --lang all to include all languages.`);
275
+ }
276
+ console.log(`✓ Found ${files.length} markdown files${options.lang ? ` (lang: ${options.lang})` : ""}`);
277
+ // Build the package
278
+ ensureDataDir();
279
+ const outputPath = join(DATA_DIR, `${packageName}@${versionLabel}.db`);
280
+ console.log(`Building package...`);
281
+ const result = buildPackage(outputPath, files, {
282
+ name: packageName,
283
+ version: versionLabel,
284
+ sourceUrl: dirPath,
285
+ });
286
+ console.log(`✓ Built package: ${packageName}@${versionLabel}`);
287
+ console.log(`✓ Saved to ${outputPath}`);
288
+ // Save to custom path if specified
289
+ if (options.save) {
290
+ savePackageCopy(outputPath, options.save, packageName, versionLabel);
291
+ }
292
+ const sizeBytes = statSync(outputPath).size;
293
+ console.log(`\nInstalled: ${packageName}@${versionLabel} (${formatBytes(sizeBytes)}, ${result.sectionCount} sections)`);
294
+ warnIfLowDocs(result.sectionCount, packageName);
295
+ }
296
+ program
297
+ .command("add")
298
+ .description("Install a documentation package from file, URL, GitHub, git repo, or local directory")
299
+ .argument("<source>", "Package source: local .db file, URL (.db), GitHub URL, git URL, or local directory")
300
+ .option("--version <version>", "Custom version label")
301
+ .option("--docs-path <path>", "Path to docs folder in repo/directory")
302
+ .option("--name <name>", "Custom package name")
303
+ .option("--save <path>", "Save a copy of the package to the specified path")
304
+ .option("--lang <code>", "Language filter: 'all' for all languages, or ISO code (e.g., 'en', 'de')")
305
+ .action(async (source, options) => {
306
+ try {
307
+ const sourceType = detectSourceType(source);
308
+ switch (sourceType) {
309
+ case "file":
310
+ addFromFile(source, options);
311
+ break;
312
+ case "url":
313
+ await addFromUrl(source, options);
314
+ break;
315
+ case "git":
316
+ await addFromGitClone(source, options);
317
+ break;
318
+ case "local-dir":
319
+ await addFromLocalDir(source, options);
320
+ break;
321
+ }
322
+ }
323
+ catch (err) {
324
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
325
+ process.exit(1);
326
+ }
327
+ });
328
+ program
329
+ .command("list")
330
+ .description("Show installed packages")
331
+ .action(() => {
332
+ const store = new PackageStore();
333
+ loadPackages(store);
334
+ const packages = store.list();
335
+ if (packages.length === 0) {
336
+ console.log("No packages installed.");
337
+ console.log("Run: context add <package.db>");
338
+ return;
339
+ }
340
+ console.log("Installed packages:\n");
341
+ let totalSize = 0;
342
+ for (const pkg of packages) {
343
+ totalSize += pkg.sizeBytes;
344
+ const name = `${pkg.name}@${pkg.version}`.padEnd(24);
345
+ const size = formatBytes(pkg.sizeBytes).padStart(8);
346
+ console.log(` ${name} ${size} ${pkg.sectionCount} sections`);
347
+ }
348
+ console.log(`\nTotal: ${packages.length} packages (${formatBytes(totalSize)})`);
349
+ });
350
+ program
351
+ .command("remove")
352
+ .description("Remove a documentation package")
353
+ .argument("<name>", "Package name (without version)")
354
+ .action((name) => {
355
+ const store = new PackageStore();
356
+ loadPackages(store);
357
+ const pkg = store.get(name);
358
+ if (!pkg) {
359
+ console.error(`Error: Package not found: ${name}`);
360
+ process.exit(1);
361
+ }
362
+ // Delete file from disk
363
+ try {
364
+ unlinkSync(pkg.path);
365
+ }
366
+ catch {
367
+ // Ignore deletion errors
368
+ }
369
+ console.log(`Removed: ${pkg.name}@${pkg.version}`);
370
+ });
371
+ program
372
+ .command("serve")
373
+ .description("Start the MCP server")
374
+ .action(async () => {
375
+ const store = new PackageStore();
376
+ loadPackages(store);
377
+ const packages = store.list();
378
+ if (packages.length > 0) {
379
+ const names = packages.map((p) => `${p.name}@${p.version}`).join(", ");
380
+ console.error(`Context MCP Server starting...`);
381
+ console.error(`Loaded ${packages.length} packages: ${names}`);
382
+ }
383
+ else {
384
+ console.error("Context MCP Server starting...");
385
+ console.error("No packages installed. Run: context add <package.db>");
386
+ }
387
+ const server = new ContextServer(store);
388
+ await server.start();
389
+ });
390
+ function formatLibraryName(pkg) {
391
+ return `${pkg.name}@${pkg.version}`;
392
+ }
393
+ function formatSearchResult(result) {
394
+ if (result.results.length === 0) {
395
+ return JSON.stringify({
396
+ library: result.library,
397
+ version: result.version,
398
+ results: [],
399
+ message: "No documentation found. Try different keywords.",
400
+ }, null, 2);
401
+ }
402
+ return JSON.stringify({
403
+ library: result.library,
404
+ version: result.version,
405
+ results: result.results,
406
+ }, null, 2);
407
+ }
408
+ program
409
+ .command("query")
410
+ .description("Query documentation from an installed package")
411
+ .argument("<library>", "Package name with version (e.g., nextjs@15.0)")
412
+ .argument("<topic>", "Search query (e.g., 'middleware authentication')")
413
+ .action((library, topic) => {
414
+ const store = new PackageStore();
415
+ loadPackages(store);
416
+ const packages = store.list();
417
+ const pkg = packages.find((p) => formatLibraryName(p) === library);
418
+ if (!pkg) {
419
+ const available = packages.map(formatLibraryName);
420
+ if (available.length === 0) {
421
+ console.error("Error: No packages installed.");
422
+ console.error("Run: context add <package.db>");
423
+ }
424
+ else {
425
+ console.error(`Error: Package not found: ${library}`);
426
+ const maxShow = 5;
427
+ const shown = available.slice(0, maxShow);
428
+ const remaining = available.length - maxShow;
429
+ const suffix = remaining > 0 ? `, ... (+${remaining} more)` : "";
430
+ console.error(`Available packages: ${shown.join(", ")}${suffix}`);
431
+ }
432
+ process.exit(1);
433
+ }
434
+ const db = store.openDb(pkg.name);
435
+ if (!db) {
436
+ console.error(`Error: Failed to open package database: ${library}`);
437
+ process.exit(1);
438
+ }
439
+ try {
440
+ const result = search(db, topic);
441
+ console.log(formatSearchResult(result));
442
+ }
443
+ finally {
444
+ db.close();
445
+ }
446
+ });
447
+ // Only parse when run directly (not when imported for testing)
448
+ const isRunDirectly = process.argv[1]?.endsWith("cli.js") ||
449
+ process.argv[1]?.endsWith("context") ||
450
+ process.argv[1]?.includes("bin/context");
451
+ if (isRunDirectly) {
452
+ program.parse();
453
+ }
454
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,cAAc,EACd,QAAQ,EACR,WAAW,EACX,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAqB,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAoB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAS7E,2DAA2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,kDAAkD;IAClD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kFAAkF;IAClF,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mEAAmE;IACnE,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2DAA2D;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;IAED,oCAAoC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kDAAkD;AAClD,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,QAAgB;IACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,4CAA4C;IAC5C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CACjC,QAAQ,CAAC,IAA2C,CACrD,CAAC;IACF,MAAM,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEzD,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,kEAAkE;AAClE,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,KAAK,GAAG,GAAG,QAAQ,gCAAgC,CAAC;IAC1D,OAAO,mCAAmC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,kEAAkE;AAClE,SAAS,aAAa,CAAC,YAAoB,EAAE,QAAgB;IAC3D,IAAI,YAAY,GAAG,kBAAkB,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC;oBACI,YAAY,+BAA+B,kBAAkB;;;;kCAI/C,SAAS;;;;8CAIG,QAAQ,UAAU,QAAQ,aAAa,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,SAAS,eAAe,CACtB,UAAkB,EAClB,QAAgB,EAChB,WAAmB,EACnB,OAAe;IAEf,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,QAAgB,CAAC;IACrB,IACE,UAAU,CAAC,gBAAgB,CAAC;QAC5B,QAAQ,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,EACxC,CAAC;QACD,uCAAuC;QACvC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,WAAW,IAAI,OAAO,KAAK,CAAC,CAAC;IACpE,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,iBAAiB;QACjB,QAAQ,GAAG,gBAAgB,CAAC;QAC5B,iCAAiC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,WAAW,IAAI,OAAO,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,oCAAoC;AACpC,SAAS,aAAa;IACpB,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,gEAAgE;AAChE,SAAS,YAAY,CAAC,KAAmB;IACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAElC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YACnD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,gDAAgD;AAChD,SAAS,WAAW,CAAC,MAAc,EAAE,OAA0B;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,KAAK,CAAC,CAAC;IAEvC,iCAAiC;IACjC,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAEzC,yBAAyB;IACzB,aAAa,EAAE,CAAC;IAChB,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,CAAC,GAAG,CACT,gBAAgB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,YAAY,YAAY,CAC5G,CAAC;AACJ,CAAC;AAED,oCAAoC;AACpC,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,OAA0B;IAE1B,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC;IAErC,0CAA0C;IAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC;IAE3D,kCAAkC;IAClC,aAAa,EAAE,CAAC;IAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;IAE1E,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE5B,uBAAuB;QACvB,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAEnC,yBAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE1C,kCAAkC;QAClC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAED,uBAAuB;QACvB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QAErB,mCAAmC;QACnC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,GAAG,CACT,gBAAgB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,YAAY,YAAY,CAC5G,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8BAA8B;QAC9B,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAUD,2DAA2D;AAC3D,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,OAA0B;IAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE1D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,YAAY,GAChB,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAE1E,mCAAmC;QACnC,IAAI,QAAQ,GAAuB,OAAO,CAAC,QAAQ,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,GAAG,QAAQ,CAAC;YACtB,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAChD,CAAC;QAED,iDAAiD;QACjD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,sEAAsE,CAClI,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,CACT,WAAW,KAAK,CAAC,MAAM,kBAAkB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1F,CAAC;QAEF,oBAAoB;QACpB,aAAa,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,IAAI,YAAY,KAAK,CAAC,CAAC;QAEpE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE;YAC7C,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAExC,mCAAmC;QACnC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAE5C,OAAO,CAAC,GAAG,CACT,gBAAgB,QAAQ,IAAI,YAAY,KAAK,WAAW,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,YAAY,YAAY,CACxG,CAAC;QAEF,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,OAA0B;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,KAAK,CAAC,CAAC;IAEtC,mCAAmC;IACnC,IAAI,QAAQ,GAAuB,OAAO,CAAC,QAAQ,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,sEAAsE,CAClI,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CACT,WAAW,KAAK,CAAC,MAAM,kBAAkB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1F,CAAC;IAEF,oBAAoB;IACpB,aAAa,EAAE,CAAC;IAChB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,IAAI,YAAY,KAAK,CAAC,CAAC;IAEvE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE;QAC7C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,IAAI,YAAY,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;IAExC,mCAAmC;IACnC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAE5C,OAAO,CAAC,GAAG,CACT,gBAAgB,WAAW,IAAI,YAAY,KAAK,WAAW,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,YAAY,YAAY,CAC3G,CAAC;IAEF,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CACV,sFAAsF,CACvF;KACA,QAAQ,CACP,UAAU,EACV,oFAAoF,CACrF;KACA,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;KACrD,MAAM,CAAC,oBAAoB,EAAE,uCAAuC,CAAC;KACrE,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;KAC9C,MAAM,CAAC,eAAe,EAAE,kDAAkD,CAAC;KAC3E,MAAM,CACL,eAAe,EACf,0EAA0E,CAC3E;KACA,MAAM,CACL,KAAK,EACH,MAAc,EACd,OAMC,EACD,EAAE;IACF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE5C,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACvC,MAAM;QACV,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CACF,CAAC;AAEJ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,GAAG,CACT,YAAY,QAAQ,CAAC,MAAM,cAAc,WAAW,CAAC,SAAS,CAAC,GAAG,CACnE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;KACpD,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;IACvB,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,CAAC,MAAM,cAAc,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,SAAS,iBAAiB,CAAC,GAAgB;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAoB;IAC9C,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,iDAAiD;SAC3D,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,QAAQ,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACtE,QAAQ,CAAC,SAAS,EAAE,kDAAkD,CAAC;KACvE,MAAM,CAAC,CAAC,OAAe,EAAE,KAAa,EAAE,EAAE;IACzC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IAEnE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,+DAA+D;AAC/D,MAAM,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;AAE3C,IAAI,aAAa,EAAE,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type Database from "better-sqlite3";
2
+ export declare function getMetaValue(db: Database.Database, key: string): string | undefined;
3
+ export declare function getSectionCount(db: Database.Database): number;
4
+ export declare function validatePackageSchema(db: Database.Database): void;
package/dist/db.js ADDED
@@ -0,0 +1,24 @@
1
+ export function getMetaValue(db, key) {
2
+ const row = db.prepare("SELECT value FROM meta WHERE key = ?").get(key);
3
+ return row?.value;
4
+ }
5
+ export function getSectionCount(db) {
6
+ const row = db.prepare("SELECT COUNT(*) as count FROM chunks").get();
7
+ return row.count;
8
+ }
9
+ export function validatePackageSchema(db) {
10
+ const tables = db
11
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
12
+ .all();
13
+ const tableNames = new Set(tables.map((t) => t.name));
14
+ if (!tableNames.has("meta")) {
15
+ throw new Error("Invalid package: missing 'meta' table");
16
+ }
17
+ if (!tableNames.has("chunks")) {
18
+ throw new Error("Invalid package: missing 'chunks' table");
19
+ }
20
+ if (!tableNames.has("chunks_fts")) {
21
+ throw new Error("Invalid package: missing 'chunks_fts' table");
22
+ }
23
+ }
24
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,GAAW;IAEX,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,GAAG,CAEzD,CAAC;IACd,OAAO,GAAG,EAAE,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAqB;IACnD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,EAEjE,CAAC;IACF,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAqB;IACzD,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,iEAAiE,CAAC;SAC1E,GAAG,EAAwB,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Git operations for cloning repositories.
3
+ */
4
+ export interface GitCloneResult {
5
+ tempDir: string;
6
+ cleanup: () => void;
7
+ }
8
+ export interface LocalDocsResult {
9
+ files: Array<{
10
+ path: string;
11
+ content: string;
12
+ }>;
13
+ repoName: string;
14
+ }
15
+ /**
16
+ * Check if a string is a git URL (supports various git protocols).
17
+ * Matches: https://, git://, ssh://, git@host:, or .git suffix
18
+ * Excludes: URLs with paths beyond repo root (releases, blob, actions, etc.)
19
+ */
20
+ export declare function isGitUrl(source: string): boolean;
21
+ /**
22
+ * Clone a git repository to a temporary directory.
23
+ */
24
+ export declare function cloneRepository(url: string, ref?: string): GitCloneResult;
25
+ /**
26
+ * Extract repository name from a git URL.
27
+ * Handles common docs repo patterns:
28
+ * - org.github.io → org
29
+ * - expressjs.com → express
30
+ * - project-docs → project
31
+ */
32
+ export declare function extractRepoName(url: string): string;
33
+ /**
34
+ * Parse git URL to extract optional ref from URL path.
35
+ * Supports: https://github.com/owner/repo/tree/branch
36
+ */
37
+ export declare function parseGitUrl(url: string): {
38
+ url: string;
39
+ ref?: string;
40
+ };
41
+ /**
42
+ * Detect docs folder in a local directory.
43
+ */
44
+ export declare function detectLocalDocsFolder(dirPath: string): string | null;
45
+ export interface FindMarkdownOptions {
46
+ /** Language filter: "all" includes everything, specific code (e.g., "en") includes only that locale */
47
+ lang?: string;
48
+ }
49
+ export interface ReadLocalDocsOptions {
50
+ /** Path to docs folder within the repository */
51
+ docsPath?: string;
52
+ /** Language filter: "all" includes everything, specific code (e.g., "en") includes only that locale */
53
+ lang?: string;
54
+ }
55
+ /**
56
+ * Read all markdown files from a local directory.
57
+ * Respects .gitignore from the base path (repo root).
58
+ * By default, filters out non-English locale directories.
59
+ * Deduplicates files by content hash (keeps first occurrence).
60
+ */
61
+ export declare function readLocalDocsFiles(basePath: string, options?: ReadLocalDocsOptions): Array<{
62
+ path: string;
63
+ content: string;
64
+ }>;
65
+ /**
66
+ * Extract version from ref or return 'latest'.
67
+ */
68
+ export declare function extractVersion(ref?: string): string;
69
+ /**
70
+ * Detect version from a directory by checking:
71
+ * 1. Latest git tag (universal across all languages)
72
+ * 2. Falls back to 'latest'
73
+ */
74
+ export declare function detectVersion(dirPath: string): string;