Skip to content

Add history.clearContext and Tool.isTerminal across all SDKs - #2129

Merged
SteveSandersonMS merged 10 commits into
mainfrom
clearcontext-rpc
Aug 6, 2026
Merged

SteveSandersonMS merged 10 commits into
mainfrom
clearcontext-rpc

Conversation

@examon

@examon examon commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Overview

What

Adds two things to every SDK language surface:

  1. history.clearContext on the generated session RPC client — clears the conversation (keeping system and developer messages) and seeds the fresh context window with a required first user message. The runtime rejects the call unless it is made from inside a tool handler with a tool call in flight: that is the only state in which the clear can drop the tool results its wipe orphans, so a clear from a hook, a slash-command handler or a background timer is refused rather than corrupting the window. Also picks up the new session.context_cleared event.
  2. isTerminal on the tool definition — lets a tool declare that a successful call ends the agent turn instead of the result being fed back to the model for another round. A failed call leaves the loop running so the model can read the error and retry.
const session = await joinSession({
    tools: [{
        name: "clear_context",
        isTerminal: true,
        defer: "never",
        parameters: {
            type: "object",
            properties: { prompt: { type: "string" } },
            required: ["prompt"],
        },
        handler: async ({ prompt }) => {
            const { messagesCleared } = await session.rpc.history.clearContext({ prompt });
            return { textResultForLlm: `Cleared ${messagesCleared} message(s).`, resultType: "success" };
        },
    }],
});

Why

Together these let a context-clearing — or handoff, or any turn-ending — tool be implemented by an SDK consumer or extension, instead of requiring one built into the runtime.

Without isTerminal such a tool can only approximate turn-ending by returning a rejected result, which halts the loop but is semantically wrong and surfaces as a user rejection. Without clearContext the capability has no API surface at all.

Per-language changes

Generated RPC/event types are regenerated for all six languages. isTerminal is hand-authored per language, matching how overridesBuiltInTool / skipPermission / defer are already carried:

Language Tool flag Serialization
Node.js Tool.isTerminal, defineTool config both createSession / resumeSession sites in client.ts
Go Tool.IsTerminal json:"isTerminal,omitempty"
Python Tool.is_terminal, define_tool overloads both client serialization sites
Rust Tool::is_terminal skipped when false
Java ToolDefinition.isTerminal record component @JsonProperty("isTerminal")
.NET CopilotToolOptions.IsTerminal, is_terminal additional-property key wire ToolDefinition

Coexistence with Tool.metadata. metadata landed on main while this branch was open, and it touched exactly the same tool-option surfaces. The branch is rebased on top of it and the two are independent, additive options everywhere: Tool.metadata + Tool.isTerminal (Node), metadata + is_terminal (Python), Metadata + IsTerminal (.NET), and so on.

Java source compatibility. ToolDefinition is a record, so adding a component changes the canonical constructor. The canonical form is now nine components (…, defer, metadata, isTerminal), with two convenience constructors that delegate for the older shapes:

  • seven arguments (…, defer) → metadata = null, isTerminal = null
  • eight arguments (…, defer, metadata) → isTerminal = null

so existing call sites — including annotation-processor output — keep compiling unchanged. Tests pin both.

Every fluent copy method (overridesBuiltInTool, skipPermission, defer, metadata) threads isTerminal through, so it is not silently dropped when another option is set afterwards, and a matching isTerminal(boolean) copy method is added for tools built via the from(...) factories.

resumeSession is the path extensions join on via joinSession, so it matters that both serialization sites carry the flag, not just session creation.

Tests

Language Test
Node.js client.test.ts - isTerminal forwarded on both session.create and session.resume, and omitted when unset
Go TestIsTerminal - camelCase wire name when set, omitted when false
Python test_client.py - isTerminal forwarded on both session.create and session.resume, and omitted at its default
Rust is_terminal_tests - the same two cases via serde_json, plus a guard that the hand-written Debug impl reports the field
Java ToolDefinitionIsTerminalTest - both cases plus the older-arity constructor compatibility guard
.NET CopilotToolTests - is_terminal additional property set when requested, omitted otherwise

Tool is the one type here with a hand-written Debug impl in Rust rather than a derived one, so a new field is only reported if it is added there by hand. The Rust test asserts that, and fails if the impl drifts.

Validation

All six SDK test matrices pass in CI across Linux, macOS and Windows, as do every Validate * and CodeQL Analyze * job. The .NET tests noted as uncompiled in an earlier revision of this description have since been built and run by CI on all three platforms.

Locally, re-run after the rebase onto 1.0.78: tsc --noEmit, go build/vet/test, cargo test --lib (213 passing), mvn test (95 test classes, 0 failures, including ToolDefinitionIsTerminalTest), ruff check/format, dotnet build, and the two new Vitest isTerminal cases.

