Update .NET Copilot SDK recipes for explicit permission (fix for SDK v0.1.28) (#1033)

* Update .NET Copilot SDK recipes for explicit permission handling (fix breaking change in SDK v0.1.28)

* Update .NET Copilot SDK recipes for explicit permission handling
This commit is contained in:
Jon Galloway
2026-03-16 18:49:03 -07:00
committed by GitHub
parent 99e00272f8
commit e2c763df88
14 changed files with 78 additions and 26 deletions

View File

@@ -64,6 +64,7 @@ await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "claude-opus-4.6",
Streaming = true,
OnPermissionRequest = PermissionHandler.ApproveAll,
McpServers = new Dictionary<string, object>()
{
["playwright"] =
@@ -207,6 +208,7 @@ if (generateTests == "y" || generateTests == "yes")
The recipe configures a local MCP server that runs alongside the session:
```csharp
OnPermissionRequest = PermissionHandler.ApproveAll,
McpServers = new Dictionary<string, object>()
{
["playwright"] = new McpLocalServerConfig

View File

@@ -24,7 +24,8 @@ try
await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
var done = new TaskCompletionSource<string>();
@@ -76,7 +77,11 @@ catch (Exception ex)
## Timeout handling
```csharp
var session = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
try
{
@@ -106,7 +111,11 @@ catch (OperationCanceledException)
## Aborting a request
```csharp
var session = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
// Start a request
await session.SendAsync(new MessageOptions { Prompt = "Write a very long story..." });
@@ -141,7 +150,11 @@ Console.CancelKeyPress += async (sender, e) =>
await using var client = new CopilotClient();
await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
// ... do work ...
@@ -150,6 +163,8 @@ var session = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5
## Best practices
Starting with Copilot SDK v0.1.28, permission handling is opt-in. If a session may need tool, file, or system access, set `OnPermissionRequest` explicitly when creating it.
1. **Always clean up**: Use try-finally or `await using` to ensure `StopAsync()` is called
2. **Handle connection errors**: The CLI might not be installed or running
3. **Set appropriate timeouts**: Use `CancellationToken` for long-running requests

View File

@@ -6,6 +6,7 @@ Use Copilot to intelligently organize files in a folder based on their metadata.
>
> ```bash
> dotnet run recipe/managing-local-files.cs
> dotnet run recipe/managing-local-files.cs -- /path/to/folder
> ```
## Example scenario
@@ -24,7 +25,8 @@ await client.StartAsync();
// Define tools for file operations
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
// Wait for completion
@@ -49,8 +51,8 @@ session.On(evt =>
}
});
// Ask Copilot to organize files
var targetFolder = @"C:\Users\Me\Downloads";
// Use an explicit folder or default to the current directory
var targetFolder = args.FirstOrDefault() ?? Environment.CurrentDirectory;
await session.SendAsync(new MessageOptions
{

View File

@@ -12,7 +12,7 @@ Manage multiple independent conversations simultaneously.
You need to run multiple conversations in parallel, each with its own context and history.
## C#
## C #
```csharp
using GitHub.Copilot.SDK;
@@ -21,9 +21,21 @@ await using var client = new CopilotClient();
await client.StartAsync();
// Create multiple independent sessions
var session1 = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session2 = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session3 = await client.CreateSessionAsync(new SessionConfig { Model = "claude-sonnet-4.5" });
var session1 = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
var session2 = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
var session3 = await client.CreateSessionAsync(new SessionConfig
{
Model = "claude-sonnet-4.5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
// Each session maintains its own conversation history
await session1.SendAsync(new MessageOptions { Prompt = "You are helping with a Python project" });
@@ -49,7 +61,8 @@ Use custom IDs for easier tracking:
var session = await client.CreateSessionAsync(new SessionConfig
{
SessionId = "user-123-chat",
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
Console.WriteLine(session.SessionId); // "user-123-chat"

View File

@@ -25,7 +25,8 @@ await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
SessionId = "user-123-conversation",
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
await session.SendAsync(new MessageOptions { Prompt = "Let's discuss TypeScript generics" });

View File

@@ -165,6 +165,7 @@ await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll,
SystemMessage = new SystemMessageConfig
{
Content = $"""

View File

@@ -58,7 +58,11 @@ try
// Fresh session each iteration — context isolation is the point
var session = await client.CreateSessionAsync(
new SessionConfig { Model = "gpt-5.1-codex-mini" });
new SessionConfig
{
Model = "gpt-5.1-codex-mini",
OnPermissionRequest = PermissionHandler.ApproveAll
});
try
{
var done = new TaskCompletionSource<string>();
@@ -125,8 +129,7 @@ try
// Pin the agent to the project directory
WorkingDirectory = Environment.CurrentDirectory,
// Auto-approve tool calls for unattended operation
OnPermissionRequest = (_, _) => Task.FromResult(
new PermissionRequestResult { Kind = "approved" }),
OnPermissionRequest = PermissionHandler.ApproveAll,
});
try
{

View File

@@ -32,6 +32,7 @@ await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "claude-opus-4.6",
Streaming = true,
OnPermissionRequest = PermissionHandler.ApproveAll,
McpServers = new Dictionary<string, object>()
{
["playwright"] =

View File

@@ -10,7 +10,8 @@ try
await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
var done = new TaskCompletionSource<string>();

View File

@@ -10,7 +10,8 @@ await client.StartAsync();
// Define tools for file operations
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
// Wait for completion
@@ -36,8 +37,7 @@ session.On(evt =>
});
// Ask Copilot to organize files
// Change this to your target folder
var targetFolder = @"C:\Users\Me\Downloads";
var targetFolder = args.FirstOrDefault() ?? Environment.CurrentDirectory;
await session.SendAsync(new MessageOptions
{

View File

@@ -7,9 +7,21 @@ await using var client = new CopilotClient();
await client.StartAsync();
// Create multiple independent sessions
var session1 = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session2 = await client.CreateSessionAsync(new SessionConfig { Model = "gpt-5" });
var session3 = await client.CreateSessionAsync(new SessionConfig { Model = "claude-sonnet-4.5" });
var session1 = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
var session2 = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
var session3 = await client.CreateSessionAsync(new SessionConfig
{
Model = "claude-sonnet-4.5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
Console.WriteLine("Created 3 independent sessions");

View File

@@ -10,7 +10,8 @@ await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
SessionId = "user-123-conversation",
Model = "gpt-5"
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll
});
await session.SendAsync(new MessageOptions { Prompt = "Let's discuss TypeScript generics" });

View File

@@ -132,6 +132,7 @@ await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
OnPermissionRequest = PermissionHandler.ApproveAll,
SystemMessage = new SystemMessageConfig
{
Content = $"""

View File

@@ -48,8 +48,7 @@ try
// Pin the agent to the project directory
WorkingDirectory = Environment.CurrentDirectory,
// Auto-approve tool calls for unattended operation
OnPermissionRequest = (_, _) => Task.FromResult(
new PermissionRequestResult { Kind = "approved" }),
OnPermissionRequest = PermissionHandler.ApproveAll,
});
try