From 3f1ace16afc7877b0bfad374cb286d4d84140960 Mon Sep 17 00:00:00 2001 From: t Date: Thu, 4 Jun 2026 09:46:49 -0600 Subject: failure retries scheme --- src/main.zig | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/main.zig') diff --git a/src/main.zig b/src/main.zig index be0ac86..61e78d5 100644 --- a/src/main.zig +++ b/src/main.zig @@ -93,8 +93,28 @@ const CLIReceiver = struct { .onBlockComplete = onBlockComplete, .onMessageComplete = onMessageComplete, .onError = onError, + .onProviderRetry = onProviderRetry, }; + /// Surface provider retry scheduling as a dim status line so the user + /// can see the agent is waiting on the provider rather than hung. + fn onProviderRetry(ptr: *anyopaque, info: panto.provider.ProviderRetryInfo) void { + const self: *CLIReceiver = @ptrCast(@alignCast(ptr)); + if (info.compaction) { + self.stdout.print( + "\x1b[2mcontext overflow: compacting and retrying\x1b[0m\n", + .{}, + ) catch {}; + } else { + const secs = @as(f64, @floatFromInt(info.delay_ms)) / 1000.0; + self.stdout.print( + "\x1b[2mprovider unavailable ({s}): retrying in {d:.1}s (attempt {d}/{d})\x1b[0m\n", + .{ @errorName(info.err), secs, info.attempt + 1, info.max_attempts }, + ) catch {}; + } + self.file.flush() catch {}; + } + /// The print-based CLI defers tool-name rendering to onBlockComplete /// to avoid cursor gymnastics (we can't go back and edit the prefix). /// Receivers backed by a TUI capable of in-place updates would render -- cgit v1.3