From fdc3fe1196dc7faf7c14510d0b8abdaf57fb82c6 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 7 May 2026 05:37:24 +0200 Subject: [PATCH] refactor(coding-agent): removed configurable read timeout and standardized URL fetch timeout - Removed the read CLI argument and tool schema field so read requests no longer accept custom timeouts. - Updated URL read handling to stop forwarding timeout values and execute URL reads without a timeout parameter. - Standardized URL read fetching to a fixed 30-second timeout and dropped timeout metadata from URL call rendering. --- packages/coding-agent/src/cli/read-cli.ts | 3 +-- packages/coding-agent/src/commands/read.ts | 9 ++------- packages/coding-agent/src/prompts/tools/read.md | 1 - packages/coding-agent/src/tools/fetch.ts | 13 ++++++------- packages/coding-agent/src/tools/read.ts | 8 +++----- 5 files changed, 12 insertions(+), 22 deletions(-) diff --git a/packages/coding-agent/src/cli/read-cli.ts b/packages/coding-agent/src/cli/read-cli.ts index a490e07f7..afaff1dbf 100644 --- a/packages/coding-agent/src/cli/read-cli.ts +++ b/packages/coding-agent/src/cli/read-cli.ts @@ -15,7 +15,6 @@ import { renderError } from "../tools/tool-errors"; export interface ReadCommandArgs { path: string; - timeout?: number; } export async function runReadCommand(cmd: ReadCommandArgs): Promise { @@ -38,7 +37,7 @@ export async function runReadCommand(cmd: ReadCommandArgs): Promise { const tool = wrapToolWithMetaNotice(new ReadTool(session)); try { - const result = await tool.execute("omp-read", { path: cmd.path, timeout: cmd.timeout }); + const result = await tool.execute("omp-read", { path: cmd.path }); for (const block of result.content) { if (block.type === "text") { diff --git a/packages/coding-agent/src/commands/read.ts b/packages/coding-agent/src/commands/read.ts index 6b910e06c..1bb286ba3 100644 --- a/packages/coding-agent/src/commands/read.ts +++ b/packages/coding-agent/src/commands/read.ts @@ -1,7 +1,7 @@ /** * Show what the read tool will return for a given path. */ -import { Args, Command, Flags } from "@oh-my-pi/pi-utils/cli"; +import { Args, Command } from "@oh-my-pi/pi-utils/cli"; import { type ReadCommandArgs, runReadCommand } from "../cli/read-cli"; import { initTheme } from "../modes/theme/theme"; @@ -15,10 +15,6 @@ export default class Read extends Command { }), }; - static flags = { - timeout: Flags.integer({ description: "Request timeout in seconds (URLs only)" }), - }; - static examples = [ "omp read src/foo.ts", "omp read src/foo.ts:50-100", @@ -29,10 +25,9 @@ export default class Read extends Command { ]; async run(): Promise { - const { args, flags } = await this.parse(Read); + const { args } = await this.parse(Read); const cmd: ReadCommandArgs = { path: args.path ?? "", - timeout: flags.timeout, }; await initTheme(); await runReadCommand(cmd); diff --git a/packages/coding-agent/src/prompts/tools/read.md b/packages/coding-agent/src/prompts/tools/read.md index 636ff1561..cd285fb39 100644 --- a/packages/coding-agent/src/prompts/tools/read.md +++ b/packages/coding-agent/src/prompts/tools/read.md @@ -7,7 +7,6 @@ The `read` tool is multi-purpose and more capable than it looks — inspects fil ## Parameters - `path` — file path or URL (required). Append `:` for line ranges or raw mode (for example `src/foo.ts:50-200` or `src/foo.ts:raw`). -- `timeout` — seconds, for URLs only ## Selectors diff --git a/packages/coding-agent/src/tools/fetch.ts b/packages/coding-agent/src/tools/fetch.ts index 95cc861e7..98fe659d9 100644 --- a/packages/coding-agent/src/tools/fetch.ts +++ b/packages/coding-agent/src/tools/fetch.ts @@ -1220,13 +1220,13 @@ function cacheReadUrlEntry(session: ToolSession, requestedUrl: string, raw: bool async function buildReadUrlCacheEntry( session: ToolSession, - params: { path: string; timeout?: number; raw?: boolean }, + params: { path: string; raw?: boolean }, signal?: AbortSignal, options?: { ensureArtifact?: boolean }, ): Promise { - const { path: url, timeout: rawTimeout = 20, raw = false } = params; + const { path: url, raw = false } = params; - const effectiveTimeout = clampTimeout("fetch", rawTimeout); + const effectiveTimeout = clampTimeout("fetch", 30); if (signal?.aborted) { throw new ToolAbortError(); @@ -1254,7 +1254,7 @@ async function buildReadUrlCacheEntry( export async function loadReadUrlCacheEntry( session: ToolSession, - params: { path: string; timeout?: number; raw?: boolean }, + params: { path: string; raw?: boolean }, signal?: AbortSignal, options?: { ensureArtifact?: boolean; preferCached?: boolean }, ): Promise { @@ -1291,7 +1291,7 @@ function buildUrlReadOutput(result: FetchRenderResult, content: string): string export async function executeReadUrl( session: ToolSession, - params: { path: string; timeout?: number; raw?: boolean }, + params: { path: string; raw?: boolean }, signal?: AbortSignal, ): Promise> { let cacheEntry = await loadReadUrlCacheEntry(session, params, signal, { preferCached: true }); @@ -1345,7 +1345,7 @@ function countNonEmptyLines(text: string): number { /** Render URL read call (URL preview) */ export function renderReadUrlCall( - args: { path?: string; url?: string; timeout?: number; raw?: boolean }, + args: { path?: string; url?: string; raw?: boolean }, _options: RenderResultOptions, uiTheme: Theme = theme, ): Component { @@ -1355,7 +1355,6 @@ export function renderReadUrlCall( const description = `${domain}${path ? ` ${path}` : ""}`.trim(); const meta: string[] = []; if (args.raw) meta.push("raw"); - if (args.timeout !== undefined) meta.push(`timeout:${args.timeout}s`); const text = renderStatusLine({ icon: "pending", title: "Read", description, meta }, uiTheme); return new Text(text, 0, 0); } diff --git a/packages/coding-agent/src/tools/read.ts b/packages/coding-agent/src/tools/read.ts index bf7f57b67..caa6faabd 100644 --- a/packages/coding-agent/src/tools/read.ts +++ b/packages/coding-agent/src/tools/read.ts @@ -419,7 +419,6 @@ const readSchema = Type.Object({ description: 'path or url; append : for line ranges or raw mode (e.g. "src/foo.ts:50-100")', examples: ["src/foo.ts", "src/foo.ts:50-100", "https://example.com:L1-L40"], }), - timeout: Type.Optional(Type.Number({ description: "timeout in seconds", default: 20 })), }); export type ReadToolInput = Static; @@ -1085,7 +1084,7 @@ export class ReadTool implements AgentTool { _onUpdate?: AgentToolUpdateCallback, _toolContext?: AgentToolContext, ): Promise> { - let { path: readPath, timeout } = params; + let { path: readPath } = params; if (readPath.startsWith("file://")) { readPath = expandPath(readPath); } @@ -1099,7 +1098,7 @@ export class ReadTool implements AgentTool { if (parsedUrlTarget.offset !== undefined || parsedUrlTarget.limit !== undefined) { const cached = await loadReadUrlCacheEntry( this.session, - { path: parsedUrlTarget.path, timeout, raw: parsedUrlTarget.raw }, + { path: parsedUrlTarget.path, raw: parsedUrlTarget.raw }, signal, { ensureArtifact: true, @@ -1112,7 +1111,7 @@ export class ReadTool implements AgentTool { entityLabel: "URL output", }); } - return executeReadUrl(this.session, { path: parsedUrlTarget.path, timeout, raw: parsedUrlTarget.raw }, signal); + return executeReadUrl(this.session, { path: parsedUrlTarget.path, raw: parsedUrlTarget.raw }, signal); } // Handle internal URLs (agent://, artifact://, memory://, skill://, rule://, local://, mcp://) @@ -1569,7 +1568,6 @@ interface ReadRenderArgs { path?: string; file_path?: string; sel?: string; - timeout?: number; // Legacy fields from old schema — tolerated for in-flight tool calls during transition offset?: number; limit?: number;