Skip to content

Commit a5bb700

Browse files
CopilotKSemenenko
andcommitted
feat: sync upstream da80366->420a188, add --effort and --name flags
Co-authored-by: KSemenenko <4385716+KSemenenko@users.noreply.github.com>
1 parent a0d742e commit a5bb700

File tree

8 files changed

+119
-2
lines changed

8 files changed

+119
-2
lines changed

ClaudeCodeSharpSDK.Tests/Unit/ClaudeExecTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public class ClaudeExecTests
2626
private const string DescriptionPropertyName = "Description";
2727
private const string DescriptionPropertyNameCamel = "description";
2828
private const string DisallowedToolsFlag = "--disallowed-tools";
29+
private const string EffortFlag = "--effort";
30+
private const string EffortHighValue = "high";
31+
private const string EffortLowValue = "low";
32+
private const string EffortMaxValue = "max";
33+
private const string EffortMediumValue = "medium";
2934
private const string ExampleBaseUrl = "https://example.invalid";
3035
private const string FeatureABeta = "feature-a";
3136
private const string FeatureBBeta = "feature-b";
@@ -41,6 +46,7 @@ public class ClaudeExecTests
4146
private const string McpConfigPath = "/tmp/mcp.json";
4247
private const string McpConfigTwo = """{"name":"two","command":"uvx","args":["c","d"]}""";
4348
private const string ModelFlag = "--model";
49+
private const string NameFlag = "--name";
4450
private const string OutputFormatFlag = "--output-format";
4551
private const string OutputSchemaMessageFragment = "ReplayUserMessages";
4652
private const string PerTurnHookValue = "per-turn-hook";
@@ -59,6 +65,7 @@ public class ClaudeExecTests
5965
private const string ResumeSessionId = "session-1";
6066
private const string ReviewerAgentKey = "reviewer";
6167
private const string ReviewerPrompt = "Review code changes";
68+
private const string SessionDisplayName = "my-session";
6269
private const string SettingSourcesFlag = "--setting-sources";
6370
private const string SettingsFlag = "--settings";
6471
private const string StreamJsonOutputFormat = "stream-json";
@@ -206,6 +213,64 @@ public async Task BuildCommandArgs_WithReservedAdditionalCliFlag_Throws()
206213
await Assert.That(exception!.Message).Contains(ReservedOutputFormatFlag);
207214
}
208215

