Skip to content

Commit 5c38b90

Browse files
In C# codegen, represent optional RPC params as optional C# method params, not just nullable values (#733)
1 parent e478657 commit 5c38b90

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

dotnet/src/Generated/Rpc.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ internal FleetApi(JsonRpc rpc, string sessionId)
775775
}
776776

777777
/// <summary>Calls "session.fleet.start".</summary>
778-
public async Task<SessionFleetStartResult> StartAsync(string? prompt, CancellationToken cancellationToken = default)
778+
public async Task<SessionFleetStartResult> StartAsync(string? prompt = null, CancellationToken cancellationToken = default)
779779
{
780780
var request = new SessionFleetStartRequest { SessionId = _sessionId, Prompt = prompt };
781781
return await CopilotClient.InvokeRpcAsync<SessionFleetStartResult>(_rpc, "session.fleet.start", [request], cancellationToken);
@@ -853,7 +853,7 @@ internal ToolsApi(JsonRpc rpc, string sessionId)
853853
}
854854

855855
/// <summary>Calls "session.tools.handlePendingToolCall".</summary>
856-
public async Task<SessionToolsHandlePendingToolCallResult> HandlePendingToolCallAsync(string requestId, object? result, string? error, CancellationToken cancellationToken = default)
856+
public async Task<SessionToolsHandlePendingToolCallResult> HandlePendingToolCallAsync(string requestId, object? result = null, string? error = null, CancellationToken cancellationToken = default)
857857
{
858858
var request = new SessionToolsHandlePendingToolCallRequest { SessionId = _sessionId, RequestId = requestId, Result = result, Error = error };
859859
return await CopilotClient.InvokeRpcAsync<SessionToolsHandlePendingToolCallResult>(_rpc, "session.tools.handlePendingToolCall", [request], cancellationToken);

scripts/codegen/csharp.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,13 @@ function emitSessionApiClass(className: string, node: Record<string, unknown>, c
699699
const paramEntries = (method.params?.properties ? Object.entries(method.params.properties) : []).filter(([k]) => k !== "sessionId");
700700
const requiredSet = new Set(method.params?.required || []);
701701

702+
// Sort so required params come before optional (C# requires defaults at end)
703+
paramEntries.sort((a, b) => {
704+
const aReq = requiredSet.has(a[0]) ? 0 : 1;
705+
const bReq = requiredSet.has(b[0]) ? 0 : 1;
706+
return aReq - bReq;
707+
});
708+
702709
const requestClassName = `${typeToClassName(method.rpcMethod)}Request`;
703710
if (method.params) {
704711
const reqClass = emitRpcClass(requestClassName, method.params, "internal", classes);
@@ -711,8 +718,9 @@ function emitSessionApiClass(className: string, node: Record<string, unknown>, c
711718

712719
for (const [pName, pSchema] of paramEntries) {
713720
if (typeof pSchema !== "object") continue;
714-
const csType = resolveRpcType(pSchema as JSONSchema7, requiredSet.has(pName), requestClassName, toPascalCase(pName), classes);
715-
sigParams.push(`${csType} ${pName}`);
721+
const isReq = requiredSet.has(pName);
722+
const csType = resolveRpcType(pSchema as JSONSchema7, isReq, requestClassName, toPascalCase(pName), classes);
723+
sigParams.push(`${csType} ${pName}${isReq ? "" : " = null"}`);
716724
bodyAssignments.push(`${toPascalCase(pName)} = ${pName}`);
717725
}
718726
sigParams.push("CancellationToken cancellationToken = default");

0 commit comments

Comments
 (0)