Sign In

@agentskit/tools

Package Overview
Dependencies
Maintainers
1
Versions
38
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@agentskit/tools - npm Package Compare versions

Comparing version
0.13.4
to
0.13.5
+22
-6
dist/index.cjs

@@ -7,2 +7,3 @@ 'use strict';

var util = require('util');
var integrations = require('@agentskit/integrations');

@@ -844,8 +845,23 @@ // src/web-search.ts

if (typeof args.username === "string" && args.username) payload.username = args.username;
const response = await doFetch(config.webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
return { ok: response.ok, status: response.status };
const { signal, cleanup } = integrations.composeTimeoutSignal(config.timeoutMs ?? 2e4, config.signal);
try {
const response = await doFetch(config.webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
signal,
redirect: "error"
});
if (!response.ok) {
const body = await response.text().catch(() => "");
throw new core.ToolError({
code: core.ErrorCodes.AK_TOOL_EXEC_FAILED,
message: `slack_send: HTTP ${response.status} ${response.statusText}: ${body.slice(0, 200)}`,
hint: "Verify the webhook URL and Slack channel configuration."
});
}
return { ok: true, status: response.status };
} finally {
cleanup();
}
}

@@ -852,0 +868,0 @@ };

@@ -224,2 +224,4 @@ import { ToolDefinition, ToolExecutionContext, MaybePromise } from '@agentskit/core';

fetch?: typeof fetch;
timeoutMs?: number;
signal?: AbortSignal;
}

@@ -226,0 +228,0 @@ declare function slackTool(config: SlackToolConfig): ToolDefinition;

@@ -224,2 +224,4 @@ import { ToolDefinition, ToolExecutionContext, MaybePromise } from '@agentskit/core';

fetch?: typeof fetch;
timeoutMs?: number;
signal?: AbortSignal;
}

@@ -226,0 +228,0 @@ declare function slackTool(config: SlackToolConfig): ToolDefinition;

@@ -8,2 +8,3 @@ import { checkEgress, safeFetch } from './chunk-6MONKY64.js';

import { promisify } from 'util';
import { composeTimeoutSignal } from '@agentskit/integrations';

@@ -686,8 +687,23 @@ var URL_RE = /^https?:\/\//i;

if (typeof args.username === "string" && args.username) payload.username = args.username;
const response = await doFetch(config.webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
return { ok: response.ok, status: response.status };
const { signal, cleanup } = composeTimeoutSignal(config.timeoutMs ?? 2e4, config.signal);
try {
const response = await doFetch(config.webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
signal,
redirect: "error"
});
if (!response.ok) {
const body = await response.text().catch(() => "");
throw new ToolError({
code: ErrorCodes.AK_TOOL_EXEC_FAILED,
message: `slack_send: HTTP ${response.status} ${response.statusText}: ${body.slice(0, 200)}`,
hint: "Verify the webhook URL and Slack channel configuration."
});
}
return { ok: true, status: response.status };
} finally {
cleanup();
}
}

