From a74fe0d0d2c6219bb4785619ef1a9670431acc86 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 22 Feb 2026 12:42:20 +0000
Subject: [PATCH 1/3] Initial plan
From 9ba3468f988188c342ef1eb0e67839754b41fa1f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 22 Feb 2026 12:49:23 +0000
Subject: [PATCH 2/3] Update GitHub.Copilot.SDK to 0.1.25 and use Clone() for
SessionConfig copying
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
---
dotnet/Directory.Packages.props | 2 +-
.../GitHubCopilotAgent.cs | 73 ++++++++-----------
.../GitHubCopilotAgentTests.cs | 12 ++-
3 files changed, 40 insertions(+), 47 deletions(-)
diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props
index 0de4409d53..3ed320863e 100644
--- a/dotnet/Directory.Packages.props
+++ b/dotnet/Directory.Packages.props
@@ -92,7 +92,7 @@
-
+
diff --git a/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs b/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs
index c966f591fc..db200f8f56 100644
--- a/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs
+++ b/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs
@@ -274,59 +274,48 @@ private ResumeSessionConfig CreateResumeConfig()
}
///
- /// Copies all supported properties from a source into a new instance
- /// with set to true.
+ /// Clones a and sets to true.
///
internal static SessionConfig CopySessionConfig(SessionConfig source)
{
- return new SessionConfig
- {
- Model = source.Model,
- ReasoningEffort = source.ReasoningEffort,
- Tools = source.Tools,
- SystemMessage = source.SystemMessage,
- AvailableTools = source.AvailableTools,
- ExcludedTools = source.ExcludedTools,
- Provider = source.Provider,
- OnPermissionRequest = source.OnPermissionRequest,
- OnUserInputRequest = source.OnUserInputRequest,
- Hooks = source.Hooks,
- WorkingDirectory = source.WorkingDirectory,
- ConfigDir = source.ConfigDir,
- McpServers = source.McpServers,
- CustomAgents = source.CustomAgents,
- SkillDirectories = source.SkillDirectories,
- DisabledSkills = source.DisabledSkills,
- InfiniteSessions = source.InfiniteSessions,
- Streaming = true
- };
+ SessionConfig clone = source.Clone();
+ clone.Streaming = true;
+ return clone;
}
///
- /// Copies all supported properties from a source into a new
- /// with set to true.
+ /// Creates a from a source
+ /// with set to true.
///
internal static ResumeSessionConfig CopyResumeSessionConfig(SessionConfig? source)
{
+ if (source is null)
+ {
+ return new ResumeSessionConfig { Streaming = true };
+ }
+
+ // Clone the source config, then create a ResumeSessionConfig from the cloned values.
+ // This ensures collection properties are properly isolated.
+ SessionConfig cloned = source.Clone();
return new ResumeSessionConfig
{
- Model = source?.Model,
- ReasoningEffort = source?.ReasoningEffort,
- Tools = source?.Tools,
- SystemMessage = source?.SystemMessage,
- AvailableTools = source?.AvailableTools,
- ExcludedTools = source?.ExcludedTools,
- Provider = source?.Provider,
- OnPermissionRequest = source?.OnPermissionRequest,
- OnUserInputRequest = source?.OnUserInputRequest,
- Hooks = source?.Hooks,
- WorkingDirectory = source?.WorkingDirectory,
- ConfigDir = source?.ConfigDir,
- McpServers = source?.McpServers,
- CustomAgents = source?.CustomAgents,
- SkillDirectories = source?.SkillDirectories,
- DisabledSkills = source?.DisabledSkills,
- InfiniteSessions = source?.InfiniteSessions,
+ Model = cloned.Model,
+ ReasoningEffort = cloned.ReasoningEffort,
+ Tools = cloned.Tools,
+ SystemMessage = cloned.SystemMessage,
+ AvailableTools = cloned.AvailableTools,
+ ExcludedTools = cloned.ExcludedTools,
+ Provider = cloned.Provider,
+ OnPermissionRequest = cloned.OnPermissionRequest,
+ OnUserInputRequest = cloned.OnUserInputRequest,
+ Hooks = cloned.Hooks,
+ WorkingDirectory = cloned.WorkingDirectory,
+ ConfigDir = cloned.ConfigDir,
+ McpServers = cloned.McpServers,
+ CustomAgents = cloned.CustomAgents,
+ SkillDirectories = cloned.SkillDirectories,
+ DisabledSkills = cloned.DisabledSkills,
+ InfiniteSessions = cloned.InfiniteSessions,
Streaming = true
};
}
diff --git a/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs
index 8a4d3c1068..0f0bde2253 100644
--- a/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs
+++ b/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs
@@ -137,7 +137,8 @@ public void CopySessionConfig_CopiesAllProperties()
// Assert
Assert.Equal("gpt-4o", result.Model);
Assert.Equal("high", result.ReasoningEffort);
- Assert.Same(tools, result.Tools);
+ Assert.NotSame(tools, result.Tools);
+ Assert.Single(result.Tools!);
Assert.Same(systemMessage, result.SystemMessage);
Assert.Equal(new List { "tool1", "tool2" }, result.AvailableTools);
Assert.Equal(new List { "tool3" }, result.ExcludedTools);
@@ -147,7 +148,8 @@ public void CopySessionConfig_CopiesAllProperties()
Assert.Same(infiniteSessions, result.InfiniteSessions);
Assert.Same(permissionHandler, result.OnPermissionRequest);
Assert.Same(userInputHandler, result.OnUserInputRequest);
- Assert.Same(mcpServers, result.McpServers);
+ Assert.NotSame(mcpServers, result.McpServers);
+ Assert.Single(result.McpServers!);
Assert.Equal(new List { "skill1" }, result.DisabledSkills);
Assert.True(result.Streaming);
}
@@ -188,7 +190,8 @@ public void CopyResumeSessionConfig_CopiesAllProperties()
// Assert
Assert.Equal("gpt-4o", result.Model);
Assert.Equal("high", result.ReasoningEffort);
- Assert.Same(tools, result.Tools);
+ Assert.NotSame(tools, result.Tools);
+ Assert.Single(result.Tools!);
Assert.Same(systemMessage, result.SystemMessage);
Assert.Equal(new List { "tool1", "tool2" }, result.AvailableTools);
Assert.Equal(new List { "tool3" }, result.ExcludedTools);
@@ -198,7 +201,8 @@ public void CopyResumeSessionConfig_CopiesAllProperties()
Assert.Same(infiniteSessions, result.InfiniteSessions);
Assert.Same(permissionHandler, result.OnPermissionRequest);
Assert.Same(userInputHandler, result.OnUserInputRequest);
- Assert.Same(mcpServers, result.McpServers);
+ Assert.NotSame(mcpServers, result.McpServers);
+ Assert.Single(result.McpServers!);
Assert.Equal(new List { "skill1" }, result.DisabledSkills);
Assert.True(result.Streaming);
}
From 8142a83e599556a1251f637ef2a5d7bd948345a8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 22 Feb 2026 12:58:05 +0000
Subject: [PATCH 3/3] Revert CopyResumeSessionConfig to original implementation
per review feedback
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
---
.../GitHubCopilotAgent.cs | 46 ++++++++-----------
.../GitHubCopilotAgentTests.cs | 6 +--
2 files changed, 21 insertions(+), 31 deletions(-)
diff --git a/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs b/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs
index db200f8f56..e458ddcd85 100644
--- a/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs
+++ b/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs
@@ -284,38 +284,30 @@ internal static SessionConfig CopySessionConfig(SessionConfig source)
}
///
- /// Creates a from a source
- /// with set to true.
+ /// Copies all supported properties from a source into a new
+ /// with set to true.
///
internal static ResumeSessionConfig CopyResumeSessionConfig(SessionConfig? source)
{
- if (source is null)
- {
- return new ResumeSessionConfig { Streaming = true };
- }
-
- // Clone the source config, then create a ResumeSessionConfig from the cloned values.
- // This ensures collection properties are properly isolated.
- SessionConfig cloned = source.Clone();
return new ResumeSessionConfig
{
- Model = cloned.Model,
- ReasoningEffort = cloned.ReasoningEffort,
- Tools = cloned.Tools,
- SystemMessage = cloned.SystemMessage,
- AvailableTools = cloned.AvailableTools,
- ExcludedTools = cloned.ExcludedTools,
- Provider = cloned.Provider,
- OnPermissionRequest = cloned.OnPermissionRequest,
- OnUserInputRequest = cloned.OnUserInputRequest,
- Hooks = cloned.Hooks,
- WorkingDirectory = cloned.WorkingDirectory,
- ConfigDir = cloned.ConfigDir,
- McpServers = cloned.McpServers,
- CustomAgents = cloned.CustomAgents,
- SkillDirectories = cloned.SkillDirectories,
- DisabledSkills = cloned.DisabledSkills,
- InfiniteSessions = cloned.InfiniteSessions,
+ Model = source?.Model,
+ ReasoningEffort = source?.ReasoningEffort,
+ Tools = source?.Tools,
+ SystemMessage = source?.SystemMessage,
+ AvailableTools = source?.AvailableTools,
+ ExcludedTools = source?.ExcludedTools,
+ Provider = source?.Provider,
+ OnPermissionRequest = source?.OnPermissionRequest,
+ OnUserInputRequest = source?.OnUserInputRequest,
+ Hooks = source?.Hooks,
+ WorkingDirectory = source?.WorkingDirectory,
+ ConfigDir = source?.ConfigDir,
+ McpServers = source?.McpServers,
+ CustomAgents = source?.CustomAgents,
+ SkillDirectories = source?.SkillDirectories,
+ DisabledSkills = source?.DisabledSkills,
+ InfiniteSessions = source?.InfiniteSessions,
Streaming = true
};
}
diff --git a/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs
index 0f0bde2253..efd0b60dab 100644
--- a/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs
+++ b/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs
@@ -190,8 +190,7 @@ public void CopyResumeSessionConfig_CopiesAllProperties()
// Assert
Assert.Equal("gpt-4o", result.Model);
Assert.Equal("high", result.ReasoningEffort);
- Assert.NotSame(tools, result.Tools);
- Assert.Single(result.Tools!);
+ Assert.Same(tools, result.Tools);
Assert.Same(systemMessage, result.SystemMessage);
Assert.Equal(new List { "tool1", "tool2" }, result.AvailableTools);
Assert.Equal(new List { "tool3" }, result.ExcludedTools);
@@ -201,8 +200,7 @@ public void CopyResumeSessionConfig_CopiesAllProperties()
Assert.Same(infiniteSessions, result.InfiniteSessions);
Assert.Same(permissionHandler, result.OnPermissionRequest);
Assert.Same(userInputHandler, result.OnUserInputRequest);
- Assert.NotSame(mcpServers, result.McpServers);
- Assert.Single(result.McpServers!);
+ Assert.Same(mcpServers, result.McpServers);
Assert.Equal(new List { "skill1" }, result.DisabledSkills);
Assert.True(result.Streaming);
}