From ceb5f368f04d546b6bd201eb2a7668e1b591b94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Thu, 21 May 2026 18:01:46 +0200 Subject: [PATCH] script: rename raw_line to opener_line --- src/agent/Agent.zig | 18 +++++++++--------- src/script.zig | 8 ++++---- src/script/command.zig | 10 +++++++--- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 2d717176..edc3157b 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -622,13 +622,13 @@ fn runScript(self: *Agent, path: []const u8) bool { // Recorded scripts prefix LLM-generated commands with the // natural-language prompt that produced them; keep the // last one around so self-heal can use it as context. - if (entry.raw_line.len > 2 and entry.raw_line[0] == '#') { - last_comment = std.mem.trim(u8, entry.raw_line[1..], &std.ascii.whitespace); + if (entry.opener_line.len > 2 and entry.opener_line[0] == '#') { + last_comment = std.mem.trim(u8, entry.opener_line[1..], &std.ascii.whitespace); } continue; }, .natural_language => { - self.terminal.printErrorFmt("line {d}: unrecognized command: {s}", .{ entry.line_num, entry.raw_line }); + self.terminal.printErrorFmt("line {d}: unrecognized command: {s}", .{ entry.line_num, entry.opener_line }); self.flushReplacements(path, content, replacements.items); return false; }, @@ -636,7 +636,7 @@ fn runScript(self: *Agent, path: []const u8) bool { if (self.ai_client == null) { self.terminal.printErrorFmt("line {d}: {s} requires --provider", .{ entry.line_num, - entry.raw_line, + entry.opener_line, }); self.flushReplacements(path, content, replacements.items); return false; @@ -645,7 +645,7 @@ fn runScript(self: *Agent, path: []const u8) bool { const text = self.processUserMessage(.{ .prompt = prompt }) catch |err| { self.terminal.printErrorFmt("line {d}: {s} failed: {s}", .{ entry.line_num, - entry.raw_line, + entry.opener_line, @errorName(err), }); self.flushReplacements(path, content, replacements.items); @@ -655,7 +655,7 @@ fn runScript(self: *Agent, path: []const u8) bool { self.pruneMessages(); }, else => { - self.terminal.printInfoFmt("[{d}] {s}", .{ entry.line_num, entry.raw_line }); + self.terminal.printInfoFmt("[{d}] {s}", .{ entry.line_num, entry.opener_line }); switch (self.runActionEntry(sa, entry, last_comment)) { .ok => {}, .healed => |r| replacements.append(sa, r) catch |err| { @@ -720,8 +720,8 @@ fn runActionEntry(self: *Agent, sa: std.mem.Allocator, entry: Command.ScriptIter .failed => |r| r, .passed, .inconclusive => null, }; - if (self.attemptSelfHeal(sa, entry.raw_line, reason, last_comment)) |healed_cmds| { - const replacement = script.formatHealReplacement(sa, entry.raw_span, entry.raw_line, healed_cmds) catch |err| { + if (self.attemptSelfHeal(sa, entry.opener_line, reason, last_comment)) |healed_cmds| { + const replacement = script.formatHealReplacement(sa, entry.raw_span, entry.opener_line, healed_cmds) catch |err| { self.terminal.printErrorFmt( "line {d}: failed to record heal: {s} (script left unchanged)", .{ entry.line_num, @errorName(err) }, @@ -733,7 +733,7 @@ fn runActionEntry(self: *Agent, sa: std.mem.Allocator, entry: Command.ScriptIter } self.terminal.printErrorFmt("line {d}: command failed: {s}", .{ entry.line_num, - entry.raw_line, + entry.opener_line, }); return .fail; } diff --git a/src/script.zig b/src/script.zig index 402328c0..c445c01d 100644 --- a/src/script.zig +++ b/src/script.zig @@ -188,12 +188,12 @@ pub fn writeAtomic( pub fn formatHealReplacement( arena: std.mem.Allocator, original_span: []const u8, - raw_line: []const u8, + opener_line: []const u8, cmds: []const Command, ) !Replacement { std.debug.assert(cmds.len > 0); var aw: std.Io.Writer.Allocating = .init(arena); - try aw.writer.print("# [Auto-healed] Original: {s}\n", .{raw_line}); + try aw.writer.print("# [Auto-healed] Original: {s}\n", .{opener_line}); for (cmds) |cmd| { try cmd.format(&aw.writer); try aw.writer.writeByte('\n'); @@ -207,12 +207,12 @@ pub fn formatHealReplacement( pub fn formatHealReplacementLines( arena: std.mem.Allocator, original_span: []const u8, - raw_line: []const u8, + opener_line: []const u8, replacement_lines: []const []const u8, ) !Replacement { var aw: std.Io.Writer.Allocating = .init(arena); - try aw.writer.print("# [Auto-healed] Original: {s}\n", .{raw_line}); + try aw.writer.print("# [Auto-healed] Original: {s}\n", .{opener_line}); for (replacement_lines) |line| { try aw.writer.writeAll(line); try aw.writer.writeByte('\n'); diff --git a/src/script/command.zig b/src/script/command.zig index 2f50388a..76ecfe48 100644 --- a/src/script/command.zig +++ b/src/script/command.zig @@ -449,7 +449,11 @@ pub const Command = union(enum) { pub const Entry = struct { line_num: u32, - raw_line: []const u8, + /// Trimmed opener line — the only line for single-line entries, + /// the `EVAL '''` / `EXTRACT '''` opener for blocks. Display-only + /// (errors, REPL echo, heal-comment headers); use `raw_span` for + /// splices that need the full block body. + opener_line: []const u8, /// The full slice of the original content buffer covering this entry, /// including trailing newline(s). For multi-line EVAL blocks this spans /// from the EVAL keyword through the closing triple-quote line. @@ -475,7 +479,7 @@ pub const Command = union(enum) { }; return .{ .line_num = start_line, - .raw_line = trimmed, + .opener_line = trimmed, .raw_span = self.lines.buffer[line_start..span_end], .command = cmd, }; @@ -484,7 +488,7 @@ pub const Command = union(enum) { const span_end = self.lines.index orelse self.lines.buffer.len; return .{ .line_num = self.line_num, - .raw_line = trimmed, + .opener_line = trimmed, .raw_span = self.lines.buffer[line_start..span_end], .command = Command.parse(trimmed), };