@@ -694,0 +710,0 @@ };

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/web-search.ts","../src/fetch-url.ts","../src/filesystem.ts","../src/shell.ts","../src/discovery.ts","../src/zod.ts","../src/sqlite-query.ts","../src/slack.ts"],"names":["ToolError","ErrorCodes","ConfigError"],"mappings":"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","file":"index.js","sourcesContent":["import { ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\nimport { safeFetch } from './safe-fetch'\n\nexport interface WebSearchResult {\n title: string\n url: string\n snippet: string\n}\n\nexport type WebSearchProvider = 'auto' | 'serper' | 'tavily' | 'duckduckgo'\n\nexport interface WebSearchConfig {\n /**\n * Which backend to use. `'auto'` (default) picks the best available:\n * Serper if `SERPER_API_KEY` is set, Tavily if `TAVILY_API_KEY` is set,\n * otherwise falls back to an unauthenticated DuckDuckGo HTML scrape.\n */\n provider?: WebSearchProvider\n apiKey?: string\n maxResults?: number\n /** Custom search function — overrides every other path. */\n search?: (query: string) => Promise<WebSearchResult[]>\n}\n\nconst URL_RE = /^https?:\\/\\//i\nconst SNIPPET_MAX = 600\n\nasync function serperSearch(query: string, apiKey: string, maxResults: number): Promise<WebSearchResult[]> {\n const response = await fetch('https://google.serper.dev/search', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-KEY': apiKey,\n },\n body: JSON.stringify({ q: query, num: maxResults }),\n })\n if (!response.ok) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Serper API error: ${response.status}`,\n })\n }\n\n const data = await response.json() as {\n organic?: Array<{ title?: string; link?: string; snippet?: string }>\n }\n\n return (data.organic ?? []).map(r => ({\n title: r.title ?? '',\n url: r.link ?? '',\n snippet: r.snippet ?? '',\n }))\n}\n\nasync function tavilySearch(query: string, apiKey: string, maxResults: number): Promise<WebSearchResult[]> {\n const response = await fetch('https://api.tavily.com/search', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ api_key: apiKey, query, max_results: maxResults, include_answer: false }),\n })\n if (!response.ok) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Tavily API error: ${response.status}`,\n })\n }\n\n const data = await response.json() as {\n results?: Array<{ title?: string; url?: string; content?: string }>\n }\n\n return (data.results ?? []).map(r => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.content ?? '',\n }))\n}\n\n/**\n * Unauthenticated DuckDuckGo HTML scrape. Best-effort; HTML format may\n * change at any time. Returns an empty array if parsing fails.\n */\nasync function duckDuckGoHtmlSearch(query: string, maxResults: number): Promise<WebSearchResult[]> {\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; AgentsKit/1.0)',\n 'Accept-Language': 'en-US,en;q=0.9',\n },\n })\n if (!response.ok) return []\n\n const html = await response.text()\n const results: WebSearchResult[] = []\n\n const itemRe = /<a[^>]*class=\"[^\"]*result__a[^\"]*\"[^>]*href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>[\\s\\S]*?<a[^>]*class=\"[^\"]*result__snippet[^\"]*\"[^>]*>([\\s\\S]*?)<\\/a>/g\n for (const match of html.matchAll(itemRe)) {\n if (results.length >= maxResults) break\n results.push({\n title: stripTags(match[2]).trim(),\n url: decodeDuckUrl(match[1]),\n snippet: stripTags(match[3]).trim().slice(0, SNIPPET_MAX),\n })\n }\n\n return results\n}\n\nfunction decodeDuckUrl(raw: string): string {\n const match = raw.match(/uddg=([^&]+)/)\n if (match) {\n try {\n return decodeURIComponent(match[1])\n } catch {\n // fall through\n }\n }\n return raw\n}\n\nfunction stripTags(html: string): string {\n let out = html\n let prev: string\n do {\n prev = out\n out = out.replace(/<[^<>]*>/g, '')\n } while (out !== prev)\n // Decode entities; `&amp;` last so `&amp;lt;` can't collapse into `<`.\n return out\n .replace(/&nbsp;/gi, ' ')\n .replace(/&quot;/gi, '\"')\n .replace(/&#0*39;/g, \"'\")\n .replace(/&apos;/gi, \"'\")\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&amp;/gi, '&')\n .replace(/\\s+/g, ' ')\n}\n\n/**\n * Final fallback: if the query looks like a URL, fetch it directly and\n * return the page title + a text snippet. Lets the tool still produce\n * something useful when every search backend is unavailable.\n * Model-controlled URLs go through {@link safeFetch} so the initial host\n * and every redirect hop are egress-gated (ADR-0010).\n */\nasync function fetchUrlAsResult(url: string): Promise<WebSearchResult[]> {\n try {\n const response = await safeFetch(url, {\n headers: { 'User-Agent': 'Mozilla/5.0 (compatible; AgentsKit/1.0)' },\n })\n if (!response.ok) return []\n const html = await response.text()\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n const title = titleMatch ? stripTags(titleMatch[1]).trim() : url\n const text = stripTags(html).slice(0, SNIPPET_MAX * 2)\n return [{ title, url, snippet: text }]\n } catch (err) {\n // Surface egress rejections as readable errors; other failures stay empty.\n if (err instanceof ToolError) throw err\n return []\n }\n}\n\nfunction resolveBackend(\n provider: WebSearchProvider,\n explicitApiKey: string | undefined,\n): { backend: WebSearchProvider; apiKey?: string } {\n if (provider !== 'auto') return { backend: provider, apiKey: explicitApiKey }\n\n const serperKey = explicitApiKey ?? process.env.SERPER_API_KEY\n if (serperKey) return { backend: 'serper', apiKey: serperKey }\n\n const tavilyKey = process.env.TAVILY_API_KEY\n if (tavilyKey) return { backend: 'tavily', apiKey: tavilyKey }\n\n return { backend: 'duckduckgo' }\n}\n\nexport function webSearch(config: WebSearchConfig = {}): ToolDefinition {\n const { provider = 'auto', apiKey, maxResults = 5, search } = config\n\n return {\n name: 'web_search',\n description:\n 'Search the web for information. Accepts a query or a URL. Returns titles, URLs, and snippets.',\n tags: ['web', 'search'],\n category: 'retrieval',\n schema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'The search query or URL' },\n },\n required: ['query'],\n },\n execute: async (args) => {\n const query = String(args.query ?? '').trim()\n if (!query) return 'Error: query is required'\n\n if (search) {\n const results = await search(query)\n return formatResults(results, query)\n }\n\n if (URL_RE.test(query)) {\n try {\n const direct = await fetchUrlAsResult(query)\n if (direct.length > 0) return formatResults(direct, query)\n } catch (err) {\n if (err instanceof ToolError) {\n return err.message.startsWith('Error:') ? err.message : `Error: ${err.message}`\n }\n throw err\n }\n }\n\n const { backend, apiKey: resolvedKey } = resolveBackend(provider, apiKey)\n\n // Explicit provider without the required key — surface an error instead\n // of silently falling through. Users who pinned a backend want to know.\n if (provider === 'serper' && !resolvedKey) {\n return 'Error: Serper provider requires apiKey (pass { apiKey } or set SERPER_API_KEY)'\n }\n if (provider === 'tavily' && !resolvedKey) {\n return 'Error: Tavily provider requires apiKey (pass { apiKey } or set TAVILY_API_KEY)'\n }\n\n try {\n let results: WebSearchResult[] = []\n if (backend === 'serper' && resolvedKey) {\n results = await serperSearch(query, resolvedKey, maxResults)\n } else if (backend === 'tavily' && resolvedKey) {\n results = await tavilySearch(query, resolvedKey, maxResults)\n } else {\n results = await duckDuckGoHtmlSearch(query, maxResults)\n }\n\n if (results.length > 0) return formatResults(results, query)\n } catch {\n // fall through\n }\n\n return `No results found for \"${query}\"`\n },\n }\n}\n\nfunction formatResults(results: WebSearchResult[], query: string): string {\n if (results.length === 0) return `No results found for \"${query}\"`\n return results\n .map((r, i) => `[${i + 1}] ${r.title}\\n${r.url}\\n${r.snippet}`)\n .join('\\n\\n')\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport { checkEgress } from './safe-fetch'\n\nexport interface FetchUrlConfig {\n /** Maximum bytes to read from the response body. Default: 200 KB. */\n maxBytes?: number\n /** Request timeout in ms. Default: 15000. */\n timeoutMs?: number\n /** Header value for `User-Agent`. Default: `AgentsKit/1.0`. */\n userAgent?: string\n /**\n * Allow requests to private/loopback/link-local addresses. Off by\n * default so an agent can't reach AWS IMDS (169.254.169.254), the\n * loopback interface, or internal RFC1918 services. Set true only\n * when the tool runs against a vetted internal target.\n */\n allowPrivateHosts?: boolean\n /**\n * Max redirects to follow. Each hop's resolved host is re-checked\n * against `allowPrivateHosts` to block redirect-based SSRF. Default 3.\n */\n maxRedirects?: number\n /**\n * Hostname allowlist. If set, every request (and every redirect hop)\n * must match a literal hostname in this list — overrides\n * `allowPrivateHosts`. Wildcards are not supported by design.\n */\n allowedHosts?: string[]\n}\n\nconst DEFAULT_MAX_BYTES = 200 * 1024\nconst DEFAULT_TIMEOUT_MS = 15_000\nconst DEFAULT_MAX_REDIRECTS = 3\n\n/** Decode a small set of HTML entities. `&amp;` is decoded last so a\n * double-encoded entity (`&amp;lt;`) can't be collapsed into a live `<`. */\nfunction decodeEntities(s: string): string {\n return s\n .replace(/&nbsp;/gi, ' ')\n .replace(/&quot;/gi, '\"')\n .replace(/&#0*39;/g, \"'\")\n .replace(/&apos;/gi, \"'\")\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&amp;/gi, '&')\n}\n\n/** Strip a tag pair repeatedly until stable, so a nested/overlapping\n * construct (`<scr<script>ipt>`) can't survive a single pass. */\nfunction stripPair(html: string, tag: string): string {\n const re = new RegExp(`<${tag}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/${tag}\\\\s*>`, 'gi')\n let prev: string\n do {\n prev = html\n html = html.replace(re, '')\n } while (html !== prev)\n return html\n}\n\nfunction stripHtml(html: string): string {\n let out = stripPair(html, 'script')\n out = stripPair(out, 'style')\n // Strip comments and tags in one loop until stable, so a construct\n // that re-forms a `<!--` or a `<tag>` after one pass can't survive.\n let prev: string\n do {\n prev = out\n // `(?:-->|$)` also drops an unterminated `<!--` (no closing `-->`).\n out = out.replace(/<!--[\\s\\S]*?(?:-->|$)/g, '').replace(/<[^<>]*>/g, ' ')\n } while (out !== prev)\n return decodeEntities(out).replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * Tool: fetch a URL and return its text content.\n *\n * - Enforces HTTPS/HTTP only (no file://, ftp://, etc).\n * - SSRF-gated: every hop's resolved host is checked against private /\n * loopback / link-local ranges and (when configured) an allowlist.\n * - Redirects are followed manually so the target host of each hop is\n * re-validated; the platform's automatic redirect is disabled.\n * - Caps response size via `maxBytes` so a huge page can't flood the\n * model's context window or blow memory.\n * - Strips HTML tags by default; set `raw: true` to get the body verbatim.\n */\nexport function fetchUrl(config: FetchUrlConfig = {}): ToolDefinition {\n const {\n maxBytes = DEFAULT_MAX_BYTES,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n userAgent = 'AgentsKit/1.0',\n allowPrivateHosts = false,\n maxRedirects = DEFAULT_MAX_REDIRECTS,\n allowedHosts,\n } = config\n\n return {\n name: 'fetch_url',\n description:\n 'Fetch the contents of a URL and return it as text. Use for reading docs, articles, or API responses.',\n tags: ['web', 'fetch'],\n category: 'retrieval',\n schema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'The URL to fetch (http or https)' },\n raw: {\n type: 'boolean',\n description: 'If true, return the response body without HTML stripping. Default: false.',\n },\n },\n required: ['url'],\n },\n execute: async (args) => {\n const input = String(args.url ?? '').trim()\n const raw = Boolean(args.raw)\n if (!input) return 'Error: url is required'\n\n let currentUrl = input\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n let response: Response | null = null\n let hops = 0\n while (hops <= maxRedirects) {\n let parsed: URL\n try {\n parsed = new URL(currentUrl)\n } catch {\n return `Error: invalid URL \"${currentUrl}\"`\n }\n const gateError = await checkEgress(parsed, { allowPrivateHosts, allowedHosts })\n if (gateError) return gateError\n\n const r = await fetch(currentUrl, {\n headers: { 'User-Agent': userAgent, 'Accept': 'text/html,text/plain,*/*' },\n signal: controller.signal,\n redirect: 'manual',\n })\n\n if (r.status >= 300 && r.status < 400) {\n const loc = r.headers.get('location')\n if (!loc) {\n response = r\n break\n }\n try {\n currentUrl = new URL(loc, currentUrl).toString()\n } catch {\n return `Error: invalid redirect target \"${loc}\"`\n }\n hops++\n if (hops > maxRedirects) {\n return `Error: exceeded maxRedirects (${maxRedirects})`\n }\n continue\n }\n response = r\n break\n }\n if (!response) return `Error: exceeded maxRedirects (${maxRedirects})`\n if (!response.ok) return `Error: ${response.status} ${response.statusText} for ${currentUrl}`\n\n const contentType = response.headers.get('content-type') ?? ''\n const reader = response.body?.getReader()\n if (!reader) return `Error: empty response body for ${currentUrl}`\n\n const chunks: Uint8Array[] = []\n let bytes = 0\n while (bytes < maxBytes) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n bytes += value.byteLength\n }\n try {\n await reader.cancel()\n } catch {\n // already closed\n }\n\n const body = new TextDecoder('utf-8').decode(concat(chunks, Math.min(bytes, maxBytes)))\n const isHtml = contentType.includes('html') || /<html[\\s>]/i.test(body)\n const text = raw || !isHtml ? body : stripHtml(body)\n const truncated = bytes >= maxBytes ? `\\n\\n[truncated at ${maxBytes} bytes]` : ''\n return `URL: ${currentUrl}\\nContent-Type: ${contentType || 'unknown'}\\n\\n${text}${truncated}`\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return `Error fetching ${currentUrl}: ${message}`\n } finally {\n clearTimeout(timer)\n }\n },\n }\n}\n\nfunction concat(chunks: Uint8Array[], totalBytes: number): Uint8Array {\n const out = new Uint8Array(totalBytes)\n let offset = 0\n for (const chunk of chunks) {\n const remaining = totalBytes - offset\n if (remaining <= 0) break\n const slice = chunk.byteLength <= remaining ? chunk : chunk.subarray(0, remaining)\n out.set(slice, offset)\n offset += slice.byteLength\n }\n return out\n}\n","import { isAbsolute, resolve, relative, sep } from 'node:path'\nimport { ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\n\nexport interface FilesystemConfig {\n basePath: string\n /**\n * When true, refuse to operate on symlinks at all (read, write,\n * list). Default true — symlinks inside basePath can target outside\n * the jail and would otherwise leak access. Set false only if you\n * trust the contents of basePath.\n */\n denySymlinks?: boolean\n}\n\nfunction isInside(base: string, target: string): boolean {\n if (base === target) return true\n const rel = relative(base, target)\n if (rel === '' || rel === '.') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n // On Windows, relative('C:\\\\base', 'D:\\\\other') returns 'D:\\\\other'.\n // isAbsolute already catches that.\n // Reject any '..' segment in the relative path (defensive).\n const parts = rel.split(sep)\n return !parts.includes('..')\n}\n\nfunction jailPath(basePath: string, inputPath: string): string {\n const resolved = resolve(basePath, inputPath)\n if (!isInside(basePath, resolved)) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `Access denied: \"${inputPath}\" is outside the allowed base path`,\n hint: 'Pass paths relative to the configured basePath; absolute paths and ../ traversal are rejected.',\n })\n }\n return resolved\n}\n\nasync function canonicalBase(basePath: string): Promise<string> {\n const fs = await import('node:fs/promises')\n try {\n return await fs.realpath(basePath)\n } catch {\n return basePath\n }\n}\n\nasync function realJailPath(\n basePath: string,\n inputPath: string,\n opts: { denySymlinks: boolean; mustExist: boolean },\n): Promise<string> {\n const fs = await import('node:fs/promises')\n const canonical = await canonicalBase(basePath)\n const initial = jailPath(canonical, inputPath)\n // Resolve symlinks to their real targets so a symlink whose target\n // sits outside the jail is rejected. For write-new-file calls the\n // leaf may not exist yet — fall back to checking the parent.\n let real: string\n try {\n real = await fs.realpath(initial)\n } catch (err) {\n if (opts.mustExist) throw err as Error\n // Walk up until we find an existing ancestor we can realpath; then\n // rejoin the trailing segments. Handles deep new-directory writes.\n const path = await import('node:path')\n const trailing: string[] = []\n let cursor = initial\n while (true) {\n trailing.unshift(path.basename(cursor))\n const parent = path.dirname(cursor)\n if (parent === cursor) {\n real = initial\n break\n }\n try {\n const parentReal = await fs.realpath(parent)\n real = resolve(parentReal, ...trailing)\n break\n } catch {\n cursor = parent\n }\n }\n }\n if (!isInside(canonical, real)) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `Access denied: \"${inputPath}\" resolves outside the allowed base path (symlink escape blocked)`,\n hint: 'A symlink inside basePath was pointing outside it. Move the target inside basePath or remove the symlink.',\n })\n }\n if (opts.denySymlinks) {\n try {\n const stat = await fs.lstat(initial)\n if (stat.isSymbolicLink()) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `Access denied: \"${inputPath}\" is a symbolic link`,\n hint: 'Symlinks are disabled for this filesystem tool. Set denySymlinks:false to allow them.',\n })\n }\n } catch (err) {\n if (opts.mustExist) throw err as Error\n // leaf doesn't exist yet — fine\n }\n }\n return real\n}\n\nexport function filesystem(config: FilesystemConfig): ToolDefinition[] {\n const basePath = resolve(config.basePath)\n const denySymlinks = config.denySymlinks ?? true\n\n const readFile: ToolDefinition = {\n name: 'read_file',\n description: 'Read the contents of a file. Path is relative to the workspace.',\n tags: ['filesystem', 'read'],\n category: 'filesystem',\n schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to workspace' },\n },\n required: ['path'],\n },\n execute: async (args) => {\n const fs = await import('node:fs/promises')\n const filePath = await realJailPath(basePath, String(args.path ?? ''), {\n denySymlinks,\n mustExist: true,\n })\n return await fs.readFile(filePath, 'utf8')\n },\n }\n\n const writeFile: ToolDefinition = {\n name: 'write_file',\n description: 'Write content to a file. Creates the file if it does not exist. Path is relative to the workspace.',\n tags: ['filesystem', 'write'],\n category: 'filesystem',\n requiresConfirmation: true,\n schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to workspace' },\n content: { type: 'string', description: 'Content to write' },\n },\n required: ['path', 'content'],\n },\n execute: async (args) => {\n const fs = await import('node:fs/promises')\n const { dirname } = await import('node:path')\n const filePath = await realJailPath(basePath, String(args.path ?? ''), {\n denySymlinks,\n mustExist: false,\n })\n await fs.mkdir(dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, String(args.content ?? ''), 'utf8')\n return `Written to ${args.path}`\n },\n }\n\n const listDirectory: ToolDefinition = {\n name: 'list_directory',\n description: 'List files and directories at a path. Path is relative to the workspace.',\n tags: ['filesystem', 'read'],\n category: 'filesystem',\n schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path relative to workspace (default: root)' },\n },\n },\n execute: async (args) => {\n const fs = await import('node:fs/promises')\n const dirPath = await realJailPath(basePath, String(args.path ?? '.'), {\n denySymlinks,\n mustExist: true,\n })\n const entries = await fs.readdir(dirPath, { withFileTypes: true })\n return entries\n .map(e => `${e.isDirectory() ? '[dir] ' : ''}${e.name}`)\n .join('\\n')\n },\n }\n\n return [readFile, writeFile, listDirectory]\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type { ToolDefinition } from '@agentskit/core'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface ShellConfig {\n /** Per-command timeout in ms. Default 30s. */\n timeout?: number\n /**\n * Allowlist of permitted executables. **Required by default** —\n * leave unset only when explicitly opting into the open mode via\n * `allowAny:true`. Each entry is matched against the command's\n * first token (the executable name).\n */\n allowed?: string[]\n /**\n * Opt out of the allowlist requirement. When true, any executable is\n * permitted — use only for trusted, sandbox-wrapped contexts. Off by\n * default so a misconfigured agent cannot run arbitrary binaries.\n */\n allowAny?: boolean\n /** Cap on combined stdout/stderr per invocation. Default 1 MB. */\n maxOutput?: number\n /** Working directory passed to the child process. */\n cwd?: string\n /**\n * Environment for the child. Defaults to an empty object so secrets\n * in the parent process environment do not leak into the executed\n * command unless explicitly forwarded.\n */\n env?: NodeJS.ProcessEnv\n}\n\n// Shell metacharacters that enable command chaining, substitution, or\n// redirection. Reject any argument containing one — even an allowlisted\n// executable should not be invoked with these tokens because they\n// indicate the caller intended shell expansion, which is unavailable\n// under execFile.\nconst SHELL_METACHARS = /[;&|`$<>(){}[\\]!*?#~\\\\'\"\\n\\r]/\n\nfunction parseCommand(input: string): { argv: string[]; reason?: string } {\n const trimmed = input.trim()\n if (!trimmed) return { argv: [], reason: 'command is empty' }\n if (SHELL_METACHARS.test(trimmed)) {\n return { argv: [], reason: 'command contains shell metacharacters; shell expansion is not supported' }\n }\n // Whitespace-separated tokens. No quoting support by design — if you\n // need quoted args, build the array yourself in a custom tool.\n const argv = trimmed.split(/\\s+/)\n return { argv }\n}\n\nexport function shell(config: ShellConfig = {}): ToolDefinition {\n const {\n timeout = 30_000,\n allowed,\n allowAny = false,\n maxOutput = 1_000_000,\n cwd,\n env = {},\n } = config\n\n if (!allowed && !allowAny) {\n throw new Error(\n 'shell(): refusing to register with no `allowed` allowlist. Pass `allowed: [...]` or, only in trusted/sandboxed contexts, `allowAny: true`.',\n )\n }\n\n return {\n name: 'shell',\n description: 'Execute an executable directly (no shell). Returns stdout, stderr, and exit code. Shell metacharacters are rejected.',\n tags: ['shell', 'command'],\n category: 'execution',\n requiresConfirmation: true,\n schema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'The executable plus arguments, whitespace-separated. No shell metacharacters.' },\n },\n required: ['command'],\n },\n execute: async (args) => {\n const raw = String(args.command ?? '')\n const { argv, reason } = parseCommand(raw)\n if (reason) return `Error: ${reason}`\n if (argv.length === 0) return 'Error: command is required'\n\n const [bin, ...rest] = argv as [string, ...string[]]\n if (allowed && !allowed.includes(bin)) {\n return `Error: command \"${bin}\" is not allowed. Allowed: ${allowed.join(', ')}`\n }\n\n try {\n const { stdout, stderr } = await execFileAsync(bin, rest, {\n timeout,\n maxBuffer: maxOutput,\n encoding: 'utf8',\n cwd,\n env,\n shell: false,\n windowsHide: true,\n })\n return `${stdout}${stderr ? `\\n[stderr] ${stderr}` : ''}\\n[exit code: 0]`\n } catch (err: unknown) {\n const error = err as {\n code?: number | string\n status?: number\n stdout?: string\n stderr?: string\n killed?: boolean\n signal?: string\n }\n const stdout = error.stdout ?? ''\n const stderr = error.stderr ? `[stderr] ${error.stderr}` : ''\n const output = [stdout, stderr].filter(Boolean).join('\\n')\n\n if (error.killed || error.signal === 'SIGTERM') {\n return `${output}\\n[killed: command timed out after ${timeout}ms]`\n }\n\n const exitCode = typeof error.code === 'number' ? error.code : error.status ?? -1\n return `${output}\\n[exit code: ${exitCode}]`\n }\n },\n }\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport type { JSONSchema7 } from 'json-schema'\nimport { webSearch } from './web-search'\nimport { fetchUrl } from './fetch-url'\nimport { filesystem } from './filesystem'\nimport { shell } from './shell'\n\nexport interface ToolMetadata {\n name: string\n description: string\n tags: string[]\n category: string\n schema: JSONSchema7\n}\n\nfunction extractMetadata(tool: ToolDefinition): ToolMetadata {\n return {\n name: tool.name,\n description: tool.description ?? '',\n tags: tool.tags ?? [],\n category: tool.category ?? '',\n schema: (tool.schema ?? { type: 'object' }) as JSONSchema7,\n }\n}\n\nexport function listTools(): ToolMetadata[] {\n // Instantiate tools with safe defaults to extract their metadata\n const tools: ToolDefinition[] = [\n webSearch(),\n fetchUrl(),\n ...filesystem({ basePath: process.cwd() }),\n shell({ allowed: [] }),\n ]\n\n return tools.map(extractMetadata)\n}\n","import type { ToolDefinition, ToolExecutionContext, MaybePromise } from '@agentskit/core'\nimport type { JSONSchema7 } from 'json-schema'\n\n// ---------------------------------------------------------------------------\n// Minimal Zod type contract — avoids hard dependency on zod\n// ---------------------------------------------------------------------------\n\n/** Minimal shape of a Zod schema so we can infer its output type. */\ninterface ZodLike<T = unknown> {\n parse: (data: unknown) => T\n _output: T\n}\n\n/** Extract the output type from a Zod-like schema. */\ntype InferZodOutput<T> = T extends ZodLike<infer O> ? O : never\n\n// ---------------------------------------------------------------------------\n// defineZodTool — Zod-based tool definition with automatic type inference\n// ---------------------------------------------------------------------------\n\nexport interface DefineZodToolConfig<TSchema extends ZodLike> {\n name: string\n description?: string\n schema: TSchema\n /**\n * Convert the Zod schema to JSON Schema.\n * Users must supply this themselves (e.g. via `zod-to-json-schema`),\n * keeping the zod dependency entirely optional.\n */\n toJsonSchema?: (schema: TSchema) => JSONSchema7\n requiresConfirmation?: boolean\n execute?: (\n args: InferZodOutput<TSchema>,\n context: ToolExecutionContext,\n ) => MaybePromise<unknown> | AsyncIterable<unknown>\n init?: () => MaybePromise<void>\n dispose?: () => MaybePromise<void>\n tags?: string[]\n category?: string\n}\n\n/**\n * Create a ToolDefinition whose execute args are typed from a Zod schema.\n *\n * Zod is NOT bundled — pass it as a peer dependency. The `toJsonSchema`\n * callback lets you convert the Zod schema to JSON Schema for the adapter\n * (e.g. using `zod-to-json-schema`).\n *\n * @example\n * ```ts\n * import { z } from 'zod'\n * import { zodToJsonSchema } from 'zod-to-json-schema'\n * import { defineZodTool } from '@agentskit/tools'\n *\n * const weatherTool = defineZodTool({\n * name: 'weather',\n * description: 'Get weather for a city',\n * schema: z.object({ city: z.string(), units: z.enum(['C', 'F']).optional() }),\n * toJsonSchema: (s) => zodToJsonSchema(s) as JSONSchema7,\n * execute: (args) => {\n * // args.city is string, args.units is 'C' | 'F' | undefined\n * return `Weather in ${args.city}: 22${args.units ?? 'C'}`\n * },\n * })\n * ```\n */\nexport function defineZodTool<TSchema extends ZodLike>(\n config: DefineZodToolConfig<TSchema>,\n): ToolDefinition<InferZodOutput<TSchema>> {\n const { schema, toJsonSchema, execute, ...rest } = config\n\n const jsonSchema = toJsonSchema ? toJsonSchema(schema) : undefined\n\n const wrappedExecute = execute\n ? (args: InferZodOutput<TSchema>, context: ToolExecutionContext) => {\n // Runtime validation via Zod\n const parsed = schema.parse(args) as InferZodOutput<TSchema>\n return execute(parsed, context)\n }\n : undefined\n\n return {\n ...rest,\n schema: jsonSchema,\n execute: wrappedExecute,\n } as ToolDefinition<InferZodOutput<TSchema>>\n}\n","import { ConfigError, ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\n\nexport interface SqliteQueryConfig {\n path: string\n /** Reserved for v2; only `true` is accepted today. */\n readOnly?: true\n /** Max rows returned. Defaults to 100. */\n maxRows?: number\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n all(...args: unknown[]): Record<string, unknown>[]\n readonly?: boolean\n }\n pragma(source: string): unknown\n close(): void\n}\n\ninterface SqliteCtor {\n new (path: string, options?: { readonly?: boolean; fileMustExist?: boolean }): SqliteDb\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = (mod.default ?? mod) as unknown as SqliteCtor\n const db = new Database(path, { readonly: true })\n db.pragma('query_only = ON')\n return db\n } catch {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_PEER_MISSING,\n message: 'Install better-sqlite3 to use sqliteQueryTool: npm install better-sqlite3',\n })\n }\n}\n\nconst WRITE_KEYWORDS = /\\b(?:insert|update|delete|drop|create|alter|attach|detach|replace|reindex|vacuum|pragma)\\b/i\n\nexport function sqliteQueryTool(config: SqliteQueryConfig): ToolDefinition {\n if (config.readOnly !== undefined && config.readOnly !== true) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'sqliteQueryTool: writes are not supported in v1 (readOnly must be true).',\n })\n }\n const maxRows = config.maxRows ?? 100\n let dbPromise: Promise<SqliteDb> | null = null\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) dbPromise = openDatabase(config.path)\n return dbPromise\n }\n\n return {\n name: 'sqlite_query',\n description: 'Run a read-only SQL query against a local SQLite database. Returns up to 100 rows.',\n tags: ['sqlite', 'sql', 'database', 'read'],\n category: 'database',\n schema: {\n type: 'object',\n properties: {\n sql: { type: 'string', description: 'A single SELECT-style SQL statement.' },\n },\n required: ['sql'],\n },\n execute: async (args) => {\n const sql = String(args.sql ?? '').trim()\n if (!sql) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'sqlite_query: missing sql argument',\n })\n }\n if (WRITE_KEYWORDS.test(sql)) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'sqlite_query: only read-only SELECT-style statements are allowed',\n })\n }\n const db = await getDb()\n const stmt = db.prepare(sql)\n const rows = stmt.all() as Record<string, unknown>[]\n const truncated = rows.length > maxRows\n return {\n rows: truncated ? rows.slice(0, maxRows) : rows,\n rowCount: rows.length,\n truncated,\n }\n },\n }\n}\n","import { ConfigError, ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\n\nexport interface SlackToolConfig {\n webhookUrl: string\n /** Override fetch (mainly for tests). Defaults to the global `fetch`. */\n fetch?: typeof fetch\n}\n\nexport function slackTool(config: SlackToolConfig): ToolDefinition {\n if (!config.webhookUrl) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'slackTool: webhookUrl is required',\n })\n }\n const doFetch = config.fetch ?? fetch\n\n return {\n name: 'slack_send',\n description: 'Send a message to a Slack channel via an Incoming Webhook.',\n tags: ['slack', 'notify', 'webhook'],\n category: 'notification',\n requiresConfirmation: true,\n schema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Message text. Slack mrkdwn is supported.' },\n channel: { type: 'string', description: 'Channel override (only honored if your webhook allows it).' },\n username: { type: 'string', description: 'Username override (only honored if your webhook allows it).' },\n },\n required: ['text'],\n },\n execute: async (args) => {\n const text = String(args.text ?? '').trim()\n if (!text) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'slack_send: missing text',\n })\n }\n const payload: Record<string, string> = { text }\n if (typeof args.channel === 'string' && args.channel) payload.channel = args.channel\n if (typeof args.username === 'string' && args.username) payload.username = args.username\n\n const response = await doFetch(config.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return { ok: response.ok, status: response.status }\n },\n }\n}\n"]}
{"version":3,"sources":["../src/web-search.ts","../src/fetch-url.ts","../src/filesystem.ts","../src/shell.ts","../src/discovery.ts","../src/zod.ts","../src/sqlite-query.ts","../src/slack.ts"],"names":["ToolError","ErrorCodes","ConfigError"],"mappings":"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","file":"index.js","sourcesContent":["import { ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\nimport { safeFetch } from './safe-fetch'\n\nexport interface WebSearchResult {\n title: string\n url: string\n snippet: string\n}\n\nexport type WebSearchProvider = 'auto' | 'serper' | 'tavily' | 'duckduckgo'\n\nexport interface WebSearchConfig {\n /**\n * Which backend to use. `'auto'` (default) picks the best available:\n * Serper if `SERPER_API_KEY` is set, Tavily if `TAVILY_API_KEY` is set,\n * otherwise falls back to an unauthenticated DuckDuckGo HTML scrape.\n */\n provider?: WebSearchProvider\n apiKey?: string\n maxResults?: number\n /** Custom search function — overrides every other path. */\n search?: (query: string) => Promise<WebSearchResult[]>\n}\n\nconst URL_RE = /^https?:\\/\\//i\nconst SNIPPET_MAX = 600\n\nasync function serperSearch(query: string, apiKey: string, maxResults: number): Promise<WebSearchResult[]> {\n const response = await fetch('https://google.serper.dev/search', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-KEY': apiKey,\n },\n body: JSON.stringify({ q: query, num: maxResults }),\n })\n if (!response.ok) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Serper API error: ${response.status}`,\n })\n }\n\n const data = await response.json() as {\n organic?: Array<{ title?: string; link?: string; snippet?: string }>\n }\n\n return (data.organic ?? []).map(r => ({\n title: r.title ?? '',\n url: r.link ?? '',\n snippet: r.snippet ?? '',\n }))\n}\n\nasync function tavilySearch(query: string, apiKey: string, maxResults: number): Promise<WebSearchResult[]> {\n const response = await fetch('https://api.tavily.com/search', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ api_key: apiKey, query, max_results: maxResults, include_answer: false }),\n })\n if (!response.ok) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Tavily API error: ${response.status}`,\n })\n }\n\n const data = await response.json() as {\n results?: Array<{ title?: string; url?: string; content?: string }>\n }\n\n return (data.results ?? []).map(r => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.content ?? '',\n }))\n}\n\n/**\n * Unauthenticated DuckDuckGo HTML scrape. Best-effort; HTML format may\n * change at any time. Returns an empty array if parsing fails.\n */\nasync function duckDuckGoHtmlSearch(query: string, maxResults: number): Promise<WebSearchResult[]> {\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; AgentsKit/1.0)',\n 'Accept-Language': 'en-US,en;q=0.9',\n },\n })\n if (!response.ok) return []\n\n const html = await response.text()\n const results: WebSearchResult[] = []\n\n const itemRe = /<a[^>]*class=\"[^\"]*result__a[^\"]*\"[^>]*href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>[\\s\\S]*?<a[^>]*class=\"[^\"]*result__snippet[^\"]*\"[^>]*>([\\s\\S]*?)<\\/a>/g\n for (const match of html.matchAll(itemRe)) {\n if (results.length >= maxResults) break\n results.push({\n title: stripTags(match[2]).trim(),\n url: decodeDuckUrl(match[1]),\n snippet: stripTags(match[3]).trim().slice(0, SNIPPET_MAX),\n })\n }\n\n return results\n}\n\nfunction decodeDuckUrl(raw: string): string {\n const match = raw.match(/uddg=([^&]+)/)\n if (match) {\n try {\n return decodeURIComponent(match[1])\n } catch {\n // fall through\n }\n }\n return raw\n}\n\nfunction stripTags(html: string): string {\n let out = html\n let prev: string\n do {\n prev = out\n out = out.replace(/<[^<>]*>/g, '')\n } while (out !== prev)\n // Decode entities; `&amp;` last so `&amp;lt;` can't collapse into `<`.\n return out\n .replace(/&nbsp;/gi, ' ')\n .replace(/&quot;/gi, '\"')\n .replace(/&#0*39;/g, \"'\")\n .replace(/&apos;/gi, \"'\")\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&amp;/gi, '&')\n .replace(/\\s+/g, ' ')\n}\n\n/**\n * Final fallback: if the query looks like a URL, fetch it directly and\n * return the page title + a text snippet. Lets the tool still produce\n * something useful when every search backend is unavailable.\n * Model-controlled URLs go through {@link safeFetch} so the initial host\n * and every redirect hop are egress-gated (ADR-0010).\n */\nasync function fetchUrlAsResult(url: string): Promise<WebSearchResult[]> {\n try {\n const response = await safeFetch(url, {\n headers: { 'User-Agent': 'Mozilla/5.0 (compatible; AgentsKit/1.0)' },\n })\n if (!response.ok) return []\n const html = await response.text()\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n const title = titleMatch ? stripTags(titleMatch[1]).trim() : url\n const text = stripTags(html).slice(0, SNIPPET_MAX * 2)\n return [{ title, url, snippet: text }]\n } catch (err) {\n // Surface egress rejections as readable errors; other failures stay empty.\n if (err instanceof ToolError) throw err\n return []\n }\n}\n\nfunction resolveBackend(\n provider: WebSearchProvider,\n explicitApiKey: string | undefined,\n): { backend: WebSearchProvider; apiKey?: string } {\n if (provider !== 'auto') return { backend: provider, apiKey: explicitApiKey }\n\n const serperKey = explicitApiKey ?? process.env.SERPER_API_KEY\n if (serperKey) return { backend: 'serper', apiKey: serperKey }\n\n const tavilyKey = process.env.TAVILY_API_KEY\n if (tavilyKey) return { backend: 'tavily', apiKey: tavilyKey }\n\n return { backend: 'duckduckgo' }\n}\n\nexport function webSearch(config: WebSearchConfig = {}): ToolDefinition {\n const { provider = 'auto', apiKey, maxResults = 5, search } = config\n\n return {\n name: 'web_search',\n description:\n 'Search the web for information. Accepts a query or a URL. Returns titles, URLs, and snippets.',\n tags: ['web', 'search'],\n category: 'retrieval',\n schema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'The search query or URL' },\n },\n required: ['query'],\n },\n execute: async (args) => {\n const query = String(args.query ?? '').trim()\n if (!query) return 'Error: query is required'\n\n if (search) {\n const results = await search(query)\n return formatResults(results, query)\n }\n\n if (URL_RE.test(query)) {\n try {\n const direct = await fetchUrlAsResult(query)\n if (direct.length > 0) return formatResults(direct, query)\n } catch (err) {\n if (err instanceof ToolError) {\n return err.message.startsWith('Error:') ? err.message : `Error: ${err.message}`\n }\n throw err\n }\n }\n\n const { backend, apiKey: resolvedKey } = resolveBackend(provider, apiKey)\n\n // Explicit provider without the required key — surface an error instead\n // of silently falling through. Users who pinned a backend want to know.\n if (provider === 'serper' && !resolvedKey) {\n return 'Error: Serper provider requires apiKey (pass { apiKey } or set SERPER_API_KEY)'\n }\n if (provider === 'tavily' && !resolvedKey) {\n return 'Error: Tavily provider requires apiKey (pass { apiKey } or set TAVILY_API_KEY)'\n }\n\n try {\n let results: WebSearchResult[] = []\n if (backend === 'serper' && resolvedKey) {\n results = await serperSearch(query, resolvedKey, maxResults)\n } else if (backend === 'tavily' && resolvedKey) {\n results = await tavilySearch(query, resolvedKey, maxResults)\n } else {\n results = await duckDuckGoHtmlSearch(query, maxResults)\n }\n\n if (results.length > 0) return formatResults(results, query)\n } catch {\n // fall through\n }\n\n return `No results found for \"${query}\"`\n },\n }\n}\n\nfunction formatResults(results: WebSearchResult[], query: string): string {\n if (results.length === 0) return `No results found for \"${query}\"`\n return results\n .map((r, i) => `[${i + 1}] ${r.title}\\n${r.url}\\n${r.snippet}`)\n .join('\\n\\n')\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport { checkEgress } from './safe-fetch'\n\nexport interface FetchUrlConfig {\n /** Maximum bytes to read from the response body. Default: 200 KB. */\n maxBytes?: number\n /** Request timeout in ms. Default: 15000. */\n timeoutMs?: number\n /** Header value for `User-Agent`. Default: `AgentsKit/1.0`. */\n userAgent?: string\n /**\n * Allow requests to private/loopback/link-local addresses. Off by\n * default so an agent can't reach AWS IMDS (169.254.169.254), the\n * loopback interface, or internal RFC1918 services. Set true only\n * when the tool runs against a vetted internal target.\n */\n allowPrivateHosts?: boolean\n /**\n * Max redirects to follow. Each hop's resolved host is re-checked\n * against `allowPrivateHosts` to block redirect-based SSRF. Default 3.\n */\n maxRedirects?: number\n /**\n * Hostname allowlist. If set, every request (and every redirect hop)\n * must match a literal hostname in this list — overrides\n * `allowPrivateHosts`. Wildcards are not supported by design.\n */\n allowedHosts?: string[]\n}\n\nconst DEFAULT_MAX_BYTES = 200 * 1024\nconst DEFAULT_TIMEOUT_MS = 15_000\nconst DEFAULT_MAX_REDIRECTS = 3\n\n/** Decode a small set of HTML entities. `&amp;` is decoded last so a\n * double-encoded entity (`&amp;lt;`) can't be collapsed into a live `<`. */\nfunction decodeEntities(s: string): string {\n return s\n .replace(/&nbsp;/gi, ' ')\n .replace(/&quot;/gi, '\"')\n .replace(/&#0*39;/g, \"'\")\n .replace(/&apos;/gi, \"'\")\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&amp;/gi, '&')\n}\n\n/** Strip a tag pair repeatedly until stable, so a nested/overlapping\n * construct (`<scr<script>ipt>`) can't survive a single pass. */\nfunction stripPair(html: string, tag: string): string {\n const re = new RegExp(`<${tag}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/${tag}\\\\s*>`, 'gi')\n let prev: string\n do {\n prev = html\n html = html.replace(re, '')\n } while (html !== prev)\n return html\n}\n\nfunction stripHtml(html: string): string {\n let out = stripPair(html, 'script')\n out = stripPair(out, 'style')\n // Strip comments and tags in one loop until stable, so a construct\n // that re-forms a `<!--` or a `<tag>` after one pass can't survive.\n let prev: string\n do {\n prev = out\n // `(?:-->|$)` also drops an unterminated `<!--` (no closing `-->`).\n out = out.replace(/<!--[\\s\\S]*?(?:-->|$)/g, '').replace(/<[^<>]*>/g, ' ')\n } while (out !== prev)\n return decodeEntities(out).replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * Tool: fetch a URL and return its text content.\n *\n * - Enforces HTTPS/HTTP only (no file://, ftp://, etc).\n * - SSRF-gated: every hop's resolved host is checked against private /\n * loopback / link-local ranges and (when configured) an allowlist.\n * - Redirects are followed manually so the target host of each hop is\n * re-validated; the platform's automatic redirect is disabled.\n * - Caps response size via `maxBytes` so a huge page can't flood the\n * model's context window or blow memory.\n * - Strips HTML tags by default; set `raw: true` to get the body verbatim.\n */\nexport function fetchUrl(config: FetchUrlConfig = {}): ToolDefinition {\n const {\n maxBytes = DEFAULT_MAX_BYTES,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n userAgent = 'AgentsKit/1.0',\n allowPrivateHosts = false,\n maxRedirects = DEFAULT_MAX_REDIRECTS,\n allowedHosts,\n } = config\n\n return {\n name: 'fetch_url',\n description:\n 'Fetch the contents of a URL and return it as text. Use for reading docs, articles, or API responses.',\n tags: ['web', 'fetch'],\n category: 'retrieval',\n schema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'The URL to fetch (http or https)' },\n raw: {\n type: 'boolean',\n description: 'If true, return the response body without HTML stripping. Default: false.',\n },\n },\n required: ['url'],\n },\n execute: async (args) => {\n const input = String(args.url ?? '').trim()\n const raw = Boolean(args.raw)\n if (!input) return 'Error: url is required'\n\n let currentUrl = input\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n let response: Response | null = null\n let hops = 0\n while (hops <= maxRedirects) {\n let parsed: URL\n try {\n parsed = new URL(currentUrl)\n } catch {\n return `Error: invalid URL \"${currentUrl}\"`\n }\n const gateError = await checkEgress(parsed, { allowPrivateHosts, allowedHosts })\n if (gateError) return gateError\n\n const r = await fetch(currentUrl, {\n headers: { 'User-Agent': userAgent, 'Accept': 'text/html,text/plain,*/*' },\n signal: controller.signal,\n redirect: 'manual',\n })\n\n if (r.status >= 300 && r.status < 400) {\n const loc = r.headers.get('location')\n if (!loc) {\n response = r\n break\n }\n try {\n currentUrl = new URL(loc, currentUrl).toString()\n } catch {\n return `Error: invalid redirect target \"${loc}\"`\n }\n hops++\n if (hops > maxRedirects) {\n return `Error: exceeded maxRedirects (${maxRedirects})`\n }\n continue\n }\n response = r\n break\n }\n if (!response) return `Error: exceeded maxRedirects (${maxRedirects})`\n if (!response.ok) return `Error: ${response.status} ${response.statusText} for ${currentUrl}`\n\n const contentType = response.headers.get('content-type') ?? ''\n const reader = response.body?.getReader()\n if (!reader) return `Error: empty response body for ${currentUrl}`\n\n const chunks: Uint8Array[] = []\n let bytes = 0\n while (bytes < maxBytes) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n bytes += value.byteLength\n }\n try {\n await reader.cancel()\n } catch {\n // already closed\n }\n\n const body = new TextDecoder('utf-8').decode(concat(chunks, Math.min(bytes, maxBytes)))\n const isHtml = contentType.includes('html') || /<html[\\s>]/i.test(body)\n const text = raw || !isHtml ? body : stripHtml(body)\n const truncated = bytes >= maxBytes ? `\\n\\n[truncated at ${maxBytes} bytes]` : ''\n return `URL: ${currentUrl}\\nContent-Type: ${contentType || 'unknown'}\\n\\n${text}${truncated}`\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return `Error fetching ${currentUrl}: ${message}`\n } finally {\n clearTimeout(timer)\n }\n },\n }\n}\n\nfunction concat(chunks: Uint8Array[], totalBytes: number): Uint8Array {\n const out = new Uint8Array(totalBytes)\n let offset = 0\n for (const chunk of chunks) {\n const remaining = totalBytes - offset\n if (remaining <= 0) break\n const slice = chunk.byteLength <= remaining ? chunk : chunk.subarray(0, remaining)\n out.set(slice, offset)\n offset += slice.byteLength\n }\n return out\n}\n","import { isAbsolute, resolve, relative, sep } from 'node:path'\nimport { ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\n\nexport interface FilesystemConfig {\n basePath: string\n /**\n * When true, refuse to operate on symlinks at all (read, write,\n * list). Default true — symlinks inside basePath can target outside\n * the jail and would otherwise leak access. Set false only if you\n * trust the contents of basePath.\n */\n denySymlinks?: boolean\n}\n\nfunction isInside(base: string, target: string): boolean {\n if (base === target) return true\n const rel = relative(base, target)\n if (rel === '' || rel === '.') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n // On Windows, relative('C:\\\\base', 'D:\\\\other') returns 'D:\\\\other'.\n // isAbsolute already catches that.\n // Reject any '..' segment in the relative path (defensive).\n const parts = rel.split(sep)\n return !parts.includes('..')\n}\n\nfunction jailPath(basePath: string, inputPath: string): string {\n const resolved = resolve(basePath, inputPath)\n if (!isInside(basePath, resolved)) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `Access denied: \"${inputPath}\" is outside the allowed base path`,\n hint: 'Pass paths relative to the configured basePath; absolute paths and ../ traversal are rejected.',\n })\n }\n return resolved\n}\n\nasync function canonicalBase(basePath: string): Promise<string> {\n const fs = await import('node:fs/promises')\n try {\n return await fs.realpath(basePath)\n } catch {\n return basePath\n }\n}\n\nasync function realJailPath(\n basePath: string,\n inputPath: string,\n opts: { denySymlinks: boolean; mustExist: boolean },\n): Promise<string> {\n const fs = await import('node:fs/promises')\n const canonical = await canonicalBase(basePath)\n const initial = jailPath(canonical, inputPath)\n // Resolve symlinks to their real targets so a symlink whose target\n // sits outside the jail is rejected. For write-new-file calls the\n // leaf may not exist yet — fall back to checking the parent.\n let real: string\n try {\n real = await fs.realpath(initial)\n } catch (err) {\n if (opts.mustExist) throw err as Error\n // Walk up until we find an existing ancestor we can realpath; then\n // rejoin the trailing segments. Handles deep new-directory writes.\n const path = await import('node:path')\n const trailing: string[] = []\n let cursor = initial\n while (true) {\n trailing.unshift(path.basename(cursor))\n const parent = path.dirname(cursor)\n if (parent === cursor) {\n real = initial\n break\n }\n try {\n const parentReal = await fs.realpath(parent)\n real = resolve(parentReal, ...trailing)\n break\n } catch {\n cursor = parent\n }\n }\n }\n if (!isInside(canonical, real)) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `Access denied: \"${inputPath}\" resolves outside the allowed base path (symlink escape blocked)`,\n hint: 'A symlink inside basePath was pointing outside it. Move the target inside basePath or remove the symlink.',\n })\n }\n if (opts.denySymlinks) {\n try {\n const stat = await fs.lstat(initial)\n if (stat.isSymbolicLink()) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: `Access denied: \"${inputPath}\" is a symbolic link`,\n hint: 'Symlinks are disabled for this filesystem tool. Set denySymlinks:false to allow them.',\n })\n }\n } catch (err) {\n if (opts.mustExist) throw err as Error\n // leaf doesn't exist yet — fine\n }\n }\n return real\n}\n\nexport function filesystem(config: FilesystemConfig): ToolDefinition[] {\n const basePath = resolve(config.basePath)\n const denySymlinks = config.denySymlinks ?? true\n\n const readFile: ToolDefinition = {\n name: 'read_file',\n description: 'Read the contents of a file. Path is relative to the workspace.',\n tags: ['filesystem', 'read'],\n category: 'filesystem',\n schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to workspace' },\n },\n required: ['path'],\n },\n execute: async (args) => {\n const fs = await import('node:fs/promises')\n const filePath = await realJailPath(basePath, String(args.path ?? ''), {\n denySymlinks,\n mustExist: true,\n })\n return await fs.readFile(filePath, 'utf8')\n },\n }\n\n const writeFile: ToolDefinition = {\n name: 'write_file',\n description: 'Write content to a file. Creates the file if it does not exist. Path is relative to the workspace.',\n tags: ['filesystem', 'write'],\n category: 'filesystem',\n requiresConfirmation: true,\n schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to workspace' },\n content: { type: 'string', description: 'Content to write' },\n },\n required: ['path', 'content'],\n },\n execute: async (args) => {\n const fs = await import('node:fs/promises')\n const { dirname } = await import('node:path')\n const filePath = await realJailPath(basePath, String(args.path ?? ''), {\n denySymlinks,\n mustExist: false,\n })\n await fs.mkdir(dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, String(args.content ?? ''), 'utf8')\n return `Written to ${args.path}`\n },\n }\n\n const listDirectory: ToolDefinition = {\n name: 'list_directory',\n description: 'List files and directories at a path. Path is relative to the workspace.',\n tags: ['filesystem', 'read'],\n category: 'filesystem',\n schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path relative to workspace (default: root)' },\n },\n },\n execute: async (args) => {\n const fs = await import('node:fs/promises')\n const dirPath = await realJailPath(basePath, String(args.path ?? '.'), {\n denySymlinks,\n mustExist: true,\n })\n const entries = await fs.readdir(dirPath, { withFileTypes: true })\n return entries\n .map(e => `${e.isDirectory() ? '[dir] ' : ''}${e.name}`)\n .join('\\n')\n },\n }\n\n return [readFile, writeFile, listDirectory]\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type { ToolDefinition } from '@agentskit/core'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface ShellConfig {\n /** Per-command timeout in ms. Default 30s. */\n timeout?: number\n /**\n * Allowlist of permitted executables. **Required by default** —\n * leave unset only when explicitly opting into the open mode via\n * `allowAny:true`. Each entry is matched against the command's\n * first token (the executable name).\n */\n allowed?: string[]\n /**\n * Opt out of the allowlist requirement. When true, any executable is\n * permitted — use only for trusted, sandbox-wrapped contexts. Off by\n * default so a misconfigured agent cannot run arbitrary binaries.\n */\n allowAny?: boolean\n /** Cap on combined stdout/stderr per invocation. Default 1 MB. */\n maxOutput?: number\n /** Working directory passed to the child process. */\n cwd?: string\n /**\n * Environment for the child. Defaults to an empty object so secrets\n * in the parent process environment do not leak into the executed\n * command unless explicitly forwarded.\n */\n env?: NodeJS.ProcessEnv\n}\n\n// Shell metacharacters that enable command chaining, substitution, or\n// redirection. Reject any argument containing one — even an allowlisted\n// executable should not be invoked with these tokens because they\n// indicate the caller intended shell expansion, which is unavailable\n// under execFile.\nconst SHELL_METACHARS = /[;&|`$<>(){}[\\]!*?#~\\\\'\"\\n\\r]/\n\nfunction parseCommand(input: string): { argv: string[]; reason?: string } {\n const trimmed = input.trim()\n if (!trimmed) return { argv: [], reason: 'command is empty' }\n if (SHELL_METACHARS.test(trimmed)) {\n return { argv: [], reason: 'command contains shell metacharacters; shell expansion is not supported' }\n }\n // Whitespace-separated tokens. No quoting support by design — if you\n // need quoted args, build the array yourself in a custom tool.\n const argv = trimmed.split(/\\s+/)\n return { argv }\n}\n\nexport function shell(config: ShellConfig = {}): ToolDefinition {\n const {\n timeout = 30_000,\n allowed,\n allowAny = false,\n maxOutput = 1_000_000,\n cwd,\n env = {},\n } = config\n\n if (!allowed && !allowAny) {\n throw new Error(\n 'shell(): refusing to register with no `allowed` allowlist. Pass `allowed: [...]` or, only in trusted/sandboxed contexts, `allowAny: true`.',\n )\n }\n\n return {\n name: 'shell',\n description: 'Execute an executable directly (no shell). Returns stdout, stderr, and exit code. Shell metacharacters are rejected.',\n tags: ['shell', 'command'],\n category: 'execution',\n requiresConfirmation: true,\n schema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'The executable plus arguments, whitespace-separated. No shell metacharacters.' },\n },\n required: ['command'],\n },\n execute: async (args) => {\n const raw = String(args.command ?? '')\n const { argv, reason } = parseCommand(raw)\n if (reason) return `Error: ${reason}`\n if (argv.length === 0) return 'Error: command is required'\n\n const [bin, ...rest] = argv as [string, ...string[]]\n if (allowed && !allowed.includes(bin)) {\n return `Error: command \"${bin}\" is not allowed. Allowed: ${allowed.join(', ')}`\n }\n\n try {\n const { stdout, stderr } = await execFileAsync(bin, rest, {\n timeout,\n maxBuffer: maxOutput,\n encoding: 'utf8',\n cwd,\n env,\n shell: false,\n windowsHide: true,\n })\n return `${stdout}${stderr ? `\\n[stderr] ${stderr}` : ''}\\n[exit code: 0]`\n } catch (err: unknown) {\n const error = err as {\n code?: number | string\n status?: number\n stdout?: string\n stderr?: string\n killed?: boolean\n signal?: string\n }\n const stdout = error.stdout ?? ''\n const stderr = error.stderr ? `[stderr] ${error.stderr}` : ''\n const output = [stdout, stderr].filter(Boolean).join('\\n')\n\n if (error.killed || error.signal === 'SIGTERM') {\n return `${output}\\n[killed: command timed out after ${timeout}ms]`\n }\n\n const exitCode = typeof error.code === 'number' ? error.code : error.status ?? -1\n return `${output}\\n[exit code: ${exitCode}]`\n }\n },\n }\n}\n","import type { ToolDefinition } from '@agentskit/core'\nimport type { JSONSchema7 } from 'json-schema'\nimport { webSearch } from './web-search'\nimport { fetchUrl } from './fetch-url'\nimport { filesystem } from './filesystem'\nimport { shell } from './shell'\n\nexport interface ToolMetadata {\n name: string\n description: string\n tags: string[]\n category: string\n schema: JSONSchema7\n}\n\nfunction extractMetadata(tool: ToolDefinition): ToolMetadata {\n return {\n name: tool.name,\n description: tool.description ?? '',\n tags: tool.tags ?? [],\n category: tool.category ?? '',\n schema: (tool.schema ?? { type: 'object' }) as JSONSchema7,\n }\n}\n\nexport function listTools(): ToolMetadata[] {\n // Instantiate tools with safe defaults to extract their metadata\n const tools: ToolDefinition[] = [\n webSearch(),\n fetchUrl(),\n ...filesystem({ basePath: process.cwd() }),\n shell({ allowed: [] }),\n ]\n\n return tools.map(extractMetadata)\n}\n","import type { ToolDefinition, ToolExecutionContext, MaybePromise } from '@agentskit/core'\nimport type { JSONSchema7 } from 'json-schema'\n\n// ---------------------------------------------------------------------------\n// Minimal Zod type contract — avoids hard dependency on zod\n// ---------------------------------------------------------------------------\n\n/** Minimal shape of a Zod schema so we can infer its output type. */\ninterface ZodLike<T = unknown> {\n parse: (data: unknown) => T\n _output: T\n}\n\n/** Extract the output type from a Zod-like schema. */\ntype InferZodOutput<T> = T extends ZodLike<infer O> ? O : never\n\n// ---------------------------------------------------------------------------\n// defineZodTool — Zod-based tool definition with automatic type inference\n// ---------------------------------------------------------------------------\n\nexport interface DefineZodToolConfig<TSchema extends ZodLike> {\n name: string\n description?: string\n schema: TSchema\n /**\n * Convert the Zod schema to JSON Schema.\n * Users must supply this themselves (e.g. via `zod-to-json-schema`),\n * keeping the zod dependency entirely optional.\n */\n toJsonSchema?: (schema: TSchema) => JSONSchema7\n requiresConfirmation?: boolean\n execute?: (\n args: InferZodOutput<TSchema>,\n context: ToolExecutionContext,\n ) => MaybePromise<unknown> | AsyncIterable<unknown>\n init?: () => MaybePromise<void>\n dispose?: () => MaybePromise<void>\n tags?: string[]\n category?: string\n}\n\n/**\n * Create a ToolDefinition whose execute args are typed from a Zod schema.\n *\n * Zod is NOT bundled — pass it as a peer dependency. The `toJsonSchema`\n * callback lets you convert the Zod schema to JSON Schema for the adapter\n * (e.g. using `zod-to-json-schema`).\n *\n * @example\n * ```ts\n * import { z } from 'zod'\n * import { zodToJsonSchema } from 'zod-to-json-schema'\n * import { defineZodTool } from '@agentskit/tools'\n *\n * const weatherTool = defineZodTool({\n * name: 'weather',\n * description: 'Get weather for a city',\n * schema: z.object({ city: z.string(), units: z.enum(['C', 'F']).optional() }),\n * toJsonSchema: (s) => zodToJsonSchema(s) as JSONSchema7,\n * execute: (args) => {\n * // args.city is string, args.units is 'C' | 'F' | undefined\n * return `Weather in ${args.city}: 22${args.units ?? 'C'}`\n * },\n * })\n * ```\n */\nexport function defineZodTool<TSchema extends ZodLike>(\n config: DefineZodToolConfig<TSchema>,\n): ToolDefinition<InferZodOutput<TSchema>> {\n const { schema, toJsonSchema, execute, ...rest } = config\n\n const jsonSchema = toJsonSchema ? toJsonSchema(schema) : undefined\n\n const wrappedExecute = execute\n ? (args: InferZodOutput<TSchema>, context: ToolExecutionContext) => {\n // Runtime validation via Zod\n const parsed = schema.parse(args) as InferZodOutput<TSchema>\n return execute(parsed, context)\n }\n : undefined\n\n return {\n ...rest,\n schema: jsonSchema,\n execute: wrappedExecute,\n } as ToolDefinition<InferZodOutput<TSchema>>\n}\n","import { ConfigError, ErrorCodes, ToolError } from '@agentskit/core'\nimport type { ToolDefinition } from '@agentskit/core'\n\nexport interface SqliteQueryConfig {\n path: string\n /** Reserved for v2; only `true` is accepted today. */\n readOnly?: true\n /** Max rows returned. Defaults to 100. */\n maxRows?: number\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n all(...args: unknown[]): Record<string, unknown>[]\n readonly?: boolean\n }\n pragma(source: string): unknown\n close(): void\n}\n\ninterface SqliteCtor {\n new (path: string, options?: { readonly?: boolean; fileMustExist?: boolean }): SqliteDb\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = (mod.default ?? mod) as unknown as SqliteCtor\n const db = new Database(path, { readonly: true })\n db.pragma('query_only = ON')\n return db\n } catch {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_PEER_MISSING,\n message: 'Install better-sqlite3 to use sqliteQueryTool: npm install better-sqlite3',\n })\n }\n}\n\nconst WRITE_KEYWORDS = /\\b(?:insert|update|delete|drop|create|alter|attach|detach|replace|reindex|vacuum|pragma)\\b/i\n\nexport function sqliteQueryTool(config: SqliteQueryConfig): ToolDefinition {\n if (config.readOnly !== undefined && config.readOnly !== true) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'sqliteQueryTool: writes are not supported in v1 (readOnly must be true).',\n })\n }\n const maxRows = config.maxRows ?? 100\n let dbPromise: Promise<SqliteDb> | null = null\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) dbPromise = openDatabase(config.path)\n return dbPromise\n }\n\n return {\n name: 'sqlite_query',\n description: 'Run a read-only SQL query against a local SQLite database. Returns up to 100 rows.',\n tags: ['sqlite', 'sql', 'database', 'read'],\n category: 'database',\n schema: {\n type: 'object',\n properties: {\n sql: { type: 'string', description: 'A single SELECT-style SQL statement.' },\n },\n required: ['sql'],\n },\n execute: async (args) => {\n const sql = String(args.sql ?? '').trim()\n if (!sql) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'sqlite_query: missing sql argument',\n })\n }\n if (WRITE_KEYWORDS.test(sql)) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'sqlite_query: only read-only SELECT-style statements are allowed',\n })\n }\n const db = await getDb()\n const stmt = db.prepare(sql)\n const rows = stmt.all() as Record<string, unknown>[]\n const truncated = rows.length > maxRows\n return {\n rows: truncated ? rows.slice(0, maxRows) : rows,\n rowCount: rows.length,\n truncated,\n }\n },\n }\n}\n","import { ConfigError, ErrorCodes, ToolError } from '@agentskit/core'\nimport { composeTimeoutSignal } from '@agentskit/integrations'\nimport type { ToolDefinition } from '@agentskit/core'\n\nexport interface SlackToolConfig {\n webhookUrl: string\n /** Override fetch (mainly for tests). Defaults to the global `fetch`. */\n fetch?: typeof fetch\n timeoutMs?: number\n signal?: AbortSignal\n}\n\nexport function slackTool(config: SlackToolConfig): ToolDefinition {\n if (!config.webhookUrl) {\n throw new ConfigError({\n code: ErrorCodes.AK_CONFIG_INVALID,\n message: 'slackTool: webhookUrl is required',\n })\n }\n const doFetch = config.fetch ?? fetch\n\n return {\n name: 'slack_send',\n description: 'Send a message to a Slack channel via an Incoming Webhook.',\n tags: ['slack', 'notify', 'webhook'],\n category: 'notification',\n requiresConfirmation: true,\n schema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Message text. Slack mrkdwn is supported.' },\n channel: { type: 'string', description: 'Channel override (only honored if your webhook allows it).' },\n username: { type: 'string', description: 'Username override (only honored if your webhook allows it).' },\n },\n required: ['text'],\n },\n execute: async (args) => {\n const text = String(args.text ?? '').trim()\n if (!text) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: 'slack_send: missing text',\n })\n }\n const payload: Record<string, string> = { text }\n if (typeof args.channel === 'string' && args.channel) payload.channel = args.channel\n if (typeof args.username === 'string' && args.username) payload.username = args.username\n\n const { signal, cleanup } = composeTimeoutSignal(config.timeoutMs ?? 20_000, config.signal)\n try {\n const response = await doFetch(config.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal,\n redirect: 'error',\n })\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `slack_send: HTTP ${response.status} ${response.statusText}: ${body.slice(0, 200)}`,\n hint: 'Verify the webhook URL and Slack channel configuration.',\n })\n }\n return { ok: true, status: response.status }\n } finally {\n cleanup()\n }\n },\n }\n}\n"]}

@@ -13,2 +13,4 @@ 'use strict';

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -38,2 +40,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -52,3 +56,3 @@ };

