Skip to content

docs: add session limits guidance - #1856

Merged
szabta89 merged 2 commits into
mainfrom
szabta89-session-limits-sdk
Jul 1, 2026
Merged

szabta89 merged 2 commits into
mainfrom
szabta89-session-limits-sdk

Conversation

@szabta89

@szabta89 szabta89 commented Jun 30, 2026 •

Copy link
Copy Markdown
Contributor

Context

The Copilot runtime session-limits feature is now part of the SDK baseline through #1865, which updated the CLI/schema dependency and exposed sessionLimits on session create/resume options across SDKs.

Problem

SDK users can now set an AI Credits budget, but the documentation does not explain how to configure it, that the configured value is a soft cap, or which budget-related events applications can observe.

Solution

This PR is a docs-only follow-up:

  • Adds a session-limits feature guide with create/resume examples for TypeScript, Python, Go, .NET, Java, and Rust.
  • Explains that maxAiCredits is an AI Credits soft cap: usage is checked after model calls return, so one response can exceed the configured value before the runtime blocks the next model call.
  • Extends the streaming event reference with session.session_limits_changed, session.usage_checkpoint, session_limits_exhausted.requested, and session_limits_exhausted.completed.
  • Links the new guide from the docs feature indexes.

Validation

The branch was rebuilt on current main with documentation-only changes, so no generated code or SDK test files are modified.

@szabta89
szabta89 requested a review from a team as a code owner June 30, 2026 15:54
Copilot AI review requested due to automatic review settings June 30, 2026 15:54

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

This PR adds session limits (AI credit budget) support across the SDKs (Node/TS, Python, Go, .NET, Java, Rust), updates schema-derived RPC/session-event types from @github/copilot@1.0.66, and documents/validates the new events and update/clear flows.

Changes:

  • Expose sessionLimits on session create/resume plus per-session update/clear APIs (including explicit-null semantics where needed).
  • Regenerate schema-derived RPC + session-event types (new/renamed session-limit events and related RPC surfaces).
  • Add focused tests and docs for forwarding + update/clear behavior and new emitted events.
