pi-smart-fetch 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +33 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getAgentDir,
|
|
1
|
+
import { getAgentDir, keyText } from '@mariozechner/pi-coding-agent';
|
|
2
2
|
import { Text } from '@mariozechner/pi-tui';
|
|
3
3
|
import { Type } from '@sinclair/typebox';
|
|
4
4
|
import { getProfiles, fetch } from '@thinkscape/wreq-js';
|
|
@@ -1032,25 +1032,39 @@ function buildWebFetchCollapsedText(details, theme) {
|
|
|
1032
1032
|
if (!fetchResult) {
|
|
1033
1033
|
return theme.fg("muted", "No fetch result available.");
|
|
1034
1034
|
}
|
|
1035
|
-
const
|
|
1036
|
-
const
|
|
1037
|
-
|
|
1038
|
-
fetchResult.
|
|
1039
|
-
fetchResult.wordCount ? `${fetchResult.wordCount} words` : void 0,
|
|
1040
|
-
`${fetchResult.browser}/${fetchResult.os}`
|
|
1041
|
-
].filter(Boolean);
|
|
1042
|
-
let text = theme.fg("toolTitle", theme.bold("web_fetch "));
|
|
1043
|
-
text += theme.fg("accent", title);
|
|
1044
|
-
if (metadata.length > 0) {
|
|
1045
|
-
text += `
|
|
1046
|
-
${theme.fg("muted", metadata.join(" \xB7 "))}`;
|
|
1035
|
+
const headerLine = theme.fg("toolTitle", "web_fetch") + " " + theme.fg("accent", fetchResult.finalUrl || fetchResult.url);
|
|
1036
|
+
const metadataLines = [];
|
|
1037
|
+
if (fetchResult.title) {
|
|
1038
|
+
metadataLines.push(theme.fg("muted", `> Title: ${fetchResult.title}`));
|
|
1047
1039
|
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1040
|
+
if (fetchResult.published) {
|
|
1041
|
+
metadataLines.push(
|
|
1042
|
+
theme.fg("muted", `> Published: ${fetchResult.published}`)
|
|
1043
|
+
);
|
|
1044
|
+
}
|
|
1045
|
+
if (fetchResult.author) {
|
|
1046
|
+
metadataLines.push(theme.fg("muted", `> Author: ${fetchResult.author}`));
|
|
1047
|
+
}
|
|
1048
|
+
const contentLines = fetchResult.content.split("\n").filter(
|
|
1049
|
+
(line, index, lines) => line.length > 0 || index === 0 || index < lines.length - 1
|
|
1050
|
+
);
|
|
1051
|
+
const maxPreviewLines = 7;
|
|
1052
|
+
const previewLines = contentLines.slice(0, maxPreviewLines);
|
|
1053
|
+
const remainingLines = Math.max(0, contentLines.length - previewLines.length);
|
|
1054
|
+
const expandKey = keyText("app.tools.expand") || "Ctrl+O";
|
|
1055
|
+
const parts = [headerLine, ""];
|
|
1056
|
+
if (metadataLines.length > 0) {
|
|
1057
|
+
parts.push(...metadataLines, "");
|
|
1058
|
+
}
|
|
1059
|
+
if (previewLines.length > 0) {
|
|
1060
|
+
parts.push(...previewLines.map((line) => theme.fg("toolOutput", line)));
|
|
1061
|
+
}
|
|
1062
|
+
if (remainingLines > 0) {
|
|
1063
|
+
parts.push(
|
|
1064
|
+
theme.fg("muted", `... (${remainingLines} more lines, `) + theme.fg("dim", expandKey) + theme.fg("muted", " to expand)")
|
|
1065
|
+
);
|
|
1066
|
+
}
|
|
1067
|
+
return parts.join("\n");
|
|
1054
1068
|
}
|
|
1055
1069
|
function createResponsiveBatchComponent(details, expanded, theme) {
|
|
1056
1070
|
const text = new Text("", 0, 0);
|
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/settings.ts","../src/index.ts"],"names":["wreqFetch","defuddleFetch","result","emitProgress","Type","getAgentDir"],"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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"@mariozechner/pi-coding-agent\";\nimport type {\n FetchToolConfig,\n FingerprintOs,\n IncludeRepliesOption,\n} from \"smart-fetch-core\";\n\nconst VALID_OS_VALUES = new Set<FingerprintOs>([\n \"windows\",\n \"macos\",\n \"linux\",\n \"android\",\n \"ios\",\n]);\n\ninterface PiSmartFetchSettings {\n smartFetchVerboseByDefault?: boolean;\n smartFetchDefaultMaxChars?: number;\n smartFetchDefaultTimeoutMs?: number;\n smartFetchDefaultBrowser?: string;\n smartFetchDefaultOs?: FingerprintOs;\n smartFetchDefaultRemoveImages?: boolean;\n smartFetchDefaultIncludeReplies?: IncludeRepliesOption;\n smartFetchDefaultBatchConcurrency?: number;\n}\n\nexport interface ResolvedPiSmartFetchSettings extends FetchToolConfig {\n verboseByDefault: boolean;\n}\n\nfunction readBoolean(\n source: Record<string, unknown>,\n keys: string[],\n): boolean | undefined {\n for (const key of keys) {\n if (typeof source[key] === \"boolean\") {\n return source[key] as boolean;\n }\n }\n\n return undefined;\n}\n\nfunction readPositiveNumber(\n source: Record<string, unknown>,\n keys: string[],\n): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readNonEmptyString(\n source: Record<string, unknown>,\n keys: string[],\n): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOs(\n source: Record<string, unknown>,\n keys: string[],\n): FingerprintOs | undefined {\n for (const key of keys) {\n const value = source[key];\n if (\n typeof value === \"string\" &&\n VALID_OS_VALUES.has(value as FingerprintOs)\n ) {\n return value as FingerprintOs;\n }\n }\n\n return undefined;\n}\n\nfunction readIncludeReplies(\n source: Record<string, unknown>,\n keys: string[],\n): IncludeRepliesOption | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"boolean\" || value === \"extractors\") {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction normalizePiSmartFetchSettings(input: unknown): PiSmartFetchSettings {\n if (!input || typeof input !== \"object\") return {};\n\n const source = input as Record<string, unknown>;\n\n return {\n smartFetchVerboseByDefault: readBoolean(source, [\n \"smartFetchVerboseByDefault\",\n \"webFetchVerboseByDefault\",\n ]),\n smartFetchDefaultMaxChars: readPositiveNumber(source, [\n \"smartFetchDefaultMaxChars\",\n \"webFetchDefaultMaxChars\",\n ]),\n smartFetchDefaultTimeoutMs: readPositiveNumber(source, [\n \"smartFetchDefaultTimeoutMs\",\n ]),\n smartFetchDefaultBrowser: readNonEmptyString(source, [\n \"smartFetchDefaultBrowser\",\n ]),\n smartFetchDefaultOs: readOs(source, [\"smartFetchDefaultOs\"]),\n smartFetchDefaultRemoveImages: readBoolean(source, [\n \"smartFetchDefaultRemoveImages\",\n ]),\n smartFetchDefaultIncludeReplies: readIncludeReplies(source, [\n \"smartFetchDefaultIncludeReplies\",\n ]),\n smartFetchDefaultBatchConcurrency: readPositiveNumber(source, [\n \"smartFetchDefaultBatchConcurrency\",\n \"webFetchDefaultBatchConcurrency\",\n ]),\n };\n}\n\nexport function resolvePiSmartFetchSettings(\n globalSettings: unknown,\n projectSettings: unknown,\n): ResolvedPiSmartFetchSettings {\n const global = normalizePiSmartFetchSettings(globalSettings);\n const project = normalizePiSmartFetchSettings(projectSettings);\n\n return {\n verboseByDefault:\n project.smartFetchVerboseByDefault ??\n global.smartFetchVerboseByDefault ??\n false,\n maxChars:\n project.smartFetchDefaultMaxChars ?? global.smartFetchDefaultMaxChars,\n timeoutMs:\n project.smartFetchDefaultTimeoutMs ?? global.smartFetchDefaultTimeoutMs,\n browser:\n project.smartFetchDefaultBrowser ?? global.smartFetchDefaultBrowser,\n os: project.smartFetchDefaultOs ?? global.smartFetchDefaultOs,\n removeImages:\n project.smartFetchDefaultRemoveImages ??\n global.smartFetchDefaultRemoveImages,\n includeReplies:\n project.smartFetchDefaultIncludeReplies ??\n global.smartFetchDefaultIncludeReplies,\n batchConcurrency:\n project.smartFetchDefaultBatchConcurrency ??\n global.smartFetchDefaultBatchConcurrency,\n };\n}\n\nasync function readSettingsFile(path: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport async function loadPiSmartFetchSettings(\n cwd: string,\n agentDir = getAgentDir(),\n): Promise<ResolvedPiSmartFetchSettings> {\n const globalSettings = await readSettingsFile(\n join(agentDir, \"settings.json\"),\n );\n const projectSettings = await readSettingsFile(\n join(cwd, \".pi\", \"settings.json\"),\n );\n\n return resolvePiSmartFetchSettings(globalSettings, projectSettings);\n}\n","import {\n type ExtensionAPI,\n getAgentDir,\n keyHint,\n} from \"@mariozechner/pi-coding-agent\";\nimport { Text } from \"@mariozechner/pi-tui\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n type BatchFetchItemProgress,\n type BatchFetchProgressSnapshot,\n type BatchFetchResult,\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 { loadPiSmartFetchSettings } from \"./settings\";\n\nconst toolDescription = [\n \"Fetch a URL with browser-grade TLS fingerprinting and extract clean, readable content.\",\n \"Uses wreq-js for browser-like TLS/HTTP2 impersonation and Defuddle for article extraction.\",\n \"Supports the same fetch parameters as the OpenClaw tool, plus an optional verbose flag.\",\n \"Does NOT execute JavaScript — use a browser automation tool for JS-heavy pages.\",\n].join(\" \");\n\nconst batchToolDescription = [\n \"Fetch multiple URLs with browser-grade TLS fingerprinting and readable extraction.\",\n \"Each request accepts the same parameters as web_fetch and fans out with bounded concurrency.\",\n \"Streams per-item progress in the pi TUI with truncated URLs, statuses, and small progress bars.\",\n \"Does NOT execute JavaScript — use a browser automation tool for JS-heavy pages.\",\n].join(\" \");\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\ntype WebFetchRenderDetails = {\n error?: boolean;\n verbose?: boolean;\n maxChars?: number;\n fetchResult?: FetchResult;\n};\n\ntype BatchRenderDetails = {\n verbose?: boolean;\n batchProgress?: BatchFetchProgressSnapshot;\n batchResult?: BatchFetchResult;\n started?: boolean;\n spinnerTick?: number;\n};\n\nconst SPINNER_INTERVAL_MS = 100;\n\nfunction truncateMiddle(value: string, width: number): string {\n if (width <= 0) return \"\";\n if (value.length <= width) return value.padEnd(width, \" \");\n if (width === 1) return \"…\";\n\n const left = Math.ceil((width - 1) / 2);\n const right = Math.floor((width - 1) / 2);\n return `${value.slice(0, left)}…${value.slice(value.length - right)}`;\n}\n\nfunction getOptimisticProgress(\n item: BatchFetchItemProgress,\n now: number,\n): number {\n const base = item.progress;\n const startedAt = item.statusStartedAt ?? now;\n const elapsedWholeSeconds = Math.max(0, Math.floor((now - startedAt) / 1000));\n\n switch (item.status) {\n case \"connecting\":\n return Math.min(0.1, Math.max(base, elapsedWholeSeconds * 0.01));\n case \"waiting\":\n return Math.min(0.5, Math.max(base, 0.11 + elapsedWholeSeconds * 0.01));\n case \"processing\":\n return Math.min(0.99, Math.max(base, 0.96 + elapsedWholeSeconds * 0.01));\n default:\n return base;\n }\n}\n\nfunction renderProgressBar(\n item: BatchFetchItemProgress,\n width: number,\n theme: {\n fg(color: string, value: string): string;\n bg(color: string, value: string): string;\n },\n now: number,\n): string {\n const innerWidth = Math.max(10, width - 2);\n const progress = getOptimisticProgress(item, now);\n const filled = Math.max(\n 0,\n Math.min(innerWidth, Math.round(progress * innerWidth)),\n );\n const barBgColor =\n item.status === \"error\"\n ? \"toolErrorBg\"\n : item.status === \"done\"\n ? \"toolSuccessBg\"\n : item.status === \"queued\"\n ? \"toolPendingBg\"\n : \"selectedBg\";\n\n const centeredLabel = (() => {\n const raw = item.status;\n if (raw.length >= innerWidth) {\n return raw.slice(0, innerWidth);\n }\n const totalPadding = innerWidth - raw.length;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n return `${\" \".repeat(leftPadding)}${raw}${\" \".repeat(rightPadding)}`;\n })();\n const filledLabel = centeredLabel.slice(0, filled);\n const emptyLabel = centeredLabel.slice(filled);\n\n return [\n theme.fg(\"muted\", \"[\"),\n theme.bg(barBgColor, theme.fg(\"text\", filledLabel)),\n theme.bg(\"toolPendingBg\", theme.fg(\"muted\", emptyLabel)),\n theme.fg(\"muted\", \"]\"),\n ].join(\"\");\n}\n\nfunction renderStatusGlyph(\n item: BatchFetchItemProgress,\n spinnerIndex: number,\n theme: {\n fg(color: string, value: string): string;\n },\n): string {\n switch (item.status) {\n case \"done\":\n return theme.fg(\"success\", \"✓\");\n case \"error\":\n return theme.fg(\"error\", \"✗\");\n case \"queued\":\n return theme.fg(\n \"muted\",\n SPINNER_FRAMES[spinnerIndex % SPINNER_FRAMES.length] ?? \"⠋\",\n );\n default:\n return theme.fg(\n \"accent\",\n SPINNER_FRAMES[spinnerIndex % SPINNER_FRAMES.length] ?? \"⠋\",\n );\n }\n}\n\nfunction renderBatchProgressText(\n snapshot: BatchFetchProgressSnapshot,\n width: number,\n expanded: boolean,\n theme: {\n bold(value: string): string;\n fg(color: string, value: string): string;\n bg(color: string, value: string): string;\n },\n spinnerTick = 0,\n): string {\n const summary = [\n theme.fg(\"toolTitle\", theme.bold(\"batch_web_fetch \")),\n theme.fg(\n \"muted\",\n `${snapshot.completed}/${snapshot.total} done · ok ${snapshot.succeeded} · err ${snapshot.failed} · concurrency ${snapshot.batchConcurrency}`,\n ),\n ].join(\"\");\n\n const availableRowWidth = Math.max(24, width);\n const progressWidth = Math.max(\n 12,\n Math.min(18, Math.floor(availableRowWidth * 0.2)),\n );\n const glyphWidth = 2;\n const urlWidth = Math.max(\n 12,\n availableRowWidth - glyphWidth - progressWidth - 2,\n );\n\n const now = Date.now();\n\n const rows = snapshot.items.map((item, index) => {\n const glyph = renderStatusGlyph(item, spinnerTick + index, theme);\n const url = theme.fg(\"accent\", truncateMiddle(item.url, urlWidth));\n const bar = renderProgressBar(item, progressWidth, theme, now);\n\n const baseRow = `${glyph} ${url} ${bar}`;\n if (!expanded || !item.error) {\n return baseRow;\n }\n\n return `${baseRow}\\n ${theme.fg(\"error\", `error: ${item.error}`)}`;\n });\n\n return [summary, ...rows].join(\"\\n\");\n}\n\nfunction buildWebFetchCollapsedText(\n details: WebFetchRenderDetails,\n theme: {\n bold(value: string): string;\n fg(color: string, value: string): string;\n },\n) {\n const fetchResult = details.fetchResult;\n if (!fetchResult) {\n return theme.fg(\"muted\", \"No fetch result available.\");\n }\n\n const title = fetchResult.title || fetchResult.finalUrl || fetchResult.url;\n const metadata = [\n fetchResult.site,\n fetchResult.language,\n fetchResult.wordCount ? `${fetchResult.wordCount} words` : undefined,\n `${fetchResult.browser}/${fetchResult.os}`,\n ].filter(Boolean);\n\n let text = theme.fg(\"toolTitle\", theme.bold(\"web_fetch \"));\n text += theme.fg(\"accent\", title);\n\n if (metadata.length > 0) {\n text += `\\n${theme.fg(\"muted\", metadata.join(\" · \"))}`;\n }\n\n text += `\\n${theme.fg(\n \"muted\",\n `(${keyHint(\"app.tools.expand\", \"to expand\")})`,\n )}`;\n\n return text;\n}\n\nfunction createResponsiveBatchComponent(\n details: BatchRenderDetails,\n expanded: boolean,\n theme: {\n bold(value: string): string;\n fg(color: string, value: string): string;\n bg(color: string, value: string): string;\n },\n) {\n const text = new Text(\"\", 0, 0);\n\n return {\n render(width: number) {\n const snapshot = details.batchProgress;\n if (!snapshot) {\n text.setText(theme.fg(\"muted\", \"No batch progress available.\"));\n return text.render(width);\n }\n\n const spinnerTick = details.spinnerTick ?? 0;\n text.setText(\n renderBatchProgressText(snapshot, width, expanded, theme, spinnerTick),\n );\n return text.render(width);\n },\n invalidate() {\n text.invalidate();\n },\n };\n}\n\nexport default function piSmartFetchExtension(pi: ExtensionAPI) {\n const defaults = resolveFetchToolDefaults();\n\n pi.registerTool({\n name: \"web_fetch\",\n label: \"web_fetch\",\n description: toolDescription,\n promptSnippet:\n \"web_fetch(url, browser?, os?, headers?, maxChars?, format?, removeImages?, includeReplies?, proxy?, verbose?): fetch browser-fingerprinted readable web content\",\n parameters: Type.Object({\n ...createBaseFetchToolParameterProperties(defaults),\n verbose: Type.Optional(\n Type.Boolean({\n description:\n \"Include the full metadata header (site, language, word count, browser fingerprint info). Default: false, or smartFetchVerboseByDefault from pi settings.\",\n }),\n ),\n }),\n\n async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n const settings = await loadPiSmartFetchSettings(ctx.cwd, getAgentDir());\n const runtimeDefaults = resolveFetchToolDefaults(settings);\n const verbose =\n (params.verbose as boolean | undefined) ?? settings.verboseByDefault;\n const result = await executeFetchToolCall(params, runtimeDefaults);\n\n if (isError(result)) {\n return {\n content: [{ type: \"text\", text: `Error: ${result.error}` }],\n details: { error: true, verbose },\n };\n }\n\n return {\n content: [\n { type: \"text\", text: buildFetchResponseText(result, { verbose }) },\n ],\n details: {\n verbose,\n maxChars: runtimeDefaults.maxChars,\n fetchResult: result,\n } satisfies WebFetchRenderDetails,\n };\n },\n\n renderResult(result, { expanded, isPartial }, theme) {\n if (isPartial) {\n return new Text(theme.fg(\"warning\", \"Fetching...\"), 0, 0);\n }\n\n const details =\n (result.details as WebFetchRenderDetails | undefined) ?? {};\n const textContent = result.content.find((item) => item.type === \"text\");\n const outputText = textContent?.type === \"text\" ? textContent.text : \"\";\n\n if (details.error) {\n const firstLine = outputText.split(\"\\n\")[0] ?? \"Error\";\n return new Text(theme.fg(\"error\", firstLine), 0, 0);\n }\n\n if (!expanded) {\n return new Text(buildWebFetchCollapsedText(details, theme), 0, 0);\n }\n\n return new Text(outputText, 0, 0);\n },\n });\n\n pi.registerTool({\n name: \"batch_web_fetch\",\n label: \"batch_web_fetch\",\n description: batchToolDescription,\n promptSnippet:\n \"batch_web_fetch(requests, verbose?): fetch multiple URLs concurrently with per-item progress in the pi TUI\",\n parameters: Type.Object({\n ...createBatchFetchToolParameterProperties(defaults),\n verbose: Type.Optional(\n Type.Boolean({\n description:\n \"Include the full metadata header for each successful result. Default: false, or smartFetchVerboseByDefault from pi settings.\",\n }),\n ),\n }),\n\n async execute(_toolCallId, params, _signal, onUpdate, ctx) {\n const settings = await loadPiSmartFetchSettings(ctx.cwd, getAgentDir());\n const runtimeDefaults = resolveFetchToolDefaults(settings);\n const verbose =\n (params.verbose as boolean | undefined) ?? settings.verboseByDefault;\n\n let latestSnapshot: BatchFetchProgressSnapshot | undefined;\n let spinnerTick = 0;\n let spinnerTimer: ReturnType<typeof setInterval> | null = null;\n\n const emitProgress = (snapshot: BatchFetchProgressSnapshot) => {\n onUpdate?.({\n content: [\n {\n type: \"text\",\n text: `Started batch fetch for ${snapshot.total} URLs (${snapshot.completed}/${snapshot.total} complete).`,\n },\n ],\n details: {\n verbose,\n started: true,\n batchProgress: snapshot,\n spinnerTick,\n } satisfies BatchRenderDetails,\n });\n };\n\n try {\n spinnerTimer = setInterval(() => {\n if (\n !latestSnapshot ||\n latestSnapshot.completed >= latestSnapshot.total\n ) {\n return;\n }\n spinnerTick += 1;\n emitProgress(latestSnapshot);\n }, SPINNER_INTERVAL_MS);\n\n const batchResult = await executeBatchFetchToolCall(\n params,\n runtimeDefaults,\n {\n batchConcurrency: runtimeDefaults.batchConcurrency,\n onProgress(snapshot) {\n latestSnapshot = snapshot;\n emitProgress(snapshot);\n },\n },\n );\n\n const finalProgress: BatchFetchProgressSnapshot = {\n items: batchResult.items.map((item) => ({\n index: item.index,\n url: item.request.url,\n status: item.status,\n progress: item.progress,\n ...(item.error ? { error: item.error } : {}),\n })),\n total: batchResult.total,\n completed: batchResult.total,\n succeeded: batchResult.succeeded,\n failed: batchResult.failed,\n batchConcurrency: batchResult.batchConcurrency,\n };\n\n return {\n content: [\n {\n type: \"text\",\n text: buildBatchFetchResponseText(batchResult, { verbose }),\n },\n ],\n details: {\n verbose,\n started: true,\n batchProgress: finalProgress,\n batchResult,\n spinnerTick,\n } satisfies BatchRenderDetails,\n };\n } finally {\n if (spinnerTimer) {\n clearInterval(spinnerTimer);\n }\n }\n },\n\n renderCall(args, theme) {\n const batchArgs = args as { requests?: unknown[] };\n const requestCount = Array.isArray(batchArgs.requests)\n ? batchArgs.requests.length\n : 0;\n let text = theme.fg(\"toolTitle\", theme.bold(\"batch_web_fetch \"));\n text += theme.fg(\"muted\", `${requestCount} urls`);\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { expanded }, theme) {\n return createResponsiveBatchComponent(\n (result.details as BatchRenderDetails | undefined) ?? {},\n expanded,\n theme,\n );\n },\n });\n}\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/settings.ts","../src/index.ts"],"names":["wreqFetch","defuddleFetch","result","emitProgress","Type","getAgentDir"],"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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"@mariozechner/pi-coding-agent\";\nimport type {\n FetchToolConfig,\n FingerprintOs,\n IncludeRepliesOption,\n} from \"smart-fetch-core\";\n\nconst VALID_OS_VALUES = new Set<FingerprintOs>([\n \"windows\",\n \"macos\",\n \"linux\",\n \"android\",\n \"ios\",\n]);\n\ninterface PiSmartFetchSettings {\n smartFetchVerboseByDefault?: boolean;\n smartFetchDefaultMaxChars?: number;\n smartFetchDefaultTimeoutMs?: number;\n smartFetchDefaultBrowser?: string;\n smartFetchDefaultOs?: FingerprintOs;\n smartFetchDefaultRemoveImages?: boolean;\n smartFetchDefaultIncludeReplies?: IncludeRepliesOption;\n smartFetchDefaultBatchConcurrency?: number;\n}\n\nexport interface ResolvedPiSmartFetchSettings extends FetchToolConfig {\n verboseByDefault: boolean;\n}\n\nfunction readBoolean(\n source: Record<string, unknown>,\n keys: string[],\n): boolean | undefined {\n for (const key of keys) {\n if (typeof source[key] === \"boolean\") {\n return source[key] as boolean;\n }\n }\n\n return undefined;\n}\n\nfunction readPositiveNumber(\n source: Record<string, unknown>,\n keys: string[],\n): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readNonEmptyString(\n source: Record<string, unknown>,\n keys: string[],\n): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOs(\n source: Record<string, unknown>,\n keys: string[],\n): FingerprintOs | undefined {\n for (const key of keys) {\n const value = source[key];\n if (\n typeof value === \"string\" &&\n VALID_OS_VALUES.has(value as FingerprintOs)\n ) {\n return value as FingerprintOs;\n }\n }\n\n return undefined;\n}\n\nfunction readIncludeReplies(\n source: Record<string, unknown>,\n keys: string[],\n): IncludeRepliesOption | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"boolean\" || value === \"extractors\") {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction normalizePiSmartFetchSettings(input: unknown): PiSmartFetchSettings {\n if (!input || typeof input !== \"object\") return {};\n\n const source = input as Record<string, unknown>;\n\n return {\n smartFetchVerboseByDefault: readBoolean(source, [\n \"smartFetchVerboseByDefault\",\n \"webFetchVerboseByDefault\",\n ]),\n smartFetchDefaultMaxChars: readPositiveNumber(source, [\n \"smartFetchDefaultMaxChars\",\n \"webFetchDefaultMaxChars\",\n ]),\n smartFetchDefaultTimeoutMs: readPositiveNumber(source, [\n \"smartFetchDefaultTimeoutMs\",\n ]),\n smartFetchDefaultBrowser: readNonEmptyString(source, [\n \"smartFetchDefaultBrowser\",\n ]),\n smartFetchDefaultOs: readOs(source, [\"smartFetchDefaultOs\"]),\n smartFetchDefaultRemoveImages: readBoolean(source, [\n \"smartFetchDefaultRemoveImages\",\n ]),\n smartFetchDefaultIncludeReplies: readIncludeReplies(source, [\n \"smartFetchDefaultIncludeReplies\",\n ]),\n smartFetchDefaultBatchConcurrency: readPositiveNumber(source, [\n \"smartFetchDefaultBatchConcurrency\",\n \"webFetchDefaultBatchConcurrency\",\n ]),\n };\n}\n\nexport function resolvePiSmartFetchSettings(\n globalSettings: unknown,\n projectSettings: unknown,\n): ResolvedPiSmartFetchSettings {\n const global = normalizePiSmartFetchSettings(globalSettings);\n const project = normalizePiSmartFetchSettings(projectSettings);\n\n return {\n verboseByDefault:\n project.smartFetchVerboseByDefault ??\n global.smartFetchVerboseByDefault ??\n false,\n maxChars:\n project.smartFetchDefaultMaxChars ?? global.smartFetchDefaultMaxChars,\n timeoutMs:\n project.smartFetchDefaultTimeoutMs ?? global.smartFetchDefaultTimeoutMs,\n browser:\n project.smartFetchDefaultBrowser ?? global.smartFetchDefaultBrowser,\n os: project.smartFetchDefaultOs ?? global.smartFetchDefaultOs,\n removeImages:\n project.smartFetchDefaultRemoveImages ??\n global.smartFetchDefaultRemoveImages,\n includeReplies:\n project.smartFetchDefaultIncludeReplies ??\n global.smartFetchDefaultIncludeReplies,\n batchConcurrency:\n project.smartFetchDefaultBatchConcurrency ??\n global.smartFetchDefaultBatchConcurrency,\n };\n}\n\nasync function readSettingsFile(path: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport async function loadPiSmartFetchSettings(\n cwd: string,\n agentDir = getAgentDir(),\n): Promise<ResolvedPiSmartFetchSettings> {\n const globalSettings = await readSettingsFile(\n join(agentDir, \"settings.json\"),\n );\n const projectSettings = await readSettingsFile(\n join(cwd, \".pi\", \"settings.json\"),\n );\n\n return resolvePiSmartFetchSettings(globalSettings, projectSettings);\n}\n","import {\n type ExtensionAPI,\n getAgentDir,\n keyText,\n} from \"@mariozechner/pi-coding-agent\";\nimport { Text } from \"@mariozechner/pi-tui\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n type BatchFetchItemProgress,\n type BatchFetchProgressSnapshot,\n type BatchFetchResult,\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 { loadPiSmartFetchSettings } from \"./settings\";\n\nconst toolDescription = [\n \"Fetch a URL with browser-grade TLS fingerprinting and extract clean, readable content.\",\n \"Uses wreq-js for browser-like TLS/HTTP2 impersonation and Defuddle for article extraction.\",\n \"Supports the same fetch parameters as the OpenClaw tool, plus an optional verbose flag.\",\n \"Does NOT execute JavaScript — use a browser automation tool for JS-heavy pages.\",\n].join(\" \");\n\nconst batchToolDescription = [\n \"Fetch multiple URLs with browser-grade TLS fingerprinting and readable extraction.\",\n \"Each request accepts the same parameters as web_fetch and fans out with bounded concurrency.\",\n \"Streams per-item progress in the pi TUI with truncated URLs, statuses, and small progress bars.\",\n \"Does NOT execute JavaScript — use a browser automation tool for JS-heavy pages.\",\n].join(\" \");\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\ntype WebFetchRenderDetails = {\n error?: boolean;\n verbose?: boolean;\n maxChars?: number;\n fetchResult?: FetchResult;\n};\n\ntype BatchRenderDetails = {\n verbose?: boolean;\n batchProgress?: BatchFetchProgressSnapshot;\n batchResult?: BatchFetchResult;\n started?: boolean;\n spinnerTick?: number;\n};\n\nconst SPINNER_INTERVAL_MS = 100;\n\nfunction truncateMiddle(value: string, width: number): string {\n if (width <= 0) return \"\";\n if (value.length <= width) return value.padEnd(width, \" \");\n if (width === 1) return \"…\";\n\n const left = Math.ceil((width - 1) / 2);\n const right = Math.floor((width - 1) / 2);\n return `${value.slice(0, left)}…${value.slice(value.length - right)}`;\n}\n\nfunction getOptimisticProgress(\n item: BatchFetchItemProgress,\n now: number,\n): number {\n const base = item.progress;\n const startedAt = item.statusStartedAt ?? now;\n const elapsedWholeSeconds = Math.max(0, Math.floor((now - startedAt) / 1000));\n\n switch (item.status) {\n case \"connecting\":\n return Math.min(0.1, Math.max(base, elapsedWholeSeconds * 0.01));\n case \"waiting\":\n return Math.min(0.5, Math.max(base, 0.11 + elapsedWholeSeconds * 0.01));\n case \"processing\":\n return Math.min(0.99, Math.max(base, 0.96 + elapsedWholeSeconds * 0.01));\n default:\n return base;\n }\n}\n\nfunction renderProgressBar(\n item: BatchFetchItemProgress,\n width: number,\n theme: {\n fg(color: string, value: string): string;\n bg(color: string, value: string): string;\n },\n now: number,\n): string {\n const innerWidth = Math.max(10, width - 2);\n const progress = getOptimisticProgress(item, now);\n const filled = Math.max(\n 0,\n Math.min(innerWidth, Math.round(progress * innerWidth)),\n );\n const barBgColor =\n item.status === \"error\"\n ? \"toolErrorBg\"\n : item.status === \"done\"\n ? \"toolSuccessBg\"\n : item.status === \"queued\"\n ? \"toolPendingBg\"\n : \"selectedBg\";\n\n const centeredLabel = (() => {\n const raw = item.status;\n if (raw.length >= innerWidth) {\n return raw.slice(0, innerWidth);\n }\n const totalPadding = innerWidth - raw.length;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n return `${\" \".repeat(leftPadding)}${raw}${\" \".repeat(rightPadding)}`;\n })();\n const filledLabel = centeredLabel.slice(0, filled);\n const emptyLabel = centeredLabel.slice(filled);\n\n return [\n theme.fg(\"muted\", \"[\"),\n theme.bg(barBgColor, theme.fg(\"text\", filledLabel)),\n theme.bg(\"toolPendingBg\", theme.fg(\"muted\", emptyLabel)),\n theme.fg(\"muted\", \"]\"),\n ].join(\"\");\n}\n\nfunction renderStatusGlyph(\n item: BatchFetchItemProgress,\n spinnerIndex: number,\n theme: {\n fg(color: string, value: string): string;\n },\n): string {\n switch (item.status) {\n case \"done\":\n return theme.fg(\"success\", \"✓\");\n case \"error\":\n return theme.fg(\"error\", \"✗\");\n case \"queued\":\n return theme.fg(\n \"muted\",\n SPINNER_FRAMES[spinnerIndex % SPINNER_FRAMES.length] ?? \"⠋\",\n );\n default:\n return theme.fg(\n \"accent\",\n SPINNER_FRAMES[spinnerIndex % SPINNER_FRAMES.length] ?? \"⠋\",\n );\n }\n}\n\nfunction renderBatchProgressText(\n snapshot: BatchFetchProgressSnapshot,\n width: number,\n expanded: boolean,\n theme: {\n bold(value: string): string;\n fg(color: string, value: string): string;\n bg(color: string, value: string): string;\n },\n spinnerTick = 0,\n): string {\n const summary = [\n theme.fg(\"toolTitle\", theme.bold(\"batch_web_fetch \")),\n theme.fg(\n \"muted\",\n `${snapshot.completed}/${snapshot.total} done · ok ${snapshot.succeeded} · err ${snapshot.failed} · concurrency ${snapshot.batchConcurrency}`,\n ),\n ].join(\"\");\n\n const availableRowWidth = Math.max(24, width);\n const progressWidth = Math.max(\n 12,\n Math.min(18, Math.floor(availableRowWidth * 0.2)),\n );\n const glyphWidth = 2;\n const urlWidth = Math.max(\n 12,\n availableRowWidth - glyphWidth - progressWidth - 2,\n );\n\n const now = Date.now();\n\n const rows = snapshot.items.map((item, index) => {\n const glyph = renderStatusGlyph(item, spinnerTick + index, theme);\n const url = theme.fg(\"accent\", truncateMiddle(item.url, urlWidth));\n const bar = renderProgressBar(item, progressWidth, theme, now);\n\n const baseRow = `${glyph} ${url} ${bar}`;\n if (!expanded || !item.error) {\n return baseRow;\n }\n\n return `${baseRow}\\n ${theme.fg(\"error\", `error: ${item.error}`)}`;\n });\n\n return [summary, ...rows].join(\"\\n\");\n}\n\nfunction buildWebFetchCollapsedText(\n details: WebFetchRenderDetails,\n theme: {\n fg(color: string, value: string): string;\n },\n) {\n const fetchResult = details.fetchResult;\n if (!fetchResult) {\n return theme.fg(\"muted\", \"No fetch result available.\");\n }\n\n const headerLine =\n theme.fg(\"toolTitle\", \"web_fetch\") +\n \" \" +\n theme.fg(\"accent\", fetchResult.finalUrl || fetchResult.url);\n\n const metadataLines: string[] = [];\n if (fetchResult.title) {\n metadataLines.push(theme.fg(\"muted\", `> Title: ${fetchResult.title}`));\n }\n if (fetchResult.published) {\n metadataLines.push(\n theme.fg(\"muted\", `> Published: ${fetchResult.published}`),\n );\n }\n if (fetchResult.author) {\n metadataLines.push(theme.fg(\"muted\", `> Author: ${fetchResult.author}`));\n }\n\n const contentLines = fetchResult.content\n .split(\"\\n\")\n .filter(\n (line, index, lines) =>\n line.length > 0 || index === 0 || index < lines.length - 1,\n );\n const maxPreviewLines = 7;\n const previewLines = contentLines.slice(0, maxPreviewLines);\n const remainingLines = Math.max(0, contentLines.length - previewLines.length);\n const expandKey = keyText(\"app.tools.expand\") || \"Ctrl+O\";\n\n const parts: string[] = [headerLine, \"\"];\n if (metadataLines.length > 0) {\n parts.push(...metadataLines, \"\");\n }\n\n if (previewLines.length > 0) {\n parts.push(...previewLines.map((line) => theme.fg(\"toolOutput\", line)));\n }\n\n if (remainingLines > 0) {\n parts.push(\n theme.fg(\"muted\", `... (${remainingLines} more lines, `) +\n theme.fg(\"dim\", expandKey) +\n theme.fg(\"muted\", \" to expand)\"),\n );\n }\n\n return parts.join(\"\\n\");\n}\n\nfunction createResponsiveBatchComponent(\n details: BatchRenderDetails,\n expanded: boolean,\n theme: {\n bold(value: string): string;\n fg(color: string, value: string): string;\n bg(color: string, value: string): string;\n },\n) {\n const text = new Text(\"\", 0, 0);\n\n return {\n render(width: number) {\n const snapshot = details.batchProgress;\n if (!snapshot) {\n text.setText(theme.fg(\"muted\", \"No batch progress available.\"));\n return text.render(width);\n }\n\n const spinnerTick = details.spinnerTick ?? 0;\n text.setText(\n renderBatchProgressText(snapshot, width, expanded, theme, spinnerTick),\n );\n return text.render(width);\n },\n invalidate() {\n text.invalidate();\n },\n };\n}\n\nexport default function piSmartFetchExtension(pi: ExtensionAPI) {\n const defaults = resolveFetchToolDefaults();\n\n pi.registerTool({\n name: \"web_fetch\",\n label: \"web_fetch\",\n description: toolDescription,\n promptSnippet:\n \"web_fetch(url, browser?, os?, headers?, maxChars?, format?, removeImages?, includeReplies?, proxy?, verbose?): fetch browser-fingerprinted readable web content\",\n parameters: Type.Object({\n ...createBaseFetchToolParameterProperties(defaults),\n verbose: Type.Optional(\n Type.Boolean({\n description:\n \"Include the full metadata header (site, language, word count, browser fingerprint info). Default: false, or smartFetchVerboseByDefault from pi settings.\",\n }),\n ),\n }),\n\n async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n const settings = await loadPiSmartFetchSettings(ctx.cwd, getAgentDir());\n const runtimeDefaults = resolveFetchToolDefaults(settings);\n const verbose =\n (params.verbose as boolean | undefined) ?? settings.verboseByDefault;\n const result = await executeFetchToolCall(params, runtimeDefaults);\n\n if (isError(result)) {\n return {\n content: [{ type: \"text\", text: `Error: ${result.error}` }],\n details: { error: true, verbose },\n };\n }\n\n return {\n content: [\n { type: \"text\", text: buildFetchResponseText(result, { verbose }) },\n ],\n details: {\n verbose,\n maxChars: runtimeDefaults.maxChars,\n fetchResult: result,\n } satisfies WebFetchRenderDetails,\n };\n },\n\n renderResult(result, { expanded, isPartial }, theme) {\n if (isPartial) {\n return new Text(theme.fg(\"warning\", \"Fetching...\"), 0, 0);\n }\n\n const details =\n (result.details as WebFetchRenderDetails | undefined) ?? {};\n const textContent = result.content.find((item) => item.type === \"text\");\n const outputText = textContent?.type === \"text\" ? textContent.text : \"\";\n\n if (details.error) {\n const firstLine = outputText.split(\"\\n\")[0] ?? \"Error\";\n return new Text(theme.fg(\"error\", firstLine), 0, 0);\n }\n\n if (!expanded) {\n return new Text(buildWebFetchCollapsedText(details, theme), 0, 0);\n }\n\n return new Text(outputText, 0, 0);\n },\n });\n\n pi.registerTool({\n name: \"batch_web_fetch\",\n label: \"batch_web_fetch\",\n description: batchToolDescription,\n promptSnippet:\n \"batch_web_fetch(requests, verbose?): fetch multiple URLs concurrently with per-item progress in the pi TUI\",\n parameters: Type.Object({\n ...createBatchFetchToolParameterProperties(defaults),\n verbose: Type.Optional(\n Type.Boolean({\n description:\n \"Include the full metadata header for each successful result. Default: false, or smartFetchVerboseByDefault from pi settings.\",\n }),\n ),\n }),\n\n async execute(_toolCallId, params, _signal, onUpdate, ctx) {\n const settings = await loadPiSmartFetchSettings(ctx.cwd, getAgentDir());\n const runtimeDefaults = resolveFetchToolDefaults(settings);\n const verbose =\n (params.verbose as boolean | undefined) ?? settings.verboseByDefault;\n\n let latestSnapshot: BatchFetchProgressSnapshot | undefined;\n let spinnerTick = 0;\n let spinnerTimer: ReturnType<typeof setInterval> | null = null;\n\n const emitProgress = (snapshot: BatchFetchProgressSnapshot) => {\n onUpdate?.({\n content: [\n {\n type: \"text\",\n text: `Started batch fetch for ${snapshot.total} URLs (${snapshot.completed}/${snapshot.total} complete).`,\n },\n ],\n details: {\n verbose,\n started: true,\n batchProgress: snapshot,\n spinnerTick,\n } satisfies BatchRenderDetails,\n });\n };\n\n try {\n spinnerTimer = setInterval(() => {\n if (\n !latestSnapshot ||\n latestSnapshot.completed >= latestSnapshot.total\n ) {\n return;\n }\n spinnerTick += 1;\n emitProgress(latestSnapshot);\n }, SPINNER_INTERVAL_MS);\n\n const batchResult = await executeBatchFetchToolCall(\n params,\n runtimeDefaults,\n {\n batchConcurrency: runtimeDefaults.batchConcurrency,\n onProgress(snapshot) {\n latestSnapshot = snapshot;\n emitProgress(snapshot);\n },\n },\n );\n\n const finalProgress: BatchFetchProgressSnapshot = {\n items: batchResult.items.map((item) => ({\n index: item.index,\n url: item.request.url,\n status: item.status,\n progress: item.progress,\n ...(item.error ? { error: item.error } : {}),\n })),\n total: batchResult.total,\n completed: batchResult.total,\n succeeded: batchResult.succeeded,\n failed: batchResult.failed,\n batchConcurrency: batchResult.batchConcurrency,\n };\n\n return {\n content: [\n {\n type: \"text\",\n text: buildBatchFetchResponseText(batchResult, { verbose }),\n },\n ],\n details: {\n verbose,\n started: true,\n batchProgress: finalProgress,\n batchResult,\n spinnerTick,\n } satisfies BatchRenderDetails,\n };\n } finally {\n if (spinnerTimer) {\n clearInterval(spinnerTimer);\n }\n }\n },\n\n renderCall(args, theme) {\n const batchArgs = args as { requests?: unknown[] };\n const requestCount = Array.isArray(batchArgs.requests)\n ? batchArgs.requests.length\n : 0;\n let text = theme.fg(\"toolTitle\", theme.bold(\"batch_web_fetch \"));\n text += theme.fg(\"muted\", `${requestCount} urls`);\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { expanded }, theme) {\n return createResponsiveBatchComponent(\n (result.details as BatchRenderDetails | undefined) ?? {},\n expanded,\n theme,\n );\n },\n });\n}\n"]}
|