webpeel 0.14.2 → 0.14.4
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/cache.d.ts.map +1 -1
- package/dist/cache.js +11 -4
- package/dist/cache.js.map +1 -1
- package/dist/cli.bundle.cjs +159248 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/agent.js +12 -8
- package/dist/core/agent.js.map +1 -1
- package/dist/core/application-tracker.js +3 -2
- package/dist/core/application-tracker.js.map +1 -1
- package/dist/core/auto-extract.js +6 -4
- package/dist/core/auto-extract.js.map +1 -1
- package/dist/core/browser-fetch.d.ts +90 -0
- package/dist/core/browser-fetch.d.ts.map +1 -0
- package/dist/core/browser-fetch.js +599 -0
- package/dist/core/browser-fetch.js.map +1 -0
- package/dist/core/browser-pool.d.ts +70 -0
- package/dist/core/browser-pool.d.ts.map +1 -0
- package/dist/core/browser-pool.js +378 -0
- package/dist/core/browser-pool.js.map +1 -0
- package/dist/core/change-tracking.js +3 -2
- package/dist/core/change-tracking.js.map +1 -1
- package/dist/core/diff.js +3 -2
- package/dist/core/diff.js.map +1 -1
- package/dist/core/domain-extractors.js +3 -2
- package/dist/core/domain-extractors.js.map +1 -1
- package/dist/core/extract-inline.js +6 -4
- package/dist/core/extract-inline.js.map +1 -1
- package/dist/core/fetcher.d.ts +9 -116
- package/dist/core/fetcher.d.ts.map +1 -1
- package/dist/core/fetcher.js +10 -1484
- package/dist/core/fetcher.js.map +1 -1
- package/dist/core/http-fetch.d.ts +37 -0
- package/dist/core/http-fetch.d.ts.map +1 -0
- package/dist/core/http-fetch.js +618 -0
- package/dist/core/http-fetch.js.map +1 -0
- package/dist/core/metadata.js +18 -12
- package/dist/core/metadata.js.map +1 -1
- package/dist/core/pipeline.d.ts +104 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +623 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/profiles.js +15 -10
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/quick-answer.d.ts.map +1 -1
- package/dist/core/quick-answer.js +120 -9
- package/dist/core/quick-answer.js.map +1 -1
- package/dist/core/rate-governor.js +3 -2
- package/dist/core/rate-governor.js.map +1 -1
- package/dist/core/readability.d.ts.map +1 -1
- package/dist/core/readability.js +19 -6
- package/dist/core/readability.js.map +1 -1
- package/dist/core/research.js +9 -6
- package/dist/core/research.js.map +1 -1
- package/dist/core/search-provider.js +12 -8
- package/dist/core/search-provider.js.map +1 -1
- package/dist/core/strategies.d.ts.map +1 -1
- package/dist/core/strategies.js +14 -5
- package/dist/core/strategies.js.map +1 -1
- package/dist/core/timing.d.ts +22 -0
- package/dist/core/timing.d.ts.map +1 -0
- package/dist/core/timing.js +34 -0
- package/dist/core/timing.js.map +1 -0
- package/dist/core/youtube.d.ts.map +1 -1
- package/dist/core/youtube.js +19 -6
- package/dist/core/youtube.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -444
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/middleware/auth.js +3 -2
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/server/routes/answer.d.ts.map +1 -1
- package/dist/server/routes/answer.js +5 -0
- package/dist/server/routes/answer.js.map +1 -1
- package/dist/server/routes/compat.js +3 -2
- package/dist/server/routes/compat.js.map +1 -1
- package/dist/server/routes/deep-fetch.d.ts.map +1 -1
- package/dist/server/routes/deep-fetch.js +5 -0
- package/dist/server/routes/deep-fetch.js.map +1 -1
- package/dist/server/routes/fetch.d.ts.map +1 -1
- package/dist/server/routes/fetch.js +44 -4
- package/dist/server/routes/fetch.js.map +1 -1
- package/dist/server/routes/health.js +3 -2
- package/dist/server/routes/health.js.map +1 -1
- package/dist/server/routes/mcp.js +1 -1
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/quick-answer.d.ts.map +1 -1
- package/dist/server/routes/quick-answer.js +5 -0
- package/dist/server/routes/quick-answer.js.map +1 -1
- package/dist/server/routes/search.js +6 -4
- package/dist/server/routes/search.js.map +1 -1
- package/dist/server/routes/users.js +3 -2
- package/dist/server/routes/users.js.map +1 -1
- package/dist/server/routes/webhooks.d.ts +1 -0
- package/dist/server/routes/webhooks.d.ts.map +1 -1
- package/dist/server/routes/webhooks.js +1 -0
- package/dist/server/routes/webhooks.js.map +1 -1
- package/dist/server/routes/youtube.d.ts.map +1 -1
- package/dist/server/routes/youtube.js +5 -0
- package/dist/server/routes/youtube.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -2
package/dist/index.js
CHANGED
|
@@ -3,20 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Main library export
|
|
5
5
|
*/
|
|
6
|
-
import { createHash } from 'crypto';
|
|
7
|
-
import { smartFetch } from './core/strategies.js';
|
|
8
|
-
import { htmlToMarkdown, htmlToText, estimateTokens, selectContent, detectMainContent, calculateQuality, truncateToTokenBudget, filterByTags } from './core/markdown.js';
|
|
9
|
-
import { pruneContent } from './core/content-pruner.js';
|
|
10
|
-
import { distillToBudget } from './core/budget.js';
|
|
11
|
-
import { extractMetadata, extractLinks, extractImages } from './core/metadata.js';
|
|
12
6
|
import { cleanup, warmup, closePool, scrollAndWait, closeProfileBrowser } from './core/fetcher.js';
|
|
13
|
-
import {
|
|
14
|
-
import { extractStructured } from './core/extract.js';
|
|
15
|
-
import { isPdfContentType, isDocxContentType, extractDocumentToFormat } from './core/documents.js';
|
|
16
|
-
import { parseYouTubeUrl, getYouTubeTranscript } from './core/youtube.js';
|
|
17
|
-
import { extractDomainData, getDomainExtractor } from './core/domain-extractors.js';
|
|
18
|
-
import { extractReadableContent } from './core/readability.js';
|
|
19
|
-
import { quickAnswer as runQuickAnswer } from './core/quick-answer.js';
|
|
7
|
+
import { createContext, normalizeOptions, handleYouTube, fetchContent, detectContentType, parseContent, postProcess, finalize, buildResult, } from './core/pipeline.js';
|
|
20
8
|
export * from './types.js';
|
|
21
9
|
export { getDomainExtractor, extractDomainData } from './core/domain-extractors.js';
|
|
22
10
|
export { crawl } from './core/crawler.js';
|
|
@@ -45,6 +33,7 @@ export { watch, parseDuration, parseAssertion, } from './core/watch.js';
|
|
|
45
33
|
export { diffUrl, } from './core/diff.js';
|
|
46
34
|
export { extractReadableContent } from './core/readability.js';
|
|
47
35
|
export { quickAnswer } from './core/quick-answer.js';
|
|
36
|
+
export { Timer } from './core/timing.js';
|
|
48
37
|
/**
|
|
49
38
|
* Fetch and extract content from a URL
|
|
50
39
|
*
|
|
@@ -62,438 +51,18 @@ export { quickAnswer } from './core/quick-answer.js';
|
|
|
62
51
|
* ```
|
|
63
52
|
*/
|
|
64
53
|
export async function peel(url, options = {}) {
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (options.format === undefined)
|
|
71
|
-
options.format = 'markdown';
|
|
72
|
-
}
|
|
73
|
-
let { render = false, stealth = false, wait = 0, format = 'markdown', timeout = 30000, userAgent, screenshot = false, screenshotFullPage = false, selector, exclude, includeTags, excludeTags, headers, cookies, raw = false, actions, extract, maxTokens, images: extractImagesFlag = false, location: _location, stream: _stream, profileDir, headed = false, storageState, proxy, fullPage = false, autoScroll: autoScrollOption, } = options;
|
|
74
|
-
void _stream;
|
|
75
|
-
// Normalize autoScroll option
|
|
76
|
-
const autoScrollOpts = autoScrollOption
|
|
77
|
-
? (typeof autoScrollOption === 'boolean' ? {} : autoScrollOption)
|
|
78
|
-
: undefined;
|
|
79
|
-
// NOTE: PDFs/DOCX are now handled via simpleFetch + document parser.
|
|
80
|
-
// No need to force browser rendering for them.
|
|
81
|
-
// If screenshot is requested, force render mode
|
|
82
|
-
if (screenshot) {
|
|
83
|
-
render = true;
|
|
84
|
-
}
|
|
85
|
-
// If stealth is requested, force render mode
|
|
86
|
-
if (stealth) {
|
|
87
|
-
render = true;
|
|
88
|
-
}
|
|
89
|
-
// If actions are provided, force render mode
|
|
90
|
-
if (actions && actions.length > 0) {
|
|
91
|
-
render = true;
|
|
92
|
-
}
|
|
93
|
-
// If branding is requested, force render mode
|
|
94
|
-
if (options.branding) {
|
|
95
|
-
render = true;
|
|
96
|
-
}
|
|
97
|
-
// If autoScroll is requested, force render mode
|
|
98
|
-
if (autoScrollOpts) {
|
|
99
|
-
render = true;
|
|
100
|
-
}
|
|
101
|
-
// ---------------------------------------------------------------------------
|
|
102
|
-
// YouTube special case — extract transcript instead of fetching the page HTML
|
|
103
|
-
// ---------------------------------------------------------------------------
|
|
104
|
-
const ytVideoId = parseYouTubeUrl(url);
|
|
105
|
-
if (ytVideoId) {
|
|
106
|
-
const ytStartTime = Date.now();
|
|
107
|
-
try {
|
|
108
|
-
const transcript = await getYouTubeTranscript(url, {
|
|
109
|
-
language: options.language ?? 'en',
|
|
110
|
-
});
|
|
111
|
-
// Build a clean markdown representation of the video + transcript
|
|
112
|
-
const videoInfoLines = [
|
|
113
|
-
`# ${transcript.title}`,
|
|
114
|
-
'',
|
|
115
|
-
`**Channel:** ${transcript.channel}`,
|
|
116
|
-
`**Duration:** ${transcript.duration}`,
|
|
117
|
-
`**Language:** ${transcript.language}`,
|
|
118
|
-
transcript.availableLanguages.length > 1
|
|
119
|
-
? `**Available Languages:** ${transcript.availableLanguages.join(', ')}`
|
|
120
|
-
: '',
|
|
121
|
-
'',
|
|
122
|
-
'## Transcript',
|
|
123
|
-
'',
|
|
124
|
-
transcript.fullText,
|
|
125
|
-
].filter(l => l !== undefined);
|
|
126
|
-
const videoInfoContent = videoInfoLines.join('\n');
|
|
127
|
-
const elapsed = Date.now() - ytStartTime;
|
|
128
|
-
const tokens = estimateTokens(videoInfoContent);
|
|
129
|
-
const fingerprint = createHash('sha256').update(videoInfoContent).digest('hex').slice(0, 16);
|
|
130
|
-
return {
|
|
131
|
-
url: `https://www.youtube.com/watch?v=${ytVideoId}`,
|
|
132
|
-
title: transcript.title,
|
|
133
|
-
content: videoInfoContent,
|
|
134
|
-
metadata: {
|
|
135
|
-
description: `YouTube video by ${transcript.channel}, duration ${transcript.duration}`,
|
|
136
|
-
author: transcript.channel,
|
|
137
|
-
},
|
|
138
|
-
links: [`https://www.youtube.com/watch?v=${ytVideoId}`],
|
|
139
|
-
tokens,
|
|
140
|
-
method: 'simple',
|
|
141
|
-
elapsed,
|
|
142
|
-
contentType: 'youtube',
|
|
143
|
-
quality: 1.0,
|
|
144
|
-
fingerprint,
|
|
145
|
-
extracted: undefined,
|
|
146
|
-
structured: transcript,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
catch (_ytError) {
|
|
150
|
-
// If transcript extraction fails (no captions, page changed, etc.),
|
|
151
|
-
// fall through to the normal HTML fetch pipeline below.
|
|
152
|
-
}
|
|
153
|
-
}
|
|
54
|
+
const ctx = createContext(url, options);
|
|
55
|
+
normalizeOptions(ctx);
|
|
56
|
+
const ytResult = await handleYouTube(ctx);
|
|
57
|
+
if (ytResult)
|
|
58
|
+
return ytResult;
|
|
154
59
|
try {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
waitMs: wait,
|
|
162
|
-
userAgent,
|
|
163
|
-
timeoutMs: timeout,
|
|
164
|
-
screenshot,
|
|
165
|
-
screenshotFullPage,
|
|
166
|
-
headers,
|
|
167
|
-
cookies,
|
|
168
|
-
actions,
|
|
169
|
-
keepPageOpen: needsBranding || needsAutoScroll,
|
|
170
|
-
profileDir,
|
|
171
|
-
headed,
|
|
172
|
-
storageState,
|
|
173
|
-
proxy,
|
|
174
|
-
});
|
|
175
|
-
// Auto-scroll to load lazy content, then grab fresh HTML
|
|
176
|
-
if (needsAutoScroll && fetchResult.page) {
|
|
177
|
-
try {
|
|
178
|
-
await runAutoScroll(fetchResult.page, autoScrollOpts);
|
|
179
|
-
// Capture refreshed HTML after scrolling
|
|
180
|
-
fetchResult.html = await fetchResult.page.content();
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
// If autoScroll fails, continue with whatever HTML we have
|
|
184
|
-
}
|
|
185
|
-
finally {
|
|
186
|
-
// Close page unless branding also needs it
|
|
187
|
-
if (!needsBranding) {
|
|
188
|
-
try {
|
|
189
|
-
await fetchResult.page.close().catch(() => { });
|
|
190
|
-
if (fetchResult.browser && !needsBranding) {
|
|
191
|
-
await fetchResult.browser.close().catch(() => { });
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
catch { /* ignore cleanup errors */ }
|
|
195
|
-
fetchResult.page = undefined;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
// Detect content type from the response
|
|
200
|
-
const ct = (fetchResult.contentType || '').toLowerCase();
|
|
201
|
-
const urlLower = fetchResult.url.toLowerCase();
|
|
202
|
-
// Check for binary document types (PDF/DOCX)
|
|
203
|
-
const isDocument = isPdfContentType(ct) || isDocxContentType(ct) ||
|
|
204
|
-
urlLower.endsWith('.pdf') || urlLower.endsWith('.docx');
|
|
205
|
-
const hasBuffer = !!fetchResult.buffer;
|
|
206
|
-
const isHTML = !isDocument && (ct.includes('html') || ct.includes('xhtml') || (!ct && fetchResult.html.trimStart().startsWith('<')));
|
|
207
|
-
const isJSON = !isDocument && ct.includes('json');
|
|
208
|
-
const isXML = !isDocument && (ct.includes('xml') || ct.includes('rss') || ct.includes('atom'));
|
|
209
|
-
const isPlainText = !isDocument && (ct.includes('text/plain') || ct.includes('text/markdown') || ct.includes('text/csv') || ct.includes('text/css') || ct.includes('javascript'));
|
|
210
|
-
const detectedType = isDocument ? 'document' : isHTML ? 'html' : isJSON ? 'json' : isXML ? 'xml' : isPlainText ? 'text' : 'html';
|
|
211
|
-
let content;
|
|
212
|
-
let title = '';
|
|
213
|
-
let metadata = {};
|
|
214
|
-
let links = [];
|
|
215
|
-
let quality = 0;
|
|
216
|
-
let prunedPercent;
|
|
217
|
-
if (isDocument && hasBuffer) {
|
|
218
|
-
// Document parsing pipeline (PDF/DOCX)
|
|
219
|
-
const docResult = await extractDocumentToFormat(fetchResult.buffer, {
|
|
220
|
-
url: fetchResult.url,
|
|
221
|
-
contentType: fetchResult.contentType,
|
|
222
|
-
format,
|
|
223
|
-
});
|
|
224
|
-
content = docResult.content;
|
|
225
|
-
title = docResult.metadata.title;
|
|
226
|
-
metadata = docResult.metadata;
|
|
227
|
-
quality = 1.0; // Documents are inherently structured content
|
|
228
|
-
}
|
|
229
|
-
else if (isHTML) {
|
|
230
|
-
// Standard HTML pipeline
|
|
231
|
-
let html = fetchResult.html;
|
|
232
|
-
// Apply include/exclude tags filtering first (before selector)
|
|
233
|
-
if (includeTags || excludeTags) {
|
|
234
|
-
html = filterByTags(html, includeTags, excludeTags);
|
|
235
|
-
}
|
|
236
|
-
if (selector) {
|
|
237
|
-
html = selectContent(html, selector, exclude);
|
|
238
|
-
}
|
|
239
|
-
else if (exclude?.length) {
|
|
240
|
-
// Apply exclude selectors even without a specific selector
|
|
241
|
-
const cheerio = await import('cheerio');
|
|
242
|
-
const $doc = cheerio.load(html);
|
|
243
|
-
exclude.forEach(sel => $doc(sel).remove());
|
|
244
|
-
html = $doc.html() || html;
|
|
245
|
-
}
|
|
246
|
-
// Smart main content detection (unless raw or selector specified)
|
|
247
|
-
let contentHtml = html;
|
|
248
|
-
if (!raw && !selector) {
|
|
249
|
-
const detected = detectMainContent(html);
|
|
250
|
-
if (detected.detected) {
|
|
251
|
-
contentHtml = detected.html;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
const metadataTask = Promise.resolve().then(() => {
|
|
255
|
-
const meta = extractMetadata(html, fetchResult.url);
|
|
256
|
-
return {
|
|
257
|
-
title: meta.title,
|
|
258
|
-
metadata: meta.metadata,
|
|
259
|
-
links: extractLinks(html, fetchResult.url),
|
|
260
|
-
};
|
|
261
|
-
});
|
|
262
|
-
// Content density pruning — runs on HTML before markdown conversion.
|
|
263
|
-
// Removes low-value blocks (sidebars, footers, ads) CSS selectors miss.
|
|
264
|
-
// OFF when fullPage=true or format !== markdown.
|
|
265
|
-
if (format === 'markdown' && !fullPage) {
|
|
266
|
-
const pruned = pruneContent(contentHtml, { dynamic: true });
|
|
267
|
-
contentHtml = pruned.html;
|
|
268
|
-
if (pruned.nodesRemoved > 0) {
|
|
269
|
-
prunedPercent = pruned.reductionPercent;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
const contentTask = Promise.resolve().then(() => {
|
|
273
|
-
switch (format) {
|
|
274
|
-
case 'html':
|
|
275
|
-
return contentHtml;
|
|
276
|
-
case 'text':
|
|
277
|
-
return htmlToText(contentHtml);
|
|
278
|
-
case 'markdown':
|
|
279
|
-
default:
|
|
280
|
-
// prune:false — already pruned above; avoid double-pruning in htmlToMarkdown
|
|
281
|
-
return htmlToMarkdown(contentHtml, { raw, prune: false });
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
const [metaResult, convertedContent] = await Promise.all([metadataTask, contentTask]);
|
|
285
|
-
title = metaResult.title;
|
|
286
|
-
metadata = metaResult.metadata;
|
|
287
|
-
links = metaResult.links;
|
|
288
|
-
content = convertedContent;
|
|
289
|
-
quality = calculateQuality(content, fetchResult.html);
|
|
290
|
-
}
|
|
291
|
-
else if (isJSON) {
|
|
292
|
-
// JSON content — format nicely
|
|
293
|
-
try {
|
|
294
|
-
const parsed = JSON.parse(fetchResult.html);
|
|
295
|
-
content = JSON.stringify(parsed, null, 2);
|
|
296
|
-
title = 'JSON Response';
|
|
297
|
-
// Extract any URLs from JSON for links
|
|
298
|
-
const urlRegex = /https?:\/\/[^\s"'`,\]})]+/g;
|
|
299
|
-
const found = content.match(urlRegex) || [];
|
|
300
|
-
links = [...new Set(found)];
|
|
301
|
-
}
|
|
302
|
-
catch {
|
|
303
|
-
content = fetchResult.html;
|
|
304
|
-
title = 'JSON Response (malformed)';
|
|
305
|
-
}
|
|
306
|
-
quality = 1.0; // JSON is structured, always "clean"
|
|
307
|
-
}
|
|
308
|
-
else if (isXML) {
|
|
309
|
-
// XML/RSS/Atom — convert to readable format
|
|
310
|
-
try {
|
|
311
|
-
const $ = (await import('cheerio')).load(fetchResult.html, { xml: true });
|
|
312
|
-
// Check if RSS/Atom feed
|
|
313
|
-
const items = $('item, entry');
|
|
314
|
-
if (items.length > 0) {
|
|
315
|
-
title = $('channel > title, feed > title').first().text() || 'RSS/Atom Feed';
|
|
316
|
-
const feedItems = [];
|
|
317
|
-
items.each((_, el) => {
|
|
318
|
-
const itemTitle = $(el).find('title').first().text();
|
|
319
|
-
const itemLink = $(el).find('link').first().text() || $(el).find('link').first().attr('href') || '';
|
|
320
|
-
const itemDesc = $(el).find('description, summary, content').first().text().slice(0, 200);
|
|
321
|
-
feedItems.push(`## ${itemTitle}\n${itemLink}\n${itemDesc}`);
|
|
322
|
-
if (itemLink)
|
|
323
|
-
links.push(itemLink);
|
|
324
|
-
});
|
|
325
|
-
content = `# ${title}\n\n${feedItems.join('\n\n---\n\n')}`;
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
content = fetchResult.html;
|
|
329
|
-
title = $('title').first().text() || 'XML Document';
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
catch {
|
|
333
|
-
content = fetchResult.html;
|
|
334
|
-
title = 'XML Document';
|
|
335
|
-
}
|
|
336
|
-
quality = 0.9;
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
// Plain text, CSS, JS, etc — return as-is
|
|
340
|
-
content = fetchResult.html;
|
|
341
|
-
title = fetchResult.url.split('/').pop() || 'Text Document';
|
|
342
|
-
// Extract URLs from plain text
|
|
343
|
-
const urlRegex = /https?:\/\/[^\s"'`,\]})]+/g;
|
|
344
|
-
const found = content.match(urlRegex) || [];
|
|
345
|
-
links = [...new Set(found)];
|
|
346
|
-
quality = 1.0;
|
|
347
|
-
}
|
|
348
|
-
// Readability mode
|
|
349
|
-
let readabilityResult;
|
|
350
|
-
if (options.readable && isHTML && fetchResult.html) {
|
|
351
|
-
const readResult = extractReadableContent(fetchResult.html, fetchResult.url);
|
|
352
|
-
readabilityResult = readResult;
|
|
353
|
-
content = readResult.content;
|
|
354
|
-
metadata = {
|
|
355
|
-
...metadata,
|
|
356
|
-
title: readResult.title || metadata?.title,
|
|
357
|
-
author: readResult.author || undefined,
|
|
358
|
-
publishedDate: readResult.date || undefined,
|
|
359
|
-
};
|
|
360
|
-
title = readResult.title || title;
|
|
361
|
-
}
|
|
362
|
-
// Extract images if requested
|
|
363
|
-
let imagesList;
|
|
364
|
-
if (extractImagesFlag && isHTML) {
|
|
365
|
-
imagesList = extractImages(fetchResult.html, fetchResult.url);
|
|
366
|
-
}
|
|
367
|
-
// Extract structured data if requested
|
|
368
|
-
let extracted;
|
|
369
|
-
if (extract && isHTML) {
|
|
370
|
-
if (extract.llmApiKey && (extract.prompt || extract.schema)) {
|
|
371
|
-
// LLM-powered extraction
|
|
372
|
-
const { extractWithLLM } = await import('./core/extract.js');
|
|
373
|
-
extracted = await extractWithLLM(content, extract);
|
|
374
|
-
}
|
|
375
|
-
else if (extract.selectors || extract.schema) {
|
|
376
|
-
// CSS-based extraction (existing)
|
|
377
|
-
extracted = extractStructured(fetchResult.html, extract);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
// Truncate to token budget if requested (simple truncation)
|
|
381
|
-
if (maxTokens && maxTokens > 0) {
|
|
382
|
-
content = truncateToTokenBudget(content, maxTokens);
|
|
383
|
-
}
|
|
384
|
-
// Smart budget distillation — applied AFTER maxTokens truncation
|
|
385
|
-
// This intelligently compresses content (strips boilerplate, compresses
|
|
386
|
-
// tables, removes weak paragraphs) rather than blindly cutting.
|
|
387
|
-
if (options.budget && options.budget > 0) {
|
|
388
|
-
const budgetFormat = detectedType === 'json' ? 'json' :
|
|
389
|
-
format === 'text' ? 'text' : 'markdown';
|
|
390
|
-
content = distillToBudget(content, options.budget, budgetFormat);
|
|
391
|
-
}
|
|
392
|
-
// Domain-aware structured extraction (Twitter, Reddit, GitHub, HN)
|
|
393
|
-
// Fires when URL matches a known domain. Replaces content with clean markdown.
|
|
394
|
-
let domainData;
|
|
395
|
-
if (getDomainExtractor(fetchResult.url)) {
|
|
396
|
-
try {
|
|
397
|
-
const ddResult = await extractDomainData(fetchResult.html, fetchResult.url);
|
|
398
|
-
if (ddResult) {
|
|
399
|
-
domainData = ddResult;
|
|
400
|
-
content = ddResult.cleanContent;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
catch {
|
|
404
|
-
// Domain extraction failure is non-fatal; continue with normal content
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
// Quick answer (LLM-free)
|
|
408
|
-
let quickAnswerResult;
|
|
409
|
-
if (options.question && content) {
|
|
410
|
-
const qa = runQuickAnswer({
|
|
411
|
-
question: options.question,
|
|
412
|
-
content,
|
|
413
|
-
url: fetchResult.url,
|
|
414
|
-
});
|
|
415
|
-
quickAnswerResult = qa;
|
|
416
|
-
}
|
|
417
|
-
// Calculate elapsed time, tokens, and fingerprint
|
|
418
|
-
const elapsed = Date.now() - startTime;
|
|
419
|
-
const tokens = estimateTokens(content);
|
|
420
|
-
const fingerprint = createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
421
|
-
// Convert screenshot buffer to base64 if present
|
|
422
|
-
const screenshotBase64 = fetchResult.screenshot?.toString('base64');
|
|
423
|
-
// Extract branding if requested (reuses existing browser page when available)
|
|
424
|
-
let brandingProfile;
|
|
425
|
-
if (options.branding && render && fetchResult.page) {
|
|
426
|
-
try {
|
|
427
|
-
const { extractBranding } = await import('./core/branding.js');
|
|
428
|
-
brandingProfile = await extractBranding(fetchResult.page);
|
|
429
|
-
}
|
|
430
|
-
catch (error) {
|
|
431
|
-
console.error('Branding extraction failed:', error);
|
|
432
|
-
}
|
|
433
|
-
finally {
|
|
434
|
-
// Clean up the kept-open page and browser
|
|
435
|
-
try {
|
|
436
|
-
await fetchResult.page.close().catch(() => { });
|
|
437
|
-
if (fetchResult.browser) {
|
|
438
|
-
await fetchResult.browser.close().catch(() => { });
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
catch { /* ignore cleanup errors */ }
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
// Track content changes if requested
|
|
445
|
-
let changeResult;
|
|
446
|
-
if (options.changeTracking) {
|
|
447
|
-
try {
|
|
448
|
-
const { trackChange } = await import('./core/change-tracking.js');
|
|
449
|
-
changeResult = await trackChange(fetchResult.url, content, fingerprint);
|
|
450
|
-
}
|
|
451
|
-
catch (error) {
|
|
452
|
-
console.error('Change tracking failed:', error);
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
// Generate AI summary if requested
|
|
456
|
-
let summaryText;
|
|
457
|
-
if (options.summary && options.llm) {
|
|
458
|
-
try {
|
|
459
|
-
const { summarizeContent } = await import('./core/summarize.js');
|
|
460
|
-
const maxLength = typeof options.summary === 'object' && options.summary.maxLength
|
|
461
|
-
? options.summary.maxLength
|
|
462
|
-
: 150;
|
|
463
|
-
summaryText = await summarizeContent(content, {
|
|
464
|
-
apiKey: options.llm.apiKey,
|
|
465
|
-
model: options.llm.model,
|
|
466
|
-
apiBase: options.llm.baseUrl,
|
|
467
|
-
maxWords: maxLength,
|
|
468
|
-
});
|
|
469
|
-
}
|
|
470
|
-
catch (error) {
|
|
471
|
-
console.error('Summary generation failed:', error);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
return {
|
|
475
|
-
url: fetchResult.url,
|
|
476
|
-
title,
|
|
477
|
-
content,
|
|
478
|
-
metadata,
|
|
479
|
-
links,
|
|
480
|
-
tokens,
|
|
481
|
-
method: fetchResult.method === 'cached' ? 'simple' : fetchResult.method,
|
|
482
|
-
elapsed,
|
|
483
|
-
screenshot: screenshotBase64,
|
|
484
|
-
contentType: detectedType,
|
|
485
|
-
quality,
|
|
486
|
-
fingerprint,
|
|
487
|
-
extracted,
|
|
488
|
-
branding: brandingProfile,
|
|
489
|
-
changeTracking: changeResult,
|
|
490
|
-
summary: summaryText,
|
|
491
|
-
images: imagesList,
|
|
492
|
-
...(prunedPercent !== undefined ? { prunedPercent } : {}),
|
|
493
|
-
...(domainData !== undefined ? { domainData } : {}),
|
|
494
|
-
...(readabilityResult !== undefined ? { readability: readabilityResult } : {}),
|
|
495
|
-
...(quickAnswerResult !== undefined ? { quickAnswer: quickAnswerResult } : {}),
|
|
496
|
-
};
|
|
60
|
+
await fetchContent(ctx);
|
|
61
|
+
detectContentType(ctx);
|
|
62
|
+
await parseContent(ctx);
|
|
63
|
+
await postProcess(ctx);
|
|
64
|
+
await finalize(ctx);
|
|
65
|
+
return buildResult(ctx);
|
|
497
66
|
}
|
|
498
67
|
catch (error) {
|
|
499
68
|
// Clean up browser resources on error
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -59,7 +59,7 @@ const server = new Server({
|
|
|
59
59
|
const tools = [
|
|
60
60
|
{
|
|
61
61
|
name: 'webpeel_fetch',
|
|
62
|
-
description: 'Fetch any URL and return clean markdown content. Handles JavaScript rendering
|
|
62
|
+
description: 'Fetch any URL and return clean markdown content. Use budget=4000 to get token-efficient output (strips boilerplate, compresses tables). Handles JavaScript rendering and bot detection automatically. Use readable=true for article-only content, question="..." for instant Q&A.',
|
|
63
63
|
annotations: {
|
|
64
64
|
title: 'Fetch Web Page',
|
|
65
65
|
readOnlyHint: true,
|