Show a summary per file
File Description
scripts/codegen/go.ts Adds Go codegen support for explicit-null companion field when clearing sessionLimits.
scripts/codegen/csharp.ts Adds C# codegen support to distinguish omitted vs explicit-null sessionLimits in session.options.update.
rust/src/wire.rs Forwards session_limits in create/resume wire payloads.
rust/src/types.rs Introduces SessionLimitsConfig, wires it into SessionConfig/ResumeSessionConfig, and adds serialization tests.
rust/src/session.rs Adds a session limits sub-API and payload builder/tests for session.options.update.
rust/src/generated/session_events.rs Regenerates session events: rename to session.session_limits_changed, adds usage checkpoint + exhaustion events, etc.
rust/src/generated/rpc.rs Regenerates RPC surface (includes completions namespace and handlePendingSessionLimitsExhausted).
rust/src/generated/api_types.rs Regenerates API types + RPC method constants; updates limit-related types and docs.
rust/README.md Documents Rust session limits usage and related events.
python/test_client.py Adds tests for limits update/clear and create/resume forwarding/omission.
python/README.md Documents Python session limits usage and related events.
python/copilot/session.py Adds SessionLimitsConfig, wire conversion, and SessionLimitsApi.
python/copilot/client.py Forwards session_limits on create/resume to sessionLimits wire payload.
python/copilot/init.py Exports SessionLimitsApi and SessionLimitsConfig.
nodejs/test/e2e/session_limits.e2e.test.ts Adds Node E2E coverage for set/clear emitting session.session_limits_changed.
nodejs/test/client.test.ts Adds Node unit tests for update/clear RPC and create/resume forwarding.
nodejs/src/types.ts Adds public Node types for session limits config + limits API.
nodejs/src/session.ts Adds session.limits API and setSessionLimits() wrapper calling options.update.
nodejs/src/index.ts Re-exports new public types alongside generated session events.
nodejs/src/generated/session-events.ts Regenerates Node session-event types (limits/usage checkpoint/exhaustion, etc.).
nodejs/src/generated/rpc.ts Regenerates Node RPC types + adds completions + handlePendingSessionLimitsExhausted.
nodejs/src/client.ts Forwards sessionLimits during create/resume.
nodejs/README.md Documents Node session limits usage and related events.
nodejs/package.json Bumps @github/copilot dependency to ^1.0.66.
nodejs/package-lock.json Updates lockfile to @github/copilot@1.0.66 artifacts and metadata.
java/src/test/java/com/github/copilot/SessionRequestBuilderTest.java Adds Java tests for forwarding/omission + explicit-null serialization for limits update params.
java/src/test/java/com/github/copilot/SessionEventHandlingTest.java Updates assistant message event construction for regenerated event schema.
java/src/test/java/com/github/copilot/generated/rpc/GeneratedRpcRecordsCoverageTest.java Updates record construction for regenerated RPC record shapes.
java/src/main/java/com/github/copilot/SessionRequestBuilder.java Forwards sessionLimits into create/resume request builders.
java/src/main/java/com/github/copilot/rpc/SessionLimitsConfig.java Adds Java public config type for session limits (fluent setter + OptionalDouble getter).
java/src/main/java/com/github/copilot/rpc/SessionLimitsApi.java Adds Java session limits API interface.
java/src/main/java/com/github/copilot/rpc/SessionConfig.java Adds sessionLimits field + getter/setter to create-session config.
java/src/main/java/com/github/copilot/rpc/ResumeSessionRequest.java Adds sessionLimits to resume request DTO.
java/src/main/java/com/github/copilot/rpc/ResumeSessionConfig.java Adds sessionLimits field + getter/setter to resume-session config.
java/src/main/java/com/github/copilot/rpc/CreateSessionRequest.java Adds sessionLimits to create request DTO.
java/src/main/java/com/github/copilot/CopilotSession.java Implements SessionLimitsApi on the session and adds explicit-null update params record.
java/src/main/java/com/github/copilot/CopilotClient.java Updates options update parameter ordering to match regenerated schema (session limits + excluded builtin agents).
java/src/generated/java/com/github/copilot/generated/SessionUsageCheckpointEvent.java Adds generated session usage checkpoint event type.
java/src/generated/java/com/github/copilot/generated/SessionStartEvent.java Regenerates start event to include sessionLimits instead of response limits.
java/src/generated/java/com/github/copilot/generated/SessionSessionLimitsChangedEvent.java Regenerates limits-changed event name/payload.
java/src/generated/java/com/github/copilot/generated/SessionResumeEvent.java Regenerates resume event to include sessionLimits instead of response limits.
java/src/generated/java/com/github/copilot/generated/SessionLimitsExhaustedResponseAction.java Adds generated enum for session limit exhaustion responses.
java/src/generated/java/com/github/copilot/generated/SessionLimitsExhaustedResponse.java Adds generated record for session limit exhaustion response payload.
java/src/generated/java/com/github/copilot/generated/SessionLimitsExhaustedRequestedEvent.java Adds generated exhaustion requested event type.
java/src/generated/java/com/github/copilot/generated/SessionLimitsExhaustedCompletedEvent.java Adds generated exhaustion completed event type.
java/src/generated/java/com/github/copilot/generated/SessionLimitsConfig.java Renames/updates generated limits config type for events package.
java/src/generated/java/com/github/copilot/generated/SessionEvent.java Updates session event union to include new/renamed limit-related events.
java/src/generated/java/com/github/copilot/generated/rpc/UISessionLimitsExhaustedResponseAction.java Adds generated RPC enum for UI exhaustion response action.
java/src/generated/java/com/github/copilot/generated/rpc/UISessionLimitsExhaustedResponse.java Adds generated RPC record for UI exhaustion response payload.
java/src/generated/java/com/github/copilot/generated/rpc/SessionUiHandlePendingSessionLimitsExhaustedResult.java Adds generated RPC result type for handling pending exhaustion.
java/src/generated/java/com/github/copilot/generated/rpc/SessionUiHandlePendingSessionLimitsExhaustedParams.java Adds generated RPC params for handling pending exhaustion.
java/src/generated/java/com/github/copilot/generated/rpc/SessionUiApi.java Adds generated UI API method handlePendingSessionLimitsExhausted.
java/src/generated/java/com/github/copilot/generated/rpc/SessionRpc.java Adds generated completions namespace accessor on session RPC.
java/src/generated/java/com/github/copilot/generated/rpc/SessionOptionsUpdateParams.java Updates options update params to include sessionLimits and excluded builtin agents.
java/src/generated/java/com/github/copilot/generated/rpc/SessionMetadataSnapshotResult.java Updates snapshot result to include sessionLimits instead of response limits.
java/src/generated/java/com/github/copilot/generated/rpc/SessionLimitsConfig.java Renames/updates generated limits config type for RPC package.
java/src/generated/java/com/github/copilot/generated/rpc/SessionEventLogRegisterInterestParams.java Updates docs/examples for event interest registration to include exhaustion event.
java/src/generated/java/com/github/copilot/generated/rpc/SessionCompletionsRequestResult.java Adds generated RPC result for completions request.
java/src/generated/java/com/github/copilot/generated/rpc/SessionCompletionsRequestParams.java Adds generated RPC params for completions request.
java/src/generated/java/com/github/copilot/generated/rpc/SessionCompletionsGetTriggerCharactersResult.java Adds generated RPC result for completions trigger characters.
java/src/generated/java/com/github/copilot/generated/rpc/SessionCompletionsGetTriggerCharactersParams.java Adds generated RPC params for completions trigger characters.
java/src/generated/java/com/github/copilot/generated/rpc/SessionCompletionsApi.java Adds generated completions API namespace.
java/src/generated/java/com/github/copilot/generated/rpc/SessionCompletionItem.java Adds generated completion item type.
java/src/generated/java/com/github/copilot/generated/rpc/ModelCapabilitiesSupports.java Extends generated supports record (adaptive thinking).
java/src/generated/java/com/github/copilot/generated/rpc/ModelCapabilitiesOverrideSupports.java Extends generated override supports record (adaptive thinking).
java/src/generated/java/com/github/copilot/generated/rpc/AdaptiveThinkingSupport.java Adds generated adaptive thinking support enum.
java/src/generated/java/com/github/copilot/generated/AssistantMessageEvent.java Extends assistant message event data (reasoning wire field).
java/scripts/codegen/package.json Updates Java codegen dependency to @github/copilot@^1.0.66.
java/scripts/codegen/package-lock.json Updates Java codegen lockfile to @github/copilot@1.0.66.
java/README.md Documents Java session limits usage and related events.
go/zsession_events.go Updates Go top-level session events re-exports for regenerated limit-related types.
go/types.go Adds SessionLimits to create/resume configs and forwards it on requests; adds update request type.
go/session.go Adds SetSessionLimits helper issuing session.options.update.
go/rpc/zsession_events.go Regenerates Go RPC session events (new types + constants for limits/usage checkpoint/exhaustion).
go/rpc/zsession_encoding.go Updates event decoding to include new limits-related events and remove old response-limits event.
go/rpc/zrpc.go Regenerates Go RPC types (limits config, completions API, handlePendingSessionLimitsExhausted, etc.).
go/rpc/zrpc_encoding.go Regenerates Go RPC JSON encoding/decoding to include new/renamed fields.
go/README.md Documents Go session limits usage and related events.
go/client.go Forwards SessionLimits in create/resume requests.
go/client_test.go Adds Go tests for set/clear behavior and create/resume request JSON serialization.
dotnet/test/Unit/SerializationTests.cs Adds .NET serialization tests for session limits set + omit behavior.
dotnet/test/Unit/CloneTests.cs Ensures session config cloning copies SessionLimits.
dotnet/test/Unit/ClientSessionLifetimeTests.cs Adds .NET tests for limits update/clear flows via high-level and generated RPC APIs.
dotnet/src/Types.cs Adds ISessionLimitsApi + SessionLimits property on config base types.
dotnet/src/Session.cs Implements Limits API and explicit-null request type + JSON context registration.
dotnet/src/Client.cs Forwards SessionLimits into create/resume requests and registers type for serialization.
dotnet/README.md Documents .NET session limits usage and related events.
docs/features/streaming-events.md Documents new streaming events: usage checkpoint, session limits changed, and limits exhaustion requested/completed.

