fix(mcp): make set_task_config/set_list_config patch instead of overwrite

Omitted fields on set_task_config/set_list_config used to be indistinguishable
from an explicit clear, so any single-field update silently wiped every other
override (including SessionSkills, which wasn't even a tool parameter). Now
only the fields you pass are changed; clearing an override requires naming it
in the new clearFields array (a sentinel string doesn't work uniformly since
maxTurns is an int). set_list_config's "all four null deletes the config" case
is preserved but only reachable via clearFields. Return values now reflect the
full resulting config.
This commit is contained in:
mika kuns
2026-08-10 13:55:58 +02:00
parent 6a2a19cc9e
commit 5eea439129
3 changed files with 157 additions and 29 deletions
@@ -81,7 +81,7 @@ public sealed class EffectiveRunConfigTests : IDisposable
public async Task Task_override_beats_list_override_beats_preset()
{
var listId = await SeedListAsync();
await _sut.SetListConfig(listId, "opus", null, "list-agent.md", 50, CancellationToken.None);
await _sut.SetListConfig(listId, "opus", null, "list-agent.md", 50, cancellationToken: CancellationToken.None);
var task = await SeedTaskAsync(listId, t => { t.Model = "haiku"; t.MaxTurns = 12; });
var result = await _sut.GetEffectiveRunConfig(task.Id, CancellationToken.None);
@@ -98,7 +98,7 @@ public sealed class EffectiveRunConfigTests : IDisposable
public async Task List_override_wins_when_no_task_override()
{
var listId = await SeedListAsync();
await _sut.SetListConfig(listId, "opus", null, null, 50, CancellationToken.None);
await _sut.SetListConfig(listId, "opus", null, null, 50, cancellationToken: CancellationToken.None);
var task = await SeedTaskAsync(listId);
var result = await _sut.GetEffectiveRunConfig(task.Id, CancellationToken.None);