Node.js test/e2e/* and Go internal/e2e need a Copilot CLI binary that is unavailable locally; they are covered by CI.

Codegen (resolved)

The Codegen Check failure is resolved. Sequence:

  • github/copilot-agent-runtime#14002 merged 2026-08-03 at 19:01Z.
  • @github/copilot@1.0.78, published 2026-08-03 at 23:30Z, is the first release shipping the schemas: schemas/api.schema.json defines clearContext with "rpcMethod": "session.history.clearContext", and schemas/session-events.schema.json defines context_cleared.
  • The repo pin moved to 1.0.78 on main, and this branch is now rebased on top of that.

Because main regenerates from the real schema, the generated bindings now come from main and this branch no longer carries a single generated file. The diff is purely the hand-written SDK surface across the six languages. Verified locally after the rebase: cd scripts/codegen && npm run generate and cd java && mvn generate-sources -Pcodegen each produce zero drift.

This also closes the Java gap raised in review. While the pinned CLI lacked the schemas, the java-codegen-check workflow auto-committed a regeneration that stripped SessionContextClearedEvent, SessionHistoryClearContextParams/Result and the SessionHistoryApi method. That strip commit is obsolete and was dropped during the rebase, and main's regenerated Java bindings now supply all of it, so Java is at parity with the other SDKs.

The generated clearContext docs now reflect the tightened contract from the shipped schema: the seed prompt is required rather than optional.

One consequence worth flagging for review: Codegen Check is path-filtered on the generated directories, so now that this branch touches none of them the workflow no longer triggers at all. Its absence from the checks list is the expected outcome, not a skipped or disabled check.

Notes

  • Purely additive; every new field is optional and absent means today's behavior.
  • No generated files remain in this diff. The bindings come from main's regeneration against @github/copilot@1.0.78.

Depends on github/copilot-agent-runtime#14002 (merged 2026-08-03), which adds the runtime surface.

Copilot AI balanced review requested due to automatic review settings July 29, 2026 17:53

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds Node SDK support for clearing session context and terminal tools.

Changes:

  • Adds Tool.isTerminal and forwards it during create/resume.
  • Adds generated history.clearContext RPC types and client method.
Show a summary per file
File Description
nodejs/src/types.ts Exposes terminal-tool configuration.
nodejs/src/client.ts Serializes isTerminal in session requests.
nodejs/src/generated/rpc.ts Adds context-clearing RPC support.

Review details

  • Files reviewed: 2/3 changed files
  • Comments generated: 1
  • Review effort level: Medium

Comment thread nodejs/src/types.ts
Copilot AI review requested due to automatic review settings July 29, 2026 19:47
@examon
examon force-pushed the clearcontext-rpc branch from 86d300b to 06dc43a Compare July 29, 2026 19:47
@examon examon changed the title Add history.clearContext and Tool.isTerminal Add history.clearContext and Tool.isTerminal across all SDKs Jul 29, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Files not reviewed (4)
  • go/rpc/zrpc.go: Generated file
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
Comments suppressed due to low confidence (5)

java/src/main/java/com/github/copilot/rpc/ToolDefinition.java:87

  • The ergonomic annotation path cannot configure this new flag. @CopilotTool currently exposes override, permission, and defer options, and CopilotToolProcessor forwards each one, but neither has an isTerminal member. Users defining tools through the documented annotation API therefore cannot declare terminal tools; add the annotation property and processor wiring (with processor coverage).
        @JsonProperty("skipPermission") Boolean skipPermission, @JsonProperty("defer") ToolDefer defer,
        @JsonProperty("isTerminal") Boolean isTerminal) {

rust/src/types.rs:352

  • Tool is #[non_exhaustive] and its docs direct consumers to the fluent builder, but this new option has no with_is_terminal method. Every adjacent runtime hint does (with_overrides_built_in_tool, with_skip_permission, and with_defer at types.rs:455-477), and the custom Debug implementation at types.rs:496-511 also omits this field. Please integrate is_terminal into both APIs so consumers do not have to switch to post-construction mutation and diagnostics show the configured value.
    #[serde(default, skip_serializing_if = "is_false")]
    pub is_terminal: bool,

java/src/main/java/com/github/copilot/rpc/ToolDefinition.java:73

  • Java currently receives only the terminal-tool half of this cross-SDK feature. Unlike Node, Python, Go, Rust, and .NET in this diff, SessionHistoryApi still has no clearContext method and SessionEvent has no typed session.context_cleared event, so Java consumers cannot implement the context-clearing example. Regenerate the Java RPC/event surface from the updated runtime schemas as well.

This issue also appears on line 86 of the same file.

 * @param isTerminal
 *            when {@code true}, a successful call to this tool ends the agent
 *            turn: the runtime's tool phase halts instead of feeding the result
 *            back to the model for another round; {@code null} or {@code false}
 *            leaves the turn running

python/copilot/tools.py:129

  • The public define_tool signature now accepts is_terminal, but its Args section documents every option except this one. Add its turn-ending semantics and default to the docstring so decorator and function-style users can discover the option through help() and generated API documentation.
    is_terminal: bool = False,

go/types.go:1185

  • The PR description says this is “Two small additions to the Node SDK,” lists only three Node files, and reports only npm validation, but the actual change adds public/generated surfaces across Rust, Python, Java, Go, and .NET as well. Please either scope the diff back to Node or update the description and validation evidence for every affected SDK so the review and release impact are accurate.
	// IsTerminal reports that a successful call to this tool ends the agent
	// turn: the runtime halts instead of feeding the result back to the model
	// for another round. A failed call leaves the loop running so the model can
	// read the error and retry.
	IsTerminal bool `json:"isTerminal,omitempty"`
  • Files reviewed: 11/24 changed files
  • Comments generated: 0 new
  • Review effort level: Medium

Copilot AI review requested due to automatic review settings July 29, 2026 20:09
@examon
examon force-pushed the clearcontext-rpc branch from 06dc43a to 11426a7 Compare July 29, 2026 20:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Files not reviewed (4)
  • go/rpc/zrpc.go: Generated file
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
Comments suppressed due to low confidence (3)

nodejs/src/client.ts:1394

  • The new create/resume forwarding is untested even though nodejs/test/client.test.ts has paired request-payload tests for the adjacent overridesBuiltInTool and defer flags. Add equivalent create and resume assertions for isTerminal so a missing serialization path cannot regress unnoticed.
                    isTerminal: tool.isTerminal,

python/copilot/client.py:1877

  • There is no test covering this new wire serialization, while python/test_client.py already verifies both create and resume forwarding for the neighboring override/defer flags. Add corresponding is_terminal=True tests for both paths (and omission at the default) to protect the advertised behavior.
                if tool.is_terminal:
                    definition["isTerminal"] = True

java/src/main/java/com/github/copilot/rpc/ToolDefinition.java:87

  • The Java portion still does not expose history.clearContext or the typed session.context_cleared event promised for every SDK. SessionHistoryApi currently ends with summarizeForHandoff, and SessionEvent has no context-cleared subtype, so Java consumers cannot use either new generated surface. Please regenerate and commit the Java RPC request/result/API and session-event classes as well.
        @JsonProperty("skipPermission") Boolean skipPermission, @JsonProperty("defer") ToolDefer defer,
        @JsonProperty("isTerminal") Boolean isTerminal) {
  • Files reviewed: 12/25 changed files
  • Comments generated: 0 new
  • Review effort level: Medium

@examon
examon force-pushed the clearcontext-rpc branch from 11426a7 to 0b328ff Compare July 29, 2026 20:36
Copilot AI review requested due to automatic review settings July 29, 2026 20:36

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Files not reviewed (4)
  • go/rpc/zrpc.go: Generated file
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
Comments suppressed due to low confidence (2)

java/src/main/java/com/github/copilot/rpc/ToolDefinition.java:87

  • Java's annotated-tool surface cannot set this new flag. @CopilotTool exposes the other tool flags (overridesBuiltInTool, skipPermission, and defer), but the annotation and processor still emit only the seven-argument constructor, so every annotation-defined tool gets isTerminal = null. Please add an isTerminal annotation member and carry it through CopilotToolProcessor, with processor coverage, so the feature is available through the SDK's ergonomic tool API rather than only direct record construction.
        @JsonProperty("skipPermission") Boolean skipPermission, @JsonProperty("defer") ToolDefer defer,
        @JsonProperty("isTerminal") Boolean isTerminal) {

python/copilot/tools.py:129

  • is_terminal is a new public argument but is missing from the function's Args documentation, while every other option is documented there. Add its successful-call/failed-call behavior to the docstring so users can discover the flag without reading the dataclass source.
    is_terminal: bool = False,
  • Files reviewed: 12/30 changed files
  • Comments generated: 0 new
  • Review effort level: Medium

@examon
examon marked this pull request as ready for review July 29, 2026 20:46
@examon
examon requested a review from a team as a code owner July 29, 2026 20:46
@examon
examon force-pushed the clearcontext-rpc branch from 0b328ff to 55cebf9 Compare July 29, 2026 21:21
Copilot AI review requested due to automatic review settings July 29, 2026 21:21
@github-actions github-actions Bot added the dependencies Pull requests that update a dependency file label Jul 29, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Files not reviewed (4)
  • go/rpc/zrpc.go: Generated file
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
Comments suppressed due to low confidence (3)

java/src/main/java/com/github/copilot/rpc/ToolDefinition.java:95

  • The Java surface still lacks the other half of this PR: SessionHistoryApi has no clearContext method/request/result types, and there is no typed session.context_cleared event. As a result, Java consumers cannot use the capability that the PR promises for every SDK. Please regenerate and commit the Java RPC and event sources from the updated schema.
        @JsonProperty("metadata") Map<String, Object> metadata, @JsonProperty("isTerminal") Boolean isTerminal) {

python/copilot/client.py:2250

  • Please add a unit test that exercises is_terminal through define_tool and verifies both session.create and session.resume payloads, including omission when false. The adjacent metadata test covers this same serialization path, but these new branches and helper propagation currently have no Python coverage.
                if tool.is_terminal:
                    definition["isTerminal"] = True

dotnet/src/Client.cs:2790

  • The added tests only verify the intermediate AIFunction.AdditionalProperties; they do not exercise this conversion or the serialized session request. Please add coverage asserting that isTerminal reaches both session.create and session.resume payloads (and is omitted by default), otherwise the actual wire path can regress while the current tests still pass.
            var isTerminal = function.AdditionalProperties.TryGetValue(CopilotTool.IsTerminalKey, out var terminalVal) && terminalVal is true;
            return new ToolDefinition(function.Name, function.Description, function.JsonSchema,
                overrides ? true : null,
                skipPerm ? true : null,
                defer,
                metadata,
                isTerminal ? true : null);
  • Files reviewed: 13/26 changed files
  • Comments generated: 0 new
  • Review effort level: Medium

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@examon
examon force-pushed the clearcontext-rpc branch from fccbbc5 to e25257e Compare July 30, 2026 04:51
Copilot AI review requested due to automatic review settings July 30, 2026 04:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Files not reviewed (4)
  • go/rpc/zrpc.go: Generated file
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
Comments suppressed due to low confidence (2)

dotnet/src/Client.cs:2790

  • The added tests stop at the AIFunction.AdditionalProperties bag, so they do not exercise this conversion or the serialized session.create/session.resume payload. This new bridge is where is_terminal becomes wire-level isTerminal; add a public-API client test using the existing fake server pattern in ClientSessionLifetimeTests that asserts both requests contain tools[0].isTerminal == true and that the property is omitted when unset.
            var isTerminal = function.AdditionalProperties.TryGetValue(CopilotTool.IsTerminalKey, out var terminalVal) && terminalVal is true;
            return new ToolDefinition(function.Name, function.Description, function.JsonSchema,
                overrides ? true : null,
                skipPerm ? true : null,
                defer,
                metadata,
                isTerminal ? true : null);

python/copilot/client.py:2250

  • Add Python regression coverage for this new wire mapping. python/test_client.py:574-609 already verifies the analogous metadata option on both create and resume, but no test currently exercises is_terminal; a future edit could silently drop either branch or emit the wrong camel-case key. Cover True on both paths and omission for the default False.
                if tool.is_terminal:
                    definition["isTerminal"] = True
  • Files reviewed: 13/26 changed files
  • Comments generated: 1
  • Review effort level: Medium

Comment thread java/src/main/java/com/github/copilot/rpc/ToolDefinition.java
@github-actions

This comment has been minimized.

jaredpar pushed a commit to jaredpar/tiger that referenced this pull request Sep 22, 2026
Updated [GitHub.Copilot.SDK](https://github.com/github/copilot-sdk) from
1.0.2 to 1.0.13.

<details>
<summary>Release notes</summary>

_Sourced from [GitHub.Copilot.SDK's
releases](https://github.com/github/copilot-sdk/releases)._

## 1.0.13

### Feature: cancellation for host-owned external tools

Host-owned external tool callbacks are now cancelled when their runtime
request completes or their SDK session terminates. The cancellation
primitive is idiomatic per SDK: .NET passes a request token to
`AIFunction`, Node.js exposes `ToolInvocation.signal`, Go cancels
`ToolInvocation.TraceContext`, Java cancels the returned
`CompletableFuture`, Python cancels the handler task, and Rust drops the
handler future. Go handlers that retain `TraceContext` for background
work must derive a separate lifetime because the invocation context is
cancelled when the request ends.

### Feature: declare application identity with client info

Client options now accept optional client info (application name and
version, integration name and version) across all six SDKs, exposed
idiomatically per language (`clientInfo` in Node.js, `client_info` in
Python and Rust, `ClientInfo` in Go and .NET, `setClientInfo` in Java).
When set, the SDK forwards it on the `server.connect` handshake so the
telemetry the runtime emits on the connection is attributed to the
application and its Copilot integration instead of the runtime's own
build. All fields are optional, and leaving client info unset keeps the
runtime's default attribution. See [Client
info](./docs/features/client-info.md).

### Feature: Node Agent Factories pagination and run notifications

The experimental Node.js Agent Factories convenience API now supports
paginated run history. Existing `session.factory.listRuns()` calls still
return the runs array, while calls with `afterSeq`, `beforeSeq`, or
`limit` return the full page with cursor and truncation metadata.

Factory `run` and `resume` options now accept `notifyOnComplete` and
`logPhaseNames`. The SDK forwards these options to the Copilot CLI for
new and resumed runs.

### Feature: selectable `ask_user` session behavior

Session create and cold resume now accept a language-specific
`askUserVariant` option with `legacy` and `elicitation` values. SDK
sessions retain the legacy question-and-answer tool by default. Select
`elicitation` and provide an elicitation handler to expose the
structured form-based `ask_user` tool.

### Feature: rotating session-scoped GitHub credentials

All six SDKs can now acquire short-lived GitHub credentials through a
session-scoped callback. The SDK registers the callback before session
create or resume, maps `initial` and `refresh` requests to the owning
session, and removes registrations on rollback, replacement, session
close, and client close. Static per-session `gitHubToken` credentials
remain supported and are mutually exclusive with the callback.

Token responses use the shared tagged token/cancelled shape and require
`expiresIn`, expressed as the positive number of seconds remaining when
the callback completes. See
[github/copilot-agent-runtime#​16381](https://github.com/github/copilot-agent-runtime/pull/16381)
for the runtime credential-authority implementation.

Initial acquisition occurs during create or resume; cancellation,
callback errors, and invalid credentials reject that operation instead
of falling back to ambient authentication. Idle sessions refresh only
before their next credential-consuming operation.

### Feature: extensions can request sensitive environment variables

Copilot CLI extensions can now ask for named sensitive environment
variables when they join a session. `joinSession()` accepts a
`requestedEnvironmentVariables` option listing the variable names the
extension needs. The CLI shows a permission prompt naming the extension
and the exact variables requested. On approval, only those variables
reach that extension and their values are written into the extension
process's `process.env` before `joinSession()` resolves. On denial,
`joinSession()` rejects, the extension does not load, and its tools
never reach the model.

An approval is remembered against the exact set of names the user saw,
so an extension that later asks for one more variable prompts again.
Names that are unset, or that the CLI does not filter from extensions,
are not prompted for. This is the client half of the feature; it
requires a Copilot CLI that supports extension environment access, and
older CLIs ignore the request and grant nothing.

```ts
import { joinSession } from "@​github/copilot-sdk/extension";

const session = await joinSession({
    requestedEnvironmentVariables: ["GITHUB_TOKEN"],
});
const token = process.env.GITHUB_TOKEN;
```

### Feature: early session-event subscription (Rust)

The Rust SDK can now observe every event routed to a session, starting
with that session's very first routed event. `Client::prepare_session`
and `Client::prepare_resume_session` return an inert `PreparedSession`
that owns the session's event channel, so a subscription can be
installed *before* any protocol activity begins:

```rust
let prepared = client.prepare_session(
    SessionConfig::default().with_event_buffer_capacity(2048),
)?;
let mut events = prepared.subscribe();
 ... (truncated)

## 1.0.13-preview.4

### Feature: rewind support across all SDKs

Sessions can now opt into file-change tracking and rewind conversation history and tracked file changes to any prior checkpoint. Enable file tracking when creating a session, then use `rewind` to roll back. ([#​2321](https://github.com/github/copilot-sdk/pull/2321))

```ts
const session = await client.createSession({ enableFileChangeTracking:
true });
// ...later
const points = await session.rpc.rewind.list();
await session.rpc.rewind.rewind({ rewindTarget: points[0].id });
```

```cs
var session = await client.CreateSessionAsync(new SessionOptions {
EnableFileChangeTracking = true });
var points = await session.Rpc.Rewind.ListAsync();
await session.Rpc.Rewind.RewindAsync(new RewindRequest { RewindTarget =
points[0].Id });
```

```python
session = await client.create_session(enable_file_change_tracking=True)
points = await session.rpc.rewind.list()
await session.rpc.rewind.rewind(rewind_target=points[0].id)
```

### Feature: session-scoped GitHub token providers

Sessions now support expiry-aware GitHub token callbacks in addition to static tokens. The SDK handles refresh requests from the runtime, so extensions always receive fresh credentials. ([#​2412](https://github.com/github/copilot-sdk/pull/2412))

```ts
const session = await client.createSession({
gitHubTokenProvider: async ({ host, reason }) => ({ token: await
fetchToken(host) })
});
```

```cs
var session = await client.CreateSessionAsync(new SessionOptions {
    GitHubTokenProvider = async (req, ct) =>
new GitHubTokenResult { Token = await FetchTokenAsync(req.Host) }
});
```

```go
session, _ := client.CreateSession(ctx, copilot.SessionOptions{
GitHubTokenProvider: func(ctx context.Context, req
copilot.TokenProviderRequest) (copilot.TokenProviderResult, error) {
return copilot.TokenProviderResult{Token: fetchToken(req.Host)}, nil
    },
})
```

### Feature: Java in-process native runtime on all platforms

 ... (truncated)

## 1.0.13-preview.3

### Feature: rewind support across all SDKs

Sessions can now opt into file-change tracking and conversation rewind. When `enableFileChangeTracking` is enabled, the session records which files were changed during a conversation turn. You can then list pending rewind points, preview changes, and rewind the conversation history together with any tracked file modifications. ([#​2321](https://github.com/github/copilot-sdk/pull/2321))

```ts
const session = await client.createSession({ enableFileChangeTracking:
true });
const points = await session.rpc.rewind.listPendingRewindPoints();
await session.rpc.rewind.rewind({ id: points[0].id });
```

```cs
var session = await client.CreateSessionAsync(new SessionOptions {
EnableFileChangeTracking = true });
var points = await session.Rpc.Rewind.ListPendingRewindPointsAsync();
await session.Rpc.Rewind.RewindAsync(new RewindRequest { Id =
points[0].Id });
```

```python
session = await client.create_session(enable_file_change_tracking=True)
points = await session.rpc.rewind.list_pending_rewind_points()
await session.rpc.rewind.rewind(id=points[0].id)
```

### Feature: session-scoped GitHub token providers

Sessions now support a dynamic, expiry-aware GitHub token callback as an alternative to a static `gitHubToken`. The SDK maps each host request (with host, session, and reason context) to your callback, handling concurrent-session isolation automatically. ([#​2412](https://github.com/github/copilot-sdk/pull/2412))

```ts
const session = await client.createSession({
gitHubTokenProvider: async ({ host }) => ({ token: await getToken(host),
expiresIn: 3600 }),
});
```

```cs
var session = await client.CreateSessionAsync(new SessionOptions
{
    GitHubTokenProvider = async (req, ct) =>
new GitHubToken { Token = await GetTokenAsync(req.Host, ct), ExpiresIn =
TimeSpan.FromHours(1) }
});
```

```go
session, err := client.CreateSession(ctx, copilot.SessionOptions{
GitHubTokenProvider: func(ctx context.Context, req
copilot.GitHubTokenRequest) (copilot.GitHubToken, error) {
return copilot.GitHubToken{Token: getToken(req.Host), ExpiresIn: 3600},
nil
    },
})
```

### Feature: built-in plugin directory support

 ... (truncated)

## 1.0.13-preview.2

### Feature: rewind support across all SDKs

Sessions can now opt in to file-change tracking so that rewinding restores both conversation history and the files that were modified. Enable it with the new `enableFileChangeTracking` session option. ([#​2321](https://github.com/github/copilot-sdk/pull/2321))

```ts
const session = await client.startSession({ enableFileChangeTracking:
true });
```

```cs
var session = await client.StartSessionAsync(new SessionOptions {
EnableFileChangeTracking = true });
```

```python
session = await client.start_session(enable_file_change_tracking=True)
```

```go
session, _ := client.StartSession(ctx,
&copilot.SessionOptions{EnableFileChangeTracking: true})
```

```java
Session session = client.startSession(new
SessionOptions().setEnableFileChangeTracking(true)).get();
```

```rust
let session = client.start_session(SessionOptions {
enable_file_change_tracking: Some(true), ..Default::default() }).await?;
```

### Feature: session-scoped GitHub token providers

Applications can now supply a dynamic GitHub token callback instead of a static `gitHubToken` string. The runtime calls the callback before each token use, so short-lived tokens stay fresh across long-running sessions. ([#​2412](https://github.com/github/copilot-sdk/pull/2412))

```ts
const session = await client.startSession({
gitHubTokenProvider: async ({ host, reason }) => ({ token: await
fetchToken(host) })
});
```

```cs
var session = await client.StartSessionAsync(new SessionOptions
{
GitHubTokenProvider = async (request, ct) => new GitHubTokenResult(await
FetchTokenAsync(request.Host))
});
```

```python
async def token_provider(request):
    return GitHubTokenResult(token=await fetch_token(request.host))

session = await
client.start_session(github_token_provider=token_provider)
 ... (truncated)

## 1.0.13-preview.1

### Feature: `ClientMode::Empty` now disables built-in skills by default

`ClientMode::Empty` now applies deny-by-default isolation to
runtime-bundled skills in addition to other built-in capabilities.
`includedBuiltinSkills` defaults to `[]` in Empty mode; pass an explicit
allowlist to re-enable specific skills. This behavior is consistent
across all six SDKs.
([#​2410](https://github.com/github/copilot-sdk/pull/2410))

```ts
// Node — empty mode: built-in skills excluded by default
const session = await client.createSession({ mode: ClientMode.Empty });
// opt back in:
const session = await client.createSession({ mode: ClientMode.Empty, includedBuiltinSkills: ["edit"] });
```

```cs
// C#
var session = await client.CreateSessionAsync(new SessionOptions { Mode = ClientMode.Empty });
// opt back in:
var session = await client.CreateSessionAsync(new SessionOptions { Mode = ClientMode.Empty, IncludedBuiltinSkills = ["edit"] });
```

```python
# Python
session = await client.create_session(mode=ClientMode.EMPTY)
# opt back in:
session = await client.create_session(mode=ClientMode.EMPTY, included_builtin_skills=["edit"])
```

```go
// Go
session, err := client.CreateSession(ctx, copilot.SessionOptions{Mode: copilot.ClientModeEmpty})
// opt back in:
session, err := client.CreateSession(ctx, copilot.SessionOptions{Mode: copilot.ClientModeEmpty, IncludedBuiltinSkills: []string{"edit"}})
```

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/33008374598)
· sonnet46 28.6 AIC · ⌖ 4.12 AIC · ⊞ 8.1K

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.73, model: claude-sonnet-4.6, id: 33008374598,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/33008374598 -->

## 1.0.13-preview.0

### Feature: rewind support across all SDKs

Sessions can now opt into file-change tracking and rewind conversation
history along with tracked file changes. Enable the new
`enableFileChangeTracking` session option to allow calling rewind later.
([#​2321](https://github.com/github/copilot-sdk/pull/2321))

```ts
const session = await client.createSession({ enableFileChangeTracking: true });
// later:
await session.rpc.conversation.rewind({ ...rewindPoint });
```

```cs
var session = await client.CreateSessionAsync(new SessionOptions { EnableFileChangeTracking = true });
```

```python
session = await client.create_session(enable_file_change_tracking=True)
```

```go
session, err := client.CreateSession(ctx, copilot.SessionOptions{EnableFileChangeTracking: true})
```

### Feature: Java in-process runtime (experimental)

The Java SDK now ships platform-native classifier JARs that load the
Copilot runtime directly in-process via JNA — no separate CLI child
process required. Currently available for linux-x64, Windows x64, and
Apple Silicon macOS.
([#​2301](https://github.com/github/copilot-sdk/pull/2301),
[#​2393](https://github.com/github/copilot-sdk/pull/2393),
[#​2402](https://github.com/github/copilot-sdk/pull/2402))

```java
CopilotClientOptions options = new CopilotClientOptions()
    .setConnection(RuntimeConnection.forInProcess());
CopilotClient client = new CopilotClient(options);
client.start().get();
```

### Feature: permission decision context forwarding

Permission handlers can now attach `decisionContext` so the runtime can
attribute whether a decision came from a person, host policy, or an
automated recommendation. This is additive for Node, Python, Go, .NET,
and Java. Rust clients that construct or match
`PermissionResult::Decision` directly must migrate to the new struct
variant. ([#​2294](https://github.com/github/copilot-sdk/pull/2294))

- TypeScript: `createAttributedPermissionResult(result, context)`
- Python: `copilot.create_attributed_permission_result(result, context)`
- Go: `copilot.NewAttributedPermissionResult(result, context)`
- C#: set `DecisionContext` on the permission decision
- Java:
`PermissionRequestResult.approveOnce().setDecisionContext(context)`
- Rust: `PermissionResult::approve_once().with_context(context)`

### Feature: built-in plugin directory support

Applications can now register a set of host-bundled plugin directories
that are trusted unconditionally and loaded before any user session
begins. ([#​2330](https://github.com/github/copilot-sdk/pull/2330))

### Feature: extensions can request sensitive environment variables
(Node)

 ... (truncated)

## 1.0.12-preview.0

### Feature: rewind support across all SDKs

Sessions now support rewinding conversation history and tracked file
changes. Enable file-change tracking when creating a session, then
rewind to a previous checkpoint to discard later turns and restore file
state. ([#​2321](https://github.com/github/copilot-sdk/pull/2321))

```ts
const session = await client.createSession({ enableFileChangeTracking: true });
const rewindPoints = await session.rpc.rewind.listRewindPoints();
await session.rpc.rewind.rewind({ rewindPointId: rewindPoints[0].rewindPointId });
```

```python
session = await client.create_session(enable_file_change_tracking=True)
rewind_points = await session.rpc.rewind.list_rewind_points()
await session.rpc.rewind.rewind(rewind_point_id=rewind_points[0].rewind_point_id)
```

```go
session, _ := client.CreateSession(ctx, &copilot.SessionOptions{EnableFileChangeTracking: true})
points, _ := session.RPC.Rewind.ListRewindPoints(ctx)
_ = session.RPC.Rewind.Rewind(ctx, &copilot.RewindRequest{RewindPointId: points[0].RewindPointId})
```

```cs
var session = await client.CreateSessionAsync(new SessionOptions { EnableFileChangeTracking = true });
var points = await session.Rpc.Rewind.ListRewindPointsAsync();
await session.Rpc.Rewind.RewindAsync(new RewindRequest { RewindPointId = points[0].RewindPointId });
```

```java
SessionOptions options = new SessionOptions().setEnableFileChangeTracking(true);
var session = client.createSession(options).get();
var points = session.getRpc().getRewind().listRewindPoints().get();
session.getRpc().getRewind().rewind(new RewindRequest().setRewindPointId(points.get(0).getRewindPointId())).get();
```

```rust
let session = client.create_session(SessionOptions { enable_file_change_tracking: Some(true), ..Default::default() }).await?;
let points = session.rpc.rewind.list_rewind_points().await?;
session.rpc.rewind.rewind(RewindRequest { rewind_point_id: points[0].rewind_point_id.clone() }).await?;
```

### Feature: Java in-process Copilot CLI (linux-x64)

The Java SDK now supports an **in-process connection mode** on linux-x64
that loads the Copilot runtime as a native library via JNA — no separate
CLI child process required. Add the `copilot-sdk-java-runtime`
classifier JAR for your platform alongside the core SDK JAR.
([#​2301](https://github.com/github/copilot-sdk/pull/2301))

```java
CopilotClientOptions options = new CopilotClientOptions()
    .setConnection(RuntimeConnection.forInProcess());
CopilotClient client = new CopilotClient(options);
client.start().get();
 ... (truncated)

## 1.0.11

## What's Changed
* docs: correct the Python Customize Mode section IDs and action list by @​examon in https://github.com/github/copilot-sdk/pull/2264
* Add `history.clearContext` and `Tool.isTerminal` across all SDKs by @​examon in https://github.com/github/copilot-sdk/pull/2129
* fix(java): preserve MCP permission extension data by @​rinceyuan in https://github.com/github/copilot-sdk/pull/2276
* Update @​github/copilot to 1.0.79-5 by @​github-actions[bot] in https://github.com/github/copilot-sdk/pull/2282
* Update @​github/copilot to 1.0.79-6 by @​github-actions[bot] in https://github.com/github/copilot-sdk/pull/2287
* SDK, Runtime: Recover JSON-RPC frames containing unpaired UTF-16 surrogates by @​Chuxel in https://github.com/github/copilot-sdk/pull/2283
* Add managed permission settings to session startup by @​joshspicer in https://github.com/github/copilot-sdk/pull/2139
* Skip untyped internal properties in C# codegen by @​stephentoub in https://github.com/github/copilot-sdk/pull/2298
* Update @​github/copilot to 1.0.79-9 by @​github-actions[bot] in https://github.com/github/copilot-sdk/pull/2299
* Update @​github/copilot to 1.0.79 by @​github-actions[bot] in https://github.com/github/copilot-sdk/pull/2306
* Consolidate SDK GitHub releases by @​stephentoub in https://github.com/github/copilot-sdk/pull/2305
* [SDK/Factories] Make The Agent Factories Surface Match The Wire Contract by @​MRayermannMSFT in https://github.com/github/copilot-sdk/pull/2309
* Add rewind support across all SDKs by @​stephentoub in https://github.com/github/copilot-sdk/pull/2321
* [java] Add linux-x64 implementation of in process Copilot CLI by @​edburns in https://github.com/github/copilot-sdk/pull/2301
* [Java] Fix java publish to maven by @​edburns in https://github.com/github/copilot-sdk/pull/2324
* test(java): skip linux runtime tests on other platforms by @​edburns in https://github.com/github/copilot-sdk/pull/2325
* Fix codegen for internal runtime schemas by @​stephentoub in https://github.com/github/copilot-sdk/pull/2331
* [SDK/Factories] Add argsSchema To The Factory Authoring Surface by @​MRayermannMSFT in https://github.com/github/copilot-sdk/pull/2315
* Add built-in plugin directory support by @​lutzroeder in https://github.com/github/copilot-sdk/pull/2330
* sdk: Forward decisionContext on permission replies across languages by @​aymenfurter in https://github.com/github/copilot-sdk/pull/2294

## New Contributors
* @​Chuxel made their first contribution in https://github.com/github/copilot-sdk/pull/2283
* @​lutzroeder made their first contribution in https://github.com/github/copilot-sdk/pull/2330
* @​aymenfurter made their first contribution in https://github.com/github/copilot-sdk/pull/2294

**Full Changelog**: https://github.com/github/copilot-sdk/compare/v1.0.9...v1.0.11

## 1.0.11-preview.2

### Feature: rewind support across all SDKs

The Copilot runtime supports rewinding conversation history and tracked file changes. SDKs can now opt into file-change tracking via a new `enableFileChangeTracking` session option, and then use rewind to restore the session to an earlier checkpoint. ([#​2321](https://github.com/github/copilot-sdk/pull/2321))

```ts
// TypeScript
const session = await client.startSession({ enableFileChangeTracking:
true });
const rewindPoints = await session.rpc.session.listRewindPoints();
await session.rpc.session.rewind({ rewindPointId: rewindPoints[0].id });
```

```cs
// C#
var session = await client.StartSessionAsync(new SessionOptions {
EnableFileChangeTracking = true });
var points = await session.Rpc.Session.ListRewindPointsAsync();
await session.Rpc.Session.RewindAsync(new RewindParams { RewindPointId =
points[0].Id });
```

```python
# Python
session = await client.start_session(enable_file_change_tracking=True)
points = await session.rpc.session.list_rewind_points()
await session.rpc.session.rewind(rewind_point_id=points[0].id)
```

```go
// Go
session, _ := client.StartSession(ctx,
&sdk.SessionOptions{EnableFileChangeTracking: true})
points, _ := session.RPC.Session.ListRewindPoints(ctx)
session.RPC.Session.Rewind(ctx, &sdk.RewindParams{RewindPointId:
points[0].Id})
```

```java
// Java
SessionOptions options = new
SessionOptions().setEnableFileChangeTracking(true);
CopilotSession session = client.startSession(options).get();
List<RewindPoint> points =
session.getRpc().getSession().listRewindPoints().get();
session.getRpc().getSession().rewind(new
RewindParams().setRewindPointId(points.get(0).getId())).get();
```

```rust
// Rust
let session = client.start_session(SessionOptions {
enable_file_change_tracking: Some(true), ..Default::default() }).await?;
let points = session.rpc().session().list_rewind_points().await?;
session.rpc().session().rewind(&RewindParams { rewind_point_id:
points[0].id.clone() }).await?;
```

### Feature: Java in-process runtime for Linux x64

The Java SDK now supports loading the Copilot runtime as a native library (via JNA) directly in-process on Linux x64, eliminating the need for a separate CLI child process. This mirrors the in-process mode already available in .NET and Rust. The feature is marked `@​CopilotExperimental`. ([#​2301](https://github.com/github/copilot-sdk/pull/2301))
 ... (truncated)

## 1.0.10-preview.0

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track releases of the reference implementation. For each release of the reference implementation, there may follow a corresponding release of this implementation with the same number as the reference implementation. Release identifiers of the reference implementation are in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding maven version for the release will be `Maj.Min.Micro-java.N`, where `Maj`, `Min` and `Micro` are the corresponding numbers for the reference implementation release, and `N` is a monotonically increasing sequence number starting with 0 for each release. See the corresponding architectural decision record for more information in the `docs/adr` directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) · [Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.10-preview.0</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.10-preview.0")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.10-preview.0'
```

### Feature: managed permission settings at session startup

Applications can now supply host-managed permission settings at session startup via `SessionConfig.setManagedSettings()`. The runtime validates and composes this policy with self-fetched and device policy. Re-supply on resume as it is not persisted. ([#​2139](https://github.com/github/copilot-sdk/pull/2139))

```java
SessionConfig config = new SessionConfig()
    .setManagedSettings(new ManagedSettings()
        .setPermissions(new ManagedSettingsPermissions()
            .setFilesystem(PermissionLevel.READ_WRITE)));
```

### Feature: `userPromptTransformed` hook

A new `onUserPromptTransformed` hook on `SessionHooks` lets applications observe (and optionally modify) the prompt text after the runtime transforms it. ([#​2254](https://github.com/github/copilot-sdk/pull/2254))

```java
session.getHooks().setOnUserPromptTransformed((input, ctx) -> {
    System.out.println("Transformed prompt: " + input.getPrompt());
    return CompletableFuture.completedFuture(null);
});
```

 ... (truncated)

## 1.0.9

## What's Changed
* dotnet: update README attachment examples to current API (fixes #​2196) by @​HindzStark in https://github.com/github/copilot-sdk/pull/2208
* Support reasoningEffort: max by @​Dharshika-11 in https://github.com/github/copilot-sdk/pull/2228
* Stop sendAndWait from emitting an unhandled rejection by @​thejesh23 in https://github.com/github/copilot-sdk/pull/2206
* docs: clarify working directory defaults across SDKs by @​xianjianlf2 in https://github.com/github/copilot-sdk/pull/2201
* Speed up Rust E2E tests with shared clients by @​SteveSandersonMS in https://github.com/github/copilot-sdk/pull/2250
* build(deps-dev): bump ip-address from 10.2.0 to 10.4.0 in /test/harness by @​dependabot[bot] in https://github.com/github/copilot-sdk/pull/2245
* build(deps-dev): bump the npm_and_yarn group across 1 directory with 2 updates by @​dependabot[bot] in https://github.com/github/copilot-sdk/pull/2244
* build(deps-dev): bump postcss from 8.5.15 to 8.5.25 in /nodejs by @​dependabot[bot] in https://github.com/github/copilot-sdk/pull/2243
* build(deps-dev): bump fast-uri from 3.1.4 to 3.1.5 in /test/harness by @​dependabot[bot] in https://github.com/github/copilot-sdk/pull/2242
* docs: move SDK development guidance to local READMEs by @​SteveSandersonMS in https://github.com/github/copilot-sdk/pull/2253
* build(deps-dev): bump postcss from 8.5.15 to 8.5.25 in /test/harness by @​dependabot[bot] in https://github.com/github/copilot-sdk/pull/2252
* docs: replace removed `session.idle.backgroundTasks` field with the current `aborted` field by @​examon in https://github.com/github/copilot-sdk/pull/2232
* Parallelize Python and Windows .NET CI tests by @​SteveSandersonMS in https://github.com/github/copilot-sdk/pull/2251
* Fix active Node and Rust replay E2E flakes by @​roji in https://github.com/github/copilot-sdk/pull/2186
* Add userPromptTransformed hook to all SDKs by @​SteveSandersonMS in https://github.com/github/copilot-sdk/pull/2254
* fix: Java README version stuck at 1.0.5-01; release sed regex can't match numeric qualifiers by @​rinceyuan in https://github.com/github/copilot-sdk/pull/2226
* docs: update Go and Rust API reference links by @​scottaddie in https://github.com/github/copilot-sdk/pull/2266
* docs: add citations guide by @​patniko in https://github.com/github/copilot-sdk/pull/2267
* sdk: Expose disabled MCP servers across languages by @​connor4312 in https://github.com/github/copilot-sdk/pull/2260

## New Contributors
* @​HindzStark made their first contribution in https://github.com/github/copilot-sdk/pull/2208
* @​Dharshika-11 made their first contribution in https://github.com/github/copilot-sdk/pull/2228
* @​thejesh23 made their first contribution in https://github.com/github/copilot-sdk/pull/2206
* @​xianjianlf2 made their first contribution in https://github.com/github/copilot-sdk/pull/2201

**Full Changelog**: https://github.com/github/copilot-sdk/compare/rust/v1.0.9-preview.3...rust/v1.0.9

## 1.0.9-preview.3

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track releases of the reference implementation. For each release of the reference implementation, there may follow a corresponding release of this implementation with the same number as the reference implementation. Release identifiers of the reference implementation are in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding maven version for the release will be `Maj.Min.Micro-java.N`, where `Maj`, `Min` and `Micro` are the corresponding numbers for the reference implementation release, and `N` is a monotonically increasing sequence number starting with 0 for each release. See the corresponding architectural decision record for more information in the `docs/adr` directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) · [Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.9-preview.3</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.9-preview.3")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.9-preview.3'
```

### Feature: managed approval requirement on permission requests

Permission handlers can now inspect `request.getManagedApprovalRequired()` to determine when a human decision is required. `PermissionHandler.APPROVE_ALL` now completes exceptionally when managed settings are enabled, preventing auto-approval of requests that require explicit human review. ([#​2080](https://github.com/github/copilot-sdk/pull/2080))

```java
PermissionHandler handler = (request, invocation) -> {
    if (Boolean.TRUE.equals(request.getManagedApprovalRequired())) {
        return requestHumanApproval(request);
    }
    return CompletableFuture.completedFuture(
new
PermissionRequestResult().setKind(PermissionRequestResultKind.APPROVED));
};
```

### Feature: GitHub MCP tool configuration

`SessionConfig` and `ResumeSessionConfig` now expose a `GitHubMcpToolConfig` option to configure the built-in GitHub MCP server, including selectively enabling tools and disabling form deferral. ([#​2112](https://github.com/github/copilot-sdk/pull/2112))

```java
var config = new SessionConfig()
    .setGitHubMcpToolConfig(new GitHubMcpToolConfig()
        .setDisableFormDeferral(true));
 ... (truncated)

## 1.0.9-preview.2

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.9-preview.2</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.9-preview.2")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.9-preview.2'
```

## Changes

- improvement: re-enable `ModeHandlers` exit_plan_mode E2E test
assertions ([#​2032](https://github.com/github/copilot-sdk/pull/2032))
- improvement: update E2E test fixtures to use `gpt-5.4` for reasoning
effort tests ([#​2181](https://github.com/github/copilot-sdk/pull/2181))

### New contributors

- `@​arimu1` made their first contribution in
[#​2032](https://github.com/github/copilot-sdk/pull/2032)

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/30652758765)
· sonnet46 36.1 AIC · ⌖ 6.98 AIC · ⊞ 8.6K

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.73, model: claude-sonnet-4.6, id: 30652758765,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/30652758765 -->

## 1.0.9-preview.1

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.9-preview.1</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.9-preview.1")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.9-preview.1'
```

### Other changes

- improvement: document MCP tool filter naming convention
(`<server-key>-<tool-name>`) for `setAvailableTools`,
`setExcludedTools`, and agent config in README
([#​2101](https://github.com/github/copilot-sdk/pull/2101))
- improvement: fix `EnableConfigDiscovery` Javadoc to accurately
describe agent discovery behavior — it gates `.github/agents/`
discovery, independent of `SkipCustomInstructions`
([#​2019](https://github.com/github/copilot-sdk/pull/2019))

### New contributors

- `@​syedkazmi14` made their first contribution in
[#​2101](https://github.com/github/copilot-sdk/pull/2101)
- `@​smz202000` made their first contribution in
[#​2019](https://github.com/github/copilot-sdk/pull/2019)

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/30575555193)
· sonnet46 47 AIC · ⌖ 5.17 AIC · ⊞ 8.6K

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.73, model: claude-sonnet-4.6, id: 30575555193,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/30575555193 -->

## 1.0.9-preview.0

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.9-preview.0</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.9-preview.0")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.9-preview.0'
```

---

### Feature: `AgentStop` lifecycle hook

The `agentStop` hook lets your application intercept the natural end of
an agent turn and optionally request the agent to continue. Return `{
decision: "block", reason: "..." }` to queue a follow-up prompt; return
nothing to let the agent stop normally.
([#​2054](https://github.com/github/copilot-sdk/pull/2054))

```java
SessionHooks hooks = new SessionHooks()
    .setOnAgentStop((input, invocation) -> {
        if (!input.isStopHookActive() && needsValidation()) {
            return CompletableFuture.completedFuture(
                new AgentStopHookOutput()
                    .setDecision("block")
                    .setReason("Run final validation and fix any failures.")
            );
        }
        return CompletableFuture.completedFuture(null);
    });
```

### Feature: custom JSON schema for `@​CopilotToolParam`

 ... (truncated)

## 1.0.8

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.8</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.8")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.8'
```

### Feature: per-agent reasoning effort

`CustomAgentConfig` now accepts an optional `reasoningEffort` field that
controls the reasoning intensity for a specific sub-agent. Omitting it
inherits the session-level effort; omitting it at both levels leaves the
choice to the backend.
([#​1981](https://github.com/github/copilot-sdk/pull/1981))

```java
CustomAgentConfig agent = new CustomAgentConfig()
    .setName("coder")
    .setReasoningEffort("high");
```

### Other changes

- improvement: **[Java]** strongly type the internal `expAssignments`
session-config field with `CopilotExpAssignmentResponse` to match the
runtime wire contract
([#​2033](https://github.com/github/copilot-sdk/pull/2033))

> [!WARNING]
> <details>
> <summary>Firewall blocked 1 domain</summary>
>
> The following domain was blocked by the firewall during workflow
execution:
>
> - `awmgmcpg`
>> To allow these domains, add them to the `network.allowed` list in
your workflow frontmatter:
 ... (truncated)

## 1.0.8-preview.0

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.8-preview.0</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.8-preview.0")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.8-preview.0'
```

---

### Feature: per-agent reasoning effort

You can now set a `reasoningEffort` override on individual custom agents
within a session. When omitted, no per-agent override is sent and the
backend chooses its default.
([#​1981](https://github.com/github/copilot-sdk/pull/1981))

```java
CustomAgentConfig agent = new CustomAgentConfig()
    .setName("my-agent")
    .setModel("claude-sonnet-4-5")
    .setReasoningEffort("high");
```

### Other changes

- improvement: strongly type internal `expAssignments` session config
field with `CopilotExpAssignmentResponse`
([#​2033](https://github.com/github/copilot-sdk/pull/2033))

> [!WARNING]
> <details>
> <summary>Firewall blocked 1 domain</summary>
>
> The following domain was blocked by the firewall during workflow
execution:
 ... (truncated)

## 1.0.7

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.7</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.7")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.7'
```

### Feature: opaque metadata passthrough for tool definitions

Hosts can now attach namespaced, opaque metadata to tool definitions and
have it forwarded verbatim over the `session.create`/`resumeSession`
wire call. Use `ToolDefinition.createWithMetadata(...)` or the fluent
`.metadata(Map)` builder, or express shallow flag maps via
`@​CopilotTool.MetadataEntry` annotations.
([#​1864](https://github.com/github/copilot-sdk/pull/1864))

```java
ToolDefinition tool = ToolDefinition.create("search", "Search files", schema, handler)
    .metadata(Map.of("com.example:featureFlags", Map.of("streamResults", true)));
```

### Feature: tool search configuration support

`SessionConfig` and `ResumeSessionConfig` now accept a
`ToolSearchConfig` that enables server-side tool search and controls the
deferral threshold. Tool results can also carry back `toolReferences`
indicating which tools were consulted during search.
([#​1933](https://github.com/github/copilot-sdk/pull/1933))

```java
SessionConfig config = new SessionConfig()
    .setToolSearch(new ToolSearchConfig().setEnabled(true).setDeferThreshold(5));
```

### Other changes

- feature: **[Java]** forward `enableManagedSettings` on
`SessionConfig`/`ResumeSessionConfig` to opt into enterprise
managed-settings enforcement at session bootstrap
([#​1925](https://github.com/github/copilot-sdk/pull/1925))
- feature: **[Java]** expose `agentId()`, `parentAgentId()`, and
`interactionType()` on `CopilotRequestContext` in request-handler
callbacks ([#​1949](https://github.com/github/copilot-sdk/pull/1949))
 ... (truncated)

## 1.0.7-preview.3

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.7-preview.3</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.7-preview.3")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.7-preview.3'
```

---

### Feature: tool search configuration

Sessions can now configure tool search behavior via `ToolSearchConfig`
on `SessionConfig`. Tool search keeps the model's active tool set small
by deferring MCP and external tools until needed.
([#​1933](https://github.com/github/copilot-sdk/pull/1933))

```java
var config = new SessionConfig()
    .setToolSearch(new ToolSearchConfig()
        .setEnabled(true)
        .setDeferThreshold(20));
var session = client.createSession(config).get();
```

### Other changes

- improvement: **[Java]** updated Javadoc examples to reference current
model IDs ([#​1978](https://github.com/github/copilot-sdk/pull/1978))

### New contributors

- `@​rinceyuan` made their first contribution in
[#​1978](https://github.com/github/copilot-sdk/pull/1978)

 ... (truncated)

## 1.0.7-preview.2

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.7-preview.2</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.7-preview.2")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.7-preview.2'
```

## Changes since java/v1.0.7-preview.1

- improvement: **[Java]** document native runtime bundling strategy
(ADR-007): chose per-platform classifier JARs (DJL-style) with JNA
bindings over Panama FFM, including decision rationale and monolithic
uber-jar support via `maven-assembly-plugin`
([#​1966](https://github.com/github/copilot-sdk/pull/1966))

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/29133933220)
· sonnet46 738.2K

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.55, model: claude-sonnet-4.6, id: 29133933220,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/29133933220 -->

## 1.0.7-preview.1

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.7-preview.1</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.7-preview.1")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.7-preview.1'
```

---

### Feature: request handler context now exposes agent metadata

`CopilotRequestContext` now includes `agentId`, `parentAgentId`, and
`interactionType` fields, giving request handlers visibility into which
agent is making an LLM inference call and whether it is a subagent.
([#​1949](https://github.com/github/copilot-sdk/pull/1949))

```java
client.setRequestHandler((context, chain) -> {
    System.out.println("Agent: " + context.getAgentId());
    System.out.println("Parent: " + context.getParentAgentId());
    System.out.println("Interaction: " + context.getInteractionType());
    return chain.apply(context);
});
```

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/29070709628)
· sonnet46 747.2K

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.55, model: claude-sonnet-4.6, id: 29070709628,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/29070709628 -->

## 1.0.7-preview.0

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.7-preview.0</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.7-preview.0")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.7-preview.0'
```

### Feature: opt in to enterprise managed-settings enforcement

`SessionConfig` and `ResumeSessionConfig` now support an
`enableManagedSettings` flag. When set to `true`, the runtime enforces
organizational bypass-permissions policies at session creation using the
session's GitHub token.
([#​1925](https://github.com/github/copilot-sdk/pull/1925))

```java
var session = client.createSession(
    new SessionConfig().setEnableManagedSettings(true)
).get();
```

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/29030107286)
· sonnet46 2.3M

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.55, model: claude-sonnet-4.6, id: 29030107286,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/29030107286 -->

## 1.0.6

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.6</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.6")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.6'
```

---

### Feature: inline lambda tool definitions

Developers can now define tools directly at the call site using
`ToolDefinition.from(...)` with typed lambda handlers and
`Param.of(...)` parameter metadata — no separate annotated class
required. Async variants (`fromAsync`) and `ToolInvocation` context
injection (`fromWithToolInvocation`) are also available.
([#​1895](https://github.com/github/copilot-sdk/pull/1895))

```java
ToolDefinition greet = ToolDefinition.from(
    "greet", "Greets a user by name",
    Param.of(String.class, "name", "The user's name"),
    name -> "Hello, " + name + "!");
```

### Other changes

- bugfix: **[Java]** preserve explicit null map values in JSON-RPC
params so user setting clears reach the CLI
([#​1906](https://github.com/github/copilot-sdk/pull/1906))
- feature: **[Java]** add experimental `onGitHubTelemetry` callback on
`CopilotClientOptions` for receiving forwarded GitHub telemetry events
([#​1835](https://github.com/github/copilot-sdk/pull/1835))

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/28957271778)
· sonnet46 2.5M

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.55, model: claude-sonnet-4.6, id: 28957271778,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/28957271778 -->

## 1.0.6-preview.1

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.6-preview.1</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.6-preview.1")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.6-preview.1'
```

### Feature: experimental GitHub telemetry forwarding

The Java SDK now supports forwarding per-session GitHub telemetry events
to your application. Set `onGitHubTelemetry` on `CopilotClientOptions`
to receive `gitHubTelemetry.event` notifications from the runtime; the
client automatically opts every session it creates or resumes into
telemetry forwarding when the handler is present.
([#​1835](https://github.com/github/copilot-sdk/pull/1835))

```java
CopilotClientOptions options = new CopilotClientOptions()
    .setOnGitHubTelemetry(notification -> {
        // process per-session GitHub telemetry event
        return CompletableFuture.completedFuture(null);
    });
```

> **Note:** This is an experimental feature (`@​CopilotExperimental`)
and may change or be removed without notice.

> Generated by [Release Changelog
Generator](https://github.com/github/copilot-sdk/actions/runs/28603913829)
· sonnet46 977.2K

<!-- gh-aw-agentic-workflow: Release Changelog Generator, engine:
copilot, version: 1.0.55, model: claude-sonnet-4.6, id: 28603913829,
workflow_id: release-changelog, run:
https://github.com/github/copilot-sdk/actions/runs/28603913829 -->

## 1.0.6-preview.0

## What's Changed
* Update @​github/copilot to 1.0.66 by @​github-actions[bot] in
https://github.com/github/copilot-sdk/pull/1859
* Update @​github/copilot to 1.0.67 by @​github-actions[bot] in
https://github.com/github/copilot-sdk/pull/1860
* Expose new session options across SDKs by @​stephentoub in
https://github.com/github/copilot-sdk/pull/1865
* Fix MCP OAuth resume order in Node.js SDK by @​MackinnonBuck in
https://github.com/github/copilot-sdk/pull/1861
* docs: update billing information for GitHub Copilot SDK usage by
@​coleflennikenmsft in https://github.com/github/copilot-sdk/pull/1854
* docs: add session limits guidance by @​szabta89 in
https://github.com/github/copilot-sdk/pull/1856
* Stream Anthropic /messages responses in E2E fake handlers by
@​stephentoub in https://github.com/github/copilot-sdk/pull/1868
* [changelog] Add changelog for java/v1.0.5-01 by @​github-actions[bot]
in https://github.com/github/copilot-sdk/pull/1871
* [changelog] Add changelog for v1.0.5 by @​github-actions[bot] in
https://github.com/github/copilot-sdk/pull/1869
* Add experimental GitHub telemetry redirection across all SDKs by
@​MackinnonBuck in https://github.com/github/copilot-sdk/pull/1835

## New Contributors
* @​coleflennikenmsft made their first contribution in
https://github.com/github/copilot-sdk/pull/1854
* @​szabta89 made their first contribution in
https://github.com/github/copilot-sdk/pull/1856

**Full Changelog**:
https://github.com/github/copilot-sdk/compare/rust/v1.0.5-preview.1...rust/v1.0.6-preview.0

## 1.0.5

# Installation

⚠️ **Artifact versioning plan:** Releases of this implementation track
releases of the reference implementation. For each release of the
reference implementation, there may follow a corresponding release of
this implementation with the same number as the reference
implementation. Release identifiers of the reference implementation are
in the form `vMaj.Min.Micro`. For example v0.1.32. The corresponding
maven version for the release will be `Maj.Min.Micro-java.N`, where
`Maj`, `Min` and `Micro` are the corresponding numbers for the reference
implementation release, and `N` is a monotonically increasing sequence
number starting with 0 for each release. See the corresponding
architectural decision record for more information in the `docs/adr`
directory of the source code.

📦 [View on Maven Central]((central.sonatype.com/redacted)

📖 [Documentation]((github.github.io/redacted) ·
[Javadoc]((github.github.io/redacted)


## Maven
```xml
<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.5</version>
</dependency>
```

## Gradle (Kotlin DSL)
```kotlin
implementation("com.github:copilot-sdk-java:1.0.5")
```

## Gradle (Groovy DSL)
```groovy
implementation 'com.github:copilot-sdk-java:1.0.5'
```

---

### Feature: annotation-based tool API (`@​CopilotTool`)

The Java SDK now includes a high-level, annotation-driven tool API.
Annotate methods with `@​CopilotTool` and parameters with
`@​CopilotToolParam` to define tools — a JSR-269 annotation processor
generates metadata at compile time with no runtime reflection. Use
`ToolDefinition.fromObject()` to register tools with minimal
boilerplate. ([#​1792](https://github.com/github/copilot-sdk/pull/1792))

```java
public class WeatherTools {
    `@​CopilotTool`("Get the current weather for a given city")
    public String getWeather(
            `@​CopilotToolParam`(value = "The city to get weather for", required = true) String city,
            `@​CopilotToolParam`(value = "Temperature unit: celsius or fahrenheit", defaultValue = "celsius") String unit) {
        // implementation
    }
}

List<ToolDefinition> tools = ToolDefinition.fromObject(new WeatherTools());
SessionConfig config = new SessionConfig().setTools(tools);
```

### Feature: `ToolInvocation` injection in `@​CopilotTool` methods

 ... (truncated)

## 1.0.5-preview.1

## What's Changed
* Fix flaky C# permission E2E assertions by @​roji in
https://github.com/github/copilot-sdk/pull/1827
* Update @​github/copilot to 1.0.66-2 by @​github-actions[bot] in
https://github.com/github/copilot-sdk/pull/1828
* [Java] Support hidden `ToolInvocation` injection in `@​CopilotTool`
methods by @​edburns with @​Copilot in
https://github.com/github/copilot-sdk/pull/1832
* Rename `Param` annotation to `CopilotToolParam` in Java SDK by
@​edburns with @​Copilot in
https://github.com/github/copilot-sdk/pull/1838
* Add SDK MCP OAuth host token handlers by @​roji in
https://github.com/github/copilot-sdk/pull/1669

## New Contributors
* @​roji made their first contribution in
https://github.com/github/copilot-sdk/pull/1827

**Full Changelog**:
https://github.com/github/copilot-sdk/compare/rust/v1.0.5-preview.0...rust/v1.0.5-preview.1

## 1.0.5-preview.0

## What's Changed
* Add sessionId to BYOK provider-token callback; rename to
bearerTokenProvider by @​SteveSandersonMS in
https://github.com/github/copilot-sdk/pull/1796
* Fix block-remove-before-merge workflow failing on merge_group events
by @​edburns with @​Copilot in
https://github.com/github/copilot-sdk/pull/1798
* Sunbrye/fix azure managed identity tabs by @​sunbrye in
https://github.com/github/copilot-sdk/pull/1801
* Make abort E2E snapshots tolerate timing variants by @​stephentoub in
https://github.com/github/copilot-sdk/pull/1808
* Java: Implement `@​CopilotTool` ergonomics by @​edburns in
https://github.com/github/copilot-sdk/pull/1792
* [changelog] Add changelog for java/v1.0.4 by @​gith…
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 waiting-for-runtime-update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants