diff --git a/CHANGELOG.md b/CHANGELOG.md index b4e722071..b32dd1bad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -112,6 +112,7 @@ - Docs: expand parameter descriptions for agent/wake hooks. (#532) — thanks @mcinteerj - Docs: add community showcase entries from Discord. (#476) — thanks @gupsammy - TUI: refresh status bar after think/verbose/reasoning changes. (#519) — thanks @jdrhyne +- TUI: stop overriding agent timeout so config defaults apply. (#549) - Status: show Verbose/Elevated only when enabled. - Status: filter usage summary to the active model provider. - Status: map model providers to usage sources so unrelated usage doesn’t appear. diff --git a/docs/cli/index.md b/docs/cli/index.md index 9eba5993b..f57050dbd 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -673,5 +673,5 @@ Options: - `--deliver` - `--thinking ` - `--message ` -- `--timeout-ms ` +- `--timeout-ms ` (defaults to `agents.defaults.timeoutSeconds`) - `--history-limit ` diff --git a/docs/tui.md b/docs/tui.md index 6b5207d76..6bb209406 100644 --- a/docs/tui.md +++ b/docs/tui.md @@ -109,7 +109,7 @@ Session lifecycle: - `--session `: Session key (default: `main`, or `global` when scope is global) - `--deliver`: Deliver assistant replies to the provider (default off) - `--thinking `: Override thinking level for sends -- `--timeout-ms `: Agent timeout (default 30000) +- `--timeout-ms `: Agent timeout (defaults to `agents.defaults.timeoutSeconds`) - `--history-limit `: History entries to load (default 200) ## Troubleshooting diff --git a/docs/web/tui.md b/docs/web/tui.md index 5135a4cf6..f8cffdc67 100644 --- a/docs/web/tui.md +++ b/docs/web/tui.md @@ -30,7 +30,7 @@ Use SSH tunneling or Tailscale to reach the Gateway WS. - `--session `: Session key (default: `main`, or `global` when scope is global). - `--deliver`: Deliver assistant replies to the provider (default off). - `--thinking `: Override thinking level for sends. -- `--timeout-ms `: Agent timeout in ms (default 30000). +- `--timeout-ms `: Agent timeout in ms (defaults to `agents.defaults.timeoutSeconds`). - `--history-limit `: History entries to load (default 200). ## Controls diff --git a/src/cli/program.test.ts b/src/cli/program.test.ts index 20bbf62cc..7267f08ed 100644 --- a/src/cli/program.test.ts +++ b/src/cli/program.test.ts @@ -9,6 +9,7 @@ const onboardCommand = vi.fn(); const callGateway = vi.fn(); const runProviderLogin = vi.fn(); const runProviderLogout = vi.fn(); +const runTui = vi.fn(); const runtime = { log: vi.fn(), @@ -30,6 +31,9 @@ vi.mock("./provider-auth.js", () => ({ runProviderLogin, runProviderLogout, })); +vi.mock("../tui/tui.js", () => ({ + runTui, +})); vi.mock("../gateway/call.js", () => ({ callGateway, randomIdempotencyKey: () => "idem-test", @@ -43,6 +47,7 @@ const { buildProgram } = await import("./program.js"); describe("cli program", () => { beforeEach(() => { vi.clearAllMocks(); + runTui.mockResolvedValue(undefined); }); it("runs message with required options", async () => { @@ -62,6 +67,24 @@ describe("cli program", () => { expect(statusCommand).toHaveBeenCalled(); }); + it("runs tui without overriding timeout", async () => { + const program = buildProgram(); + await program.parseAsync(["tui"], { from: "user" }); + expect(runTui).toHaveBeenCalledWith( + expect.objectContaining({ timeoutMs: undefined }), + ); + }); + + it("runs tui with explicit timeout override", async () => { + const program = buildProgram(); + await program.parseAsync(["tui", "--timeout-ms", "45000"], { + from: "user", + }); + expect(runTui).toHaveBeenCalledWith( + expect.objectContaining({ timeoutMs: 45000 }), + ); + }); + it("runs config alias as configure", async () => { const program = buildProgram(); await program.parseAsync(["config"], { from: "user" }); diff --git a/src/cli/tui-cli.ts b/src/cli/tui-cli.ts index 86ce7ca1d..283d02adf 100644 --- a/src/cli/tui-cli.ts +++ b/src/cli/tui-cli.ts @@ -19,14 +19,21 @@ export function registerTuiCli(program: Command) { .option("--deliver", "Deliver assistant replies", false) .option("--thinking ", "Thinking level override") .option("--message ", "Send an initial message after connecting") - .option("--timeout-ms ", "Agent timeout in ms", "30000") + .option( + "--timeout-ms ", + "Agent timeout in ms (defaults to agents.defaults.timeoutSeconds)", + ) .option("--history-limit ", "History entries to load", "200") .action(async (opts) => { try { - const timeoutMs = Number.parseInt( - String(opts.timeoutMs ?? "30000"), - 10, - ); + const timeoutMs = + typeof opts.timeoutMs === "undefined" + ? undefined + : Number.parseInt(String(opts.timeoutMs), 10); + const normalizedTimeoutMs = + typeof timeoutMs === "number" && Number.isFinite(timeoutMs) + ? timeoutMs + : undefined; const historyLimit = Number.parseInt( String(opts.historyLimit ?? "200"), 10, @@ -39,7 +46,7 @@ export function registerTuiCli(program: Command) { deliver: Boolean(opts.deliver), thinking: opts.thinking as string | undefined, message: opts.message as string | undefined, - timeoutMs: Number.isNaN(timeoutMs) ? undefined : timeoutMs, + timeoutMs: normalizedTimeoutMs, historyLimit: Number.isNaN(historyLimit) ? undefined : historyLimit, }); } catch (err) {