indusagi-coding-agent 0.1.21 → 0.1.23

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 CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.23]
4
+
5
+ ### Changed
6
+ - Bumped version to 0.1.23
7
+
8
+ ## [0.1.22]
9
+
10
+ ### Changed
11
+ - Updated `indusagi` dependency to use published npm package `^0.12.8` (was `file:../indusagi-copy`)
12
+
3
13
  ## [0.1.21]
4
14
 
5
15
  ### Added
package/README.md CHANGED
@@ -40,15 +40,27 @@ indusagi @src/index.ts "Summarize this file"
40
40
  ## Customization
41
41
 
42
42
  - Extensions: `docs/extensions.md`
43
+ - Hooks: `docs/hooks.md`
43
44
  - Skills: `docs/skills.md`
45
+ - Subagents: `docs/subagents.md`
44
46
  - Prompt templates: `docs/prompt-templates.md`
45
47
  - Themes: `docs/themes.md`
46
48
  - Packages: `docs/packages.md`
47
49
 
50
+ ## Session Management
51
+
52
+ - Session format: `docs/session.md`
53
+ - Tree navigation: `docs/tree.md`
54
+ - Compaction: `docs/compaction.md`
55
+
48
56
  ## Configuration
49
57
 
50
58
  Settings can be global or project-specific. See `docs/settings.md`.
51
59
 
60
+ - Keybindings: `docs/keybindings.md`
61
+ - Custom models: `docs/models.md`
62
+ - Custom providers: `docs/custom-provider.md`
63
+
52
64
  ## License
53
65
 
54
66
  MIT
@@ -0,0 +1,59 @@
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 { AgentTool } from "indusagi/agent";
8
+ declare const webFetchSchema: import("@sinclair/typebox").TObject<{
9
+ url: import("@sinclair/typebox").TString;
10
+ format: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"text">, import("@sinclair/typebox").TLiteral<"markdown">, import("@sinclair/typebox").TLiteral<"html">]>>;
11
+ timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
12
+ }>;
13
+ export interface WebFetchToolDetails {
14
+ url: string;
15
+ format?: "text" | "markdown" | "html";
16
+ timeout?: number;
17
+ contentType?: string;
18
+ fetchedBytes?: number;
19
+ }
20
+ export interface WebFetchToolOptions {
21
+ /** Maximum response size in bytes (default: 5MB) */
22
+ maxResponseSize?: number;
23
+ /** Default timeout in milliseconds (default: 30000) */
24
+ defaultTimeout?: number;
25
+ }
26
+ /**
27
+ * Pluggable operations for the web fetch tool.
28
+ * Override these to delegate fetching to alternative providers.
29
+ */
30
+ export interface WebFetchOperations {
31
+ /**
32
+ * Fetch content from a URL
33
+ */
34
+ fetch: (url: string, options: RequestInit & {
35
+ timeout?: number;
36
+ }, signal?: AbortSignal) => Promise<{
37
+ arrayBuffer: ArrayBuffer;
38
+ headers: Headers;
39
+ status: number;
40
+ statusText: string;
41
+ }>;
42
+ /**
43
+ * Convert HTML to text
44
+ */
45
+ htmlToText: (html: string) => Promise<string>;
46
+ /**
47
+ * Convert HTML to markdown
48
+ */
49
+ htmlToMarkdown: (html: string) => string;
50
+ }
51
+ export declare function createWebFetchTool(options?: WebFetchToolOptions): AgentTool<typeof webFetchSchema>;
52
+ /** Default web fetch tool */
53
+ export declare const webFetchTool: AgentTool<import("@sinclair/typebox").TObject<{
54
+ url: import("@sinclair/typebox").TString;
55
+ format: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"text">, import("@sinclair/typebox").TLiteral<"markdown">, import("@sinclair/typebox").TLiteral<"html">]>>;
56
+ timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
57
+ }>, any>;
58
+ export {};
59
+ //# sourceMappingURL=webfetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch.d.ts","sourceRoot":"","sources":["../../../src/core/tools/webfetch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQhD,QAAA,MAAM,cAAc;;;;EAclB,CAAC;AAEH,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC;QAClG,WAAW,EAAE,WAAW,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH;;OAEG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C;;OAEG;IACH,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAgKD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CAgJlG;AAED,6BAA6B;AAC7B,eAAO,MAAM,YAAY;;;;QAAuB,CAAC"}
@@ -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(/&amp;/g, "&");
32
+ text = text.replace(/&lt;/g, "<");
33
+ text = text.replace(/&gt;/g, ">");
34
+ text = text.replace(/&quot;/g, '"');
35
+ text = text.replace(/&#39;/g, "'");
36
+ text = text.replace(/&nbsp;/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, "![$2]($1)");
67
+ markdown = markdown.replace(/<img\b[^>]*src="([^"]*)"[^>]*>/gi, "![]($1)");
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":"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"}
@@ -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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"}