@tianshu-ai/tianshu 0.4.19 → 0.4.21

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.
Files changed (35) hide show
  1. package/package.json +1 -1
  2. package/packages/server/builtinConfig/plugins/web-search/manifest.json +52 -17
  3. package/packages/server/builtinConfig/plugins/web-search/skills/web-search-howto.md +36 -15
  4. package/packages/web/dist/assets/{bundle-web-CL_xD3_1.js → bundle-web-hHh7gz2L.js} +1 -1
  5. package/packages/web/dist/assets/{index-CmlY5kSR.js → index-B6oq6ed_.js} +4 -4
  6. package/packages/web/dist/assets/index-DWOCI_kD.css +2 -0
  7. package/packages/web/dist/index.html +2 -2
  8. package/plugins/web-search/dist/server.d.ts.map +1 -1
  9. package/plugins/web-search/dist/server.js +34 -12
  10. package/plugins/web-search/dist/server.js.map +1 -1
  11. package/plugins/web-search/dist/tools/health.d.ts +2 -1
  12. package/plugins/web-search/dist/tools/health.d.ts.map +1 -1
  13. package/plugins/web-search/dist/tools/health.js.map +1 -1
  14. package/plugins/web-search/dist/tools/index.d.ts +3 -2
  15. package/plugins/web-search/dist/tools/index.d.ts.map +1 -1
  16. package/plugins/web-search/dist/tools/index.js +2 -1
  17. package/plugins/web-search/dist/tools/index.js.map +1 -1
  18. package/plugins/web-search/dist/tools/providers.d.ts +11 -4
  19. package/plugins/web-search/dist/tools/providers.d.ts.map +1 -1
  20. package/plugins/web-search/dist/tools/providers.js +279 -0
  21. package/plugins/web-search/dist/tools/providers.js.map +1 -1
  22. package/plugins/web-search/dist/tools/web-fetch.d.ts +9 -0
  23. package/plugins/web-search/dist/tools/web-fetch.d.ts.map +1 -0
  24. package/plugins/web-search/dist/tools/web-fetch.js +258 -0
  25. package/plugins/web-search/dist/tools/web-fetch.js.map +1 -0
  26. package/plugins/web-search/dist/tools/web-search.d.ts +20 -1
  27. package/plugins/web-search/dist/tools/web-search.d.ts.map +1 -1
  28. package/plugins/web-search/dist/tools/web-search.js +92 -39
  29. package/plugins/web-search/dist/tools/web-search.js.map +1 -1
  30. package/plugins/web-search/manifest.json +52 -17
  31. package/plugins/web-search/package.json +2 -2
  32. package/plugins/web-search/skills/web-search-howto.md +36 -15
  33. package/plugins/workboard/dist/client.js +2 -2
  34. package/plugins/workboard/dist/client.js.map +1 -1
  35. package/packages/web/dist/assets/index-CsPw69WQ.css +0 -2
@@ -125,6 +125,285 @@ export const braveProvider = {
125
125
  }
126
126
  },
127
127
  };
