feat(tools): extend cancellation to browser, web, and process tools
This commit is contained in:
@@ -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: '',
|
||||
|
||||
Reference in New Issue
Block a user