@intentic/webq 1.317.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -0
  3. package/dist/app.d.ts +2 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +38 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +4 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/cache.command.d.ts +3 -0
  12. package/dist/commands/cache.command.d.ts.map +1 -0
  13. package/dist/commands/cache.command.js +54 -0
  14. package/dist/commands/cache.command.js.map +1 -0
  15. package/dist/commands/crawl.command.d.ts +3 -0
  16. package/dist/commands/crawl.command.d.ts.map +1 -0
  17. package/dist/commands/crawl.command.js +77 -0
  18. package/dist/commands/crawl.command.js.map +1 -0
  19. package/dist/commands/fetch.command.d.ts +3 -0
  20. package/dist/commands/fetch.command.d.ts.map +1 -0
  21. package/dist/commands/fetch.command.js +55 -0
  22. package/dist/commands/fetch.command.js.map +1 -0
  23. package/dist/lib/bm25.d.ts +7 -0
  24. package/dist/lib/bm25.d.ts.map +1 -0
  25. package/dist/lib/bm25.js +51 -0
  26. package/dist/lib/bm25.js.map +1 -0
  27. package/dist/lib/browser.d.ts +8 -0
  28. package/dist/lib/browser.d.ts.map +1 -0
  29. package/dist/lib/browser.js +29 -0
  30. package/dist/lib/browser.js.map +1 -0
  31. package/dist/lib/cache.d.ts +15 -0
  32. package/dist/lib/cache.d.ts.map +1 -0
  33. package/dist/lib/cache.js +28 -0
  34. package/dist/lib/cache.js.map +1 -0
  35. package/dist/lib/crawl.d.ts +31 -0
  36. package/dist/lib/crawl.d.ts.map +1 -0
  37. package/dist/lib/crawl.js +188 -0
  38. package/dist/lib/crawl.js.map +1 -0
  39. package/dist/lib/dom.d.ts +23 -0
  40. package/dist/lib/dom.d.ts.map +1 -0
  41. package/dist/lib/dom.js +74 -0
  42. package/dist/lib/dom.js.map +1 -0
  43. package/dist/lib/env.d.ts +2 -0
  44. package/dist/lib/env.d.ts.map +1 -0
  45. package/dist/lib/env.js +4 -0
  46. package/dist/lib/env.js.map +1 -0
  47. package/dist/lib/flags.d.ts +69 -0
  48. package/dist/lib/flags.d.ts.map +1 -0
  49. package/dist/lib/flags.js +23 -0
  50. package/dist/lib/flags.js.map +1 -0
  51. package/dist/lib/http.d.ts +16 -0
  52. package/dist/lib/http.d.ts.map +1 -0
  53. package/dist/lib/http.js +75 -0
  54. package/dist/lib/http.js.map +1 -0
  55. package/dist/lib/links.d.ts +9 -0
  56. package/dist/lib/links.d.ts.map +1 -0
  57. package/dist/lib/links.js +41 -0
  58. package/dist/lib/links.js.map +1 -0
  59. package/dist/lib/markdown.d.ts +6 -0
  60. package/dist/lib/markdown.d.ts.map +1 -0
  61. package/dist/lib/markdown.js +292 -0
  62. package/dist/lib/markdown.js.map +1 -0
  63. package/dist/lib/output.d.ts +20 -0
  64. package/dist/lib/output.d.ts.map +1 -0
  65. package/dist/lib/output.js +64 -0
  66. package/dist/lib/output.js.map +1 -0
  67. package/dist/lib/page.d.ts +26 -0
  68. package/dist/lib/page.d.ts.map +1 -0
  69. package/dist/lib/page.js +153 -0
  70. package/dist/lib/page.js.map +1 -0
  71. package/dist/lib/prune.d.ts +7 -0
  72. package/dist/lib/prune.d.ts.map +1 -0
  73. package/dist/lib/prune.js +100 -0
  74. package/dist/lib/prune.js.map +1 -0
  75. package/dist/lib/robots.d.ts +10 -0
  76. package/dist/lib/robots.d.ts.map +1 -0
  77. package/dist/lib/robots.js +84 -0
  78. package/dist/lib/robots.js.map +1 -0
  79. package/dist/lib/sitemap.d.ts +9 -0
  80. package/dist/lib/sitemap.d.ts.map +1 -0
  81. package/dist/lib/sitemap.js +61 -0
  82. package/dist/lib/sitemap.js.map +1 -0
  83. package/dist/lib/version.d.ts +2 -0
  84. package/dist/lib/version.d.ts.map +1 -0
  85. package/dist/lib/version.js +3 -0
  86. package/dist/lib/version.js.map +1 -0
  87. package/package.json +69 -0
  88. package/src/app.ts +43 -0
  89. package/src/cli.integration.test.ts +191 -0
  90. package/src/cli.ts +6 -0
  91. package/src/commands/cache.command.ts +54 -0
  92. package/src/commands/crawl.command.ts +94 -0
  93. package/src/commands/fetch.command.ts +61 -0
  94. package/src/lib/bm25.test.ts +33 -0
  95. package/src/lib/bm25.ts +70 -0
  96. package/src/lib/browser.ts +42 -0
  97. package/src/lib/cache.ts +44 -0
  98. package/src/lib/crawl.ts +247 -0
  99. package/src/lib/dom.ts +107 -0
  100. package/src/lib/env.ts +6 -0
  101. package/src/lib/flags.ts +41 -0
  102. package/src/lib/http.ts +101 -0
  103. package/src/lib/links.test.ts +37 -0
  104. package/src/lib/links.ts +47 -0
  105. package/src/lib/markdown.test.ts +76 -0
  106. package/src/lib/markdown.ts +337 -0
  107. package/src/lib/output.test.ts +16 -0
  108. package/src/lib/output.ts +86 -0
  109. package/src/lib/page.ts +213 -0
  110. package/src/lib/prune.test.ts +78 -0
  111. package/src/lib/prune.ts +133 -0
  112. package/src/lib/robots.test.ts +52 -0
  113. package/src/lib/robots.ts +102 -0
  114. package/src/lib/sitemap.test.ts +37 -0
  115. package/src/lib/sitemap.ts +74 -0
