From 3bbe20735f0bf89baeb6308272afccb6f3a1dd26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 2 Jun 2026 12:54:37 +0200 Subject: [PATCH] agent: record raw REPL input - Add `recordRaw` to record raw JS lines in the REPL. - Only record commands if they succeed without error. - Fix kitty terminal cursor keys by forcing legacy arrow encoding. --- src/agent/Agent.zig | 14 ++++++++++++-- src/agent/Terminal.zig | 5 +++++ src/script/Recorder.zig | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) 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[