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); }