indusagi-coding-agent 0.1.21 → 0.1.22
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/CHANGELOG.md +14 -0
- package/README.md +48 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +12 -10
- package/dist/cli/args.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/tools/index.d.ts +18 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +23 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/webfetch.d.ts +59 -0
- package/dist/core/tools/webfetch.d.ts.map +1 -0
- package/dist/core/tools/webfetch.js +265 -0
- package/dist/core/tools/webfetch.js.map +1 -0
- package/dist/core/tools/websearch.d.ts +63 -0
- package/dist/core/tools/websearch.d.ts.map +1 -0
- package/dist/core/tools/websearch.js +140 -0
- package/dist/core/tools/websearch.js.map +1 -0
- package/docs/README.md +79 -0
- package/docs/extensions.md +1 -1
- package/docs/hooks.md +378 -0
- package/docs/sdk.md +12 -0
- package/docs/subagents.md +225 -0
- package/docs/web-tools.md +304 -0
- package/package.json +2 -2
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Fetch Tool
|
|
3
|
+
*
|
|
4
|
+
* Fetches content from a specified URL.
|
|
5
|
+
* Supports text, markdown, and HTML format options.
|
|
6
|
+
*/
|
|
7
|
+
import { Type } from "@sinclair/typebox";
|
|
8
|
+
const MAX_RESPONSE_SIZE = 5 * 1024 * 1024; // 5MB
|
|
9
|
+
const DEFAULT_TIMEOUT = 30 * 1000; // 30 seconds
|
|
10
|
+
const MAX_TIMEOUT = 120 * 1000; // 2 minutes
|
|
11
|
+
const webFetchSchema = Type.Object({
|
|
12
|
+
url: Type.String({ description: "The URL to fetch content from (must start with http:// or https://)" }),
|
|
13
|
+
format: Type.Optional(Type.Union([
|
|
14
|
+
Type.Literal("text"),
|
|
15
|
+
Type.Literal("markdown"),
|
|
16
|
+
Type.Literal("html"),
|
|
17
|
+
], {
|
|
18
|
+
description: "The format to return the content in (text, markdown, or html). Defaults to markdown.",
|
|
19
|
+
})),
|
|
20
|
+
timeout: Type.Optional(Type.Number({ description: "Optional timeout in seconds (max 120). Default: 30" })),
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Simple HTML to text converter - strips HTML tags
|
|
24
|
+
*/
|
|
25
|
+
async function htmlToTextSimple(html) {
|
|
26
|
+
// Remove script and style elements
|
|
27
|
+
let text = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
|
|
28
|
+
text = text.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, "");
|
|
29
|
+
text = text.replace(/<noscript\b[^<]*(?:(?!<\/noscript>)<[^<]*)*<\/noscript>/gi, "");
|
|
30
|
+
// Decode HTML entities
|
|
31
|
+
text = text.replace(/&/g, "&");
|
|
32
|
+
text = text.replace(/</g, "<");
|
|
33
|
+
text = text.replace(/>/g, ">");
|
|
34
|
+
text = text.replace(/"/g, '"');
|
|
35
|
+
text = text.replace(/'/g, "'");
|
|
36
|
+
text = text.replace(/ /g, " ");
|
|
37
|
+
// Remove all remaining HTML tags
|
|
38
|
+
text = text.replace(/<[^>]+>/g, " ");
|
|
39
|
+
// Normalize whitespace
|
|
40
|
+
text = text.replace(/\s+/g, " ");
|
|
41
|
+
text = text.trim();
|
|
42
|
+
return text;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Simple HTML to markdown converter - basic conversion only
|
|
46
|
+
*/
|
|
47
|
+
function htmlToMarkdownSimple(html) {
|
|
48
|
+
let markdown = html;
|
|
49
|
+
// Remove script, style, noscript, meta, link elements
|
|
50
|
+
markdown = markdown.replace(/<(script|style|noscript|meta|link)\b[^<]*(?:(?!<\/\1>)<[^<]*)*<\/\1>/gi, "");
|
|
51
|
+
// Headers
|
|
52
|
+
markdown = markdown.replace(/<h1\b[^>]*>(.*?)<\/h1>/gi, "# $1\n");
|
|
53
|
+
markdown = markdown.replace(/<h2\b[^>]*>(.*?)<\/h2>/gi, "## $1\n");
|
|
54
|
+
markdown = markdown.replace(/<h3\b[^>]*>(.*?)<\/h3>/gi, "### $1\n");
|
|
55
|
+
markdown = markdown.replace(/<h4\b[^>]*>(.*?)<\/h4>/gi, "#### $1\n");
|
|
56
|
+
markdown = markdown.replace(/<h5\b[^>]*>(.*?)<\/h5>/gi, "##### $1\n");
|
|
57
|
+
markdown = markdown.replace(/<h6\b[^>]*>(.*?)<\/h6>/gi, "###### $1\n");
|
|
58
|
+
// Bold and italic
|
|
59
|
+
markdown = markdown.replace(/<strong\b[^>]*>(.*?)<\/strong>/gi, "**$1**");
|
|
60
|
+
markdown = markdown.replace(/<b\b[^>]*>(.*?)<\/b>/gi, "**$1**");
|
|
61
|
+
markdown = markdown.replace(/<em\b[^>]*>(.*?)<\/em>/gi, "*$1*");
|
|
62
|
+
markdown = markdown.replace(/<i\b[^>]*>(.*?)<\/i>/gi, "*$1*");
|
|
63
|
+
// Links
|
|
64
|
+
markdown = markdown.replace(/<a\b[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/gi, "[$2]($1)");
|
|
65
|
+
// Images
|
|
66
|
+
markdown = markdown.replace(/<img\b[^>]*src="([^"]*)"[^>]*alt="([^"]*)"[^>]*>/gi, "");
|
|
67
|
+
markdown = markdown.replace(/<img\b[^>]*src="([^"]*)"[^>]*>/gi, "");
|
|
68
|
+
// Code blocks
|
|
69
|
+
markdown = markdown.replace(/<pre\b[^>]*><code\b[^>]*>(.*?)<\/code><\/pre>/gis, "```\n$1\n```");
|
|
70
|
+
markdown = markdown.replace(/<code\b[^>]*>(.*?)<\/code>/gi, "`$1`");
|
|
71
|
+
// Lists (basic)
|
|
72
|
+
markdown = markdown.replace(/<ul\b[^>]*>/gi, "");
|
|
73
|
+
markdown = markdown.replace(/<\/ul>/gi, "");
|
|
74
|
+
markdown = markdown.replace(/<ol\b[^>]*>/gi, "");
|
|
75
|
+
markdown = markdown.replace(/<\/ol>/gi, "");
|
|
76
|
+
markdown = markdown.replace(/<li\b[^>]*>/gi, "- ");
|
|
77
|
+
markdown = markdown.replace(/<\/li>/gi, "\n");
|
|
78
|
+
// Blockquotes
|
|
79
|
+
markdown = markdown.replace(/<blockquote\b[^>]*>(.*?)<\/blockquote>/gis, (match, content) => {
|
|
80
|
+
return content.split("\n").map((line) => `> ${line}`).join("\n");
|
|
81
|
+
});
|
|
82
|
+
// Horizontal rule
|
|
83
|
+
markdown = markdown.replace(/<hr\b[^>]*>/gi, "\n---\n");
|
|
84
|
+
// Paragraphs
|
|
85
|
+
markdown = markdown.replace(/<p\b[^>]*>/gi, "");
|
|
86
|
+
markdown = markdown.replace(/<\/p>/gi, "\n\n");
|
|
87
|
+
// Line breaks
|
|
88
|
+
markdown = markdown.replace(/<br\b[^>]*>/gi, "\n");
|
|
89
|
+
// Remove all remaining tags
|
|
90
|
+
markdown = markdown.replace(/<[^>]+>/g, "");
|
|
91
|
+
// Normalize whitespace
|
|
92
|
+
markdown = markdown.replace(/\n{3,}/g, "\n\n");
|
|
93
|
+
markdown = markdown.replace(/[ \t]+/g, " ");
|
|
94
|
+
markdown = markdown.trim();
|
|
95
|
+
return markdown;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Default fetch with timeout support
|
|
99
|
+
*/
|
|
100
|
+
async function fetchWithTimeout(url, options = {}, signal) {
|
|
101
|
+
const timeout = options.timeout || DEFAULT_TIMEOUT;
|
|
102
|
+
// Create an abort controller for timeout
|
|
103
|
+
const timeoutController = new AbortController();
|
|
104
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), timeout);
|
|
105
|
+
// If an external signal is provided, abort timeout controller when it aborts
|
|
106
|
+
if (signal) {
|
|
107
|
+
if (signal.aborted) {
|
|
108
|
+
clearTimeout(timeoutId);
|
|
109
|
+
throw new Error("Request aborted by user");
|
|
110
|
+
}
|
|
111
|
+
signal.addEventListener("abort", () => {
|
|
112
|
+
clearTimeout(timeoutId);
|
|
113
|
+
}, { once: true });
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const response = await fetch(url, {
|
|
117
|
+
...options,
|
|
118
|
+
signal: timeoutController.signal,
|
|
119
|
+
});
|
|
120
|
+
clearTimeout(timeoutId);
|
|
121
|
+
return response;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
clearTimeout(timeoutId);
|
|
125
|
+
if (error.name === "AbortError") {
|
|
126
|
+
if (signal?.aborted) {
|
|
127
|
+
throw new Error("Request aborted by user");
|
|
128
|
+
}
|
|
129
|
+
throw new Error(`Request timed out after ${timeout / 1000} seconds`);
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const defaultWebFetchOperations = {
|
|
135
|
+
fetch: async (url, options, signal) => {
|
|
136
|
+
const response = await fetchWithTimeout(url, options, signal);
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
throw new Error(`Request failed with status code: ${response.status}`);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
arrayBuffer: await response.arrayBuffer(),
|
|
142
|
+
headers: response.headers,
|
|
143
|
+
status: response.status,
|
|
144
|
+
statusText: response.statusText,
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
htmlToText: htmlToTextSimple,
|
|
148
|
+
htmlToMarkdown: htmlToMarkdownSimple,
|
|
149
|
+
};
|
|
150
|
+
export function createWebFetchTool(options) {
|
|
151
|
+
const maxResponseSize = options?.maxResponseSize || MAX_RESPONSE_SIZE;
|
|
152
|
+
const defaultTimeout = options?.defaultTimeout || DEFAULT_TIMEOUT;
|
|
153
|
+
const ops = defaultWebFetchOperations;
|
|
154
|
+
return {
|
|
155
|
+
name: "webfetch",
|
|
156
|
+
label: "webfetch",
|
|
157
|
+
description: "Fetches content from a specified URL. Takes a URL and optional format as input. Fetches the URL content, converts to requested format (markdown by default). Returns the content in the specified format. Use this tool when you need to retrieve and analyze web content. The URL must be a fully-formed valid URL starting with http:// or https://. Format options: 'markdown' (default), 'text', or 'html'. This tool is read-only and does not modify any files. Results may be summarized if the content is very large.",
|
|
158
|
+
parameters: webFetchSchema,
|
|
159
|
+
execute: async (_toolCallId, params, signal) => {
|
|
160
|
+
// Check if already aborted
|
|
161
|
+
if (signal?.aborted) {
|
|
162
|
+
throw new Error("Web fetch aborted");
|
|
163
|
+
}
|
|
164
|
+
// Validate URL
|
|
165
|
+
if (!params.url.startsWith("http://") && !params.url.startsWith("https://")) {
|
|
166
|
+
throw new Error("URL must start with http:// or https://");
|
|
167
|
+
}
|
|
168
|
+
// Calculate timeout
|
|
169
|
+
const timeout = Math.min((params.timeout ?? defaultTimeout / 1000) * 1000, MAX_TIMEOUT);
|
|
170
|
+
// Build Accept header based on requested format
|
|
171
|
+
let acceptHeader = "*/*";
|
|
172
|
+
switch (params.format) {
|
|
173
|
+
case "markdown":
|
|
174
|
+
acceptHeader =
|
|
175
|
+
"text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";
|
|
176
|
+
break;
|
|
177
|
+
case "text":
|
|
178
|
+
acceptHeader = "text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";
|
|
179
|
+
break;
|
|
180
|
+
case "html":
|
|
181
|
+
acceptHeader =
|
|
182
|
+
"text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1";
|
|
183
|
+
break;
|
|
184
|
+
default:
|
|
185
|
+
acceptHeader =
|
|
186
|
+
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8";
|
|
187
|
+
}
|
|
188
|
+
const headers = {
|
|
189
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
|
|
190
|
+
Accept: acceptHeader,
|
|
191
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
192
|
+
};
|
|
193
|
+
// Fetch the URL
|
|
194
|
+
const result = await ops.fetch(params.url, { ...headers, timeout }, signal);
|
|
195
|
+
// Check content length
|
|
196
|
+
const contentLength = result.headers.get("content-length");
|
|
197
|
+
if (contentLength && parseInt(contentLength) > maxResponseSize) {
|
|
198
|
+
throw new Error(`Response too large (exceeds ${(maxResponseSize / 1024 / 1024).toFixed(0)}MB limit)`);
|
|
199
|
+
}
|
|
200
|
+
const fetchedBytes = result.arrayBuffer.byteLength;
|
|
201
|
+
if (fetchedBytes > maxResponseSize) {
|
|
202
|
+
throw new Error(`Response too large (exceeds ${(maxResponseSize / 1024 / 1024).toFixed(0)}MB limit)`);
|
|
203
|
+
}
|
|
204
|
+
// Get content type
|
|
205
|
+
const contentType = result.headers.get("content-type") || "";
|
|
206
|
+
const mime = contentType.split(";")[0]?.trim().toLowerCase() || "";
|
|
207
|
+
// Check if response is an image
|
|
208
|
+
const isImage = mime.startsWith("image/") &&
|
|
209
|
+
mime !== "image/svg+xml" &&
|
|
210
|
+
mime !== "image/vnd.fastbidsheet";
|
|
211
|
+
// Build details
|
|
212
|
+
const details = {
|
|
213
|
+
url: params.url,
|
|
214
|
+
format: params.format,
|
|
215
|
+
timeout: params.timeout,
|
|
216
|
+
contentType,
|
|
217
|
+
fetchedBytes,
|
|
218
|
+
};
|
|
219
|
+
// Return content based on type
|
|
220
|
+
if (isImage) {
|
|
221
|
+
const base64Content = Buffer.from(result.arrayBuffer).toString("base64");
|
|
222
|
+
return {
|
|
223
|
+
content: [
|
|
224
|
+
{ type: "text", text: "Image fetched successfully" },
|
|
225
|
+
{ type: "image", data: base64Content, mimeType: mime },
|
|
226
|
+
],
|
|
227
|
+
details,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const content = Buffer.from(result.arrayBuffer).toString("utf-8");
|
|
231
|
+
let output;
|
|
232
|
+
// Handle content based on requested format and actual content type
|
|
233
|
+
const format = params.format || "markdown";
|
|
234
|
+
switch (format) {
|
|
235
|
+
case "markdown":
|
|
236
|
+
if (contentType.includes("text/html")) {
|
|
237
|
+
const markdown = ops.htmlToMarkdown(content);
|
|
238
|
+
output = [{ type: "text", text: markdown }];
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
output = [{ type: "text", text: content }];
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
case "text":
|
|
245
|
+
if (contentType.includes("text/html")) {
|
|
246
|
+
const text = await ops.htmlToText(content);
|
|
247
|
+
output = [{ type: "text", text: text }];
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
output = [{ type: "text", text: content }];
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
case "html":
|
|
254
|
+
output = [{ type: "text", text: content }];
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
output = [{ type: "text", text: content }];
|
|
258
|
+
}
|
|
259
|
+
return { content: output, details };
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/** Default web fetch tool */
|
|
264
|
+
export const webFetchTool = createWebFetchTool();
|
|
265
|
+
//# sourceMappingURL=webfetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webfetch.js","sourceRoot":"","sources":["../../../src/core/tools/webfetch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AACjD,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAChD,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,YAAY;AAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qEAAqE,EAAE,CAAC;IACxG,MAAM,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,KAAK,CAAC;QACV,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;KACpB,EAAE;QACF,WAAW,EAAE,sFAAsF;KACnG,CAAC,CACF;IACD,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAClF;CACD,CAAC,CAAC;AAyCH;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAY;IAC3C,mCAAmC;IACnC,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;IACnF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,2DAA2D,EAAE,EAAE,CAAC,CAAC;IAErF,uBAAuB;IACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEpC,iCAAiC;IACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAErC,uBAAuB;IACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnB,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACzC,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,sDAAsD;IACtD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;IAE1G,UAAU;IACV,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;IAClE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;IACnE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IACpE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;IACrE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;IACtE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;IAEvE,kBAAkB;IAClB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAAC;IAC1E,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IAChE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;IAChE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAE9D,QAAQ;IACR,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAC;IAErF,SAAS;IACT,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,oDAAoD,EAAE,WAAW,CAAC,CAAC;IAC/F,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;IAE3E,cAAc;IACd,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kDAAkD,EAAE,cAAc,CAAC,CAAC;IAChG,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IAEpE,gBAAgB;IAChB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACjD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACjD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACnD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE9C,cAAc;IACd,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,2CAA2C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3F,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAExD,aAAa;IACb,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE/C,cAAc;IACd,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEnD,4BAA4B;IAC5B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE5C,uBAAuB;IACvB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC5C,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3B,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC9B,GAAW,EACX,UAA8C,EAAE,EAChD,MAAoB;IAEpB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,yCAAyC;IACzC,MAAM,iBAAiB,GAAG,IAAI,eAAe,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAEvE,6EAA6E;IAC7E,IAAI,MAAM,EAAE,CAAC;QACZ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACrC,YAAY,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,GAAG,OAAO;YACV,MAAM,EAAE,iBAAiB,CAAC,MAAM;SAChC,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IACjB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACrB,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,yBAAyB,GAAuB;IACrD,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAE9D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO;YACN,WAAW,EAAE,MAAM,QAAQ,CAAC,WAAW,EAAE;YACzC,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;SAC/B,CAAC;IACH,CAAC;IACD,UAAU,EAAE,gBAAgB;IAC5B,cAAc,EAAE,oBAAoB;CACpC,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC/D,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,iBAAiB,CAAC;IACtE,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,eAAe,CAAC;IAClE,MAAM,GAAG,GAAG,yBAAyB,CAAC;IAEtC,OAAO;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EACV,+fAA+f;QAChgB,UAAU,EAAE,cAAc;QAC1B,OAAO,EAAE,KAAK,EACb,WAAmB,EACnB,MAIC,EACD,MAAoB,EACnB,EAAE;YACH,2BAA2B;YAC3B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACtC,CAAC;YAED,eAAe;YACf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7E,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC5D,CAAC;YAED,oBAAoB;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC;YAExF,gDAAgD;YAChD,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvB,KAAK,UAAU;oBACd,YAAY;wBACX,0FAA0F,CAAC;oBAC5F,MAAM;gBACP,KAAK,MAAM;oBACV,YAAY,GAAG,mEAAmE,CAAC;oBACnF,MAAM;gBACP,KAAK,MAAM;oBACV,YAAY;wBACX,gGAAgG,CAAC;oBAClG,MAAM;gBACP;oBACC,YAAY;wBACX,kGAAkG,CAAC;YACtG,CAAC;YAED,MAAM,OAAO,GAAG;gBACf,YAAY,EACX,iHAAiH;gBAClH,MAAM,EAAE,YAAY;gBACpB,iBAAiB,EAAE,gBAAgB;aACnC,CAAC;YAEF,gBAAgB;YAChB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;YAE5E,uBAAuB;YACvB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC3D,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,eAAe,EAAE,CAAC;gBAChE,MAAM,IAAI,KAAK,CACd,+BAA+B,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CACpF,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;YACnD,IAAI,YAAY,GAAG,eAAe,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACd,+BAA+B,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CACpF,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;YAEnE,gCAAgC;YAChC,MAAM,OAAO,GACZ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACzB,IAAI,KAAK,eAAe;gBACxB,IAAI,KAAK,wBAAwB,CAAC;YAEnC,gBAAgB;YAChB,MAAM,OAAO,GAAwB;gBACpC,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW;gBACX,YAAY;aACZ,CAAC;YAEF,+BAA+B;YAC/B,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACzE,OAAO;oBACN,OAAO,EAAE;wBACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;wBACpD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;qBACtD;oBACD,OAAO;iBACP,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,MAAsC,CAAC;YAE3C,mEAAmE;YACnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC;YAE3C,QAAQ,MAAM,EAAE,CAAC;gBAChB,KAAK,UAAU;oBACd,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;wBACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBAC7C,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC7C,CAAC;yBAAM,CAAC;wBACP,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC5C,CAAC;oBACD,MAAM;gBAEP,KAAK,MAAM;oBACV,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;wBACvC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;wBAC3C,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzC,CAAC;yBAAM,CAAC;wBACP,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC5C,CAAC;oBACD,MAAM;gBAEP,KAAK,MAAM;oBACV,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC3C,MAAM;gBAEP;oBACC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACrC,CAAC;KACD,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search Tool
|
|
3
|
+
*
|
|
4
|
+
* Performs real-time web searches using Exa AI API.
|
|
5
|
+
* Provides up-to-date information for current events and recent data.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentTool } from "indusagi/agent";
|
|
8
|
+
declare const webSearchSchema: import("@sinclair/typebox").TObject<{
|
|
9
|
+
query: import("@sinclair/typebox").TString;
|
|
10
|
+
numResults: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
11
|
+
livecrawl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"fallback">, import("@sinclair/typebox").TLiteral<"preferred">]>>;
|
|
12
|
+
type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"auto">, import("@sinclair/typebox").TLiteral<"fast">, import("@sinclair/typebox").TLiteral<"deep">]>>;
|
|
13
|
+
contextMaxCharacters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
14
|
+
}>;
|
|
15
|
+
export interface WebSearchToolDetails {
|
|
16
|
+
query: string;
|
|
17
|
+
numResults?: number;
|
|
18
|
+
livecrawl?: "fallback" | "preferred";
|
|
19
|
+
type?: "auto" | "fast" | "deep";
|
|
20
|
+
contextMaxCharacters?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface WebSearchToolOptions {
|
|
23
|
+
/** Custom API base URL (for testing or alternative endpoints) */
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
/** API key for Exa AI (if required) */
|
|
26
|
+
apiKey?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Pluggable operations for the web search tool.
|
|
30
|
+
* Override these to delegate search to alternative providers.
|
|
31
|
+
*/
|
|
32
|
+
export interface WebSearchOperations {
|
|
33
|
+
/**
|
|
34
|
+
* Execute a web search query
|
|
35
|
+
*/
|
|
36
|
+
search: (request: McpSearchRequest, signal?: AbortSignal) => Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
interface McpSearchRequest {
|
|
39
|
+
jsonrpc: string;
|
|
40
|
+
id: number;
|
|
41
|
+
method: string;
|
|
42
|
+
params: {
|
|
43
|
+
name: string;
|
|
44
|
+
arguments: {
|
|
45
|
+
query: string;
|
|
46
|
+
numResults?: number;
|
|
47
|
+
livecrawl?: "fallback" | "preferred";
|
|
48
|
+
type?: "auto" | "fast" | "deep";
|
|
49
|
+
contextMaxCharacters?: number;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export declare function createWebSearchTool(options?: WebSearchToolOptions): AgentTool<typeof webSearchSchema>;
|
|
54
|
+
/** Default web search tool */
|
|
55
|
+
export declare const webSearchTool: AgentTool<import("@sinclair/typebox").TObject<{
|
|
56
|
+
query: import("@sinclair/typebox").TString;
|
|
57
|
+
numResults: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
58
|
+
livecrawl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"fallback">, import("@sinclair/typebox").TLiteral<"preferred">]>>;
|
|
59
|
+
type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"auto">, import("@sinclair/typebox").TLiteral<"fast">, import("@sinclair/typebox").TLiteral<"deep">]>>;
|
|
60
|
+
contextMaxCharacters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
61
|
+
}>, any>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=websearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websearch.d.ts","sourceRoot":"","sources":["../../../src/core/tools/websearch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAYhD,QAAA,MAAM,eAAe;;;;;;EA6BnB,CAAC;AAEH,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACpC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IACnC;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7E;AAED,UAAU,gBAAgB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE;YACV,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;YACrC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;YAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;SAC9B,CAAC;KACF,CAAC;CACF;AAqED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC,OAAO,eAAe,CAAC,CAoErG;AAED,8BAA8B;AAC9B,eAAO,MAAM,aAAa;;;;;;QAAwB,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search Tool
|
|
3
|
+
*
|
|
4
|
+
* Performs real-time web searches using Exa AI API.
|
|
5
|
+
* Provides up-to-date information for current events and recent data.
|
|
6
|
+
*/
|
|
7
|
+
import { Type } from "@sinclair/typebox";
|
|
8
|
+
const API_CONFIG = {
|
|
9
|
+
BASE_URL: "https://mcp.exa.ai",
|
|
10
|
+
ENDPOINTS: {
|
|
11
|
+
SEARCH: "/mcp",
|
|
12
|
+
},
|
|
13
|
+
DEFAULT_NUM_RESULTS: 8,
|
|
14
|
+
};
|
|
15
|
+
const webSearchSchema = Type.Object({
|
|
16
|
+
query: Type.String({ description: "Web search query" }),
|
|
17
|
+
numResults: Type.Optional(Type.Number({ description: "Number of search results to return (default: 8, max: 10)" })),
|
|
18
|
+
livecrawl: Type.Optional(Type.Union([
|
|
19
|
+
Type.Literal("fallback"),
|
|
20
|
+
Type.Literal("preferred"),
|
|
21
|
+
], {
|
|
22
|
+
description: "Live crawl mode - 'fallback': use live crawling as backup if cached content unavailable, 'preferred': prioritize live crawling (default: 'fallback')",
|
|
23
|
+
})),
|
|
24
|
+
type: Type.Optional(Type.Union([
|
|
25
|
+
Type.Literal("auto"),
|
|
26
|
+
Type.Literal("fast"),
|
|
27
|
+
Type.Literal("deep"),
|
|
28
|
+
], {
|
|
29
|
+
description: "Search type - 'auto': balanced search (default), 'fast': quick results, 'deep': comprehensive search",
|
|
30
|
+
})),
|
|
31
|
+
contextMaxCharacters: Type.Optional(Type.Number({
|
|
32
|
+
description: "Maximum characters for context string optimized for LLMs (default: 10000)",
|
|
33
|
+
})),
|
|
34
|
+
});
|
|
35
|
+
const defaultWebSearchOperations = {
|
|
36
|
+
search: async (request, signal) => {
|
|
37
|
+
const baseUrl = API_CONFIG.BASE_URL;
|
|
38
|
+
const endpoint = API_CONFIG.ENDPOINTS.SEARCH;
|
|
39
|
+
const headers = {
|
|
40
|
+
accept: "application/json, text/event-stream",
|
|
41
|
+
"content-type": "application/json",
|
|
42
|
+
};
|
|
43
|
+
const response = await fetch(`${baseUrl}${endpoint}`, {
|
|
44
|
+
method: "POST",
|
|
45
|
+
headers,
|
|
46
|
+
body: JSON.stringify(request),
|
|
47
|
+
signal,
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorText = await response.text();
|
|
51
|
+
throw new Error(`Search error (${response.status}): ${errorText}`);
|
|
52
|
+
}
|
|
53
|
+
const responseText = await response.text();
|
|
54
|
+
// Parse SSE response
|
|
55
|
+
const lines = responseText.split("\n");
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
if (line.startsWith("data: ")) {
|
|
58
|
+
const data = JSON.parse(line.substring(6));
|
|
59
|
+
if (data.result && data.result.content && data.result.content.length > 0) {
|
|
60
|
+
return data.result.content[0].text;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return "";
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
function createSearchRequest(params) {
|
|
68
|
+
return {
|
|
69
|
+
jsonrpc: "2.0",
|
|
70
|
+
id: 1,
|
|
71
|
+
method: "tools/call",
|
|
72
|
+
params: {
|
|
73
|
+
name: "web_search_exa",
|
|
74
|
+
arguments: {
|
|
75
|
+
query: params.query,
|
|
76
|
+
type: params.type || "auto",
|
|
77
|
+
numResults: Math.min(params.numResults || API_CONFIG.DEFAULT_NUM_RESULTS, 10),
|
|
78
|
+
livecrawl: params.livecrawl || "fallback",
|
|
79
|
+
contextMaxCharacters: params.contextMaxCharacters,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function createWebSearchTool(options) {
|
|
85
|
+
const baseUrl = options?.baseUrl || API_CONFIG.BASE_URL;
|
|
86
|
+
return {
|
|
87
|
+
name: "websearch",
|
|
88
|
+
label: "websearch",
|
|
89
|
+
description: "Search the web using Exa AI - performs real-time web searches and can scrape content from specific URLs. Provides up-to-date information for current events and recent data. Supports configurable result counts and returns the content from the most relevant websites. Use this tool for accessing information beyond knowledge cutoff. The current year is 2026. You MUST use this year when searching for recent information or current events (e.g., search for 'AI news 2026', NOT 'AI news 2025').",
|
|
90
|
+
parameters: webSearchSchema,
|
|
91
|
+
execute: async (_toolCallId, params, signal) => {
|
|
92
|
+
// Check if already aborted
|
|
93
|
+
if (signal?.aborted) {
|
|
94
|
+
throw new Error("Web search aborted");
|
|
95
|
+
}
|
|
96
|
+
const details = {
|
|
97
|
+
query: params.query,
|
|
98
|
+
numResults: params.numResults,
|
|
99
|
+
livecrawl: params.livecrawl,
|
|
100
|
+
type: params.type,
|
|
101
|
+
contextMaxCharacters: params.contextMaxCharacters,
|
|
102
|
+
};
|
|
103
|
+
// Build request
|
|
104
|
+
const request = createSearchRequest(details);
|
|
105
|
+
// Execute search
|
|
106
|
+
let resultText;
|
|
107
|
+
try {
|
|
108
|
+
resultText = await defaultWebSearchOperations.search(request, signal);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error.name === "AbortError") {
|
|
112
|
+
throw new Error("Web search request timed out or was aborted");
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
// Build output
|
|
117
|
+
let content;
|
|
118
|
+
if (!resultText || resultText.trim() === "") {
|
|
119
|
+
content = [
|
|
120
|
+
{
|
|
121
|
+
type: "text",
|
|
122
|
+
text: "No search results found. Please try a different query.",
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
content = [
|
|
128
|
+
{
|
|
129
|
+
type: "text",
|
|
130
|
+
text: resultText,
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
return { content, details };
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Default web search tool */
|
|
139
|
+
export const webSearchTool = createWebSearchTool();
|
|
140
|
+
//# sourceMappingURL=websearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websearch.js","sourceRoot":"","sources":["../../../src/core/tools/websearch.ts"],"names":[],"mappings":"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"}
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Indusagi Coding Agent
|
|
2
|
+
|
|
3
|
+
A terminal-first coding agent with a small core and strong extensibility. Use it interactively, in scripts (print/JSON), over RPC, or as an SDK in your own apps.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g indusagi-coding-agent
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
indusagi
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Authenticate using `/login` or set provider API keys.
|
|
18
|
+
|
|
19
|
+
## Modes
|
|
20
|
+
|
|
21
|
+
| Mode | Description | Docs |
|
|
22
|
+
|------|-------------|------|
|
|
23
|
+
| Interactive | Default mode with TUI | - |
|
|
24
|
+
| Print/JSON | For scripting | [json.md](json.md) |
|
|
25
|
+
| RPC | Process integration | [rpc.md](rpc.md) |
|
|
26
|
+
| SDK | Programmatic usage | [sdk.md](sdk.md) |
|
|
27
|
+
|
|
28
|
+
## Key Features
|
|
29
|
+
|
|
30
|
+
- **Multi-provider support** - Anthropic, OpenAI, Google, and more
|
|
31
|
+
- **Extensible** - Extensions, skills, hooks, and themes
|
|
32
|
+
- **Session management** - Tree-based navigation, branching, compaction
|
|
33
|
+
- **Tool system** - Built-in tools for files, bash, search, and web operations
|
|
34
|
+
- **Subagents** - Spawn specialized agents for complex tasks
|
|
35
|
+
- **Web tools** - Real-time web search and URL fetching with format conversion
|
|
36
|
+
|
|
37
|
+
## Documentation Map
|
|
38
|
+
|
|
39
|
+
### Getting Started
|
|
40
|
+
- [Providers](providers.md) - Configure LLM providers
|
|
41
|
+
- [Settings](settings.md) - Global and project settings
|
|
42
|
+
|
|
43
|
+
### SDK & API
|
|
44
|
+
- [SDK Reference](sdk.md) - Programmatic usage
|
|
45
|
+
- [RPC Mode](rpc.md) - JSON-RPC integration
|
|
46
|
+
- [JSON Mode](json.md) - Scripting output
|
|
47
|
+
|
|
48
|
+
### Customization
|
|
49
|
+
- [Extensions](extensions.md) - Extend agent behavior
|
|
50
|
+
- [Skills](skills.md) - On-demand capability packages
|
|
51
|
+
- [Hooks](hooks.md) - Low-level interception
|
|
52
|
+
- [Subagents](subagents.md) - Spawn specialized agents
|
|
53
|
+
- [Prompt Templates](prompt-templates.md) - Custom prompts
|
|
54
|
+
- [Themes](themes.md) - UI theming
|
|
55
|
+
- [Packages](packages.md) - Share resources
|
|
56
|
+
|
|
57
|
+
### Session Management
|
|
58
|
+
- [Session Format](session.md) - File format and structure
|
|
59
|
+
- [Tree Navigation](tree.md) - Branch and navigate history
|
|
60
|
+
- [Compaction](compaction.md) - Context management
|
|
61
|
+
|
|
62
|
+
### Configuration
|
|
63
|
+
- [Settings](settings.md) - All configuration options
|
|
64
|
+
- [Custom Models](models.md) - Add custom providers
|
|
65
|
+
- [Custom Providers](custom-provider.md) - Proxy support
|
|
66
|
+
- [Keybindings](keybindings.md) - Keyboard shortcuts
|
|
67
|
+
|
|
68
|
+
### UI
|
|
69
|
+
- [TUI Components](tui.md) - Terminal UI
|
|
70
|
+
- [Terminal Setup](terminal-setup.md) - Terminal configuration
|
|
71
|
+
|
|
72
|
+
### Platform
|
|
73
|
+
- [Development](development.md) - Contributing
|
|
74
|
+
- [Shell Aliases](shell-aliases.md) - Shell integration
|
|
75
|
+
- [Windows](windows.md) - Windows-specific notes
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
|
|
79
|
+
MIT
|
package/docs/extensions.md
CHANGED
|
@@ -1713,7 +1713,7 @@ All examples in [examples/extensions/](../examples/extensions/).
|
|
|
1713
1713
|
| `ssh.ts` | SSH remote execution | `registerFlag`, `on("user_bash")`, `on("before_agent_start")`, tool operations |
|
|
1714
1714
|
| `interactive-shell.ts` | Persistent shell session | `on("user_bash")` |
|
|
1715
1715
|
| `sandbox/` | Sandboxed tool execution | Tool operations |
|
|
1716
|
-
| `subagent/` | Spawn sub-agents | `registerTool`, `exec` |
|
|
1716
|
+
| `subagent/` | Spawn sub-agents | `registerTool`, `exec` (see [subagents.md](subagents.md) for built-in task tool) |
|
|
1717
1717
|
| **Games** |||
|
|
1718
1718
|
| `snake.ts` | Snake game | `registerCommand`, `ui.custom`, keyboard handling |
|
|
1719
1719
|
| `space-invaders.ts` | Space Invaders game | `registerCommand`, `ui.custom` |
|