fix: suppress spinner in logs --follow mode

The progress spinner was being shown for each gateway RPC call during
log tailing, causing repeated spinner frames (◇ │) to appear every
polling interval.

Add a `progress` option to `callGatewayFromCli` and disable the spinner
during follow mode polling to keep output clean.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Lucas Czekaj
2026-01-22 16:58:42 -08:00
parent fac21e6eb4
commit 76a42da676
2 changed files with 13 additions and 8 deletions

View File

@@ -23,13 +23,14 @@ export async function callGatewayFromCli(
method: string, method: string,
opts: GatewayRpcOpts, opts: GatewayRpcOpts,
params?: unknown, params?: unknown,
extra?: { expectFinal?: boolean }, extra?: { expectFinal?: boolean; progress?: boolean },
) { ) {
const showProgress = extra?.progress ?? opts.json !== true;
return await withProgress( return await withProgress(
{ {
label: `Gateway ${method}`, label: `Gateway ${method}`,
indeterminate: true, indeterminate: true,
enabled: opts.json !== true, enabled: showProgress,
}, },
async () => async () =>
await callGateway({ await callGateway({

View File

@@ -41,14 +41,16 @@ function parsePositiveInt(value: string | undefined, fallback: number): number {
async function fetchLogs( async function fetchLogs(
opts: LogsCliOptions, opts: LogsCliOptions,
cursor: number | undefined, cursor: number | undefined,
showProgress: boolean,
): Promise<LogsTailPayload> { ): Promise<LogsTailPayload> {
const limit = parsePositiveInt(opts.limit, 200); const limit = parsePositiveInt(opts.limit, 200);
const maxBytes = parsePositiveInt(opts.maxBytes, 250_000); const maxBytes = parsePositiveInt(opts.maxBytes, 250_000);
const payload = await callGatewayFromCli("logs.tail", opts, { const payload = await callGatewayFromCli(
cursor, "logs.tail",
limit, opts,
maxBytes, { cursor, limit, maxBytes },
}); { progress: showProgress },
);
if (!payload || typeof payload !== "object") { if (!payload || typeof payload !== "object") {
throw new Error("Unexpected logs.tail response"); throw new Error("Unexpected logs.tail response");
} }
@@ -194,8 +196,10 @@ export function registerLogsCli(program: Command) {
while (true) { while (true) {
let payload: LogsTailPayload; let payload: LogsTailPayload;
// Show progress spinner only on first fetch, not during follow polling
const showProgress = first && !opts.follow;
try { try {
payload = await fetchLogs(opts, cursor); payload = await fetchLogs(opts, cursor, showProgress);
} catch (err) { } catch (err) {
emitGatewayError(err, opts, jsonMode ? "json" : "text", rich, emitJsonLine, errorLine); emitGatewayError(err, opts, jsonMode ? "json" : "text", rich, emitJsonLine, errorLine);
process.exit(1); process.exit(1);