216+
[Test]
217+
[Arguments(EffortLevel.Low, EffortLowValue)]
218+
[Arguments(EffortLevel.Medium, EffortMediumValue)]
219+
[Arguments(EffortLevel.High, EffortHighValue)]
220+
[Arguments(EffortLevel.Max, EffortMaxValue)]
221+
public async Task BuildCommandArgs_WithEffort_MapsToCliValue(EffortLevel effort, string expectedCliValue)
222+
{
223+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
224+
225+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
226+
{
227+
Input = SummarizeInput,
228+
Effort = effort,
229+
});
230+
231+
await Assert.That(GetRequiredFlagValue(commandArgs, EffortFlag)).IsEqualTo(expectedCliValue);
232+
}
233+
234+
[Test]
235+
public async Task BuildCommandArgs_WithoutEffort_OmitsEffortFlag()
236+
{
237+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
238+
239+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
240+
{
241+
Input = SummarizeInput,
242+
});
243+
244+
await Assert.That(commandArgs.Contains(EffortFlag)).IsFalse();
245+
}
246+
247+
[Test]
248+
public async Task BuildCommandArgs_WithName_MapsToCliFlag()
249+
{
250+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
251+
252+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
253+
{
254+
Input = SummarizeInput,
255+
Name = SessionDisplayName,
256+
});
257+
258+
await Assert.That(GetRequiredFlagValue(commandArgs, NameFlag)).IsEqualTo(SessionDisplayName);
259+
}
260+
261+
[Test]
262+
public async Task BuildCommandArgs_WithoutName_OmitsNameFlag()
263+
{
264+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
265+
266+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
267+
{
268+
Input = SummarizeInput,
269+
});
270+
271+
await Assert.That(commandArgs.Contains(NameFlag)).IsFalse();
272+
}
273+
209274
private static JsonObject CreateBaseSettings()
210275
{
211276
return new JsonObject

ClaudeCodeSharpSDK/Client/ClaudeThread.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,10 @@ private async IAsyncEnumerable<ThreadEvent> RunStreamedInternalAsync(
273273
BaseUrl = _options.BaseUrl,
274274
ApiKey = _options.ApiKey,
275275
Model = _threadOptions.Model,
276+
Name = _threadOptions.Name,
276277
Agent = _threadOptions.Agent,
277278
FallbackModel = _threadOptions.FallbackModel,
279+
Effort = _threadOptions.Effort,
278280
WorkingDirectory = _threadOptions.WorkingDirectory,
279281
PermissionMode = _threadOptions.PermissionMode,
280282
DangerouslySkipPermissions = _threadOptions.DangerouslySkipPermissions,

ClaudeCodeSharpSDK/Client/ThreadOptions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ public enum PermissionMode
1212
Plan,
1313
}
1414

15+
public enum EffortLevel
16+
{
17+
Low,
18+
Medium,
19+
High,
20+
Max,
21+
}
22+
1523
public enum SettingSource
1624
{
1725
User,
@@ -25,10 +33,14 @@ public sealed record ThreadOptions
2533
{
2634
public string? Model { get; init; }
2735

36+
public string? Name { get; init; }
37+
2838
public string? Agent { get; init; }
2939

3040
public string? FallbackModel { get; init; }
3141

42+
public EffortLevel? Effort { get; init; }
43+
3244
public string? WorkingDirectory { get; init; }
3345

3446
public PermissionMode? PermissionMode { get; init; }

ClaudeCodeSharpSDK/Execution/ClaudeExec.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ public sealed class ClaudeExec
2222
private const string IncludePartialMessagesFlag = "--include-partial-messages";
2323
private const string ReplayUserMessagesFlag = "--replay-user-messages";
2424
private const string ModelFlag = "--model";
25+
private const string NameFlag = "--name";
2526
private const string AgentFlag = "--agent";
2627
private const string FallbackModelFlag = "--fallback-model";
28+
private const string EffortFlag = "--effort";
2729
private const string PermissionModeFlag = "--permission-mode";
2830
private const string DangerouslySkipPermissionsFlag = "--dangerously-skip-permissions";
2931
private const string AllowDangerouslySkipPermissionsFlag = "--allow-dangerously-skip-permissions";
@@ -158,6 +160,12 @@ internal IReadOnlyList<string> BuildCommandArgs(ClaudeExecArgs args)
158160
commandArgs.Add(args.Model);
159161
}
160162

163+
if (!string.IsNullOrWhiteSpace(args.Name))
164+
{
165+
commandArgs.Add(NameFlag);
166+
commandArgs.Add(args.Name);
167+
}
168+
161169
if (!string.IsNullOrWhiteSpace(args.Agent))
162170
{
163171
commandArgs.Add(AgentFlag);
@@ -170,6 +178,12 @@ internal IReadOnlyList<string> BuildCommandArgs(ClaudeExecArgs args)
170178
commandArgs.Add(args.FallbackModel);
171179
}
172180

181+
if (args.Effort.HasValue)
182+
{
183+
commandArgs.Add(EffortFlag);
184+
commandArgs.Add(args.Effort.Value.ToCliValue());
185+
}
186+
173187
if (args.PermissionMode.HasValue)
174188
{
175189
commandArgs.Add(PermissionModeFlag);

ClaudeCodeSharpSDK/Execution/ClaudeExecArgs.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@ public sealed record ClaudeExecArgs
1313

1414
public string? Model { get; init; }
1515

16+
public string? Name { get; init; }
17+
1618
public string? Agent { get; init; }
1719

1820
public string? FallbackModel { get; init; }
1921

22+
public EffortLevel? Effort { get; init; }
23+
2024
public string? WorkingDirectory { get; init; }
2125

2226
public PermissionMode? PermissionMode { get; init; }

ClaudeCodeSharpSDK/Internal/ClaudeCliValueExtensions.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ private static class PermissionModeValues
1414
public const string Plan = "plan";
1515
}
1616

17+
private static class EffortLevelValues
18+
{
19+
public const string Low = "low";
20+
public const string Medium = "medium";
21+
public const string High = "high";
22+
public const string Max = "max";
23+
}
24+
1725
private static class SettingSourceValues
1826
{
1927
public const string User = "user";
@@ -35,6 +43,18 @@ public static string ToCliValue(this PermissionMode permissionMode)
3543
};
3644
}
3745

46+
public static string ToCliValue(this EffortLevel effortLevel)
47+
{
48+
return effortLevel switch
49+
{
50+
EffortLevel.Low => EffortLevelValues.Low,
51+
EffortLevel.Medium => EffortLevelValues.Medium,
52+
EffortLevel.High => EffortLevelValues.High,
53+
EffortLevel.Max => EffortLevelValues.Max,
54+
_ => throw new ArgumentOutOfRangeException(nameof(effortLevel), effortLevel, null),
55+
};
56+
}
57+
3858
public static string ToCliValue(this SettingSource settingSource)
3959
{
4060
return settingSource switch

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "10.0.103",
3+
"version": "10.0.102",
44
"rollForward": "latestFeature"
55
},
66
"test": {

0 commit comments

Comments
 (0)