Add history.clearContext and Tool.isTerminal across all SDKs - #2129
Conversation
There was a problem hiding this comment.
Pull request overview
Adds Node SDK support for clearing session context and terminal tools.
Changes:
- Adds
Tool.isTerminaland forwards it during create/resume. - Adds generated
history.clearContextRPC 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
history.clearContext and Tool.isTerminalhistory.clearContext and Tool.isTerminal across all SDKs
There was a problem hiding this comment.
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.
@CopilotToolcurrently exposes override, permission, and defer options, andCopilotToolProcessorforwards each one, but neither has anisTerminalmember. 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
Toolis#[non_exhaustive]and its docs direct consumers to the fluent builder, but this new option has nowith_is_terminalmethod. Every adjacent runtime hint does (with_overrides_built_in_tool,with_skip_permission, andwith_deferattypes.rs:455-477), and the customDebugimplementation attypes.rs:496-511also omits this field. Please integrateis_terminalinto 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,
SessionHistoryApistill has noclearContextmethod andSessionEventhas no typedsession.context_clearedevent, 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_toolsignature now acceptsis_terminal, but itsArgssection 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 throughhelp()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
There was a problem hiding this comment.
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.tshas paired request-payload tests for the adjacentoverridesBuiltInToolanddeferflags. Add equivalent create and resume assertions forisTerminalso 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.pyalready verifies both create and resume forwarding for the neighboring override/defer flags. Add correspondingis_terminal=Truetests 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.clearContextor the typedsession.context_clearedevent promised for every SDK.SessionHistoryApicurrently ends withsummarizeForHandoff, andSessionEventhas 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
There was a problem hiding this comment.
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.
@CopilotToolexposes the other tool flags (overridesBuiltInTool,skipPermission, anddefer), but the annotation and processor still emit only the seven-argument constructor, so every annotation-defined tool getsisTerminal = null. Please add anisTerminalannotation member and carry it throughCopilotToolProcessor, 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_terminalis a new public argument but is missing from the function'sArgsdocumentation, 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
There was a problem hiding this comment.
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:
SessionHistoryApihas noclearContextmethod/request/result types, and there is no typedsession.context_clearedevent. 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_terminalthroughdefine_tooland verifies bothsession.createandsession.resumepayloads, 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 thatisTerminalreaches bothsession.createandsession.resumepayloads (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
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
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.AdditionalPropertiesbag, so they do not exercise this conversion or the serializedsession.create/session.resumepayload. This new bridge is whereis_terminalbecomes wire-levelisTerminal; add a public-API client test using the existing fake server pattern inClientSessionLifetimeTeststhat asserts both requests containtools[0].isTerminal == trueand 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-609already verifies the analogousmetadataoption on both create and resume, but no test currently exercisesis_terminal; a future edit could silently drop either branch or emit the wrong camel-case key. CoverTrueon both paths and omission for the defaultFalse.
if tool.is_terminal:
definition["isTerminal"] = True
- Files reviewed: 13/26 changed files
- Comments generated: 1
- Review effort level: Medium
This comment has been minimized.
This comment has been minimized.
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…
Overview
What
Adds two things to every SDK language surface:
history.clearContexton 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 newsession.context_clearedevent.isTerminalon 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.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
isTerminalsuch 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. WithoutclearContextthe capability has no API surface at all.Per-language changes
Generated RPC/event types are regenerated for all six languages.
isTerminalis hand-authored per language, matching howoverridesBuiltInTool/skipPermission/deferare already carried:Tool.isTerminal,defineToolconfigcreateSession/resumeSessionsites inclient.tsTool.IsTerminaljson:"isTerminal,omitempty"Tool.is_terminal,define_tooloverloadsTool::is_terminalfalseToolDefinition.isTerminalrecord component@JsonProperty("isTerminal")CopilotToolOptions.IsTerminal,is_terminaladditional-property keyToolDefinitionCoexistence with
Tool.metadata.metadatalanded onmainwhile 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.
ToolDefinitionis 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:…, defer) →metadata = null, isTerminal = null…, defer, metadata) →isTerminal = nullso existing call sites — including annotation-processor output — keep compiling unchanged. Tests pin both.
Every fluent copy method (
overridesBuiltInTool,skipPermission,defer,metadata) threadsisTerminalthrough, so it is not silently dropped when another option is set afterwards, and a matchingisTerminal(boolean)copy method is added for tools built via thefrom(...)factories.resumeSessionis the path extensions join on viajoinSession, so it matters that both serialization sites carry the flag, not just session creation.Tests
client.test.ts-isTerminalforwarded on bothsession.createandsession.resume, and omitted when unsetTestIsTerminal- camelCase wire name when set, omitted when falsetest_client.py-isTerminalforwarded on bothsession.createandsession.resume, and omitted at its defaultis_terminal_tests- the same two cases viaserde_json, plus a guard that the hand-writtenDebugimpl reports the fieldToolDefinitionIsTerminalTest- both cases plus the older-arity constructor compatibility guardCopilotToolTests-is_terminaladditional property set when requested, omitted otherwiseToolis the one type here with a hand-writtenDebugimpl 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 CodeQLAnalyze *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, includingToolDefinitionIsTerminalTest),ruff check/format,dotnet build, and the two new VitestisTerminalcases.Node.js
test/e2e/*and Gointernal/e2eneed a Copilot CLI binary that is unavailable locally; they are covered by CI.Codegen (resolved)
The
Codegen Checkfailure is resolved. Sequence:@github/copilot@1.0.78, published 2026-08-03 at 23:30Z, is the first release shipping the schemas:schemas/api.schema.jsondefinesclearContextwith"rpcMethod": "session.history.clearContext", andschemas/session-events.schema.jsondefinescontext_cleared.1.0.78onmain, and this branch is now rebased on top of that.Because
mainregenerates from the real schema, the generated bindings now come frommainand 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 generateandcd java && mvn generate-sources -Pcodegeneach produce zero drift.This also closes the Java gap raised in review. While the pinned CLI lacked the schemas, the
java-codegen-checkworkflow auto-committed a regeneration that strippedSessionContextClearedEvent,SessionHistoryClearContextParams/Resultand theSessionHistoryApimethod. That strip commit is obsolete and was dropped during the rebase, andmain's regenerated Java bindings now supply all of it, so Java is at parity with the other SDKs.The generated
clearContextdocs now reflect the tightened contract from the shipped schema: the seedpromptis required rather than optional.One consequence worth flagging for review:
Codegen Checkis 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
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.