Review details

Files not reviewed (7)
  • go/rpc/zrpc.go: Generated file
  • go/rpc/zrpc_encoding.go: Generated file
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
  • java/scripts/codegen/package-lock.json: Generated file
  • nodejs/package-lock.json: Generated file
  • Files reviewed: 45/92 changed files
  • Comments generated: 2
  • Review effort level: Low

Comment thread nodejs/src/types.ts Outdated
Comment thread java/src/main/java/com/github/copilot/rpc/SessionLimitsConfig.java Outdated
@github-actions

This comment has been minimized.

Comment thread dotnet/src/Generated/Rpc.cs Outdated
Comment thread dotnet/src/Generated/Rpc.cs
Comment thread dotnet/src/Generated/Rpc.cs
Comment thread dotnet/src/Session.cs Outdated
Comment thread dotnet/src/Types.cs Outdated

@stephentoub stephentoub left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks, @szabta89. I left some comments on the .NET implementation, but they extend to all six. Essentially:

  • This PR shouldn't be touching the autogenerated rpc and session event files
  • The main contribution I think should be the additional properties on the session creation/resume options bags.
  • I question whether we actually need new "high-level" surface area for this (e.g. session.Limits.SetLimitsAsync) or for modification intrasession can just rely on the RPC surface area (e.g. session.Rpc.Options.UpdateAsync).

@szabta89

Copy link
Copy Markdown
Contributor Author

Thanks, @szabta89. I left some comments on the .NET implementation, but they extend to all six. Essentially:

* This PR shouldn't be touching the autogenerated rpc and session event files

* The main contribution I think should be the additional properties on the session creation/resume options bags.

* I question whether we actually need new "high-level" surface area for this (e.g. session.Limits.SetLimitsAsync) or for modification intrasession can just rely on the RPC surface area (e.g. session.Rpc.Options.UpdateAsync).

