hoolix 0.0.1-beta.19
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/LICENSE +21 -0
- package/README.md +337 -0
- package/STABILITY.md +109 -0
- package/bin/hoolix.js +50 -0
- package/bin/mcp-portal.js +12 -0
- package/bin/postinstall.js +61 -0
- package/dist/app/contracts.d.ts +105 -0
- package/dist/app/contracts.d.ts.map +1 -0
- package/dist/app/contracts.js +2 -0
- package/dist/app/contracts.js.map +1 -0
- package/dist/app/events.d.ts +13 -0
- package/dist/app/events.d.ts.map +1 -0
- package/dist/app/events.js +13 -0
- package/dist/app/events.js.map +1 -0
- package/dist/app/services/analytics.d.ts +42 -0
- package/dist/app/services/analytics.d.ts.map +1 -0
- package/dist/app/services/analytics.js +106 -0
- package/dist/app/services/analytics.js.map +1 -0
- package/dist/app/services/catalog.d.ts +14 -0
- package/dist/app/services/catalog.d.ts.map +1 -0
- package/dist/app/services/catalog.js +26 -0
- package/dist/app/services/catalog.js.map +1 -0
- package/dist/app/services/credentials.d.ts +42 -0
- package/dist/app/services/credentials.d.ts.map +1 -0
- package/dist/app/services/credentials.js +143 -0
- package/dist/app/services/credentials.js.map +1 -0
- package/dist/app/services/servers.d.ts +15 -0
- package/dist/app/services/servers.d.ts.map +1 -0
- package/dist/app/services/servers.js +445 -0
- package/dist/app/services/servers.js.map +1 -0
- package/dist/catalog/community.d.ts +19 -0
- package/dist/catalog/community.d.ts.map +1 -0
- package/dist/catalog/community.js +53 -0
- package/dist/catalog/community.js.map +1 -0
- package/dist/catalog/templates.d.ts +436 -0
- package/dist/catalog/templates.d.ts.map +1 -0
- package/dist/catalog/templates.js +489 -0
- package/dist/catalog/templates.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +122 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/bundle.d.ts +11 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +299 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/clients.d.ts +6 -0
- package/dist/commands/clients.d.ts.map +1 -0
- package/dist/commands/clients.js +242 -0
- package/dist/commands/clients.js.map +1 -0
- package/dist/commands/completion.d.ts +18 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +495 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/connect.d.ts +10 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +463 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +607 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +44 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +259 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +93 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/gui.d.ts +2 -0
- package/dist/commands/gui.d.ts.map +1 -0
- package/dist/commands/gui.js +19 -0
- package/dist/commands/gui.js.map +1 -0
- package/dist/commands/import.d.ts +2 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +102 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/info.d.ts +2 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +151 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +90 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/reindex.d.ts +2 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +186 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/rotate.d.ts +2 -0
- package/dist/commands/rotate.d.ts.map +1 -0
- package/dist/commands/rotate.js +67 -0
- package/dist/commands/rotate.js.map +1 -0
- package/dist/commands/secrets.d.ts +10 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +293 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +234 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stats.d.ts +2 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +220 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +24 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/templates.d.ts +2 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +168 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/trial.d.ts +2 -0
- package/dist/commands/trial.d.ts.map +1 -0
- package/dist/commands/trial.js +61 -0
- package/dist/commands/trial.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +114 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +104 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +2 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +301 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/config.d.ts +25 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +54 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +25 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +53 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +12 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/paths.d.ts +15 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +51 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/registry.d.ts +474 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +186 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/updater.d.ts +16 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +317 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +3 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +270 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/chunker.d.ts +13 -0
- package/dist/ingestion/chunker.d.ts.map +1 -0
- package/dist/ingestion/chunker.js +107 -0
- package/dist/ingestion/chunker.js.map +1 -0
- package/dist/ingestion/cleaners.d.ts +10 -0
- package/dist/ingestion/cleaners.d.ts.map +1 -0
- package/dist/ingestion/cleaners.js +61 -0
- package/dist/ingestion/cleaners.js.map +1 -0
- package/dist/ingestion/detectors.d.ts +5 -0
- package/dist/ingestion/detectors.d.ts.map +1 -0
- package/dist/ingestion/detectors.js +25 -0
- package/dist/ingestion/detectors.js.map +1 -0
- package/dist/ingestion/fetchers.d.ts +38 -0
- package/dist/ingestion/fetchers.d.ts.map +1 -0
- package/dist/ingestion/fetchers.js +296 -0
- package/dist/ingestion/fetchers.js.map +1 -0
- package/dist/ingestion/github.d.ts +60 -0
- package/dist/ingestion/github.d.ts.map +1 -0
- package/dist/ingestion/github.js +314 -0
- package/dist/ingestion/github.js.map +1 -0
- package/dist/ingestion/pipeline.d.ts +3 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +160 -0
- package/dist/ingestion/pipeline.js.map +1 -0
- package/dist/ingestion/types.d.ts +51 -0
- package/dist/ingestion/types.d.ts.map +1 -0
- package/dist/ingestion/types.js +2 -0
- package/dist/ingestion/types.js.map +1 -0
- package/dist/lib/auth.d.ts +2 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +6 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/embedding.d.ts +10 -0
- package/dist/lib/embedding.d.ts.map +1 -0
- package/dist/lib/embedding.js +21 -0
- package/dist/lib/embedding.js.map +1 -0
- package/dist/mcp/host.d.ts +16 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +307 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/proxy-host.d.ts +25 -0
- package/dist/mcp/proxy-host.d.ts.map +1 -0
- package/dist/mcp/proxy-host.js +393 -0
- package/dist/mcp/proxy-host.js.map +1 -0
- package/dist/mcp/stdio-host.d.ts +19 -0
- package/dist/mcp/stdio-host.d.ts.map +1 -0
- package/dist/mcp/stdio-host.js +175 -0
- package/dist/mcp/stdio-host.js.map +1 -0
- package/dist/process/manager.d.ts +74 -0
- package/dist/process/manager.d.ts.map +1 -0
- package/dist/process/manager.js +322 -0
- package/dist/process/manager.js.map +1 -0
- package/dist/rag/models.d.ts +30 -0
- package/dist/rag/models.d.ts.map +1 -0
- package/dist/rag/models.js +30 -0
- package/dist/rag/models.js.map +1 -0
- package/dist/rag/store.d.ts +63 -0
- package/dist/rag/store.d.ts.map +1 -0
- package/dist/rag/store.js +505 -0
- package/dist/rag/store.js.map +1 -0
- package/dist/rag/types.d.ts +56 -0
- package/dist/rag/types.d.ts.map +1 -0
- package/dist/rag/types.js +2 -0
- package/dist/rag/types.js.map +1 -0
- package/dist/sources/plugins.d.ts +25 -0
- package/dist/sources/plugins.d.ts.map +1 -0
- package/dist/sources/plugins.js +55 -0
- package/dist/sources/plugins.js.map +1 -0
- package/dist/sources/registry.d.ts +19 -0
- package/dist/sources/registry.d.ts.map +1 -0
- package/dist/sources/registry.js +183 -0
- package/dist/sources/registry.js.map +1 -0
- package/dist/sources/types.d.ts +361 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +59 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/tui/index.d.ts +22 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +711 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/ui/format.d.ts +27 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +80 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/help.d.ts +2 -0
- package/dist/ui/help.d.ts.map +1 -0
- package/dist/ui/help.js +106 -0
- package/dist/ui/help.js.map +1 -0
- package/dist/web/assets.d.ts +2 -0
- package/dist/web/assets.d.ts.map +1 -0
- package/dist/web/assets.js +659 -0
- package/dist/web/assets.js.map +1 -0
- package/dist/web/server.d.ts +9 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +349 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IngestedChunk } from './types.js';
|
|
2
|
+
export interface ChunkOptions {
|
|
3
|
+
targetSize?: number;
|
|
4
|
+
overlap?: number;
|
|
5
|
+
minChunkSize?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Heading-aware chunker.
|
|
9
|
+
* Splits on # headings, maintains sectionPath/headings stack for RAG grounding,
|
|
10
|
+
* adds overlap, caps oversized blocks, and enriches chunks with url + title.
|
|
11
|
+
*/
|
|
12
|
+
export declare function chunkMarkdown(markdown: string, sourceUrl: string, baseTitle: string, opts?: ChunkOptions): IngestedChunk[];
|
|
13
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/ingestion/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,YAAiB,GACtB,aAAa,EAAE,CA8EjB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const DEFAULTS = {
|
|
2
|
+
targetSize: 1100,
|
|
3
|
+
overlap: 180,
|
|
4
|
+
minChunkSize: 120,
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Heading-aware chunker.
|
|
8
|
+
* Splits on # headings, maintains sectionPath/headings stack for RAG grounding,
|
|
9
|
+
* adds overlap, caps oversized blocks, and enriches chunks with url + title.
|
|
10
|
+
*/
|
|
11
|
+
export function chunkMarkdown(markdown, sourceUrl, baseTitle, opts = {}) {
|
|
12
|
+
const { targetSize, overlap, minChunkSize } = { ...DEFAULTS, ...opts };
|
|
13
|
+
const lines = markdown.split(/\r?\n/);
|
|
14
|
+
const chunks = [];
|
|
15
|
+
let currentSection = [];
|
|
16
|
+
let currentHeadings = [];
|
|
17
|
+
let currentTitle = baseTitle;
|
|
18
|
+
let order = 0;
|
|
19
|
+
const flush = (extraContext = '') => {
|
|
20
|
+
let text = currentSection.join('\n').trim();
|
|
21
|
+
if (extraContext)
|
|
22
|
+
text = extraContext + '\n' + text;
|
|
23
|
+
if (text.length < minChunkSize)
|
|
24
|
+
return;
|
|
25
|
+
// Oversized: split further
|
|
26
|
+
if (text.length > targetSize * 1.6) {
|
|
27
|
+
const subChunks = splitLargeBlock(text, targetSize, overlap);
|
|
28
|
+
for (const sub of subChunks) {
|
|
29
|
+
chunks.push(createChunk(sub, sourceUrl, currentTitle, currentHeadings, order++));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
chunks.push(createChunk(text, sourceUrl, currentTitle, currentHeadings, order++));
|
|
34
|
+
}
|
|
35
|
+
currentSection = [];
|
|
36
|
+
};
|
|
37
|
+
for (let i = 0; i < lines.length; i++) {
|
|
38
|
+
const line = lines[i];
|
|
39
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
40
|
+
if (headingMatch) {
|
|
41
|
+
const level = headingMatch[1].length;
|
|
42
|
+
const headingText = headingMatch[2].trim();
|
|
43
|
+
// Flush prior section on heading boundary
|
|
44
|
+
if (currentSection.length > 0) {
|
|
45
|
+
flush();
|
|
46
|
+
}
|
|
47
|
+
// Trim stack to current level + push
|
|
48
|
+
currentHeadings = currentHeadings.slice(0, level - 1);
|
|
49
|
+
currentHeadings.push(headingText);
|
|
50
|
+
if (level === 1) {
|
|
51
|
+
currentTitle = headingText;
|
|
52
|
+
}
|
|
53
|
+
currentSection.push(line);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
currentSection.push(line);
|
|
57
|
+
// Size-based flush (within a section)
|
|
58
|
+
const currentText = currentSection.join('\n');
|
|
59
|
+
if (currentText.length >= targetSize) {
|
|
60
|
+
flush();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Final flush for trailing content
|
|
64
|
+
if (currentSection.length > 0) {
|
|
65
|
+
flush();
|
|
66
|
+
}
|
|
67
|
+
// Prepend tail of previous chunk as overlap context (for better retrieval)
|
|
68
|
+
for (let i = 1; i < chunks.length; i++) {
|
|
69
|
+
const prev = chunks[i - 1].content;
|
|
70
|
+
const overlapText = prev.slice(-overlap);
|
|
71
|
+
if (overlapText.trim().length > 40) {
|
|
72
|
+
chunks[i].content = overlapText + '\n\n' + chunks[i].content;
|
|
73
|
+
chunks[i].metadata.charCount = chunks[i].content.length;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return chunks;
|
|
77
|
+
}
|
|
78
|
+
function createChunk(content, url, title, headings, order) {
|
|
79
|
+
const sectionPath = headings.length > 0 ? headings.join(' > ') : undefined;
|
|
80
|
+
return {
|
|
81
|
+
id: `chunk_${order}_${Date.now().toString(36)}`,
|
|
82
|
+
content: content.trim(),
|
|
83
|
+
metadata: {
|
|
84
|
+
url,
|
|
85
|
+
title,
|
|
86
|
+
sectionPath,
|
|
87
|
+
headings: [...headings],
|
|
88
|
+
charCount: content.length,
|
|
89
|
+
order,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function splitLargeBlock(text, target, overlap) {
|
|
94
|
+
const chunks = [];
|
|
95
|
+
let start = 0;
|
|
96
|
+
while (start < text.length) {
|
|
97
|
+
const end = Math.min(start + target, text.length);
|
|
98
|
+
chunks.push(text.slice(start, end));
|
|
99
|
+
start = end - overlap;
|
|
100
|
+
if (start < 0)
|
|
101
|
+
start = 0;
|
|
102
|
+
if (end === text.length)
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
return chunks;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/ingestion/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert HTML to Markdown (Readability + Turndown). Called only for HTML sourceType.
|
|
3
|
+
* See top-of-file for lazy loading rationale.
|
|
4
|
+
*/
|
|
5
|
+
export declare function htmlToMarkdown(html: string, baseUrl?: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Normalization pass (dedup newlines, trim) for markdown/llms content.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeMarkdown(md: string): string;
|
|
10
|
+
//# sourceMappingURL=cleaners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleaners.d.ts","sourceRoot":"","sources":["../../src/ingestion/cleaners.ts"],"names":[],"mappings":"AAyBA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAsBrE;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import TurndownService from 'turndown';
|
|
2
|
+
// @ts-ignore - turndown-plugin-gfm has poor ESM types
|
|
3
|
+
import * as turndownPluginGfm from 'turndown-plugin-gfm';
|
|
4
|
+
// Lazy runtime require for jsdom (and transitive css-tree which has data/patch.json).
|
|
5
|
+
// This keeps the common llms.txt/markdown path free of heavy modules at bundle time
|
|
6
|
+
// (prevents "Cannot find module '../data/patch.json'" in compiled binaries and shrinks size).
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
let turndown = null;
|
|
10
|
+
function getTurndown() {
|
|
11
|
+
if (!turndown) {
|
|
12
|
+
turndown = new TurndownService({
|
|
13
|
+
headingStyle: 'atx',
|
|
14
|
+
codeBlockStyle: 'fenced',
|
|
15
|
+
bulletListMarker: '-',
|
|
16
|
+
});
|
|
17
|
+
// GitHub Flavored Markdown (tables, strikethrough, task lists)
|
|
18
|
+
turndown.use(turndownPluginGfm.gfm);
|
|
19
|
+
}
|
|
20
|
+
return turndown;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Convert HTML to Markdown (Readability + Turndown). Called only for HTML sourceType.
|
|
24
|
+
* See top-of-file for lazy loading rationale.
|
|
25
|
+
*/
|
|
26
|
+
export function htmlToMarkdown(html, baseUrl) {
|
|
27
|
+
try {
|
|
28
|
+
const { JSDOM } = require('jsdom');
|
|
29
|
+
const { Readability } = require('@mozilla/readability');
|
|
30
|
+
const dom = new JSDOM(html, { url: baseUrl });
|
|
31
|
+
const reader = new Readability(dom.window.document);
|
|
32
|
+
const article = reader.parse();
|
|
33
|
+
if (article && article.content) {
|
|
34
|
+
const md = getTurndown().turndown(article.content);
|
|
35
|
+
return cleanMarkdown(md);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
// fall through to raw turndown
|
|
40
|
+
}
|
|
41
|
+
// Fallback: convert whatever we have
|
|
42
|
+
try {
|
|
43
|
+
return cleanMarkdown(getTurndown().turndown(html));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function cleanMarkdown(md) {
|
|
50
|
+
return md
|
|
51
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
52
|
+
.replace(/[ \t]+$/gm, '')
|
|
53
|
+
.trim();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Normalization pass (dedup newlines, trim) for markdown/llms content.
|
|
57
|
+
*/
|
|
58
|
+
export function normalizeMarkdown(md) {
|
|
59
|
+
return cleanMarkdown(md);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=cleaners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleaners.js","sourceRoot":"","sources":["../../src/ingestion/cleaners.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,sDAAsD;AACtD,OAAO,KAAK,iBAAiB,MAAM,qBAAqB,CAAC;AAEzD,sFAAsF;AACtF,oFAAoF;AACpF,8FAA8F;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,IAAI,QAAQ,GAA2B,IAAI,CAAC;AAE5C,SAAS,WAAW;IAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,eAAe,CAAC;YAC7B,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,QAAQ;YACxB,gBAAgB,EAAE,GAAG;SACtB,CAAC,CAAC;QACH,+DAA+D;QAC/D,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAgB;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,+BAA+B;IACjC,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC/B,OAAO,EAAE;SACN,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SourceType } from './types.js';
|
|
2
|
+
export declare function detectSourceType(url: string, content?: string): SourceType;
|
|
3
|
+
export { isGitHubRepoUrl } from './github.js';
|
|
4
|
+
export declare function isLikelyMarkdown(contentType: string, content: string): boolean;
|
|
5
|
+
//# sourceMappingURL=detectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../src/ingestion/detectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAiB1E;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAM9E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { isGitHubRepoUrl } from './github.js';
|
|
2
|
+
export function detectSourceType(url, content) {
|
|
3
|
+
const lower = url.toLowerCase();
|
|
4
|
+
if (lower.includes('llms.txt') || lower.includes('llms-full.txt')) {
|
|
5
|
+
return 'llms.txt';
|
|
6
|
+
}
|
|
7
|
+
if (isGitHubRepoUrl(url) || lower.includes('github.com')) {
|
|
8
|
+
return 'github';
|
|
9
|
+
}
|
|
10
|
+
// Heuristic: if content looks like markdown with many headings
|
|
11
|
+
if (content && /^#{1,6}\s/m.test(content) && content.length > 1500) {
|
|
12
|
+
return 'generic';
|
|
13
|
+
}
|
|
14
|
+
return 'generic';
|
|
15
|
+
}
|
|
16
|
+
export { isGitHubRepoUrl } from './github.js';
|
|
17
|
+
export function isLikelyMarkdown(contentType, content) {
|
|
18
|
+
if (contentType.includes('markdown') || contentType.includes('text/plain'))
|
|
19
|
+
return true;
|
|
20
|
+
// crude but effective
|
|
21
|
+
const mdSignals = ['# ', '## ', '```', '- ', '* '];
|
|
22
|
+
const score = mdSignals.reduce((acc, sig) => acc + (content.includes(sig) ? 1 : 0), 0);
|
|
23
|
+
return score >= 2 && content.length > 300;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=detectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/ingestion/detectors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAgB;IAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAEhC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAClE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,+DAA+D;IAC/D,IAAI,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,OAAe;IACnE,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,sBAAsB;IACtB,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,OAAO,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface FetchResult {
|
|
2
|
+
content: string;
|
|
3
|
+
contentType: string;
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function fetchWithRetry(url: string, opts?: {
|
|
7
|
+
timeout?: number;
|
|
8
|
+
headers?: Record<string, string>;
|
|
9
|
+
}): Promise<Response>;
|
|
10
|
+
export declare function fetchTextWithFallback(url: string, opts?: {
|
|
11
|
+
timeout?: number;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
text: string;
|
|
15
|
+
contentType: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Smart fetch that prefers llms.txt when possible.
|
|
19
|
+
* When given (or discovering) llms.txt, we first try the sibling llms-full.txt
|
|
20
|
+
* because full concatenated content is ideal for high-quality RAG.
|
|
21
|
+
*/
|
|
22
|
+
export declare function fetchDocumentation(url: string, opts?: {
|
|
23
|
+
discoverLlms?: boolean;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
}): Promise<FetchResult>;
|
|
26
|
+
/** Try sibling/peer llms-full.txt for a given llms.txt (returns null if none usable). */
|
|
27
|
+
export declare function tryFetchLlmsFull(llmsTxtUrl: string, headers?: Record<string, string>): Promise<FetchResult | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Parse an llms.txt (manifest) content for documentation page URLs.
|
|
30
|
+
* Handles common formats: markdown links [Title](url) and bare http(s) lines.
|
|
31
|
+
* Returns absolute deduped URLs (excluding the llms files themselves).
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseLlmsManifestUrls(content: string, baseUrl: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Concurrent fetch for manifest pages. Passes discoverLlms:false so subpages keep their own URL in metadata.
|
|
36
|
+
*/
|
|
37
|
+
export declare function fetchPagesConcurrently(urls: string[], concurrency?: number, onProgress?: (completed: number, total: number) => void, headers?: Record<string, string>): Promise<FetchResult[]>;
|
|
38
|
+
//# sourceMappingURL=fetchers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchers.d.ts","sourceRoot":"","sources":["../../src/ingestion/fetchers.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAiBD,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAChE,OAAO,CAAC,QAAQ,CAAC,CA6BnB;AA4CD,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAChE,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAehD;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GACtE,OAAO,CAAC,WAAW,CAAC,CA+FtB;AAED,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwB5H;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAmChF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,SAAI,EACf,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EACvD,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,WAAW,EAAE,CAAC,CAuBxB"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { logger } from '../core/logger.js';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import { fetchPrimaryGitHubContent, parseGitHubRepoUrl, getGitHubToken, isGitHubRepoUrl } from './github.js';
|
|
5
|
+
const DEFAULT_TIMEOUT = 25_000;
|
|
6
|
+
const MAX_RETRIES = 2;
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
function withTimeout(promise, ms) {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
const timeout = setTimeout(() => controller.abort(), ms);
|
|
11
|
+
return Promise.race([
|
|
12
|
+
promise.finally(() => clearTimeout(timeout)),
|
|
13
|
+
new Promise((_, rej) => setTimeout(() => rej(new Error('Request timeout')), ms + 100)),
|
|
14
|
+
]);
|
|
15
|
+
}
|
|
16
|
+
export async function fetchWithRetry(url, opts = {}) {
|
|
17
|
+
const { timeout = DEFAULT_TIMEOUT, headers = {} } = opts;
|
|
18
|
+
let lastErr = null;
|
|
19
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
20
|
+
try {
|
|
21
|
+
const res = await withTimeout(fetch(url, {
|
|
22
|
+
headers: {
|
|
23
|
+
'User-Agent': 'hoolix/0.2 (https://github.com/JayLLM/hoolix)',
|
|
24
|
+
Accept: '*/*',
|
|
25
|
+
...headers,
|
|
26
|
+
},
|
|
27
|
+
redirect: 'follow',
|
|
28
|
+
}), timeout);
|
|
29
|
+
if (!res.ok)
|
|
30
|
+
throw new Error(`HTTP ${res.status}`);
|
|
31
|
+
return res;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
lastErr = err;
|
|
35
|
+
if (attempt < MAX_RETRIES) {
|
|
36
|
+
const delay = 400 * (attempt + 1);
|
|
37
|
+
logger.debug(`Fetch retry ${attempt + 1} for ${url} after ${delay}ms`);
|
|
38
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw lastErr || new Error('Fetch failed');
|
|
43
|
+
}
|
|
44
|
+
async function fetchTextWithCurl(url, opts = {}) {
|
|
45
|
+
const { timeout = DEFAULT_TIMEOUT, headers = {} } = opts;
|
|
46
|
+
const curl = process.platform === 'win32' ? 'curl.exe' : 'curl';
|
|
47
|
+
const args = [
|
|
48
|
+
'-fsSL',
|
|
49
|
+
'--compressed',
|
|
50
|
+
'--max-time',
|
|
51
|
+
String(Math.ceil(timeout / 1000)),
|
|
52
|
+
'-A',
|
|
53
|
+
headers['User-Agent'] || headers['user-agent'] || 'hoolix/0.2 (https://github.com/JayLLM/hoolix)',
|
|
54
|
+
];
|
|
55
|
+
// Forward all provided headers (critical for Authorization on private GitHub raw.githubusercontent when curl fallback triggers)
|
|
56
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
57
|
+
if (!k || !v)
|
|
58
|
+
continue;
|
|
59
|
+
const key = k.toLowerCase() === 'user-agent' ? 'User-Agent' : k;
|
|
60
|
+
if (key.toLowerCase() === 'accept') {
|
|
61
|
+
args.push('-H', `Accept: ${v}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
args.push('-H', `${key}: ${v}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!Object.keys(headers).some((k) => k.toLowerCase() === 'accept')) {
|
|
68
|
+
args.push('-H', `Accept: ${headers.Accept || headers.accept || '*/*'}`);
|
|
69
|
+
}
|
|
70
|
+
args.push(url);
|
|
71
|
+
try {
|
|
72
|
+
const { stdout } = await execFileAsync(curl, args, {
|
|
73
|
+
encoding: 'utf8',
|
|
74
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
75
|
+
windowsHide: true,
|
|
76
|
+
});
|
|
77
|
+
return stdout.length > 0 ? stdout : null;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
logger.debug(`curl fallback failed for ${url}: ${err?.message || err}`);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function fetchTextWithFallback(url, opts = {}) {
|
|
85
|
+
try {
|
|
86
|
+
const res = await fetchWithRetry(url, opts);
|
|
87
|
+
return {
|
|
88
|
+
text: await res.text(),
|
|
89
|
+
contentType: res.headers.get('content-type') || '',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const text = await fetchTextWithCurl(url, opts);
|
|
94
|
+
if (text) {
|
|
95
|
+
logger.debug(`Fetched ${url} with curl fallback`);
|
|
96
|
+
return { text, contentType: 'text/plain; charset=utf-8' };
|
|
97
|
+
}
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Smart fetch that prefers llms.txt when possible.
|
|
103
|
+
* When given (or discovering) llms.txt, we first try the sibling llms-full.txt
|
|
104
|
+
* because full concatenated content is ideal for high-quality RAG.
|
|
105
|
+
*/
|
|
106
|
+
export async function fetchDocumentation(url, opts = {}) {
|
|
107
|
+
const { discoverLlms = true, headers = {} } = opts;
|
|
108
|
+
const normalized = url.trim();
|
|
109
|
+
// GitHub special-case (early, non-breaking): prefer llms/README discovery + raw fetches.
|
|
110
|
+
// Falls back to normal path on any failure (rate, private w/o token, etc.).
|
|
111
|
+
if (isGitHubRepoUrl(normalized) && discoverLlms) {
|
|
112
|
+
try {
|
|
113
|
+
const ghInfo = parseGitHubRepoUrl(normalized);
|
|
114
|
+
if (ghInfo) {
|
|
115
|
+
const ghPrimary = await fetchPrimaryGitHubContent(ghInfo, { token: getGitHubToken() });
|
|
116
|
+
if (ghPrimary) {
|
|
117
|
+
logger.debug(`GitHub primary content fetched for ${normalized}`);
|
|
118
|
+
return ghPrimary;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
logger.debug(`GitHub primary attempt failed for ${normalized}, falling back: ${e?.message || e}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Direct llms: try full sibling first for best RAG content.
|
|
127
|
+
if (normalized.endsWith('llms.txt') || normalized.endsWith('llms-full.txt')) {
|
|
128
|
+
if (normalized.endsWith('llms.txt')) {
|
|
129
|
+
const full = await tryFetchLlmsFull(normalized, headers);
|
|
130
|
+
if (full)
|
|
131
|
+
return full;
|
|
132
|
+
}
|
|
133
|
+
const { text } = await fetchTextWithFallback(normalized, {
|
|
134
|
+
headers: { Accept: 'text/plain', ...headers },
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
content: text,
|
|
138
|
+
contentType: 'text/markdown',
|
|
139
|
+
url: normalized,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Discovery only for primary call (discoverLlms=true). Sub-pages from manifests use discoverLlms:false
|
|
143
|
+
// to avoid wrong metadata.url and duplicate root content.
|
|
144
|
+
if (discoverLlms) {
|
|
145
|
+
try {
|
|
146
|
+
const u = new URL(normalized);
|
|
147
|
+
const llmsCandidates = [
|
|
148
|
+
`${u.origin}/llms-full.txt`,
|
|
149
|
+
`${u.origin}/llms.txt`,
|
|
150
|
+
`${u.origin}/docs/llms-full.txt`,
|
|
151
|
+
`${u.origin}/docs/llms.txt`,
|
|
152
|
+
];
|
|
153
|
+
// UA rotation + explicit Accept for sites that 404 node-fetch but serve to curl/browser (e.g. docs.x.ai).
|
|
154
|
+
const discoveryUAs = [
|
|
155
|
+
'hoolix/0.2 (https://github.com/JayLLM/hoolix)',
|
|
156
|
+
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
|
|
157
|
+
'curl/8.4.0',
|
|
158
|
+
];
|
|
159
|
+
for (const cand of llmsCandidates) {
|
|
160
|
+
let foundText = null;
|
|
161
|
+
for (const ua of discoveryUAs) {
|
|
162
|
+
try {
|
|
163
|
+
const fetched = await fetchTextWithFallback(cand, {
|
|
164
|
+
timeout: 12000,
|
|
165
|
+
headers: { 'User-Agent': ua, 'Accept': 'text/plain', ...headers },
|
|
166
|
+
});
|
|
167
|
+
if (fetched.text.length > 200) {
|
|
168
|
+
foundText = fetched.text;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// try next UA
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (foundText) {
|
|
177
|
+
// llms.txt hit: still attempt full sibling first.
|
|
178
|
+
if (cand.endsWith('llms.txt')) {
|
|
179
|
+
const full = await tryFetchLlmsFull(cand, headers);
|
|
180
|
+
if (full)
|
|
181
|
+
return full;
|
|
182
|
+
}
|
|
183
|
+
logger.info(`Found llms at ${cand}`);
|
|
184
|
+
return { content: foundText, contentType: 'text/markdown', url: cand };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// invalid for discovery; fall through to direct fetch
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Generic or manifest sub-page content (no llms discovery).
|
|
193
|
+
const res = await fetchWithRetry(normalized, { headers });
|
|
194
|
+
const contentType = res.headers.get('content-type') || '';
|
|
195
|
+
const text = await res.text();
|
|
196
|
+
return {
|
|
197
|
+
content: text,
|
|
198
|
+
contentType,
|
|
199
|
+
url: normalized,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** Try sibling/peer llms-full.txt for a given llms.txt (returns null if none usable). */
|
|
203
|
+
export async function tryFetchLlmsFull(llmsTxtUrl, headers = {}) {
|
|
204
|
+
try {
|
|
205
|
+
const u = new URL(llmsTxtUrl);
|
|
206
|
+
const candidates = [
|
|
207
|
+
llmsTxtUrl.replace(/llms\.txt$/i, 'llms-full.txt'),
|
|
208
|
+
`${u.origin}/llms-full.txt`,
|
|
209
|
+
`${u.origin}/docs/llms-full.txt`,
|
|
210
|
+
];
|
|
211
|
+
for (const cand of candidates) {
|
|
212
|
+
if (cand === llmsTxtUrl)
|
|
213
|
+
continue;
|
|
214
|
+
try {
|
|
215
|
+
const { text } = await fetchTextWithFallback(cand, { timeout: 15000, headers });
|
|
216
|
+
if (text.length > 1500) {
|
|
217
|
+
logger.info(`Found llms-full.txt at ${cand}`);
|
|
218
|
+
return { content: text, contentType: 'text/markdown', url: cand };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// ignore; try next candidate
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// invalid url; no full available
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Parse an llms.txt (manifest) content for documentation page URLs.
|
|
233
|
+
* Handles common formats: markdown links [Title](url) and bare http(s) lines.
|
|
234
|
+
* Returns absolute deduped URLs (excluding the llms files themselves).
|
|
235
|
+
*/
|
|
236
|
+
export function parseLlmsManifestUrls(content, baseUrl) {
|
|
237
|
+
const urls = new Set();
|
|
238
|
+
// markdown links [text](url)
|
|
239
|
+
const linkRe = /\[[^\]]*\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
|
|
240
|
+
let m;
|
|
241
|
+
while ((m = linkRe.exec(content)) !== null) {
|
|
242
|
+
let raw = m[1].trim();
|
|
243
|
+
// strip trailing punctuation leaked from markdown lists
|
|
244
|
+
raw = raw.replace(/[),.]+$/, '');
|
|
245
|
+
if (!raw || raw.startsWith('#') || raw.startsWith('data:') || raw.startsWith('mailto:'))
|
|
246
|
+
continue;
|
|
247
|
+
try {
|
|
248
|
+
const abs = new URL(raw, baseUrl).href;
|
|
249
|
+
if (abs.startsWith('http') && !/\.(png|jpe?g|gif|svg|ico|css|js|woff|ttf|map|json|zip|tar|pdf)$/i.test(abs)) {
|
|
250
|
+
urls.add(abs);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch { }
|
|
254
|
+
}
|
|
255
|
+
// bare https?:// lines (or after links)
|
|
256
|
+
const bareRe = /https?:\/\/\S+/g;
|
|
257
|
+
while ((m = bareRe.exec(content)) !== null) {
|
|
258
|
+
let raw = m[0];
|
|
259
|
+
raw = raw.replace(/[),.]+$/, '');
|
|
260
|
+
try {
|
|
261
|
+
const abs = new URL(raw, baseUrl).href;
|
|
262
|
+
if (abs.startsWith('http') && !/\.(png|jpe?g|gif|svg|ico|css|js|woff|ttf|map|json|zip|tar|pdf)$/i.test(abs)) {
|
|
263
|
+
urls.add(abs);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch { }
|
|
267
|
+
}
|
|
268
|
+
return Array.from(urls).filter((u) => !/llms(-full)?\.txt$/i.test(u) && !u.includes('/assets/') && !u.includes('/images/'));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Concurrent fetch for manifest pages. Passes discoverLlms:false so subpages keep their own URL in metadata.
|
|
272
|
+
*/
|
|
273
|
+
export async function fetchPagesConcurrently(urls, concurrency = 4, onProgress, headers = {}) {
|
|
274
|
+
const results = [];
|
|
275
|
+
const queue = [...urls];
|
|
276
|
+
let completed = 0;
|
|
277
|
+
const total = urls.length;
|
|
278
|
+
const runWorker = async () => {
|
|
279
|
+
while (queue.length > 0) {
|
|
280
|
+
const url = queue.shift();
|
|
281
|
+
try {
|
|
282
|
+
const r = await fetchDocumentation(url, { discoverLlms: false, headers });
|
|
283
|
+
results.push(r);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
logger.debug(`Sub-page fetch failed for ${url}: ${err?.message || err}`);
|
|
287
|
+
}
|
|
288
|
+
completed += 1;
|
|
289
|
+
onProgress?.(completed, total);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
const workers = Array.from({ length: Math.max(1, Math.min(concurrency, 8)) }, () => runWorker());
|
|
293
|
+
await Promise.all(workers);
|
|
294
|
+
return results;
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=fetchers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchers.js","sourceRoot":"","sources":["../../src/ingestion/fetchers.ts"],"names":[],"mappings":"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"}
|