src / tools / webTools.ts
export async function executeWebTool(toolName: string, args: any): Promise<any> {
switch (toolName) {
case "searchWeb": {
const query = args?.query || "";
const maxResults = args?.maxResults || 5;
try {
const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
const res = await fetch(url, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } });
if (res.ok) {
const html = await res.text();
const results: Array<{ title: string; snippet: string; url: string }> = [];
const regex = /<a class="result__url"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<a class="result__snippet"[^>]*>([\s\S]*?)<\/a>/g;
let match;
while ((match = regex.exec(html)) !== null && results.length < maxResults) {
results.push({
url: match[1].trim(),
title: match[2].replace(/<[^>]+>/g, "").trim(),
snippet: match[3].replace(/<[^>]+>/g, "").trim(),
});
}
return { success: true, query, results: results.length > 0 ? results : [{ snippet: `Searched for: ${query}, no rich results found.` }] };
}
} catch (err: any) {
return { success: false, query, error: err.message };
}
return { success: true, query, message: `Searched for: ${query}` };
}
case "fetchArticle": {
const targetUrl = args?.url || "";
try {
const res = await fetch(targetUrl, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const text = await res.text();
const cleanText = text
.replace(/<script[\s\S]*?<\/script>/gi, "")
.replace(/<style[\s\S]*?<\/style>/gi, "")
.replace(/<[^>]+>/g, " ")
.replace(/\s+/g, " ")
.slice(0, 5000);
return { success: true, url: targetUrl, content: cleanText };
} catch (err: any) {
return { success: false, url: targetUrl, error: err.message };
}
}
default:
return null;
}
}
src / tools / webTools.ts
export async function executeWebTool(toolName: string, args: any): Promise<any> {
switch (toolName) {
case "searchWeb": {
const query = args?.query || "";
const maxResults = args?.maxResults || 5;
try {
const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
const res = await fetch(url, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } });
if (res.ok) {
const html = await res.text();
const results: Array<{ title: string; snippet: string; url: string }> = [];
const regex = /<a class="result__url"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<a class="result__snippet"[^>]*>([\s\S]*?)<\/a>/g;
let match;
while ((match = regex.exec(html)) !== null && results.length < maxResults) {
results.push({
url: match[1].trim(),
title: match[2].replace(/<[^>]+>/g, "").trim(),
snippet: match[3].replace(/<[^>]+>/g, "").trim(),
});
}
return { success: true, query, results: results.length > 0 ? results : [{ snippet: `Searched for: ${query}, no rich results found.` }] };
}
} catch (err: any) {
return { success: false, query, error: err.message };
}
return { success: true, query, message: `Searched for: ${query}` };
}
case "fetchArticle": {
const targetUrl = args?.url || "";
try {
const res = await fetch(targetUrl, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const text = await res.text();
const cleanText = text
.replace(/<script[\s\S]*?<\/script>/gi, "")
.replace(/<style[\s\S]*?<\/style>/gi, "")
.replace(/<[^>]+>/g, " ")
.replace(/\s+/g, " ")
.slice(0, 5000);
return { success: true, url: targetUrl, content: cleanText };
} catch (err: any) {
return { success: false, url: targetUrl, error: err.message };
}
}
default:
return null;
}
}