|
17 | 17 | import com.fasterxml.jackson.databind.JsonNode; |
18 | 18 | import com.fasterxml.jackson.databind.ObjectMapper; |
19 | 19 | import com.github.copilot.sdk.generated.SessionEvent; |
| 20 | +import com.github.copilot.sdk.json.AutoModeSwitchRequest; |
| 21 | +import com.github.copilot.sdk.json.ExitPlanModeRequest; |
20 | 22 | import com.github.copilot.sdk.json.PermissionRequestResult; |
21 | 23 | import com.github.copilot.sdk.json.PermissionRequestResultKind; |
22 | 24 | import com.github.copilot.sdk.json.SessionLifecycleEvent; |
@@ -79,6 +81,10 @@ void registerHandlers(JsonRpcClient rpc) { |
79 | 81 | (requestId, params) -> handlePermissionRequest(rpc, requestId, params)); |
80 | 82 | rpc.registerMethodHandler("userInput.request", |
81 | 83 | (requestId, params) -> handleUserInputRequest(rpc, requestId, params)); |
| 84 | + rpc.registerMethodHandler("exitPlanMode.request", |
| 85 | + (requestId, params) -> handleExitPlanModeRequest(rpc, requestId, params)); |
| 86 | + rpc.registerMethodHandler("autoModeSwitch.request", |
| 87 | + (requestId, params) -> handleAutoModeSwitchRequest(rpc, requestId, params)); |
82 | 88 | rpc.registerMethodHandler("hooks.invoke", (requestId, params) -> handleHooksInvoke(rpc, requestId, params)); |
83 | 89 | rpc.registerMethodHandler("systemMessage.transform", |
84 | 90 | (requestId, params) -> handleSystemMessageTransform(rpc, requestId, params)); |
@@ -283,6 +289,96 @@ private void handleUserInputRequest(JsonRpcClient rpc, String requestId, JsonNod |
283 | 289 | }); |
284 | 290 | } |
285 | 291 |
|
| 292 | + private void handleExitPlanModeRequest(JsonRpcClient rpc, String requestId, JsonNode params) { |
| 293 | + runAsync(() -> { |
| 294 | + try { |
| 295 | + String sessionId = params.get("sessionId").asText(); |
| 296 | + |
| 297 | + CopilotSession session = sessions.get(sessionId); |
| 298 | + if (session == null) { |
| 299 | + rpc.sendErrorResponse(Long.parseLong(requestId), -32602, "Unknown session " + sessionId); |
| 300 | + return; |
| 301 | + } |
| 302 | + |
| 303 | + var request = new ExitPlanModeRequest(); |
| 304 | + if (params.has("summary")) { |
| 305 | + request.setSummary(params.get("summary").asText()); |
| 306 | + } |
| 307 | + if (params.has("planContent") && !params.get("planContent").isNull()) { |
| 308 | + request.setPlanContent(params.get("planContent").asText()); |
| 309 | + } |
| 310 | + if (params.has("actions") && params.get("actions").isArray()) { |
| 311 | + var actions = new ArrayList<String>(); |
| 312 | + for (JsonNode action : params.get("actions")) { |
| 313 | + actions.add(action.asText()); |
| 314 | + } |
| 315 | + request.setActions(actions); |
| 316 | + } |
| 317 | + if (params.has("recommendedAction") && !params.get("recommendedAction").isNull()) { |
| 318 | + request.setRecommendedAction(params.get("recommendedAction").asText()); |
| 319 | + } |
| 320 | + |
| 321 | + session.handleExitPlanModeRequest(request).thenAccept(result -> { |
| 322 | + try { |
| 323 | + rpc.sendResponse(Long.parseLong(requestId), MAPPER.valueToTree(result)); |
| 324 | + } catch (IOException e) { |
| 325 | + LOG.log(Level.SEVERE, "Error sending exit plan mode response", e); |
| 326 | + } |
| 327 | + }).exceptionally(ex -> { |
| 328 | + try { |
| 329 | + rpc.sendErrorResponse(Long.parseLong(requestId), -32603, |
| 330 | + "Exit plan mode handler error: " + ex.getMessage()); |
| 331 | + } catch (IOException e) { |
| 332 | + LOG.log(Level.SEVERE, "Error sending exit plan mode error", e); |
| 333 | + } |
| 334 | + return null; |
| 335 | + }); |
| 336 | + } catch (Exception e) { |
| 337 | + LOG.log(Level.SEVERE, "Error handling exit plan mode request", e); |
| 338 | + } |
| 339 | + }); |
| 340 | + } |
| 341 | + |
| 342 | + private void handleAutoModeSwitchRequest(JsonRpcClient rpc, String requestId, JsonNode params) { |
| 343 | + runAsync(() -> { |
| 344 | + try { |
| 345 | + String sessionId = params.get("sessionId").asText(); |
| 346 | + |
| 347 | + CopilotSession session = sessions.get(sessionId); |
| 348 | + if (session == null) { |
| 349 | + rpc.sendErrorResponse(Long.parseLong(requestId), -32602, "Unknown session " + sessionId); |
| 350 | + return; |
| 351 | + } |
| 352 | + |
| 353 | + var request = new AutoModeSwitchRequest(); |
| 354 | + if (params.has("errorCode") && !params.get("errorCode").isNull()) { |
| 355 | + request.setErrorCode(params.get("errorCode").asText()); |
| 356 | + } |
| 357 | + if (params.has("retryAfterSeconds") && !params.get("retryAfterSeconds").isNull()) { |
| 358 | + request.setRetryAfterSeconds(params.get("retryAfterSeconds").asDouble()); |
| 359 | + } |
| 360 | + |
| 361 | + session.handleAutoModeSwitchRequest(request).thenAccept(response -> { |
| 362 | + try { |
| 363 | + rpc.sendResponse(Long.parseLong(requestId), Map.of("response", response)); |
| 364 | + } catch (IOException e) { |
| 365 | + LOG.log(Level.SEVERE, "Error sending auto mode switch response", e); |
| 366 | + } |
| 367 | + }).exceptionally(ex -> { |
| 368 | + try { |
| 369 | + rpc.sendErrorResponse(Long.parseLong(requestId), -32603, |
| 370 | + "Auto mode switch handler error: " + ex.getMessage()); |
| 371 | + } catch (IOException e) { |
| 372 | + LOG.log(Level.SEVERE, "Error sending auto mode switch error", e); |
| 373 | + } |
| 374 | + return null; |
| 375 | + }); |
| 376 | + } catch (Exception e) { |
| 377 | + LOG.log(Level.SEVERE, "Error handling auto mode switch request", e); |
| 378 | + } |
| 379 | + }); |
| 380 | + } |
| 381 | + |
286 | 382 | private void handleHooksInvoke(JsonRpcClient rpc, String requestId, JsonNode params) { |
287 | 383 | runAsync(() -> { |
288 | 384 | try { |
|
0 commit comments