const std = @import("std"); pub const default_max_agent_steps: usize = 0; pub fn resolveMaxAgentSteps(configured: ?usize, default_value: usize) usize { return configured orelse default_value;} pub fn parseMaxAgentSteps(raw: ?[]const u8) ?usize { const trimmed = std.mem.trim(u8, raw orelse return null, " \t\r\n"); if (trimmed.len == 0) return null; return std.fmt.parseUnsigned(usize, trimmed, 10) catch null;} pub fn resolveMaxAgentStepsWithOverride( configured: ?usize, default_value: usize, process_override: ?[]const u8,) usize { return parseMaxAgentSteps(process_override) orelse resolveMaxAgentSteps(configured, default_value);} pub fn allowsStep(limit: usize, completed_steps: usize) bool { return limit == 0 or completed_steps < limit;} test "resolve max agent steps preserves explicit unbounded zero" { try std.testing.expectEqual(@as(usize, 25), resolveMaxAgentSteps(null, 25)); try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentSteps(0, 25)); try std.testing.expectEqual(@as(usize, 50), resolveMaxAgentSteps(50, 25));} test "parse max agent steps accepts zero and rejects invalid input" { try std.testing.expectEqual(@as(usize, 0), parseMaxAgentSteps("0").?); try std.testing.expectEqual(@as(usize, 24), parseMaxAgentSteps("24").?); try std.testing.expect(parseMaxAgentSteps(null) == null); try std.testing.expect(parseMaxAgentSteps("") == null); try std.testing.expect(parseMaxAgentSteps("abc") == null);} test "process overrides resolve with configured and compiled defaults" { try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentStepsWithOverride(null, default_max_agent_steps, null)); try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentStepsWithOverride(0, 24, null)); try std.testing.expectEqual(@as(usize, 24), resolveMaxAgentStepsWithOverride(null, 0, "24")); try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentStepsWithOverride(24, 8, "0")); try std.testing.expectEqual(@as(usize, 24), resolveMaxAgentStepsWithOverride(24, 8, "invalid")); try std.testing.expectEqual(@as(usize, 24), resolveMaxAgentStepsWithOverride(24, 8, " \t\n"));} test "agent step policy treats zero as unbounded and positives as exact caps" { try std.testing.expect(allowsStep(0, 0)); try std.testing.expect(allowsStep(0, 25)); try std.testing.expect(allowsStep(2, 0)); try std.testing.expect(allowsStep(2, 1)); try std.testing.expect(!allowsStep(2, 2));}
const std = @import("std");
pub const default_max_agent_steps: usize = 0;
pub fn resolveMaxAgentSteps(configured: ?usize, default_value: usize) usize {
return configured orelse default_value;
}
pub fn parseMaxAgentSteps(raw: ?[]const u8) ?usize {
const trimmed = std.mem.trim(u8, raw orelse return null, " \t\r\n");
if (trimmed.len == 0) return null;
return std.fmt.parseUnsigned(usize, trimmed, 10) catch null;
}
pub fn resolveMaxAgentStepsWithOverride(
configured: ?usize,
default_value: usize,
process_override: ?[]const u8,
) usize {
return parseMaxAgentSteps(process_override) orelse resolveMaxAgentSteps(configured, default_value);
}
pub fn allowsStep(limit: usize, completed_steps: usize) bool {
return limit == 0 or completed_steps < limit;
}
test "resolve max agent steps preserves explicit unbounded zero" {
try std.testing.expectEqual(@as(usize, 25), resolveMaxAgentSteps(null, 25));
try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentSteps(0, 25));
try std.testing.expectEqual(@as(usize, 50), resolveMaxAgentSteps(50, 25));
}
test "parse max agent steps accepts zero and rejects invalid input" {
try std.testing.expectEqual(@as(usize, 0), parseMaxAgentSteps("0").?);
try std.testing.expectEqual(@as(usize, 24), parseMaxAgentSteps("24").?);
try std.testing.expect(parseMaxAgentSteps(null) == null);
try std.testing.expect(parseMaxAgentSteps("") == null);
try std.testing.expect(parseMaxAgentSteps("abc") == null);
}
test "process overrides resolve with configured and compiled defaults" {
try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentStepsWithOverride(null, default_max_agent_steps, null));
try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentStepsWithOverride(0, 24, null));
try std.testing.expectEqual(@as(usize, 24), resolveMaxAgentStepsWithOverride(null, 0, "24"));
try std.testing.expectEqual(@as(usize, 0), resolveMaxAgentStepsWithOverride(24, 8, "0"));
try std.testing.expectEqual(@as(usize, 24), resolveMaxAgentStepsWithOverride(24, 8, "invalid"));
try std.testing.expectEqual(@as(usize, 24), resolveMaxAgentStepsWithOverride(24, 8, " \t\n"));
}
test "agent step policy treats zero as unbounded and positives as exact caps" {
try std.testing.expect(allowsStep(0, 0));
try std.testing.expect(allowsStep(0, 25));
try std.testing.expect(allowsStep(2, 0));
try std.testing.expect(allowsStep(2, 1));
try std.testing.expect(!allowsStep(2, 2));
}