smart-web-mcp 0.1.0

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/shared.js ADDED
@@ -0,0 +1,283 @@
1
+ import { lookup } from "node:dns/promises";
2
+ import { BlockList, isIP } from "node:net";
3
+ const blockedAddressRanges = new BlockList();
4
+ blockedAddressRanges.addSubnet("0.0.0.0", 8, "ipv4");
5
+ blockedAddressRanges.addSubnet("10.0.0.0", 8, "ipv4");
6
+ blockedAddressRanges.addSubnet("100.64.0.0", 10, "ipv4");
7
+ blockedAddressRanges.addSubnet("127.0.0.0", 8, "ipv4");
8
+ blockedAddressRanges.addSubnet("169.254.0.0", 16, "ipv4");
9
+ blockedAddressRanges.addSubnet("172.16.0.0", 12, "ipv4");
10
+ blockedAddressRanges.addSubnet("192.0.0.0", 24, "ipv4");
11
+ blockedAddressRanges.addSubnet("192.0.2.0", 24, "ipv4");
12
+ blockedAddressRanges.addSubnet("192.168.0.0", 16, "ipv4");
13
+ blockedAddressRanges.addSubnet("198.18.0.0", 15, "ipv4");
14
+ blockedAddressRanges.addSubnet("198.51.100.0", 24, "ipv4");
15
+ blockedAddressRanges.addSubnet("203.0.113.0", 24, "ipv4");
16
+ blockedAddressRanges.addSubnet("224.0.0.0", 4, "ipv4");
17
+ blockedAddressRanges.addSubnet("::", 128, "ipv6");
18
+ blockedAddressRanges.addSubnet("::1", 128, "ipv6");
19
+ blockedAddressRanges.addSubnet("fc00::", 7, "ipv6");
20
+ blockedAddressRanges.addSubnet("fe80::", 10, "ipv6");
21
+ blockedAddressRanges.addSubnet("2001:db8::", 32, "ipv6");
22
+ export function asString(value) {
23
+ return String(value || "");
24
+ }
25
+ export function asNumber(value) {
26
+ const parsed = Number(value);
27
+ return Number.isFinite(parsed) ? parsed : 0;
28
+ }
29
+ export function decodeHtml(value) {
30
+ return value
31
+ .replace(/&/g, "&")
32
+ .replace(/&lt;/g, "<")
33
+ .replace(/&gt;/g, ">")
34
+ .replace(/&quot;/g, '"')
35
+ .replace(/&#39;/g, "'")
36
+ .replace(/&#x27;/g, "'")
37
+ .replace(/&#x2F;/g, "/")
38
+ .replace(/&#47;/g, "/")
39
+ .replace(/&nbsp;/g, " ");
40
+ }
41
+ export function stripTags(value) {
42
+ return decodeHtml(value.replace(/<[^>]+>/g, " ")).replace(/\s+/g, " ").trim();
43
+ }
44
+ export function trimUrlToken(value) {
45
+ return value.replace(/[),.;!?]+$/g, "");
46
+ }
47
+ export function dedupeUrls(values) {
48
+ const out = [];
49
+ const seen = new Set();
50
+ for (const raw of values) {
51
+ const item = trimUrlToken(asString(raw).trim());
52
+ if (!item || seen.has(item))
53
+ continue;
54
+ seen.add(item);
55
+ out.push(item);
56
+ }
57
+ return out;
58
+ }
59
+ export function cleanLinks(values) {
60
+ return values
61
+ .map((item) => String(item || "").trim())
62
+ .filter((item) => item && !item.startsWith("data:") && !item.startsWith("#") && !item.includes("redditstatic.com/") && item.length < 300);
63
+ }
64
+ export function extractUrls(value) {
65
+ const out = [];
66
+ const re = /https?:\/\/[^\s"'<>]+/gi;
67
+ for (const match of value.matchAll(re))
68
+ out.push(asString(match[0]));
69
+ return dedupeUrls(out);
70
+ }
71
+ export function extractAnchorHrefs(value) {
72
+ const out = [];
73
+ const re = /href=["']([^"']+)["']/gi;
74
+ for (const match of value.matchAll(re))
75
+ out.push(decodeHtml(asString(match[1])).trim());
76
+ return dedupeUrls(out);
77
+ }
78
+ export function uniqueResults(results) {
79
+ const seen = new Set();
80
+ const out = [];
81
+ for (const item of results) {
82
+ const key = item.url.trim();
83
+ if (!key || seen.has(key))
84
+ continue;
85
+ seen.add(key);
86
+ out.push(item);
87
+ }
88
+ return out;
89
+ }
90
+ export function resolveDuckDuckGoUrl(input) {
91
+ const decoded = decodeHtml(input);
92
+ const candidate = decoded.startsWith("//") ? `https:${decoded}` : decoded;
93
+ try {
94
+ const url = new URL(candidate);
95
+ const uddg = url.searchParams.get("uddg");
96
+ return uddg ? decodeURIComponent(uddg) : candidate;
97
+ }
98
+ catch {
99
+ return candidate;
100
+ }
101
+ }
102
+ export function capture(value, regex) {
103
+ const match = value.match(regex);
104
+ return match?.[1] ? asString(match[1]) : "";
105
+ }
106
+ export function extractTitleFromHtml(html) {
107
+ return stripTags(capture(html, /<title[^>]*>([\s\S]*?)<\/title>/i));
108
+ }
109
+ export function extractMetaDescription(html) {
110
+ const doubleQuoted = html.match(/<meta[^>]+name=["']description["'][^>]+content=["']([\s\S]*?)["'][^>]*>/i);
111
+ if (doubleQuoted?.[1])
112
+ return decodeHtml(doubleQuoted[1]).trim();
113
+ const reverseOrder = html.match(/<meta[^>]+content=["']([\s\S]*?)["'][^>]+name=["']description["'][^>]*>/i);
114
+ if (reverseOrder?.[1])
115
+ return decodeHtml(reverseOrder[1]).trim();
116
+ return "";
117
+ }
118
+ export function inferTarget(url, target) {
119
+ if (target !== "auto")
120
+ return target;
121
+ try {
122
+ const parsed = new URL(url);
123
+ const host = parsed.hostname.toLowerCase();
124
+ const path = parsed.pathname;
125
+ if (host.endsWith("reddit.com") && path.includes("/comments/"))
126
+ return "reddit_post";
127
+ if (host === "x.com" || host.endsWith("x.com") || host.endsWith("twitter.com"))
128
+ return "x_post";
129
+ if (host.endsWith("dcinside.com") && path.includes("/board/"))
130
+ return "dcinside_post";
131
+ }
132
+ catch {
133
+ // ignore invalid URL here; downstream fetch will surface a better error
134
+ }
135
+ return "generic";
136
+ }
137
+ function isBlockedIpAddress(address) {
138
+ const family = isIP(address);
139
+ if (family === 4)
140
+ return blockedAddressRanges.check(address, "ipv4");
141
+ if (family === 6)
142
+ return blockedAddressRanges.check(address, "ipv6");
143
+ return false;
144
+ }
145
+ function isBlockedHostname(hostname) {
146
+ const normalized = hostname.toLowerCase();
147
+ return normalized === "localhost" || normalized.endsWith(".localhost");
148
+ }
149
+ function truthyEnv(value) {
150
+ return /^(1|true|yes|on)$/i.test(String(value || "").trim());
151
+ }
152
+ function falsyEnv(value) {
153
+ return /^(0|false|no|off)$/i.test(String(value || "").trim());
154
+ }
155
+ export function envFlag(name) {
156
+ return truthyEnv(process.env[name]);
157
+ }
158
+ export function envEnabled(name, defaultValue) {
159
+ const value = process.env[name];
160
+ if (value === undefined || String(value).trim() === "")
161
+ return defaultValue;
162
+ if (truthyEnv(value))
163
+ return true;
164
+ if (falsyEnv(value))
165
+ return false;
166
+ return defaultValue;
167
+ }
168
+ export async function validateOutboundUrl(url, options) {
169
+ try {
170
+ const parsed = new URL(url);
171
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
172
+ return { ok: false, reason: "unsupported_scheme", message: "Only http and https URLs are allowed" };
173
+ }
174
+ if (parsed.username || parsed.password) {
175
+ return { ok: false, reason: "embedded_credentials", message: "URLs with embedded credentials are not allowed" };
176
+ }
177
+ if (options?.allowPrivateHosts) {
178
+ return { ok: true };
179
+ }
180
+ const hostname = parsed.hostname;
181
+ if (isBlockedHostname(hostname)) {
182
+ return { ok: false, reason: "private_hostname", message: `Blocked private hostname: ${hostname}` };
183
+ }
184
+ if (isBlockedIpAddress(hostname)) {
185
+ return { ok: false, reason: "private_ip", message: `Blocked private IP address: ${hostname}` };
186
+ }
187
+ try {
188
+ const records = await lookup(hostname, { all: true, verbatim: true });
189
+ if (records.some((record) => isBlockedIpAddress(record.address))) {
190
+ return {
191
+ ok: false,
192
+ reason: "private_resolution",
193
+ message: `Blocked hostname resolving to a private or reserved address: ${hostname}`,
194
+ };
195
+ }
196
+ }
197
+ catch {
198
+ // Let fetch surface the eventual resolution error.
199
+ }
200
+ return { ok: true };
201
+ }
202
+ catch {
203
+ return { ok: false, reason: "invalid_url", message: "URL is invalid" };
204
+ }
205
+ }
206
+ export function isXUrl(url) {
207
+ try {
208
+ const host = new URL(url).hostname.toLowerCase();
209
+ return host === "x.com" || host.endsWith("x.com") || host.endsWith("twitter.com") || host.endsWith("fxtwitter.com") || host.endsWith("fixupx.com");
210
+ }
211
+ catch {
212
+ return false;
213
+ }
214
+ }
215
+ export function isRedditUrl(url) {
216
+ try {
217
+ const host = new URL(url).hostname.toLowerCase();
218
+ return host === "reddit.com" || host.endsWith("reddit.com") || host === "redd.it";
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ }
224
+ export function isDcinsideUrl(url) {
225
+ try {
226
+ return new URL(url).hostname.toLowerCase().endsWith("dcinside.com");
227
+ }
228
+ catch {
229
+ return false;
230
+ }
231
+ }
232
+ export function needsDynamicCrawl(result) {
233
+ if (!result.ok)
234
+ return true;
235
+ const text = stripTags(result.content);
236
+ const rawLength = result.content.length;
237
+ const textLength = text.length;
238
+ if (rawLength > 500 && textLength < 200)
239
+ return true;
240
+ const lower = text.toLowerCase();
241
+ const blocked = [
242
+ "access denied",
243
+ "please enable javascript",
244
+ "enable cookies",
245
+ "checking your browser",
246
+ "just a moment",
247
+ "attention required",
248
+ "bot protection",
249
+ "javascript is not available",
250
+ "something went wrong",
251
+ ];
252
+ return blocked.some((item) => lower.includes(item));
253
+ }
254
+ export async function fetchText(url, timeoutMs, init) {
255
+ const controller = new AbortController();
256
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
257
+ try {
258
+ const response = await fetch(url, { ...init, signal: controller.signal });
259
+ const text = await response.text();
260
+ return { ok: response.ok, status: response.status, text };
261
+ }
262
+ catch (error) {
263
+ const message = error instanceof Error ? error.message : String(error);
264
+ return { ok: false, status: 0, text: "", error: message };
265
+ }
266
+ finally {
267
+ clearTimeout(timer);
268
+ }
269
+ }
270
+ export async function fetchJson(url, timeoutMs, init) {
271
+ const result = await fetchText(url, timeoutMs, init);
272
+ if (!result.ok) {
273
+ return { ...result, data: null };
274
+ }
275
+ try {
276
+ return { ...result, data: result.text ? JSON.parse(result.text) : null };
277
+ }
278
+ catch (error) {
279
+ const message = error instanceof Error ? error.message : String(error);
280
+ return { ok: false, status: result.status, text: result.text, error: message, data: null };
281
+ }
282
+ }
283
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { SmartfetchOutput, SmartfetchRenderFormat, Target } from "./shared.js";
2
+ export type SmartfetchOptions = {
3
+ url: string;
4
+ target?: Target;
5
+ timeoutMs?: number;
6
+ forceDynamic?: boolean;
7
+ strictSchema?: boolean;
8
+ };
9
+ export declare function runSmartfetch(options: SmartfetchOptions): Promise<SmartfetchOutput>;
10
+ export declare function renderSmartfetch(output: SmartfetchOutput, format: SmartfetchRenderFormat): string;
11
+ export declare function renderSmartfetchUrl(url: string, format: SmartfetchRenderFormat, timeoutMs: number): Promise<string>;