feat(tools): extend cancellation to browser, web, and process tools

This commit is contained in:
William Valentin
2026-02-15 22:12:03 -08:00
parent 7877a1bcc9
commit b4006e91ff
10 changed files with 228 additions and 32 deletions
+15 -3
View File
@@ -1,7 +1,7 @@
import { parseHTML } from 'linkedom';
import { Readability } from '@mozilla/readability';
import TurndownService from 'turndown';
import type { Tool, ToolResult } from '../types.js';
import type { Tool, ToolExecutionContext, ToolResult } from '../types.js';
// ---------------------------------------------------------------------------
// Types
@@ -181,11 +181,15 @@ export const webFetchTool: Tool = {
required: ['url'],
},
execute: async (rawArgs: unknown): Promise<ToolResult> => {
execute: async (rawArgs: unknown, context?: ToolExecutionContext): Promise<ToolResult> => {
const args = rawArgs as WebFetchArgs;
const format: OutputFormat = args.format ?? 'markdown';
const timeout = args.timeout ?? 15_000;
if (context?.signal?.aborted) {
return { success: false, output: '', error: 'Operation aborted' };
}
// ----- Check cache (lazy eviction) ----- //
evictExpired();
const key = cacheKey(args.url, format);
@@ -196,8 +200,13 @@ export const webFetchTool: Tool = {
// ----- Fetch ----- //
try {
const timeoutSignal = AbortSignal.timeout(timeout);
const signal = context?.signal
? AbortSignal.any([context.signal, timeoutSignal])
: timeoutSignal;
const response = await fetch(args.url, {
signal: AbortSignal.timeout(timeout),
signal,
headers: {
'User-Agent': 'Flynn/0.1 (personal AI assistant)',
Accept: 'text/html, application/json, text/plain, */*',
@@ -224,6 +233,9 @@ export const webFetchTool: Tool = {
return { success: true, output };
} catch (error) {
if (error instanceof Error && (error.name === 'AbortError' || error.message.toLowerCase().includes('aborted'))) {
return { success: false, output: '', error: 'Operation aborted' };
}
return {
success: false,
output: '',