/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. *--------------------------------------------------------------------------------------------*/ package com.github.copilot.sdk.json; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Consumer; import com.fasterxml.jackson.annotation.JsonInclude; import com.github.copilot.sdk.events.AbstractSessionEvent; /** * Configuration for resuming an existing Copilot session. *
* This class provides options for configuring a resumed session, including tool * registration, provider configuration, and streaming. All setter methods * return {@code this} for method chaining. * *
{@code
* var config = new ResumeSessionConfig().setStreaming(true).setTools(List.of(myTool));
*
* var session = client.resumeSession(sessionId, config).get();
* }
*
* @see com.github.copilot.sdk.CopilotClient#resumeSession(String,
* ResumeSessionConfig)
* @since 1.0.0
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResumeSessionConfig {
private String clientName;
private String model;
private List* Can change the model when resuming an existing session. * * @param model * the model name * @return this config for method chaining */ public ResumeSessionConfig setModel(String model) { this.model = model; return this; } /** * Gets the client name used to identify the application using the SDK. * * @return the client name, or {@code null} if not set */ public String getClientName() { return clientName; } /** * Sets the client name to identify the application using the SDK. *
* This value is included in the User-Agent header for API requests.
*
* @param clientName
* the client name
* @return this config for method chaining
*/
public ResumeSessionConfig setClientName(String clientName) {
this.clientName = clientName;
return this;
}
/**
* Gets the custom tools for this session.
*
* @return the list of tool definitions
*/
public List
* The system message controls the behavior and personality of the assistant.
*
* @param systemMessage
* the system message configuration
* @return this config for method chaining
* @see SystemMessageConfig
*/
public ResumeSessionConfig setSystemMessage(SystemMessageConfig systemMessage) {
this.systemMessage = systemMessage;
return this;
}
/**
* Gets the list of allowed tool names.
*
* @return the list of available tool names
*/
public List
* When specified, only tools in this list will be available to the assistant.
* Takes precedence over excluded tools.
*
* @param availableTools
* the list of allowed tool names
* @return this config for method chaining
*/
public ResumeSessionConfig setAvailableTools(List
* Tools in this list will not be available to the assistant. Ignored if
* available tools is specified.
*
* @param excludedTools
* the list of tool names to exclude
* @return this config for method chaining
*/
public ResumeSessionConfig setExcludedTools(List
* Valid values: "low", "medium", "high", "xhigh".
*
* @param reasoningEffort
* the reasoning effort level
* @return this config for method chaining
*/
public ResumeSessionConfig setReasoningEffort(String reasoningEffort) {
this.reasoningEffort = reasoningEffort;
return this;
}
/**
* Gets the permission request handler.
*
* @return the permission handler
*/
public PermissionHandler getOnPermissionRequest() {
return onPermissionRequest;
}
/**
* Sets a handler for permission requests from the assistant.
*
* @param onPermissionRequest
* the permission handler
* @return this config for method chaining
* @see PermissionHandler
*/
public ResumeSessionConfig setOnPermissionRequest(PermissionHandler onPermissionRequest) {
this.onPermissionRequest = onPermissionRequest;
return this;
}
/**
* Gets the user input request handler.
*
* @return the user input handler
*/
public UserInputHandler getOnUserInputRequest() {
return onUserInputRequest;
}
/**
* Sets a handler for user input requests from the agent.
*
* @param onUserInputRequest
* the user input handler
* @return this config for method chaining
* @see UserInputHandler
*/
public ResumeSessionConfig setOnUserInputRequest(UserInputHandler onUserInputRequest) {
this.onUserInputRequest = onUserInputRequest;
return this;
}
/**
* Gets the hook handlers configuration.
*
* @return the session hooks
*/
public SessionHooks getHooks() {
return hooks;
}
/**
* Sets hook handlers for session lifecycle events.
*
* @param hooks
* the hooks configuration
* @return this config for method chaining
* @see SessionHooks
*/
public ResumeSessionConfig setHooks(SessionHooks hooks) {
this.hooks = hooks;
return this;
}
/**
* Gets the working directory for the session.
*
* @return the working directory path
*/
public String getWorkingDirectory() {
return workingDirectory;
}
/**
* Sets the working directory for the session.
*
* @param workingDirectory
* the working directory path
* @return this config for method chaining
*/
public ResumeSessionConfig setWorkingDirectory(String workingDirectory) {
this.workingDirectory = workingDirectory;
return this;
}
/**
* Gets the configuration directory path.
*
* @return the configuration directory path
*/
public String getConfigDir() {
return configDir;
}
/**
* Sets the configuration directory path.
*
* Override the default configuration directory location.
*
* @param configDir
* the configuration directory path
* @return this config for method chaining
*/
public ResumeSessionConfig setConfigDir(String configDir) {
this.configDir = configDir;
return this;
}
/**
* Returns whether the resume event is disabled.
*
* @return {@code true} if the session.resume event is suppressed
*/
public boolean isDisableResume() {
return disableResume;
}
/**
* Sets whether to disable the session.resume event.
*
* When true, the session.resume event is not emitted.
*
* @param disableResume
* {@code true} to suppress the resume event
* @return this config for method chaining
*/
public ResumeSessionConfig setDisableResume(boolean disableResume) {
this.disableResume = disableResume;
return this;
}
/**
* Returns whether streaming is enabled.
*
* @return {@code true} if streaming is enabled
*/
public boolean isStreaming() {
return streaming;
}
/**
* Sets whether to enable streaming of response chunks.
*
* @param streaming
* {@code true} to enable streaming
* @return this config for method chaining
*/
public ResumeSessionConfig setStreaming(boolean streaming) {
this.streaming = streaming;
return this;
}
/**
* Gets the MCP server configurations.
*
* @return the MCP servers map
*/
public Map
* Must match the name of one of the agents in {@link #setCustomAgents(List)}.
*
* @param agent
* the agent name to pre-select
* @return this config for method chaining
*/
public ResumeSessionConfig setAgent(String agent) {
this.agent = agent;
return this;
}
/**
* Gets the skill directories.
*
* @return the list of skill directory paths
*/
public List
* Equivalent to calling
* {@link com.github.copilot.sdk.CopilotSession#on(Consumer)} immediately after
* resumption, but executes earlier in the lifecycle so no events are missed.
*
* @param onEvent
* the event handler to register before session resumption
* @return this config for method chaining
*/
public ResumeSessionConfig setOnEvent(Consumer
* Mutable collection properties are copied into new collection instances so
* that modifications to those collections on the clone do not affect the
* original. Other reference-type properties (like provider configuration,
* system messages, hooks, infinite session configuration, and handlers) are not
* deep-cloned; the original and the clone will share those objects.
*
* @return a clone of this config instance
*/
@Override
public ResumeSessionConfig clone() {
ResumeSessionConfig copy = new ResumeSessionConfig();
copy.clientName = this.clientName;
copy.model = this.model;
copy.tools = this.tools != null ? new ArrayList<>(this.tools) : null;
copy.systemMessage = this.systemMessage;
copy.availableTools = this.availableTools != null ? new ArrayList<>(this.availableTools) : null;
copy.excludedTools = this.excludedTools != null ? new ArrayList<>(this.excludedTools) : null;
copy.provider = this.provider;
copy.reasoningEffort = this.reasoningEffort;
copy.onPermissionRequest = this.onPermissionRequest;
copy.onUserInputRequest = this.onUserInputRequest;
copy.hooks = this.hooks;
copy.workingDirectory = this.workingDirectory;
copy.configDir = this.configDir;
copy.disableResume = this.disableResume;
copy.streaming = this.streaming;
copy.mcpServers = this.mcpServers != null ? new java.util.HashMap<>(this.mcpServers) : null;
copy.customAgents = this.customAgents != null ? new ArrayList<>(this.customAgents) : null;
copy.agent = this.agent;
copy.skillDirectories = this.skillDirectories != null ? new ArrayList<>(this.skillDirectories) : null;
copy.disabledSkills = this.disabledSkills != null ? new ArrayList<>(this.disabledSkills) : null;
copy.infiniteSessions = this.infiniteSessions;
copy.onEvent = this.onEvent;
return copy;
}
}