openclaw-smart-fetch 0.1.15 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +92 -17
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ It registers:
|
|
|
7
7
|
- `batch_smart_fetch`
|
|
8
8
|
|
|
9
9
|
It combines:
|
|
10
|
-
-
|
|
10
|
+
- `@thinkscape/wreq-js` for browser-like transport fingerprints
|
|
11
11
|
- `Defuddle` for readable content extraction
|
|
12
12
|
|
|
13
13
|
## Why use this instead of OpenClaw's built-in `web_fetch`
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { getProfiles, fetch } from '@thinkscape/wreq-js';
|
|
2
3
|
import { Defuddle } from 'defuddle/node';
|
|
3
|
-
import { getProfiles, fetch } from 'wreq-js';
|
|
4
4
|
import { parseHTML } from 'linkedom';
|
|
5
5
|
|
|
6
6
|
// src/index.ts
|
|
@@ -188,7 +188,7 @@ function extractDomTextFallback(document) {
|
|
|
188
188
|
return bodyText.replace(/\r\n/g, "\n").replace(/\n{3,}/g, "\n\n").split("\n").map((line) => line.trim()).join("\n").replace(/[ \t]{2,}/g, " ").trim();
|
|
189
189
|
}
|
|
190
190
|
function escapeMarkdownText(value) {
|
|
191
|
-
return value.replace(/([\\`*_{}
|
|
191
|
+
return value.replace(/([\\`*_{}[\]()+#.!|>-])/g, "\\$1");
|
|
192
192
|
}
|
|
193
193
|
function normalizeInlineWhitespace(value) {
|
|
194
194
|
return value.replace(/\s+/g, " ").trim();
|
|
@@ -309,6 +309,40 @@ function extractDomMarkdownFallback(document) {
|
|
|
309
309
|
if (!root) return "";
|
|
310
310
|
return Array.from(root.childNodes).map((node) => renderBlockMarkdown(node)).join("").replace(/\r\n/g, "\n").replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
311
311
|
}
|
|
312
|
+
function emitProgress(hooks, update) {
|
|
313
|
+
hooks.onProgressChange?.(update);
|
|
314
|
+
}
|
|
315
|
+
function emitStatus(hooks, status) {
|
|
316
|
+
hooks.onStatusChange?.(status);
|
|
317
|
+
}
|
|
318
|
+
function mapRequestEventToProgress(event) {
|
|
319
|
+
switch (event.type) {
|
|
320
|
+
case "request_start":
|
|
321
|
+
return { status: "connecting", progress: 0, phase: event.type };
|
|
322
|
+
case "request_sent":
|
|
323
|
+
return { status: "waiting", progress: 0.11, phase: event.type };
|
|
324
|
+
case "response_headers":
|
|
325
|
+
return { status: "loading", progress: 0.51, phase: event.type };
|
|
326
|
+
case "body_progress": {
|
|
327
|
+
const contentLength = event.contentLength;
|
|
328
|
+
const downloadedBytes = event.downloadedBytes ?? 0;
|
|
329
|
+
const bodyFraction = contentLength && contentLength > 0 ? Math.max(0, Math.min(1, downloadedBytes / contentLength)) : Math.max(0, Math.min(1, downloadedBytes / 65536));
|
|
330
|
+
return {
|
|
331
|
+
status: "loading",
|
|
332
|
+
progress: contentLength && contentLength > 0 ? 0.51 + bodyFraction * 0.44 : 0.51,
|
|
333
|
+
phase: event.type
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
case "body_complete":
|
|
337
|
+
return { status: "loading", progress: 0.95, phase: event.type };
|
|
338
|
+
case "done":
|
|
339
|
+
return { status: "done", progress: 1, phase: event.type };
|
|
340
|
+
case "error":
|
|
341
|
+
return { status: "error", progress: 1, phase: event.type };
|
|
342
|
+
default:
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
312
346
|
function resolveAcceptHeader(format) {
|
|
313
347
|
return format === "json" ? DEFAULT_JSON_ACCEPT_HEADER : DEFAULT_ACCEPT_HEADER;
|
|
314
348
|
}
|
|
@@ -383,7 +417,18 @@ function createDefuddleFetch(dependencies = runtimeDependencies) {
|
|
|
383
417
|
if (opts.proxy) {
|
|
384
418
|
fetchOptions.proxy = opts.proxy;
|
|
385
419
|
}
|
|
386
|
-
hooks
|
|
420
|
+
emitProgress(hooks, {
|
|
421
|
+
status: "connecting",
|
|
422
|
+
progress: 0,
|
|
423
|
+
phase: "fetch_start"
|
|
424
|
+
});
|
|
425
|
+
fetchOptions.onRequestEvent = (event) => {
|
|
426
|
+
const mapped = mapRequestEventToProgress(event);
|
|
427
|
+
if (mapped) {
|
|
428
|
+
emitProgress(hooks, mapped);
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
fetchOptions.captureDiagnostics = true;
|
|
387
432
|
const response = await dependencies.fetch(opts.url, fetchOptions);
|
|
388
433
|
if (!response.ok) {
|
|
389
434
|
return {
|
|
@@ -408,7 +453,12 @@ function createDefuddleFetch(dependencies = runtimeDependencies) {
|
|
|
408
453
|
os
|
|
409
454
|
);
|
|
410
455
|
if (!isError(result2)) {
|
|
411
|
-
hooks
|
|
456
|
+
emitStatus(hooks, "done");
|
|
457
|
+
emitProgress(hooks, {
|
|
458
|
+
status: "done",
|
|
459
|
+
progress: 1,
|
|
460
|
+
phase: "json_done"
|
|
461
|
+
});
|
|
412
462
|
}
|
|
413
463
|
return result2;
|
|
414
464
|
}
|
|
@@ -423,7 +473,12 @@ function createDefuddleFetch(dependencies = runtimeDependencies) {
|
|
|
423
473
|
os
|
|
424
474
|
);
|
|
425
475
|
if (!isError(result2)) {
|
|
426
|
-
hooks
|
|
476
|
+
emitStatus(hooks, "done");
|
|
477
|
+
emitProgress(hooks, {
|
|
478
|
+
status: "done",
|
|
479
|
+
progress: 1,
|
|
480
|
+
phase: "json_done"
|
|
481
|
+
});
|
|
427
482
|
}
|
|
428
483
|
return result2;
|
|
429
484
|
}
|
|
@@ -437,13 +492,23 @@ function createDefuddleFetch(dependencies = runtimeDependencies) {
|
|
|
437
492
|
browser,
|
|
438
493
|
os
|
|
439
494
|
);
|
|
440
|
-
hooks
|
|
495
|
+
emitStatus(hooks, "done");
|
|
496
|
+
emitProgress(hooks, {
|
|
497
|
+
status: "done",
|
|
498
|
+
progress: 1,
|
|
499
|
+
phase: "plain_text_done"
|
|
500
|
+
});
|
|
441
501
|
return result2;
|
|
442
502
|
}
|
|
443
503
|
if (!HTML_CONTENT_TYPES.some((value) => contentType.includes(value))) {
|
|
444
504
|
return { error: `Not an HTML page (content-type: ${contentType})` };
|
|
445
505
|
}
|
|
446
|
-
hooks
|
|
506
|
+
emitStatus(hooks, "processing");
|
|
507
|
+
emitProgress(hooks, {
|
|
508
|
+
status: "processing",
|
|
509
|
+
progress: 0.96,
|
|
510
|
+
phase: "extracting"
|
|
511
|
+
});
|
|
447
512
|
const fallbackDocument = parseLinkedomHTML(rawBody, finalUrl);
|
|
448
513
|
const extractionDocument = parseLinkedomHTML(rawBody, finalUrl);
|
|
449
514
|
const extracted = await dependencies.defuddle(
|
|
@@ -490,7 +555,8 @@ function createDefuddleFetch(dependencies = runtimeDependencies) {
|
|
|
490
555
|
browser,
|
|
491
556
|
os
|
|
492
557
|
};
|
|
493
|
-
hooks
|
|
558
|
+
emitStatus(hooks, "done");
|
|
559
|
+
emitProgress(hooks, { status: "done", progress: 1, phase: "done" });
|
|
494
560
|
return result;
|
|
495
561
|
};
|
|
496
562
|
}
|
|
@@ -600,8 +666,10 @@ async function executeFetchToolCall(params, defaults, hooks = {}) {
|
|
|
600
666
|
}
|
|
601
667
|
var PROGRESS_BY_STATUS = {
|
|
602
668
|
queued: 0,
|
|
603
|
-
|
|
604
|
-
|
|
669
|
+
connecting: 0,
|
|
670
|
+
waiting: 0.11,
|
|
671
|
+
loading: 0.51,
|
|
672
|
+
processing: 0.96,
|
|
605
673
|
done: 1,
|
|
606
674
|
error: 1
|
|
607
675
|
};
|
|
@@ -610,7 +678,8 @@ function createInitialProgressItems(requests) {
|
|
|
610
678
|
index,
|
|
611
679
|
url: typeof request.url === "string" ? request.url : String(request.url ?? ""),
|
|
612
680
|
status: "queued",
|
|
613
|
-
progress: PROGRESS_BY_STATUS.queued
|
|
681
|
+
progress: PROGRESS_BY_STATUS.queued,
|
|
682
|
+
statusStartedAt: Date.now()
|
|
614
683
|
}));
|
|
615
684
|
}
|
|
616
685
|
function buildProgressSnapshot(items, batchConcurrency) {
|
|
@@ -644,21 +713,23 @@ async function executeBatchFetchToolCall(params, defaults, options = {}) {
|
|
|
644
713
|
);
|
|
645
714
|
const progressItems = createInitialProgressItems(requests);
|
|
646
715
|
const results = new Array(requests.length);
|
|
647
|
-
const
|
|
716
|
+
const emitProgress2 = () => {
|
|
648
717
|
options.onProgress?.(
|
|
649
718
|
buildProgressSnapshot(progressItems, batchConcurrency)
|
|
650
719
|
);
|
|
651
720
|
};
|
|
652
|
-
const updateProgress = (index, status, error) => {
|
|
721
|
+
const updateProgress = (index, status, error, progress) => {
|
|
722
|
+
const previous = progressItems[index];
|
|
653
723
|
progressItems[index] = {
|
|
654
|
-
...
|
|
724
|
+
...previous,
|
|
655
725
|
status,
|
|
656
|
-
progress: PROGRESS_BY_STATUS[status],
|
|
726
|
+
progress: progress === void 0 ? PROGRESS_BY_STATUS[status] : Math.max(0, Math.min(1, progress)),
|
|
727
|
+
statusStartedAt: previous?.status === status ? previous.statusStartedAt : Date.now(),
|
|
657
728
|
...error ? { error } : {}
|
|
658
729
|
};
|
|
659
|
-
|
|
730
|
+
emitProgress2();
|
|
660
731
|
};
|
|
661
|
-
|
|
732
|
+
emitProgress2();
|
|
662
733
|
let nextIndex = 0;
|
|
663
734
|
const worker = async () => {
|
|
664
735
|
while (true) {
|
|
@@ -675,6 +746,10 @@ async function executeBatchFetchToolCall(params, defaults, options = {}) {
|
|
|
675
746
|
onStatusChange(status) {
|
|
676
747
|
if (status === "done") return;
|
|
677
748
|
updateProgress(index, status);
|
|
749
|
+
},
|
|
750
|
+
onProgressChange(update) {
|
|
751
|
+
if (update.status === "done") return;
|
|
752
|
+
updateProgress(index, update.status, void 0, update.progress);
|
|
678
753
|
}
|
|
679
754
|
});
|
|
680
755
|
if (isError(result)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/constants.ts","../../core/src/dependencies.ts","../../core/src/dom.ts","../../core/src/format.ts","../../core/src/extract.ts","../../core/src/tool.ts","../src/index.ts"],"names":["wreqFetch","defuddleFetch","result","Type"],"mappings":"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","file":"index.js","sourcesContent":["import type { FingerprintOs } from \"./types\";\n\nexport const DEFAULT_BROWSER = \"chrome_145\";\nexport const DEFAULT_OS: FingerprintOs = \"windows\";\nexport const DEFAULT_MAX_CHARS = 50_000;\nexport const DEFAULT_TIMEOUT_MS = 15_000;\nexport const DEFAULT_BATCH_CONCURRENCY = 8;\nexport const DEFAULT_INCLUDE_REPLIES = \"extractors\" as const;\nexport const DEFAULT_ACCEPT_HEADER =\n \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\";\nexport const DEFAULT_JSON_ACCEPT_HEADER =\n \"application/json,text/json,application/ld+json;q=0.9,text/plain;q=0.8,*/*;q=0.7\";\nexport const DEFAULT_ACCEPT_LANGUAGE_HEADER = \"en-US,en;q=0.9\";\n","import { Defuddle } from \"defuddle/node\";\nimport { getProfiles, fetch as wreqFetch } from \"wreq-js\";\nimport type { FetchDependencies } from \"./types\";\n\nexport const runtimeDependencies: FetchDependencies = {\n fetch: wreqFetch,\n defuddle: Defuddle,\n getProfiles,\n};\n","import { parseHTML } from \"linkedom\";\n\n/** Apply linkedom polyfills that Defuddle expects (getComputedStyle, styleSheets). */\nexport function parseLinkedomHTML(html: string, url?: string): Document {\n const { document } = parseHTML(html);\n const doc = document as Document & Record<string, unknown>;\n const defaultView = doc.defaultView as\n | (Window & {\n getComputedStyle?: (\n elt: Element,\n pseudoElt?: string | null,\n ) => CSSStyleDeclaration;\n })\n | undefined;\n\n if (!(doc as { styleSheets?: unknown }).styleSheets) {\n (doc as { styleSheets?: unknown }).styleSheets =\n [] as unknown as StyleSheetList;\n }\n\n if (defaultView && !defaultView.getComputedStyle) {\n defaultView.getComputedStyle = (() => ({\n display: \"\",\n })) as unknown as typeof defaultView.getComputedStyle;\n }\n\n if (url) {\n (doc as { URL?: string }).URL = url;\n }\n\n return document;\n}\n","import type {\n BatchFetchItemResult,\n BatchFetchResult,\n FetchError,\n FetchResult,\n OutputFormat,\n} from \"./types\";\n\nfunction buildHeader(\n parts: Array<[label: string, value: string | number | undefined]>,\n) {\n return parts\n .filter(([, value]) => value !== undefined && value !== \"\")\n .map(([label, value]) => `> ${label}: ${value}`)\n .join(\"\\n\");\n}\n\nexport function markdownToText(markdown: string): string {\n return markdown\n .replace(/^#{1,6}\\s+/gm, \"\")\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n .replace(/\\*([^*]+)\\*/g, \"$1\")\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n .replace(/!\\[[^\\]]*\\]\\([^)]+\\)/g, \"\")\n .replace(/^>\\s+/gm, \"\")\n .replace(/^[-*+]\\s+/gm, \"• \")\n .replace(/`([^`]+)`/g, \"$1\");\n}\n\nexport function truncateContent(content: string, maxChars: number): string {\n if (content.length <= maxChars) return content;\n return `${content.slice(0, maxChars)}\\n\\n[... truncated]`;\n}\n\nexport function buildCompactMetadataHeader(result: FetchResult): string {\n return buildHeader([\n [\"URL\", result.finalUrl],\n [\"Title\", result.title],\n [\"Author\", result.author],\n [\"Published\", result.published],\n ]);\n}\n\nexport function buildMetadataHeader(result: FetchResult): string {\n return buildHeader([\n [\"URL\", result.finalUrl],\n [\"Title\", result.title],\n [\"Author\", result.author],\n [\"Published\", result.published],\n [\"Site\", result.site],\n [\"Language\", result.language],\n [\"Words\", result.wordCount],\n [\"Browser\", `${result.browser}/${result.os}`],\n ]);\n}\n\nexport function buildFetchResponseText(\n result: FetchResult,\n options: { verbose?: boolean } = {},\n): string {\n const header = options.verbose\n ? buildMetadataHeader(result)\n : buildCompactMetadataHeader(result);\n\n return header ? `${header}\\n\\n${result.content}` : result.content;\n}\n\nfunction buildBatchItemHeading(\n item: BatchFetchItemResult,\n total: number,\n): string {\n const ordinal = item.index + 1;\n const url = item.result?.finalUrl ?? item.request.url;\n return `## [${ordinal}/${total}] ${url}`;\n}\n\nfunction buildBatchItemText(\n item: BatchFetchItemResult,\n total: number,\n options: { verbose?: boolean } = {},\n): string {\n const heading = buildBatchItemHeading(item, total);\n\n if (item.status === \"error\") {\n const errorHeader = buildHeader([\n [\"URL\", item.request.url],\n [\"Status\", \"error\"],\n [\"Error\", item.error ?? \"Unknown error\"],\n ]);\n return `${heading}\\n${errorHeader}`;\n }\n\n return `${heading}\\n${buildFetchResponseText(item.result as FetchResult, options)}`;\n}\n\nexport function buildBatchFetchResponseText(\n result: BatchFetchResult,\n options: { verbose?: boolean } = {},\n): string {\n const summary = buildHeader([\n [\"Requests\", result.total],\n [\"Succeeded\", result.succeeded],\n [\"Failed\", result.failed],\n [\"Concurrency\", result.batchConcurrency],\n ]);\n const items = result.items.map((item) =>\n buildBatchItemText(item, result.total, options),\n );\n\n return [summary, ...items].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport function estimateWordCount(content: string): number {\n const words = content.trim().match(/\\S+/g);\n return words?.length ?? 0;\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function parseAndFormatJson(\n raw: string,\n): { formatted: string } | FetchError {\n try {\n return {\n formatted: JSON.stringify(JSON.parse(raw), null, 2),\n };\n } catch {\n return { error: \"Invalid JSON response\" };\n }\n}\n\nexport function renderJsonContent(\n formattedJson: string,\n format: OutputFormat,\n): string {\n switch (format) {\n case \"json\":\n case \"text\":\n return formattedJson;\n case \"html\":\n return `<pre><code class=\"language-json\">${escapeHtml(formattedJson)}</code></pre>`;\n default:\n return `\\`\\`\\`json\\n${formattedJson}\\n\\`\\`\\``;\n }\n}\n\nexport function stripExtractorComments(\n content: string,\n format: OutputFormat,\n): string {\n if (format === \"html\") {\n return content\n .replace(/\\s*<hr>\\s*<div class=\"[^\"]* comments\">[\\s\\S]*$/i, \"\")\n .trimEnd();\n }\n\n return content.replace(/\\n---\\n+## Comments\\n[\\s\\S]*$/i, \"\").trimEnd();\n}\n","/**\n * Core extraction pipeline: fetch with TLS fingerprinting → parse → Defuddle extract.\n * Separated from the plugin entry so it can be tested independently.\n */\n\nimport {\n DEFAULT_ACCEPT_HEADER,\n DEFAULT_ACCEPT_LANGUAGE_HEADER,\n DEFAULT_BROWSER,\n DEFAULT_INCLUDE_REPLIES,\n DEFAULT_JSON_ACCEPT_HEADER,\n DEFAULT_MAX_CHARS,\n DEFAULT_OS,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants\";\nimport { runtimeDependencies } from \"./dependencies\";\nimport { parseLinkedomHTML } from \"./dom\";\nimport {\n estimateWordCount,\n markdownToText,\n parseAndFormatJson,\n renderJsonContent,\n stripExtractorComments,\n truncateContent,\n} from \"./format\";\nimport { getLatestChromeProfile as getLatestChromeProfileFrom } from \"./profiles\";\nimport type {\n FetchDependencies,\n FetchError,\n FetchExecutionHooks,\n FetchOptions,\n FetchResult,\n OutputFormat,\n} from \"./types\";\n\nexport {\n DEFAULT_BATCH_CONCURRENCY,\n DEFAULT_BROWSER,\n DEFAULT_INCLUDE_REPLIES,\n DEFAULT_MAX_CHARS,\n DEFAULT_OS,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants\";\nexport type {\n FetchError,\n FetchOptions,\n FetchResult,\n OutputFormat,\n} from \"./types\";\n\nconst HTML_CONTENT_TYPES = [\n \"text/html\",\n \"application/xhtml+xml\",\n \"text/plain\",\n \"text/markdown\",\n];\n\nfunction normalizeContentType(contentType: string): string {\n return contentType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n}\n\nfunction isPlainTextContentType(contentType: string): boolean {\n const normalized = normalizeContentType(contentType);\n return normalized === \"text/plain\" || normalized === \"text/markdown\";\n}\n\nfunction renderPlainTextContent(body: string, format: OutputFormat): string {\n if (format === \"html\") {\n return `<pre>${body\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")}</pre>`;\n }\n\n return body;\n}\n\nfunction buildPlainTextResult(\n opts: FetchOptions,\n finalUrl: string,\n rawBody: string,\n format: OutputFormat,\n maxChars: number,\n browser: string,\n os: string,\n): FetchResult {\n const normalizedBody = rawBody.replace(/\\r\\n/g, \"\\n\").trim();\n return {\n url: opts.url,\n finalUrl,\n title: \"\",\n author: \"\",\n published: \"\",\n site: new URL(finalUrl).hostname,\n language: \"\",\n wordCount: estimateWordCount(normalizedBody),\n content: truncateContent(\n renderPlainTextContent(normalizedBody, format),\n maxChars,\n ),\n browser,\n os,\n };\n}\n\nfunction extractDomTextFallback(document: Document): string {\n const bodyText =\n document.body?.textContent ?? document.documentElement?.textContent ?? \"\";\n return bodyText\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\"\\n\")\n .replace(/[ \\t]{2,}/g, \" \")\n .trim();\n}\n\nfunction escapeMarkdownText(value: string): string {\n return value.replace(/([\\\\`*_{}\\[\\]()#+-.!|>])/g, \"\\\\$1\");\n}\n\nfunction normalizeInlineWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction renderInlineMarkdown(node: Node): string {\n if (node.nodeType === 3) {\n return normalizeInlineWhitespace(node.textContent ?? \"\");\n }\n\n if (node.nodeType !== 1) {\n return \"\";\n }\n\n const element = node as Element;\n const tag = element.tagName.toLowerCase();\n\n if ([\"script\", \"style\", \"meta\", \"link\"].includes(tag)) {\n return \"\";\n }\n\n if (tag === \"br\") {\n return \" \\n\";\n }\n\n if (tag === \"code\") {\n const content = normalizeInlineWhitespace(element.textContent ?? \"\");\n return content ? `\\`${content}\\`` : \"\";\n }\n\n if (tag === \"img\") {\n const alt = element.getAttribute(\"alt\") ?? \"\";\n const src = element.getAttribute(\"src\") ?? \"\";\n return src ? `` : \"\";\n }\n\n const childContent = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (tag === \"a\") {\n const href = element.getAttribute(\"href\") ?? \"\";\n if (!href) return childContent;\n return `[${childContent || href}](${href})`;\n }\n\n if ([\"strong\", \"b\"].includes(tag)) {\n return childContent ? `**${childContent}**` : \"\";\n }\n\n if ([\"em\", \"i\"].includes(tag)) {\n return childContent ? `*${childContent}*` : \"\";\n }\n\n return childContent;\n}\n\nfunction renderBlockMarkdown(node: Node, depth = 0): string {\n if (node.nodeType === 3) {\n const text = normalizeInlineWhitespace(node.textContent ?? \"\");\n return text ? `${text}\\n\\n` : \"\";\n }\n\n if (node.nodeType !== 1) {\n return \"\";\n }\n\n const element = node as Element;\n const tag = element.tagName.toLowerCase();\n\n if ([\"script\", \"style\", \"meta\", \"link\"].includes(tag)) {\n return \"\";\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const level = Number.parseInt(tag.slice(1), 10);\n const content = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return content ? `${\"#\".repeat(level)} ${content}\\n\\n` : \"\";\n }\n\n if (tag === \"p\") {\n const content = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return content ? `${content}\\n\\n` : \"\";\n }\n\n if (tag === \"pre\") {\n const content = (element.textContent ?? \"\").trim();\n return content ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`\\n\\n` : \"\";\n }\n\n if (tag === \"blockquote\") {\n const content = Array.from(element.childNodes)\n .map((child) => renderBlockMarkdown(child, depth))\n .join(\"\")\n .trim();\n if (!content) return \"\";\n return `${content\n .split(\"\\n\")\n .map((line) => (line ? `> ${line}` : \">\"))\n .join(\"\\n\")}\\n\\n`;\n }\n\n if (tag === \"ul\" || tag === \"ol\") {\n const items = Array.from(element.children)\n .filter((child) => child.tagName.toLowerCase() === \"li\")\n .map((child, index) => {\n const prefix = tag === \"ol\" ? `${index + 1}. ` : \"- \";\n const content = Array.from(child.childNodes)\n .map((grandchild) => {\n const childTag =\n grandchild.nodeType === 1\n ? (grandchild as Element).tagName.toLowerCase()\n : \"\";\n return childTag === \"ul\" || childTag === \"ol\"\n ? `\\n${renderBlockMarkdown(grandchild, depth + 1)}`\n : renderInlineMarkdown(grandchild);\n })\n .join(\" \")\n .replace(/\\s+\\n/g, \"\\n\")\n .replace(/\\n\\s+/g, \"\\n\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!content) return \"\";\n const indented = content\n .split(\"\\n\")\n .map((line, lineIndex) =>\n lineIndex === 0\n ? `${\" \".repeat(depth)}${prefix}${line}`\n : `${\" \".repeat(depth + 1)}${line}`,\n )\n .join(\"\\n\");\n return indented;\n })\n .filter(Boolean)\n .join(\"\\n\");\n return items ? `${items}\\n\\n` : \"\";\n }\n\n if (tag === \"hr\") {\n return \"---\\n\\n\";\n }\n\n const blockContent = Array.from(element.childNodes)\n .map((child) => renderBlockMarkdown(child, depth))\n .join(\"\");\n\n if (blockContent.trim()) {\n return blockContent;\n }\n\n const inlineContent = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return inlineContent ? `${inlineContent}\\n\\n` : \"\";\n}\n\nfunction extractDomMarkdownFallback(document: Document): string {\n const root = document.body ?? document.documentElement;\n if (!root) return \"\";\n\n return Array.from(root.childNodes)\n .map((node) => renderBlockMarkdown(node))\n .join(\"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nfunction resolveAcceptHeader(format: OutputFormat): string {\n return format === \"json\" ? DEFAULT_JSON_ACCEPT_HEADER : DEFAULT_ACCEPT_HEADER;\n}\n\nfunction isJsonContentType(contentType: string): boolean {\n const normalized = contentType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n return (\n normalized === \"application/json\" ||\n normalized === \"text/json\" ||\n normalized.endsWith(\"+json\")\n );\n}\n\nfunction isLikelyJsonBody(body: string): boolean {\n const trimmed = body.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n}\n\nfunction isJsonResponse(contentType: string, body: string): boolean {\n return isJsonContentType(contentType) || isLikelyJsonBody(body);\n}\n\nfunction buildJsonResult(\n opts: FetchOptions,\n finalUrl: string,\n rawBody: string,\n format: OutputFormat,\n maxChars: number,\n browser: string,\n os: string,\n): FetchResult | FetchError {\n const parsedJson = parseAndFormatJson(rawBody);\n\n if (\"error\" in parsedJson) {\n return parsedJson;\n }\n\n const content = truncateContent(\n renderJsonContent(parsedJson.formatted, format),\n maxChars,\n );\n\n return {\n url: opts.url,\n finalUrl,\n title: \"\",\n author: \"\",\n published: \"\",\n site: new URL(finalUrl).hostname,\n language: \"\",\n wordCount: estimateWordCount(parsedJson.formatted),\n content,\n browser,\n os,\n };\n}\n\nfunction shouldStripReplies(site: string): boolean {\n return (\n site === \"Hacker News\" ||\n site.startsWith(\"r/\") ||\n site.startsWith(\"GitHub - \")\n );\n}\n\nexport function getLatestChromeProfile(): string {\n return getLatestChromeProfileFrom(runtimeDependencies.getProfiles);\n}\n\nexport function createDefuddleFetch(\n dependencies: FetchDependencies = runtimeDependencies,\n) {\n return async function defuddleFetch(\n opts: FetchOptions,\n hooks: FetchExecutionHooks = {},\n ): Promise<FetchResult | FetchError> {\n const browser = opts.browser ?? DEFAULT_BROWSER;\n const os = opts.os ?? DEFAULT_OS;\n const format: OutputFormat = opts.format ?? \"markdown\";\n const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;\n const removeImages = opts.removeImages ?? false;\n const includeReplies = opts.includeReplies ?? DEFAULT_INCLUDE_REPLIES;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n let parsed: URL;\n try {\n parsed = new URL(opts.url);\n } catch {\n return { error: `Invalid URL: ${opts.url}` };\n }\n\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n return {\n error: `Only http/https URLs supported, got ${parsed.protocol}`,\n };\n }\n\n const fetchOptions: Record<string, unknown> = {\n browser,\n os,\n headers: {\n Accept: resolveAcceptHeader(format),\n \"Accept-Language\": DEFAULT_ACCEPT_LANGUAGE_HEADER,\n ...opts.headers,\n },\n redirect: \"follow\",\n timeout: timeoutMs,\n };\n\n if (opts.proxy) {\n fetchOptions.proxy = opts.proxy;\n }\n\n hooks.onStatusChange?.(\"fetching\");\n const response = await dependencies.fetch(opts.url, fetchOptions);\n\n if (!response.ok) {\n return {\n error: `HTTP ${response.status} ${response.statusText} for ${opts.url}`,\n };\n }\n\n const finalUrl = response.url ?? opts.url;\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const rawBody = await response.text();\n const jsonResponse = isJsonResponse(contentType, rawBody);\n\n if (format === \"json\") {\n if (!jsonResponse) {\n return { error: `Not a JSON response (content-type: ${contentType})` };\n }\n\n const result = buildJsonResult(\n opts,\n finalUrl,\n rawBody,\n format,\n maxChars,\n browser,\n os,\n );\n if (!isError(result)) {\n hooks.onStatusChange?.(\"done\");\n }\n return result;\n }\n\n if (jsonResponse) {\n const result = buildJsonResult(\n opts,\n finalUrl,\n rawBody,\n format,\n maxChars,\n browser,\n os,\n );\n if (!isError(result)) {\n hooks.onStatusChange?.(\"done\");\n }\n return result;\n }\n\n if (isPlainTextContentType(contentType)) {\n const result = buildPlainTextResult(\n opts,\n finalUrl,\n rawBody,\n format,\n maxChars,\n browser,\n os,\n );\n hooks.onStatusChange?.(\"done\");\n return result;\n }\n\n if (!HTML_CONTENT_TYPES.some((value) => contentType.includes(value))) {\n return { error: `Not an HTML page (content-type: ${contentType})` };\n }\n\n hooks.onStatusChange?.(\"extracting\");\n const fallbackDocument = parseLinkedomHTML(rawBody, finalUrl);\n const extractionDocument = parseLinkedomHTML(rawBody, finalUrl);\n const extracted = await dependencies.defuddle(\n extractionDocument,\n finalUrl,\n {\n markdown: format !== \"html\",\n removeImages,\n includeReplies,\n },\n );\n\n let extractedContent = extracted.content;\n let wordCount = extracted.wordCount;\n\n if (!extractedContent || wordCount === 0) {\n const fallbackText = extractDomTextFallback(fallbackDocument);\n if (!fallbackText) {\n return {\n error: `No content extracted from ${opts.url}. May need JS rendering or is blocked.`,\n };\n }\n\n extractedContent =\n format === \"html\"\n ? rawBody\n : format === \"markdown\"\n ? extractDomMarkdownFallback(fallbackDocument) || fallbackText\n : fallbackText;\n wordCount = estimateWordCount(fallbackText);\n }\n\n if (includeReplies === false && shouldStripReplies(extracted.site ?? \"\")) {\n const strippedContent = stripExtractorComments(extractedContent, format);\n if (strippedContent !== extractedContent) {\n extractedContent = strippedContent;\n wordCount = estimateWordCount(\n format === \"text\"\n ? markdownToText(extractedContent)\n : extractedContent,\n );\n }\n }\n\n const normalizedContent =\n format === \"text\" ? markdownToText(extractedContent) : extractedContent;\n\n const result = {\n url: opts.url,\n finalUrl,\n title: extracted.title ?? \"\",\n author: extracted.author ?? \"\",\n published: extracted.published ?? \"\",\n site: extracted.site ?? \"\",\n language: extracted.language ?? \"\",\n wordCount,\n content: truncateContent(normalizedContent, maxChars),\n browser,\n os,\n };\n\n hooks.onStatusChange?.(\"done\");\n return result;\n };\n}\n\nexport const defuddleFetch = createDefuddleFetch();\n\n/** Type guard: check if result is an error. */\nexport function isError(\n result: FetchResult | FetchError,\n): result is FetchError {\n return \"error\" in result;\n}\n","import { type TSchema, Type } from \"@sinclair/typebox\";\nimport {\n DEFAULT_BATCH_CONCURRENCY,\n DEFAULT_BROWSER,\n DEFAULT_INCLUDE_REPLIES,\n DEFAULT_MAX_CHARS,\n DEFAULT_OS,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants\";\nimport { defuddleFetch, isError } from \"./extract\";\nimport type {\n BatchFetchItemProgress,\n BatchFetchItemResult,\n BatchFetchItemStatus,\n BatchFetchProgressSnapshot,\n BatchFetchResult,\n FetchError,\n FetchExecutionHooks,\n FetchOptions,\n FetchResult,\n FetchToolConfig,\n FetchToolDefaults,\n} from \"./types\";\n\nfunction resolveBatchConcurrency(value: number | undefined): number {\n if (!value || !Number.isFinite(value)) {\n return DEFAULT_BATCH_CONCURRENCY;\n }\n\n return Math.max(1, Math.floor(value));\n}\n\nexport function resolveFetchToolDefaults(\n config: FetchToolConfig = {},\n): FetchToolDefaults {\n return {\n maxChars: config.maxChars ?? DEFAULT_MAX_CHARS,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n browser: config.browser ?? DEFAULT_BROWSER,\n os: config.os ?? DEFAULT_OS,\n removeImages: config.removeImages ?? false,\n includeReplies: config.includeReplies ?? DEFAULT_INCLUDE_REPLIES,\n batchConcurrency: resolveBatchConcurrency(config.batchConcurrency),\n };\n}\n\nexport function createBaseFetchToolParameterProperties(\n defaults: FetchToolDefaults,\n): Record<string, TSchema> {\n return {\n url: Type.String({ description: \"URL to fetch (http/https only)\" }),\n browser: Type.Optional(\n Type.String({\n description: `Browser profile for TLS fingerprinting. Default: \"${defaults.browser}\". Examples: chrome_145, firefox_147, safari_26, edge_145, opera_127`,\n }),\n ),\n os: Type.Optional(\n Type.String({\n description: `OS profile for fingerprinting. Default: \"${defaults.os}\". Options: windows, macos, linux, android, ios`,\n }),\n ),\n headers: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n description:\n \"Custom HTTP headers to send. By default, Accept and Accept-Language are set automatically.\",\n }),\n ),\n maxChars: Type.Optional(\n Type.Number({\n description: `Maximum characters to return. Default: ${defaults.maxChars}`,\n }),\n ),\n format: Type.Optional(\n Type.Union(\n [\n Type.Literal(\"markdown\"),\n Type.Literal(\"html\"),\n Type.Literal(\"text\"),\n Type.Literal(\"json\"),\n ],\n {\n description:\n 'Output format. \"markdown\" (default), \"html\" (cleaned HTML), \"text\" (plain text, no formatting), or \"json\" (pretty-printed JSON)',\n },\n ),\n ),\n removeImages: Type.Optional(\n Type.Boolean({\n description: \"Strip image references from output. Default: false\",\n }),\n ),\n includeReplies: Type.Optional(\n Type.Union([Type.Boolean(), Type.Literal(\"extractors\")], {\n description:\n \"Include replies/comments: 'extractors' for site-specific only (default), true for all, false for none\",\n }),\n ),\n proxy: Type.Optional(\n Type.String({\n description:\n \"Proxy URL (http://user:pass@host:port or socks5://host:port)\",\n }),\n ),\n };\n}\n\nexport function createBatchFetchToolParameterProperties(\n defaults: FetchToolDefaults,\n): Record<string, TSchema> {\n return {\n requests: Type.Array(\n Type.Object(createBaseFetchToolParameterProperties(defaults), {\n additionalProperties: false,\n }),\n {\n minItems: 1,\n description:\n \"Array of fetch requests. Each item accepts the same parameters as the single-item fetch tool.\",\n },\n ),\n };\n}\n\nfunction buildFetchOptionsFromParams(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n): FetchOptions {\n return {\n url: params.url as string,\n browser: (params.browser as string) ?? defaults.browser,\n os: (params.os as string) ?? defaults.os,\n headers: params.headers as Record<string, string> | undefined,\n maxChars: (params.maxChars as number) ?? defaults.maxChars,\n format:\n (params.format as \"markdown\" | \"html\" | \"text\" | \"json\") ?? \"markdown\",\n removeImages: (params.removeImages as boolean) ?? defaults.removeImages,\n includeReplies:\n (params.includeReplies as boolean | \"extractors\") ??\n defaults.includeReplies,\n proxy: params.proxy as string | undefined,\n timeoutMs: defaults.timeoutMs,\n };\n}\n\nexport async function executeFetchToolCall(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n hooks: FetchExecutionHooks = {},\n): Promise<FetchResult | FetchError> {\n return defuddleFetch(buildFetchOptionsFromParams(params, defaults), hooks);\n}\n\nconst PROGRESS_BY_STATUS: Record<BatchFetchItemStatus, number> = {\n queued: 0,\n fetching: 0.35,\n extracting: 0.75,\n done: 1,\n error: 1,\n};\n\nfunction createInitialProgressItems(\n requests: Record<string, unknown>[],\n): BatchFetchItemProgress[] {\n return requests.map((request, index) => ({\n index,\n url:\n typeof request.url === \"string\" ? request.url : String(request.url ?? \"\"),\n status: \"queued\",\n progress: PROGRESS_BY_STATUS.queued,\n }));\n}\n\nfunction buildProgressSnapshot(\n items: BatchFetchItemProgress[],\n batchConcurrency: number,\n): BatchFetchProgressSnapshot {\n let completed = 0;\n let succeeded = 0;\n let failed = 0;\n\n for (const item of items) {\n if (item.status === \"done\" || item.status === \"error\") {\n completed += 1;\n }\n if (item.status === \"done\") {\n succeeded += 1;\n }\n if (item.status === \"error\") {\n failed += 1;\n }\n }\n\n return {\n items: items.map((item) => ({ ...item })),\n total: items.length,\n completed,\n succeeded,\n failed,\n batchConcurrency,\n };\n}\n\nexport async function executeBatchFetchToolCall(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n options: {\n batchConcurrency?: number;\n onProgress?(snapshot: BatchFetchProgressSnapshot): void;\n executeItem?(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n hooks?: FetchExecutionHooks,\n ): Promise<FetchResult | FetchError>;\n } = {},\n): Promise<BatchFetchResult> {\n const requests = (\n (params.requests as Record<string, unknown>[] | undefined) ?? []\n ).map((request) => request ?? {});\n const batchConcurrency = resolveBatchConcurrency(\n options.batchConcurrency ?? defaults.batchConcurrency,\n );\n const progressItems = createInitialProgressItems(requests);\n const results = new Array<BatchFetchItemResult>(requests.length);\n\n const emitProgress = () => {\n options.onProgress?.(\n buildProgressSnapshot(progressItems, batchConcurrency),\n );\n };\n\n const updateProgress = (\n index: number,\n status: BatchFetchItemStatus,\n error?: string,\n ) => {\n progressItems[index] = {\n ...progressItems[index],\n status,\n progress: PROGRESS_BY_STATUS[status],\n ...(error ? { error } : {}),\n };\n emitProgress();\n };\n\n emitProgress();\n\n let nextIndex = 0;\n\n const worker = async () => {\n while (true) {\n const index = nextIndex;\n nextIndex += 1;\n\n if (index >= requests.length) {\n return;\n }\n\n const request = requests[index] ?? {};\n const normalizedRequest = buildFetchOptionsFromParams(request, defaults);\n\n try {\n const executeItem = options.executeItem ?? executeFetchToolCall;\n const result = await executeItem(request, defaults, {\n onStatusChange(status) {\n if (status === \"done\") return;\n updateProgress(index, status);\n },\n });\n\n if (isError(result)) {\n results[index] = {\n index,\n request: normalizedRequest,\n status: \"error\",\n progress: PROGRESS_BY_STATUS.error,\n error: result.error,\n };\n updateProgress(index, \"error\", result.error);\n continue;\n }\n\n results[index] = {\n index,\n request: normalizedRequest,\n status: \"done\",\n progress: PROGRESS_BY_STATUS.done,\n result,\n };\n updateProgress(index, \"done\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results[index] = {\n index,\n request: normalizedRequest,\n status: \"error\",\n progress: PROGRESS_BY_STATUS.error,\n error: message,\n };\n updateProgress(index, \"error\", message);\n }\n }\n };\n\n const workerCount =\n requests.length === 0 ? 0 : Math.min(batchConcurrency, requests.length);\n await Promise.all(Array.from({ length: workerCount }, async () => worker()));\n\n const finalSnapshot = buildProgressSnapshot(progressItems, batchConcurrency);\n\n return {\n items: results,\n total: finalSnapshot.total,\n succeeded: finalSnapshot.succeeded,\n failed: finalSnapshot.failed,\n batchConcurrency,\n };\n}\n","import { Type } from \"@sinclair/typebox\";\nimport {\n buildBatchFetchResponseText,\n buildFetchResponseText,\n createBaseFetchToolParameterProperties,\n createBatchFetchToolParameterProperties,\n executeBatchFetchToolCall,\n executeFetchToolCall,\n type FetchResult,\n isError,\n resolveFetchToolDefaults,\n} from \"smart-fetch-core\";\nimport type { PluginConfig, ToolRegistrationApi } from \"./types\";\n\nexport const resolvePluginDefaults = (pluginConfig: PluginConfig = {}) =>\n resolveFetchToolDefaults(pluginConfig);\n\nfunction renderToolResponse(result: FetchResult) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: buildFetchResponseText(result, { verbose: true }),\n },\n ],\n };\n}\n\nconst plugin = {\n id: \"smart-fetch\",\n name: \"Smart Fetch\",\n description:\n \"Clean web content extraction with TLS fingerprinting. Uses wreq-js (Rust native bindings) for browser-grade TLS and Defuddle for extraction.\",\n\n register(api: ToolRegistrationApi) {\n const defaults = resolvePluginDefaults(api.pluginConfig);\n\n api.registerTool({\n name: \"smart_fetch\",\n description: [\n \"Fetch a URL with browser-grade TLS fingerprinting and extract clean, readable content.\",\n \"Uses Rust native bindings to impersonate real browsers at the TLS/HTTP2 level (JA3/JA4 match).\",\n \"Returns markdown with rich metadata (author, publish date, schema.org data).\",\n \"Better noise removal and anti-bot bypass than web_fetch.\",\n \"Does NOT execute JavaScript — use the browser tool for JS-heavy SPAs.\",\n ].join(\" \"),\n parameters: Type.Object(createBaseFetchToolParameterProperties(defaults)),\n\n async execute(_toolCallId: string, params: Record<string, unknown>) {\n const result = await executeFetchToolCall(params, defaults);\n\n if (isError(result)) {\n return {\n content: [\n { type: \"text\" as const, text: `Error: ${result.error}` },\n ],\n isError: true,\n };\n }\n\n return renderToolResponse(result);\n },\n });\n\n api.registerTool({\n name: \"batch_smart_fetch\",\n description: [\n \"Fetch multiple URLs with browser-grade TLS fingerprinting and clean readable extraction.\",\n \"Each request item accepts the same parameters as smart_fetch and runs with bounded concurrency.\",\n \"Returns clearly labeled per-item results with full content for successes and bot-friendly per-item errors for failures.\",\n \"Does NOT execute JavaScript — use the browser tool for JS-heavy SPAs.\",\n ].join(\" \"),\n parameters: Type.Object(\n createBatchFetchToolParameterProperties(defaults),\n ),\n\n async execute(_toolCallId: string, params: Record<string, unknown>) {\n const result = await executeBatchFetchToolCall(params, defaults, {\n batchConcurrency: defaults.batchConcurrency,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: buildBatchFetchResponseText(result, { verbose: true }),\n },\n ],\n };\n },\n });\n\n api.logger.info(\n `smart_fetch tools registered (default: ${defaults.browser}/${defaults.os}, batch concurrency: ${defaults.batchConcurrency})`,\n );\n },\n};\n\nexport default plugin;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/constants.ts","../../core/src/dependencies.ts","../../core/src/dom.ts","../../core/src/format.ts","../../core/src/extract.ts","../../core/src/tool.ts","../src/index.ts"],"names":["wreqFetch","defuddleFetch","result","emitProgress","Type"],"mappings":"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","file":"index.js","sourcesContent":["import type { FingerprintOs } from \"./types\";\n\nexport const DEFAULT_BROWSER = \"chrome_145\";\nexport const DEFAULT_OS: FingerprintOs = \"windows\";\nexport const DEFAULT_MAX_CHARS = 50_000;\nexport const DEFAULT_TIMEOUT_MS = 15_000;\nexport const DEFAULT_BATCH_CONCURRENCY = 8;\nexport const DEFAULT_INCLUDE_REPLIES = \"extractors\" as const;\nexport const DEFAULT_ACCEPT_HEADER =\n \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\";\nexport const DEFAULT_JSON_ACCEPT_HEADER =\n \"application/json,text/json,application/ld+json;q=0.9,text/plain;q=0.8,*/*;q=0.7\";\nexport const DEFAULT_ACCEPT_LANGUAGE_HEADER = \"en-US,en;q=0.9\";\n","import { getProfiles, fetch as wreqFetch } from \"@thinkscape/wreq-js\";\nimport { Defuddle } from \"defuddle/node\";\nimport type { FetchDependencies } from \"./types\";\n\nexport const runtimeDependencies: FetchDependencies = {\n fetch: wreqFetch,\n defuddle: Defuddle,\n getProfiles,\n};\n","import { parseHTML } from \"linkedom\";\n\n/** Apply linkedom polyfills that Defuddle expects (getComputedStyle, styleSheets). */\nexport function parseLinkedomHTML(html: string, url?: string): Document {\n const { document } = parseHTML(html);\n const doc = document as Document & Record<string, unknown>;\n const defaultView = doc.defaultView as\n | (Window & {\n getComputedStyle?: (\n elt: Element,\n pseudoElt?: string | null,\n ) => CSSStyleDeclaration;\n })\n | undefined;\n\n if (!(doc as { styleSheets?: unknown }).styleSheets) {\n (doc as { styleSheets?: unknown }).styleSheets =\n [] as unknown as StyleSheetList;\n }\n\n if (defaultView && !defaultView.getComputedStyle) {\n defaultView.getComputedStyle = (() => ({\n display: \"\",\n })) as unknown as typeof defaultView.getComputedStyle;\n }\n\n if (url) {\n (doc as { URL?: string }).URL = url;\n }\n\n return document;\n}\n","import type {\n BatchFetchItemResult,\n BatchFetchResult,\n FetchError,\n FetchResult,\n OutputFormat,\n} from \"./types\";\n\nfunction buildHeader(\n parts: Array<[label: string, value: string | number | undefined]>,\n) {\n return parts\n .filter(([, value]) => value !== undefined && value !== \"\")\n .map(([label, value]) => `> ${label}: ${value}`)\n .join(\"\\n\");\n}\n\nexport function markdownToText(markdown: string): string {\n return markdown\n .replace(/^#{1,6}\\s+/gm, \"\")\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n .replace(/\\*([^*]+)\\*/g, \"$1\")\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n .replace(/!\\[[^\\]]*\\]\\([^)]+\\)/g, \"\")\n .replace(/^>\\s+/gm, \"\")\n .replace(/^[-*+]\\s+/gm, \"• \")\n .replace(/`([^`]+)`/g, \"$1\");\n}\n\nexport function truncateContent(content: string, maxChars: number): string {\n if (content.length <= maxChars) return content;\n return `${content.slice(0, maxChars)}\\n\\n[... truncated]`;\n}\n\nexport function buildCompactMetadataHeader(result: FetchResult): string {\n return buildHeader([\n [\"URL\", result.finalUrl],\n [\"Title\", result.title],\n [\"Author\", result.author],\n [\"Published\", result.published],\n ]);\n}\n\nexport function buildMetadataHeader(result: FetchResult): string {\n return buildHeader([\n [\"URL\", result.finalUrl],\n [\"Title\", result.title],\n [\"Author\", result.author],\n [\"Published\", result.published],\n [\"Site\", result.site],\n [\"Language\", result.language],\n [\"Words\", result.wordCount],\n [\"Browser\", `${result.browser}/${result.os}`],\n ]);\n}\n\nexport function buildFetchResponseText(\n result: FetchResult,\n options: { verbose?: boolean } = {},\n): string {\n const header = options.verbose\n ? buildMetadataHeader(result)\n : buildCompactMetadataHeader(result);\n\n return header ? `${header}\\n\\n${result.content}` : result.content;\n}\n\nfunction buildBatchItemHeading(\n item: BatchFetchItemResult,\n total: number,\n): string {\n const ordinal = item.index + 1;\n const url = item.result?.finalUrl ?? item.request.url;\n return `## [${ordinal}/${total}] ${url}`;\n}\n\nfunction buildBatchItemText(\n item: BatchFetchItemResult,\n total: number,\n options: { verbose?: boolean } = {},\n): string {\n const heading = buildBatchItemHeading(item, total);\n\n if (item.status === \"error\") {\n const errorHeader = buildHeader([\n [\"URL\", item.request.url],\n [\"Status\", \"error\"],\n [\"Error\", item.error ?? \"Unknown error\"],\n ]);\n return `${heading}\\n${errorHeader}`;\n }\n\n return `${heading}\\n${buildFetchResponseText(item.result as FetchResult, options)}`;\n}\n\nexport function buildBatchFetchResponseText(\n result: BatchFetchResult,\n options: { verbose?: boolean } = {},\n): string {\n const summary = buildHeader([\n [\"Requests\", result.total],\n [\"Succeeded\", result.succeeded],\n [\"Failed\", result.failed],\n [\"Concurrency\", result.batchConcurrency],\n ]);\n const items = result.items.map((item) =>\n buildBatchItemText(item, result.total, options),\n );\n\n return [summary, ...items].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport function estimateWordCount(content: string): number {\n const words = content.trim().match(/\\S+/g);\n return words?.length ?? 0;\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function parseAndFormatJson(\n raw: string,\n): { formatted: string } | FetchError {\n try {\n return {\n formatted: JSON.stringify(JSON.parse(raw), null, 2),\n };\n } catch {\n return { error: \"Invalid JSON response\" };\n }\n}\n\nexport function renderJsonContent(\n formattedJson: string,\n format: OutputFormat,\n): string {\n switch (format) {\n case \"json\":\n case \"text\":\n return formattedJson;\n case \"html\":\n return `<pre><code class=\"language-json\">${escapeHtml(formattedJson)}</code></pre>`;\n default:\n return `\\`\\`\\`json\\n${formattedJson}\\n\\`\\`\\``;\n }\n}\n\nexport function stripExtractorComments(\n content: string,\n format: OutputFormat,\n): string {\n if (format === \"html\") {\n return content\n .replace(/\\s*<hr>\\s*<div class=\"[^\"]* comments\">[\\s\\S]*$/i, \"\")\n .trimEnd();\n }\n\n return content.replace(/\\n---\\n+## Comments\\n[\\s\\S]*$/i, \"\").trimEnd();\n}\n","/**\n * Core extraction pipeline: fetch with TLS fingerprinting → parse → Defuddle extract.\n * Separated from the plugin entry so it can be tested independently.\n */\n\nimport {\n DEFAULT_ACCEPT_HEADER,\n DEFAULT_ACCEPT_LANGUAGE_HEADER,\n DEFAULT_BROWSER,\n DEFAULT_INCLUDE_REPLIES,\n DEFAULT_JSON_ACCEPT_HEADER,\n DEFAULT_MAX_CHARS,\n DEFAULT_OS,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants\";\nimport { runtimeDependencies } from \"./dependencies\";\nimport { parseLinkedomHTML } from \"./dom\";\nimport {\n estimateWordCount,\n markdownToText,\n parseAndFormatJson,\n renderJsonContent,\n stripExtractorComments,\n truncateContent,\n} from \"./format\";\nimport { getLatestChromeProfile as getLatestChromeProfileFrom } from \"./profiles\";\nimport type {\n FetchDependencies,\n FetchError,\n FetchExecutionHooks,\n FetchOptions,\n FetchProgressUpdate,\n FetchResult,\n OutputFormat,\n} from \"./types\";\n\nexport {\n DEFAULT_BATCH_CONCURRENCY,\n DEFAULT_BROWSER,\n DEFAULT_INCLUDE_REPLIES,\n DEFAULT_MAX_CHARS,\n DEFAULT_OS,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants\";\nexport type {\n FetchError,\n FetchOptions,\n FetchResult,\n OutputFormat,\n} from \"./types\";\n\nconst HTML_CONTENT_TYPES = [\n \"text/html\",\n \"application/xhtml+xml\",\n \"text/plain\",\n \"text/markdown\",\n];\n\nfunction normalizeContentType(contentType: string): string {\n return contentType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n}\n\nfunction isPlainTextContentType(contentType: string): boolean {\n const normalized = normalizeContentType(contentType);\n return normalized === \"text/plain\" || normalized === \"text/markdown\";\n}\n\nfunction renderPlainTextContent(body: string, format: OutputFormat): string {\n if (format === \"html\") {\n return `<pre>${body\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")}</pre>`;\n }\n\n return body;\n}\n\nfunction buildPlainTextResult(\n opts: FetchOptions,\n finalUrl: string,\n rawBody: string,\n format: OutputFormat,\n maxChars: number,\n browser: string,\n os: string,\n): FetchResult {\n const normalizedBody = rawBody.replace(/\\r\\n/g, \"\\n\").trim();\n return {\n url: opts.url,\n finalUrl,\n title: \"\",\n author: \"\",\n published: \"\",\n site: new URL(finalUrl).hostname,\n language: \"\",\n wordCount: estimateWordCount(normalizedBody),\n content: truncateContent(\n renderPlainTextContent(normalizedBody, format),\n maxChars,\n ),\n browser,\n os,\n };\n}\n\nfunction extractDomTextFallback(document: Document): string {\n const bodyText =\n document.body?.textContent ?? document.documentElement?.textContent ?? \"\";\n return bodyText\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\"\\n\")\n .replace(/[ \\t]{2,}/g, \" \")\n .trim();\n}\n\nfunction escapeMarkdownText(value: string): string {\n return value.replace(/([\\\\`*_{}[\\]()+#.!|>-])/g, \"\\\\$1\");\n}\n\nfunction normalizeInlineWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction renderInlineMarkdown(node: Node): string {\n if (node.nodeType === 3) {\n return normalizeInlineWhitespace(node.textContent ?? \"\");\n }\n\n if (node.nodeType !== 1) {\n return \"\";\n }\n\n const element = node as Element;\n const tag = element.tagName.toLowerCase();\n\n if ([\"script\", \"style\", \"meta\", \"link\"].includes(tag)) {\n return \"\";\n }\n\n if (tag === \"br\") {\n return \" \\n\";\n }\n\n if (tag === \"code\") {\n const content = normalizeInlineWhitespace(element.textContent ?? \"\");\n return content ? `\\`${content}\\`` : \"\";\n }\n\n if (tag === \"img\") {\n const alt = element.getAttribute(\"alt\") ?? \"\";\n const src = element.getAttribute(\"src\") ?? \"\";\n return src ? `` : \"\";\n }\n\n const childContent = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (tag === \"a\") {\n const href = element.getAttribute(\"href\") ?? \"\";\n if (!href) return childContent;\n return `[${childContent || href}](${href})`;\n }\n\n if ([\"strong\", \"b\"].includes(tag)) {\n return childContent ? `**${childContent}**` : \"\";\n }\n\n if ([\"em\", \"i\"].includes(tag)) {\n return childContent ? `*${childContent}*` : \"\";\n }\n\n return childContent;\n}\n\nfunction renderBlockMarkdown(node: Node, depth = 0): string {\n if (node.nodeType === 3) {\n const text = normalizeInlineWhitespace(node.textContent ?? \"\");\n return text ? `${text}\\n\\n` : \"\";\n }\n\n if (node.nodeType !== 1) {\n return \"\";\n }\n\n const element = node as Element;\n const tag = element.tagName.toLowerCase();\n\n if ([\"script\", \"style\", \"meta\", \"link\"].includes(tag)) {\n return \"\";\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const level = Number.parseInt(tag.slice(1), 10);\n const content = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return content ? `${\"#\".repeat(level)} ${content}\\n\\n` : \"\";\n }\n\n if (tag === \"p\") {\n const content = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return content ? `${content}\\n\\n` : \"\";\n }\n\n if (tag === \"pre\") {\n const content = (element.textContent ?? \"\").trim();\n return content ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`\\n\\n` : \"\";\n }\n\n if (tag === \"blockquote\") {\n const content = Array.from(element.childNodes)\n .map((child) => renderBlockMarkdown(child, depth))\n .join(\"\")\n .trim();\n if (!content) return \"\";\n return `${content\n .split(\"\\n\")\n .map((line) => (line ? `> ${line}` : \">\"))\n .join(\"\\n\")}\\n\\n`;\n }\n\n if (tag === \"ul\" || tag === \"ol\") {\n const items = Array.from(element.children)\n .filter((child) => child.tagName.toLowerCase() === \"li\")\n .map((child, index) => {\n const prefix = tag === \"ol\" ? `${index + 1}. ` : \"- \";\n const content = Array.from(child.childNodes)\n .map((grandchild) => {\n const childTag =\n grandchild.nodeType === 1\n ? (grandchild as Element).tagName.toLowerCase()\n : \"\";\n return childTag === \"ul\" || childTag === \"ol\"\n ? `\\n${renderBlockMarkdown(grandchild, depth + 1)}`\n : renderInlineMarkdown(grandchild);\n })\n .join(\" \")\n .replace(/\\s+\\n/g, \"\\n\")\n .replace(/\\n\\s+/g, \"\\n\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!content) return \"\";\n const indented = content\n .split(\"\\n\")\n .map((line, lineIndex) =>\n lineIndex === 0\n ? `${\" \".repeat(depth)}${prefix}${line}`\n : `${\" \".repeat(depth + 1)}${line}`,\n )\n .join(\"\\n\");\n return indented;\n })\n .filter(Boolean)\n .join(\"\\n\");\n return items ? `${items}\\n\\n` : \"\";\n }\n\n if (tag === \"hr\") {\n return \"---\\n\\n\";\n }\n\n const blockContent = Array.from(element.childNodes)\n .map((child) => renderBlockMarkdown(child, depth))\n .join(\"\");\n\n if (blockContent.trim()) {\n return blockContent;\n }\n\n const inlineContent = Array.from(element.childNodes)\n .map(renderInlineMarkdown)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return inlineContent ? `${inlineContent}\\n\\n` : \"\";\n}\n\nfunction extractDomMarkdownFallback(document: Document): string {\n const root = document.body ?? document.documentElement;\n if (!root) return \"\";\n\n return Array.from(root.childNodes)\n .map((node) => renderBlockMarkdown(node))\n .join(\"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\ntype WreqLikeRequestEvent = {\n type?: string;\n contentLength?: number | null;\n downloadedBytes?: number;\n};\n\nfunction emitProgress(\n hooks: FetchExecutionHooks,\n update: FetchProgressUpdate,\n): void {\n hooks.onProgressChange?.(update);\n}\n\nfunction emitStatus(\n hooks: FetchExecutionHooks,\n status: Exclude<FetchProgressUpdate[\"status\"], never>,\n): void {\n hooks.onStatusChange?.(status);\n}\n\nfunction mapRequestEventToProgress(\n event: WreqLikeRequestEvent,\n): FetchProgressUpdate | null {\n switch (event.type) {\n case \"request_start\":\n return { status: \"connecting\", progress: 0, phase: event.type };\n case \"request_sent\":\n return { status: \"waiting\", progress: 0.11, phase: event.type };\n case \"response_headers\":\n return { status: \"loading\", progress: 0.51, phase: event.type };\n case \"body_progress\": {\n const contentLength = event.contentLength;\n const downloadedBytes = event.downloadedBytes ?? 0;\n const bodyFraction =\n contentLength && contentLength > 0\n ? Math.max(0, Math.min(1, downloadedBytes / contentLength))\n : Math.max(0, Math.min(1, downloadedBytes / 65536));\n return {\n status: \"loading\",\n progress:\n contentLength && contentLength > 0\n ? 0.51 + bodyFraction * 0.44\n : 0.51,\n phase: event.type,\n };\n }\n case \"body_complete\":\n return { status: \"loading\", progress: 0.95, phase: event.type };\n case \"done\":\n return { status: \"done\", progress: 1, phase: event.type };\n case \"error\":\n return { status: \"error\", progress: 1, phase: event.type };\n default:\n return null;\n }\n}\n\nfunction resolveAcceptHeader(format: OutputFormat): string {\n return format === \"json\" ? DEFAULT_JSON_ACCEPT_HEADER : DEFAULT_ACCEPT_HEADER;\n}\n\nfunction isJsonContentType(contentType: string): boolean {\n const normalized = contentType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n return (\n normalized === \"application/json\" ||\n normalized === \"text/json\" ||\n normalized.endsWith(\"+json\")\n );\n}\n\nfunction isLikelyJsonBody(body: string): boolean {\n const trimmed = body.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n}\n\nfunction isJsonResponse(contentType: string, body: string): boolean {\n return isJsonContentType(contentType) || isLikelyJsonBody(body);\n}\n\nfunction buildJsonResult(\n opts: FetchOptions,\n finalUrl: string,\n rawBody: string,\n format: OutputFormat,\n maxChars: number,\n browser: string,\n os: string,\n): FetchResult | FetchError {\n const parsedJson = parseAndFormatJson(rawBody);\n\n if (\"error\" in parsedJson) {\n return parsedJson;\n }\n\n const content = truncateContent(\n renderJsonContent(parsedJson.formatted, format),\n maxChars,\n );\n\n return {\n url: opts.url,\n finalUrl,\n title: \"\",\n author: \"\",\n published: \"\",\n site: new URL(finalUrl).hostname,\n language: \"\",\n wordCount: estimateWordCount(parsedJson.formatted),\n content,\n browser,\n os,\n };\n}\n\nfunction shouldStripReplies(site: string): boolean {\n return (\n site === \"Hacker News\" ||\n site.startsWith(\"r/\") ||\n site.startsWith(\"GitHub - \")\n );\n}\n\nexport function getLatestChromeProfile(): string {\n return getLatestChromeProfileFrom(runtimeDependencies.getProfiles);\n}\n\nexport function createDefuddleFetch(\n dependencies: FetchDependencies = runtimeDependencies,\n) {\n return async function defuddleFetch(\n opts: FetchOptions,\n hooks: FetchExecutionHooks = {},\n ): Promise<FetchResult | FetchError> {\n const browser = opts.browser ?? DEFAULT_BROWSER;\n const os = opts.os ?? DEFAULT_OS;\n const format: OutputFormat = opts.format ?? \"markdown\";\n const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;\n const removeImages = opts.removeImages ?? false;\n const includeReplies = opts.includeReplies ?? DEFAULT_INCLUDE_REPLIES;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n let parsed: URL;\n try {\n parsed = new URL(opts.url);\n } catch {\n return { error: `Invalid URL: ${opts.url}` };\n }\n\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n return {\n error: `Only http/https URLs supported, got ${parsed.protocol}`,\n };\n }\n\n const fetchOptions: Record<string, unknown> = {\n browser,\n os,\n headers: {\n Accept: resolveAcceptHeader(format),\n \"Accept-Language\": DEFAULT_ACCEPT_LANGUAGE_HEADER,\n ...opts.headers,\n },\n redirect: \"follow\",\n timeout: timeoutMs,\n };\n\n if (opts.proxy) {\n fetchOptions.proxy = opts.proxy;\n }\n\n emitProgress(hooks, {\n status: \"connecting\",\n progress: 0,\n phase: \"fetch_start\",\n });\n fetchOptions.onRequestEvent = (event: WreqLikeRequestEvent) => {\n const mapped = mapRequestEventToProgress(event);\n if (mapped) {\n emitProgress(hooks, mapped);\n }\n };\n fetchOptions.captureDiagnostics = true;\n const response = await dependencies.fetch(opts.url, fetchOptions);\n\n if (!response.ok) {\n return {\n error: `HTTP ${response.status} ${response.statusText} for ${opts.url}`,\n };\n }\n\n const finalUrl = response.url ?? opts.url;\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const rawBody = await response.text();\n const jsonResponse = isJsonResponse(contentType, rawBody);\n\n if (format === \"json\") {\n if (!jsonResponse) {\n return { error: `Not a JSON response (content-type: ${contentType})` };\n }\n\n const result = buildJsonResult(\n opts,\n finalUrl,\n rawBody,\n format,\n maxChars,\n browser,\n os,\n );\n if (!isError(result)) {\n emitStatus(hooks, \"done\");\n emitProgress(hooks, {\n status: \"done\",\n progress: 1,\n phase: \"json_done\",\n });\n }\n return result;\n }\n\n if (jsonResponse) {\n const result = buildJsonResult(\n opts,\n finalUrl,\n rawBody,\n format,\n maxChars,\n browser,\n os,\n );\n if (!isError(result)) {\n emitStatus(hooks, \"done\");\n emitProgress(hooks, {\n status: \"done\",\n progress: 1,\n phase: \"json_done\",\n });\n }\n return result;\n }\n\n if (isPlainTextContentType(contentType)) {\n const result = buildPlainTextResult(\n opts,\n finalUrl,\n rawBody,\n format,\n maxChars,\n browser,\n os,\n );\n emitStatus(hooks, \"done\");\n emitProgress(hooks, {\n status: \"done\",\n progress: 1,\n phase: \"plain_text_done\",\n });\n return result;\n }\n\n if (!HTML_CONTENT_TYPES.some((value) => contentType.includes(value))) {\n return { error: `Not an HTML page (content-type: ${contentType})` };\n }\n\n emitStatus(hooks, \"processing\");\n emitProgress(hooks, {\n status: \"processing\",\n progress: 0.96,\n phase: \"extracting\",\n });\n const fallbackDocument = parseLinkedomHTML(rawBody, finalUrl);\n const extractionDocument = parseLinkedomHTML(rawBody, finalUrl);\n const extracted = await dependencies.defuddle(\n extractionDocument,\n finalUrl,\n {\n markdown: format !== \"html\",\n removeImages,\n includeReplies,\n },\n );\n\n let extractedContent = extracted.content;\n let wordCount = extracted.wordCount;\n\n if (!extractedContent || wordCount === 0) {\n const fallbackText = extractDomTextFallback(fallbackDocument);\n if (!fallbackText) {\n return {\n error: `No content extracted from ${opts.url}. May need JS rendering or is blocked.`,\n };\n }\n\n extractedContent =\n format === \"html\"\n ? rawBody\n : format === \"markdown\"\n ? extractDomMarkdownFallback(fallbackDocument) || fallbackText\n : fallbackText;\n wordCount = estimateWordCount(fallbackText);\n }\n\n if (includeReplies === false && shouldStripReplies(extracted.site ?? \"\")) {\n const strippedContent = stripExtractorComments(extractedContent, format);\n if (strippedContent !== extractedContent) {\n extractedContent = strippedContent;\n wordCount = estimateWordCount(\n format === \"text\"\n ? markdownToText(extractedContent)\n : extractedContent,\n );\n }\n }\n\n const normalizedContent =\n format === \"text\" ? markdownToText(extractedContent) : extractedContent;\n\n const result = {\n url: opts.url,\n finalUrl,\n title: extracted.title ?? \"\",\n author: extracted.author ?? \"\",\n published: extracted.published ?? \"\",\n site: extracted.site ?? \"\",\n language: extracted.language ?? \"\",\n wordCount,\n content: truncateContent(normalizedContent, maxChars),\n browser,\n os,\n };\n\n emitStatus(hooks, \"done\");\n emitProgress(hooks, { status: \"done\", progress: 1, phase: \"done\" });\n return result;\n };\n}\n\nexport const defuddleFetch = createDefuddleFetch();\n\n/** Type guard: check if result is an error. */\nexport function isError(\n result: FetchResult | FetchError,\n): result is FetchError {\n return \"error\" in result;\n}\n","import { type TSchema, Type } from \"@sinclair/typebox\";\nimport {\n DEFAULT_BATCH_CONCURRENCY,\n DEFAULT_BROWSER,\n DEFAULT_INCLUDE_REPLIES,\n DEFAULT_MAX_CHARS,\n DEFAULT_OS,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants\";\nimport { defuddleFetch, isError } from \"./extract\";\nimport type {\n BatchFetchItemProgress,\n BatchFetchItemResult,\n BatchFetchItemStatus,\n BatchFetchProgressSnapshot,\n BatchFetchResult,\n FetchError,\n FetchExecutionHooks,\n FetchOptions,\n FetchResult,\n FetchToolConfig,\n FetchToolDefaults,\n} from \"./types\";\n\nfunction resolveBatchConcurrency(value: number | undefined): number {\n if (!value || !Number.isFinite(value)) {\n return DEFAULT_BATCH_CONCURRENCY;\n }\n\n return Math.max(1, Math.floor(value));\n}\n\nexport function resolveFetchToolDefaults(\n config: FetchToolConfig = {},\n): FetchToolDefaults {\n return {\n maxChars: config.maxChars ?? DEFAULT_MAX_CHARS,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n browser: config.browser ?? DEFAULT_BROWSER,\n os: config.os ?? DEFAULT_OS,\n removeImages: config.removeImages ?? false,\n includeReplies: config.includeReplies ?? DEFAULT_INCLUDE_REPLIES,\n batchConcurrency: resolveBatchConcurrency(config.batchConcurrency),\n };\n}\n\nexport function createBaseFetchToolParameterProperties(\n defaults: FetchToolDefaults,\n): Record<string, TSchema> {\n return {\n url: Type.String({ description: \"URL to fetch (http/https only)\" }),\n browser: Type.Optional(\n Type.String({\n description: `Browser profile for TLS fingerprinting. Default: \"${defaults.browser}\". Examples: chrome_145, firefox_147, safari_26, edge_145, opera_127`,\n }),\n ),\n os: Type.Optional(\n Type.String({\n description: `OS profile for fingerprinting. Default: \"${defaults.os}\". Options: windows, macos, linux, android, ios`,\n }),\n ),\n headers: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n description:\n \"Custom HTTP headers to send. By default, Accept and Accept-Language are set automatically.\",\n }),\n ),\n maxChars: Type.Optional(\n Type.Number({\n description: `Maximum characters to return. Default: ${defaults.maxChars}`,\n }),\n ),\n format: Type.Optional(\n Type.Union(\n [\n Type.Literal(\"markdown\"),\n Type.Literal(\"html\"),\n Type.Literal(\"text\"),\n Type.Literal(\"json\"),\n ],\n {\n description:\n 'Output format. \"markdown\" (default), \"html\" (cleaned HTML), \"text\" (plain text, no formatting), or \"json\" (pretty-printed JSON)',\n },\n ),\n ),\n removeImages: Type.Optional(\n Type.Boolean({\n description: \"Strip image references from output. Default: false\",\n }),\n ),\n includeReplies: Type.Optional(\n Type.Union([Type.Boolean(), Type.Literal(\"extractors\")], {\n description:\n \"Include replies/comments: 'extractors' for site-specific only (default), true for all, false for none\",\n }),\n ),\n proxy: Type.Optional(\n Type.String({\n description:\n \"Proxy URL (http://user:pass@host:port or socks5://host:port)\",\n }),\n ),\n };\n}\n\nexport function createBatchFetchToolParameterProperties(\n defaults: FetchToolDefaults,\n): Record<string, TSchema> {\n return {\n requests: Type.Array(\n Type.Object(createBaseFetchToolParameterProperties(defaults), {\n additionalProperties: false,\n }),\n {\n minItems: 1,\n description:\n \"Array of fetch requests. Each item accepts the same parameters as the single-item fetch tool.\",\n },\n ),\n };\n}\n\nfunction buildFetchOptionsFromParams(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n): FetchOptions {\n return {\n url: params.url as string,\n browser: (params.browser as string) ?? defaults.browser,\n os: (params.os as string) ?? defaults.os,\n headers: params.headers as Record<string, string> | undefined,\n maxChars: (params.maxChars as number) ?? defaults.maxChars,\n format:\n (params.format as \"markdown\" | \"html\" | \"text\" | \"json\") ?? \"markdown\",\n removeImages: (params.removeImages as boolean) ?? defaults.removeImages,\n includeReplies:\n (params.includeReplies as boolean | \"extractors\") ??\n defaults.includeReplies,\n proxy: params.proxy as string | undefined,\n timeoutMs: defaults.timeoutMs,\n };\n}\n\nexport async function executeFetchToolCall(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n hooks: FetchExecutionHooks = {},\n): Promise<FetchResult | FetchError> {\n return defuddleFetch(buildFetchOptionsFromParams(params, defaults), hooks);\n}\n\nconst PROGRESS_BY_STATUS: Record<BatchFetchItemStatus, number> = {\n queued: 0,\n connecting: 0,\n waiting: 0.11,\n loading: 0.51,\n processing: 0.96,\n done: 1,\n error: 1,\n};\n\nfunction createInitialProgressItems(\n requests: Record<string, unknown>[],\n): BatchFetchItemProgress[] {\n return requests.map((request, index) => ({\n index,\n url:\n typeof request.url === \"string\" ? request.url : String(request.url ?? \"\"),\n status: \"queued\",\n progress: PROGRESS_BY_STATUS.queued,\n statusStartedAt: Date.now(),\n }));\n}\n\nfunction buildProgressSnapshot(\n items: BatchFetchItemProgress[],\n batchConcurrency: number,\n): BatchFetchProgressSnapshot {\n let completed = 0;\n let succeeded = 0;\n let failed = 0;\n\n for (const item of items) {\n if (item.status === \"done\" || item.status === \"error\") {\n completed += 1;\n }\n if (item.status === \"done\") {\n succeeded += 1;\n }\n if (item.status === \"error\") {\n failed += 1;\n }\n }\n\n return {\n items: items.map((item) => ({ ...item })),\n total: items.length,\n completed,\n succeeded,\n failed,\n batchConcurrency,\n };\n}\n\nexport async function executeBatchFetchToolCall(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n options: {\n batchConcurrency?: number;\n onProgress?(snapshot: BatchFetchProgressSnapshot): void;\n executeItem?(\n params: Record<string, unknown>,\n defaults: FetchToolDefaults,\n hooks?: FetchExecutionHooks,\n ): Promise<FetchResult | FetchError>;\n } = {},\n): Promise<BatchFetchResult> {\n const requests = (\n (params.requests as Record<string, unknown>[] | undefined) ?? []\n ).map((request) => request ?? {});\n const batchConcurrency = resolveBatchConcurrency(\n options.batchConcurrency ?? defaults.batchConcurrency,\n );\n const progressItems = createInitialProgressItems(requests);\n const results = new Array<BatchFetchItemResult>(requests.length);\n\n const emitProgress = () => {\n options.onProgress?.(\n buildProgressSnapshot(progressItems, batchConcurrency),\n );\n };\n\n const updateProgress = (\n index: number,\n status: BatchFetchItemStatus,\n error?: string,\n progress?: number,\n ) => {\n const previous = progressItems[index];\n progressItems[index] = {\n ...previous,\n status,\n progress:\n progress === undefined\n ? PROGRESS_BY_STATUS[status]\n : Math.max(0, Math.min(1, progress)),\n statusStartedAt:\n previous?.status === status ? previous.statusStartedAt : Date.now(),\n ...(error ? { error } : {}),\n };\n emitProgress();\n };\n\n emitProgress();\n\n let nextIndex = 0;\n\n const worker = async () => {\n while (true) {\n const index = nextIndex;\n nextIndex += 1;\n\n if (index >= requests.length) {\n return;\n }\n\n const request = requests[index] ?? {};\n const normalizedRequest = buildFetchOptionsFromParams(request, defaults);\n\n try {\n const executeItem = options.executeItem ?? executeFetchToolCall;\n const result = await executeItem(request, defaults, {\n onStatusChange(status) {\n if (status === \"done\") return;\n updateProgress(index, status);\n },\n onProgressChange(update) {\n if (update.status === \"done\") return;\n updateProgress(index, update.status, undefined, update.progress);\n },\n });\n\n if (isError(result)) {\n results[index] = {\n index,\n request: normalizedRequest,\n status: \"error\",\n progress: PROGRESS_BY_STATUS.error,\n error: result.error,\n };\n updateProgress(index, \"error\", result.error);\n continue;\n }\n\n results[index] = {\n index,\n request: normalizedRequest,\n status: \"done\",\n progress: PROGRESS_BY_STATUS.done,\n result,\n };\n updateProgress(index, \"done\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results[index] = {\n index,\n request: normalizedRequest,\n status: \"error\",\n progress: PROGRESS_BY_STATUS.error,\n error: message,\n };\n updateProgress(index, \"error\", message);\n }\n }\n };\n\n const workerCount =\n requests.length === 0 ? 0 : Math.min(batchConcurrency, requests.length);\n await Promise.all(Array.from({ length: workerCount }, async () => worker()));\n\n const finalSnapshot = buildProgressSnapshot(progressItems, batchConcurrency);\n\n return {\n items: results,\n total: finalSnapshot.total,\n succeeded: finalSnapshot.succeeded,\n failed: finalSnapshot.failed,\n batchConcurrency,\n };\n}\n","import { Type } from \"@sinclair/typebox\";\nimport {\n buildBatchFetchResponseText,\n buildFetchResponseText,\n createBaseFetchToolParameterProperties,\n createBatchFetchToolParameterProperties,\n executeBatchFetchToolCall,\n executeFetchToolCall,\n type FetchResult,\n isError,\n resolveFetchToolDefaults,\n} from \"smart-fetch-core\";\nimport type { PluginConfig, ToolRegistrationApi } from \"./types\";\n\nexport const resolvePluginDefaults = (pluginConfig: PluginConfig = {}) =>\n resolveFetchToolDefaults(pluginConfig);\n\nfunction renderToolResponse(result: FetchResult) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: buildFetchResponseText(result, { verbose: true }),\n },\n ],\n };\n}\n\nconst plugin = {\n id: \"smart-fetch\",\n name: \"Smart Fetch\",\n description:\n \"Clean web content extraction with TLS fingerprinting. Uses wreq-js (Rust native bindings) for browser-grade TLS and Defuddle for extraction.\",\n\n register(api: ToolRegistrationApi) {\n const defaults = resolvePluginDefaults(api.pluginConfig);\n\n api.registerTool({\n name: \"smart_fetch\",\n description: [\n \"Fetch a URL with browser-grade TLS fingerprinting and extract clean, readable content.\",\n \"Uses Rust native bindings to impersonate real browsers at the TLS/HTTP2 level (JA3/JA4 match).\",\n \"Returns markdown with rich metadata (author, publish date, schema.org data).\",\n \"Better noise removal and anti-bot bypass than web_fetch.\",\n \"Does NOT execute JavaScript — use the browser tool for JS-heavy SPAs.\",\n ].join(\" \"),\n parameters: Type.Object(createBaseFetchToolParameterProperties(defaults)),\n\n async execute(_toolCallId: string, params: Record<string, unknown>) {\n const result = await executeFetchToolCall(params, defaults);\n\n if (isError(result)) {\n return {\n content: [\n { type: \"text\" as const, text: `Error: ${result.error}` },\n ],\n isError: true,\n };\n }\n\n return renderToolResponse(result);\n },\n });\n\n api.registerTool({\n name: \"batch_smart_fetch\",\n description: [\n \"Fetch multiple URLs with browser-grade TLS fingerprinting and clean readable extraction.\",\n \"Each request item accepts the same parameters as smart_fetch and runs with bounded concurrency.\",\n \"Returns clearly labeled per-item results with full content for successes and bot-friendly per-item errors for failures.\",\n \"Does NOT execute JavaScript — use the browser tool for JS-heavy SPAs.\",\n ].join(\" \"),\n parameters: Type.Object(\n createBatchFetchToolParameterProperties(defaults),\n ),\n\n async execute(_toolCallId: string, params: Record<string, unknown>) {\n const result = await executeBatchFetchToolCall(params, defaults, {\n batchConcurrency: defaults.batchConcurrency,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: buildBatchFetchResponseText(result, { verbose: true }),\n },\n ],\n };\n },\n });\n\n api.logger.info(\n `smart_fetch tools registered (default: ${defaults.browser}/${defaults.os}, batch concurrency: ${defaults.batchConcurrency})`,\n );\n },\n};\n\nexport default plugin;\n"]}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "smart-fetch",
|
|
3
3
|
"name": "Smart Fetch",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.2",
|
|
5
5
|
"description": "Clean web content extraction with browser-grade TLS fingerprinting. Uses wreq-js (Rust native bindings) for anti-bot bypass and Defuddle for superior content extraction.",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openclaw-smart-fetch",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "OpenClaw smart fetch plugin with browser-grade TLS fingerprinting and Defuddle extraction.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -67,8 +67,11 @@
|
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"@sinclair/typebox": "^0.34.49",
|
|
70
|
+
"@thinkscape/wreq-js": "2.2.2",
|
|
70
71
|
"defuddle": "^0.14.0",
|
|
71
|
-
"linkedom": "^0.18.12"
|
|
72
|
-
|
|
72
|
+
"linkedom": "^0.18.12"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"smart-fetch-core": "0.2.2"
|
|
73
76
|
}
|
|
74
77
|
}
|