@@ -0,0 +1,292 @@
1
+ import { attr, isElement, isText, rawTextOf } from "./dom.js";
2
+ const NON_CONTENT = new Set(["script", "style", "noscript", "template", "svg", "canvas", "iframe", "object", "embed", "link", "meta", "head"]);
3
+ const INLINE = {
4
+ strong: { open: "**", close: "**" },
5
+ b: { open: "**", close: "**" },
6
+ em: { open: "*", close: "*" },
7
+ i: { open: "*", close: "*" },
8
+ del: { open: "~~", close: "~~" },
9
+ s: { open: "~~", close: "~~" },
10
+ strike: { open: "~~", close: "~~" },
11
+ kbd: { open: "`", close: "`" },
12
+ };
13
+ const HEADINGS = { h1: 1, h2: 2, h3: 3, h4: 4, h5: 5, h6: 6 };
14
+ export const renderMarkdown = (root, options = {}) => {
15
+ const blocks = renderFlow(root.childNodes, options);
16
+ return `${blocks
17
+ .join("\n\n")
18
+ .replaceAll(/[ \t]+$/gm, "")
19
+ .replaceAll(/\n{3,}/g, "\n\n")
20
+ .trim()}\n`;
21
+ };
22
+ const renderFlow = (nodes, options) => {
23
+ const blocks = [];
24
+ let run = "";
25
+ const flush = () => {
26
+ const paragraph = collapse(run);
27
+ if (paragraph !== "") {
28
+ blocks.push(paragraph);
29
+ }
30
+ run = "";
31
+ };
32
+ for (const node of nodes) {
33
+ if (isText(node)) {
34
+ run += node.value;
35
+ continue;
36
+ }
37
+ if (!isElement(node) || NON_CONTENT.has(node.tagName)) {
38
+ continue;
39
+ }
40
+ const block = renderBlock(node, options);
41
+ if (block === undefined) {
42
+ run += renderInline(node, options);
43
+ }
44
+ else {
45
+ flush();
46
+ if (block !== "") {
47
+ blocks.push(block);
48
+ }
49
+ }
50
+ }
51
+ flush();
52
+ return blocks;
53
+ };
54
+ const renderBlock = (el, options) => {
55
+ const heading = HEADINGS[el.tagName];
56
+ if (heading !== undefined) {
57
+ const text = collapse(renderInlineChildren(el, options));
58
+ return text === "" ? "" : `${"#".repeat(heading)} ${text}`;
59
+ }
60
+ switch (el.tagName) {
61
+ case "p":
62
+ return collapse(renderInlineChildren(el, options));
63
+ case "ul":
64
+ case "ol":
65
+ return renderList(el, options, 0);
66
+ case "pre":
67
+ return renderPre(el);
68
+ case "blockquote":
69
+ return renderFlow(el.childNodes, options)
70
+ .join("\n\n")
71
+ .split("\n")
72
+ .map((line) => `> ${line}`.trimEnd())
73
+ .join("\n");
74
+ case "table":
75
+ return renderTable(el, options);
76
+ case "hr":
77
+ return "---";
78
+ case "figure": {
79
+ const caption = el.childNodes.filter(isElement).find((child) => child.tagName === "figcaption");
80
+ const body = renderFlow(el.childNodes.filter((child) => !(isElement(child) && child.tagName === "figcaption")), options);
81
+ const captionText = caption === undefined ? "" : collapse(renderInlineChildren(caption, options));
82
+ return [body.join("\n\n"), captionText === "" ? "" : `*${captionText}*`].filter(Boolean).join("\n\n");
83
+ }
84
+ case "dl":
85
+ return renderDefinitionList(el, options);
86
+ case "details": {
87
+ const summary = el.childNodes.filter(isElement).find((child) => child.tagName === "summary");
88
+ const rest = renderFlow(el.childNodes.filter((child) => !(isElement(child) && child.tagName === "summary")), options);
89
+ const label = summary === undefined ? "" : `**${collapse(renderInlineChildren(summary, options))}**`;
90
+ return [label, rest.join("\n\n")].filter(Boolean).join("\n\n");
91
+ }
92
+ case "div":
93
+ case "section":
94
+ case "article":
95
+ case "main":
96
+ case "body":
97
+ case "aside":
98
+ case "header":
99
+ case "footer":
100
+ case "nav":
101
+ case "form":
102
+ case "fieldset":
103
+ case "address":
104
+ case "center":
105
+ return renderFlow(el.childNodes, options).join("\n\n");
106
+ default:
107
+ return undefined;
108
+ }
109
+ };
110
+ const renderInlineChildren = (el, options) => el.childNodes.map((child) => (isText(child) ? child.value : isElement(child) ? renderInline(child, options) : "")).join("");
111
+ const renderInline = (el, options) => {
112
+ if (NON_CONTENT.has(el.tagName)) {
113
+ return "";
114
+ }
115
+ if (el.tagName === "br") {
116
+ return BR;
117
+ }
118
+ if (el.tagName === "img") {
119
+ return renderImage(el, options);
120
+ }
121
+ if (el.tagName === "a") {
122
+ return renderLink(el, options);
123
+ }
124
+ if (el.tagName === "code") {
125
+ const code = rawTextOf(el).trim();
126
+ return code.includes("`") ? `\`\` ${code} \`\`` : `\`${code}\``;
127
+ }
128
+ const wrap = INLINE[el.tagName];
129
+ const inner = renderInlineChildren(el, options);
130
+ if (wrap === undefined) {
131
+ return inner;
132
+ }
133
+ const trimmed = collapse(inner);
134
+ return trimmed === "" ? "" : `${wrap.open}${trimmed}${wrap.close}`;
135
+ };
136
+ const renderLink = (el, options) => {
137
+ const text = collapse(renderInlineChildren(el, options));
138
+ const href = resolveUrl(attr(el, "href"), options.baseUrl);
139
+ if (href === undefined || href.startsWith("javascript:")) {
140
+ return text;
141
+ }
142
+ if (href.startsWith("mailto:") || href.startsWith("tel:")) {
143
+ return text === "" ? href.slice(href.indexOf(":") + 1) : text;
144
+ }
145
+ if (text === "") {
146
+ return "";
147
+ }
148
+ return `[${text}](${href})`;
149
+ };
150
+ const renderImage = (el, options) => {
151
+ const alt = attr(el, "alt")?.trim() ?? "";
152
+ const src = resolveUrl(attr(el, "src"), options.baseUrl);
153
+ if (src === undefined || src.startsWith("data:")) {
154
+ return alt;
155
+ }
156
+ return `![${alt}](${src})`;
157
+ };
158
+ const renderList = (el, options, depth) => {
159
+ const ordered = el.tagName === "ol";
160
+ const start = Number(attr(el, "start") ?? "1");
161
+ const items = el.childNodes.filter(isElement).filter((child) => child.tagName === "li");
162
+ const lines = [];
163
+ items.forEach((item, index) => {
164
+ const marker = ordered ? `${start + index}. ` : "- ";
165
+ const indent = " ".repeat(depth);
166
+ const nested = [];
167
+ const inlineParts = [];
168
+ for (const child of item.childNodes) {
169
+ if (isElement(child) && (child.tagName === "ul" || child.tagName === "ol")) {
170
+ nested.push(renderList(child, options, depth + 1));
171
+ }
172
+ else if (isElement(child) && renderBlock(child, options) !== undefined) {
173
+ const block = renderBlock(child, options) ?? "";
174
+ if (block !== "") {
175
+ nested.push(block
176
+ .split("\n")
177
+ .map((line) => `${indent} ${line}`.trimEnd())
178
+ .join("\n"));
179
+ }
180
+ }
181
+ else if (isText(child)) {
182
+ inlineParts.push(child.value);
183
+ }
184
+ else if (isElement(child)) {
185
+ inlineParts.push(renderInline(child, options));
186
+ }
187
+ }
188
+ lines.push(`${indent}${marker}${collapse(inlineParts.join(""))}`);
189
+ lines.push(...nested);
190
+ });
191
+ return lines.join("\n");
192
+ };
193
+ const renderPre = (el) => {
194
+ const codeChild = el.childNodes.filter(isElement).find((child) => child.tagName === "code");
195
+ const classes = `${attr(el, "class") ?? ""} ${codeChild === undefined ? "" : (attr(codeChild, "class") ?? "")}`;
196
+ const lang = /(?:language|lang)-([\w+-]+)/.exec(classes)?.[1] ?? "";
197
+ const code = preTextOf(el).replace(/^\n/, "").trimEnd();
198
+ const longestRun = Math.max(2, ...[...code.matchAll(/`+/g)].map((m) => m[0].length));
199
+ const fence = "`".repeat(Math.max(3, longestRun + 1));
200
+ return `${fence}${lang}\n${code}\n${fence}`;
201
+ };
202
+ const PRE_LINE = new Set(["div", "p", "li", "tr", "section", "article", "table", "tbody", "ul", "ol", "h1", "h2", "h3", "h4", "h5", "h6"]);
203
+ const preTextOf = (node) => {
204
+ if (isText(node)) {
205
+ return node.value;
206
+ }
207
+ if (!isElement(node) || NON_CONTENT.has(node.tagName)) {
208
+ return "";
209
+ }
210
+ if (node.tagName === "br") {
211
+ return "\n";
212
+ }
213
+ let text = "";
214
+ let afterLine = false;
215
+ for (const child of node.childNodes) {
216
+ if (isElement(child) && PRE_LINE.has(child.tagName)) {
217
+ if (text !== "" && !text.endsWith("\n")) {
218
+ text += "\n";
219
+ }
220
+ text += `${preTextOf(child).replace(/\n$/, "")}\n`;
221
+ afterLine = true;
222
+ continue;
223
+ }
224
+ if (afterLine && isText(child) && /^\r?\n$/.test(child.value)) {
225
+ continue;
226
+ }
227
+ text += preTextOf(child);
228
+ afterLine = false;
229
+ }
230
+ return text;
231
+ };
232
+ const renderTable = (el, options) => {
233
+ const rows = [];
234
+ for (const tr of collectRows(el)) {
235
+ const cells = tr.childNodes.filter(isElement).filter((cell) => cell.tagName === "td" || cell.tagName === "th");
236
+ rows.push(cells.map((cell) => collapse(renderInlineChildren(cell, options)).replaceAll("|", "\\|").replaceAll("\n", " ")));
237
+ }
238
+ if (rows.length === 0) {
239
+ return "";
240
+ }
241
+ const width = Math.max(...rows.map((row) => row.length));
242
+ const pad = (row) => [...row, ...Array.from({ length: width - row.length }, () => "")];
243
+ const [header, ...body] = rows.map(pad);
244
+ return [tableRow(header), tableRow(header.map(() => "---")), ...body.map(tableRow)].join("\n");
245
+ };
246
+ const tableRow = (cells) => `| ${cells.join(" | ")} |`;
247
+ const collectRows = (el) => {
248
+ const rows = [];
249
+ for (const child of el.childNodes.filter(isElement)) {
250
+ if (child.tagName === "tr") {
251
+ rows.push(child);
252
+ }
253
+ else if (child.tagName === "thead" || child.tagName === "tbody" || child.tagName === "tfoot") {
254
+ rows.push(...child.childNodes.filter(isElement).filter((row) => row.tagName === "tr"));
255
+ }
256
+ }
257
+ return rows;
258
+ };
259
+ const renderDefinitionList = (el, options) => {
260
+ const lines = [];
261
+ for (const child of el.childNodes.filter(isElement)) {
262
+ if (child.tagName === "dt") {
263
+ lines.push(`**${collapse(renderInlineChildren(child, options))}**`);
264
+ }
265
+ else if (child.tagName === "dd") {
266
+ lines.push(`: ${collapse(renderInlineChildren(child, options))}`);
267
+ }
268
+ }
269
+ return lines.join("\n");
270
+ };
271
+ const resolveUrl = (raw, base) => {
272
+ if (raw === undefined || raw === "") {
273
+ return undefined;
274
+ }
275
+ const trimmed = raw.trim();
276
+ if (/^(?:javascript|mailto|tel|data):/i.test(trimmed)) {
277
+ return trimmed;
278
+ }
279
+ try {
280
+ return base === undefined ? trimmed : new URL(trimmed, base).href;
281
+ }
282
+ catch {
283
+ return undefined;
284
+ }
285
+ };
286
+ const BR = "\u0001";
287
+ const collapse = (text) => text
288
+ .split(BR)
289
+ .map((part) => part.replaceAll(/\s+/g, " ").trim())
290
+ .join("\n")
291
+ .trim();
292
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/lib/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { PageResult } from "./page.js";
2
+ export interface SavedPage {
3
+ readonly path: string;
4
+ readonly tokens: number;
5
+ }
6
+ export declare const slugFor: (url: string) => string;
7
+ export declare const savePage: (outDir: string, page: PageResult, fetchedAt: Date) => Promise<SavedPage>;
8
+ export interface IndexEntry {
9
+ readonly url: string;
10
+ readonly title: string;
11
+ readonly path: string;
12
+ readonly tokens: number;
13
+ readonly depth: number;
14
+ }
15
+ export interface CrawlIndex {
16
+ readonly markdownPath: string;
17
+ readonly jsonPath: string;
18
+ }
19
+ export declare const saveIndex: (outDir: string, startUrl: string, entries: IndexEntry[], skipped: Record<string, number>) => Promise<CrawlIndex>;
20
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,OAAO,QAAS,MAAM,KAAG,MAerC,CAAC;AAEF,eAAO,MAAM,QAAQ,WAAkB,MAAM,QAAQ,UAAU,aAAa,IAAI,KAAG,OAAO,CAAC,SAAS,CAiBnG,CAAC;AAEF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC7B;AAGD,eAAO,MAAM,SAAS,WAAkB,MAAM,YAAY,MAAM,WAAW,UAAU,EAAE,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,UAAU,CAuB5I,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { estimateTokens } from "@intentic/base/format";
5
+ export const slugFor = (url) => {
6
+ const hash = createHash("sha256").update(url).digest("hex").slice(0, 8);
7
+ let readable;
8
+ try {
9
+ const parsed = new URL(url);
10
+ readable = `${parsed.host}${parsed.pathname}`;
11
+ }
12
+ catch {
13
+ readable = url;
14
+ }
15
+ const slug = readable
16
+ .toLowerCase()
17
+ .replaceAll(/[^a-z0-9]+/g, "-")
18
+ .replaceAll(/^-+|-+$/g, "")
19
+ .slice(0, 80);
20
+ return `${slug === "" ? "page" : slug}-${hash}.md`;
21
+ };
22
+ export const savePage = async (outDir, page, fetchedAt) => {
23
+ await mkdir(outDir, { recursive: true });
24
+ const path = join(outDir, slugFor(page.url));
25
+ const frontMatter = [
26
+ "---",
27
+ `url: ${page.url}`,
28
+ ...(page.finalUrl === page.url ? [] : [`final_url: ${page.finalUrl}`]),
29
+ `title: ${JSON.stringify(page.meta.title)}`,
30
+ `fetched_at: ${fetchedAt.toISOString()}`,
31
+ `source: ${page.source}`,
32
+ ...page.notes.map((note) => `note: ${JSON.stringify(note)}`),
33
+ "---",
34
+ "",
35
+ ].join("\n");
36
+ const content = `${frontMatter}${page.markdown}`;
37
+ await writeFile(path, content);
38
+ return { path, tokens: estimateTokens(page.markdown) };
39
+ };
40
+ export const saveIndex = async (outDir, startUrl, entries, skipped) => {
41
+ await mkdir(outDir, { recursive: true });
42
+ const sorted = entries.toSorted((a, b) => a.url.localeCompare(b.url));
43
+ const markdownPath = join(outDir, "index.md");
44
+ const jsonPath = join(outDir, "index.json");
45
+ const skippedLine = Object.entries(skipped)
46
+ .filter(([, count]) => count > 0)
47
+ .map(([reason, count]) => `${reason} ${count}`)
48
+ .join(", ");
49
+ const lines = [
50
+ `# Crawl of ${startUrl}`,
51
+ "",
52
+ `${entries.length} pages, ${entries.reduce((sum, entry) => sum + entry.tokens, 0)} tokens total.`,
53
+ ...(skippedLine === "" ? [] : [`Skipped: ${skippedLine}.`]),
54
+ "",
55
+ "| title | url | file | tokens |",
56
+ "| --- | --- | --- | --- |",
57
+ ...sorted.map((entry) => `| ${entry.title.replaceAll("|", "\\|")} | ${entry.url} | ${entry.path} | ${entry.tokens} |`),
58
+ "",
59
+ ];
60
+ await writeFile(markdownPath, lines.join("\n"));
61
+ await writeFile(jsonPath, JSON.stringify({ startUrl, pages: sorted, skipped }, null, 2));
62
+ return { markdownPath, jsonPath };
63
+ };
64
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type PageMeta } from "./dom.js";
2
+ import { type Link } from "./links.js";
3
+ export type BrowserMode = "auto" | "never" | "force";
4
+ export interface FetchPageOptions {
5
+ readonly raw?: boolean;
6
+ readonly query?: string | undefined;
7
+ readonly browser?: BrowserMode;
8
+ readonly maxAgeS?: number;
9
+ readonly timeoutMs?: number;
10
+ readonly maxBytes?: number;
11
+ readonly threshold?: number | undefined;
12
+ }
13
+ export interface PageResult {
14
+ readonly url: string;
15
+ readonly finalUrl: string;
16
+ readonly status: number;
17
+ readonly contentType: string;
18
+ readonly markdown: string;
19
+ readonly meta: PageMeta;
20
+ readonly links: Link[];
21
+ readonly source: "cache" | "network" | "browser";
22
+ readonly prunedShare: number | undefined;
23
+ readonly notes: string[];
24
+ }
25
+ export declare const fetchPage: (url: string, options?: FetchPageOptions) => Promise<PageResult>;
26
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/lib/page.ts"],"names":[],"mappings":"AAOA,OAAO,EAA8D,KAAK,QAAQ,EAAmC,MAAM,UAAU,CAAC;AAEtI,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAIrD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAE/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAEjD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,SAAS,QAAe,MAAM,YAAW,gBAAgB,KAAQ,OAAO,CAAC,UAAU,CAmD/F,CAAC"}
@@ -0,0 +1,153 @@
1
+ import { neutralizeOutsideText } from "@intentic/base/outside-text";
2
+ import { bm25Rank } from "./bm25.js";
3
+ import { chromiumAvailable, renderPage } from "./browser.js";
4
+ import { cacheRead, cacheWrite, DEFAULT_MAX_AGE_S } from "./cache.js";
5
+ import { bodyOf, elementsByTag, metaOf, parseHtml, remove, textOf, walk } from "./dom.js";
6
+ import { httpFetch, USER_AGENT } from "./http.js";
7
+ import { extractLinks } from "./links.js";
8
+ import { renderMarkdown } from "./markdown.js";
9
+ import { pruneTree } from "./prune.js";
10
+ export const fetchPage = async (url, options = {}) => {
11
+ const browserMode = options.browser ?? "auto";
12
+ const maxAgeS = options.maxAgeS ?? DEFAULT_MAX_AGE_S;
13
+ const timeoutMs = options.timeoutMs ?? 20_000;
14
+ const notes = [];
15
+ let acquired = browserMode === "force" ? undefined : await acquireStatic(url, options, maxAgeS, timeoutMs, notes);
16
+ if (acquired === undefined || (browserMode !== "never" && looksLikeAppShell(acquired.doc, acquired.body))) {
17
+ const rendered = await acquireBrowser(url, maxAgeS, timeoutMs, notes);
18
+ if (rendered !== undefined) {
19
+ acquired = rendered;
20
+ }
21
+ else if (acquired === undefined) {
22
+ throw new Error("browser rendering unavailable (no Chromium in this image) and --browser force was asked for");
23
+ }
24
+ }
25
+ const { doc, body, finalUrl, status, contentType, source } = acquired;
26
+ if (!isHtml(contentType)) {
27
+ return {
28
+ url,
29
+ finalUrl,
30
+ status,
31
+ contentType,
32
+ markdown: neutralizeOutsideText(nonHtmlMarkdown(acquired.rawBody, contentType, notes)),
33
+ meta: { title: url, description: undefined, lang: undefined },
34
+ links: [],
35
+ source,
36
+ prunedShare: undefined,
37
+ notes,
38
+ };
39
+ }
40
+ const rawMeta = metaOf(doc);
41
+ const meta = {
42
+ title: neutralizeOutsideText(rawMeta.title),
43
+ description: rawMeta.description === undefined ? undefined : neutralizeOutsideText(rawMeta.description),
44
+ lang: rawMeta.lang,
45
+ };
46
+ const links = extractLinks(doc, finalUrl);
47
+ let prunedShare;
48
+ if (body !== undefined && options.raw !== true) {
49
+ prunedShare = pruneTree(body, options.threshold === undefined ? {} : { threshold: options.threshold });
50
+ }
51
+ if (body !== undefined && options.query !== undefined && options.query !== "") {
52
+ notes.push(applyQueryFilter(body, options.query));
53
+ }
54
+ const markdown = body === undefined ? "" : neutralizeOutsideText(renderMarkdown(body, { baseUrl: finalUrl }));
55
+ return { url, finalUrl, status, contentType, markdown, meta, links, source, prunedShare, notes };
56
+ };
57
+ const acquireStatic = async (url, options, maxAgeS, timeoutMs, notes) => {
58
+ const cached = maxAgeS > 0 ? await cacheRead(url, "static", maxAgeS) : undefined;
59
+ if (cached !== undefined) {
60
+ return parsed(cached.body, cached.finalUrl, cached.status, cached.contentType, "cache");
61
+ }
62
+ const fetched = await httpFetch(url, {
63
+ timeoutMs,
64
+ userAgent: USER_AGENT,
65
+ ...(options.maxBytes === undefined ? {} : { maxBytes: options.maxBytes }),
66
+ });
67
+ if (fetched.truncated) {
68
+ notes.push("byte cap hit mid-body: this page is cut short");
69
+ }
70
+ await cacheWrite({
71
+ url,
72
+ finalUrl: fetched.finalUrl,
73
+ status: fetched.status,
74
+ contentType: fetched.contentType,
75
+ body: fetched.body,
76
+ mode: "static",
77
+ fetchedAt: Date.now(),
78
+ });
79
+ return parsed(fetched.body, fetched.finalUrl, fetched.status, fetched.contentType, "network");
80
+ };
81
+ const acquireBrowser = async (url, maxAgeS, timeoutMs, notes) => {
82
+ const mode = "browser";
83
+ const cached = maxAgeS > 0 ? await cacheRead(url, mode, maxAgeS) : undefined;
84
+ if (cached !== undefined) {
85
+ return parsed(cached.body, cached.finalUrl, cached.status, cached.contentType, "browser");
86
+ }
87
+ if (!(await chromiumAvailable())) {
88
+ notes.push("page looks JS-rendered but this image has no Chromium (browser feature pack): static HTML served best-effort");
89
+ return undefined;
90
+ }
91
+ const rendered = await renderPage(url, timeoutMs);
92
+ await cacheWrite({ url, finalUrl: rendered.finalUrl, status: 200, contentType: "text/html", body: rendered.html, mode, fetchedAt: Date.now() });
93
+ return parsed(rendered.html, rendered.finalUrl, 200, "text/html", "browser");
94
+ };
95
+ const parsed = (html, finalUrl, status, contentType, source) => {
96
+ const doc = isHtml(contentType) ? parseHtml(html) : parseHtml("");
97
+ return { doc, body: bodyOf(doc), rawBody: html, finalUrl, status, contentType, source };
98
+ };
99
+ const isHtml = (contentType) => contentType === "" || /text\/html|application\/xhtml/i.test(contentType);
100
+ const looksLikeAppShell = (doc, body) => {
101
+ if (body === undefined) {
102
+ return false;
103
+ }
104
+ const text = textOf(body);
105
+ if (text.length >= 200) {
106
+ return false;
107
+ }
108
+ return elementsByTag(doc, "script").length > 0;
109
+ };
110
+ const nonHtmlMarkdown = (rawBody, contentType, notes) => {
111
+ if (/json/i.test(contentType)) {
112
+ return `\`\`\`json\n${rawBody.trim()}\n\`\`\`\n`;
113
+ }
114
+ if (/xml/i.test(contentType)) {
115
+ return `\`\`\`xml\n${rawBody.trim()}\n\`\`\`\n`;
116
+ }
117
+ if (/^text\//i.test(contentType)) {
118
+ return `${rawBody.trim()}\n`;
119
+ }
120
+ notes.push(`unsupported content type ${contentType.split(";")[0] ?? contentType}: no markdown produced`);
121
+ return "";
122
+ };
123
+ const FILTERABLE = new Set(["p", "li", "pre", "table", "blockquote", "dd"]);
124
+ const applyQueryFilter = (body, query) => {
125
+ const candidates = [];
126
+ walk(body, (el) => {
127
+ if (FILTERABLE.has(el.tagName) && !hasFilterableAncestorWithin(el, body)) {
128
+ candidates.push(el);
129
+ }
130
+ });
131
+ const ranked = bm25Rank(candidates, (el) => textOf(el), query);
132
+ const keep = new Set(ranked.map((entry) => entry.block));
133
+ if (keep.size < Math.min(3, candidates.length)) {
134
+ return `query matched too little (${keep.size}/${candidates.length} blocks): kept the whole page`;
135
+ }
136
+ for (const candidate of candidates) {
137
+ if (!keep.has(candidate)) {
138
+ remove(candidate);
139
+ }
140
+ }
141
+ return `query kept ${keep.size}/${candidates.length} blocks`;
142
+ };
143
+ const hasFilterableAncestorWithin = (el, root) => {
144
+ let parent = el.parentNode;
145
+ while (parent !== null && parent !== root) {
146
+ if ("tagName" in parent && FILTERABLE.has(parent.tagName)) {
147
+ return true;
148
+ }
149
+ parent = "parentNode" in parent && parent.parentNode !== undefined ? parent.parentNode : null;
150
+ }
151
+ return false;
152
+ };
153
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/lib/page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type Element } from "./dom.js";
2
+ export interface PruneOptions {
3
+ readonly threshold?: number;
4
+ readonly minWords?: number;
5
+ }
6
+ export declare const pruneTree: (body: Element, options?: PruneOptions) => number;
7
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../src/lib/prune.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,OAAO,EAAqC,MAAM,UAAU,CAAC;AA2BhG,MAAM,WAAW,YAAY;IAEzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD,eAAO,MAAM,SAAS,SAAU,OAAO,YAAW,YAAY,KAAQ,MAWrE,CAAC"}