Skip to content

Commit dd06281

Browse files
fix: add enum type safety for Mode properties in C# RPC types
The mode property now uses SessionModeGetResultMode enum with Interactive, Plan, and Autopilot values for compile-time validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent f8c8005 commit dd06281

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

dotnet/src/Generated/Rpc.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public class SessionModeGetResult
220220
{
221221
/// <summary>The current agent mode.</summary>
222222
[JsonPropertyName("mode")]
223-
public string Mode { get; set; } = string.Empty;
223+
public SessionModeGetResultMode Mode { get; set; }
224224
}
225225

226226
internal class GetRequest
@@ -233,7 +233,7 @@ public class SessionModeSetResult
233233
{
234234
/// <summary>The agent mode after switching.</summary>
235235
[JsonPropertyName("mode")]
236-
public string Mode { get; set; } = string.Empty;
236+
public SessionModeGetResultMode Mode { get; set; }
237237
}
238238

239239
internal class SetRequest
@@ -242,7 +242,7 @@ internal class SetRequest
242242
public string SessionId { get; set; } = string.Empty;
243243

244244
[JsonPropertyName("mode")]
245-
public string Mode { get; set; } = string.Empty;
245+
public SessionModeGetResultMode Mode { get; set; }
246246
}
247247

248248
public class SessionPlanReadResult
@@ -346,6 +346,18 @@ internal class StartRequest
346346
public string? Prompt { get; set; }
347347
}
348348

349+
[JsonConverter(typeof(JsonStringEnumConverter<SessionModeGetResultMode>))]
350+
public enum SessionModeGetResultMode
351+
{
352+
[JsonStringEnumMemberName("interactive")]
353+
Interactive,
354+
[JsonStringEnumMemberName("plan")]
355+
Plan,
356+
[JsonStringEnumMemberName("autopilot")]
357+
Autopilot,
358+
}
359+
360+
349361
/// <summary>Typed server-scoped RPC methods (no session required).</summary>
350362
public class ServerRpc
351363
{

scripts/codegen/csharp.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,19 @@ export async function generateSessionEvents(schemaPath?: string): Promise<void>
459459

460460
let emittedRpcClasses = new Set<string>();
461461
let rpcKnownTypes = new Map<string, string>();
462+
let rpcEnumOutput: string[] = [];
462463

463464
function singularPascal(s: string): string {
464465
const p = toPascalCase(s);
465466
return p.endsWith("s") ? p.slice(0, -1) : p;
466467
}
467468

468469
function resolveRpcType(schema: JSONSchema7, isRequired: boolean, parentClassName: string, propName: string, classes: string[]): string {
470+
// Handle enums (string unions like "interactive" | "plan" | "autopilot")
471+
if (schema.enum && Array.isArray(schema.enum)) {
472+
const enumName = getOrCreateEnum(parentClassName, propName, schema.enum as string[], rpcEnumOutput);
473+
return isRequired ? enumName : `${enumName}?`;
474+
}
469475
if (schema.type === "object" && schema.properties) {
470476
const className = `${parentClassName}${propName}`;
471477
classes.push(emitRpcClass(className, schema, "public", classes));
@@ -708,6 +714,8 @@ function emitSessionApiClass(className: string, node: Record<string, unknown>, c
708714
function generateRpcCode(schema: ApiSchema): string {
709715
emittedRpcClasses.clear();
710716
rpcKnownTypes.clear();
717+
rpcEnumOutput = [];
718+
generatedEnums.clear(); // Clear shared enum deduplication map
711719
const classes: string[] = [];
712720

713721
let serverRpcParts: string[] = [];
@@ -730,6 +738,7 @@ namespace GitHub.Copilot.SDK.Rpc;
730738
`);
731739

732740
for (const cls of classes) if (cls) lines.push(cls, "");
741+
for (const enumCode of rpcEnumOutput) lines.push(enumCode, "");
733742
for (const part of serverRpcParts) lines.push(part, "");
734743
for (const part of sessionRpcParts) lines.push(part, "");
735744

0 commit comments

Comments
 (0)