fix(runner): substitute acceptEdits for haiku's silent auto-mode downgrade, fail permission-denial-only runs

This commit is contained in:
mika kuns
2026-08-10 14:35:24 +02:00
parent 6a2a19cc9e
commit db50e710b9
10 changed files with 267 additions and 7 deletions
@@ -170,6 +170,29 @@ public sealed class ClaudeArgsBuilderTests
Assert.DoesNotContain("--dangerously-skip-permissions", args);
}
[Theory]
[InlineData("haiku", "auto", "acceptEdits")]
[InlineData("haiku", null, "acceptEdits")]
[InlineData("haiku", "bypassPermissions", "acceptEdits")]
[InlineData("claude-haiku-4-5-20251001", "auto", "acceptEdits")]
[InlineData("haiku", "acceptEdits", "acceptEdits")]
[InlineData("haiku", "plan", "plan")]
[InlineData("sonnet", "auto", "auto")]
[InlineData("claude-sonnet-4-6", "auto", "auto")]
[InlineData(null, "auto", "auto")]
public void PermissionMode_ForHaikuModel_SubstitutesAutoWithAcceptEdits(
string? model, string? requestedMode, string expectedMode)
{
// claude-cli 2.1.220 silently downgrades "--permission-mode auto" to the interactive
// "default" mode when the resolved model is a haiku model (verified against the real
// CLI's stream-json `init` event), which would block an unattended run forever.
var args = _builder.Build(new ClaudeRunConfig(model, null, null, null, PermissionMode: requestedMode));
var list = args.ToList();
var idx = list.IndexOf("--permission-mode");
Assert.True(idx >= 0);
Assert.Equal(expectedMode, list[idx + 1]);
}
[Fact]
public void Build_emits_mcpConfig_and_allowedTools_when_set()
{