Skip to content

Bump GitHub.Copilot.SDK from 0.1.26 to 0.3.0#7

Open
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/nuget/GitHub.Copilot.SDK-0.3.0
Open

Bump GitHub.Copilot.SDK from 0.1.26 to 0.3.0#7
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/nuget/GitHub.Copilot.SDK-0.3.0

Conversation

@dependabot
Copy link
Copy Markdown

@dependabot dependabot Bot commented on behalf of github Apr 26, 2026

Updated GitHub.Copilot.SDK from 0.1.26 to 0.3.0.

Release notes

Sourced from GitHub.Copilot.SDK's releases.

0.3.0

This release adds new capabilities — per-session authentication, scoped permissions, agent-level tool and skill control, MCP interop utilities, and more — alongside a broad naming cleanup across all four SDK languages. As we close in on a GA release, we've done a deep clean on our naming to bring it closer to the final state, reducing the amount of churn you should expect in subsequent releases. The result is a more consistent, more readable API surface across the board.


New features

Per-session GitHub authentication

Sessions can now carry their own GitHub identity. Different sessions on the same CLI server can have different GitHub users, Copilot plans, and quota limits.

const session = await client.createSession({
    onPermissionRequest: approveAll,
    gitHubToken: userAToken, // Session-level identity
});

This is independent of the client-level gitHubToken (which authenticates the CLI process itself, and is not required if all sessions bring their own auth). The session-level token determines the identity used for content exclusion, model routing, and quota checks.

Per-agent tool visibility