Thanks, I am gonna take a look at these. You mentioned a couple seemingly unrelated things ending up in this PR. They seem to be collateral schema-regeneration output from @github/copilot@1.0.66. What is the right approach to handle these? That schema includes session limits, but also other runtime schema additions such as the session.completions API and adaptive-thinking support. So these are unrelated to session limits semantically, but they came from the same schema refresh.

@github-actions

This comment has been minimized.

@github-actions github-actions Bot 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.

Generated by SDK Consistency Review Agent for issue #1856 · sonnet46 2.6M

Comment thread go/session.go Outdated
@stephentoub

Copy link
Copy Markdown
Collaborator

What is the right approach to handle these?

I'll get 1.0.66 imported now. (I thought I already did, but apparently not.)

@szabta89
szabta89 force-pushed the szabta89-session-limits-sdk branch from f76cd7d to 617f57d Compare July 1, 2026 08:20
@szabta89 szabta89 changed the title feat: add session limits support docs: add session limits guidance and event coverage Jul 1, 2026
@szabta89

szabta89 commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

Update on this PR: I reset the branch onto current main after #1865 landed, so the previous generated-code and high-level API changes are no longer part of this diff. The PR is now intentionally scoped to a docs/tests follow-up only:

  • Adds a session-limits feature guide with create/resume examples across SDKs.
  • Documents the generated session-limit budget events in the streaming events reference.
  • Adds focused Node and Go coverage for the generated budget event surface.

I resolved the old review threads because they were all attached to outdated code that was removed by the reset.

@github-actions

This comment has been minimized.

@github-actions github-actions Bot 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.

Generated by SDK Consistency Review Agent for issue #1856 · sonnet46 3M

Comment thread docs/features/session-limits.md Outdated
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Cross-SDK consistency review

Overall this PR is in good shape. The documentation guide covers all six SDKs with correct API examples, follows the docs style guide (sentence-case headings, consecutive <details> blocks, <!-- docs-validate: skip --> markers), and the streaming-events reference entries are consistent with the generated type shapes.

API examples verified ✅

Every language example was cross-checked against the actual implementation:

Language SessionLimitsConfig field Correct
TypeScript sessionLimits: { maxAiCredits: 30 } ✅
Python session_limits={"max_ai_credits": 30} ✅
Go SessionLimits: &rpc.SessionLimitsConfig{ MaxAiCredits: copilot.Float64(30) } ✅
.NET SessionLimits = new SessionLimitsConfig { MaxAiCredits = 30 } ✅
Java setSessionLimits(new SessionLimitsConfig(30.0)) ✅ (record with Double maxAiCredits)
Rust SessionLimitsConfig { max_ai_credits: Some(30.0) } ✅

Minor consistency gap: unit test coverage

The PR adds focused event-type tests for Node.js (session-event-types.test.ts) and Go (session_event_serialization_test.go), which is great. However, the four new event types (session.session_limits_changed, session.usage_checkpoint, session_limits_exhausted.requested, session_limits_exhausted.completed) are not yet covered in the equivalent unit test files for the other four SDKs:

SDK Test file Has new event coverage?
Java SessionEventDeserializationTest.java + GeneratedEventTypesCoverageTest.java ❌ not yet
.NET SessionEventSerializationTests.cs ❌ not yet
Python test_rpc_generated.py ❌ not yet
Rust session_test.rs / api_types_test.rs ❌ not yet

This isn't blocking – the implementation is already validated through e2e tests for all SDKs – but the documented event surface would be more consistently backed by unit-level deserialization tests across all languages. Happy to see that tracked as a follow-up if preferred.

Generated by SDK Consistency Review Agent for issue #1856 · sonnet46 2.9M · ◷

@github-actions github-actions Bot 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.

Generated by SDK Consistency Review Agent for issue #1856 · sonnet46 2.9M

Comment thread go/session_event_serialization_test.go
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@szabta89
szabta89 force-pushed the szabta89-session-limits-sdk branch from 550b604 to 4d98a3e Compare July 1, 2026 09:36
@szabta89 szabta89 changed the title docs: add session limits guidance and event coverage docs: add session limits guidance Jul 1, 2026
@szabta89

szabta89 commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

Removed the Node and Go test changes and rebuilt the branch on current main as a docs-only PR. The remaining diff is limited to the session-limits guide, docs index links, and streaming event reference updates.

Comment thread docs/features/session-limits.md
Comment thread docs/features/session-limits.md Outdated

@stephentoub stephentoub left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Left a few comments to be addressed, otherwise LGTM.

edburns pushed a commit that referenced this pull request Aug 4, 2026
* docs: add session limits guidance

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: clarify session limits soft cap

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
edburns pushed a commit that referenced this pull request Aug 4, 2026
* docs: add session limits guidance

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* docs: clarify session limits soft cap

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants