Skip to content

Commit f4d1f2e

Browse files
authored
Merge pull request #142 from copilot-community-sdk/merge-upstream-20260217
Merge upstream SDK changes (2026-02-17)
2 parents 9d6ef2e + c18558d commit f4d1f2e

16 files changed

+265
-7
lines changed

.github/scripts/build/format-and-test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# ──────────────────────────────────────────────────────────────
1414
set -euo pipefail
1515

16-
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
16+
ROOT_DIR="$(cd "$(dirname "$0")/../../.." && pwd)"
1717
cd "$ROOT_DIR"
1818

1919
FORMAT=true

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Java SDK for programmatic control of GitHub Copilot CLI, enabling you to build A
2525
### Requirements
2626

2727
- Java 17 or later
28-
- GitHub Copilot CLI 0.0.409 or later installed and in PATH (or provide custom `cliPath`)
28+
- GitHub Copilot CLI 0.0.411-1 or later installed and in PATH (or provide custom `cliPath`)
2929

3030
### Maven
3131

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ final class CliServerManager {
3232
private static final Logger LOG = Logger.getLogger(CliServerManager.class.getName());
3333

3434
private final CopilotClientOptions options;
35+
private final StringBuilder stderrBuffer = new StringBuilder();
3536

3637
CliServerManager(CopilotClientOptions options) {
3738
this.options = options;
@@ -47,6 +48,8 @@ final class CliServerManager {
4748
* if interrupted while waiting for port detection
4849
*/
4950
ProcessInfo startCliServer() throws IOException, InterruptedException {
51+
clearStderrBuffer();
52+
5053
String cliPath = options.getCliPath() != null ? options.getCliPath() : "copilot";
5154
var args = new ArrayList<String>();
5255

@@ -152,6 +155,9 @@ private void startStderrReader(Process process) {
152155
new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))) {
153156
String line;
154157
while ((line = reader.readLine()) != null) {
158+
synchronized (stderrBuffer) {
159+
stderrBuffer.append(line).append('\n');
160+
}
155161
LOG.fine("[CLI] " + line);
156162
}
157163
} catch (IOException e) {
@@ -171,6 +177,10 @@ private Integer waitForPortAnnouncement(Process process) throws IOException {
171177
while (System.currentTimeMillis() < deadline) {
172178
String line = reader.readLine();
173179
if (line == null) {
180+
String stderr = getStderrOutput();
181+
if (!stderr.isEmpty()) {
182+
throw new IOException("CLI process exited unexpectedly. stderr: " + stderr);
183+
}
174184
throw new IOException("CLI process exited unexpectedly");
175185
}
176186

@@ -185,6 +195,18 @@ private Integer waitForPortAnnouncement(Process process) throws IOException {
185195
}
186196
}
187197

198+
String getStderrOutput() {
199+
synchronized (stderrBuffer) {
200+
return stderrBuffer.toString().trim();
201+
}
202+
}
203+
204+
private void clearStderrBuffer() {
205+
synchronized (stderrBuffer) {
206+
stderrBuffer.setLength(0);
207+
}
208+
}
209+
188210
private List<String> resolveCliCommand(String cliPath, List<String> args) {
189211
boolean isJsFile = cliPath.toLowerCase().endsWith(".js");
190212

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package com.github.copilot.sdk;
66

7+
import java.io.IOException;
78
import java.net.URI;
89
import java.util.ArrayList;
910
import java.util.HashMap;
@@ -174,6 +175,11 @@ private CompletableFuture<Connection> startCore() {
174175
LOG.info("Copilot client connected");
175176
return connection;
176177
} catch (Exception e) {
178+
String stderr = serverManager.getStderrOutput();
179+
if (!stderr.isEmpty()) {
180+
throw new CompletionException(
181+
new IOException("CLI process exited unexpectedly. stderr: " + stderr, e));
182+
}
177183
throw new CompletionException(e);
178184
}
179185
});

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ static CreateSessionRequest buildCreateRequest(SessionConfig config) {
4949
request.setWorkingDirectory(config.getWorkingDirectory());
5050
request.setStreaming(config.isStreaming() ? true : null);
5151
request.setMcpServers(config.getMcpServers());
52+
request.setEnvValueMode("direct");
5253
request.setCustomAgents(config.getCustomAgents());
5354
request.setInfiniteSessions(config.getInfiniteSessions());
5455
request.setSkillDirectories(config.getSkillDirectories());
@@ -90,6 +91,7 @@ static ResumeSessionRequest buildResumeRequest(String sessionId, ResumeSessionCo
9091
request.setDisableResume(config.isDisableResume() ? true : null);
9192
request.setStreaming(config.isStreaming() ? true : null);
9293
request.setMcpServers(config.getMcpServers());
94+
request.setEnvValueMode("direct");
9395
request.setCustomAgents(config.getCustomAgents());
9496
request.setSkillDirectories(config.getSkillDirectories());
9597
request.setDisabledSkills(config.getDisabledSkills());

src/main/java/com/github/copilot/sdk/events/AbstractSessionEvent.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@
5252
public abstract sealed class AbstractSessionEvent permits
5353
// Session events
5454
SessionStartEvent, SessionResumeEvent, SessionErrorEvent, SessionIdleEvent, SessionInfoEvent,
55-
SessionModelChangeEvent, SessionHandoffEvent, SessionTruncationEvent, SessionSnapshotRewindEvent,
56-
SessionUsageInfoEvent, SessionCompactionStartEvent, SessionCompactionCompleteEvent, SessionShutdownEvent,
57-
SessionContextChangedEvent,
55+
SessionModelChangeEvent, SessionModeChangedEvent, SessionPlanChangedEvent, SessionWorkspaceFileChangedEvent,
56+
SessionHandoffEvent, SessionTruncationEvent, SessionSnapshotRewindEvent, SessionUsageInfoEvent,
57+
SessionCompactionStartEvent, SessionCompactionCompleteEvent, SessionShutdownEvent, SessionContextChangedEvent,
5858
// Assistant events
5959
AssistantTurnStartEvent, AssistantIntentEvent, AssistantReasoningEvent, AssistantReasoningDeltaEvent,
6060
AssistantMessageEvent, AssistantMessageDeltaEvent, AssistantTurnEndEvent, AssistantUsageEvent, AbortEvent,

src/main/java/com/github/copilot/sdk/events/SessionEventParser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public class SessionEventParser {
5555
TYPE_MAP.put("session.idle", SessionIdleEvent.class);
5656
TYPE_MAP.put("session.info", SessionInfoEvent.class);
5757
TYPE_MAP.put("session.model_change", SessionModelChangeEvent.class);
58+
TYPE_MAP.put("session.mode_changed", SessionModeChangedEvent.class);
59+
TYPE_MAP.put("session.plan_changed", SessionPlanChangedEvent.class);
60+
TYPE_MAP.put("session.workspace_file_changed", SessionWorkspaceFileChangedEvent.class);
5861
TYPE_MAP.put("session.handoff", SessionHandoffEvent.class);
5962
TYPE_MAP.put("session.truncation", SessionTruncationEvent.class);
6063
TYPE_MAP.put("session.snapshot_rewind", SessionSnapshotRewindEvent.class);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------------------------------------------*/
4+
5+
package com.github.copilot.sdk.events;
6+
7+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
10+
/**
11+
* Event: session.mode_changed
12+
*
13+
* @since 1.0.10
14+
*/
15+
@JsonIgnoreProperties(ignoreUnknown = true)
16+
public final class SessionModeChangedEvent extends AbstractSessionEvent {
17+
18+
@JsonProperty("data")
19+
private SessionModeChangedData data;
20+
21+
@Override
22+
public String getType() {
23+
return "session.mode_changed";
24+
}
25+
26+
public SessionModeChangedData getData() {
27+
return data;
28+
}
29+
30+
public void setData(SessionModeChangedData data) {
31+
this.data = data;
32+
}
33+
34+
@JsonIgnoreProperties(ignoreUnknown = true)
35+
public record SessionModeChangedData(@JsonProperty("previousMode") String previousMode,
36+
@JsonProperty("newMode") String newMode) {
37+
}
38+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------------------------------------------*/
4+
5+
package com.github.copilot.sdk.events;
6+
7+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
10+
/**
11+
* Event: session.plan_changed
12+
*
13+
* @since 1.0.10
14+
*/
15+
@JsonIgnoreProperties(ignoreUnknown = true)
16+
public final class SessionPlanChangedEvent extends AbstractSessionEvent {
17+
18+
@JsonProperty("data")
19+
private SessionPlanChangedData data;
20+
21+
@Override
22+
public String getType() {
23+
return "session.plan_changed";
24+
}
25+
26+
public SessionPlanChangedData getData() {
27+
return data;
28+
}
29+
30+
public void setData(SessionPlanChangedData data) {
31+
this.data = data;
32+
}
33+
34+
@JsonIgnoreProperties(ignoreUnknown = true)
35+
public record SessionPlanChangedData(@JsonProperty("operation") String operation) {
36+
}
37+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------------------------------------------*/
4+
5+
package com.github.copilot.sdk.events;
6+
7+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
10+
/**
11+
* Event: session.workspace_file_changed
12+
*
13+
* @since 1.0.10
14+
*/
15+
@JsonIgnoreProperties(ignoreUnknown = true)
16+
public final class SessionWorkspaceFileChangedEvent extends AbstractSessionEvent {
17+
18+
@JsonProperty("data")
19+
private SessionWorkspaceFileChangedData data;
20+
21+
@Override
22+
public String getType() {
23+
return "session.workspace_file_changed";
24+
}
25+
26+
public SessionWorkspaceFileChangedData getData() {
27+
return data;
28+
}
29+
30+
public void setData(SessionWorkspaceFileChangedData data) {
31+
this.data = data;
32+
}
33+
34+
@JsonIgnoreProperties(ignoreUnknown = true)
35+
public record SessionWorkspaceFileChangedData(@JsonProperty("path") String path,
36+
@JsonProperty("operation") String operation) {
37+
}
38+
}

0 commit comments

Comments
 (0)