128
+ // ─── hosted MCP provider (Parallel / Exa free endpoints) ───────
129
+ //
130
+ // Key-free web search. Both Parallel and Exa expose a hosted MCP
131
+ // endpoint that answers anonymous JSON-RPC `tools/call` requests
132
+ // (a free tier). If the operator supplies an EXA/PARALLEL key we
133
+ // attach it, but the whole point of this provider is that it
134
+ // works with none. Same approach OpenCode uses.
135
+ //
136
+ // `key` here is NOT an API key — it's a JSON blob the tool packs
137
+ // with the chosen backend + optional key: {"backend":"exa"|
138
+ // "parallel", "apiKey":"..."}. The tool builds it; callers never
139
+ // see it.
140
+ export const PARALLEL_MCP_URL = "https://search.parallel.ai/mcp";
141
+ export const EXA_MCP_URL = "https://mcp.exa.ai/mcp";
142
+ function parseHostedKey(key) {
143
+ try {
144
+ const j = JSON.parse(key);
145
+ return {
146
+ backend: j.backend === "parallel" ? "parallel" : "exa",
147
+ apiKey: typeof j.apiKey === "string" && j.apiKey ? j.apiKey : undefined,
148
+ };
149
+ }
150
+ catch {
151
+ return { backend: "exa" };
152
+ }
153
+ }
154
+ export const hostedProvider = {
155
+ name: "hosted",
156
+ async search(query, key, opts) {
157
+ const { backend, apiKey } = parseHostedKey(key);
158
+ const url = backend === "parallel"
159
+ ? PARALLEL_MCP_URL
160
+ : apiKey
161
+ ? `${EXA_MCP_URL}?exaApiKey=${encodeURIComponent(apiKey)}`
162
+ : EXA_MCP_URL;
163
+ // MCP tool + args differ per backend.
164
+ const toolName = backend === "parallel" ? "web_search" : "web_search_exa";
165
+ const toolArgs = backend === "parallel"
166
+ ? {
167
+ objective: query,
168
+ search_queries: [query],
169
+ }
170
+ : {
171
+ query,
172
+ numResults: clamp(opts.count, 1, 20),
173
+ type: "auto",
174
+ };
175
+ const headers = {
176
+ "content-type": "application/json",
177
+ accept: "application/json, text/event-stream",
178
+ "user-agent": "tianshu-web-search/0.2",
179
+ };
180
+ if (backend === "parallel" && apiKey) {
181
+ headers.authorization = `Bearer ${apiKey}`;
182
+ }
183
+ const rpc = {
184
+ jsonrpc: "2.0",
185
+ id: 1,
186
+ method: "tools/call",
187
+ params: { name: toolName, arguments: toolArgs },
188
+ };
189
+ try {
190
+ const ctl = new AbortController();
191
+ const timer = setTimeout(() => ctl.abort(), opts.timeoutMs);
192
+ const res = await fetch(url, {
193
+ method: "POST",
194
+ headers,
195
+ body: JSON.stringify(rpc),
196
+ signal: ctl.signal,
197
+ }).finally(() => clearTimeout(timer));
198
+ if (!res.ok) {
199
+ return {
200
+ error: {
201
+ provider: "hosted",
202
+ status: res.status,
203
+ message: `${backend}: ${await safeText(res)}`,
204
+ },
205
+ };
206
+ }
207
+ const raw = await res.text();
208
+ const text = extractMcpText(raw);
209
+ if (text === null) {
210
+ return {
211
+ error: {
212
+ provider: "hosted",
213
+ status: 0,
214
+ message: `${backend}: could not parse MCP response`,
215
+ },
216
+ };
217
+ }
218
+ // Exa returns a plain-text block (Title:/URL:/Published:/
219
+ // Highlights:, results split by `---`). Parallel returns
220
+ // JSON (array or {results:[...]}). Parse per backend, with a
221
+ // cross-fallback so a format change on either side degrades
222
+ // gracefully instead of returning nothing.
223
+ const results = (backend === "exa" ? parseExaText(text) : parseHostedResults(text));
224
+ const final = (results.length > 0
225
+ ? results
226
+ : backend === "exa"
227
+ ? parseHostedResults(text)
228
+ : parseExaText(text)).slice(0, clamp(opts.count, 1, 20));
229
+ return { results: final };
230
+ }
231
+ catch (err) {
232
+ return {
233
+ error: {
234
+ provider: "hosted",
235
+ status: 0,
236
+ message: `${backend}: ${err instanceof Error ? err.message : String(err)}`,
237
+ },
238
+ };
239
+ }
240
+ },
241
+ };
242
+ /** MCP endpoints answer either as plain JSON or as an SSE stream
243
+ * (`data: {...}` lines). Pull the inner `result.content[].text`
244
+ * payload out of whichever we got. Returns null if nothing
245
+ * usable is found. */
246
+ function extractMcpText(body) {
247
+ const tryOne = (s) => {
248
+ try {
249
+ const j = JSON.parse(s);
250
+ const item = j.result?.content?.find((c) => typeof c.text === "string");
251
+ return item?.text ?? null;
252
+ }
253
+ catch {
254
+ return null;
255
+ }
256
+ };
257
+ const trimmed = body.trim();
258
+ const direct = trimmed ? tryOne(trimmed) : null;
259
+ if (direct !== null)
260
+ return direct;
261
+ // SSE: scan `data:` lines.
262
+ for (const line of trimmed.split(/\r?\n/)) {
263
+ if (line.startsWith("data:")) {
264
+ const got = tryOne(line.slice(5).trim());
265
+ if (got !== null)
266
+ return got;
267
+ }
268
+ }
269
+ return null;
270
+ }
271
+ /** The MCP `text` payload is itself JSON (or JSON-ish) describing
272
+ * results. Both Exa and Parallel return an array of
273
+ * `{title,url,text/snippet,publishedDate}`-ish objects, sometimes
274
+ * wrapped in `{ results: [...] }`. Be liberal. */
275
+ function parseHostedResults(text) {
276
+ let data;
277
+ try {
278
+ data = JSON.parse(text);
279
+ }
280
+ catch {
281
+ // Non-JSON payload: hand it back as a single synthetic result
282
+ // so the agent at least sees the content.
283
+ const t = text.trim();
284
+ return t ? [{ title: "result", url: "", content: t.slice(0, 2000) }] : [];
285
+ }
286
+ const arr = Array.isArray(data)
287
+ ? data
288
+ : Array.isArray(data?.results)
289
+ ? data.results
290
+ : [];
291
+ return arr.map((raw) => {
292
+ const r = (raw ?? {});
293
+ const str = (...keys) => {
294
+ for (const k of keys) {
295
+ if (typeof r[k] === "string" && r[k])
296
+ return r[k];
297
+ }
298
+ return "";
299
+ };
300
+ return {
301
+ title: str("title", "name"),
302
+ url: str("url", "link"),
303
+ content: str("text", "snippet", "content", "summary").slice(0, 1000),
304
+ publishedDate: str("publishedDate", "published_date", "date") || null,
305
+ };
306
+ });
307
+ }
308
+ /** Parse Exa's plain-text MCP payload into results. Each block is
309
+ * separated by a line containing only `---`, and carries
310
+ * `Title:`, `URL:`, `Published:`, and `Highlights:` labels. */
311
+ function parseExaText(text) {
312
+ const blocks = text
313
+ .split(/\n\s*---\s*\n/)
314
+ .map((b) => b.trim())
315
+ .filter(Boolean);
316
+ const out = [];
317
+ for (const block of blocks) {
318
+ const title = block.match(/^\s*Title:\s*(.+)$/im)?.[1]?.trim() ?? "";
319
+ const url = block.match(/^\s*URL:\s*(\S+)/im)?.[1]?.trim() ?? "";
320
+ const published = block.match(/^\s*Published:\s*(.+)$/im)?.[1]?.trim();
321
+ // Highlights are everything after the `Highlights:` label.
322
+ const hi = block.split(/^\s*Highlights:\s*$/im)[1] ?? "";
323
+ const content = hi
324
+ .replace(/\n\.\.\.\n/g, " ")
325
+ .replace(/\s+/g, " ")
326
+ .trim()
327
+ .slice(0, 1000);
328
+ if (!title && !url)
329
+ continue;
330
+ out.push({
331
+ title: title || url,
332
+ url,
333
+ content,
334
+ publishedDate: published && published !== "N/A" ? published : null,
335
+ });
336
+ }
337
+ return out;
338
+ }
339
+ // ─── SearXNG provider (self-hosted meta-search) ────────────────
340
+ //
341
+ // `key` is the operator's SearXNG base URL (e.g.
342
+ // "http://localhost:8080" or "https://searx.example.com"). We hit
343
+ // its JSON API (`/search?format=json`). No API key; the endpoint
344
+ // is the credential.
345
+ export const searxngProvider = {
346
+ name: "searxng",
347
+ async search(query, key, opts) {
348
+ const base = key.replace(/\/+$/, "");
349
+ if (!base) {
350
+ return {
351
+ error: {
352
+ provider: "searxng",
353
+ status: 0,
354
+ message: "no SearXNG base URL configured",
355
+ },
356
+ };
357
+ }
358
+ const params = new URLSearchParams({
359
+ q: query,
360
+ format: "json",
361
+ safesearch: "0",
362
+ });
363
+ if (opts.language)
364
+ params.set("language", opts.language.slice(0, 5));
365
+ if (opts.freshness) {
366
+ // SearXNG time_range accepts day/week/month/year directly.
367
+ params.set("time_range", opts.freshness);
368
+ }
369
+ try {
370
+ const ctl = new AbortController();
371
+ const timer = setTimeout(() => ctl.abort(), opts.timeoutMs);
372
+ const res = await fetch(`${base}/search?${params.toString()}`, {
373
+ headers: { accept: "application/json" },
374
+ signal: ctl.signal,
375
+ }).finally(() => clearTimeout(timer));
376
+ if (!res.ok) {
377
+ return {
378
+ error: {
379
+ provider: "searxng",
380
+ status: res.status,
381
+ message: await safeText(res),
382
+ },
383
+ };
384
+ }
385
+ const json = (await res.json());
386
+ const results = (json.results ?? [])
387
+ .slice(0, clamp(opts.count, 1, 20))
388
+ .map((r) => ({
389
+ title: typeof r.title === "string" ? r.title : "",
390
+ url: typeof r.url === "string" ? r.url : "",
391
+ content: typeof r.content === "string" ? r.content : "",
392
+ publishedDate: r.publishedDate ?? null,
393
+ }));
394
+ return { results };
395
+ }
396
+ catch (err) {
397
+ return {
398
+ error: {
399
+ provider: "searxng",
400
+ status: 0,
401
+ message: err instanceof Error ? err.message : String(err),
402
+ },
403
+ };
404
+ }
405
+ },
406
+ };
128
407
  function clamp(n, lo, hi) {
129
408
  return Math.max(lo, Math.min(hi, Math.floor(n)));
130
409
  }
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/tools/providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/tools/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AgentTool } from "@tianshu-ai/plugin-sdk";
2
+ export interface WebFetchConfig {
3
+ /** Per-request timeout (ms). Falls back to 8000. */
4
+ timeoutMs?: number;
5
+ /** Hard cap on returned characters. Falls back to 20000. */
6
+ maxCharsDefault?: number;
7
+ }
8
+ export declare function buildWebFetchTool(cfg: WebFetchConfig): AgentTool;
9
+ //# sourceMappingURL=web-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,SAAS,CAiIhE"}
@@ -0,0 +1,258 @@
1
+ // `web_fetch(url, extractMode?, maxChars?)`.
2
+ //
3
+ // A plain HTTP GET that extracts readable content and returns it
4
+ // as markdown or text. No JavaScript execution, no API key, no
5
+ // external service — this is the "grab a single page" capability
6
+ // that pairs with web_search. For JS-heavy or login-gated pages
7
+ // the agent should use the browser tool instead.
8
+ //
9
+ // Dependency-free on purpose: the plugin ships without turndown /
10
+ // readability so it stays a tiny self-contained builtin. The
11
+ // extractor below is a pragmatic tag-stripper, not a full DOM
12
+ // parser — good enough for article bodies, docs, and JSON/text
13
+ // endpoints.
14
+ //
15
+ // SSRF: we block private / loopback / link-local / metadata hosts
16
+ // before fetching AND re-check after redirects, so an agent can't
17
+ // be steered into probing the internal network.
18
+ import { Type } from "typebox";
19
+ export function buildWebFetchTool(cfg) {
20
+ const timeoutMs = cfg.timeoutMs ?? 8000;
21
+ const maxCharsDefault = cfg.maxCharsDefault ?? 20000;
22
+ return {
23
+ schema: {
24
+ name: "web_fetch",
25
+ description: "Fetch a single URL over HTTP(S) and return its readable " +
26
+ "content as markdown or text. No JavaScript is executed, so " +
27
+ "for JS-heavy or login-gated pages use the browser tool " +
28
+ "instead. Blocks private/internal hosts. Use this to read a " +
29
+ "specific page you already have the URL for (e.g. a search " +
30
+ "result). Returns extracted body text, not raw HTML.",
31
+ parameters: Type.Object({
32
+ url: Type.String({
33
+ description: "The http(s) URL to fetch.",
34
+ }),
35
+ extractMode: Type.Optional(Type.Union([Type.Literal("markdown"), Type.Literal("text")], {
36
+ description: "Output format after content extraction. Default \"markdown\".",
37
+ })),
38
+ maxChars: Type.Optional(Type.Number({
39
+ description: "Truncate output to this many characters. Default 20000.",
40
+ minimum: 100,
41
+ maximum: 200000,
42
+ })),
43
+ }),
44
+ },
45
+ async execute(rawArgs, _ctx) {
46
+ const args = rawArgs;
47
+ const url = typeof args.url === "string" ? args.url.trim() : "";
48
+ if (!url)
49
+ return { ok: false, text: "url is required" };
50
+ if (!/^https?:\/\//i.test(url)) {
51
+ return { ok: false, text: "url must start with http:// or https://" };
52
+ }
53
+ const guard = await blockedHost(url);
54
+ if (guard) {
55
+ return { ok: false, text: `blocked: ${guard}` };
56
+ }
57
+ const cap = typeof args.maxChars === "number" ? args.maxChars : maxCharsDefault;
58
+ const mode = args.extractMode === "text" ? "text" : "markdown";
59
+ try {
60
+ const ctl = new AbortController();
61
+ const timer = setTimeout(() => ctl.abort(), timeoutMs);
62
+ const res = await fetch(url, {
63
+ redirect: "manual",
64
+ headers: {
65
+ // Chrome-like UA + language so sites don't serve a
66
+ // bot-blocked or empty variant.
67
+ "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " +
68
+ "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
69
+ "accept-language": "en,zh-CN;q=0.8",
70
+ accept: "text/html,application/xhtml+xml,application/json;q=0.9,*/*;q=0.8",
71
+ },
72
+ signal: ctl.signal,
73
+ }).finally(() => clearTimeout(timer));
74
+ // Follow one redirect manually so we can re-run the SSRF
75
+ // guard on the target (auto-follow would skip the check).
76
+ if (res.status >= 300 && res.status < 400) {
77
+ const loc = res.headers.get("location");
78
+ if (!loc) {
79
+ return { ok: false, text: `redirect with no Location (${res.status})` };
80
+ }
81
+ const next = new URL(loc, url).toString();
82
+ const g2 = await blockedHost(next);
83
+ if (g2)
84
+ return { ok: false, text: `blocked after redirect: ${g2}` };
85
+ return await this.execute({ url: next, extractMode: mode, maxChars: cap }, _ctx);
86
+ }
87
+ if (!res.ok) {
88
+ return {
89
+ ok: false,
90
+ text: `HTTP ${res.status} fetching ${url}`,
91
+ };
92
+ }
93
+ const ctype = res.headers.get("content-type") ?? "";
94
+ const body = await res.text();
95
+ let out;
96
+ if (ctype.includes("application/json")) {
97
+ out = body;
98
+ }
99
+ else if (ctype.includes("text/html") || /<html[\s>]/i.test(body)) {
100
+ out = mode === "text" ? htmlToText(body) : htmlToMarkdown(body);
101
+ }
102
+ else {
103
+ // Plain text, markdown, csv, etc. — return as-is.
104
+ out = body;
105
+ }
106
+ const truncated = out.length > cap;
107
+ const text = truncated ? out.slice(0, cap) : out;
108
+ return {
109
+ ok: true,
110
+ text,
111
+ data: {
112
+ url,
113
+ contentType: ctype,
114
+ chars: text.length,
115
+ truncated,
116
+ },
117
+ };
118
+ }
119
+ catch (err) {
120
+ return {
121
+ ok: false,
122
+ text: `fetch failed: ${err instanceof Error ? err.message : String(err)}`,
123
+ };
124
+ }
125
+ },
126
+ };
127
+ }
128
+ // ─── SSRF guard ────────────────────────────────────────────────
129
+ /** Returns a reason string when the URL's host is disallowed, or
130
+ * null when it's safe to fetch. Blocks loopback, private, CGN,
131
+ * link-local, ULA, and cloud metadata addresses by literal match;
132
+ * we don't resolve DNS here (the host's guarded fetch layer does
133
+ * deeper checks), this is a cheap first line of defence. */
134
+ async function blockedHost(rawUrl) {
135
+ let host;
136
+ try {
137
+ host = new URL(rawUrl).hostname.toLowerCase();
138
+ }
139
+ catch {
140
+ return "invalid URL";
141
+ }
142
+ if (host === "localhost" || host.endsWith(".localhost")) {
143
+ return "localhost is not allowed";
144
+ }
145
+ // IPv6 literal in brackets is stripped by URL().hostname already.
146
+ if (host === "::1" || host === "0.0.0.0")
147
+ return "loopback is not allowed";
148
+ // Cloud metadata.
149
+ if (host === "169.254.169.254" || host === "metadata.google.internal") {
150
+ return "metadata endpoint is not allowed";
151
+ }
152
+ // IPv4 literal → range check.
153
+ const m = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
154
+ if (m) {
155
+ const [a, b] = [Number(m[1]), Number(m[2])];
156
+ if (a === 127)
157
+ return "loopback range is not allowed";
158
+ if (a === 10)
159
+ return "private range 10/8 is not allowed";
160
+ if (a === 172 && b >= 16 && b <= 31)
161
+ return "private range 172.16/12 is not allowed";
162
+ if (a === 192 && b === 168)
163
+ return "private range 192.168/16 is not allowed";
164
+ if (a === 169 && b === 254)
165
+ return "link-local range is not allowed";
166
+ if (a === 100 && b >= 64 && b <= 127)
167
+ return "carrier-grade NAT range is not allowed";
168
+ if (a === 0)
169
+ return "reserved range is not allowed";
170
+ }
171
+ // IPv6 private / link-local literals.
172
+ if (host.startsWith("fe80:") || host.startsWith("fc") || host.startsWith("fd")) {
173
+ return "IPv6 private/link-local range is not allowed";
174
+ }
175
+ return null;
176
+ }
177
+ // ─── HTML extraction (dependency-free) ─────────────────────────
178
+ /** Strip an HTML document down to its main textual content and
179
+ * convert the structural tags we care about to markdown. This is
180
+ * deliberately simple: remove noise elements, unwrap the rest,
181
+ * map headings/links/lists/code to markdown, collapse whitespace. */
182
+ function htmlToMarkdown(html) {
183
+ let s = stripNoise(html);
184
+ // Headings.
185
+ s = s.replace(/<h([1-6])[^>]*>([\s\S]*?)<\/h\1>/gi, (_m, lvl, inner) => {
186
+ const hashes = "#".repeat(Number(lvl));
187
+ return `\n\n${hashes} ${collapse(stripTags(inner))}\n\n`;
188
+ });
189
+ // Links → [text](href).
190
+ s = s.replace(/<a\b[^>]*href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi, (_m, href, inner) => {
191
+ const text = collapse(stripTags(inner));
192
+ return text ? `[${text}](${href})` : href;
193
+ });
194
+ // Bold / strong, italic / em.
195
+ s = s.replace(/<(strong|b)\b[^>]*>([\s\S]*?)<\/\1>/gi, (_m, _t, i) => `**${collapse(stripTags(i))}**`);
196
+ s = s.replace(/<(em|i)\b[^>]*>([\s\S]*?)<\/\1>/gi, (_m, _t, i) => `*${collapse(stripTags(i))}*`);
197
+ // Inline code + code blocks.
198
+ s = s.replace(/<pre\b[^>]*>([\s\S]*?)<\/pre>/gi, (_m, inner) => `\n\n\`\`\`\n${decode(stripTags(inner))}\n\`\`\`\n\n`);
199
+ s = s.replace(/<code\b[^>]*>([\s\S]*?)<\/code>/gi, (_m, inner) => `\`${collapse(stripTags(inner))}\``);
200
+ // List items.
201
+ s = s.replace(/<li\b[^>]*>([\s\S]*?)<\/li>/gi, (_m, inner) => `\n- ${collapse(stripTags(inner))}`);
202
+ // Paragraphs / breaks / block boundaries.
203
+ s = s.replace(/<\/(p|div|section|article|ul|ol|table|tr|h[1-6])>/gi, "\n\n");
204
+ s = s.replace(/<br\s*\/?>(\s*)/gi, "\n");
205
+ // Everything else: drop tags, decode entities, tidy whitespace.
206
+ s = stripTags(s);
207
+ s = decode(s);
208
+ return tidy(s);
209
+ }
210
+ function htmlToText(html) {
211
+ const s = decode(stripTags(stripNoise(html)));
212
+ return tidy(s);
213
+ }
214
+ /** Remove script/style/nav/header/footer/svg/noscript blocks and
215
+ * HTML comments outright — they're noise for text extraction. */
216
+ function stripNoise(html) {
217
+ return html
218
+ .replace(/<!--[\s\S]*?-->/g, "")
219
+ .replace(/<(script|style|noscript|svg|template)\b[^>]*>[\s\S]*?<\/\1>/gi, "")
220
+ .replace(/<(nav|header|footer|aside)\b[^>]*>[\s\S]*?<\/\1>/gi, "");
221
+ }
222
+ function stripTags(s) {
223
+ return s.replace(/<[^>]+>/g, "");
224
+ }
225
+ /** Decode the handful of HTML entities that actually show up in
226
+ * body text. Numeric entities handled generically. */
227
+ function decode(s) {
228
+ return s
229
+ .replace(/&nbsp;/g, " ")
230
+ .replace(/&amp;/g, "&")
231
+ .replace(/&lt;/g, "<")
232
+ .replace(/&gt;/g, ">")
233
+ .replace(/&quot;/g, '"')
234
+ .replace(/&#39;|&apos;/g, "'")
235
+ .replace(/&#(\d+);/g, (_m, n) => {
236
+ const code = Number(n);
237
+ return Number.isFinite(code) ? String.fromCodePoint(code) : _m;
238
+ })
239
+ .replace(/&#x([0-9a-f]+);/gi, (_m, h) => {
240
+ const code = parseInt(h, 16);
241
+ return Number.isFinite(code) ? String.fromCodePoint(code) : _m;
242
+ });
243
+ }
244
+ /** Collapse internal whitespace in an inline fragment. */
245
+ function collapse(s) {
246
+ return s.replace(/\s+/g, " ").trim();
247
+ }
248
+ /** Final document tidy: trim lines, collapse >2 blank lines. */
249
+ function tidy(s) {
250
+ return s
251
+ .split(/\r?\n/)
252
+ .map((l) => l.replace(/[ \t]+$/g, "").replace(/^[ \t]+/g, (m) => m))
253
+ .join("\n")
254
+ .replace(/\n{3,}/g, "\n\n")
255
+ .replace(/[ \t]{2,}/g, " ")
256
+ .trim();
257
+ }
258
+ //# sourceMappingURL=web-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  import type { AgentTool } from "@tianshu-ai/plugin-sdk";
2
2
  import { ProviderHealth } from "./health.js";