A new defaultAgent.excludedTools option lets you hide tools from the default agent while keeping them available to custom sub-agents, enabling the orchestrator pattern where the default agent delegates to specialized sub-agents. (#​1098)

Per-agent skills

Custom agents can now declare skills: string[] to eagerly inject specific skills into their context at startup. Skills are opt-in — agents receive no skills by default, and sub-agents do not inherit skills from the parent. (#​995)

Sub-agent streaming content

When streaming is enabled, assistant.message_delta and assistant.reasoning_delta events are now also delivered for sub-agents. Each event carries an agentId field identifying which sub-agent produced it (absent for the root agent). If your application renders all streaming deltas to the UI, you'll want to filter by agentId (or for pure back-compat, set includeSubAgentStreamingEvents: false on SessionConfig to get the old behavior of only streaming main-agent content updates). (#​1108)

Session idle timeout

A new sessionIdleTimeoutSeconds client option configures automatic session cleanup after inactivity. When set, sessions without activity for the specified duration are cleaned up. Disabled by default (sessions live indefinitely). Previously, sessions would always time out after 30 minutes of idleness - this change fixes that. (#​1093)

Custom HTTP headers for BYOK model providers

Provider headers and per-message requestHeaders can now be passed through createSession, resumeSession, and send, enabling custom header forwarding to bring-your-own-key model providers. (#​1094)

MCP CallToolResult conversion

A new convertMcpCallToolResult() utility function converts MCP CallToolResult objects (with content arrays of text, image, and resource blocks) into the SDK's ToolResultObject format. This makes it easy to use MCP tool servers as backends for SDK tool handlers. (#​1049)

ProviderConfig exported

ProviderConfig is now re-exported from the Node.js and Python SDK entry points, so consumers no longer need to duplicate the type locally when configuring Responses API providers. (#​1048)

New RPC methods

Additional low-level RPC methods are now available via session.rpc:
... (truncated)

0.3.0-preview.1

This release adds new capabilities — per-session authentication, scoped permissions, agent-level tool and skill control, MCP interop utilities, and more — alongside a broad naming cleanup across all four SDK languages. As we close in on a GA release, we've done a deep clean on our naming to bring it closer to the final state, reducing the amount of churn you should expect in subsequent releases. The result is a more consistent, more readable API surface across the board.


New features

Per-session GitHub authentication

Sessions can now carry their own GitHub identity. Different sessions on the same CLI server can have different GitHub users, Copilot plans, and quota limits.

const session = await client.createSession({
    onPermissionRequest: approveAll,
    gitHubToken: userAToken, // Session-level identity
});

This is independent of the client-level gitHubToken (which authenticates the CLI process itself, and is not required if all sessions bring their own auth). The session-level token determines the identity used for content exclusion, model routing, and quota checks.

Per-agent tool visibility

A new defaultAgent.excludedTools option lets you hide tools from the default agent while keeping them available to custom sub-agents, enabling the orchestrator pattern where the default agent delegates to specialized sub-agents. (#​1098)

Per-agent skills

Custom agents can now declare skills: string[] to eagerly inject specific skills into their context at startup. Skills are opt-in — agents receive no skills by default, and sub-agents do not inherit skills from the parent. (#​995)

Sub-agent streaming content

When streaming is enabled, assistant.message_delta and assistant.reasoning_delta events are now also delivered for sub-agents. Each event carries an agentId field identifying which sub-agent produced it (absent for the root agent). If your application renders all streaming deltas to the UI, you'll want to filter by agentId (or for pure back-compat, set includeSubAgentStreamingEvents: false on SessionConfig to get the old behavior of only streaming main-agent content updates). (#​1108)

Session idle timeout

A new sessionIdleTimeoutSeconds client option configures automatic session cleanup after inactivity. When set, sessions without activity for the specified duration are cleaned up. Disabled by default (sessions live indefinitely). Previously, sessions would always time out after 30 minutes of idleness - this change fixes that. (#​1093)

Custom HTTP headers for BYOK model providers

Provider headers and per-message requestHeaders can now be passed through createSession, resumeSession, and send, enabling custom header forwarding to bring-your-own-key model providers. (#​1094)

MCP CallToolResult conversion

A new convertMcpCallToolResult() utility function converts MCP CallToolResult objects (with content arrays of text, image, and resource blocks) into the SDK's ToolResultObject format. This makes it easy to use MCP tool servers as backends for SDK tool handlers. (#​1049)

ProviderConfig exported

ProviderConfig is now re-exported from the Node.js and Python SDK entry points, so consumers no longer need to duplicate the type locally when configuring Responses API providers. (#​1048)

New RPC methods

Additional low-level RPC methods are now available via session.rpc:
... (truncated)

0.3.0-preview.0

What's Changed

0.2.2

Feature: session filesystem support across all four SDKs

The sessionFs feature introduced earlier in Node.js is now available across .NET, Go, and Python too, so you can redirect session-scoped storage (events, checkpoints, temp files, workspace state) to your own backing store instead of the runtime's default local filesystem. This is especially useful for serverless and multi-tenant hosts. (#​1036)

// TypeScript
const client = new CopilotClient({
  sessionFs: { initialCwd: "/", sessionStatePath: "/s", conventions: "posix" },
});

const session = await client.createSession({
    createSessionFsHandler: () => ({ readFile: async () => "...", writeFile: async () => { /* ... */ }, /* ... */ })
});
// C#
var client = new CopilotClient(new CopilotClientOptions {
    SessionFs = new()
    {
        InitialCwd = "/",
        SessionStatePath = "/",
        Conventions = SessionFsSetProviderRequestConventions.Posix
    }
});

var session = await client.CreateSessionAsync(new SessionConfig
{
    CreateSessionFsHandler = _ => new MySessionFsHandler(/* ... */) // e.g., map to in-memory storage, etc
});

For a full end-to-end sample of a multi-user hosted system using sessionFs, see https://github.com/github/copilot-sdk-server-sample

Feature: override model capabilities when creating a session or switching models

All SDKs can now override individual model capabilities such as vision support without replacing the full capabilities object. This makes BYOK and custom-provider scenarios easier, and lets you change behavior mid-session with setModel/SetModelAsync. (#​1029)

const session = await client.createSession({
  modelCapabilities: { supports: { vision: false } },
});
await session.setModel("claude-sonnet-4.5", { modelCapabilities: { supports: { vision: true } } });
await session.SetModelAsync("claude-sonnet-4.5", reasoningEffort: null,
    modelCapabilities: new ModelCapabilitiesOverride { Supports = new ModelCapabilitiesOverrideSupports { Vision = true } });

... (truncated)

0.2.2-preview.0

Other changes

  • bugfix: [C#] [Go] tolerate unknown hook types to prevent session hang (#​1013)

    When the CLI invokes a hook type the SDK doesn't recognize (e.g. postToolUseFailure), .NET and Go were returning a JSON-RPC error that caused the CLI to terminate the session — appearing as a hang. Unknown hook types are now silently ignored, matching the existing Node.js behavior.

[!NOTE]

🔒 Integrity filter blocked 43 items

The following items were blocked because they don't meet the GitHub integrity level.

  • github/copilot-sdk@8569d92 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@b4fa5d9 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@6565a3b list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@0388810 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@dfdc6a0 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@c3fa6cb list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@156cf1f list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@200bfef list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@f7fd757 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@da9921e list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@7ecf1d8 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@588951e list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@28d0a33 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@dd42d42 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@ad63b09 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • github/copilot-sdk@ec72d41 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • ... and 27 more items

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
  github:
    min-integrity: approved  # merged | approved | unapproved | none

Generated by Release Changelog Generator

0.2.1

Feature: commands and UI elicitation across all four SDKs

Register slash commands that CLI users can invoke and drive interactive input dialogs from any SDK language. This feature was previously Node.js-only; it now ships in Python, Go, and .NET as well. (#​906, #​908, #​960)

const session = await client.createSession({
  onPermissionRequest: approveAll,
  commands: [{
    name: "summarize",
    description: "Summarize the conversation",
    handler: async (context) => { /* ... */ },
  }],
  onElicitationRequest: async (context) => {
    if (context.type === "confirm") return { action: "confirm" };
  },
});

// Drive dialogs from the session
const confirmed = await session.ui.confirm({ message: "Proceed?" });
const choice = await session.ui.select({ message: "Pick one", options: ["A", "B"] });
var session = await client.CreateSessionAsync(new SessionConfig {
    OnPermissionRequest = PermissionHandler.ApproveAll,
    Commands = [
        new CommandDefinition {
            Name = "summarize",
            Description = "Summarize the conversation",
            Handler = async (context) => { /* ... */ },
        }
    ],
});

// Drive dialogs from the session
var confirmed = await session.Ui.ConfirmAsync(new ConfirmOptions { Message = "Proceed?" });

⚠️ Breaking change (Node.js): The onElicitationRequest handler signature changed from two arguments (request, invocation) to a single ElicitationContext that combines both. Update callers to use context.sessionId and context.message directly.

Feature: session.getMetadata across all SDKs

Efficiently fetch metadata for a single session by ID without listing all sessions. Returns undefined/null (not an error) when the session is not found. (#​899)

  • TypeScript: const meta = await client.getSessionMetadata(sessionId);
  • C#: var meta = await client.GetSessionMetadataAsync(sessionId);
  • Python: meta = await client.get_session_metadata(session_id)
  • Go: meta, err := client.GetSessionMetadata(ctx, sessionID)

Feature: sessionFs for virtualizing per-session storage (Node SDK)

... (truncated)

0.2.1-preview.2

Feature: onElicitationRequest callback for elicitation provider support

[Node] SDK clients can now act as elicitation providers by registering an onElicitationRequest callback in SessionConfig. The SDK negotiates the requestElicitation capability with the runtime, listens for broadcast elicitation.requested events, invokes the handler, and responds automatically. (#​908)

const session = await client.createSession({
  onElicitationRequest: async (request) => {
    // respond to structured user input requests broadcast by the CLI runtime
    return { type: "string", value: "user response" };
  },
});

Feature: getSessionMetadata API across all SDKs

All SDKs now expose an efficient O(1) lookup of a single session's metadata by ID — no need to call listSessions and filter client-side. (#​899)

  • TypeScript: await client.getSessionMetadata(sessionId) — returns SessionMetadata | undefined
  • C#: await client.GetSessionMetadataAsync(sessionId) — returns SessionMetadata?
  • Python: await client.get_session_metadata(session_id) — returns SessionMetadata | None
  • Go: client.GetSessionMetadata(ctx, sessionID) — returns (*SessionMetadata, error)

Feature: async context manager support for Python client and session

[Python] CopilotClient and CopilotSession now implement the async context manager protocol for automatic resource cleanup. (#​475)

async with CopilotClient() as client:
    async with await client.create_session() as session:
        response = await session.get_response("Hello")

Other changes

  • bugfix: [Node, Go, Python] structured ToolResultObject values were stringified before RPC, causing toolTelemetry and resultType to be silently lost on the server side (#​970)
  • improvement: [All] update bundled runtime to 1.0.15-2, resolving a regression with postToolUse hooks (#​978)

New contributors

  • @​Sumanth007 made their first contribution in #​475
  • @​Morabbin made their first contribution in #​970

Generated by Release Changelog Generator

Generated by Release Changelog Generator

0.2.1-preview.1

Change: ephemeral events no longer included in getMessages()

Following a runtime update to 1.0.12, events like session.idle are now truly ephemeral — they are only observable via live event listeners and are not returned by session.getMessages() / get_messages(). This makes session resume behave consistently whether the session was previously active in-process or is being resumed from disk. (#​927)

If your code calls getMessages() and checks for a session.idle event to determine whether a turn is complete, switch to using a live event listener instead:

session.on("session.idle", () => {
  // turn is complete
});
session.OnSessionIdle += (e) => {
    // turn is complete
};

Other changes

  • improvement: [All] COPILOT_CLI_PATH env var is now read from the effective environment configured on the client (e.g. via options.env), not just the process environment — consistent across all SDKs (#​925)

Generated by Release Changelog Generator

0.2.1-preview.0

Feature: commands and UI elicitation support for Node.js

The Node.js SDK now supports registering slash commands and prompting users with interactive dialogs. Pass commands in session config to handle CLI slash commands; use session.ui to show confirm, select, or text-input prompts. The feature was already available in other SDKs. (#​906)

const session = await client.createSession({
  commands: [{
    name: "deploy",
    handler: async (params) => ({ text: `Deploying to \$\{params.args}...` })
  }]
});

const confirmed = await session.ui.confirm({ title: "Proceed?", message: "This will deploy to production." });
const env = await session.ui.select({ title: "Environment", options: [{ value: "prod" }, { value: "staging" }] });
const note = await session.ui.input({ title: "Release note" });

Feature: custom model listing for BYOK mode

All four SDKs now accept an onListModels callback in client options. When provided, client.listModels() calls your handler instead of querying the CLI — useful for BYOK setups where you want to expose your provider's available models. (#​730)

const client = new CopilotClient({
  onListModels: async () => [{ id: "gpt-4o", displayName: "GPT-4o", vendor: "OpenAI" }]
});
var client = new CopilotClient(new CopilotClientOptions {
    OnListModels = async (ct) => [new ModelInfo { Id = "gpt-4o", DisplayName = "GPT-4o" }]
});
  • Python: on_list_models=lambda: [ModelInfo(id="gpt-4o", display_name="GPT-4o")]
  • Go: OnListModels: func(ctx context.Context) ([]copilot.ModelInfo, error) { ... }

Feature: blob attachments for inline image data

A new blob attachment type lets you send base64-encoded content directly to a session without writing it to disk first — useful when images are already in memory (screenshots, API responses, generated images). (#​731)

await session.sendMessage("Describe this screenshot", {
  attachments: [{ type: "blob", data: base64Data, mimeType: "image/png", displayName: "screen.png" }]
});
await session.send_message("Describe this screenshot", attachments=[
    BlobAttachment(type="blob", data=base64_data, mime_type="image/png", display_name="screen.png")
])
 ... (truncated)

## 0.2.0

This is a big update with a broad round of API refinements, new capabilities, and cross-SDK consistency improvements that have shipped incrementally through preview releases since v0.1.32.

## Highlights

### Fine-grained system prompt customization

A new `"customize"` mode for `systemMessage` lets you surgically edit individual sections of the Copilot system promptwithout replacing the entire thing. Ten sections are configurable: `identity`, `tone`, `tool_efficiency`, `environment_context`, `code_change_rules`, `guidelines`, `safety`, `tool_instructions`, `custom_instructions`, and `last_instructions`.

Each section supports four static actions (`replace`, `remove`, `append`, `prepend`) and a `transform` callback that receives the current rendered content and returns modified textuseful for regex mutations, conditional edits, or logging what the prompt contains. ([#​816](https://github.com/github/copilot-sdk/pull/816))

```ts
const session = await client.createSession({
  onPermissionRequest: approveAll,
  systemMessage: {
    mode: "customize",
    sections: {
      identity: {
        action: (current) => current.replace("GitHub Copilot", "Acme Assistant"),
      },
      tone: { action: "replace", content: "Be concise and professional." },
      code_change_rules: { action: "remove" },
    },
  },
});
var session = await client.CreateSessionAsync(new SessionConfig {
    OnPermissionRequest = PermissionHandler.ApproveAll,
    SystemMessage = new SystemMessageConfig {
        Mode = SystemMessageMode.Customize,
        Sections = new Dictionary<string, SectionOverride> {
            ["identity"] = new() {
                Transform = current => Task.FromResult(current.Replace("GitHub Copilot", "Acme Assistant")),
            },
            ["tone"] = new() { Action = SectionOverrideAction.Replace, Content = "Be concise and professional." },
            ["code_change_rules"] = new() { Action = SectionOverrideAction.Remove },
        },
    },
});

OpenTelemetry support across all SDKs

All four SDK languages now support distributed tracing with the Copilot CLI. Set telemetry in your client options to configure an OTLP exporter; W3C trace context is automatically propagated on session.create, session.resume, and session.send, and restored in tool handlers so tool execution is linked to the originating trace. (#​785)

const client = new CopilotClient({
  telemetry: {
    otlpEndpoint: "http://localhost:4318",
 ... (truncated)

## 0.1.33-preview.4

### Feature: fine-grained system prompt customization

A new `"customize"` mode for `systemMessage` lets you selectively override individual sections of the Copilot system prompt  without replacing the entire prompt. This sits between `"append"` (add to the end) and `"replace"` (replace everything). ([#​816](https://github.com/github/copilot-sdk/pull/816))

Ten sections are configurable: `identity`, `tone`, `tool_efficiency`, `environment_context`, `code_change_rules`, `guidelines`, `safety`, `tool_instructions`, `custom_instructions`, and `last_instructions`.

Each section supports four static actions (`replace`, `remove`, `append`, `prepend`) and a `transform` action — a callback that receives the current rendered section content and returns the modified version, enabling regex mutations, logging, or conditional edits.

```ts
const session = await client.createSession({
  systemMessage: {
    mode: "customize",
    sections: {
      identity: {
        // transform: read current content and return modified content
        action: (current) => current.replace("GitHub Copilot", "Acme Assistant"),
      },
      tone: { action: "replace", content: "Be concise and professional." },
      code_change_rules: { action: "remove" },
    },
  },
});
var session = await client.CreateSessionAsync(new SessionOptions {
    SystemMessage = new SystemMessageOptions {
        Mode = SystemMessageMode.Customize,
        Sections = new Dictionary(string, SectionOverride) {
            ["identity"] = new() {
                Transform = current => current.Replace("GitHub Copilot", "Acme Assistant"),
            },
            ["tone"] = new() { Action = "replace", Content = "Be concise and professional." },
            ["code_change_rules"] = new() { Action = "remove" },
        },
    },
});

Generated by Release Changelog Generator

Generated by Release Changelog Generator

0.1.33-preview.3

Feature: OpenTelemetry support across all SDKs

All four SDK languages now support distributed tracing with the Copilot CLI. Set telemetry in your client options to configure an OTLP exporter; W3C trace context is then propagated on session.create, session.resume, and session.send, and restored in tool handlers so tool execution is linked to the originating trace. (#​785)

const client = new CopilotClient({
  telemetry: {
    otlpEndpoint: "(localhost/redacted)
    sourceName: "my-app",
  },
});
var client = new CopilotClient(new CopilotClientOptions {
    Telemetry = new TelemetryConfig {
        OtlpEndpoint = "(localhost/redacted)
        SourceName = "my-app",
    },
});

Feature: blob attachment type for inline base64 data

A new blob attachment type lets you send images or other binary content directly to a session without writing to disk first — useful when data is already in memory (screenshots, API responses, generated images). (#​731)

await session.send("What's in this image?", {
  attachments: [{ type: "blob", data: base64Str, mimeType: "image/png" }],
});
await session.SendAsync("What's in this image?", new MessageOptions {
    Attachments = [new BlobAttachment { Data = base64Str, MimeType = "image/png" }],
});

Feature: Node.js CommonJS (CJS) compatibility

The Node.js SDK now ships both ESM and CJS builds, fixing crashes in VS Code extensions and other tools bundled with esbuild's format: "cjs". No changes needed in consumer code — Node automatically selects the right format. (#​546)

Feature: reasoningEffort when switching models

All SDKs now accept an optional reasoningEffort parameter in setModel() for models that support it. (#​712)

await session.setModel("claude-sonnet-4.6", { reasoningEffort: "high" });

... (truncated)

0.1.33-preview.0

Feature: pre-select a custom agent at session creation

You can now specify which custom agent should be active when a session starts, without needing a separate session.rpc.agent.select() call. (#​722)

const session = await client.createSession({
  customAgents: [
    { name: "researcher", prompt: "You are a research assistant." },
    { name: "editor", prompt: "You are a code editor." },
  ],
  agent: "researcher",  // active agent at session start
  onPermissionRequest: approveAll,
});
var session = await client.CreateSessionAsync(new SessionConfig {
    CustomAgents = [
        new CustomAgentConfig { Name = "researcher", Prompt = "You are a research assistant." },
        new CustomAgentConfig { Name = "editor", Prompt = "You are a code editor." },
    ],
    Agent = "researcher",  // active agent at session start
});

Feature: custom model listing for BYOK

Applications using bring-your-own-key providers can now supply onListModels in client options to override client.listModels() with their own model list, instead of forwarding the call to the CLI. (#​730)

const client = new CopilotClient({ onListModels: () => myProviderModels });
var client = new CopilotClient(new CopilotClientOptions {
    OnListModels = () => Task.FromResult(myProviderModels)
});
  • Python: on_list_models=lambda: my_provider_models
  • Go: OnListModels: func(ctx context.Context) ([]copilot.ModelInfo, error) { return myModels, nil }

Feature: new events and APIs (system notifications, session log, extension support)

Updated to match the latest CLI runtime, adding: system.notification events, a session log RPC API, reasoningEffort changes after model switch, alreadyInUse flag on sessions, and the groundwork for extension-based integrations. (#​737)

Other changes

  • feature: add no-result permission outcome so extensions can attach to sessions without actively answering permission requests (#​802)
  • bugfix: fix race condition where events emitted during session creation (e.g. session.start) could be dropped; also adds OnEvent catch-all handler to SessionConfig (#​664)
    ... (truncated)

0.1.32

Feature: backward compatibility with v2 CLI servers

SDK applications written against the v3 API now also work when connected to a v2 CLI server, with no code changes required.

Generated by Release Changelog Generator

Generated by Release Changelog Generator

0.1.31

Feature: strongly-typed PermissionRequestResultKind for .NET and Go

Rather than comparing result.Kind against undiscoverable magic strings like "approved" or "denied-interactively-by-user", .NET and Go now provide typed constants. Node and Python already had typed unions for this; this brings full parity. (#​631)

session.OnPermissionCompleted += (e) => {
    if (e.Result.Kind == PermissionRequestResultKind.Approved) { /* ... */ }
    if (e.Result.Kind == PermissionRequestResultKind.DeniedInteractivelyByUser) { /* ... */ }
};
// Go: PermissionKindApproved, PermissionKindDeniedByRules,
//     PermissionKindDeniedCouldNotRequestFromUser, PermissionKindDeniedInteractivelyByUser
if result.Kind == copilot.PermissionKindApproved { /* ... */ }

Other changes

  • feature: [Python] [Go] add get_last_session_id() / GetLastSessionID() for SDK-wide parity (was already available in Node and .NET) (#​671)
  • improvement: [Python] add timeout parameter to generated RPC methods, allowing callers to override the default 30s timeout for long-running operations (#​681)
  • bugfix: [Go] PermissionRequest fields are now properly typed (ToolName, Diff, Path, etc.) instead of a generic Extra map[string]any catch-all (#​685)

Generated by Release Changelog Generator

0.1.30

Feature: support overriding built-in tools

Applications can now override built-in tools such as grep, edit_file, or read_file. To do this, register a custom tool with the same name and set the override flag. Without the flag, the runtime will return an error if the name clashes with a built-in. (#​636)

import { defineTool } from "`@​github/copilot-sdk`";

const session = await client.createSession({
  tools: [defineTool("grep", {
    overridesBuiltInTool: true,
    handler: async (params) => `CUSTOM_GREP_RESULT: \$\{params.query}`,
  })],
  onPermissionRequest: approveAll,
});
var grep = AIFunctionFactory.Create(
    ([Description("Search query")] string query) => $"CUSTOM_GREP_RESULT: {query}",
    "grep",
    "Custom grep implementation",
    new AIFunctionFactoryOptions
    {
        AdditionalProperties = new ReadOnlyDictionary(string, object?)(
            new Dictionary(string, object?) { ["is_override"] = true })
    });

Feature: simpler API for changing model mid-session

While session.rpc.model.switchTo() already worked, there is now a convenience method directly on the session object. (#​621)

  • TypeScript: await session.setModel("gpt-4.1")
  • C#: await session.SetModelAsync("gpt-4.1")
  • Python: await session.set_model("gpt-4.1")
  • Go: err := session.SetModel(ctx, "gpt-4.1")

Other changes

  • improvement: [C#] use event delegate for thread-safe, insertion-ordered event handler dispatch (#​624)
  • improvement: [C#] deduplicate OnDisposeCall and improve implementation (#​626)
  • improvement: [C#] remove unnecessary SemaphoreSlim locks for handler fields (#​625)
  • bugfix: [Python] correct PermissionHandler.approve_all type annotations (#​618)

New contributors

  • @​giulio-leone made their first contribution in #​618

Generated by Release Changelog Generator

... (truncated)

0.1.29

v0.1.29 (2026-02-27)

Changes

  • bugfix: [Python] CopilotClient.stop() now raises an ExceptionGroup instead of silently returning a list of exceptions (#​603)

Generated by Release Changelog Generator

0.1.28

What's Changed

New Contributors

Full Changelog: github/copilot-sdk@v0.1.25...v0.1.28

Commits viewable in compare view.

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

---
updated-dependencies:
- dependency-name: GitHub.Copilot.SDK
  dependency-version: 0.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Apr 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants