@kenkaiiii/ggcoder 4.3.231 → 4.3.232
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/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +29 -0
- package/dist/config.test.js.map +1 -0
- package/dist/core/ideal-review.d.ts +20 -0
- package/dist/core/ideal-review.d.ts.map +1 -0
- package/dist/core/ideal-review.js +55 -0
- package/dist/core/ideal-review.js.map +1 -0
- package/dist/core/ideal-review.test.d.ts +2 -0
- package/dist/core/ideal-review.test.d.ts.map +1 -0
- package/dist/core/ideal-review.test.js +59 -0
- package/dist/core/ideal-review.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/tools/html-extract.d.ts +58 -0
- package/dist/tools/html-extract.d.ts.map +1 -0
- package/dist/tools/html-extract.js +130 -0
- package/dist/tools/html-extract.js.map +1 -0
- package/dist/tools/html-extract.test.d.ts +2 -0
- package/dist/tools/html-extract.test.d.ts.map +1 -0
- package/dist/tools/html-extract.test.js +60 -0
- package/dist/tools/html-extract.test.js.map +1 -0
- package/dist/tools/pdf-extract.d.ts +18 -0
- package/dist/tools/pdf-extract.d.ts.map +1 -0
- package/dist/tools/pdf-extract.js +43 -0
- package/dist/tools/pdf-extract.js.map +1 -0
- package/dist/tools/pdf-extract.test.d.ts +2 -0
- package/dist/tools/pdf-extract.test.d.ts.map +1 -0
- package/dist/tools/pdf-extract.test.js +15 -0
- package/dist/tools/pdf-extract.test.js.map +1 -0
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -1
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +16 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +357 -45
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +263 -2
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts +14 -0
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +321 -35
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/web-search.test.js +144 -1
- package/dist/tools/web-search.test.js.map +1 -1
- package/dist/ui/App.d.ts +2 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +54 -1
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +14 -1
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +2 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/IdealHookMessage.d.ts +12 -0
- package/dist/ui/components/IdealHookMessage.d.ts.map +1 -0
- package/dist/ui/components/IdealHookMessage.js +24 -0
- package/dist/ui/components/IdealHookMessage.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +2 -0
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +45 -1
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/render.d.ts +3 -0
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +2 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/terminal-history.d.ts.map +1 -1
- package/dist/ui/terminal-history.js +8 -0
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.js +3 -0
- package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
- package/dist/ui/transcript/spacing.d.ts +2 -2
- package/dist/ui/transcript/spacing.d.ts.map +1 -1
- package/dist/ui/transcript/spacing.js +1 -0
- package/dist/ui/transcript/spacing.js.map +1 -1
- package/dist/ui/transcript/spacing.test.js +2 -0
- package/dist/ui/transcript/spacing.test.js.map +1 -1
- package/dist/ui/tui-history-parity.test.js +8 -0
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/dist/utils/format.js +7 -0
- package/dist/utils/format.js.map +1 -1
- package/package.json +10 -4
package/dist/tools/web-fetch.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { extractToMarkdown } from "./html-extract.js";
|
|
3
|
+
import { extractPdfText, PdfExtractorUnavailable } from "./pdf-extract.js";
|
|
2
4
|
/**
|
|
3
5
|
* Block requests to private/internal network addresses to prevent SSRF.
|
|
4
6
|
* Checks the hostname against known private IP ranges and reserved domains.
|
|
@@ -138,61 +140,371 @@ export function htmlToCleanText(html) {
|
|
|
138
140
|
.replace(/\n{3,}/g, "\n\n")
|
|
139
141
|
.trim();
|
|
140
142
|
}
|
|
143
|
+
// ── Fetch configuration ──────────────────────────────────────
|
|
144
|
+
const MAX_REDIRECTS = 5;
|
|
145
|
+
const MAX_PDF_BYTES = 25 * 1024 * 1024; // refuse PDFs larger than ~25 MB
|
|
146
|
+
const MAX_URLS = 10;
|
|
147
|
+
const MAX_CONCURRENCY = 5;
|
|
148
|
+
const PER_URL_MIN_BUDGET = 1000;
|
|
149
|
+
const FETCH_HEADERS = {
|
|
150
|
+
"User-Agent": "Mozilla/5.0 (compatible; GGCoder/1.0)",
|
|
151
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
152
|
+
};
|
|
153
|
+
const DOC_PATH_PATTERNS = [/\/docs?\b/i, /\/reference\b/i, /\/api\b/i, /\/guide/i, /\/learn\b/i];
|
|
154
|
+
const DOC_ROOT_SEGMENTS = new Set(["docs", "doc", "reference", "api", "guide", "learn"]);
|
|
155
|
+
const LONG_LLMS_THRESHOLD = 20000;
|
|
156
|
+
const DEFAULT_LLMS_CANDIDATE_LIMIT = 6;
|
|
157
|
+
/**
|
|
158
|
+
* Fetch a URL, transparently following safe redirects up to `MAX_REDIRECTS`.
|
|
159
|
+
* Each hop's target is re-validated with `isBlockedUrl` (SSRF) and the abort
|
|
160
|
+
* signal is honored throughout. Returns the final non-redirect response or an
|
|
161
|
+
* error string describing why the fetch could not complete.
|
|
162
|
+
*/
|
|
163
|
+
async function fetchOne(url, signal) {
|
|
164
|
+
let currentUrl = url;
|
|
165
|
+
for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
|
|
166
|
+
const response = await fetch(currentUrl, {
|
|
167
|
+
headers: FETCH_HEADERS,
|
|
168
|
+
redirect: "manual",
|
|
169
|
+
signal: AbortSignal.any([signal, AbortSignal.timeout(30000)]),
|
|
170
|
+
});
|
|
171
|
+
if (response.status >= 300 && response.status < 400) {
|
|
172
|
+
const location = response.headers.get("location");
|
|
173
|
+
if (!location) {
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
error: `Error: HTTP ${response.status} redirect without Location header`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const redirectUrl = new URL(location, currentUrl).toString();
|
|
180
|
+
if (isBlockedUrl(redirectUrl)) {
|
|
181
|
+
return {
|
|
182
|
+
ok: false,
|
|
183
|
+
error: "Error: Redirect blocked — target URL is private/internal or unsupported.",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
currentUrl = redirectUrl;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const contentLengthHeader = response.headers.get("content-length");
|
|
190
|
+
return {
|
|
191
|
+
ok: true,
|
|
192
|
+
response: {
|
|
193
|
+
status: response.status,
|
|
194
|
+
statusText: response.statusText,
|
|
195
|
+
contentType: response.headers.get("content-type") ?? "",
|
|
196
|
+
contentLength: contentLengthHeader ? Number(contentLengthHeader) : null,
|
|
197
|
+
body: response,
|
|
198
|
+
finalUrl: currentUrl,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return { ok: false, error: `Error: too many redirects (>${MAX_REDIRECTS})` };
|
|
203
|
+
}
|
|
204
|
+
function truncate(content, maxLength) {
|
|
205
|
+
if (content.length <= maxLength)
|
|
206
|
+
return content;
|
|
207
|
+
return content.slice(0, maxLength) + "\n\n[Content truncated]";
|
|
208
|
+
}
|
|
209
|
+
function looksLikePdf(contentType, url, head) {
|
|
210
|
+
if (contentType.includes("application/pdf"))
|
|
211
|
+
return true;
|
|
212
|
+
const magic = head.length >= 4 &&
|
|
213
|
+
head[0] === 0x25 &&
|
|
214
|
+
head[1] === 0x50 &&
|
|
215
|
+
head[2] === 0x44 &&
|
|
216
|
+
head[3] === 0x46;
|
|
217
|
+
if (url.toLowerCase().split("?")[0].endsWith(".pdf") && magic)
|
|
218
|
+
return true;
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
/** Process a fetched PDF body into extracted text or an explanatory error. */
|
|
222
|
+
async function processPdf(response, maxLength) {
|
|
223
|
+
if (response.contentLength !== null && response.contentLength > MAX_PDF_BYTES) {
|
|
224
|
+
return `Error: PDF too large (${response.contentLength} bytes; limit ${MAX_PDF_BYTES}).`;
|
|
225
|
+
}
|
|
226
|
+
const buffer = await response.body.arrayBuffer();
|
|
227
|
+
if (buffer.byteLength > MAX_PDF_BYTES) {
|
|
228
|
+
return `Error: PDF too large (${buffer.byteLength} bytes; limit ${MAX_PDF_BYTES}).`;
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const { text, pages } = await extractPdfText(new Uint8Array(buffer));
|
|
232
|
+
return `[PDF · ${pages} page${pages === 1 ? "" : "s"}]\n\n${truncate(text.trim(), maxLength)}`;
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
if (err instanceof PdfExtractorUnavailable) {
|
|
236
|
+
return "PDF detected but the optional 'unpdf' dependency is not installed. Add it: pnpm add -w unpdf";
|
|
237
|
+
}
|
|
238
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
239
|
+
return `Error extracting PDF text: ${msg}`;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/** Process a fetched HTML/text body into the requested format. */
|
|
243
|
+
async function processHtmlOrText(response, text, opts) {
|
|
244
|
+
const isHtml = response.contentType.includes("html");
|
|
245
|
+
if (!isHtml) {
|
|
246
|
+
return truncate(text, opts.maxLength);
|
|
247
|
+
}
|
|
248
|
+
if (opts.format === "text") {
|
|
249
|
+
return truncate(htmlToCleanText(text), opts.maxLength);
|
|
250
|
+
}
|
|
251
|
+
// markdown (default) and html both attempt Readability extraction first.
|
|
252
|
+
try {
|
|
253
|
+
const extracted = await extractToMarkdown(text, response.finalUrl);
|
|
254
|
+
if (extracted) {
|
|
255
|
+
const heading = extracted.title ? `# ${extracted.title}\n\n` : "";
|
|
256
|
+
return truncate(heading + extracted.markdown, opts.maxLength);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
// Extractor unavailable or failed — fall through to the regex path.
|
|
261
|
+
}
|
|
262
|
+
return truncate(htmlToCleanText(text), opts.maxLength);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Run the full per-URL pipeline (SSRF check → redirects → PDF/HTML/text →
|
|
266
|
+
* format). Never throws: returns content or an `Error: …` string so one bad
|
|
267
|
+
* URL in a multi-URL call doesn't fail the whole call.
|
|
268
|
+
*/
|
|
269
|
+
async function fetchAndProcess(url, opts, signal) {
|
|
270
|
+
if (isBlockedUrl(url)) {
|
|
271
|
+
return "Error: URL blocked — requests to private/internal network addresses are not allowed.";
|
|
272
|
+
}
|
|
273
|
+
try {
|
|
274
|
+
const result = await fetchOne(url, signal);
|
|
275
|
+
if (!result.ok)
|
|
276
|
+
return result.error;
|
|
277
|
+
const { response } = result;
|
|
278
|
+
if (!(response.status >= 200 && response.status < 300)) {
|
|
279
|
+
return `Error: HTTP ${response.status} ${response.statusText}`;
|
|
280
|
+
}
|
|
281
|
+
const buffer = await response.body.arrayBuffer();
|
|
282
|
+
const head = new Uint8Array(buffer.slice(0, 4));
|
|
283
|
+
if (looksLikePdf(response.contentType, response.finalUrl, head)) {
|
|
284
|
+
// Re-wrap the already-read buffer so processPdf can read it again.
|
|
285
|
+
const pdfResponse = {
|
|
286
|
+
...response,
|
|
287
|
+
body: new Response(buffer),
|
|
288
|
+
contentLength: buffer.byteLength,
|
|
289
|
+
};
|
|
290
|
+
return await processPdf(pdfResponse, opts.maxLength);
|
|
291
|
+
}
|
|
292
|
+
const text = new TextDecoder().decode(buffer);
|
|
293
|
+
return await processHtmlOrText(response, text, opts);
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
297
|
+
return `Error fetching ${url}: ${msg}`;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/** Heuristic: does this URL look like a documentation page worth probing for llms.txt? */
|
|
301
|
+
function isDocish(url) {
|
|
302
|
+
let parsed;
|
|
303
|
+
try {
|
|
304
|
+
parsed = new URL(url);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
if (parsed.hostname.toLowerCase().startsWith("docs."))
|
|
310
|
+
return true;
|
|
311
|
+
return DOC_PATH_PATTERNS.some((p) => p.test(parsed.pathname));
|
|
312
|
+
}
|
|
313
|
+
function addLlmsFileCandidates(candidates, baseUrl, host, maxLength, priorityBase) {
|
|
314
|
+
const base = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
315
|
+
candidates.push({
|
|
316
|
+
url: `${base}llms.txt`,
|
|
317
|
+
label: `llms.txt for ${host}`,
|
|
318
|
+
kind: "llms",
|
|
319
|
+
priority: priorityBase,
|
|
320
|
+
});
|
|
321
|
+
candidates.push({
|
|
322
|
+
url: `${base}llms-ctx.txt`,
|
|
323
|
+
label: `llms-ctx.txt for ${host}`,
|
|
324
|
+
kind: "llms-ctx",
|
|
325
|
+
priority: priorityBase + 2,
|
|
326
|
+
});
|
|
327
|
+
if (maxLength >= LONG_LLMS_THRESHOLD) {
|
|
328
|
+
candidates.push({
|
|
329
|
+
url: `${base}llms-full.txt`,
|
|
330
|
+
label: `llms-full.txt for ${host}`,
|
|
331
|
+
kind: "llms-full",
|
|
332
|
+
priority: priorityBase + 3,
|
|
333
|
+
});
|
|
334
|
+
candidates.push({
|
|
335
|
+
url: `${base}llms-ctx-full.txt`,
|
|
336
|
+
label: `llms-ctx-full.txt for ${host}`,
|
|
337
|
+
kind: "llms-ctx",
|
|
338
|
+
priority: priorityBase + 4,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
export function buildLlmsCandidates(url, maxLength) {
|
|
343
|
+
const parsed = new URL(url);
|
|
344
|
+
const candidates = [];
|
|
345
|
+
addLlmsFileCandidates(candidates, parsed.origin, parsed.host, maxLength, 10);
|
|
346
|
+
const pathSegments = parsed.pathname.split("/").filter(Boolean);
|
|
347
|
+
const docRootIndex = pathSegments.findIndex((segment) => DOC_ROOT_SEGMENTS.has(segment.toLowerCase()));
|
|
348
|
+
if (docRootIndex >= 0) {
|
|
349
|
+
const rootPath = pathSegments
|
|
350
|
+
.slice(0, docRootIndex + 1)
|
|
351
|
+
.map(encodeURIComponent)
|
|
352
|
+
.join("/");
|
|
353
|
+
addLlmsFileCandidates(candidates, `${parsed.origin}/${rootPath}/`, parsed.host, maxLength, 20);
|
|
354
|
+
}
|
|
355
|
+
const pageMarkdownUrl = new URL(parsed.href);
|
|
356
|
+
pageMarkdownUrl.hash = "";
|
|
357
|
+
if (pageMarkdownUrl.pathname.endsWith("/")) {
|
|
358
|
+
pageMarkdownUrl.pathname += "index.html.md";
|
|
359
|
+
}
|
|
360
|
+
else if (!pageMarkdownUrl.pathname.endsWith(".md")) {
|
|
361
|
+
pageMarkdownUrl.pathname += ".md";
|
|
362
|
+
}
|
|
363
|
+
candidates.push({
|
|
364
|
+
url: pageMarkdownUrl.href,
|
|
365
|
+
label: `Markdown source for ${pageMarkdownUrl.host}${pageMarkdownUrl.pathname}`,
|
|
366
|
+
kind: "page-md",
|
|
367
|
+
priority: 15,
|
|
368
|
+
});
|
|
369
|
+
const seen = new Set();
|
|
370
|
+
return candidates
|
|
371
|
+
.sort((a, b) => a.priority - b.priority)
|
|
372
|
+
.filter((candidate) => {
|
|
373
|
+
if (seen.has(candidate.url))
|
|
374
|
+
return false;
|
|
375
|
+
seen.add(candidate.url);
|
|
376
|
+
return true;
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function looksLikeHtmlErrorPage(text) {
|
|
380
|
+
const trimmed = text.trim().slice(0, 4000).toLowerCase();
|
|
381
|
+
if (/^(<!doctype html|<html\b)/i.test(trimmed))
|
|
382
|
+
return true;
|
|
383
|
+
if (/<title>\s*(404|not found|error)\b/i.test(trimmed))
|
|
384
|
+
return true;
|
|
385
|
+
const tagMatches = trimmed.match(/<\/?[a-z][^>]*>/g) ?? [];
|
|
386
|
+
return tagMatches.length > 20 && tagMatches.join("").length > trimmed.length * 0.25;
|
|
387
|
+
}
|
|
388
|
+
function looksLikeMarkdownDocument(text, contentType, candidate) {
|
|
389
|
+
const trimmed = text.trim();
|
|
390
|
+
const minimumLength = candidate.kind === "page-md" ? 80 : 120;
|
|
391
|
+
if (trimmed.length <= minimumLength)
|
|
392
|
+
return false;
|
|
393
|
+
if (looksLikeHtmlErrorPage(trimmed))
|
|
394
|
+
return false;
|
|
395
|
+
if (/text\/plain|text\/markdown|markdown/i.test(contentType))
|
|
396
|
+
return true;
|
|
397
|
+
if (/^---\s*[\s\S]{0,1200}?---\s*\n#\s+/m.test(trimmed))
|
|
398
|
+
return true;
|
|
399
|
+
if (/^#\s+\S+/m.test(trimmed))
|
|
400
|
+
return true;
|
|
401
|
+
const markdownLinks = trimmed.match(/\[[^\]]+\]\([^)]+\)/g) ?? [];
|
|
402
|
+
const listItems = trimmed.match(/^\s*[-*]\s+\S+/gm) ?? [];
|
|
403
|
+
return candidate.kind !== "page-md" && markdownLinks.length + listItems.length >= 3;
|
|
404
|
+
}
|
|
405
|
+
async function tryLlmsResource(url, opts, signal) {
|
|
406
|
+
let candidates;
|
|
407
|
+
try {
|
|
408
|
+
candidates = buildLlmsCandidates(url, opts.maxLength);
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
const limit = opts.maxLength >= LONG_LLMS_THRESHOLD ? candidates.length : DEFAULT_LLMS_CANDIDATE_LIMIT;
|
|
414
|
+
for (const candidate of candidates.slice(0, limit)) {
|
|
415
|
+
if (isBlockedUrl(candidate.url))
|
|
416
|
+
continue;
|
|
417
|
+
try {
|
|
418
|
+
const result = await fetchOne(candidate.url, signal);
|
|
419
|
+
if (!result.ok)
|
|
420
|
+
continue;
|
|
421
|
+
const { response } = result;
|
|
422
|
+
if (response.status !== 200)
|
|
423
|
+
continue;
|
|
424
|
+
const text = await response.body.text();
|
|
425
|
+
if (!looksLikeMarkdownDocument(text, response.contentType, candidate))
|
|
426
|
+
continue;
|
|
427
|
+
return `[${candidate.label}]\nSource: ${response.finalUrl}\n\n${truncate(text.trim(), opts.maxLength)}`;
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
// Try the next candidate; probes should never block the real fetch.
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
async function fetchWithPreferredDocs(url, opts, signal) {
|
|
436
|
+
if (opts.preferLlmsTxt && !isBlockedUrl(url) && isDocish(url)) {
|
|
437
|
+
const llms = await tryLlmsResource(url, opts, signal);
|
|
438
|
+
if (llms)
|
|
439
|
+
return llms;
|
|
440
|
+
}
|
|
441
|
+
return await fetchAndProcess(url, opts, signal);
|
|
442
|
+
}
|
|
141
443
|
export function createWebFetchTool() {
|
|
142
444
|
return {
|
|
143
445
|
name: "web_fetch",
|
|
144
|
-
description: "Fetch and read
|
|
446
|
+
description: "Fetch and read web page content. Accepts a single `url` or a `urls` array (up to 10, " +
|
|
447
|
+
"fetched concurrently). Returns clean Markdown by default (`format`: markdown|text|html) via " +
|
|
448
|
+
"main-content extraction. Extracts text from PDFs, follows safe redirects automatically, and " +
|
|
449
|
+
"prefers a site's curated /llms.txt for docs pages when available.",
|
|
145
450
|
parameters,
|
|
146
|
-
async execute(args) {
|
|
451
|
+
async execute(args, context) {
|
|
147
452
|
const maxLength = args.max_length ?? 10000;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
redirect: "manual",
|
|
158
|
-
signal: AbortSignal.timeout(30000),
|
|
159
|
-
});
|
|
160
|
-
if (response.status >= 300 && response.status < 400) {
|
|
161
|
-
const location = response.headers.get("location");
|
|
162
|
-
if (!location)
|
|
163
|
-
return `Error: HTTP ${response.status} redirect without Location header`;
|
|
164
|
-
const redirectUrl = new URL(location, args.url).toString();
|
|
165
|
-
if (isBlockedUrl(redirectUrl)) {
|
|
166
|
-
return "Error: Redirect blocked — target URL is private/internal or unsupported.";
|
|
167
|
-
}
|
|
168
|
-
return `Error: Redirects are not followed automatically. Safe redirect target: ${redirectUrl}`;
|
|
169
|
-
}
|
|
170
|
-
if (!response.ok) {
|
|
171
|
-
return `Error: HTTP ${response.status} ${response.statusText}`;
|
|
172
|
-
}
|
|
173
|
-
const contentType = response.headers.get("content-type") ?? "";
|
|
174
|
-
const text = await response.text();
|
|
175
|
-
let content;
|
|
176
|
-
if (contentType.includes("html")) {
|
|
177
|
-
content = htmlToCleanText(text);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
content = text;
|
|
181
|
-
}
|
|
182
|
-
if (content.length > maxLength) {
|
|
183
|
-
content = content.slice(0, maxLength) + "\n\n[Content truncated]";
|
|
184
|
-
}
|
|
185
|
-
return content;
|
|
453
|
+
const format = args.format ?? "markdown";
|
|
454
|
+
const preferLlmsTxt = args.prefer_llms_txt !== false;
|
|
455
|
+
// Multi-URL path: bounded-concurrency pool, per-URL budget, ordered output.
|
|
456
|
+
if (args.urls && args.urls.length > 0) {
|
|
457
|
+
const urls = args.urls;
|
|
458
|
+
const perUrlBudget = Math.max(PER_URL_MIN_BUDGET, Math.floor(maxLength / urls.length));
|
|
459
|
+
const opts = { maxLength: perUrlBudget, format, preferLlmsTxt };
|
|
460
|
+
const sections = await runPool(urls, MAX_CONCURRENCY, (u) => fetchWithPreferredDocs(u, opts, context.signal));
|
|
461
|
+
return urls.map((u, i) => `## ${u}\n${sections[i]}`).join("\n\n");
|
|
186
462
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
return
|
|
463
|
+
const url = args.url;
|
|
464
|
+
if (!url) {
|
|
465
|
+
return "Error: provide either `url` or `urls`.";
|
|
190
466
|
}
|
|
467
|
+
const opts = { maxLength, format, preferLlmsTxt };
|
|
468
|
+
return await fetchWithPreferredDocs(url, opts, context.signal);
|
|
191
469
|
},
|
|
192
470
|
};
|
|
193
471
|
}
|
|
194
|
-
|
|
195
|
-
|
|
472
|
+
/**
|
|
473
|
+
* Run `worker` over `items` with at most `limit` in flight, preserving input
|
|
474
|
+
* order in the returned results array.
|
|
475
|
+
*/
|
|
476
|
+
async function runPool(items, limit, worker) {
|
|
477
|
+
const results = new Array(items.length);
|
|
478
|
+
let next = 0;
|
|
479
|
+
async function runner() {
|
|
480
|
+
while (next < items.length) {
|
|
481
|
+
const index = next++;
|
|
482
|
+
results[index] = await worker(items[index]);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
const runners = Array.from({ length: Math.min(limit, items.length) }, () => runner());
|
|
486
|
+
await Promise.all(runners);
|
|
487
|
+
return results;
|
|
488
|
+
}
|
|
489
|
+
const parameters = z
|
|
490
|
+
.object({
|
|
491
|
+
url: z.string().optional().describe("The URL to fetch"),
|
|
492
|
+
urls: z
|
|
493
|
+
.array(z.string())
|
|
494
|
+
.max(MAX_URLS)
|
|
495
|
+
.optional()
|
|
496
|
+
.describe(`Fetch multiple URLs concurrently (up to ${MAX_URLS}); returns a sectioned digest`),
|
|
196
497
|
max_length: z.number().optional().describe("Maximum characters to return (default: 10000)"),
|
|
498
|
+
format: z
|
|
499
|
+
.enum(["markdown", "text", "html"])
|
|
500
|
+
.optional()
|
|
501
|
+
.describe("Output format: markdown (default, main-content extraction), text, or html"),
|
|
502
|
+
prefer_llms_txt: z
|
|
503
|
+
.boolean()
|
|
504
|
+
.optional()
|
|
505
|
+
.describe("Prefer a site's curated /llms.txt for documentation pages (default: true)"),
|
|
506
|
+
})
|
|
507
|
+
.refine((v) => Boolean(v.url) !== Boolean(v.urls && v.urls.length > 0), {
|
|
508
|
+
message: "Provide exactly one of `url` or `urls`.",
|
|
197
509
|
});
|
|
198
510
|
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,6BAA6B;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAE/C,4BAA4B;IAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IAChB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,kEAAkE;IAClE,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,gCAAgC;IAChC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iCAAiC;IACjC,IAAI,QAAQ,KAAK,0BAA0B;QAAE,OAAO,IAAI,CAAC;IAEzD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,6BAA6B,GAAG;IACpC,QAAQ;IACR,OAAO;IACP,UAAU;IACV,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,KAAK;IACL,KAAK;IACL,KAAK;IACL,SAAS;IACT,OAAO;IACP,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,MAAM,yBAAyB,GAAG;IAChC,2CAA2C;IAC3C,qDAAqD;IACrD,sBAAsB;IACtB,qDAAqD;IACrD,0DAA0D;IAC1D,yBAAyB;IACzB,8CAA8C;IAC9C,qBAAqB;CACtB,CAAC;AAEF,SAAS,mBAAmB,CAAC,IAAY,EAAE,OAAe;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,OAAO,oBAAoB,OAAO,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY;IAC7C,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,KAAK,MAAM,OAAO,IAAI,6BAA6B,EAAE,CAAC;QACpD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,IAAI,MAAM,CACR,wGAAwG,OAAO,oCAAoC,EACnJ,IAAI,CACL,EACD,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,OAAO,IAAI;QACpB,QAAQ;QACR,OAAO;QACP,UAAU;QACV,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,OAAO;KACR,EAAE,CAAC;QACF,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,IAAI,CAAC;SACrD,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAChC,OAAO,CAAC,kEAAkE,EAAE,IAAI,CAAC,CAAC;IAErF,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SACjE,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;SAC/C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SAC1F,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,+JAA+J;QACjK,UAAU;QACV,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;YAE3C,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,sFAAsF,CAAC;YAChG,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;oBACrC,OAAO,EAAE;wBACP,YAAY,EAAE,uCAAuC;wBACrD,MAAM,EAAE,iEAAiE;qBAC1E;oBACD,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;iBACnC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAClD,IAAI,CAAC,QAAQ;wBAAE,OAAO,eAAe,QAAQ,CAAC,MAAM,mCAAmC,CAAC;oBACxF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3D,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC9B,OAAO,0EAA0E,CAAC;oBACpF,CAAC;oBACD,OAAO,0EAA0E,WAAW,EAAE,CAAC;gBACjG,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO,eAAe,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACjE,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,IAAI,OAAe,CAAC;gBACpB,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;oBAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,yBAAyB,CAAC;gBACpE,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,kBAAkB,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CAC5F,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|