Skip to content

Commit 1324222

Browse files
committed
On branch copilot-pr-20 Fix "2. **SessionRequestBuilder.extractTransformCallbacks returns Object[]** — MEDIUM-HIGH RISK"
Your branch is up to date with 'upstream/copilot/sync-upstream-39-new-commits'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: .gitignore modified: src/main/java/com/github/copilot/sdk/CopilotClient.java modified: src/main/java/com/github/copilot/sdk/SessionRequestBuilder.java modified: src/test/java/com/github/copilot/sdk/SessionRequestBuilderTest.java Untracked files: (use "git add <file>..." to include in what will be committed) src/main/java/com/github/copilot/sdk/ExtractedTransforms.java no changes added to commit (use "git add" and/or "git commit -a")
1 parent 14b6672 commit 1324222

File tree

5 files changed

+62
-40
lines changed

5 files changed

+62
-40
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ blog-copilotsdk/
66
.claude/worktrees
77
smoke-test
88
*job-logs.txt
9+
temporary-prompts/

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

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -336,17 +336,14 @@ public CompletableFuture<CopilotSession> createSession(SessionConfig config) {
336336
// Callbacks are registered with the session; a wire-safe copy of the
337337
// system message (with transform sections replaced by action="transform")
338338
// is used in the RPC request.
339-
Object[] extracted = SessionRequestBuilder.extractTransformCallbacks(config.getSystemMessage());
340-
var wireSystemMessage = (com.github.copilot.sdk.json.SystemMessageConfig) extracted[0];
341-
@SuppressWarnings("unchecked")
342-
var transformCallbacks = (java.util.Map<String, java.util.function.Function<String, java.util.concurrent.CompletableFuture<String>>>) extracted[1];
343-
if (transformCallbacks != null) {
344-
session.registerTransformCallbacks(transformCallbacks);
339+
var extracted = SessionRequestBuilder.extractTransformCallbacks(config.getSystemMessage());
340+
if (extracted.transformCallbacks() != null) {
341+
session.registerTransformCallbacks(extracted.transformCallbacks());
345342
}
346343

347344
var request = SessionRequestBuilder.buildCreateRequest(config, sessionId);
348-
if (wireSystemMessage != config.getSystemMessage()) {
349-
request.setSystemMessage(wireSystemMessage);
345+
if (extracted.wireSystemMessage() != config.getSystemMessage()) {
346+
request.setSystemMessage(extracted.wireSystemMessage());
350347
}
351348

352349
return connection.rpc.invoke("session.create", request, CreateSessionResponse.class).thenApply(response -> {
@@ -406,17 +403,14 @@ public CompletableFuture<CopilotSession> resumeSession(String sessionId, ResumeS
406403
sessions.put(sessionId, session);
407404

408405
// Extract transform callbacks from the system message config.
409-
Object[] extracted = SessionRequestBuilder.extractTransformCallbacks(config.getSystemMessage());
410-
var wireSystemMessage = (com.github.copilot.sdk.json.SystemMessageConfig) extracted[0];
411-
@SuppressWarnings("unchecked")
412-
var transformCallbacks = (java.util.Map<String, java.util.function.Function<String, java.util.concurrent.CompletableFuture<String>>>) extracted[1];
413-
if (transformCallbacks != null) {
414-
session.registerTransformCallbacks(transformCallbacks);
406+
var extracted = SessionRequestBuilder.extractTransformCallbacks(config.getSystemMessage());
407+
if (extracted.transformCallbacks() != null) {
408+
session.registerTransformCallbacks(extracted.transformCallbacks());
415409
}
416410

417411
var request = SessionRequestBuilder.buildResumeRequest(sessionId, config);
418-
if (wireSystemMessage != config.getSystemMessage()) {
419-
request.setSystemMessage(wireSystemMessage);
412+
if (extracted.wireSystemMessage() != config.getSystemMessage()) {
413+
request.setSystemMessage(extracted.wireSystemMessage());
420414
}
421415

422416
return connection.rpc.invoke("session.resume", request, ResumeSessionResponse.class).thenApply(response -> {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------------------------------------------*/
4+
5+
package com.github.copilot.sdk;
6+
7+
import java.util.Map;
8+
import java.util.concurrent.CompletableFuture;
9+
import java.util.function.Function;
10+
11+
import com.github.copilot.sdk.json.SystemMessageConfig;
12+
13+
/**
14+
* Result of extracting transform callbacks from a {@link SystemMessageConfig}.
15+
* <p>
16+
* Holds a wire-safe copy of the system message config (with transform callbacks
17+
* replaced by {@code action="transform"}) alongside the extracted callbacks
18+
* that must be registered with the session.
19+
*
20+
* @param wireSystemMessage
21+
* the system message config safe for JSON serialization; may be
22+
* {@code null} when the input config was {@code null}
23+
* @param transformCallbacks
24+
* transform callbacks keyed by section identifier; {@code null} when
25+
* no transforms were present
26+
* @see SessionRequestBuilder#extractTransformCallbacks(SystemMessageConfig)
27+
*/
28+
record ExtractedTransforms(SystemMessageConfig wireSystemMessage,
29+
Map<String, Function<String, CompletableFuture<String>>> transformCallbacks) {
30+
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ private SessionRequestBuilder() {
4747
*
4848
* @param systemMessage
4949
* the system message config, may be {@code null}
50-
* @return a two-element array: {@code [wireConfig, callbacks]}; either may be
51-
* {@code null} if not applicable
50+
* @return an {@link ExtractedTransforms} containing the wire-safe config and
51+
* any extracted callbacks
5252
*/
53-
static Object[] extractTransformCallbacks(SystemMessageConfig systemMessage) {
53+
static ExtractedTransforms extractTransformCallbacks(SystemMessageConfig systemMessage) {
5454
if (systemMessage == null || systemMessage.getMode() != SystemMessageMode.CUSTOMIZE
5555
|| systemMessage.getSections() == null) {
56-
return new Object[]{systemMessage, null};
56+
return new ExtractedTransforms(systemMessage, null);
5757
}
5858

5959
Map<String, Function<String, CompletableFuture<String>>> callbacks = new HashMap<>();
@@ -72,14 +72,14 @@ static Object[] extractTransformCallbacks(SystemMessageConfig systemMessage) {
7272
}
7373

7474
if (callbacks.isEmpty()) {
75-
return new Object[]{systemMessage, null};
75+
return new ExtractedTransforms(systemMessage, null);
7676
}
7777

7878
// Build a wire-safe copy of the system message with callbacks removed
7979
var wireConfig = new SystemMessageConfig().setMode(systemMessage.getMode())
8080
.setContent(systemMessage.getContent()).setSections(wireSections);
8181

82-
return new Object[]{wireConfig, callbacks};
82+
return new ExtractedTransforms(wireConfig, callbacks);
8383
}
8484

8585
/**

src/test/java/com/github/copilot/sdk/SessionRequestBuilderTest.java

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -258,18 +258,18 @@ void testBuildResumeRequestWithAgent() {
258258

259259
@Test
260260
void extractTransformCallbacks_nullSystemMessage_returnsNull() {
261-
Object[] result = SessionRequestBuilder.extractTransformCallbacks(null);
262-
assertNull(result[0]);
263-
assertNull(result[1]);
261+
ExtractedTransforms result = SessionRequestBuilder.extractTransformCallbacks(null);
262+
assertNull(result.wireSystemMessage());
263+
assertNull(result.transformCallbacks());
264264
}
265265

266266
@Test
267267
void extractTransformCallbacks_appendMode_returnsOriginalConfig() {
268268
var config = new com.github.copilot.sdk.json.SystemMessageConfig()
269269
.setMode(com.github.copilot.sdk.SystemMessageMode.APPEND).setContent("extra content");
270-
Object[] result = SessionRequestBuilder.extractTransformCallbacks(config);
271-
assertSame(config, result[0]);
272-
assertNull(result[1]);
270+
ExtractedTransforms result = SessionRequestBuilder.extractTransformCallbacks(config);
271+
assertSame(config, result.wireSystemMessage());
272+
assertNull(result.transformCallbacks());
273273
}
274274

275275
@Test
@@ -278,32 +278,29 @@ void extractTransformCallbacks_customizeModeNoTransforms_returnsOriginalConfig()
278278
.setAction(com.github.copilot.sdk.json.SectionOverrideAction.REMOVE));
279279
var config = new com.github.copilot.sdk.json.SystemMessageConfig()
280280
.setMode(com.github.copilot.sdk.SystemMessageMode.CUSTOMIZE).setSections(sections);
281-
Object[] result = SessionRequestBuilder.extractTransformCallbacks(config);
282-
assertSame(config, result[0]);
283-
assertNull(result[1]);
281+
ExtractedTransforms result = SessionRequestBuilder.extractTransformCallbacks(config);
282+
assertSame(config, result.wireSystemMessage());
283+
assertNull(result.transformCallbacks());
284284
}
285285

286286
@Test
287-
@SuppressWarnings("unchecked")
288287
void extractTransformCallbacks_customizeModeWithTransform_extractsCallbacks() {
289288
var transformFn = (java.util.function.Function<String, CompletableFuture<String>>) content -> CompletableFuture
290289
.completedFuture(content + " modified");
291290
var sections = Map.of("identity", new com.github.copilot.sdk.json.SectionOverride().setTransform(transformFn));
292291
var config = new com.github.copilot.sdk.json.SystemMessageConfig()
293292
.setMode(com.github.copilot.sdk.SystemMessageMode.CUSTOMIZE).setSections(sections);
294293

295-
Object[] result = SessionRequestBuilder.extractTransformCallbacks(config);
294+
ExtractedTransforms result = SessionRequestBuilder.extractTransformCallbacks(config);
296295

297296
// Wire config should be different from original
298-
assertNotSame(config, result[0]);
297+
assertNotSame(config, result.wireSystemMessage());
299298
// Callbacks should be extracted
300-
assertNotNull(result[1]);
301-
var callbacks = (java.util.Map<String, java.util.function.Function<String, CompletableFuture<String>>>) result[1];
302-
assertTrue(callbacks.containsKey("identity"));
299+
assertNotNull(result.transformCallbacks());
300+
assertTrue(result.transformCallbacks().containsKey("identity"));
303301
// Wire config should have transform action instead of callback
304-
var wireConfig = (com.github.copilot.sdk.json.SystemMessageConfig) result[0];
305-
assertNotNull(wireConfig.getSections());
306-
var wireSection = wireConfig.getSections().get("identity");
302+
assertNotNull(result.wireSystemMessage().getSections());
303+
var wireSection = result.wireSystemMessage().getSections().get("identity");
307304
assertNotNull(wireSection);
308305
assertEquals(com.github.copilot.sdk.json.SectionOverrideAction.TRANSFORM, wireSection.getAction());
309306
assertNull(wireSection.getTransform());

0 commit comments

Comments
 (0)