function cfg3(config) {
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -70,2 +74,4 @@ function linearSearchIssues(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -89,2 +95,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -102,2 +110,4 @@ };

config: { webhook: { webhookUrl: config.webhookUrl, headers: config.headers, timeoutMs: config.timeoutMs } },
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -143,2 +153,4 @@ }).find((t) => t.name === "teams_send_webhook");

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -198,2 +210,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -212,3 +226,3 @@ };

function cfg8(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -515,2 +529,4 @@ function stripeCreateCustomer(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -535,2 +551,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -555,2 +573,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -575,2 +595,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -589,3 +611,3 @@ };

function cfg13(config) {
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -602,3 +624,3 @@ function figmaGetFile(config) {

function cfg14(config) {
return { credential: config.apiKey, baseUrl: config.baseUrl, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, baseUrl: config.baseUrl, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -615,3 +637,3 @@ function linearTriageList(config) {

function cfg15(config) {
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -633,2 +655,4 @@ function hubspotSearchContacts(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -652,2 +676,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -683,2 +709,4 @@ };

},
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -696,2 +724,4 @@ };

config: { routingKey: config.routingKey, apiToken: config.apiToken, baseUrl: config.baseUrl, timeoutMs: config.timeoutMs },
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -971,3 +1001,3 @@ };

function cfg20(config) {
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -984,3 +1014,3 @@ function firecrawlScrape(config) {

function cfg21(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1085,3 +1115,3 @@ function readerFetch(config = {}) {

function cfg22(config) {
return { credential: config.apiKey, config: { model: config.model }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, config: { model: config.model }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1095,3 +1125,3 @@ function openaiImagesGenerate(config) {

function cfg23(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1263,3 +1293,10 @@ function elevenlabsTts(config) {

var gatedAudioFetch = (input, init) => {
const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
let url;
if (typeof input === "string") {
url = input;
} else if (input instanceof URL) {
url = input.href;
} else {
url = input.url;
}
return safeFetch(url, init ?? {});

@@ -1270,2 +1307,4 @@ };

config: { apiKey: config.apiKey, model: config.model, baseUrl: config.baseUrl, headers: config.headers },
retry: config.retry,
signal: config.signal,
fetch: config.fetch,

@@ -1282,3 +1321,3 @@ fetchUntrusted: config.fetchUntrusted ?? gatedAudioFetch

function cfg25(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1296,2 +1335,4 @@ function deepgramTranscribe(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -1310,3 +1351,3 @@ };

function cfg27(config) {
return { config: { apiKey: config.apiKey }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { config: { apiKey: config.apiKey }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1324,2 +1365,4 @@ function weatherCurrent(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -1438,2 +1481,14 @@ };

});
Object.defineProperty(exports, "bindHttp", {
enumerable: true,
get: function () { return integrations.bindHttp; }
});
Object.defineProperty(exports, "composeTimeoutSignal", {
enumerable: true,
get: function () { return integrations.composeTimeoutSignal; }
});
Object.defineProperty(exports, "httpJson", {
enumerable: true,
get: function () { return integrations.httpJson; }
});
Object.defineProperty(exports, "messageCard", {

@@ -1440,0 +1495,0 @@ enumerable: true,

import * as _agentskit_core from '@agentskit/core';
import { ToolDefinition } from '@agentskit/core';
import { TeamsBotClient, EmailConfig } from '@agentskit/integrations';
export { EmailAttachment, EmailConfig, EmailMessage, EmailSendMessage, EmailSendResult, EmailTransport, ImapClient, ImapFetchOptions, TeamsAdaptiveCard, TeamsAdaptiveCardAction, TeamsBotClient, TeamsBotMessage, TeamsBotSendResult, TeamsMessageCard, adaptiveCard, messageCard, verifyStripeSignature } from '@agentskit/integrations';
import { HttpToolOptions, TeamsBotClient, EmailConfig } from '@agentskit/integrations';
export { EmailAttachment, EmailConfig, EmailMessage, EmailSendMessage, EmailSendResult, EmailTransport, HttpJsonRequest, HttpToolOptions, ImapClient, ImapFetchOptions, IntegrationHttp, RetryPolicy, TeamsAdaptiveCard, TeamsAdaptiveCardAction, TeamsBotClient, TeamsBotMessage, TeamsBotSendResult, TeamsMessageCard, adaptiveCard, bindHttp, composeTimeoutSignal, httpJson, messageCard, verifyStripeSignature } from '@agentskit/integrations';
interface HttpToolOptions {
baseUrl?: string;
/** Header bag merged into every request (auth, user-agent, etc.). */
headers?: Record<string, string>;
/** Per-request timeout in ms. Default 20_000. */
timeoutMs?: number;
/** Swap in a fake for tests. */
fetch?: typeof globalThis.fetch;
}
interface HttpJsonRequest {
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
path: string;
query?: Record<string, string | number | undefined>;
body?: unknown;
headers?: Record<string, string>;
}
/** @deprecated Moved to `@agentskit/integrations` (services/github). */

@@ -424,3 +407,3 @@ interface GitHubConfig extends HttpToolOptions {

/** @deprecated Moved to `@agentskit/integrations` (services/twilio). */
interface TwilioConfig {
interface TwilioConfig extends HttpToolOptions {
accountSid: string;

@@ -775,4 +758,4 @@ authToken: string;

declare function browserFill(config: BrowserAgentConfig): _agentskit_core.ToolDefinition<{
selector: string;
value: string;
selector: string;
} & {}>;

@@ -791,4 +774,4 @@ declare function browserRead(config: BrowserAgentConfig): _agentskit_core.ToolDefinition<{

} & {}> | _agentskit_core.ToolDefinition<{
selector: string;
value: string;
selector: string;
} & {}> | _agentskit_core.ToolDefinition<{

@@ -800,2 +783,2 @@ selector: string;

export { type AirtableConfig, type BrowserAgentConfig, type BrowserPage, type CdcAdminClient, type CdcChangeEvent, type CdcOp, type CdcSlotStatus, type CdcStreamClient, type CdcStreamOptions, type CloudflareR2Config, type CoinGeckoConfig, type ConfluenceConfig, type DeepgramConfig, type DiscordConfig, type DocumentParserFns, type DocumentParsersConfig, type ElevenLabsConfig, type FigmaConfig, type FirecrawlConfig, type GitHubActionsConfig, type GitHubConfig, type GmailConfig, type GoogleCalendarConfig, type HttpJsonRequest, type HttpToolOptions, type HubspotConfig, type JiraConfig, type LinearConfig, type LinearTriageConfig, type MapsConfig, type NotionConfig, type OpenAIImagesConfig, type PagerDutyConfig, type PostgresCdcConfig, type PostgresConfig, type PostgresExecuteResult, type PostgresRolesConfig, type R2ClientLike, type ReaderConfig, type S3Client, type S3Config, type SentryConfig, type ShopifyConfig, type SlackConfig, type StripeConfig, type StripeWebhookConfig, type TeamsBotConfig, type TeamsConfig, type TeamsWebhookConfig, type TwilioConfig, type WeatherConfig, type WhisperConfig, airtable, airtableCreateRecord, airtableListRecords, browserAgent, browserClick, browserFill, browserGoto, browserRead, browserScreenshot, browserWait, calendarCreateEvent, calendarListEvents, cloudflareR2, cloudflareR2Delete, cloudflareR2Get, cloudflareR2List, cloudflareR2Put, cloudflareR2SignedUrl, coingecko, coingeckoMarketChart, coingeckoPrice, confluence, confluenceCreatePage, confluenceSearch, createCdcStream, deepgram, deepgramTranscribe, discord, discordPostMessage, documentParsers, elevenlabs, elevenlabsTts, email, emailFetch, emailSend, figma, figmaExportImages, figmaGetFile, firecrawl, firecrawlCrawl, firecrawlScrape, github, githubActions, githubActionsDispatch, githubActionsListRuns, githubCommentIssue, githubCreateIssue, githubSearchIssues, gmail, gmailListMessages, gmailSendEmail, googleCalendar, hubspot, hubspotCreateDeal, hubspotSearchContacts, jira, jiraCreateIssue, jiraSearchIssues, linear, linearCreateIssue, linearSearchIssues, linearTriage, linearTriageAssign, linearTriageList, maps, mapsGeocode, mapsReverseGeocode, notion, notionCreatePage, notionSearch, openaiImages, openaiImagesGenerate, pagerduty, pagerdutyAcknowledge, pagerdutyOncall, pagerdutyResolve, pagerdutyTrigger, parseDocx, parsePdf, parseXlsx, postgres, postgresCdc, postgresCdcAdvance, postgresCdcCreateSlot, postgresCdcDropSlot, postgresCdcPeek, postgresCdcStatus, postgresQuery, postgresWithRoles, reader, readerFetch, s3, s3GetObject, s3ListObjects, s3PutObject, sentry, sentryResolveIssue, sentrySearchIssues, shopify, shopifyListOrders, shopifySearchProducts, slack, slackPostMessage, slackSearch, stripe, stripeCreateCustomer, stripeCreatePaymentIntent, stripeWebhookTool, teams, teamsSendBot, teamsSendWebhook, twilio, twilioSendSms, weather, weatherCurrent, whisper, whisperTranscribe };
export { type AirtableConfig, type BrowserAgentConfig, type BrowserPage, type CdcAdminClient, type CdcChangeEvent, type CdcOp, type CdcSlotStatus, type CdcStreamClient, type CdcStreamOptions, type CloudflareR2Config, type CoinGeckoConfig, type ConfluenceConfig, type DeepgramConfig, type DiscordConfig, type DocumentParserFns, type DocumentParsersConfig, type ElevenLabsConfig, type FigmaConfig, type FirecrawlConfig, type GitHubActionsConfig, type GitHubConfig, type GmailConfig, type GoogleCalendarConfig, type HubspotConfig, type JiraConfig, type LinearConfig, type LinearTriageConfig, type MapsConfig, type NotionConfig, type OpenAIImagesConfig, type PagerDutyConfig, type PostgresCdcConfig, type PostgresConfig, type PostgresExecuteResult, type PostgresRolesConfig, type R2ClientLike, type ReaderConfig, type S3Client, type S3Config, type SentryConfig, type ShopifyConfig, type SlackConfig, type StripeConfig, type StripeWebhookConfig, type TeamsBotConfig, type TeamsConfig, type TeamsWebhookConfig, type TwilioConfig, type WeatherConfig, type WhisperConfig, airtable, airtableCreateRecord, airtableListRecords, browserAgent, browserClick, browserFill, browserGoto, browserRead, browserScreenshot, browserWait, calendarCreateEvent, calendarListEvents, cloudflareR2, cloudflareR2Delete, cloudflareR2Get, cloudflareR2List, cloudflareR2Put, cloudflareR2SignedUrl, coingecko, coingeckoMarketChart, coingeckoPrice, confluence, confluenceCreatePage, confluenceSearch, createCdcStream, deepgram, deepgramTranscribe, discord, discordPostMessage, documentParsers, elevenlabs, elevenlabsTts, email, emailFetch, emailSend, figma, figmaExportImages, figmaGetFile, firecrawl, firecrawlCrawl, firecrawlScrape, github, githubActions, githubActionsDispatch, githubActionsListRuns, githubCommentIssue, githubCreateIssue, githubSearchIssues, gmail, gmailListMessages, gmailSendEmail, googleCalendar, hubspot, hubspotCreateDeal, hubspotSearchContacts, jira, jiraCreateIssue, jiraSearchIssues, linear, linearCreateIssue, linearSearchIssues, linearTriage, linearTriageAssign, linearTriageList, maps, mapsGeocode, mapsReverseGeocode, notion, notionCreatePage, notionSearch, openaiImages, openaiImagesGenerate, pagerduty, pagerdutyAcknowledge, pagerdutyOncall, pagerdutyResolve, pagerdutyTrigger, parseDocx, parsePdf, parseXlsx, postgres, postgresCdc, postgresCdcAdvance, postgresCdcCreateSlot, postgresCdcDropSlot, postgresCdcPeek, postgresCdcStatus, postgresQuery, postgresWithRoles, reader, readerFetch, s3, s3GetObject, s3ListObjects, s3PutObject, sentry, sentryResolveIssue, sentrySearchIssues, shopify, shopifyListOrders, shopifySearchProducts, slack, slackPostMessage, slackSearch, stripe, stripeCreateCustomer, stripeCreatePaymentIntent, stripeWebhookTool, teams, teamsSendBot, teamsSendWebhook, twilio, twilioSendSms, weather, weatherCurrent, whisper, whisperTranscribe };
import * as _agentskit_core from '@agentskit/core';
import { ToolDefinition } from '@agentskit/core';
import { TeamsBotClient, EmailConfig } from '@agentskit/integrations';
export { EmailAttachment, EmailConfig, EmailMessage, EmailSendMessage, EmailSendResult, EmailTransport, ImapClient, ImapFetchOptions, TeamsAdaptiveCard, TeamsAdaptiveCardAction, TeamsBotClient, TeamsBotMessage, TeamsBotSendResult, TeamsMessageCard, adaptiveCard, messageCard, verifyStripeSignature } from '@agentskit/integrations';
import { HttpToolOptions, TeamsBotClient, EmailConfig } from '@agentskit/integrations';
export { EmailAttachment, EmailConfig, EmailMessage, EmailSendMessage, EmailSendResult, EmailTransport, HttpJsonRequest, HttpToolOptions, ImapClient, ImapFetchOptions, IntegrationHttp, RetryPolicy, TeamsAdaptiveCard, TeamsAdaptiveCardAction, TeamsBotClient, TeamsBotMessage, TeamsBotSendResult, TeamsMessageCard, adaptiveCard, bindHttp, composeTimeoutSignal, httpJson, messageCard, verifyStripeSignature } from '@agentskit/integrations';
interface HttpToolOptions {
baseUrl?: string;
/** Header bag merged into every request (auth, user-agent, etc.). */
headers?: Record<string, string>;
/** Per-request timeout in ms. Default 20_000. */
timeoutMs?: number;
/** Swap in a fake for tests. */
fetch?: typeof globalThis.fetch;
}
interface HttpJsonRequest {
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
path: string;
query?: Record<string, string | number | undefined>;
body?: unknown;
headers?: Record<string, string>;
}
/** @deprecated Moved to `@agentskit/integrations` (services/github). */

@@ -424,3 +407,3 @@ interface GitHubConfig extends HttpToolOptions {

/** @deprecated Moved to `@agentskit/integrations` (services/twilio). */
interface TwilioConfig {
interface TwilioConfig extends HttpToolOptions {
accountSid: string;

@@ -775,4 +758,4 @@ authToken: string;

declare function browserFill(config: BrowserAgentConfig): _agentskit_core.ToolDefinition<{
selector: string;
value: string;
selector: string;
} & {}>;

@@ -791,4 +774,4 @@ declare function browserRead(config: BrowserAgentConfig): _agentskit_core.ToolDefinition<{

} & {}> | _agentskit_core.ToolDefinition<{
selector: string;
value: string;
selector: string;
} & {}> | _agentskit_core.ToolDefinition<{

@@ -800,2 +783,2 @@ selector: string;

export { type AirtableConfig, type BrowserAgentConfig, type BrowserPage, type CdcAdminClient, type CdcChangeEvent, type CdcOp, type CdcSlotStatus, type CdcStreamClient, type CdcStreamOptions, type CloudflareR2Config, type CoinGeckoConfig, type ConfluenceConfig, type DeepgramConfig, type DiscordConfig, type DocumentParserFns, type DocumentParsersConfig, type ElevenLabsConfig, type FigmaConfig, type FirecrawlConfig, type GitHubActionsConfig, type GitHubConfig, type GmailConfig, type GoogleCalendarConfig, type HttpJsonRequest, type HttpToolOptions, type HubspotConfig, type JiraConfig, type LinearConfig, type LinearTriageConfig, type MapsConfig, type NotionConfig, type OpenAIImagesConfig, type PagerDutyConfig, type PostgresCdcConfig, type PostgresConfig, type PostgresExecuteResult, type PostgresRolesConfig, type R2ClientLike, type ReaderConfig, type S3Client, type S3Config, type SentryConfig, type ShopifyConfig, type SlackConfig, type StripeConfig, type StripeWebhookConfig, type TeamsBotConfig, type TeamsConfig, type TeamsWebhookConfig, type TwilioConfig, type WeatherConfig, type WhisperConfig, airtable, airtableCreateRecord, airtableListRecords, browserAgent, browserClick, browserFill, browserGoto, browserRead, browserScreenshot, browserWait, calendarCreateEvent, calendarListEvents, cloudflareR2, cloudflareR2Delete, cloudflareR2Get, cloudflareR2List, cloudflareR2Put, cloudflareR2SignedUrl, coingecko, coingeckoMarketChart, coingeckoPrice, confluence, confluenceCreatePage, confluenceSearch, createCdcStream, deepgram, deepgramTranscribe, discord, discordPostMessage, documentParsers, elevenlabs, elevenlabsTts, email, emailFetch, emailSend, figma, figmaExportImages, figmaGetFile, firecrawl, firecrawlCrawl, firecrawlScrape, github, githubActions, githubActionsDispatch, githubActionsListRuns, githubCommentIssue, githubCreateIssue, githubSearchIssues, gmail, gmailListMessages, gmailSendEmail, googleCalendar, hubspot, hubspotCreateDeal, hubspotSearchContacts, jira, jiraCreateIssue, jiraSearchIssues, linear, linearCreateIssue, linearSearchIssues, linearTriage, linearTriageAssign, linearTriageList, maps, mapsGeocode, mapsReverseGeocode, notion, notionCreatePage, notionSearch, openaiImages, openaiImagesGenerate, pagerduty, pagerdutyAcknowledge, pagerdutyOncall, pagerdutyResolve, pagerdutyTrigger, parseDocx, parsePdf, parseXlsx, postgres, postgresCdc, postgresCdcAdvance, postgresCdcCreateSlot, postgresCdcDropSlot, postgresCdcPeek, postgresCdcStatus, postgresQuery, postgresWithRoles, reader, readerFetch, s3, s3GetObject, s3ListObjects, s3PutObject, sentry, sentryResolveIssue, sentrySearchIssues, shopify, shopifyListOrders, shopifySearchProducts, slack, slackPostMessage, slackSearch, stripe, stripeCreateCustomer, stripeCreatePaymentIntent, stripeWebhookTool, teams, teamsSendBot, teamsSendWebhook, twilio, twilioSendSms, weather, weatherCurrent, whisper, whisperTranscribe };
export { type AirtableConfig, type BrowserAgentConfig, type BrowserPage, type CdcAdminClient, type CdcChangeEvent, type CdcOp, type CdcSlotStatus, type CdcStreamClient, type CdcStreamOptions, type CloudflareR2Config, type CoinGeckoConfig, type ConfluenceConfig, type DeepgramConfig, type DiscordConfig, type DocumentParserFns, type DocumentParsersConfig, type ElevenLabsConfig, type FigmaConfig, type FirecrawlConfig, type GitHubActionsConfig, type GitHubConfig, type GmailConfig, type GoogleCalendarConfig, type HubspotConfig, type JiraConfig, type LinearConfig, type LinearTriageConfig, type MapsConfig, type NotionConfig, type OpenAIImagesConfig, type PagerDutyConfig, type PostgresCdcConfig, type PostgresConfig, type PostgresExecuteResult, type PostgresRolesConfig, type R2ClientLike, type ReaderConfig, type S3Client, type S3Config, type SentryConfig, type ShopifyConfig, type SlackConfig, type StripeConfig, type StripeWebhookConfig, type TeamsBotConfig, type TeamsConfig, type TeamsWebhookConfig, type TwilioConfig, type WeatherConfig, type WhisperConfig, airtable, airtableCreateRecord, airtableListRecords, browserAgent, browserClick, browserFill, browserGoto, browserRead, browserScreenshot, browserWait, calendarCreateEvent, calendarListEvents, cloudflareR2, cloudflareR2Delete, cloudflareR2Get, cloudflareR2List, cloudflareR2Put, cloudflareR2SignedUrl, coingecko, coingeckoMarketChart, coingeckoPrice, confluence, confluenceCreatePage, confluenceSearch, createCdcStream, deepgram, deepgramTranscribe, discord, discordPostMessage, documentParsers, elevenlabs, elevenlabsTts, email, emailFetch, emailSend, figma, figmaExportImages, figmaGetFile, firecrawl, firecrawlCrawl, firecrawlScrape, github, githubActions, githubActionsDispatch, githubActionsListRuns, githubCommentIssue, githubCreateIssue, githubSearchIssues, gmail, gmailListMessages, gmailSendEmail, googleCalendar, hubspot, hubspotCreateDeal, hubspotSearchContacts, jira, jiraCreateIssue, jiraSearchIssues, linear, linearCreateIssue, linearSearchIssues, linearTriage, linearTriageAssign, linearTriageList, maps, mapsGeocode, mapsReverseGeocode, notion, notionCreatePage, notionSearch, openaiImages, openaiImagesGenerate, pagerduty, pagerdutyAcknowledge, pagerdutyOncall, pagerdutyResolve, pagerdutyTrigger, parseDocx, parsePdf, parseXlsx, postgres, postgresCdc, postgresCdcAdvance, postgresCdcCreateSlot, postgresCdcDropSlot, postgresCdcPeek, postgresCdcStatus, postgresQuery, postgresWithRoles, reader, readerFetch, s3, s3GetObject, s3ListObjects, s3PutObject, sentry, sentryResolveIssue, sentrySearchIssues, shopify, shopifyListOrders, shopifySearchProducts, slack, slackPostMessage, slackSearch, stripe, stripeCreateCustomer, stripeCreatePaymentIntent, stripeWebhookTool, teams, teamsSendBot, teamsSendWebhook, twilio, twilioSendSms, weather, weatherCurrent, whisper, whisperTranscribe };
import { safeFetch } from './chunk-6MONKY64.js';
import './chunk-YLJ4XMA6.js';
import { toToolDefinitions, githubIntegration, slackIntegration, linearIntegration, notionIntegration, discordIntegration, gmailIntegration, googleCalendarIntegration, stripeIntegration, jiraIntegration, confluenceIntegration, githubActionsIntegration, sentryIntegration, figmaIntegration, linearTriageIntegration, hubspotIntegration, airtableIntegration, shopifyIntegration, twilioIntegration, verifyStripeSignature, firecrawlIntegration, readerIntegration, openaiImagesIntegration, elevenlabsIntegration, whisperIntegration, deepgramIntegration, mapsIntegration, weatherIntegration, coingeckoIntegration, teamsIntegration, emailIntegration, pagerdutyIntegration } from '@agentskit/integrations';
export { adaptiveCard, messageCard, verifyStripeSignature } from '@agentskit/integrations';
export { adaptiveCard, bindHttp, composeTimeoutSignal, httpJson, messageCard, verifyStripeSignature } from '@agentskit/integrations';
import { ConfigError, ErrorCodes, defineTool, ToolError } from '@agentskit/core';

@@ -13,2 +13,4 @@

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -38,2 +40,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -52,3 +56,3 @@ };

function cfg3(config) {
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -70,2 +74,4 @@ function linearSearchIssues(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -89,2 +95,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -102,2 +110,4 @@ };

config: { webhook: { webhookUrl: config.webhookUrl, headers: config.headers, timeoutMs: config.timeoutMs } },
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -143,2 +153,4 @@ }).find((t) => t.name === "teams_send_webhook");

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -198,2 +210,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -212,3 +226,3 @@ };

function cfg8(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -515,2 +529,4 @@ function stripeCreateCustomer(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -535,2 +551,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -555,2 +573,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -575,2 +595,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -589,3 +611,3 @@ };

function cfg13(config) {
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -602,3 +624,3 @@ function figmaGetFile(config) {

function cfg14(config) {
return { credential: config.apiKey, baseUrl: config.baseUrl, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, baseUrl: config.baseUrl, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -615,3 +637,3 @@ function linearTriageList(config) {

function cfg15(config) {
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.accessToken, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -633,2 +655,4 @@ function hubspotSearchContacts(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -652,2 +676,4 @@ };

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -683,2 +709,4 @@ };

},
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -696,2 +724,4 @@ };

config: { routingKey: config.routingKey, apiToken: config.apiToken, baseUrl: config.baseUrl, timeoutMs: config.timeoutMs },
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -971,3 +1001,3 @@ };

function cfg20(config) {
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -984,3 +1014,3 @@ function firecrawlScrape(config) {

function cfg21(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1085,3 +1115,3 @@ function readerFetch(config = {}) {

function cfg22(config) {
return { credential: config.apiKey, config: { model: config.model }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { credential: config.apiKey, config: { model: config.model }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1095,3 +1125,3 @@ function openaiImagesGenerate(config) {

function cfg23(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1105,3 +1135,10 @@ function elevenlabsTts(config) {

var gatedAudioFetch = (input, init) => {
const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
let url;
if (typeof input === "string") {
url = input;
} else if (input instanceof URL) {
url = input.href;
} else {
url = input.url;
}
return safeFetch(url, init ?? {});

@@ -1112,2 +1149,4 @@ };

config: { apiKey: config.apiKey, model: config.model, baseUrl: config.baseUrl, headers: config.headers },
retry: config.retry,
signal: config.signal,
fetch: config.fetch,

@@ -1124,3 +1163,3 @@ fetchUntrusted: config.fetchUntrusted ?? gatedAudioFetch

function cfg25(config) {
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, fetch: config.fetch };
return { config: { apiKey: config.apiKey, baseUrl: config.baseUrl, headers: config.headers }, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1138,2 +1177,4 @@ function deepgramTranscribe(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -1152,3 +1193,3 @@ };

function cfg27(config) {
return { config: { apiKey: config.apiKey }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, fetch: config.fetch };
return { config: { apiKey: config.apiKey }, baseUrl: config.baseUrl, headers: config.headers, timeoutMs: config.timeoutMs, retry: config.retry, signal: config.signal, fetch: config.fetch };
}

@@ -1166,2 +1207,4 @@ function weatherCurrent(config) {

timeoutMs: config.timeoutMs,
retry: config.retry,
signal: config.signal,
fetch: config.fetch

@@ -1168,0 +1211,0 @@ };

{
"name": "@agentskit/tools",
"version": "0.13.4",
"version": "0.13.5",
"description": "Reusable executable tools for AgentsKit agents.",

@@ -67,3 +67,3 @@ "keywords": [

"@agentskit/core": "1.12.8",
"@agentskit/integrations": "0.6.4"
"@agentskit/integrations": "0.7.0"
},

@@ -70,0 +70,0 @@ "devDependencies": {

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display