3
+ /** Which search scheme the operator picked. The plugin supports
4
+ * two key-free schemes (hosted MCP + self-hosted SearXNG) and two
5
+ * key-based ones (Tavily + Brave) kept from the original plugin. */
6
+ export type SearchScheme = "hosted" | "searxng" | "tavily" | "brave";
3
7
  export interface WebSearchPluginConfig {
8
+ /** Operator's chosen scheme. Defaults to "hosted" (key-free). */
9
+ scheme?: SearchScheme;
10
+ /** Backend for the hosted MCP scheme. */
11
+ hostedBackend?: "exa" | "parallel";
12
+ /** Optional key for the hosted backend (higher limits; not
13
+ * required — the free tier works anonymously). */
14
+ exaApiKey?: string;
15
+ parallelApiKey?: string;
16
+ /** Base URL of a self-hosted SearXNG instance. */
17
+ searxngBaseUrl?: string;
4
18
  tavilyApiKey?: string;
5
19
  braveApiKey?: string;
6
- preferredProvider?: "tavily" | "brave";
7
20
  /** Optional default timeout override (ms). 8000 if unset. */
8
21
  timeoutMs?: number;
9
22
  }
@@ -12,4 +25,10 @@ export declare function buildWebSearchTool(cfg: WebSearchPluginConfig, health: P
12
25
  * shape this plugin actually uses. Plugin's `activate()` calls
13
26
  * this once at startup. */
14
27
  export declare function readWebSearchConfig(raw: unknown): WebSearchPluginConfig;
28
+ /** Resolve the effective scheme. Explicit `scheme` wins; otherwise
29
+ * infer from what's configured, preferring the key-free hosted
30
+ * scheme so a fresh install works out of the box. */
31
+ export declare function effectiveScheme(cfg: WebSearchPluginConfig): SearchScheme;
32
+ /** True when the effective scheme has everything it needs to run. */
33
+ export declare function isConfigured(cfg: WebSearchPluginConfig): boolean;
15
34
  //# sourceMappingURL=web-search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AAQ1E,OAAO,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACvC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,qBAAqB,EAC1B,MAAM,EAAE,cAAc,GACrB,SAAS,CA0KX;AAED;;4BAE4B;AAC5B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,CAqBvE"}
1
+ {"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AAW1E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;qEAEqE;AACrE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,yCAAyC;IACzC,aAAa,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IACnC;uDACmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,qBAAqB,EAC1B,MAAM,EAAE,cAAc,GACrB,SAAS,CAqLX;AAED;;4BAE4B;AAC5B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,CA4BvE;AAED;;sDAEsD;AACtD,wBAAgB,eAAe,CAAC,GAAG,EAAE,qBAAqB,GAAG,YAAY,CAMxE;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAWhE"}