diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 261a8742..8dcee3ba 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -483,6 +483,8 @@ fn runRepl(self: *Agent) void { self.terminal.printError("{s}", .{result.text}); } else { self.printData(result.text); + if (self.recorder) |*r| r.recordRaw(line); + self.recordSaveRaw(line); } continue :repl; } @@ -530,8 +532,10 @@ fn runRepl(self: *Agent) void { const result = self.runCommand(aa, cmd); self.terminal.endTool(); self.printCommandResult(cmd, result); - if (self.recorder) |*r| r.record(cmd); - self.recordSaveCommand(cmd); + if (!result.is_error) { + if (self.recorder) |*r| r.record(cmd); + self.recordSaveCommand(cmd); + } self.recordSlashToolCall(trimmed, tc.name(), tc.args, result) catch |err| { self.terminal.printWarning("LLM conversation out of sync (/{s}: {s}); next prompt may not see this action", .{ tc.name(), @errorName(err) }); }; @@ -784,6 +788,12 @@ fn recordSaveComment(self: *Agent, comment: []const u8) void { }; } +fn recordSaveRaw(self: *Agent, line: []const u8) void { + self.save_buffer.recordRaw(line) catch |err| { + self.terminal.printError("save buffer disabled: {s}", .{@errorName(err)}); + }; +} + fn printSlashHelp(self: *Agent, arena: std.mem.Allocator, target: []const u8) void { if (target.len == 0) { const all = Schema.all(); diff --git a/src/agent/Terminal.zig b/src/agent/Terminal.zig index b7f51bab..0669a3d2 100644 --- a/src/agent/Terminal.zig +++ b/src/agent/Terminal.zig @@ -859,10 +859,15 @@ const RawTerminal = struct { raw.cc[@intFromEnum(std.c.V.MIN)] = 0; raw.cc[@intFromEnum(std.c.V.TIME)] = 1; try std.posix.tcsetattr(std.posix.STDIN_FILENO, .FLUSH, raw); + // Under the REPL's kitty "disambiguate" flag, cursor keys arrive as + // CSI-u the byte reader can't parse; push flag 0 to force legacy arrow + // encoding. restore() pops back to the REPL's flag. + _ = std.posix.write(std.posix.STDOUT_FILENO, "\x1b[>0u") catch {}; return .{ .original = original }; } fn restore(self: *const RawTerminal) void { + _ = std.posix.write(std.posix.STDOUT_FILENO, "\x1b[