Skip to content

Commit a04ea0b

Browse files
committed
Revert "refactor: revert Optional usage, use plain nullable fields with @JsonInclude(NON_NULL)"
This reverts commit 8e0eeeb.
1 parent 2be2194 commit a04ea0b

25 files changed

Lines changed: 1297 additions & 364 deletions

src/main/java/com/github/copilot/sdk/CliServerManager.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,16 @@ ProcessInfo startCliServer() throws IOException, InterruptedException {
9090
}
9191

9292
// Default UseLoggedInUser to false when GitHubToken is provided
93-
boolean useLoggedInUser = options.getUseLoggedInUser() != null
94-
? options.getUseLoggedInUser()
95-
: (options.getGitHubToken() == null || options.getGitHubToken().isEmpty());
93+
boolean useLoggedInUser = options.getUseLoggedInUser()
94+
.orElse(options.getGitHubToken() == null || options.getGitHubToken().isEmpty());
9695
if (!useLoggedInUser) {
9796
args.add("--no-auto-login");
9897
}
9998

100-
if (options.getSessionIdleTimeoutSeconds() != null && options.getSessionIdleTimeoutSeconds() > 0) {
99+
if (options.getSessionIdleTimeoutSeconds().isPresent()
100+
&& options.getSessionIdleTimeoutSeconds().getAsInt() > 0) {
101101
args.add("--session-idle-timeout");
102-
args.add(String.valueOf(options.getSessionIdleTimeoutSeconds()));
102+
args.add(String.valueOf(options.getSessionIdleTimeoutSeconds().getAsInt()));
103103
}
104104

105105
if (options.isRemote()) {
@@ -159,9 +159,9 @@ ProcessInfo startCliServer() throws IOException, InterruptedException {
159159
if (telemetry.getSourceName() != null) {
160160
pb.environment().put("COPILOT_OTEL_SOURCE_NAME", telemetry.getSourceName());
161161
}
162-
if (telemetry.getCaptureContent() != null) {
162+
if (telemetry.getCaptureContent().isPresent()) {
163163
pb.environment().put("OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT",
164-
telemetry.getCaptureContent() ? "true" : "false");
164+
telemetry.getCaptureContent().get() ? "true" : "false");
165165
}
166166
}
167167

src/main/java/com/github/copilot/sdk/CopilotClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public CopilotClient(CopilotClientOptions options) {
120120

121121
// Validate auth options with external server
122122
if (this.options.getCliUrl() != null && !this.options.getCliUrl().isEmpty()
123-
&& (this.options.getGitHubToken() != null || this.options.getUseLoggedInUser() != null)) {
123+
&& (this.options.getGitHubToken() != null || this.options.getUseLoggedInUser().isPresent())) {
124124
throw new IllegalArgumentException(
125125
"GitHubToken and UseLoggedInUser cannot be used with CliUrl (external server manages its own auth)");
126126
}

src/main/java/com/github/copilot/sdk/CopilotSession.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,9 +1118,9 @@ private void handleElicitationRequestAsync(ElicitationContext context, String re
11181118
*/
11191119
private void assertElicitation() {
11201120
SessionCapabilities caps = capabilities;
1121-
if (caps == null || caps.getUi() == null || !Boolean.TRUE.equals(caps.getUi().getElicitation())) {
1121+
if (caps == null || caps.getUi() == null || !caps.getUi().getElicitation().orElse(false)) {
11221122
throw new IllegalStateException("Elicitation is not supported by the host. "
1123-
+ "Check session.getCapabilities().getUi()?.getElicitation() before calling UI methods.");
1123+
+ "Check session.getCapabilities().getUi().getElicitation().orElse(false) before calling UI methods.");
11241124
}
11251125
}
11261126

@@ -1201,10 +1201,10 @@ public CompletableFuture<String> input(String message, InputOptions options) {
12011201
field.put("title", options.getTitle());
12021202
if (options.getDescription() != null)
12031203
field.put("description", options.getDescription());
1204-
if (options.getMinLength() != null)
1205-
field.put("minLength", options.getMinLength());
1206-
if (options.getMaxLength() != null)
1207-
field.put("maxLength", options.getMaxLength());
1204+
if (options.getMinLength().isPresent())
1205+
field.put("minLength", options.getMinLength().getAsInt());
1206+
if (options.getMaxLength().isPresent())
1207+
field.put("maxLength", options.getMaxLength().getAsInt());
12081208
if (options.getFormat() != null)
12091209
field.put("format", options.getFormat());
12101210
if (options.getDefaultValue() != null)
@@ -1695,7 +1695,8 @@ public CompletableFuture<Void> setModel(String model, String reasoningEffort,
16951695
ModelCapabilitiesOverrideSupports supports = null;
16961696
if (modelCapabilities.getSupports() != null) {
16971697
var s = modelCapabilities.getSupports();
1698-
supports = new ModelCapabilitiesOverrideSupports(s.getVision(), s.getReasoningEffort());
1698+
supports = new ModelCapabilitiesOverrideSupports(s.getVision().orElse(null),
1699+
s.getReasoningEffort().orElse(null));
16991700
}
17001701
ModelCapabilitiesOverrideLimits limits = null;
17011702
if (modelCapabilities.getLimits() != null) {

src/main/java/com/github/copilot/sdk/SessionRequestBuilder.java

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,18 @@ static CreateSessionRequest buildCreateRequest(SessionConfig config, String sess
111111
request.setAvailableTools(config.getAvailableTools());
112112
request.setExcludedTools(config.getExcludedTools());
113113
request.setProvider(config.getProvider());
114-
request.setEnableSessionTelemetry(config.getEnableSessionTelemetry());
115-
request.setRequestUserInput(config.getOnUserInputRequest() != null ? true : null);
116-
request.setHooks(config.getHooks() != null && config.getHooks().hasHooks() ? true : null);
114+
config.getEnableSessionTelemetry().ifPresent(request::setEnableSessionTelemetry);
115+
if (config.getOnUserInputRequest() != null) {
116+
request.setRequestUserInput(true);
117+
}
118+
if (config.getHooks() != null && config.getHooks().hasHooks()) {
119+
request.setHooks(true);
120+
}
117121
request.setWorkingDirectory(config.getWorkingDirectory());
118-
request.setStreaming(config.isStreaming() ? true : null);
119-
request.setIncludeSubAgentStreamingEvents(config.getIncludeSubAgentStreamingEvents());
122+
if (config.isStreaming()) {
123+
request.setStreaming(true);
124+
}
125+
config.getIncludeSubAgentStreamingEvents().ifPresent(request::setIncludeSubAgentStreamingEvents);
120126
request.setMcpServers(config.getMcpServers());
121127
request.setCustomAgents(config.getCustomAgents());
122128
request.setDefaultAgent(config.getDefaultAgent());
@@ -126,7 +132,7 @@ static CreateSessionRequest buildCreateRequest(SessionConfig config, String sess
126132
request.setInstructionDirectories(config.getInstructionDirectories());
127133
request.setDisabledSkills(config.getDisabledSkills());
128134
request.setConfigDir(config.getConfigDir());
129-
request.setEnableConfigDiscovery(config.getEnableConfigDiscovery());
135+
config.getEnableConfigDiscovery().ifPresent(request::setEnableConfigDiscovery);
130136
request.setModelCapabilities(config.getModelCapabilities());
131137

132138
if (config.getCommands() != null && !config.getCommands().isEmpty()) {
@@ -194,15 +200,23 @@ static ResumeSessionRequest buildResumeRequest(String sessionId, ResumeSessionCo
194200
request.setAvailableTools(config.getAvailableTools());
195201
request.setExcludedTools(config.getExcludedTools());
196202
request.setProvider(config.getProvider());
197-
request.setEnableSessionTelemetry(config.getEnableSessionTelemetry());
198-
request.setRequestUserInput(config.getOnUserInputRequest() != null ? true : null);
199-
request.setHooks(config.getHooks() != null && config.getHooks().hasHooks() ? true : null);
203+
config.getEnableSessionTelemetry().ifPresent(request::setEnableSessionTelemetry);
204+
if (config.getOnUserInputRequest() != null) {
205+
request.setRequestUserInput(true);
206+
}
207+
if (config.getHooks() != null && config.getHooks().hasHooks()) {
208+
request.setHooks(true);
209+
}
200210
request.setWorkingDirectory(config.getWorkingDirectory());
201211
request.setConfigDir(config.getConfigDir());
202-
request.setEnableConfigDiscovery(config.getEnableConfigDiscovery());
203-
request.setDisableResume(config.isDisableResume() ? true : null);
204-
request.setStreaming(config.isStreaming() ? true : null);
205-
request.setIncludeSubAgentStreamingEvents(config.getIncludeSubAgentStreamingEvents());
212+
config.getEnableConfigDiscovery().ifPresent(request::setEnableConfigDiscovery);
213+
if (config.isDisableResume()) {
214+
request.setDisableResume(true);
215+
}
216+
if (config.isStreaming()) {
217+
request.setStreaming(true);
218+
}
219+
config.getIncludeSubAgentStreamingEvents().ifPresent(request::setIncludeSubAgentStreamingEvents);
206220
request.setMcpServers(config.getMcpServers());
207221
request.setCustomAgents(config.getCustomAgents());
208222
request.setDefaultAgent(config.getDefaultAgent());

src/main/java/com/github/copilot/sdk/json/CopilotClientOptions.java

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import java.util.function.Supplier;
1515

1616
import com.fasterxml.jackson.annotation.JsonInclude;
17+
import com.fasterxml.jackson.annotation.JsonIgnore;
18+
import java.util.Optional;
19+
import java.util.OptionalInt;
1720

1821
/**
1922
* Configuration options for creating a
@@ -499,34 +502,47 @@ public CopilotClientOptions setTelemetry(TelemetryConfig telemetry) {
499502
/**
500503
* Gets the server-wide idle timeout for sessions in seconds.
501504
*
502-
* @return the session idle timeout in seconds, or {@code null} to disable
503-
* (sessions live indefinitely)
505+
* @return an {@link OptionalInt} containing the session idle timeout in
506+
* seconds, or {@link java.util.OptionalInt#empty()} if not set. Use
507+
* {@link #clearSessionIdleTimeoutSeconds()} to revert to the default.
504508
* @since 1.3.0
505509
*/
506-
public Integer getSessionIdleTimeoutSeconds() {
507-
return sessionIdleTimeoutSeconds;
510+
@JsonIgnore
511+
public OptionalInt getSessionIdleTimeoutSeconds() {
512+
return sessionIdleTimeoutSeconds == null ? OptionalInt.empty() : OptionalInt.of(sessionIdleTimeoutSeconds);
508513
}
509514

510515
/**
511516
* Sets the server-wide idle timeout for sessions in seconds.
512517
* <p>
513518
* Sessions without activity for this duration are automatically cleaned up. Set
514-
* to {@code 0} or leave as {@code null} to disable (sessions live
515-
* indefinitely).
519+
* to {@code 0} to disable (sessions live indefinitely). Use
520+
* {@link #clearSessionIdleTimeoutSeconds()} to revert to the default.
516521
* <p>
517522
* This option is only used when the SDK spawns the CLI process; it is ignored
518523
* when connecting to an external server via {@link #setCliUrl(String)}.
519524
*
520525
* @param sessionIdleTimeoutSeconds
521-
* the idle timeout in seconds, or {@code null} to disable
526+
* the idle timeout in seconds
522527
* @return this options instance for method chaining
523528
* @since 1.3.0
524529
*/
525-
public CopilotClientOptions setSessionIdleTimeoutSeconds(Integer sessionIdleTimeoutSeconds) {
530+
public CopilotClientOptions setSessionIdleTimeoutSeconds(int sessionIdleTimeoutSeconds) {
526531
this.sessionIdleTimeoutSeconds = sessionIdleTimeoutSeconds;
527532
return this;
528533
}
529534

535+
/**
536+
* Clears the sessionIdleTimeoutSeconds setting, reverting to the default
537+
* behavior.
538+
*
539+
* @return this instance for method chaining
540+
*/
541+
public CopilotClientOptions clearSessionIdleTimeoutSeconds() {
542+
this.sessionIdleTimeoutSeconds = null;
543+
return this;
544+
}
545+
530546
/**
531547
* Gets the connection token for the headless CLI server (TCP only).
532548
*
@@ -555,11 +571,11 @@ public CopilotClientOptions setTcpConnectionToken(String tcpConnectionToken) {
555571
/**
556572
* Returns whether to use the logged-in user for authentication.
557573
*
558-
* @return {@code true} to use logged-in user auth, {@code false} to use only
559-
* explicit tokens, or {@code null} to use default behavior
574+
* @return an {@link Optional} containing the boolean value, or empty if not set
560575
*/
561-
public Boolean getUseLoggedInUser() {
562-
return useLoggedInUser;
576+
@JsonIgnore
577+
public Optional<Boolean> getUseLoggedInUser() {
578+
return Optional.ofNullable(useLoggedInUser);
563579
}
564580

565581
/**
@@ -569,15 +585,23 @@ public Boolean getUseLoggedInUser() {
569585
* auth. When false, only explicit tokens (gitHubToken or environment variables)
570586
* are used. Default: true (but defaults to false when gitHubToken is provided).
571587
* <p>
572-
* Passing {@code null} is equivalent to passing {@link Boolean#FALSE}.
573588
*
574589
* @param useLoggedInUser
575-
* {@code true} to use logged-in user auth, {@code false} or
576-
* {@code null} otherwise
590+
* {@code true} to use logged-in user auth, {@code false} otherwise
577591
* @return this options instance for method chaining
578592
*/
579-
public CopilotClientOptions setUseLoggedInUser(Boolean useLoggedInUser) {
580-
this.useLoggedInUser = useLoggedInUser != null ? useLoggedInUser : Boolean.FALSE;
593+
public CopilotClientOptions setUseLoggedInUser(boolean useLoggedInUser) {
594+
this.useLoggedInUser = useLoggedInUser;
595+
return this;
596+
}
597+
598+
/**
599+
* Clears the useLoggedInUser setting, reverting to the default behavior.
600+
*
601+
* @return this instance for method chaining
602+
*/
603+
public CopilotClientOptions clearUseLoggedInUser() {
604+
this.useLoggedInUser = null;
581605
return this;
582606
}
583607

0 commit comments

Comments
 (0)