From 086a3cb94399aa0aa1663befc38421bcd9e2ca3d Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Wed, 10 Jun 2026 15:08:35 +0100 Subject: [PATCH 01/22] Add E2E test for session.todos_changed event + readSqlTodosWithDependencies Validates the new runtime APIs added in copilot-agent-runtime#10061: - session.todos_changed event fires when the sql tool mutates the prompted todos / todo_deps tables - session.plan.readSqlTodosWithDependencies returns structured rows and dependency edges suitable for progress UIs The generated rpc.ts and session-events.ts diffs were produced by re-running the Node codegen against the runtime PR's generated/ schemas; they will reproduce automatically once the runtime PR ships in the @github/copilot npm package. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/src/generated/rpc.ts | 256 +++--------------- .../e2e/session_todos_changed.e2e.test.ts | 62 +++++ ...anged_and_exposes_rows___dependencies.yaml | 141 ++++++++++ 3 files changed, 237 insertions(+), 222 deletions(-) create mode 100644 nodejs/test/e2e/session_todos_changed.e2e.test.ts create mode 100644 test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index 1ef280abf..efdcdaa0e 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -313,7 +313,7 @@ export type EventsCursorStatus = /** The cursor referred to history that is no longer available. */ | "expired"; /** - * Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin (installed plugin), or session (session-state//extensions/) + * Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/) * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "ExtensionSource". @@ -323,11 +323,7 @@ export type ExtensionSource = /** Extension discovered from the current project's .github/extensions directory. */ | "project" /** Extension discovered from the user's ~/.copilot/extensions directory. */ - | "user" - /** Extension contributed by an installed plugin. */ - | "plugin" - /** Extension discovered from the current session's state directory (loaded only for this session). */ - | "session"; + | "user"; /** * Current status: running, disabled, failed, or starting * @@ -1015,32 +1011,6 @@ export type ProviderConfigWireApi = | "completions" /** OpenAI Responses API wire format. */ | "responses"; -/** - * Provider family. Matches the `type` field of a BYOK provider config. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "ProviderEndpointType". - */ -/** @experimental */ -export type ProviderEndpointType = - /** OpenAI-compatible endpoint (use the OpenAI client library). */ - | "openai" - /** Azure OpenAI endpoint (use the OpenAI client library with the Azure base URL). */ - | "azure" - /** Anthropic endpoint (use the Anthropic client library). */ - | "anthropic"; -/** - * Wire API to be used, when required for the provider type. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "ProviderEndpointWireApi". - */ -/** @experimental */ -export type ProviderEndpointWireApi = - /** Classic chat-completions request shape. */ - | "completions" - /** Newer responses request shape. */ - | "responses"; /** * Schema for the `PushAttachment` type. * @@ -1459,39 +1429,6 @@ export type SlashCommandInvocationResult = | SlashCommandAgentPromptResult | SlashCommandCompletedResult | SlashCommandSelectSubcommandResult; -/** - * Subagent settings to apply, or null to clear the live session override - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "SubagentSettings". - */ -/** @experimental */ -export type SubagentSettings = { - /** - * Per-agent settings keyed by subagent agent_type - */ - agents?: { - [k: string]: SubagentSettingsEntry | undefined; - }; - /** - * Names of subagents the user has turned off; they cannot be dispatched - */ - disabledSubagents?: string[]; -} | null; -/** - * Context tier override for matching subagents - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "SubagentSettingsEntryContextTier". - */ -/** @experimental */ -export type SubagentSettingsEntryContextTier = - /** Inherit the parent session's effective context tier at dispatch time. */ - | "inherit" - /** Use the model's default context window. */ - | "default" - /** Pin the subagent to the long-context tier when supported. */ - | "long_context"; /** * Current lifecycle status of the task * @@ -2903,10 +2840,6 @@ export interface SlashCommandInfo { * Whether the command is experimental */ experimental?: boolean; - /** - * Whether the command may be the target of `/every` / `/after` schedules. Resolution happens at every tick, so only set this when the command is safe to re-invoke and produces an agent prompt. - */ - schedulable?: boolean; } /** * Optional unstructured input hint @@ -3405,7 +3338,7 @@ export interface ExecuteCommandResult { /** @experimental */ export interface Extension { /** - * Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper', 'plugin:my-plugin:my-ext') + * Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper') */ id: string; /** @@ -5450,19 +5383,6 @@ export interface McpUnregisterExternalClientRequest { */ serverName: string; } -/** - * Memory configuration for this session. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "MemoryConfiguration". - */ -/** @experimental */ -export interface MemoryConfiguration { - /** - * Whether memory is enabled for the session. - */ - enabled: boolean; -} /** * Model identifier and token limits used to compute the context-info breakdown. * @@ -7470,7 +7390,7 @@ export interface PlanReadSqlTodosResult { rows: PlanSqlTodosRow[]; } /** - * A single todo row read from the session SQL `todos` table. All fields are optional because the SQL schema is best-effort and the agent may not have populated every column. + * Schema for the `PlanSqlTodosRow` type. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "PlanSqlTodosRow". @@ -7505,20 +7425,45 @@ export interface PlanReadSqlTodosWithDependenciesResult { /** * Rows from the session SQL todos table, ordered by creation time and id. Empty when no database, no todos table, or the SELECT failed. */ - rows: PlanSqlTodosRow[]; + rows: PlanSqlTodosWithDependenciesRow[]; /** * Edges from the session SQL todo_deps table. Empty when no database, no todo_deps table, or the SELECT failed. Read independently from `rows`, so a broken todo_deps table does not affect the rows result and vice versa. */ - dependencies: PlanSqlTodoDependency[]; + dependencies: PlanSqlTodosWithDependencies[]; } /** - * A single dependency edge read from the session SQL `todo_deps` table, indicating that one todo must complete before another. + * Schema for the `PlanSqlTodosWithDependenciesRow` type. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "PlanSqlTodoDependency". + * via the `definition` "PlanSqlTodosWithDependenciesRow". */ /** @experimental */ -export interface PlanSqlTodoDependency { +export interface PlanSqlTodosWithDependenciesRow { + /** + * Todo identifier. + */ + id?: string; + /** + * Todo title. + */ + title?: string; + /** + * Todo description. + */ + description?: string; + /** + * Todo status. + */ + status?: string; +} +/** + * Schema for the `PlanSqlTodosWithDependencies` type. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "PlanSqlTodosWithDependencies". + */ +/** @experimental */ +export interface PlanSqlTodosWithDependencies { /** * ID of the todo that has the dependency. */ @@ -7923,70 +7868,6 @@ export interface ProviderConfigAzure { */ apiVersion?: string; } -/** - * A snapshot of the provider endpoint the session is currently configured to talk to. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "ProviderEndpoint". - */ -/** @experimental */ -export interface ProviderEndpoint { - type: ProviderEndpointType; - wireApi?: ProviderEndpointWireApi; - /** - * Base URL to pass to the LLM client library. - */ - baseUrl: string; - /** - * A credential the caller should use with this endpoint. Omitted only when the endpoint accepts unauthenticated requests. - */ - apiKey?: string; - /** - * HTTP headers the caller must include on every outbound request. - */ - headers: { - [k: string]: string | undefined; - }; - sessionToken?: ProviderSessionToken; -} -/** - * Short-lived, rotating credential the caller must send on every request, in addition to `apiKey` if one is present. Omitted when the endpoint does not require one. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "ProviderSessionToken". - */ -/** @experimental */ -export interface ProviderSessionToken { - /** - * The short-lived token value. - */ - token: string; - /** - * HTTP header name the token must be sent under. - */ - header: string; - /** - * The model the token is bound to, when applicable. When set, the token is only valid for requests against this model. - */ - model?: string; - /** - * When the token expires, if known. Callers should refresh by calling `getEndpoint` again before this time, or reactively on any 401/403 response from `baseUrl`. - */ - expiresAt?: string; -} -/** - * Optional model identifier to scope the endpoint snapshot to. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "ProviderGetEndpointRequest". - */ -/** @experimental */ -export interface ProviderGetEndpointRequest { - /** - * Model identifier the caller intends to use against the returned endpoint. Used to pick the correct wire shape. Omit to use whichever model the session is currently using. - */ - modelId?: string; -} /** * File attachment * @@ -9776,14 +9657,6 @@ export interface SessionOpenOptions { * Stable integration identifier for analytics. */ integrationId?: string; - /** - * ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and ExP-backed flags wait for it. When absent the session does not block on ExP. - * - * @internal - */ - expAssignments?: { - [k: string]: unknown | undefined; - }; /** * Feature-flag values resolved by the host. */ @@ -9922,7 +9795,6 @@ export interface SessionOpenOptions { * @experimental */ additionalContentExclusionPolicies?: SessionOpenOptionsAdditionalContentExclusionPolicy[]; - memory?: MemoryConfiguration; /** * Capabilities enabled for this session. */ @@ -11317,24 +11189,6 @@ export interface SlashCommandSelectSubcommandOption { */ group?: string; } -/** - * Subagent model, reasoning effort, and context tier settings - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "SubagentSettingsEntry". - */ -/** @experimental */ -export interface SubagentSettingsEntry { - /** - * Model override for matching subagents - */ - model?: string; - /** - * Reasoning effort override for matching subagents - */ - effortLevel?: string; - contextTier?: SubagentSettingsEntryContextTier; -} /** * Schema for the `TaskAgentInfo` type. * @@ -11844,14 +11698,6 @@ export interface ToolsListRequest { */ model?: string; } -/** - * Empty result after applying subagent settings - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "ToolsUpdateSubagentSettingsResult". - */ -/** @experimental */ -export interface ToolsUpdateSubagentSettingsResult {} /** * Multi-select string field where each option pairs a value with a display label. * @@ -12419,19 +12265,6 @@ export interface UIUnregisterDirectAutoModeSwitchHandlerResult { */ unregistered: boolean; } -/** - * Subagent settings to apply to the current session - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "UpdateSubagentSettingsRequest". - */ -/** @experimental */ -export interface UpdateSubagentSettingsRequest { - /** - * Subagent settings to apply, or null to clear the live session override - */ - subagents?: SubagentSettings | null; -} /** * Accumulated session usage metrics, including premium request cost, token counts, model breakdown, and code-change totals. * @@ -14144,18 +13977,6 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin connection.sendRequest("session.plugins.reload", { sessionId, ...params }), }, /** @experimental */ - provider: { - /** - * Returns the provider endpoint and credentials the session is currently configured to talk to, so the caller can make inference calls directly against the same backend the session uses. - * - * @param params Optional model identifier to scope the endpoint snapshot to. - * - * @returns A snapshot of the provider endpoint the session is currently configured to talk to. - */ - getEndpoint: async (params?: ProviderGetEndpointRequest): Promise => - connection.sendRequest("session.provider.getEndpoint", { sessionId, ...params }), - }, - /** @experimental */ options: { /** * Patches the genuinely-mutable subset of session options. @@ -14238,15 +14059,6 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin */ getCurrentMetadata: async (): Promise => connection.sendRequest("session.tools.getCurrentMetadata", { sessionId }), - /** - * Updates the current session's live subagent settings after user settings change. The persisted user settings remain the source of truth for future sessions. - * - * @param params Subagent settings to apply to the current session - * - * @returns Empty result after applying subagent settings - */ - updateSubagentSettings: async (params: UpdateSubagentSettingsRequest): Promise => - connection.sendRequest("session.tools.updateSubagentSettings", { sessionId, ...params }), }, /** @experimental */ commands: { diff --git a/nodejs/test/e2e/session_todos_changed.e2e.test.ts b/nodejs/test/e2e/session_todos_changed.e2e.test.ts new file mode 100644 index 000000000..b43818df8 --- /dev/null +++ b/nodejs/test/e2e/session_todos_changed.e2e.test.ts @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +import fs, { realpathSync } from "node:fs"; +import os from "node:os"; +import { join } from "node:path"; +import { describe, expect, it } from "vitest"; +import { approveAll, type SessionEvent } from "../../src/index.js"; +import { createSdkTestContext } from "./harness/sdkTestContext.js"; + +/** + * E2E coverage for the runtime's `session.todos_changed` event and + * `session.plan.readSqlTodosWithDependencies` RPC. We let the agent drive the + * built-in `sql` tool (default mode = "copilot-cli") to insert known rows into + * the prompted `todos` table, then assert both that the lightweight signal + * event fired and that the structured query API returns those rows. + */ +describe("Todos changed event + readSqlTodosWithDependencies", async () => { + const baseDir = realpathSync(fs.mkdtempSync(join(os.tmpdir(), "copilot-todos-e2e-"))); + const { copilotClient: client } = await createSdkTestContext({ + copilotClientOptions: { baseDirectory: baseDir }, + }); + + it( + "fires session.todos_changed and exposes rows + dependencies", + { timeout: 120_000 }, + async () => { + const session = await client.createSession({ onPermissionRequest: approveAll }); + + const events: SessionEvent[] = []; + session.on((event) => { + events.push(event); + }); + + await session.sendAndWait({ + prompt: + "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + + "1. CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, created_at TEXT, updated_at TEXT);\n" + + "2. CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, PRIMARY KEY (todo_id, depends_on));\n" + + "3. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + + "4. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + + "5. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" + + "Then stop. Do not insert any other rows or create any other tables.", + }); + + const todosEvents = events.filter((e) => e.type === "session.todos_changed"); + expect(todosEvents.length).toBeGreaterThanOrEqual(1); + + const result = await session.rpc.plan.readSqlTodosWithDependencies(); + const ids = result.rows.map((r) => r.id).filter((x): x is string => !!x).sort(); + expect(ids).toEqual(["alpha", "beta"]); + + const edge = result.dependencies.find( + (d) => d.todoId === "beta" && d.dependsOn === "alpha" + ); + expect(edge).toBeDefined(); + + await session.disconnect(); + } + ); +}); diff --git a/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml b/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml new file mode 100644 index 000000000..7c1c9e6e3 --- /dev/null +++ b/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml @@ -0,0 +1,141 @@ +models: + - claude-sonnet-4.5 +conversations: + - messages: + - role: system + content: ${system} + - role: user + content: >- + Use the sql tool to execute exactly these statements, in order, with no extra rows: + + 1. CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, created_at TEXT, + updated_at TEXT); + + 2. CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, PRIMARY KEY (todo_id, depends_on)); + + 3. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); + + 4. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); + + 5. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); + + Then stop. Do not insert any other rows or create any other tables. + - role: assistant + content: "I'll execute those SQL statements exactly as requested, in order:" + - role: assistant + tool_calls: + - id: toolcall_0 + type: function + function: + name: sql + arguments: '{"description":"Create todos table","query":"CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, + description TEXT, status TEXT, created_at TEXT, updated_at TEXT)"}' + - role: assistant + tool_calls: + - id: toolcall_1 + type: function + function: + name: sql + arguments: '{"description":"Create todo_deps table","query":"CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, + PRIMARY KEY (todo_id, depends_on))"}' + - role: assistant + tool_calls: + - id: toolcall_2 + type: function + function: + name: sql + arguments: "{\"description\":\"Insert alpha todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('alpha', + 'First todo', 'pending')\"}" + - role: assistant + tool_calls: + - id: toolcall_3 + type: function + function: + name: sql + arguments: "{\"description\":\"Insert beta todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('beta', + 'Second todo', 'done')\"}" + - role: assistant + tool_calls: + - id: toolcall_4 + type: function + function: + name: sql + arguments: "{\"description\":\"Insert dependency\",\"query\":\"INSERT INTO todo_deps (todo_id, depends_on) VALUES + ('beta', 'alpha')\"}" + - messages: + - role: system + content: ${system} + - role: user + content: >- + Use the sql tool to execute exactly these statements, in order, with no extra rows: + + 1. CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, created_at TEXT, + updated_at TEXT); + + 2. CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, PRIMARY KEY (todo_id, depends_on)); + + 3. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); + + 4. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); + + 5. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); + + Then stop. Do not insert any other rows or create any other tables. + - role: assistant + content: "I'll execute those SQL statements exactly as requested, in order:" + tool_calls: + - id: toolcall_0 + type: function + function: + name: sql + arguments: '{"description":"Create todos table","query":"CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, + description TEXT, status TEXT, created_at TEXT, updated_at TEXT)"}' + - id: toolcall_1 + type: function + function: + name: sql + arguments: '{"description":"Create todo_deps table","query":"CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, + PRIMARY KEY (todo_id, depends_on))"}' + - id: toolcall_2 + type: function + function: + name: sql + arguments: "{\"description\":\"Insert alpha todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('alpha', + 'First todo', 'pending')\"}" + - id: toolcall_3 + type: function + function: + name: sql + arguments: "{\"description\":\"Insert beta todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('beta', + 'Second todo', 'done')\"}" + - id: toolcall_4 + type: function + function: + name: sql + arguments: "{\"description\":\"Insert dependency\",\"query\":\"INSERT INTO todo_deps (todo_id, depends_on) VALUES + ('beta', 'alpha')\"}" + - role: tool + tool_call_id: toolcall_0 + content: "SQL Error: Error: table todos already exists" + - role: tool + tool_call_id: toolcall_1 + content: "SQL Error: Error: table todo_deps already exists" + - role: tool + tool_call_id: toolcall_2 + content: "1 row(s) inserted. Last inserted row ID: 1." + - role: tool + tool_call_id: toolcall_3 + content: "1 row(s) inserted. Last inserted row ID: 2." + - role: tool + tool_call_id: toolcall_4 + content: "1 row(s) inserted. Last inserted row ID: 1." + - role: assistant + content: >- + The tables already existed (they were auto-created), but I've successfully inserted the three rows as + requested: + + - 'alpha' todo with status 'pending' + + - 'beta' todo with status 'done' + + - Dependency linking beta to alpha From 266555c03263f69d6a093f2f8025b898fe93bee4 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Wed, 10 Jun 2026 17:22:50 +0100 Subject: [PATCH 02/22] Use PlanTodo / PlanTodoDependency names, drop CREATE TABLE from prompt - Re-runs Node codegen against runtime PR's regenerated schemas so the rows/dependencies arrays use the newly-named PlanTodo / PlanTodoDependency types. - Simplifies the E2E prompt: the runtime already prompts the agent to create the todos / todo_deps tables, so the CREATE TABLE steps were noisy in the captured snapshot (SQLite returned 'table todos already exists'). The agent only needs to INSERT. - Re-records the snapshot. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/src/generated/rpc.ts | 16 +-- .../e2e/session_todos_changed.e2e.test.ts | 8 +- ...anged_and_exposes_rows___dependencies.yaml | 106 ++++-------------- 3 files changed, 34 insertions(+), 96 deletions(-) diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index efdcdaa0e..a1385a2c0 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -7425,20 +7425,20 @@ export interface PlanReadSqlTodosWithDependenciesResult { /** * Rows from the session SQL todos table, ordered by creation time and id. Empty when no database, no todos table, or the SELECT failed. */ - rows: PlanSqlTodosWithDependenciesRow[]; + rows: PlanTodo[]; /** * Edges from the session SQL todo_deps table. Empty when no database, no todo_deps table, or the SELECT failed. Read independently from `rows`, so a broken todo_deps table does not affect the rows result and vice versa. */ - dependencies: PlanSqlTodosWithDependencies[]; + dependencies: PlanTodoDependency[]; } /** - * Schema for the `PlanSqlTodosWithDependenciesRow` type. + * Schema for the `PlanTodo` type. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "PlanSqlTodosWithDependenciesRow". + * via the `definition` "PlanTodo". */ /** @experimental */ -export interface PlanSqlTodosWithDependenciesRow { +export interface PlanTodo { /** * Todo identifier. */ @@ -7457,13 +7457,13 @@ export interface PlanSqlTodosWithDependenciesRow { status?: string; } /** - * Schema for the `PlanSqlTodosWithDependencies` type. + * Schema for the `PlanTodoDependency` type. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "PlanSqlTodosWithDependencies". + * via the `definition` "PlanTodoDependency". */ /** @experimental */ -export interface PlanSqlTodosWithDependencies { +export interface PlanTodoDependency { /** * ID of the todo that has the dependency. */ diff --git a/nodejs/test/e2e/session_todos_changed.e2e.test.ts b/nodejs/test/e2e/session_todos_changed.e2e.test.ts index b43818df8..3749f6f9b 100644 --- a/nodejs/test/e2e/session_todos_changed.e2e.test.ts +++ b/nodejs/test/e2e/session_todos_changed.e2e.test.ts @@ -36,11 +36,9 @@ describe("Todos changed event + readSqlTodosWithDependencies", async () => { await session.sendAndWait({ prompt: "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + - "1. CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, created_at TEXT, updated_at TEXT);\n" + - "2. CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, PRIMARY KEY (todo_id, depends_on));\n" + - "3. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + - "4. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + - "5. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" + + "1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + + "2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + + "3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" + "Then stop. Do not insert any other rows or create any other tables.", }); diff --git a/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml b/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml index 7c1c9e6e3..d57a49bdf 100644 --- a/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml +++ b/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml @@ -5,137 +5,77 @@ conversations: - role: system content: ${system} - role: user - content: >- + content: |- Use the sql tool to execute exactly these statements, in order, with no extra rows: - - 1. CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, created_at TEXT, - updated_at TEXT); - - 2. CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, PRIMARY KEY (todo_id, depends_on)); - - 3. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); - - 4. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); - - 5. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); - + 1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); + 2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); + 3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); Then stop. Do not insert any other rows or create any other tables. - role: assistant - content: "I'll execute those SQL statements exactly as requested, in order:" + content: I'll execute those three SQL statements in order. - role: assistant tool_calls: - id: toolcall_0 - type: function - function: - name: sql - arguments: '{"description":"Create todos table","query":"CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, - description TEXT, status TEXT, created_at TEXT, updated_at TEXT)"}' - - role: assistant - tool_calls: - - id: toolcall_1 - type: function - function: - name: sql - arguments: '{"description":"Create todo_deps table","query":"CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, - PRIMARY KEY (todo_id, depends_on))"}' - - role: assistant - tool_calls: - - id: toolcall_2 type: function function: name: sql arguments: "{\"description\":\"Insert alpha todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('alpha', - 'First todo', 'pending')\"}" + 'First todo', 'pending');\"}" - role: assistant tool_calls: - - id: toolcall_3 + - id: toolcall_1 type: function function: name: sql arguments: "{\"description\":\"Insert beta todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('beta', - 'Second todo', 'done')\"}" + 'Second todo', 'done');\"}" - role: assistant tool_calls: - - id: toolcall_4 + - id: toolcall_2 type: function function: name: sql arguments: "{\"description\":\"Insert dependency\",\"query\":\"INSERT INTO todo_deps (todo_id, depends_on) VALUES - ('beta', 'alpha')\"}" + ('beta', 'alpha');\"}" - messages: - role: system content: ${system} - role: user - content: >- + content: |- Use the sql tool to execute exactly these statements, in order, with no extra rows: - - 1. CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, description TEXT, status TEXT, created_at TEXT, - updated_at TEXT); - - 2. CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, PRIMARY KEY (todo_id, depends_on)); - - 3. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); - - 4. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); - - 5. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); - + 1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); + 2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); + 3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); Then stop. Do not insert any other rows or create any other tables. - role: assistant - content: "I'll execute those SQL statements exactly as requested, in order:" + content: I'll execute those three SQL statements in order. tool_calls: - id: toolcall_0 - type: function - function: - name: sql - arguments: '{"description":"Create todos table","query":"CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT, - description TEXT, status TEXT, created_at TEXT, updated_at TEXT)"}' - - id: toolcall_1 - type: function - function: - name: sql - arguments: '{"description":"Create todo_deps table","query":"CREATE TABLE todo_deps (todo_id TEXT, depends_on TEXT, - PRIMARY KEY (todo_id, depends_on))"}' - - id: toolcall_2 type: function function: name: sql arguments: "{\"description\":\"Insert alpha todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('alpha', - 'First todo', 'pending')\"}" - - id: toolcall_3 + 'First todo', 'pending');\"}" + - id: toolcall_1 type: function function: name: sql arguments: "{\"description\":\"Insert beta todo\",\"query\":\"INSERT INTO todos (id, title, status) VALUES ('beta', - 'Second todo', 'done')\"}" - - id: toolcall_4 + 'Second todo', 'done');\"}" + - id: toolcall_2 type: function function: name: sql arguments: "{\"description\":\"Insert dependency\",\"query\":\"INSERT INTO todo_deps (todo_id, depends_on) VALUES - ('beta', 'alpha')\"}" + ('beta', 'alpha');\"}" - role: tool tool_call_id: toolcall_0 - content: "SQL Error: Error: table todos already exists" - - role: tool - tool_call_id: toolcall_1 - content: "SQL Error: Error: table todo_deps already exists" - - role: tool - tool_call_id: toolcall_2 content: "1 row(s) inserted. Last inserted row ID: 1." - role: tool - tool_call_id: toolcall_3 + tool_call_id: toolcall_1 content: "1 row(s) inserted. Last inserted row ID: 2." - role: tool - tool_call_id: toolcall_4 + tool_call_id: toolcall_2 content: "1 row(s) inserted. Last inserted row ID: 1." - role: assistant - content: >- - The tables already existed (they were auto-created), but I've successfully inserted the three rows as - requested: - - - 'alpha' todo with status 'pending' - - - 'beta' todo with status 'done' - - - Dependency linking beta to alpha + content: Done. All three statements executed successfully. From 1fcc1c0481f1a4f14dba09a9fb87e814491f81e2 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Fri, 12 Jun 2026 11:54:05 +0100 Subject: [PATCH 03/22] Add E2E coverage for session.todos_changed in .NET, Go, Python, Rust Mirrors the existing nodejs test in all 4 other SDK languages: agent inserts 2 todos + 1 dependency edge via the sql tool, then we assert the session.todos_changed event fires and readSqlTodosWithDependencies returns the expected rows + dependencies. All 5 language tests share a single recorded CAPI snapshot. Renamed the existing snapshot from 'rows___dependencies' to 'rows_and_dependencies' and the nodejs test title to match, so the slug is identical across all languages without per-language slugification quirks. Also regenerates SDK bindings against the latest runtime schema so the new readSqlTodosWithDependencies RPC, PlanSqlTodosRow, and PlanSqlTodoDependency types are available via typed APIs in every language. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../test/E2E/SessionTodosChangedE2ETests.cs | 55 ++ .../e2e/session_todos_changed_e2e_test.go | 79 +++ go/rpc/zrpc.go | 657 ++++++------------ nodejs/src/generated/rpc.ts | 55 +- .../e2e/session_todos_changed.e2e.test.ts | 2 +- python/copilot/generated/rpc.py | 346 +-------- python/e2e/test_session_todos_changed_e2e.py | 51 ++ rust/tests/e2e.rs | 2 + rust/tests/e2e/session_todos_changed.rs | 86 +++ ...ed_and_exposes_rows_and_dependencies.yaml} | 0 10 files changed, 551 insertions(+), 782 deletions(-) create mode 100644 dotnet/test/E2E/SessionTodosChangedE2ETests.cs create mode 100644 go/internal/e2e/session_todos_changed_e2e_test.go create mode 100644 python/e2e/test_session_todos_changed_e2e.py create mode 100644 rust/tests/e2e/session_todos_changed.rs rename test/snapshots/session_todos_changed/{fires_session_todos_changed_and_exposes_rows___dependencies.yaml => fires_session_todos_changed_and_exposes_rows_and_dependencies.yaml} (100%) diff --git a/dotnet/test/E2E/SessionTodosChangedE2ETests.cs b/dotnet/test/E2E/SessionTodosChangedE2ETests.cs new file mode 100644 index 000000000..1954e72ab --- /dev/null +++ b/dotnet/test/E2E/SessionTodosChangedE2ETests.cs @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +using GitHub.Copilot.Rpc; +using GitHub.Copilot.Test.Harness; +using Xunit; +using Xunit.Abstractions; + +namespace GitHub.Copilot.Test.E2E; + +public class SessionTodosChangedE2ETests(E2ETestFixture fixture, ITestOutputHelper output) + : E2ETestBase(fixture, "session_todos_changed", output) +{ + private static readonly string[] ExpectedTodoIds = ["alpha", "beta"]; + + [Fact] + public async Task Fires_Session_Todos_Changed_And_Exposes_Rows_And_Dependencies() + { + await using var session = await CreateSessionAsync(new SessionConfig + { + OnPermissionRequest = PermissionHandler.ApproveAll, + }); + + var todosChangedTask = TestHelper.GetNextEventOfTypeAsync( + session, + TimeSpan.FromSeconds(30)); + + await session.SendAndWaitAsync(new MessageOptions + { + Prompt = + "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + + "1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + + "2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + + "3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" + + "Then stop. Do not insert any other rows or create any other tables.", + }); + + await todosChangedTask; + + var result = await session.Rpc.Plan.ReadSqlTodosWithDependenciesAsync(); + + var ids = result.Rows + .Select(row => row.Id) + .OfType() + .Order(StringComparer.Ordinal) + .ToArray(); + + Assert.Equal(ExpectedTodoIds, ids); + + Assert.Contains(result.Dependencies, dependency => + dependency.TodoId == "beta" && + dependency.DependsOn == "alpha"); + } +} diff --git a/go/internal/e2e/session_todos_changed_e2e_test.go b/go/internal/e2e/session_todos_changed_e2e_test.go new file mode 100644 index 000000000..f85d32c12 --- /dev/null +++ b/go/internal/e2e/session_todos_changed_e2e_test.go @@ -0,0 +1,79 @@ +package e2e + +import ( + "context" + "slices" + "sort" + "testing" + "time" + + copilot "github.com/github/copilot-sdk/go" + "github.com/github/copilot-sdk/go/internal/e2e/testharness" +) + +func TestFiresSessionTodosChangedAndExposesRowsAndDependencies(t *testing.T) { + ctx := testharness.NewTestContext(t) + client := ctx.NewClient() + t.Cleanup(func() { client.ForceStop() }) + + t.Run("fires session.todos_changed and exposes rows and dependencies", func(t *testing.T) { + ctx.ConfigureForTest(t) + + session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{ + OnPermissionRequest: copilot.PermissionHandler.ApproveAll, + }) + if err != nil { + t.Fatalf("Failed to create session: %v", err) + } + defer session.Disconnect() + + awaitTodosChanged := waitForMatchingEvent( + session, + copilot.SessionEventType("session.todos_changed"), + func(copilot.SessionEvent) bool { return true }, + "session.todos_changed event", + ) + + sendCtx, cancel := context.WithTimeout(t.Context(), 120*time.Second) + defer cancel() + _, err = session.SendAndWait(sendCtx, copilot.MessageOptions{ + Prompt: "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + + "1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + + "2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + + "3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" + + "Then stop. Do not insert any other rows or create any other tables.", + }) + if err != nil { + t.Fatalf("Failed to send message: %v", err) + } + + awaitEvent(t, awaitTodosChanged) + + result, err := session.RPC.Plan.ReadSqlTodosWithDependencies(t.Context()) + if err != nil { + t.Fatalf("Plan.ReadSqlTodosWithDependencies failed: %v", err) + } + + var ids []string + for _, row := range result.Rows { + if row.ID != nil && *row.ID != "" { + ids = append(ids, *row.ID) + } + } + sort.Strings(ids) + if !slices.Equal(ids, []string{"alpha", "beta"}) { + t.Fatalf("Expected todo ids [alpha beta], got %v", ids) + } + + foundDependency := false + for _, dependency := range result.Dependencies { + if dependency.TodoID == "beta" && dependency.DependsOn == "alpha" { + foundDependency = true + break + } + } + if !foundDependency { + t.Fatalf("Expected dependency beta -> alpha, got %+v", result.Dependencies) + } + }) +} diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go index 583ed3c58..a2e78b0e5 100644 --- a/go/rpc/zrpc.go +++ b/go/rpc/zrpc.go @@ -1290,15 +1290,13 @@ type ExecuteCommandResult struct { // Schema for the `Extension` type. // Experimental: Extension is part of an experimental API and may change or be removed. type Extension struct { - // Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper', - // 'plugin:my-plugin:my-ext') + // Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper') ID string `json:"id"` // Extension name (directory name) Name string `json:"name"` // Process ID if the extension is running Pid *int64 `json:"pid,omitempty"` - // Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin - // (installed plugin), or session (session-state//extensions/) + // Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/) Source ExtensionSource `json:"source"` // Current status: running, disabled, failed, or starting Status ExtensionStatus `json:"status"` @@ -4587,52 +4585,6 @@ type ProviderConfigAzure struct { APIVersion *string `json:"apiVersion,omitempty"` } -// A snapshot of the provider endpoint the session is currently configured to talk to. -// Experimental: ProviderEndpoint is part of an experimental API and may change or be -// removed. -type ProviderEndpoint struct { - // A credential the caller should use with this endpoint. Omitted only when the endpoint - // accepts unauthenticated requests. - APIKey *string `json:"apiKey,omitempty"` - // Base URL to pass to the LLM client library. - BaseURL string `json:"baseUrl"` - // HTTP headers the caller must include on every outbound request. - Headers map[string]string `json:"headers"` - // Short-lived, rotating credential the caller must send on every request, in addition to - // `apiKey` if one is present. Omitted when the endpoint does not require one. - SessionToken *ProviderSessionToken `json:"sessionToken,omitempty"` - // Provider family. Matches the `type` field of a BYOK provider config. - Type ProviderEndpointType `json:"type"` - // Wire API to be used, when required for the provider type. - WireAPI *ProviderEndpointWireAPI `json:"wireApi,omitempty"` -} - -// Optional model identifier to scope the endpoint snapshot to. -// Experimental: ProviderGetEndpointRequest is part of an experimental API and may change or -// be removed. -type ProviderGetEndpointRequest struct { - // Model identifier the caller intends to use against the returned endpoint. Used to pick - // the correct wire shape. Omit to use whichever model the session is currently using. - ModelID *string `json:"modelId,omitempty"` -} - -// Short-lived, rotating credential the caller must send on every request, in addition to -// `apiKey` if one is present. Omitted when the endpoint does not require one. -// Experimental: ProviderSessionToken is part of an experimental API and may change or be -// removed. -type ProviderSessionToken struct { - // When the token expires, if known. Callers should refresh by calling `getEndpoint` again - // before this time, or reactively on any 401/403 response from `baseUrl`. - ExpiresAt *time.Time `json:"expiresAt,omitempty"` - // HTTP header name the token must be sent under. - Header string `json:"header"` - // The model the token is bound to, when applicable. When set, the token is only valid for - // requests against this model. - Model *string `json:"model,omitempty"` - // The short-lived token value. - Token string `json:"token"` -} - // Schema for the `PushAttachment` type. // Experimental: PushAttachment is part of an experimental API and may change or be removed. type PushAttachment interface { @@ -6089,13 +6041,6 @@ type SessionOpenOptions struct { EventsLogDirectory *string `json:"eventsLogDirectory,omitempty"` // Denylist of tool names. ExcludedTools []string `json:"excludedTools,omitzero"` - // ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the - // Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When - // supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and - // ExP-backed flags wait for it. When absent the session does not block on ExP. - // Internal: ExpAssignments is part of the SDK's internal API surface and is not intended - // for external use. - ExpAssignments any `json:"expAssignments,omitempty"` // Feature-flag values resolved by the host. FeatureFlags map[string]bool `json:"featureFlags,omitzero"` // Installed plugins visible to the session. @@ -7305,28 +7250,6 @@ type SlashCommandSelectSubcommandOption struct { Name string `json:"name"` } -// Configured per-agent subagent overrides -// Experimental: SubagentSettings is part of an experimental API and may change or be -// removed. -type SubagentSettings struct { - // Per-agent settings keyed by subagent agent_type - Agents map[string]SubagentSettingsEntry `json:"agents,omitzero"` - // Names of subagents the user has turned off; they cannot be dispatched - DisabledSubagents []string `json:"disabledSubagents,omitzero"` -} - -// Subagent model, reasoning effort, and context tier settings -// Experimental: SubagentSettingsEntry is part of an experimental API and may change or be -// removed. -type SubagentSettingsEntry struct { - // Context tier override for matching subagents - ContextTier *SubagentSettingsEntryContextTier `json:"contextTier,omitempty"` - // Reasoning effort override for matching subagents - EffortLevel *string `json:"effortLevel,omitempty"` - // Model override for matching subagents - Model *string `json:"model,omitempty"` -} - // Schema for the `TaskInfo` type. // Experimental: TaskInfo is part of an experimental API and may change or be removed. type TaskInfo interface { @@ -7693,12 +7616,6 @@ type ToolsListRequest struct { Model *string `json:"model,omitempty"` } -// Empty result after applying subagent settings -// Experimental: ToolsUpdateSubagentSettingsResult is part of an experimental API and may -// change or be removed. -type ToolsUpdateSubagentSettingsResult struct { -} - // Schema applied to each item in the array. // Experimental: UIElicitationArrayAnyOfFieldItems is part of an experimental API and may // change or be removed. @@ -8132,14 +8049,6 @@ type UIUserInputResponse struct { WasFreeform bool `json:"wasFreeform"` } -// Subagent settings to apply to the current session -// Experimental: UpdateSubagentSettingsRequest is part of an experimental API and may change -// or be removed. -type UpdateSubagentSettingsRequest struct { - // Subagent settings to apply, or null to clear the live session override - Subagents *SubagentSettings `json:"subagents,omitempty"` -} - // Accumulated session usage metrics, including premium request cost, token counts, model // breakdown, and code-change totals. // Experimental: UsageGetMetricsResult is part of an experimental API and may change or be @@ -8888,19 +8797,13 @@ const ( EventsCursorStatusOk EventsCursorStatus = "ok" ) -// Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin -// (installed plugin), or session (session-state//extensions/) +// Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/) // Experimental: ExtensionSource is part of an experimental API and may change or be removed. type ExtensionSource string const ( - // Extension contributed by an installed plugin. - ExtensionSourcePlugin ExtensionSource = "plugin" // Extension discovered from the current project's .github/extensions directory. ExtensionSourceProject ExtensionSource = "project" - // Extension discovered from the current session's state directory (loaded only for this - // session). - ExtensionSourceSession ExtensionSource = "session" // Extension discovered from the user's ~/.copilot/extensions directory. ExtensionSourceUser ExtensionSource = "user" ) @@ -9513,32 +9416,6 @@ const ( ProviderConfigWireAPIResponses ProviderConfigWireAPI = "responses" ) -// Provider family. Matches the `type` field of a BYOK provider config. -// Experimental: ProviderEndpointType is part of an experimental API and may change or be -// removed. -type ProviderEndpointType string - -const ( - // Anthropic endpoint (use the Anthropic client library). - ProviderEndpointTypeAnthropic ProviderEndpointType = "anthropic" - // Azure OpenAI endpoint (use the OpenAI client library with the Azure base URL). - ProviderEndpointTypeAzure ProviderEndpointType = "azure" - // OpenAI-compatible endpoint (use the OpenAI client library). - ProviderEndpointTypeOpenai ProviderEndpointType = "openai" -) - -// Wire API to be used, when required for the provider type. -// Experimental: ProviderEndpointWireAPI is part of an experimental API and may change or be -// removed. -type ProviderEndpointWireAPI string - -const ( - // Classic chat-completions request shape. - ProviderEndpointWireAPICompletions ProviderEndpointWireAPI = "completions" - // Newer responses request shape. - ProviderEndpointWireAPIResponses ProviderEndpointWireAPI = "responses" -) - // Type of GitHub reference // Experimental: PushAttachmentGitHubReferenceType is part of an experimental API and may // change or be removed. @@ -10014,20 +9891,6 @@ const ( SlashCommandKindSkill SlashCommandKind = "skill" ) -// Context tier override for matching subagents -// Experimental: SubagentSettingsEntryContextTier is part of an experimental API and may -// change or be removed. -type SubagentSettingsEntryContextTier string - -const ( - // Use the model's default context window. - SubagentSettingsEntryContextTierDefault SubagentSettingsEntryContextTier = "default" - // Inherit the parent session's effective context tier at dispatch time. - SubagentSettingsEntryContextTierInherit SubagentSettingsEntryContextTier = "inherit" - // Pin the subagent to the long-context tier when supported. - SubagentSettingsEntryContextTierLongContext SubagentSettingsEntryContextTier = "long_context" -) - // Whether task execution is synchronously awaited or managed in the background // Experimental: TaskExecutionMode is part of an experimental API and may change or be // removed. @@ -10266,7 +10129,7 @@ type ServerAccountAPI serverAPI // // Returns: Quota usage snapshots for the resolved user, keyed by quota type. func (a *ServerAccountAPI) GetQuota(ctx context.Context, params *AccountGetQuotaRequest) (*AccountGetQuotaResult, error) { - raw, err := a.client.Request(ctx, "account.getQuota", params) + raw, err := a.client.Request("account.getQuota", params) if err != nil { return nil, err } @@ -10292,7 +10155,7 @@ type ServerAgentRegistryAPI serverAPI // // Returns: Outcome of an agentRegistry.spawn call. func (a *ServerAgentRegistryAPI) Spawn(ctx context.Context, params *AgentRegistrySpawnRequest) (AgentRegistrySpawnResult, error) { - raw, err := a.client.Request(ctx, "agentRegistry.spawn", params) + raw, err := a.client.Request("agentRegistry.spawn", params) if err != nil { return nil, err } @@ -10314,7 +10177,7 @@ type ServerAgentsAPI serverAPI // // Returns: Agents discovered across user, project, plugin, and remote sources. func (a *ServerAgentsAPI) Discover(ctx context.Context, params *AgentsDiscoverRequest) (*ServerAgentList, error) { - raw, err := a.client.Request(ctx, "agents.discover", params) + raw, err := a.client.Request("agents.discover", params) if err != nil { return nil, err } @@ -10337,7 +10200,7 @@ type ServerInstructionsAPI serverAPI // // Returns: Instruction sources discovered across user, repository, and plugin sources. func (a *ServerInstructionsAPI) Discover(ctx context.Context, params *InstructionsDiscoverRequest) (*ServerInstructionSourceList, error) { - raw, err := a.client.Request(ctx, "instructions.discover", params) + raw, err := a.client.Request("instructions.discover", params) if err != nil { return nil, err } @@ -10358,7 +10221,7 @@ type ServerMCPAPI serverAPI // // Returns: MCP servers discovered from user, workspace, plugin, and built-in sources. func (a *ServerMCPAPI) Discover(ctx context.Context, params *MCPDiscoverRequest) (*MCPDiscoverResult, error) { - raw, err := a.client.Request(ctx, "mcp.discover", params) + raw, err := a.client.Request("mcp.discover", params) if err != nil { return nil, err } @@ -10377,7 +10240,7 @@ type ServerMCPConfigAPI serverAPI // // Parameters: MCP server name and configuration to add to user configuration. func (a *ServerMCPConfigAPI) Add(ctx context.Context, params *MCPConfigAddRequest) (*MCPConfigAddResult, error) { - raw, err := a.client.Request(ctx, "mcp.config.add", params) + raw, err := a.client.Request("mcp.config.add", params) if err != nil { return nil, err } @@ -10394,7 +10257,7 @@ func (a *ServerMCPConfigAPI) Add(ctx context.Context, params *MCPConfigAddReques // // Parameters: MCP server names to disable for new sessions. func (a *ServerMCPConfigAPI) Disable(ctx context.Context, params *MCPConfigDisableRequest) (*MCPConfigDisableResult, error) { - raw, err := a.client.Request(ctx, "mcp.config.disable", params) + raw, err := a.client.Request("mcp.config.disable", params) if err != nil { return nil, err } @@ -10411,7 +10274,7 @@ func (a *ServerMCPConfigAPI) Disable(ctx context.Context, params *MCPConfigDisab // // Parameters: MCP server names to enable for new sessions. func (a *ServerMCPConfigAPI) Enable(ctx context.Context, params *MCPConfigEnableRequest) (*MCPConfigEnableResult, error) { - raw, err := a.client.Request(ctx, "mcp.config.enable", params) + raw, err := a.client.Request("mcp.config.enable", params) if err != nil { return nil, err } @@ -10428,7 +10291,7 @@ func (a *ServerMCPConfigAPI) Enable(ctx context.Context, params *MCPConfigEnable // // Returns: User-configured MCP servers, keyed by server name. func (a *ServerMCPConfigAPI) List(ctx context.Context) (*MCPConfigList, error) { - raw, err := a.client.Request(ctx, "mcp.config.list", nil) + raw, err := a.client.Request("mcp.config.list", nil) if err != nil { return nil, err } @@ -10444,7 +10307,7 @@ func (a *ServerMCPConfigAPI) List(ctx context.Context) (*MCPConfigList, error) { // // RPC method: mcp.config.reload. func (a *ServerMCPConfigAPI) Reload(ctx context.Context) (*MCPConfigReloadResult, error) { - raw, err := a.client.Request(ctx, "mcp.config.reload", nil) + raw, err := a.client.Request("mcp.config.reload", nil) if err != nil { return nil, err } @@ -10461,7 +10324,7 @@ func (a *ServerMCPConfigAPI) Reload(ctx context.Context) (*MCPConfigReloadResult // // Parameters: MCP server name to remove from user configuration. func (a *ServerMCPConfigAPI) Remove(ctx context.Context, params *MCPConfigRemoveRequest) (*MCPConfigRemoveResult, error) { - raw, err := a.client.Request(ctx, "mcp.config.remove", params) + raw, err := a.client.Request("mcp.config.remove", params) if err != nil { return nil, err } @@ -10478,7 +10341,7 @@ func (a *ServerMCPConfigAPI) Remove(ctx context.Context, params *MCPConfigRemove // // Parameters: MCP server name and replacement configuration to write to user configuration. func (a *ServerMCPConfigAPI) Update(ctx context.Context, params *MCPConfigUpdateRequest) (*MCPConfigUpdateResult, error) { - raw, err := a.client.Request(ctx, "mcp.config.update", params) + raw, err := a.client.Request("mcp.config.update", params) if err != nil { return nil, err } @@ -10505,7 +10368,7 @@ type ServerModelsAPI serverAPI // Returns: List of Copilot models available to the resolved user, including capabilities // and billing metadata. func (a *ServerModelsAPI) List(ctx context.Context, params *ModelsListRequest) (*ModelList, error) { - raw, err := a.client.Request(ctx, "models.list", params) + raw, err := a.client.Request("models.list", params) if err != nil { return nil, err } @@ -10525,7 +10388,7 @@ type ServerPluginsAPI serverAPI // // Parameters: Plugin names (or specs) to disable. func (a *ServerPluginsAPI) Disable(ctx context.Context, params *PluginsDisableRequest) (*PluginsDisableResult, error) { - raw, err := a.client.Request(ctx, "plugins.disable", params) + raw, err := a.client.Request("plugins.disable", params) if err != nil { return nil, err } @@ -10542,7 +10405,7 @@ func (a *ServerPluginsAPI) Disable(ctx context.Context, params *PluginsDisableRe // // Parameters: Plugin names (or specs) to enable. func (a *ServerPluginsAPI) Enable(ctx context.Context, params *PluginsEnableRequest) (*PluginsEnableResult, error) { - raw, err := a.client.Request(ctx, "plugins.enable", params) + raw, err := a.client.Request("plugins.enable", params) if err != nil { return nil, err } @@ -10561,7 +10424,7 @@ func (a *ServerPluginsAPI) Enable(ctx context.Context, params *PluginsEnableRequ // // Returns: Result of installing a plugin. func (a *ServerPluginsAPI) Install(ctx context.Context, params *PluginsInstallRequest) (*PluginInstallResult, error) { - raw, err := a.client.Request(ctx, "plugins.install", params) + raw, err := a.client.Request("plugins.install", params) if err != nil { return nil, err } @@ -10578,7 +10441,7 @@ func (a *ServerPluginsAPI) Install(ctx context.Context, params *PluginsInstallRe // // Returns: Plugins installed in user/global state. func (a *ServerPluginsAPI) List(ctx context.Context) (*PluginListResult, error) { - raw, err := a.client.Request(ctx, "plugins.list", nil) + raw, err := a.client.Request("plugins.list", nil) if err != nil { return nil, err } @@ -10595,7 +10458,7 @@ func (a *ServerPluginsAPI) List(ctx context.Context) (*PluginListResult, error) // // Parameters: Name (or spec) of the plugin to uninstall. func (a *ServerPluginsAPI) Uninstall(ctx context.Context, params *PluginsUninstallRequest) (*PluginsUninstallResult, error) { - raw, err := a.client.Request(ctx, "plugins.uninstall", params) + raw, err := a.client.Request("plugins.uninstall", params) if err != nil { return nil, err } @@ -10614,7 +10477,7 @@ func (a *ServerPluginsAPI) Uninstall(ctx context.Context, params *PluginsUninsta // // Returns: Result of updating a single plugin. func (a *ServerPluginsAPI) Update(ctx context.Context, params *PluginsUpdateRequest) (*PluginUpdateResult, error) { - raw, err := a.client.Request(ctx, "plugins.update", params) + raw, err := a.client.Request("plugins.update", params) if err != nil { return nil, err } @@ -10631,7 +10494,7 @@ func (a *ServerPluginsAPI) Update(ctx context.Context, params *PluginsUpdateRequ // // Returns: Result of updating all installed plugins. func (a *ServerPluginsAPI) UpdateAll(ctx context.Context) (*PluginUpdateAllResult, error) { - raw, err := a.client.Request(ctx, "plugins.updateAll", nil) + raw, err := a.client.Request("plugins.updateAll", nil) if err != nil { return nil, err } @@ -10654,7 +10517,7 @@ type ServerPluginsMarketplacesAPI serverAPI // // Returns: Result of registering a new marketplace. func (a *ServerPluginsMarketplacesAPI) Add(ctx context.Context, params *PluginsMarketplacesAddRequest) (*MarketplaceAddResult, error) { - raw, err := a.client.Request(ctx, "plugins.marketplaces.add", params) + raw, err := a.client.Request("plugins.marketplaces.add", params) if err != nil { return nil, err } @@ -10673,7 +10536,7 @@ func (a *ServerPluginsMarketplacesAPI) Add(ctx context.Context, params *PluginsM // // Returns: Plugins advertised by the marketplace. func (a *ServerPluginsMarketplacesAPI) Browse(ctx context.Context, params *PluginsMarketplacesBrowseRequest) (*MarketplaceBrowseResult, error) { - raw, err := a.client.Request(ctx, "plugins.marketplaces.browse", params) + raw, err := a.client.Request("plugins.marketplaces.browse", params) if err != nil { return nil, err } @@ -10690,7 +10553,7 @@ func (a *ServerPluginsMarketplacesAPI) Browse(ctx context.Context, params *Plugi // // Returns: All registered marketplaces, including built-in defaults. func (a *ServerPluginsMarketplacesAPI) List(ctx context.Context) (*MarketplaceListResult, error) { - raw, err := a.client.Request(ctx, "plugins.marketplaces.list", nil) + raw, err := a.client.Request("plugins.marketplaces.list", nil) if err != nil { return nil, err } @@ -10709,7 +10572,7 @@ func (a *ServerPluginsMarketplacesAPI) List(ctx context.Context) (*MarketplaceLi // // Returns: Result of refreshing one or more marketplace catalogs. func (a *ServerPluginsMarketplacesAPI) Refresh(ctx context.Context, params *PluginsMarketplacesRefreshRequest) (*MarketplaceRefreshResult, error) { - raw, err := a.client.Request(ctx, "plugins.marketplaces.refresh", params) + raw, err := a.client.Request("plugins.marketplaces.refresh", params) if err != nil { return nil, err } @@ -10730,7 +10593,7 @@ func (a *ServerPluginsMarketplacesAPI) Refresh(ctx context.Context, params *Plug // // Returns: Outcome of the remove attempt, including dependent-plugin info when applicable. func (a *ServerPluginsMarketplacesAPI) Remove(ctx context.Context, params *PluginsMarketplacesRemoveRequest) (*MarketplaceRemoveResult, error) { - raw, err := a.client.Request(ctx, "plugins.marketplaces.remove", params) + raw, err := a.client.Request("plugins.marketplaces.remove", params) if err != nil { return nil, err } @@ -10753,7 +10616,7 @@ type ServerRuntimeAPI serverAPI // // RPC method: runtime.shutdown. func (a *ServerRuntimeAPI) Shutdown(ctx context.Context) (*RuntimeShutdownResult, error) { - raw, err := a.client.Request(ctx, "runtime.shutdown", nil) + raw, err := a.client.Request("runtime.shutdown", nil) if err != nil { return nil, err } @@ -10775,7 +10638,7 @@ type ServerSecretsAPI serverAPI // // Returns: Confirmation that the secret values were registered. func (a *ServerSecretsAPI) AddFilterValues(ctx context.Context, params *SecretsAddFilterValuesRequest) (*SecretsAddFilterValuesResult, error) { - raw, err := a.client.Request(ctx, "secrets.addFilterValues", params) + raw, err := a.client.Request("secrets.addFilterValues", params) if err != nil { return nil, err } @@ -10798,7 +10661,7 @@ type ServerSessionFSAPI serverAPI // Returns: Indicates whether the calling client was registered as the session filesystem // provider. func (a *ServerSessionFSAPI) SetProvider(ctx context.Context, params *SessionFSSetProviderRequest) (*SessionFSSetProviderResult, error) { - raw, err := a.client.Request(ctx, "sessionFs.setProvider", params) + raw, err := a.client.Request("sessionFs.setProvider", params) if err != nil { return nil, err } @@ -10821,7 +10684,7 @@ type ServerSessionsAPI serverAPI // // Returns: Map of sessionId -> bytes freed by removing the session's workspace directory. func (a *ServerSessionsAPI) BulkDelete(ctx context.Context, params *SessionsBulkDeleteRequest) (*SessionBulkDeleteResult, error) { - raw, err := a.client.Request(ctx, "sessions.bulkDelete", params) + raw, err := a.client.Request("sessions.bulkDelete", params) if err != nil { return nil, err } @@ -10841,7 +10704,7 @@ func (a *ServerSessionsAPI) BulkDelete(ctx context.Context, params *SessionsBulk // // Returns: Session IDs from the input set that are currently in use by another process. func (a *ServerSessionsAPI) CheckInUse(ctx context.Context, params *SessionsCheckInUseRequest) (*SessionsCheckInUseResult, error) { - raw, err := a.client.Request(ctx, "sessions.checkInUse", params) + raw, err := a.client.Request("sessions.checkInUse", params) if err != nil { return nil, err } @@ -10863,7 +10726,7 @@ func (a *ServerSessionsAPI) CheckInUse(ctx context.Context, params *SessionsChec // in-use lock, disposes the active session. Idempotent: succeeds even if the session is not // currently active. func (a *ServerSessionsAPI) Close(ctx context.Context, params *SessionsCloseRequest) (*SessionsCloseResult, error) { - raw, err := a.client.Request(ctx, "sessions.close", params) + raw, err := a.client.Request("sessions.close", params) if err != nil { return nil, err } @@ -10882,7 +10745,7 @@ func (a *ServerSessionsAPI) Close(ctx context.Context, params *SessionsCloseRequ // // Returns: Remote session connection result. func (a *ServerSessionsAPI) Connect(ctx context.Context, params *ConnectRemoteSessionParams) (*RemoteSessionConnectionResult, error) { - raw, err := a.client.Request(ctx, "sessions.connect", params) + raw, err := a.client.Request("sessions.connect", params) if err != nil { return nil, err } @@ -10903,7 +10766,7 @@ func (a *ServerSessionsAPI) Connect(ctx context.Context, params *ConnectRemoteSe // Returns: The enriched metadata records, with summary and context fields backfilled where // available. Sessions confirmed empty and unnamed are omitted. func (a *ServerSessionsAPI) EnrichMetadata(ctx context.Context, params *SessionsEnrichMetadataRequest) (*SessionEnrichMetadataResult, error) { - raw, err := a.client.Request(ctx, "sessions.enrichMetadata", params) + raw, err := a.client.Request("sessions.enrichMetadata", params) if err != nil { return nil, err } @@ -10923,7 +10786,7 @@ func (a *ServerSessionsAPI) EnrichMetadata(ctx context.Context, params *Sessions // // Returns: Session ID matching the prefix, omitted when no unique match exists. func (a *ServerSessionsAPI) FindByPrefix(ctx context.Context, params *SessionsFindByPrefixRequest) (*SessionsFindByPrefixResult, error) { - raw, err := a.client.Request(ctx, "sessions.findByPrefix", params) + raw, err := a.client.Request("sessions.findByPrefix", params) if err != nil { return nil, err } @@ -10942,7 +10805,7 @@ func (a *ServerSessionsAPI) FindByPrefix(ctx context.Context, params *SessionsFi // // Returns: ID of the local session bound to the given GitHub task, or omitted when none. func (a *ServerSessionsAPI) FindByTaskId(ctx context.Context, params *SessionsFindByTaskIDRequest) (*SessionsFindByTaskIDResult, error) { - raw, err := a.client.Request(ctx, "sessions.findByTaskId", params) + raw, err := a.client.Request("sessions.findByTaskId", params) if err != nil { return nil, err } @@ -10962,7 +10825,7 @@ func (a *ServerSessionsAPI) FindByTaskId(ctx context.Context, params *SessionsFi // // Returns: Identifier and optional friendly name assigned to the newly forked session. func (a *ServerSessionsAPI) Fork(ctx context.Context, params *SessionsForkRequest) (*SessionsForkResult, error) { - raw, err := a.client.Request(ctx, "sessions.fork", params) + raw, err := a.client.Request("sessions.fork", params) if err != nil { return nil, err } @@ -10983,7 +10846,7 @@ func (a *ServerSessionsAPI) Fork(ctx context.Context, params *SessionsForkReques // Returns: Most-relevant session ID for the supplied context, or omitted when no sessions // exist. func (a *ServerSessionsAPI) GetLastForContext(ctx context.Context, params *SessionsGetLastForContextRequest) (*SessionsGetLastForContextResult, error) { - raw, err := a.client.Request(ctx, "sessions.getLastForContext", params) + raw, err := a.client.Request("sessions.getLastForContext", params) if err != nil { return nil, err } @@ -11001,7 +10864,7 @@ func (a *ServerSessionsAPI) GetLastForContext(ctx context.Context, params *Sessi // // Returns: Wrapper for the singleton's current status. func (a *ServerSessionsAPI) GetRemoteControlStatus(ctx context.Context) (*RemoteControlStatusResult, error) { - raw, err := a.client.Request(ctx, "sessions.getRemoteControlStatus", nil) + raw, err := a.client.Request("sessions.getRemoteControlStatus", nil) if err != nil { return nil, err } @@ -11018,7 +10881,7 @@ func (a *ServerSessionsAPI) GetRemoteControlStatus(ctx context.Context) (*Remote // // Returns: Map of sessionId -> on-disk size in bytes for each session's workspace directory. func (a *ServerSessionsAPI) GetSizes(ctx context.Context) (*SessionSizes, error) { - raw, err := a.client.Request(ctx, "sessions.getSizes", nil) + raw, err := a.client.Request("sessions.getSizes", nil) if err != nil { return nil, err } @@ -11041,7 +10904,7 @@ func (a *ServerSessionsAPI) GetSizes(ctx context.Context) (*SessionSizes, error) // // Returns: Sessions matching the filter, ordered most-recently-modified first. func (a *ServerSessionsAPI) List(ctx context.Context, params *SessionsListRequest) (*SessionList, error) { - raw, err := a.client.Request(ctx, "sessions.list", params) + raw, err := a.client.Request("sessions.list", params) if err != nil { return nil, err } @@ -11061,7 +10924,7 @@ func (a *ServerSessionsAPI) List(ctx context.Context, params *SessionsListReques // // Returns: Queued repo-level startup prompts and the total hook command count after loading. func (a *ServerSessionsAPI) LoadDeferredRepoHooks(ctx context.Context, params *SessionsLoadDeferredRepoHooksRequest) (*SessionLoadDeferredRepoHooksResult, error) { - raw, err := a.client.Request(ctx, "sessions.loadDeferredRepoHooks", params) + raw, err := a.client.Request("sessions.loadDeferredRepoHooks", params) if err != nil { return nil, err } @@ -11081,7 +10944,7 @@ func (a *ServerSessionsAPI) LoadDeferredRepoHooks(ctx context.Context, params *S // // Returns: Result of opening a session. func (a *ServerSessionsAPI) Open(ctx context.Context, params *SessionOpenParams) (*SessionOpenResult, error) { - raw, err := a.client.Request(ctx, "sessions.open", params) + raw, err := a.client.Request("sessions.open", params) if err != nil { return nil, err } @@ -11103,7 +10966,7 @@ func (a *ServerSessionsAPI) Open(ctx context.Context, params *SessionOpenParams) // Returns: Outcome of the prune operation: deleted IDs, dry-run candidates, skipped IDs, // total bytes freed, and the dry-run flag. func (a *ServerSessionsAPI) PruneOld(ctx context.Context, params *SessionsPruneOldRequest) (*SessionPruneResult, error) { - raw, err := a.client.Request(ctx, "sessions.pruneOld", params) + raw, err := a.client.Request("sessions.pruneOld", params) if err != nil { return nil, err } @@ -11123,7 +10986,7 @@ func (a *ServerSessionsAPI) PruneOld(ctx context.Context, params *SessionsPruneO // Returns: Release the in-use lock held by this process for the given session. No-op when // this process does not currently hold a lock for the session. func (a *ServerSessionsAPI) ReleaseLock(ctx context.Context, params *SessionsReleaseLockRequest) (*SessionsReleaseLockResult, error) { - raw, err := a.client.Request(ctx, "sessions.releaseLock", params) + raw, err := a.client.Request("sessions.releaseLock", params) if err != nil { return nil, err } @@ -11145,7 +11008,7 @@ func (a *ServerSessionsAPI) ReleaseLock(ctx context.Context, params *SessionsRel // session. Call after installing or removing plugins so their hooks take effect // immediately. No-op when no active session matches the given sessionId. func (a *ServerSessionsAPI) ReloadPluginHooks(ctx context.Context, params *SessionsReloadPluginHooksRequest) (*SessionsReloadPluginHooksResult, error) { - raw, err := a.client.Request(ctx, "sessions.reloadPluginHooks", params) + raw, err := a.client.Request("sessions.reloadPluginHooks", params) if err != nil { return nil, err } @@ -11165,7 +11028,7 @@ func (a *ServerSessionsAPI) ReloadPluginHooks(ctx context.Context, params *Sessi // Returns: Flush a session's pending events to disk. No-op when no writer exists for the // session (e.g., already closed). func (a *ServerSessionsAPI) Save(ctx context.Context, params *SessionsSaveRequest) (*SessionsSaveResult, error) { - raw, err := a.client.Request(ctx, "sessions.save", params) + raw, err := a.client.Request("sessions.save", params) if err != nil { return nil, err } @@ -11188,7 +11051,7 @@ func (a *ServerSessionsAPI) Save(ctx context.Context, params *SessionsSaveReques // subsequent hook reloads see the new set; already-running sessions keep their existing // hook installation until the next reload. func (a *ServerSessionsAPI) SetAdditionalPlugins(ctx context.Context, params *SessionsSetAdditionalPluginsRequest) (*SessionsSetAdditionalPluginsResult, error) { - raw, err := a.client.Request(ctx, "sessions.setAdditionalPlugins", params) + raw, err := a.client.Request("sessions.setAdditionalPlugins", params) if err != nil { return nil, err } @@ -11210,7 +11073,7 @@ func (a *ServerSessionsAPI) SetAdditionalPlugins(ctx context.Context, params *Se // // Returns: Wrapper for the singleton's current status. func (a *ServerSessionsAPI) SetRemoteControlSteering(ctx context.Context, params *SessionsSetRemoteControlSteeringRequest) (*RemoteControlStatusResult, error) { - raw, err := a.client.Request(ctx, "sessions.setRemoteControlSteering", params) + raw, err := a.client.Request("sessions.setRemoteControlSteering", params) if err != nil { return nil, err } @@ -11232,7 +11095,7 @@ func (a *ServerSessionsAPI) SetRemoteControlSteering(ctx context.Context, params // // Returns: Wrapper for the singleton's current status. func (a *ServerSessionsAPI) StartRemoteControl(ctx context.Context, params *SessionsStartRemoteControlRequest) (*RemoteControlStatusResult, error) { - raw, err := a.client.Request(ctx, "sessions.startRemoteControl", params) + raw, err := a.client.Request("sessions.startRemoteControl", params) if err != nil { return nil, err } @@ -11254,7 +11117,7 @@ func (a *ServerSessionsAPI) StartRemoteControl(ctx context.Context, params *Sess // // Returns: Outcome of a stopRemoteControl call. func (a *ServerSessionsAPI) StopRemoteControl(ctx context.Context, params *SessionsStopRemoteControlRequest) (*RemoteControlStopResult, error) { - raw, err := a.client.Request(ctx, "sessions.stopRemoteControl", params) + raw, err := a.client.Request("sessions.stopRemoteControl", params) if err != nil { return nil, err } @@ -11277,7 +11140,7 @@ func (a *ServerSessionsAPI) StopRemoteControl(ctx context.Context, params *Sessi // // Returns: Outcome of a transferRemoteControl call. func (a *ServerSessionsAPI) TransferRemoteControl(ctx context.Context, params *SessionsTransferRemoteControlRequest) (*RemoteControlTransferResult, error) { - raw, err := a.client.Request(ctx, "sessions.transferRemoteControl", params) + raw, err := a.client.Request("sessions.transferRemoteControl", params) if err != nil { return nil, err } @@ -11299,7 +11162,7 @@ type ServerSkillsAPI serverAPI // // Returns: Skills discovered across global and project sources. func (a *ServerSkillsAPI) Discover(ctx context.Context, params *SkillsDiscoverRequest) (*ServerSkillList, error) { - raw, err := a.client.Request(ctx, "skills.discover", params) + raw, err := a.client.Request("skills.discover", params) if err != nil { return nil, err } @@ -11319,7 +11182,7 @@ type ServerSkillsConfigAPI serverAPI // Parameters: Skill names to mark as disabled in global configuration, replacing any // previous list. func (a *ServerSkillsConfigAPI) SetDisabledSkills(ctx context.Context, params *SkillsConfigSetDisabledSkillsRequest) (*SkillsConfigSetDisabledSkillsResult, error) { - raw, err := a.client.Request(ctx, "skills.config.setDisabledSkills", params) + raw, err := a.client.Request("skills.config.setDisabledSkills", params) if err != nil { return nil, err } @@ -11346,7 +11209,7 @@ type ServerToolsAPI serverAPI // Returns: Built-in tools available for the requested model, with their parameters and // instructions. func (a *ServerToolsAPI) List(ctx context.Context, params *ToolsListRequest) (*ToolList, error) { - raw, err := a.client.Request(ctx, "tools.list", params) + raw, err := a.client.Request("tools.list", params) if err != nil { return nil, err } @@ -11366,7 +11229,7 @@ type ServerUserSettingsAPI serverAPI // // RPC method: user.settings.reload. func (a *ServerUserSettingsAPI) Reload(ctx context.Context) (*UserSettingsReloadResult, error) { - raw, err := a.client.Request(ctx, "user.settings.reload", nil) + raw, err := a.client.Request("user.settings.reload", nil) if err != nil { return nil, err } @@ -11411,7 +11274,7 @@ type ServerRPC struct { // Returns: Server liveness response, including the echoed message, current server // timestamp, and protocol version. func (a *ServerRPC) Ping(ctx context.Context, params *PingRequest) (*PingResult, error) { - raw, err := a.common.client.Request(ctx, "ping", params) + raw, err := a.common.client.Request("ping", params) if err != nil { return nil, err } @@ -11464,7 +11327,7 @@ type InternalServerSessionsAPI internalServerAPI // Internal: ConfigureSessionExtensions is part of the SDK's internal handshake/plumbing; // external callers should not use it. func (a *InternalServerSessionsAPI) ConfigureSessionExtensions(ctx context.Context, params *ConfigureSessionExtensionsParams) (*SessionsConfigureSessionExtensionsResult, error) { - raw, err := a.client.Request(ctx, "sessions.configureSessionExtensions", params) + raw, err := a.client.Request("sessions.configureSessionExtensions", params) if err != nil { return nil, err } @@ -11490,7 +11353,7 @@ func (a *InternalServerSessionsAPI) ConfigureSessionExtensions(ctx context.Conte // Internal: GetBoardEntryCount is part of the SDK's internal handshake/plumbing; external // callers should not use it. func (a *InternalServerSessionsAPI) GetBoardEntryCount(ctx context.Context, params *SessionsGetBoardEntryCountRequest) (*SessionsGetBoardEntryCountResult, error) { - raw, err := a.client.Request(ctx, "sessions.getBoardEntryCount", params) + raw, err := a.client.Request("sessions.getBoardEntryCount", params) if err != nil { return nil, err } @@ -11515,7 +11378,7 @@ func (a *InternalServerSessionsAPI) GetBoardEntryCount(ctx context.Context, para // Internal: GetEventFilePath is part of the SDK's internal handshake/plumbing; external // callers should not use it. func (a *InternalServerSessionsAPI) GetEventFilePath(ctx context.Context, params *SessionsGetEventFilePathRequest) (*SessionsGetEventFilePathResult, error) { - raw, err := a.client.Request(ctx, "sessions.getEventFilePath", params) + raw, err := a.client.Request("sessions.getEventFilePath", params) if err != nil { return nil, err } @@ -11541,7 +11404,7 @@ func (a *InternalServerSessionsAPI) GetEventFilePath(ctx context.Context, params // Internal: GetPersistedRemoteSteerable is part of the SDK's internal handshake/plumbing; // external callers should not use it. func (a *InternalServerSessionsAPI) GetPersistedRemoteSteerable(ctx context.Context, params *SessionsGetPersistedRemoteSteerableRequest) (*SessionsGetPersistedRemoteSteerableResult, error) { - raw, err := a.client.Request(ctx, "sessions.getPersistedRemoteSteerable", params) + raw, err := a.client.Request("sessions.getPersistedRemoteSteerable", params) if err != nil { return nil, err } @@ -11568,7 +11431,7 @@ func (a *InternalServerSessionsAPI) GetPersistedRemoteSteerable(ctx context.Cont // Internal: PollSpawnedSessions is part of the SDK's internal handshake/plumbing; external // callers should not use it. func (a *InternalServerSessionsAPI) PollSpawnedSessions(ctx context.Context, params *SessionsPollSpawnedSessionsRequest) (*PollSpawnedSessionsResult, error) { - raw, err := a.client.Request(ctx, "sessions.pollSpawnedSessions", params) + raw, err := a.client.Request("sessions.pollSpawnedSessions", params) if err != nil { return nil, err } @@ -11596,7 +11459,7 @@ func (a *InternalServerSessionsAPI) PollSpawnedSessions(ctx context.Context, par // Internal: RegisterExtensionToolsOnSession is part of the SDK's internal // handshake/plumbing; external callers should not use it. func (a *InternalServerSessionsAPI) RegisterExtensionToolsOnSession(ctx context.Context, params *RegisterExtensionToolsParams) (*RegisterExtensionToolsResult, error) { - raw, err := a.client.Request(ctx, "sessions.registerExtensionToolsOnSession", params) + raw, err := a.client.Request("sessions.registerExtensionToolsOnSession", params) if err != nil { return nil, err } @@ -11631,7 +11494,7 @@ type InternalServerRPC struct { // Internal: Connect is part of the SDK's internal handshake/plumbing; external callers // should not use it. func (a *InternalServerRPC) Connect(ctx context.Context, params *ConnectRequest) (*ConnectResult, error) { - raw, err := a.common.client.Request(ctx, "connect", params) + raw, err := a.common.client.Request("connect", params) if err != nil { return nil, err } @@ -11662,7 +11525,7 @@ type AgentAPI sessionAPI // RPC method: session.agent.deselect. func (a *AgentAPI) Deselect(ctx context.Context) (*SessionAgentDeselectResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.agent.deselect", req) + raw, err := a.client.Request("session.agent.deselect", req) if err != nil { return nil, err } @@ -11680,7 +11543,7 @@ func (a *AgentAPI) Deselect(ctx context.Context) (*SessionAgentDeselectResult, e // Returns: The currently selected custom agent, or null when using the default agent. func (a *AgentAPI) GetCurrent(ctx context.Context) (*AgentGetCurrentResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.agent.getCurrent", req) + raw, err := a.client.Request("session.agent.getCurrent", req) if err != nil { return nil, err } @@ -11698,7 +11561,7 @@ func (a *AgentAPI) GetCurrent(ctx context.Context) (*AgentGetCurrentResult, erro // Returns: Custom agents available to the session. func (a *AgentAPI) List(ctx context.Context) (*AgentList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.agent.list", req) + raw, err := a.client.Request("session.agent.list", req) if err != nil { return nil, err } @@ -11716,7 +11579,7 @@ func (a *AgentAPI) List(ctx context.Context) (*AgentList, error) { // Returns: Custom agents available to the session after reloading definitions from disk. func (a *AgentAPI) Reload(ctx context.Context) (*AgentReloadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.agent.reload", req) + raw, err := a.client.Request("session.agent.reload", req) if err != nil { return nil, err } @@ -11739,7 +11602,7 @@ func (a *AgentAPI) Select(ctx context.Context, params *AgentSelectRequest) (*Age if params != nil { req["name"] = params.Name } - raw, err := a.client.Request(ctx, "session.agent.select", req) + raw, err := a.client.Request("session.agent.select", req) if err != nil { return nil, err } @@ -11760,7 +11623,7 @@ type AuthAPI sessionAPI // Returns: Authentication status and account metadata for the session. func (a *AuthAPI) GetStatus(ctx context.Context) (*SessionAuthStatus, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.auth.getStatus", req) + raw, err := a.client.Request("session.auth.getStatus", req) if err != nil { return nil, err } @@ -11787,7 +11650,7 @@ func (a *AuthAPI) SetCredentials(ctx context.Context, params *SessionSetCredenti req["credentials"] = params.Credentials } } - raw, err := a.client.Request(ctx, "session.auth.setCredentials", req) + raw, err := a.client.Request("session.auth.setCredentials", req) if err != nil { return nil, err } @@ -11811,7 +11674,7 @@ func (a *CanvasAPI) Close(ctx context.Context, params *CanvasCloseRequest) (*Ses if params != nil { req["instanceId"] = params.InstanceID } - raw, err := a.client.Request(ctx, "session.canvas.close", req) + raw, err := a.client.Request("session.canvas.close", req) if err != nil { return nil, err } @@ -11829,7 +11692,7 @@ func (a *CanvasAPI) Close(ctx context.Context, params *CanvasCloseRequest) (*Ses // Returns: Declared canvases available in this session. func (a *CanvasAPI) List(ctx context.Context) (*CanvasList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.canvas.list", req) + raw, err := a.client.Request("session.canvas.list", req) if err != nil { return nil, err } @@ -11847,7 +11710,7 @@ func (a *CanvasAPI) List(ctx context.Context) (*CanvasList, error) { // Returns: Live open-canvas snapshot. func (a *CanvasAPI) ListOpen(ctx context.Context) (*CanvasListOpenResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.canvas.listOpen", req) + raw, err := a.client.Request("session.canvas.listOpen", req) if err != nil { return nil, err } @@ -11877,7 +11740,7 @@ func (a *CanvasAPI) Open(ctx context.Context, params *CanvasOpenRequest) (*OpenC } req["instanceId"] = params.InstanceID } - raw, err := a.client.Request(ctx, "session.canvas.open", req) + raw, err := a.client.Request("session.canvas.open", req) if err != nil { return nil, err } @@ -11907,7 +11770,7 @@ func (a *CanvasActionAPI) Invoke(ctx context.Context, params *CanvasActionInvoke } req["instanceId"] = params.InstanceID } - raw, err := a.client.Request(ctx, "session.canvas.action.invoke", req) + raw, err := a.client.Request("session.canvas.action.invoke", req) if err != nil { return nil, err } @@ -11938,7 +11801,7 @@ func (a *CommandsAPI) Enqueue(ctx context.Context, params *EnqueueCommandParams) if params != nil { req["command"] = params.Command } - raw, err := a.client.Request(ctx, "session.commands.enqueue", req) + raw, err := a.client.Request("session.commands.enqueue", req) if err != nil { return nil, err } @@ -11962,7 +11825,7 @@ func (a *CommandsAPI) Execute(ctx context.Context, params *ExecuteCommandParams) req["args"] = params.Args req["commandName"] = params.CommandName } - raw, err := a.client.Request(ctx, "session.commands.execute", req) + raw, err := a.client.Request("session.commands.execute", req) if err != nil { return nil, err } @@ -11988,7 +11851,7 @@ func (a *CommandsAPI) HandlePendingCommand(ctx context.Context, params *Commands } req["requestId"] = params.RequestID } - raw, err := a.client.Request(ctx, "session.commands.handlePendingCommand", req) + raw, err := a.client.Request("session.commands.handlePendingCommand", req) if err != nil { return nil, err } @@ -12015,7 +11878,7 @@ func (a *CommandsAPI) Invoke(ctx context.Context, params *CommandsInvokeRequest) } req["name"] = params.Name } - raw, err := a.client.Request(ctx, "session.commands.invoke", req) + raw, err := a.client.Request("session.commands.invoke", req) if err != nil { return nil, err } @@ -12051,7 +11914,7 @@ func (a *CommandsAPI) List(ctx context.Context, params ...*CommandsListRequest) req["includeSkills"] = *requestParams.IncludeSkills } } - raw, err := a.client.Request(ctx, "session.commands.list", req) + raw, err := a.client.Request("session.commands.list", req) if err != nil { return nil, err } @@ -12077,7 +11940,7 @@ func (a *CommandsAPI) RespondToQueuedCommand(ctx context.Context, params *Comman req["requestId"] = params.RequestID req["result"] = params.Result } - raw, err := a.client.Request(ctx, "session.commands.respondToQueuedCommand", req) + raw, err := a.client.Request("session.commands.respondToQueuedCommand", req) if err != nil { return nil, err } @@ -12119,7 +11982,7 @@ func (a *EventLogAPI) Read(ctx context.Context, params *EventLogReadRequest) (*E req["waitMs"] = *params.WaitMs } } - raw, err := a.client.Request(ctx, "session.eventLog.read", req) + raw, err := a.client.Request("session.eventLog.read", req) if err != nil { return nil, err } @@ -12142,7 +12005,7 @@ func (a *EventLogAPI) RegisterInterest(ctx context.Context, params *RegisterEven if params != nil { req["eventType"] = params.EventType } - raw, err := a.client.Request(ctx, "session.eventLog.registerInterest", req) + raw, err := a.client.Request("session.eventLog.registerInterest", req) if err != nil { return nil, err } @@ -12165,7 +12028,7 @@ func (a *EventLogAPI) ReleaseInterest(ctx context.Context, params *ReleaseEventI if params != nil { req["handle"] = params.Handle } - raw, err := a.client.Request(ctx, "session.eventLog.releaseInterest", req) + raw, err := a.client.Request("session.eventLog.releaseInterest", req) if err != nil { return nil, err } @@ -12186,7 +12049,7 @@ func (a *EventLogAPI) ReleaseInterest(ctx context.Context, params *ReleaseEventI // cursor on a long-lived session). func (a *EventLogAPI) Tail(ctx context.Context) (*EventLogTailResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.eventLog.tail", req) + raw, err := a.client.Request("session.eventLog.tail", req) if err != nil { return nil, err } @@ -12210,7 +12073,7 @@ func (a *ExtensionsAPI) Disable(ctx context.Context, params *ExtensionsDisableRe if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.extensions.disable", req) + raw, err := a.client.Request("session.extensions.disable", req) if err != nil { return nil, err } @@ -12231,7 +12094,7 @@ func (a *ExtensionsAPI) Enable(ctx context.Context, params *ExtensionsEnableRequ if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.extensions.enable", req) + raw, err := a.client.Request("session.extensions.enable", req) if err != nil { return nil, err } @@ -12249,7 +12112,7 @@ func (a *ExtensionsAPI) Enable(ctx context.Context, params *ExtensionsEnableRequ // Returns: Extensions discovered for the session, with their current status. func (a *ExtensionsAPI) List(ctx context.Context) (*ExtensionList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.extensions.list", req) + raw, err := a.client.Request("session.extensions.list", req) if err != nil { return nil, err } @@ -12265,7 +12128,7 @@ func (a *ExtensionsAPI) List(ctx context.Context) (*ExtensionList, error) { // RPC method: session.extensions.reload. func (a *ExtensionsAPI) Reload(ctx context.Context) (*SessionExtensionsReloadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.extensions.reload", req) + raw, err := a.client.Request("session.extensions.reload", req) if err != nil { return nil, err } @@ -12291,7 +12154,7 @@ func (a *ExtensionsAPI) SendAttachmentsToMessage(ctx context.Context, params *Se req["instanceId"] = *params.InstanceID } } - raw, err := a.client.Request(ctx, "session.extensions.sendAttachmentsToMessage", req) + raw, err := a.client.Request("session.extensions.sendAttachmentsToMessage", req) if err != nil { return nil, err } @@ -12319,7 +12182,7 @@ func (a *FleetAPI) Start(ctx context.Context, params *FleetStartRequest) (*Fleet req["prompt"] = *params.Prompt } } - raw, err := a.client.Request(ctx, "session.fleet.start", req) + raw, err := a.client.Request("session.fleet.start", req) if err != nil { return nil, err } @@ -12340,7 +12203,7 @@ type HistoryAPI sessionAPI // Returns: Indicates whether an in-progress manual compaction was aborted. func (a *HistoryAPI) AbortManualCompaction(ctx context.Context) (*HistoryAbortManualCompactionResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.history.abortManualCompaction", req) + raw, err := a.client.Request("session.history.abortManualCompaction", req) if err != nil { return nil, err } @@ -12359,7 +12222,7 @@ func (a *HistoryAPI) AbortManualCompaction(ctx context.Context) (*HistoryAbortMa // Returns: Indicates whether an in-progress background compaction was cancelled. func (a *HistoryAPI) CancelBackgroundCompaction(ctx context.Context) (*HistoryCancelBackgroundCompactionResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.history.cancelBackgroundCompaction", req) + raw, err := a.client.Request("session.history.cancelBackgroundCompaction", req) if err != nil { return nil, err } @@ -12389,7 +12252,7 @@ func (a *HistoryAPI) Compact(ctx context.Context, params ...*HistoryCompactReque req["customInstructions"] = *requestParams.CustomInstructions } } - raw, err := a.client.Request(ctx, "session.history.compact", req) + raw, err := a.client.Request("session.history.compact", req) if err != nil { return nil, err } @@ -12408,7 +12271,7 @@ func (a *HistoryAPI) Compact(ctx context.Context, params ...*HistoryCompactReque // Returns: Markdown summary of the conversation context (empty when not available). func (a *HistoryAPI) SummarizeForHandoff(ctx context.Context) (*HistorySummarizeForHandoffResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.history.summarizeForHandoff", req) + raw, err := a.client.Request("session.history.summarizeForHandoff", req) if err != nil { return nil, err } @@ -12432,7 +12295,7 @@ func (a *HistoryAPI) Truncate(ctx context.Context, params *HistoryTruncateReques if params != nil { req["eventId"] = params.EventID } - raw, err := a.client.Request(ctx, "session.history.truncate", req) + raw, err := a.client.Request("session.history.truncate", req) if err != nil { return nil, err } @@ -12453,7 +12316,7 @@ type InstructionsAPI sessionAPI // Returns: Instruction sources loaded for the session, in merge order. func (a *InstructionsAPI) GetSources(ctx context.Context) (*InstructionsGetSourcesResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.instructions.getSources", req) + raw, err := a.client.Request("session.instructions.getSources", req) if err != nil { return nil, err } @@ -12485,7 +12348,7 @@ func (a *LspAPI) Initialize(ctx context.Context, params *LspInitializeRequest) ( req["workingDirectory"] = *params.WorkingDirectory } } - raw, err := a.client.Request(ctx, "session.lsp.initialize", req) + raw, err := a.client.Request("session.lsp.initialize", req) if err != nil { return nil, err } @@ -12512,7 +12375,7 @@ func (a *MCPAPI) CancelSamplingExecution(ctx context.Context, params *MCPCancelS if params != nil { req["requestId"] = params.RequestID } - raw, err := a.client.Request(ctx, "session.mcp.cancelSamplingExecution", req) + raw, err := a.client.Request("session.mcp.cancelSamplingExecution", req) if err != nil { return nil, err } @@ -12533,7 +12396,7 @@ func (a *MCPAPI) Disable(ctx context.Context, params *MCPDisableRequest) (*Sessi if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.disable", req) + raw, err := a.client.Request("session.mcp.disable", req) if err != nil { return nil, err } @@ -12554,7 +12417,7 @@ func (a *MCPAPI) Enable(ctx context.Context, params *MCPEnableRequest) (*Session if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.enable", req) + raw, err := a.client.Request("session.mcp.enable", req) if err != nil { return nil, err } @@ -12582,7 +12445,7 @@ func (a *MCPAPI) ExecuteSampling(ctx context.Context, params *MCPExecuteSampling req["requestId"] = params.RequestID req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.executeSampling", req) + raw, err := a.client.Request("session.mcp.executeSampling", req) if err != nil { return nil, err } @@ -12606,7 +12469,7 @@ func (a *MCPAPI) IsServerRunning(ctx context.Context, params *MCPIsServerRunning if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.isServerRunning", req) + raw, err := a.client.Request("session.mcp.isServerRunning", req) if err != nil { return nil, err } @@ -12628,7 +12491,7 @@ func (a *MCPAPI) IsServerRunning(ctx context.Context, params *MCPIsServerRunning // host-level state. func (a *MCPAPI) List(ctx context.Context) (*MCPServerList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.mcp.list", req) + raw, err := a.client.Request("session.mcp.list", req) if err != nil { return nil, err } @@ -12652,7 +12515,7 @@ func (a *MCPAPI) ListTools(ctx context.Context, params *MCPListToolsRequest) (*M if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.listTools", req) + raw, err := a.client.Request("session.mcp.listTools", req) if err != nil { return nil, err } @@ -12668,7 +12531,7 @@ func (a *MCPAPI) ListTools(ctx context.Context, params *MCPListToolsRequest) (*M // RPC method: session.mcp.reload. func (a *MCPAPI) Reload(ctx context.Context) (*SessionMCPReloadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.mcp.reload", req) + raw, err := a.client.Request("session.mcp.reload", req) if err != nil { return nil, err } @@ -12687,7 +12550,7 @@ func (a *MCPAPI) Reload(ctx context.Context) (*SessionMCPReloadResult, error) { // nothing to remove). func (a *MCPAPI) RemoveGitHub(ctx context.Context) (*MCPRemoveGitHubResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.mcp.removeGitHub", req) + raw, err := a.client.Request("session.mcp.removeGitHub", req) if err != nil { return nil, err } @@ -12712,7 +12575,7 @@ func (a *MCPAPI) SetEnvValueMode(ctx context.Context, params *MCPSetEnvValueMode if params != nil { req["mode"] = params.Mode } - raw, err := a.client.Request(ctx, "session.mcp.setEnvValueMode", req) + raw, err := a.client.Request("session.mcp.setEnvValueMode", req) if err != nil { return nil, err } @@ -12733,7 +12596,7 @@ func (a *MCPAPI) StopServer(ctx context.Context, params *MCPStopServerRequest) ( if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.stopServer", req) + raw, err := a.client.Request("session.mcp.stopServer", req) if err != nil { return nil, err } @@ -12766,7 +12629,7 @@ func (a *MCPAppsAPI) CallTool(ctx context.Context, params *MCPAppsCallToolReques req["serverName"] = params.ServerName req["toolName"] = params.ToolName } - raw, err := a.client.Request(ctx, "session.mcp.apps.callTool", req) + raw, err := a.client.Request("session.mcp.apps.callTool", req) if err != nil { return nil, err } @@ -12790,7 +12653,7 @@ func (a *MCPAppsAPI) Diagnose(ctx context.Context, params *MCPAppsDiagnoseReques if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.apps.diagnose", req) + raw, err := a.client.Request("session.mcp.apps.diagnose", req) if err != nil { return nil, err } @@ -12808,7 +12671,7 @@ func (a *MCPAppsAPI) Diagnose(ctx context.Context, params *MCPAppsDiagnoseReques // Returns: Current host context advertised to MCP App guests. func (a *MCPAppsAPI) GetHostContext(ctx context.Context) (*MCPAppsHostContext, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.mcp.apps.getHostContext", req) + raw, err := a.client.Request("session.mcp.apps.getHostContext", req) if err != nil { return nil, err } @@ -12834,7 +12697,7 @@ func (a *MCPAppsAPI) ListTools(ctx context.Context, params *MCPAppsListToolsRequ req["originServerName"] = params.OriginServerName req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.apps.listTools", req) + raw, err := a.client.Request("session.mcp.apps.listTools", req) if err != nil { return nil, err } @@ -12859,7 +12722,7 @@ func (a *MCPAppsAPI) ReadResource(ctx context.Context, params *MCPAppsReadResour req["serverName"] = params.ServerName req["uri"] = params.URI } - raw, err := a.client.Request(ctx, "session.mcp.apps.readResource", req) + raw, err := a.client.Request("session.mcp.apps.readResource", req) if err != nil { return nil, err } @@ -12881,7 +12744,7 @@ func (a *MCPAppsAPI) SetHostContext(ctx context.Context, params *MCPAppsSetHostC if params != nil { req["context"] = params.Context } - raw, err := a.client.Request(ctx, "session.mcp.apps.setHostContext", req) + raw, err := a.client.Request("session.mcp.apps.setHostContext", req) if err != nil { return nil, err } @@ -12923,7 +12786,7 @@ func (a *MCPOauthAPI) Login(ctx context.Context, params *MCPOauthLoginRequest) ( } req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.oauth.login", req) + raw, err := a.client.Request("session.mcp.oauth.login", req) if err != nil { return nil, err } @@ -12949,7 +12812,7 @@ type MetadataAPI sessionAPI // Returns: Current activity flags for the session. func (a *MetadataAPI) Activity(ctx context.Context) (*SessionActivity, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.metadata.activity", req) + raw, err := a.client.Request("session.metadata.activity", req) if err != nil { return nil, err } @@ -12978,7 +12841,7 @@ func (a *MetadataAPI) ContextInfo(ctx context.Context, params *MetadataContextIn req["selectedModel"] = *params.SelectedModel } } - raw, err := a.client.Request(ctx, "session.metadata.contextInfo", req) + raw, err := a.client.Request("session.metadata.contextInfo", req) if err != nil { return nil, err } @@ -12998,7 +12861,7 @@ func (a *MetadataAPI) ContextInfo(ctx context.Context, params *MetadataContextIn // continuation. func (a *MetadataAPI) IsProcessing(ctx context.Context) (*MetadataIsProcessingResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.metadata.isProcessing", req) + raw, err := a.client.Request("session.metadata.isProcessing", req) if err != nil { return nil, err } @@ -13025,7 +12888,7 @@ func (a *MetadataAPI) RecomputeContextTokens(ctx context.Context, params *Metada if params != nil { req["modelId"] = params.ModelID } - raw, err := a.client.Request(ctx, "session.metadata.recomputeContextTokens", req) + raw, err := a.client.Request("session.metadata.recomputeContextTokens", req) if err != nil { return nil, err } @@ -13052,7 +12915,7 @@ func (a *MetadataAPI) RecordContextChange(ctx context.Context, params *MetadataR if params != nil { req["context"] = params.Context } - raw, err := a.client.Request(ctx, "session.metadata.recordContextChange", req) + raw, err := a.client.Request("session.metadata.recordContextChange", req) if err != nil { return nil, err } @@ -13078,7 +12941,7 @@ func (a *MetadataAPI) SetWorkingDirectory(ctx context.Context, params *MetadataS if params != nil { req["workingDirectory"] = params.WorkingDirectory } - raw, err := a.client.Request(ctx, "session.metadata.setWorkingDirectory", req) + raw, err := a.client.Request("session.metadata.setWorkingDirectory", req) if err != nil { return nil, err } @@ -13097,7 +12960,7 @@ func (a *MetadataAPI) SetWorkingDirectory(ctx context.Context, params *MetadataS // Returns: Point-in-time snapshot of slow-changing session identifier and state fields func (a *MetadataAPI) Snapshot(ctx context.Context) (*SessionMetadataSnapshot, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.metadata.snapshot", req) + raw, err := a.client.Request("session.metadata.snapshot", req) if err != nil { return nil, err } @@ -13118,7 +12981,7 @@ type ModeAPI sessionAPI // Returns: The session mode the agent is operating in func (a *ModeAPI) Get(ctx context.Context) (*SessionMode, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.mode.get", req) + raw, err := a.client.Request("session.mode.get", req) if err != nil { return nil, err } @@ -13139,7 +13002,7 @@ func (a *ModeAPI) Set(ctx context.Context, params *ModeSetRequest) (*SessionMode if params != nil { req["mode"] = params.Mode } - raw, err := a.client.Request(ctx, "session.mode.set", req) + raw, err := a.client.Request("session.mode.set", req) if err != nil { return nil, err } @@ -13162,7 +13025,7 @@ type ModelAPI sessionAPI // journal on resume. func (a *ModelAPI) GetCurrent(ctx context.Context) (*CurrentModel, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.model.getCurrent", req) + raw, err := a.client.Request("session.model.getCurrent", req) if err != nil { return nil, err } @@ -13193,7 +13056,7 @@ func (a *ModelAPI) List(ctx context.Context, params ...*ModelListRequest) (*Sess req["skipCache"] = *requestParams.SkipCache } } - raw, err := a.client.Request(ctx, "session.model.list", req) + raw, err := a.client.Request("session.model.list", req) if err != nil { return nil, err } @@ -13219,7 +13082,7 @@ func (a *ModelAPI) SetReasoningEffort(ctx context.Context, params *ModelSetReaso if params != nil { req["reasoningEffort"] = params.ReasoningEffort } - raw, err := a.client.Request(ctx, "session.model.setReasoningEffort", req) + raw, err := a.client.Request("session.model.setReasoningEffort", req) if err != nil { return nil, err } @@ -13255,7 +13118,7 @@ func (a *ModelAPI) SwitchTo(ctx context.Context, params *ModelSwitchToRequest) ( req["reasoningSummary"] = *params.ReasoningSummary } } - raw, err := a.client.Request(ctx, "session.model.switchTo", req) + raw, err := a.client.Request("session.model.switchTo", req) if err != nil { return nil, err } @@ -13276,7 +13139,7 @@ type NameAPI sessionAPI // Returns: The session's friendly name, or null when not yet set. func (a *NameAPI) Get(ctx context.Context) (*NameGetResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.name.get", req) + raw, err := a.client.Request("session.name.get", req) if err != nil { return nil, err } @@ -13297,7 +13160,7 @@ func (a *NameAPI) Set(ctx context.Context, params *NameSetRequest) (*SessionName if params != nil { req["name"] = params.Name } - raw, err := a.client.Request(ctx, "session.name.set", req) + raw, err := a.client.Request("session.name.set", req) if err != nil { return nil, err } @@ -13322,7 +13185,7 @@ func (a *NameAPI) SetAuto(ctx context.Context, params *NameSetAutoRequest) (*Nam if params != nil { req["summary"] = params.Summary } - raw, err := a.client.Request(ctx, "session.name.setAuto", req) + raw, err := a.client.Request("session.name.setAuto", req) if err != nil { return nil, err } @@ -13491,7 +13354,7 @@ func (a *OptionsAPI) Update(ctx context.Context, params *SessionUpdateOptionsPar req["workingDirectory"] = *params.WorkingDirectory } } - raw, err := a.client.Request(ctx, "session.options.update", req) + raw, err := a.client.Request("session.options.update", req) if err != nil { return nil, err } @@ -13536,7 +13399,7 @@ func (a *PermissionsAPI) Configure(ctx context.Context, params *PermissionsConfi req["urls"] = *params.URLs } } - raw, err := a.client.Request(ctx, "session.permissions.configure", req) + raw, err := a.client.Request("session.permissions.configure", req) if err != nil { return nil, err } @@ -13555,7 +13418,7 @@ func (a *PermissionsAPI) Configure(ctx context.Context, params *PermissionsConfi // Returns: Current full allow-all permission state. func (a *PermissionsAPI) GetAllowAll(ctx context.Context) (*AllowAllPermissionState, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.permissions.getAllowAll", req) + raw, err := a.client.Request("session.permissions.getAllowAll", req) if err != nil { return nil, err } @@ -13581,7 +13444,7 @@ func (a *PermissionsAPI) HandlePendingPermissionRequest(ctx context.Context, par req["requestId"] = params.RequestID req["result"] = params.Result } - raw, err := a.client.Request(ctx, "session.permissions.handlePendingPermissionRequest", req) + raw, err := a.client.Request("session.permissions.handlePendingPermissionRequest", req) if err != nil { return nil, err } @@ -13614,7 +13477,7 @@ func (a *PermissionsAPI) ModifyRules(ctx context.Context, params *PermissionsMod } req["scope"] = params.Scope } - raw, err := a.client.Request(ctx, "session.permissions.modifyRules", req) + raw, err := a.client.Request("session.permissions.modifyRules", req) if err != nil { return nil, err } @@ -13639,7 +13502,7 @@ func (a *PermissionsAPI) NotifyPromptShown(ctx context.Context, params *Permissi if params != nil { req["message"] = params.Message } - raw, err := a.client.Request(ctx, "session.permissions.notifyPromptShown", req) + raw, err := a.client.Request("session.permissions.notifyPromptShown", req) if err != nil { return nil, err } @@ -13658,7 +13521,7 @@ func (a *PermissionsAPI) NotifyPromptShown(ctx context.Context, params *Permissi // Returns: List of pending permission requests reconstructed from event history. func (a *PermissionsAPI) PendingRequests(ctx context.Context) (*PendingPermissionRequestList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.permissions.pendingRequests", req) + raw, err := a.client.Request("session.permissions.pendingRequests", req) if err != nil { return nil, err } @@ -13676,7 +13539,7 @@ func (a *PermissionsAPI) PendingRequests(ctx context.Context) (*PendingPermissio // Returns: Indicates whether the operation succeeded. func (a *PermissionsAPI) ResetSessionApprovals(ctx context.Context) (*PermissionsResetSessionApprovalsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.permissions.resetSessionApprovals", req) + raw, err := a.client.Request("session.permissions.resetSessionApprovals", req) if err != nil { return nil, err } @@ -13708,7 +13571,7 @@ func (a *PermissionsAPI) SetAllowAll(ctx context.Context, params *PermissionsSet req["source"] = *params.Source } } - raw, err := a.client.Request(ctx, "session.permissions.setAllowAll", req) + raw, err := a.client.Request("session.permissions.setAllowAll", req) if err != nil { return nil, err } @@ -13736,7 +13599,7 @@ func (a *PermissionsAPI) SetApproveAll(ctx context.Context, params *PermissionsS req["source"] = *params.Source } } - raw, err := a.client.Request(ctx, "session.permissions.setApproveAll", req) + raw, err := a.client.Request("session.permissions.setApproveAll", req) if err != nil { return nil, err } @@ -13760,7 +13623,7 @@ func (a *PermissionsAPI) SetRequired(ctx context.Context, params *PermissionsSet if params != nil { req["required"] = params.Required } - raw, err := a.client.Request(ctx, "session.permissions.setRequired", req) + raw, err := a.client.Request("session.permissions.setRequired", req) if err != nil { return nil, err } @@ -13787,7 +13650,7 @@ func (a *PermissionsFolderTrustAPI) AddTrusted(ctx context.Context, params *Fold if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.permissions.folderTrust.addTrusted", req) + raw, err := a.client.Request("session.permissions.folderTrust.addTrusted", req) if err != nil { return nil, err } @@ -13810,7 +13673,7 @@ func (a *PermissionsFolderTrustAPI) IsTrusted(ctx context.Context, params *Folde if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.permissions.folderTrust.isTrusted", req) + raw, err := a.client.Request("session.permissions.folderTrust.isTrusted", req) if err != nil { return nil, err } @@ -13844,7 +13707,7 @@ func (a *PermissionsLocationsAPI) AddToolApproval(ctx context.Context, params *P req["approval"] = params.Approval req["locationKey"] = params.LocationKey } - raw, err := a.client.Request(ctx, "session.permissions.locations.addToolApproval", req) + raw, err := a.client.Request("session.permissions.locations.addToolApproval", req) if err != nil { return nil, err } @@ -13868,7 +13731,7 @@ func (a *PermissionsLocationsAPI) Apply(ctx context.Context, params *PermissionL if params != nil { req["workingDirectory"] = params.WorkingDirectory } - raw, err := a.client.Request(ctx, "session.permissions.locations.apply", req) + raw, err := a.client.Request("session.permissions.locations.apply", req) if err != nil { return nil, err } @@ -13891,7 +13754,7 @@ func (a *PermissionsLocationsAPI) Resolve(ctx context.Context, params *Permissio if params != nil { req["workingDirectory"] = params.WorkingDirectory } - raw, err := a.client.Request(ctx, "session.permissions.locations.resolve", req) + raw, err := a.client.Request("session.permissions.locations.resolve", req) if err != nil { return nil, err } @@ -13923,7 +13786,7 @@ func (a *PermissionsPathsAPI) Add(ctx context.Context, params *PermissionPathsAd if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.permissions.paths.add", req) + raw, err := a.client.Request("session.permissions.paths.add", req) if err != nil { return nil, err } @@ -13947,7 +13810,7 @@ func (a *PermissionsPathsAPI) IsPathWithinAllowedDirectories(ctx context.Context if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.permissions.paths.isPathWithinAllowedDirectories", req) + raw, err := a.client.Request("session.permissions.paths.isPathWithinAllowedDirectories", req) if err != nil { return nil, err } @@ -13971,7 +13834,7 @@ func (a *PermissionsPathsAPI) IsPathWithinWorkspace(ctx context.Context, params if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.permissions.paths.isPathWithinWorkspace", req) + raw, err := a.client.Request("session.permissions.paths.isPathWithinWorkspace", req) if err != nil { return nil, err } @@ -13989,7 +13852,7 @@ func (a *PermissionsPathsAPI) IsPathWithinWorkspace(ctx context.Context, params // Returns: Snapshot of the session's allow-listed directories and primary working directory. func (a *PermissionsPathsAPI) List(ctx context.Context) (*PermissionPathsList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.permissions.paths.list", req) + raw, err := a.client.Request("session.permissions.paths.list", req) if err != nil { return nil, err } @@ -14013,7 +13876,7 @@ func (a *PermissionsPathsAPI) UpdatePrimary(ctx context.Context, params *Permiss if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.permissions.paths.updatePrimary", req) + raw, err := a.client.Request("session.permissions.paths.updatePrimary", req) if err != nil { return nil, err } @@ -14045,7 +13908,7 @@ func (a *PermissionsURLsAPI) SetUnrestrictedMode(ctx context.Context, params *Pe if params != nil { req["enabled"] = params.Enabled } - raw, err := a.client.Request(ctx, "session.permissions.urls.setUnrestrictedMode", req) + raw, err := a.client.Request("session.permissions.urls.setUnrestrictedMode", req) if err != nil { return nil, err } @@ -14069,7 +13932,7 @@ type PlanAPI sessionAPI // RPC method: session.plan.delete. func (a *PlanAPI) Delete(ctx context.Context) (*SessionPlanDeleteResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.plan.delete", req) + raw, err := a.client.Request("session.plan.delete", req) if err != nil { return nil, err } @@ -14087,7 +13950,7 @@ func (a *PlanAPI) Delete(ctx context.Context) (*SessionPlanDeleteResult, error) // Returns: Existence, contents, and resolved path of the session plan file. func (a *PlanAPI) Read(ctx context.Context) (*PlanReadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.plan.read", req) + raw, err := a.client.Request("session.plan.read", req) if err != nil { return nil, err } @@ -14106,7 +13969,7 @@ func (a *PlanAPI) Read(ctx context.Context) (*PlanReadResult, error) { // available. func (a *PlanAPI) ReadSqlTodos(ctx context.Context) (*PlanReadSQLTodosResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.plan.readSqlTodos", req) + raw, err := a.client.Request("session.plan.readSqlTodos", req) if err != nil { return nil, err } @@ -14128,7 +13991,7 @@ func (a *PlanAPI) ReadSqlTodos(ctx context.Context) (*PlanReadSQLTodosResult, er // Returns: Todo rows + dependency edges read from the session SQL database. func (a *PlanAPI) ReadSqlTodosWithDependencies(ctx context.Context) (*PlanReadSQLTodosWithDependenciesResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.plan.readSqlTodosWithDependencies", req) + raw, err := a.client.Request("session.plan.readSqlTodosWithDependencies", req) if err != nil { return nil, err } @@ -14149,7 +14012,7 @@ func (a *PlanAPI) Update(ctx context.Context, params *PlanUpdateRequest) (*Sessi if params != nil { req["content"] = params.Content } - raw, err := a.client.Request(ctx, "session.plan.update", req) + raw, err := a.client.Request("session.plan.update", req) if err != nil { return nil, err } @@ -14170,7 +14033,7 @@ type PluginsAPI sessionAPI // Returns: Plugins installed for the session, with their enabled state and version metadata. func (a *PluginsAPI) List(ctx context.Context) (*PluginList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.plugins.list", req) + raw, err := a.client.Request("session.plugins.list", req) if err != nil { return nil, err } @@ -14207,7 +14070,7 @@ func (a *PluginsAPI) Reload(ctx context.Context, params ...*PluginsReloadRequest req["reloadMcp"] = *requestParams.ReloadMCP } } - raw, err := a.client.Request(ctx, "session.plugins.reload", req) + raw, err := a.client.Request("session.plugins.reload", req) if err != nil { return nil, err } @@ -14218,41 +14081,6 @@ func (a *PluginsAPI) Reload(ctx context.Context, params ...*PluginsReloadRequest return &result, nil } -// Experimental: ProviderAPI contains experimental APIs that may change or be removed. -type ProviderAPI sessionAPI - -// GetEndpoint returns the provider endpoint and credentials the session is currently -// configured to talk to, so the caller can make inference calls directly against the same -// backend the session uses. -// -// RPC method: session.provider.getEndpoint. -// -// Parameters: Optional model identifier to scope the endpoint snapshot to. -// -// Returns: A snapshot of the provider endpoint the session is currently configured to talk -// to. -func (a *ProviderAPI) GetEndpoint(ctx context.Context, params ...*ProviderGetEndpointRequest) (*ProviderEndpoint, error) { - var requestParams *ProviderGetEndpointRequest - if len(params) > 0 { - requestParams = params[0] - } - req := map[string]any{"sessionId": a.sessionID} - if requestParams != nil { - if requestParams.ModelID != nil { - req["modelId"] = *requestParams.ModelID - } - } - raw, err := a.client.Request(ctx, "session.provider.getEndpoint", req) - if err != nil { - return nil, err - } - var result ProviderEndpoint - if err := json.Unmarshal(raw, &result); err != nil { - return nil, err - } - return &result, nil -} - // Experimental: QueueAPI contains experimental APIs that may change or be removed. type QueueAPI sessionAPI @@ -14261,7 +14089,7 @@ type QueueAPI sessionAPI // RPC method: session.queue.clear. func (a *QueueAPI) Clear(ctx context.Context) (*SessionQueueClearResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.queue.clear", req) + raw, err := a.client.Request("session.queue.clear", req) if err != nil { return nil, err } @@ -14280,7 +14108,7 @@ func (a *QueueAPI) Clear(ctx context.Context) (*SessionQueueClearResult, error) // Returns: Snapshot of the session's pending queued items and immediate-steering messages. func (a *QueueAPI) PendingItems(ctx context.Context) (*QueuePendingItemsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.queue.pendingItems", req) + raw, err := a.client.Request("session.queue.pendingItems", req) if err != nil { return nil, err } @@ -14298,7 +14126,7 @@ func (a *QueueAPI) PendingItems(ctx context.Context) (*QueuePendingItemsResult, // Returns: Indicates whether a user-facing pending item was removed. func (a *QueueAPI) RemoveMostRecent(ctx context.Context) (*QueueRemoveMostRecentResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.queue.removeMostRecent", req) + raw, err := a.client.Request("session.queue.removeMostRecent", req) if err != nil { return nil, err } @@ -14317,7 +14145,7 @@ type RemoteAPI sessionAPI // RPC method: session.remote.disable. func (a *RemoteAPI) Disable(ctx context.Context) (*SessionRemoteDisableResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.remote.disable", req) + raw, err := a.client.Request("session.remote.disable", req) if err != nil { return nil, err } @@ -14344,7 +14172,7 @@ func (a *RemoteAPI) Enable(ctx context.Context, params *RemoteEnableRequest) (*R req["mode"] = *params.Mode } } - raw, err := a.client.Request(ctx, "session.remote.enable", req) + raw, err := a.client.Request("session.remote.enable", req) if err != nil { return nil, err } @@ -14371,7 +14199,7 @@ func (a *RemoteAPI) NotifySteerableChanged(ctx context.Context, params *RemoteNo if params != nil { req["remoteSteerable"] = params.RemoteSteerable } - raw, err := a.client.Request(ctx, "session.remote.notifySteerableChanged", req) + raw, err := a.client.Request("session.remote.notifySteerableChanged", req) if err != nil { return nil, err } @@ -14392,7 +14220,7 @@ type ScheduleAPI sessionAPI // Returns: Snapshot of the currently active recurring prompts for this session. func (a *ScheduleAPI) List(ctx context.Context) (*ScheduleList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.schedule.list", req) + raw, err := a.client.Request("session.schedule.list", req) if err != nil { return nil, err } @@ -14416,7 +14244,7 @@ func (a *ScheduleAPI) Stop(ctx context.Context, params *ScheduleStopRequest) (*S if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.schedule.stop", req) + raw, err := a.client.Request("session.schedule.stop", req) if err != nil { return nil, err } @@ -14442,7 +14270,7 @@ func (a *ShellAPI) CancelUserRequested(ctx context.Context, params *ShellCancelU if params != nil { req["requestId"] = params.RequestID } - raw, err := a.client.Request(ctx, "session.shell.cancelUserRequested", req) + raw, err := a.client.Request("session.shell.cancelUserRequested", req) if err != nil { return nil, err } @@ -14473,7 +14301,7 @@ func (a *ShellAPI) Exec(ctx context.Context, params *ShellExecRequest) (*ShellEx req["timeout"] = *params.Timeout } } - raw, err := a.client.Request(ctx, "session.shell.exec", req) + raw, err := a.client.Request("session.shell.exec", req) if err != nil { return nil, err } @@ -14497,7 +14325,7 @@ func (a *ShellAPI) ExecuteUserRequested(ctx context.Context, params *ShellExecut req["command"] = params.Command req["requestId"] = params.RequestID } - raw, err := a.client.Request(ctx, "session.shell.executeUserRequested", req) + raw, err := a.client.Request("session.shell.executeUserRequested", req) if err != nil { return nil, err } @@ -14525,7 +14353,7 @@ func (a *ShellAPI) Kill(ctx context.Context, params *ShellKillRequest) (*ShellKi req["signal"] = *params.Signal } } - raw, err := a.client.Request(ctx, "session.shell.kill", req) + raw, err := a.client.Request("session.shell.kill", req) if err != nil { return nil, err } @@ -14549,7 +14377,7 @@ func (a *SkillsAPI) Disable(ctx context.Context, params *SkillsDisableRequest) ( if params != nil { req["name"] = params.Name } - raw, err := a.client.Request(ctx, "session.skills.disable", req) + raw, err := a.client.Request("session.skills.disable", req) if err != nil { return nil, err } @@ -14570,7 +14398,7 @@ func (a *SkillsAPI) Enable(ctx context.Context, params *SkillsEnableRequest) (*S if params != nil { req["name"] = params.Name } - raw, err := a.client.Request(ctx, "session.skills.enable", req) + raw, err := a.client.Request("session.skills.enable", req) if err != nil { return nil, err } @@ -14586,7 +14414,7 @@ func (a *SkillsAPI) Enable(ctx context.Context, params *SkillsEnableRequest) (*S // RPC method: session.skills.ensureLoaded. func (a *SkillsAPI) EnsureLoaded(ctx context.Context) (*SessionSkillsEnsureLoadedResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.skills.ensureLoaded", req) + raw, err := a.client.Request("session.skills.ensureLoaded", req) if err != nil { return nil, err } @@ -14605,7 +14433,7 @@ func (a *SkillsAPI) EnsureLoaded(ctx context.Context) (*SessionSkillsEnsureLoade // last). func (a *SkillsAPI) GetInvoked(ctx context.Context) (*SkillsGetInvokedResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.skills.getInvoked", req) + raw, err := a.client.Request("session.skills.getInvoked", req) if err != nil { return nil, err } @@ -14623,7 +14451,7 @@ func (a *SkillsAPI) GetInvoked(ctx context.Context) (*SkillsGetInvokedResult, er // Returns: Skills available to the session, with their enabled state. func (a *SkillsAPI) List(ctx context.Context) (*SkillList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.skills.list", req) + raw, err := a.client.Request("session.skills.list", req) if err != nil { return nil, err } @@ -14642,7 +14470,7 @@ func (a *SkillsAPI) List(ctx context.Context) (*SkillList, error) { // separate lists. func (a *SkillsAPI) Reload(ctx context.Context) (*SkillsLoadDiagnostics, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.skills.reload", req) + raw, err := a.client.Request("session.skills.reload", req) if err != nil { return nil, err } @@ -14668,7 +14496,7 @@ func (a *TasksAPI) Cancel(ctx context.Context, params *TasksCancelRequest) (*Tas if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.tasks.cancel", req) + raw, err := a.client.Request("session.tasks.cancel", req) if err != nil { return nil, err } @@ -14687,7 +14515,7 @@ func (a *TasksAPI) Cancel(ctx context.Context, params *TasksCancelRequest) (*Tas // Returns: The first sync-waiting task that can currently be promoted to background mode. func (a *TasksAPI) GetCurrentPromotable(ctx context.Context) (*TasksGetCurrentPromotableResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tasks.getCurrentPromotable", req) + raw, err := a.client.Request("session.tasks.getCurrentPromotable", req) if err != nil { return nil, err } @@ -14710,7 +14538,7 @@ func (a *TasksAPI) GetProgress(ctx context.Context, params *TasksGetProgressRequ if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.tasks.getProgress", req) + raw, err := a.client.Request("session.tasks.getProgress", req) if err != nil { return nil, err } @@ -14728,7 +14556,7 @@ func (a *TasksAPI) GetProgress(ctx context.Context, params *TasksGetProgressRequ // Returns: Background tasks currently tracked by the session. func (a *TasksAPI) List(ctx context.Context) (*TaskList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tasks.list", req) + raw, err := a.client.Request("session.tasks.list", req) if err != nil { return nil, err } @@ -14748,7 +14576,7 @@ func (a *TasksAPI) List(ctx context.Context) (*TaskList, error) { // task was waiting. func (a *TasksAPI) PromoteCurrentToBackground(ctx context.Context) (*TasksPromoteCurrentToBackgroundResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tasks.promoteCurrentToBackground", req) + raw, err := a.client.Request("session.tasks.promoteCurrentToBackground", req) if err != nil { return nil, err } @@ -14772,7 +14600,7 @@ func (a *TasksAPI) PromoteToBackground(ctx context.Context, params *TasksPromote if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.tasks.promoteToBackground", req) + raw, err := a.client.Request("session.tasks.promoteToBackground", req) if err != nil { return nil, err } @@ -14791,7 +14619,7 @@ func (a *TasksAPI) PromoteToBackground(ctx context.Context, params *TasksPromote // after a long pause to pick up exit/output state for shells running outside the agent loop. func (a *TasksAPI) Refresh(ctx context.Context) (*TasksRefreshResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tasks.refresh", req) + raw, err := a.client.Request("session.tasks.refresh", req) if err != nil { return nil, err } @@ -14815,7 +14643,7 @@ func (a *TasksAPI) Remove(ctx context.Context, params *TasksRemoveRequest) (*Tas if params != nil { req["id"] = params.ID } - raw, err := a.client.Request(ctx, "session.tasks.remove", req) + raw, err := a.client.Request("session.tasks.remove", req) if err != nil { return nil, err } @@ -14844,7 +14672,7 @@ func (a *TasksAPI) SendMessage(ctx context.Context, params *TasksSendMessageRequ req["id"] = params.ID req["message"] = params.Message } - raw, err := a.client.Request(ctx, "session.tasks.sendMessage", req) + raw, err := a.client.Request("session.tasks.sendMessage", req) if err != nil { return nil, err } @@ -14876,7 +14704,7 @@ func (a *TasksAPI) StartAgent(ctx context.Context, params *TasksStartAgentReques req["name"] = params.Name req["prompt"] = params.Prompt } - raw, err := a.client.Request(ctx, "session.tasks.startAgent", req) + raw, err := a.client.Request("session.tasks.startAgent", req) if err != nil { return nil, err } @@ -14897,7 +14725,7 @@ func (a *TasksAPI) StartAgent(ctx context.Context, params *TasksStartAgentReques // COPILOT_TASK_WAIT_TIMEOUT_SECONDS). func (a *TasksAPI) WaitForPending(ctx context.Context) (*TasksWaitForPendingResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tasks.waitForPending", req) + raw, err := a.client.Request("session.tasks.waitForPending", req) if err != nil { return nil, err } @@ -14919,7 +14747,7 @@ type TelemetryAPI sessionAPI // Returns: Telemetry engagement ID for the session, when available. func (a *TelemetryAPI) GetEngagementId(ctx context.Context) (*SessionTelemetryEngagement, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.telemetry.getEngagementId", req) + raw, err := a.client.Request("session.telemetry.getEngagementId", req) if err != nil { return nil, err } @@ -14942,7 +14770,7 @@ func (a *TelemetryAPI) SetFeatureOverrides(ctx context.Context, params *Telemetr if params != nil { req["features"] = params.Features } - raw, err := a.client.Request(ctx, "session.telemetry.setFeatureOverrides", req) + raw, err := a.client.Request("session.telemetry.setFeatureOverrides", req) if err != nil { return nil, err } @@ -14964,7 +14792,7 @@ type ToolsAPI sessionAPI // Returns: Current lightweight tool metadata snapshot for the session. func (a *ToolsAPI) GetCurrentMetadata(ctx context.Context) (*ToolsGetCurrentMetadataResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tools.getCurrentMetadata", req) + raw, err := a.client.Request("session.tools.getCurrentMetadata", req) if err != nil { return nil, err } @@ -14994,7 +14822,7 @@ func (a *ToolsAPI) HandlePendingToolCall(ctx context.Context, params *HandlePend req["result"] = params.Result } } - raw, err := a.client.Request(ctx, "session.tools.handlePendingToolCall", req) + raw, err := a.client.Request("session.tools.handlePendingToolCall", req) if err != nil { return nil, err } @@ -15016,7 +14844,7 @@ func (a *ToolsAPI) HandlePendingToolCall(ctx context.Context, params *HandlePend // validation. func (a *ToolsAPI) InitializeAndValidate(ctx context.Context) (*ToolsInitializeAndValidateResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.tools.initializeAndValidate", req) + raw, err := a.client.Request("session.tools.initializeAndValidate", req) if err != nil { return nil, err } @@ -15027,33 +14855,6 @@ func (a *ToolsAPI) InitializeAndValidate(ctx context.Context) (*ToolsInitializeA return &result, nil } -// UpdateSubagentSettings updates the current session's live subagent settings after user -// settings change. The persisted user settings remain the source of truth for future -// sessions. -// -// RPC method: session.tools.updateSubagentSettings. -// -// Parameters: Subagent settings to apply to the current session -// -// Returns: Empty result after applying subagent settings -func (a *ToolsAPI) UpdateSubagentSettings(ctx context.Context, params *UpdateSubagentSettingsRequest) (*ToolsUpdateSubagentSettingsResult, error) { - req := map[string]any{"sessionId": a.sessionID} - if params != nil { - if params.Subagents != nil { - req["subagents"] = *params.Subagents - } - } - raw, err := a.client.Request(ctx, "session.tools.updateSubagentSettings", req) - if err != nil { - return nil, err - } - var result ToolsUpdateSubagentSettingsResult - if err := json.Unmarshal(raw, &result); err != nil { - return nil, err - } - return &result, nil -} - // Experimental: UIAPI contains experimental APIs that may change or be removed. type UIAPI sessionAPI @@ -15071,7 +14872,7 @@ func (a *UIAPI) Elicitation(ctx context.Context, params *UIElicitationRequest) ( req["message"] = params.Message req["requestedSchema"] = params.RequestedSchema } - raw, err := a.client.Request(ctx, "session.ui.elicitation", req) + raw, err := a.client.Request("session.ui.elicitation", req) if err != nil { return nil, err } @@ -15101,7 +14902,7 @@ func (a *UIAPI) EphemeralQuery(ctx context.Context, params *UIEphemeralQueryRequ } req["question"] = params.Question } - raw, err := a.client.Request(ctx, "session.ui.ephemeralQuery", req) + raw, err := a.client.Request("session.ui.ephemeralQuery", req) if err != nil { return nil, err } @@ -15127,7 +14928,7 @@ func (a *UIAPI) HandlePendingAutoModeSwitch(ctx context.Context, params *UIHandl req["requestId"] = params.RequestID req["response"] = params.Response } - raw, err := a.client.Request(ctx, "session.ui.handlePendingAutoModeSwitch", req) + raw, err := a.client.Request("session.ui.handlePendingAutoModeSwitch", req) if err != nil { return nil, err } @@ -15153,7 +14954,7 @@ func (a *UIAPI) HandlePendingElicitation(ctx context.Context, params *UIHandlePe req["requestId"] = params.RequestID req["result"] = params.Result } - raw, err := a.client.Request(ctx, "session.ui.handlePendingElicitation", req) + raw, err := a.client.Request("session.ui.handlePendingElicitation", req) if err != nil { return nil, err } @@ -15179,7 +14980,7 @@ func (a *UIAPI) HandlePendingExitPlanMode(ctx context.Context, params *UIHandleP req["requestId"] = params.RequestID req["response"] = params.Response } - raw, err := a.client.Request(ctx, "session.ui.handlePendingExitPlanMode", req) + raw, err := a.client.Request("session.ui.handlePendingExitPlanMode", req) if err != nil { return nil, err } @@ -15207,7 +15008,7 @@ func (a *UIAPI) HandlePendingSampling(ctx context.Context, params *UIHandlePendi req["response"] = *params.Response } } - raw, err := a.client.Request(ctx, "session.ui.handlePendingSampling", req) + raw, err := a.client.Request("session.ui.handlePendingSampling", req) if err != nil { return nil, err } @@ -15232,7 +15033,7 @@ func (a *UIAPI) HandlePendingUserInput(ctx context.Context, params *UIHandlePend req["requestId"] = params.RequestID req["response"] = params.Response } - raw, err := a.client.Request(ctx, "session.ui.handlePendingUserInput", req) + raw, err := a.client.Request("session.ui.handlePendingUserInput", req) if err != nil { return nil, err } @@ -15254,7 +15055,7 @@ func (a *UIAPI) HandlePendingUserInput(ctx context.Context, params *UIHandlePend // client doesn't race the in-process handler for the same requestId). func (a *UIAPI) RegisterDirectAutoModeSwitchHandler(ctx context.Context) (*UIRegisterDirectAutoModeSwitchHandlerResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.ui.registerDirectAutoModeSwitchHandler", req) + raw, err := a.client.Request("session.ui.registerDirectAutoModeSwitchHandler", req) if err != nil { return nil, err } @@ -15280,7 +15081,7 @@ func (a *UIAPI) UnregisterDirectAutoModeSwitchHandler(ctx context.Context, param if params != nil { req["handle"] = params.Handle } - raw, err := a.client.Request(ctx, "session.ui.unregisterDirectAutoModeSwitchHandler", req) + raw, err := a.client.Request("session.ui.unregisterDirectAutoModeSwitchHandler", req) if err != nil { return nil, err } @@ -15302,7 +15103,7 @@ type UsageAPI sessionAPI // model breakdown, and code-change totals. func (a *UsageAPI) GetMetrics(ctx context.Context) (*UsageGetMetricsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.usage.getMetrics", req) + raw, err := a.client.Request("session.usage.getMetrics", req) if err != nil { return nil, err } @@ -15327,7 +15128,7 @@ func (a *WorkspacesAPI) CreateFile(ctx context.Context, params *WorkspacesCreate req["content"] = params.Content req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.workspaces.createFile", req) + raw, err := a.client.Request("session.workspaces.createFile", req) if err != nil { return nil, err } @@ -15350,7 +15151,7 @@ func (a *WorkspacesAPI) Diff(ctx context.Context, params *WorkspacesDiffRequest) if params != nil { req["mode"] = params.Mode } - raw, err := a.client.Request(ctx, "session.workspaces.diff", req) + raw, err := a.client.Request("session.workspaces.diff", req) if err != nil { return nil, err } @@ -15369,7 +15170,7 @@ func (a *WorkspacesAPI) Diff(ctx context.Context, params *WorkspacesDiffRequest) // path when available. func (a *WorkspacesAPI) GetWorkspace(ctx context.Context) (*WorkspacesGetWorkspaceResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.workspaces.getWorkspace", req) + raw, err := a.client.Request("session.workspaces.getWorkspace", req) if err != nil { return nil, err } @@ -15388,7 +15189,7 @@ func (a *WorkspacesAPI) GetWorkspace(ctx context.Context) (*WorkspacesGetWorkspa // enabled. func (a *WorkspacesAPI) ListCheckpoints(ctx context.Context) (*WorkspacesListCheckpointsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.workspaces.listCheckpoints", req) + raw, err := a.client.Request("session.workspaces.listCheckpoints", req) if err != nil { return nil, err } @@ -15406,7 +15207,7 @@ func (a *WorkspacesAPI) ListCheckpoints(ctx context.Context) (*WorkspacesListChe // Returns: Relative paths of files stored in the session workspace files directory. func (a *WorkspacesAPI) ListFiles(ctx context.Context) (*WorkspacesListFilesResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request(ctx, "session.workspaces.listFiles", req) + raw, err := a.client.Request("session.workspaces.listFiles", req) if err != nil { return nil, err } @@ -15430,7 +15231,7 @@ func (a *WorkspacesAPI) ReadCheckpoint(ctx context.Context, params *WorkspacesRe if params != nil { req["number"] = params.Number } - raw, err := a.client.Request(ctx, "session.workspaces.readCheckpoint", req) + raw, err := a.client.Request("session.workspaces.readCheckpoint", req) if err != nil { return nil, err } @@ -15453,7 +15254,7 @@ func (a *WorkspacesAPI) ReadFile(ctx context.Context, params *WorkspacesReadFile if params != nil { req["path"] = params.Path } - raw, err := a.client.Request(ctx, "session.workspaces.readFile", req) + raw, err := a.client.Request("session.workspaces.readFile", req) if err != nil { return nil, err } @@ -15476,7 +15277,7 @@ func (a *WorkspacesAPI) SaveLargePaste(ctx context.Context, params *WorkspacesSa if params != nil { req["content"] = params.Content } - raw, err := a.client.Request(ctx, "session.workspaces.saveLargePaste", req) + raw, err := a.client.Request("session.workspaces.saveLargePaste", req) if err != nil { return nil, err } @@ -15511,7 +15312,6 @@ type SessionRPC struct { Permissions *PermissionsAPI Plan *PlanAPI Plugins *PluginsAPI - Provider *ProviderAPI Queue *QueueAPI Remote *RemoteAPI Schedule *ScheduleAPI @@ -15541,7 +15341,7 @@ func (a *SessionRPC) Abort(ctx context.Context, params *AbortRequest) (*AbortRes req["reason"] = *params.Reason } } - raw, err := a.common.client.Request(ctx, "session.abort", req) + raw, err := a.common.client.Request("session.abort", req) if err != nil { return nil, err } @@ -15581,7 +15381,7 @@ func (a *SessionRPC) Log(ctx context.Context, params *LogRequest) (*LogResult, e req["url"] = *params.URL } } - raw, err := a.common.client.Request(ctx, "session.log", req) + raw, err := a.common.client.Request("session.log", req) if err != nil { return nil, err } @@ -15641,7 +15441,7 @@ func (a *SessionRPC) Send(ctx context.Context, params *SendRequest) (*SendResult req["wait"] = *params.Wait } } - raw, err := a.common.client.Request(ctx, "session.send", req) + raw, err := a.common.client.Request("session.send", req) if err != nil { return nil, err } @@ -15671,7 +15471,7 @@ func (a *SessionRPC) Shutdown(ctx context.Context, params *ShutdownRequest) (*Se req["type"] = *params.Type } } - raw, err := a.common.client.Request(ctx, "session.shutdown", req) + raw, err := a.common.client.Request("session.shutdown", req) if err != nil { return nil, err } @@ -15689,7 +15489,7 @@ func (a *SessionRPC) Shutdown(ctx context.Context, params *ShutdownRequest) (*Se // versions. func (a *SessionRPC) Suspend(ctx context.Context) (*SessionSuspendResult, error) { req := map[string]any{"sessionId": a.common.sessionID} - raw, err := a.common.client.Request(ctx, "session.suspend", req) + raw, err := a.common.client.Request("session.suspend", req) if err != nil { return nil, err } @@ -15722,7 +15522,6 @@ func NewSessionRPC(client *jsonrpc2.Client, sessionID string) *SessionRPC { r.Permissions = (*PermissionsAPI)(&r.common) r.Plan = (*PlanAPI)(&r.common) r.Plugins = (*PluginsAPI)(&r.common) - r.Provider = (*ProviderAPI)(&r.common) r.Queue = (*QueueAPI)(&r.common) r.Remote = (*RemoteAPI)(&r.common) r.Schedule = (*ScheduleAPI)(&r.common) @@ -15760,7 +15559,7 @@ func (a *InternalMCPAPI) ConfigureGitHub(ctx context.Context, params *MCPConfigu if params != nil { req["authInfo"] = params.AuthInfo } - raw, err := a.client.Request(ctx, "session.mcp.configureGitHub", req) + raw, err := a.client.Request("session.mcp.configureGitHub", req) if err != nil { return nil, err } @@ -15791,7 +15590,7 @@ func (a *InternalMCPAPI) RegisterExternalClient(ctx context.Context, params *MCP req["serverName"] = params.ServerName req["transport"] = params.Transport } - raw, err := a.client.Request(ctx, "session.mcp.registerExternalClient", req) + raw, err := a.client.Request("session.mcp.registerExternalClient", req) if err != nil { return nil, err } @@ -15817,7 +15616,7 @@ func (a *InternalMCPAPI) ReloadWithConfig(ctx context.Context, params *MCPReload if params != nil { req["config"] = params.Config } - raw, err := a.client.Request(ctx, "session.mcp.reloadWithConfig", req) + raw, err := a.client.Request("session.mcp.reloadWithConfig", req) if err != nil { return nil, err } @@ -15841,7 +15640,7 @@ func (a *InternalMCPAPI) RestartServer(ctx context.Context, params *MCPRestartSe req["config"] = params.Config req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.restartServer", req) + raw, err := a.client.Request("session.mcp.restartServer", req) if err != nil { return nil, err } @@ -15865,7 +15664,7 @@ func (a *InternalMCPAPI) StartServer(ctx context.Context, params *MCPStartServer req["config"] = params.Config req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.startServer", req) + raw, err := a.client.Request("session.mcp.startServer", req) if err != nil { return nil, err } @@ -15893,7 +15692,7 @@ func (a *InternalMCPAPI) UnregisterExternalClient(ctx context.Context, params *M if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request(ctx, "session.mcp.unregisterExternalClient", req) + raw, err := a.client.Request("session.mcp.unregisterExternalClient", req) if err != nil { return nil, err } @@ -15928,7 +15727,7 @@ func (a *InternalMCPOauthAPI) Respond(ctx context.Context, params *MCPOauthRespo } req["requestId"] = params.RequestID } - raw, err := a.client.Request(ctx, "session.mcp.oauth.respond", req) + raw, err := a.client.Request("session.mcp.oauth.respond", req) if err != nil { return nil, err } diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index a1385a2c0..34d07abc4 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -2840,6 +2840,10 @@ export interface SlashCommandInfo { * Whether the command is experimental */ experimental?: boolean; + /** + * Whether the command may be the target of `/every` / `/after` schedules. Resolution happens at every tick, so only set this when the command is safe to re-invoke and produces an agent prompt. + */ + schedulable?: boolean; } /** * Optional unstructured input hint @@ -5383,6 +5387,19 @@ export interface McpUnregisterExternalClientRequest { */ serverName: string; } +/** + * Memory configuration for this session. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "MemoryConfiguration". + */ +/** @experimental */ +export interface MemoryConfiguration { + /** + * Whether memory is enabled for the session. + */ + enabled: boolean; +} /** * Model identifier and token limits used to compute the context-info breakdown. * @@ -7390,7 +7407,7 @@ export interface PlanReadSqlTodosResult { rows: PlanSqlTodosRow[]; } /** - * Schema for the `PlanSqlTodosRow` type. + * A single todo row read from the session SQL `todos` table. All fields are optional because the SQL schema is best-effort and the agent may not have populated every column. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "PlanSqlTodosRow". @@ -7425,45 +7442,20 @@ export interface PlanReadSqlTodosWithDependenciesResult { /** * Rows from the session SQL todos table, ordered by creation time and id. Empty when no database, no todos table, or the SELECT failed. */ - rows: PlanTodo[]; + rows: PlanSqlTodosRow[]; /** * Edges from the session SQL todo_deps table. Empty when no database, no todo_deps table, or the SELECT failed. Read independently from `rows`, so a broken todo_deps table does not affect the rows result and vice versa. */ - dependencies: PlanTodoDependency[]; -} -/** - * Schema for the `PlanTodo` type. - * - * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "PlanTodo". - */ -/** @experimental */ -export interface PlanTodo { - /** - * Todo identifier. - */ - id?: string; - /** - * Todo title. - */ - title?: string; - /** - * Todo description. - */ - description?: string; - /** - * Todo status. - */ - status?: string; + dependencies: PlanSqlTodoDependency[]; } /** - * Schema for the `PlanTodoDependency` type. + * A single dependency edge read from the session SQL `todo_deps` table, indicating that one todo must complete before another. * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema - * via the `definition` "PlanTodoDependency". + * via the `definition` "PlanSqlTodoDependency". */ /** @experimental */ -export interface PlanTodoDependency { +export interface PlanSqlTodoDependency { /** * ID of the todo that has the dependency. */ @@ -9795,6 +9787,7 @@ export interface SessionOpenOptions { * @experimental */ additionalContentExclusionPolicies?: SessionOpenOptionsAdditionalContentExclusionPolicy[]; + memory?: MemoryConfiguration; /** * Capabilities enabled for this session. */ diff --git a/nodejs/test/e2e/session_todos_changed.e2e.test.ts b/nodejs/test/e2e/session_todos_changed.e2e.test.ts index 3749f6f9b..bb4608ca0 100644 --- a/nodejs/test/e2e/session_todos_changed.e2e.test.ts +++ b/nodejs/test/e2e/session_todos_changed.e2e.test.ts @@ -23,7 +23,7 @@ describe("Todos changed event + readSqlTodosWithDependencies", async () => { }); it( - "fires session.todos_changed and exposes rows + dependencies", + "fires session.todos_changed and exposes rows and dependencies", { timeout: 120_000 }, async () => { const session = await client.createSession({ onPermissionRequest: approveAll }); diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py index ec00eefb5..c78238056 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/generated/rpc.py @@ -1333,12 +1333,9 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. class ExtensionSource(Enum): - """Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin - (installed plugin), or session (session-state//extensions/) - """ - PLUGIN = "plugin" + """Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/)""" + PROJECT = "project" - SESSION = "session" USER = "user" # Experimental: this type is part of an experimental API and may change or be removed. @@ -4642,64 +4639,20 @@ def to_dict(self) -> dict: return result # Experimental: this type is part of an experimental API and may change or be removed. -class ProviderType(Enum): - """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs. +class ProviderConfigType(Enum): + """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs.""" - Provider family. Matches the `type` field of a BYOK provider config. - """ ANTHROPIC = "anthropic" AZURE = "azure" OPENAI = "openai" # Experimental: this type is part of an experimental API and may change or be removed. -class ProviderWireAPI(Enum): - """Wire API format (openai/azure only). Defaults to "completions". +class ProviderConfigWireAPI(Enum): + """Wire API format (openai/azure only). Defaults to "completions".""" - Wire API to be used, when required for the provider type. - """ COMPLETIONS = "completions" RESPONSES = "responses" -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class ProviderSessionToken: - """Short-lived, rotating credential the caller must send on every request, in addition to - `apiKey` if one is present. Omitted when the endpoint does not require one. - """ - header: str - """HTTP header name the token must be sent under.""" - - token: str - """The short-lived token value.""" - - expires_at: datetime | None = None - """When the token expires, if known. Callers should refresh by calling `getEndpoint` again - before this time, or reactively on any 401/403 response from `baseUrl`. - """ - model: str | None = None - """The model the token is bound to, when applicable. When set, the token is only valid for - requests against this model. - """ - - @staticmethod - def from_dict(obj: Any) -> 'ProviderSessionToken': - assert isinstance(obj, dict) - header = from_str(obj.get("header")) - token = from_str(obj.get("token")) - expires_at = from_union([from_datetime, from_none], obj.get("expiresAt")) - model = from_union([from_str, from_none], obj.get("model")) - return ProviderSessionToken(header, token, expires_at, model) - - def to_dict(self) -> dict: - result: dict = {} - result["header"] = from_str(self.header) - result["token"] = from_str(self.token) - if self.expires_at is not None: - result["expiresAt"] = from_union([lambda x: x.isoformat(), from_none], self.expires_at) - if self.model is not None: - result["model"] = from_union([from_str, from_none], self.model) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class PushAttachmentFileLineRange: @@ -7403,14 +7356,6 @@ def to_dict(self) -> dict: class SlashCommandSelectSubcommandResultKind(Enum): SELECT_SUBCOMMAND = "select-subcommand" -# Experimental: this type is part of an experimental API and may change or be removed. -class SubagentSettingsEntryContextTier(Enum): - """Context tier override for matching subagents""" - - DEFAULT = "default" - INHERIT = "inherit" - LONG_CONTEXT = "long_context" - # Experimental: this type is part of an experimental API and may change or be removed. class TaskExecutionMode(Enum): """Whether task execution is synchronously awaited or managed in the background""" @@ -7923,19 +7868,6 @@ def to_dict(self) -> dict: result["model"] = from_union([from_str, from_none], self.model) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class ToolsUpdateSubagentSettingsResult: - """Empty result after applying subagent settings""" - @staticmethod - def from_dict(obj: Any) -> 'ToolsUpdateSubagentSettingsResult': - assert isinstance(obj, dict) - return ToolsUpdateSubagentSettingsResult() - - def to_dict(self) -> dict: - result: dict = {} - return result - # Experimental: this type is part of an experimental API and may change or be removed. class UIAutoModeSwitchResponse(Enum): """User's choice for auto-mode switching: yes (allow this turn), yes_always (allow + persist @@ -9238,16 +9170,14 @@ class Extension: """Schema for the `Extension` type.""" id: str - """Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper', - 'plugin:my-plugin:my-ext') - """ + """Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper')""" + name: str """Extension name (directory name)""" source: ExtensionSource - """Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin - (installed plugin), or session (session-state//extensions/) - """ + """Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/)""" + status: ExtensionStatus """Current status: running, disabled, failed, or starting""" @@ -12369,10 +12299,10 @@ class ProviderConfig: """Well-known model ID used for capability lookup. When set, agent behavior config and token limits are inferred from this model. """ - type: ProviderType | None = None + type: ProviderConfigType | None = None """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs.""" - wire_api: ProviderWireAPI | None = None + wire_api: ProviderConfigWireAPI | None = None """Wire API format (openai/azure only). Defaults to "completions".""" wire_model: str | None = None @@ -12392,8 +12322,8 @@ def from_dict(obj: Any) -> 'ProviderConfig': max_output_tokens = from_union([from_float, from_none], obj.get("maxOutputTokens")) max_prompt_tokens = from_union([from_float, from_none], obj.get("maxPromptTokens")) model_id = from_union([from_str, from_none], obj.get("modelId")) - type = from_union([ProviderType, from_none], obj.get("type")) - wire_api = from_union([ProviderWireAPI, from_none], obj.get("wireApi")) + type = from_union([ProviderConfigType, from_none], obj.get("type")) + wire_api = from_union([ProviderConfigWireAPI, from_none], obj.get("wireApi")) wire_model = from_union([from_str, from_none], obj.get("wireModel")) return ProviderConfig(base_url, api_key, azure, bearer_token, headers, max_context_window_tokens, max_output_tokens, max_prompt_tokens, model_id, type, wire_api, wire_model) @@ -12417,62 +12347,13 @@ def to_dict(self) -> dict: if self.model_id is not None: result["modelId"] = from_union([from_str, from_none], self.model_id) if self.type is not None: - result["type"] = from_union([lambda x: to_enum(ProviderType, x), from_none], self.type) + result["type"] = from_union([lambda x: to_enum(ProviderConfigType, x), from_none], self.type) if self.wire_api is not None: - result["wireApi"] = from_union([lambda x: to_enum(ProviderWireAPI, x), from_none], self.wire_api) + result["wireApi"] = from_union([lambda x: to_enum(ProviderConfigWireAPI, x), from_none], self.wire_api) if self.wire_model is not None: result["wireModel"] = from_union([from_str, from_none], self.wire_model) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class ProviderEndpoint: - """A snapshot of the provider endpoint the session is currently configured to talk to.""" - - base_url: str - """Base URL to pass to the LLM client library.""" - - headers: dict[str, str] - """HTTP headers the caller must include on every outbound request.""" - - type: ProviderType - """Provider family. Matches the `type` field of a BYOK provider config.""" - - api_key: str | None = None - """A credential the caller should use with this endpoint. Omitted only when the endpoint - accepts unauthenticated requests. - """ - session_token: ProviderSessionToken | None = None - """Short-lived, rotating credential the caller must send on every request, in addition to - `apiKey` if one is present. Omitted when the endpoint does not require one. - """ - wire_api: ProviderWireAPI | None = None - """Wire API to be used, when required for the provider type.""" - - @staticmethod - def from_dict(obj: Any) -> 'ProviderEndpoint': - assert isinstance(obj, dict) - base_url = from_str(obj.get("baseUrl")) - headers = from_dict(from_str, obj.get("headers")) - type = ProviderType(obj.get("type")) - api_key = from_union([from_str, from_none], obj.get("apiKey")) - session_token = from_union([ProviderSessionToken.from_dict, from_none], obj.get("sessionToken")) - wire_api = from_union([ProviderWireAPI, from_none], obj.get("wireApi")) - return ProviderEndpoint(base_url, headers, type, api_key, session_token, wire_api) - - def to_dict(self) -> dict: - result: dict = {} - result["baseUrl"] = from_str(self.base_url) - result["headers"] = from_dict(from_str, self.headers) - result["type"] = to_enum(ProviderType, self.type) - if self.api_key is not None: - result["apiKey"] = from_union([from_str, from_none], self.api_key) - if self.session_token is not None: - result["sessionToken"] = from_union([lambda x: to_class(ProviderSessionToken, x), from_none], self.session_token) - if self.wire_api is not None: - result["wireApi"] = from_union([lambda x: to_enum(ProviderWireAPI, x), from_none], self.wire_api) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class PushAttachmentSelectionDetails: @@ -17934,13 +17815,6 @@ class SessionOpenOptions: excluded_tools: list[str] | None = None """Denylist of tool names.""" - # Internal: this field is an internal SDK API and is not part of the public surface. - exp_assignments: Any = None - """ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the - Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When - supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and - ExP-backed flags wait for it. When absent the session does not block on ExP. - """ feature_flags: dict[str, bool] | None = None """Feature-flag values resolved by the host.""" @@ -18047,7 +17921,6 @@ def from_dict(obj: Any) -> 'SessionOpenOptions': env_value_mode = from_union([MCPSetEnvValueModeDetails, from_none], obj.get("envValueMode")) events_log_directory = from_union([from_str, from_none], obj.get("eventsLogDirectory")) excluded_tools = from_union([lambda x: from_list(from_str, x), from_none], obj.get("excludedTools")) - exp_assignments = obj.get("expAssignments") feature_flags = from_union([lambda x: from_dict(from_bool, x), from_none], obj.get("featureFlags")) installed_plugins = from_union([lambda x: from_list(InstalledPlugin.from_dict, x), from_none], obj.get("installedPlugins")) integration_id = from_union([from_str, from_none], obj.get("integrationId")) @@ -18075,7 +17948,7 @@ def from_dict(obj: Any) -> 'SessionOpenOptions': trajectory_file = from_union([from_str, from_none], obj.get("trajectoryFile")) working_directory = from_union([from_str, from_none], obj.get("workingDirectory")) working_directory_context = from_union([SessionContext.from_dict, from_none], obj.get("workingDirectoryContext")) - return SessionOpenOptions(additional_content_exclusion_policies, agent_context, ask_user_disabled, auth_info, available_tools, client_kind, client_name, coauthor_enabled, config_dir, continue_on_auto_mode, copilot_url, custom_agents_local_only, detached_from_spawning_parent_engagement_id, detached_from_spawning_parent_session_id, disabled_instruction_sources, disabled_skills, enable_on_demand_instruction_discovery, enable_script_safety, enable_streaming, env_value_mode, events_log_directory, excluded_tools, exp_assignments, feature_flags, installed_plugins, integration_id, is_experimental_mode, log_interactive_shells, lsp_client_name, memory, model, model_capabilities_overrides, name, provider, reasoning_effort, reasoning_summary, remote_defaulted_on, remote_exporting, remote_steerable, running_in_interactive_mode, sandbox_config, session_capabilities, session_id, shell_init_profile, shell_process_flags, skill_directories, skip_custom_instructions, trajectory_file, working_directory, working_directory_context) + return SessionOpenOptions(additional_content_exclusion_policies, agent_context, ask_user_disabled, auth_info, available_tools, client_kind, client_name, coauthor_enabled, config_dir, continue_on_auto_mode, copilot_url, custom_agents_local_only, detached_from_spawning_parent_engagement_id, detached_from_spawning_parent_session_id, disabled_instruction_sources, disabled_skills, enable_on_demand_instruction_discovery, enable_script_safety, enable_streaming, env_value_mode, events_log_directory, excluded_tools, feature_flags, installed_plugins, integration_id, is_experimental_mode, log_interactive_shells, lsp_client_name, memory, model, model_capabilities_overrides, name, provider, reasoning_effort, reasoning_summary, remote_defaulted_on, remote_exporting, remote_steerable, running_in_interactive_mode, sandbox_config, session_capabilities, session_id, shell_init_profile, shell_process_flags, skill_directories, skip_custom_instructions, trajectory_file, working_directory, working_directory_context) def to_dict(self) -> dict: result: dict = {} @@ -18123,8 +17996,6 @@ def to_dict(self) -> dict: result["eventsLogDirectory"] = from_union([from_str, from_none], self.events_log_directory) if self.excluded_tools is not None: result["excludedTools"] = from_union([lambda x: from_list(from_str, x), from_none], self.excluded_tools) - if self.exp_assignments is not None: - result["expAssignments"] = self.exp_assignments if self.feature_flags is not None: result["featureFlags"] = from_union([lambda x: from_dict(from_bool, x), from_none], self.feature_flags) if self.installed_plugins is not None: @@ -19319,28 +19190,6 @@ def to_dict(self) -> dict: result["source"] = from_union([lambda x: to_enum(PermissionsSetAAllSource, x), from_none], self.source) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class ProviderGetEndpointRequest: - """Optional model identifier to scope the endpoint snapshot to.""" - - model_id: str | None = None - """Model identifier the caller intends to use against the returned endpoint. Used to pick - the correct wire shape. Omit to use whichever model the session is currently using. - """ - - @staticmethod - def from_dict(obj: Any) -> 'ProviderGetEndpointRequest': - assert isinstance(obj, dict) - model_id = from_union([from_str, from_none], obj.get("modelId")) - return ProviderGetEndpointRequest(model_id) - - def to_dict(self) -> dict: - result: dict = {} - if self.model_id is not None: - result["modelId"] = from_union([from_str, from_none], self.model_id) - return result - # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass @@ -19461,64 +19310,6 @@ def to_dict(self) -> dict: result["taskType"] = from_union([lambda x: to_enum(TaskType, x), from_none], self.task_type) return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SubagentSettingsEntry: - """Subagent model, reasoning effort, and context tier settings""" - - context_tier: SubagentSettingsEntryContextTier | None = None - """Context tier override for matching subagents""" - - effort_level: str | None = None - """Reasoning effort override for matching subagents""" - - model: str | None = None - """Model override for matching subagents""" - - @staticmethod - def from_dict(obj: Any) -> 'SubagentSettingsEntry': - assert isinstance(obj, dict) - context_tier = from_union([SubagentSettingsEntryContextTier, from_none], obj.get("contextTier")) - effort_level = from_union([from_str, from_none], obj.get("effortLevel")) - model = from_union([from_str, from_none], obj.get("model")) - return SubagentSettingsEntry(context_tier, effort_level, model) - - def to_dict(self) -> dict: - result: dict = {} - if self.context_tier is not None: - result["contextTier"] = from_union([lambda x: to_enum(SubagentSettingsEntryContextTier, x), from_none], self.context_tier) - if self.effort_level is not None: - result["effortLevel"] = from_union([from_str, from_none], self.effort_level) - if self.model is not None: - result["model"] = from_union([from_str, from_none], self.model) - return result - -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class SubagentSettings: - """Configured per-agent subagent overrides""" - - agents: dict[str, SubagentSettingsEntry] | None = None - """Per-agent settings keyed by subagent agent_type""" - - disabled_subagents: list[str] | None = None - """Names of subagents the user has turned off; they cannot be dispatched""" - - @staticmethod - def from_dict(obj: Any) -> 'SubagentSettings': - assert isinstance(obj, dict) - agents = from_union([lambda x: from_dict(SubagentSettingsEntry.from_dict, x), from_none], obj.get("agents")) - disabled_subagents = from_union([lambda x: from_list(from_str, x), from_none], obj.get("disabledSubagents")) - return SubagentSettings(agents, disabled_subagents) - - def to_dict(self) -> dict: - result: dict = {} - if self.agents is not None: - result["agents"] = from_union([lambda x: from_dict(lambda x: to_class(SubagentSettingsEntry, x), x), from_none], self.agents) - if self.disabled_subagents is not None: - result["disabledSubagents"] = from_union([lambda x: from_list(from_str, x), from_none], self.disabled_subagents) - return result - # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ToolsGetCurrentMetadataResult: @@ -19576,26 +19367,6 @@ def to_dict(self) -> dict: result["onChunk"] = self.on_chunk return result -# Experimental: this type is part of an experimental API and may change or be removed. -@dataclass -class UpdateSubagentSettingsRequest: - """Subagent settings to apply to the current session""" - - subagents: SubagentSettings | None = None - """Subagent settings to apply, or null to clear the live session override""" - - @staticmethod - def from_dict(obj: Any) -> 'UpdateSubagentSettingsRequest': - assert isinstance(obj, dict) - subagents = from_union([SubagentSettings.from_dict, from_none], obj.get("subagents")) - return UpdateSubagentSettingsRequest(subagents) - - def to_dict(self) -> dict: - result: dict = {} - if self.subagents is not None: - result["subagents"] = from_union([lambda x: to_class(SubagentSettings, x), from_none], self.subagents) - return result - @dataclass class RPC: abort_request: AbortRequest @@ -19999,13 +19770,8 @@ class RPC: poll_spawned_sessions_result: PollSpawnedSessionsResult provider_config: ProviderConfig provider_config_azure: ProviderConfigAzure - provider_config_type: ProviderType - provider_config_wire_api: ProviderWireAPI - provider_endpoint: ProviderEndpoint - provider_endpoint_type: ProviderType - provider_endpoint_wire_api: ProviderWireAPI - provider_get_endpoint_request: ProviderGetEndpointRequest - provider_session_token: ProviderSessionToken + provider_config_type: ProviderConfigType + provider_config_wire_api: ProviderConfigWireAPI push_attachment: PushAttachment push_attachment_blob: PushAttachmentBlob push_attachment_directory: PushAttachmentDirectory @@ -20215,8 +19981,6 @@ class RPC: slash_command_select_subcommand_option: SlashCommandSelectSubcommandOption slash_command_select_subcommand_result: SlashCommandSelectSubcommandResult slash_command_text_result: SlashCommandTextResult - subagent_settings_entry: SubagentSettingsEntry - subagent_settings_entry_context_tier: SubagentSettingsEntryContextTier task_agent_info: TaskAgentInfo task_agent_progress: TaskAgentProgress task_execution_mode: TaskExecutionMode @@ -20250,7 +20014,6 @@ class RPC: tools_get_current_metadata_result: ToolsGetCurrentMetadataResult tools_initialize_and_validate_result: ToolsInitializeAndValidateResult tools_list_request: ToolsListRequest - tools_update_subagent_settings_result: ToolsUpdateSubagentSettingsResult ui_auto_mode_switch_response: UIAutoModeSwitchResponse ui_elicitation_array_any_of_field: UIElicitationArrayAnyOfField ui_elicitation_array_any_of_field_items: UIElicitationArrayAnyOfFieldItems @@ -20288,7 +20051,6 @@ class RPC: ui_unregister_direct_auto_mode_switch_handler_request: UIUnregisterDirectAutoModeSwitchHandlerRequest ui_unregister_direct_auto_mode_switch_handler_result: UIUnregisterDirectAutoModeSwitchHandlerResult ui_user_input_response: UIUserInputResponse - update_subagent_settings_request: UpdateSubagentSettingsRequest usage_get_metrics_result: UsageGetMetricsResult usage_metrics_code_changes: UsageMetricsCodeChanges usage_metrics_model_metric: UsageMetricsModelMetric @@ -20317,7 +20079,6 @@ class RPC: workspace_summary_host_type: HostType workspaces_workspace_details_host_type: HostType session_context_info: SessionContextInfo | None = None - subagent_settings: SubagentSettings | None = None task_progress: TaskProgress | None = None workspace_summary: WorkspaceSummary | None = None @@ -20725,13 +20486,8 @@ def from_dict(obj: Any) -> 'RPC': poll_spawned_sessions_result = PollSpawnedSessionsResult.from_dict(obj.get("PollSpawnedSessionsResult")) provider_config = ProviderConfig.from_dict(obj.get("ProviderConfig")) provider_config_azure = ProviderConfigAzure.from_dict(obj.get("ProviderConfigAzure")) - provider_config_type = ProviderType(obj.get("ProviderConfigType")) - provider_config_wire_api = ProviderWireAPI(obj.get("ProviderConfigWireApi")) - provider_endpoint = ProviderEndpoint.from_dict(obj.get("ProviderEndpoint")) - provider_endpoint_type = ProviderType(obj.get("ProviderEndpointType")) - provider_endpoint_wire_api = ProviderWireAPI(obj.get("ProviderEndpointWireApi")) - provider_get_endpoint_request = ProviderGetEndpointRequest.from_dict(obj.get("ProviderGetEndpointRequest")) - provider_session_token = ProviderSessionToken.from_dict(obj.get("ProviderSessionToken")) + provider_config_type = ProviderConfigType(obj.get("ProviderConfigType")) + provider_config_wire_api = ProviderConfigWireAPI(obj.get("ProviderConfigWireApi")) push_attachment = _load_PushAttachment(obj.get("PushAttachment")) push_attachment_blob = PushAttachmentBlob.from_dict(obj.get("PushAttachmentBlob")) push_attachment_directory = PushAttachmentDirectory.from_dict(obj.get("PushAttachmentDirectory")) @@ -20941,8 +20697,6 @@ def from_dict(obj: Any) -> 'RPC': slash_command_select_subcommand_option = SlashCommandSelectSubcommandOption.from_dict(obj.get("SlashCommandSelectSubcommandOption")) slash_command_select_subcommand_result = SlashCommandSelectSubcommandResult.from_dict(obj.get("SlashCommandSelectSubcommandResult")) slash_command_text_result = SlashCommandTextResult.from_dict(obj.get("SlashCommandTextResult")) - subagent_settings_entry = SubagentSettingsEntry.from_dict(obj.get("SubagentSettingsEntry")) - subagent_settings_entry_context_tier = SubagentSettingsEntryContextTier(obj.get("SubagentSettingsEntryContextTier")) task_agent_info = TaskAgentInfo.from_dict(obj.get("TaskAgentInfo")) task_agent_progress = TaskAgentProgress.from_dict(obj.get("TaskAgentProgress")) task_execution_mode = TaskExecutionMode(obj.get("TaskExecutionMode")) @@ -20976,7 +20730,6 @@ def from_dict(obj: Any) -> 'RPC': tools_get_current_metadata_result = ToolsGetCurrentMetadataResult.from_dict(obj.get("ToolsGetCurrentMetadataResult")) tools_initialize_and_validate_result = ToolsInitializeAndValidateResult.from_dict(obj.get("ToolsInitializeAndValidateResult")) tools_list_request = ToolsListRequest.from_dict(obj.get("ToolsListRequest")) - tools_update_subagent_settings_result = ToolsUpdateSubagentSettingsResult.from_dict(obj.get("ToolsUpdateSubagentSettingsResult")) ui_auto_mode_switch_response = UIAutoModeSwitchResponse(obj.get("UIAutoModeSwitchResponse")) ui_elicitation_array_any_of_field = UIElicitationArrayAnyOfField.from_dict(obj.get("UIElicitationArrayAnyOfField")) ui_elicitation_array_any_of_field_items = UIElicitationArrayAnyOfFieldItems.from_dict(obj.get("UIElicitationArrayAnyOfFieldItems")) @@ -21014,7 +20767,6 @@ def from_dict(obj: Any) -> 'RPC': ui_unregister_direct_auto_mode_switch_handler_request = UIUnregisterDirectAutoModeSwitchHandlerRequest.from_dict(obj.get("UIUnregisterDirectAutoModeSwitchHandlerRequest")) ui_unregister_direct_auto_mode_switch_handler_result = UIUnregisterDirectAutoModeSwitchHandlerResult.from_dict(obj.get("UIUnregisterDirectAutoModeSwitchHandlerResult")) ui_user_input_response = UIUserInputResponse.from_dict(obj.get("UIUserInputResponse")) - update_subagent_settings_request = UpdateSubagentSettingsRequest.from_dict(obj.get("UpdateSubagentSettingsRequest")) usage_get_metrics_result = UsageGetMetricsResult.from_dict(obj.get("UsageGetMetricsResult")) usage_metrics_code_changes = UsageMetricsCodeChanges.from_dict(obj.get("UsageMetricsCodeChanges")) usage_metrics_model_metric = UsageMetricsModelMetric.from_dict(obj.get("UsageMetricsModelMetric")) @@ -21043,10 +20795,9 @@ def from_dict(obj: Any) -> 'RPC': workspace_summary_host_type = HostType(obj.get("WorkspaceSummaryHostType")) workspaces_workspace_details_host_type = HostType(obj.get("WorkspacesWorkspaceDetailsHostType")) session_context_info = from_union([SessionContextInfo.from_dict, from_none], obj.get("SessionContextInfo")) - subagent_settings = from_union([SubagentSettings.from_dict, from_none], obj.get("SubagentSettings")) task_progress = from_union([TaskProgress.from_dict, from_none], obj.get("TaskProgress")) workspace_summary = from_union([WorkspaceSummary.from_dict, from_none], obj.get("WorkspaceSummary")) - return RPC(abort_request, abort_result, account_get_quota_request, account_get_quota_result, account_quota_snapshot, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, allow_all_permission_set_result, allow_all_permission_state, api_key_auth_info, auth_info, auth_info_type, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_instance_availability, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_session_context, command_list, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, configure_session_extensions_params, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_filter_mode, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, discovered_canvas, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_compact_context_window, history_compact_request, history_compact_result, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instructions_discover_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, local_session_metadata_value, log_request, log_result, lsp_initialize_request, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_filtered_server, mcp_host_state, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_register_external_client_request, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_restart_server_request, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_config, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_stdio, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_tools, mcp_unregister_external_client_request, memory_configuration, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, model, model_billing, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_picker_category, model_picker_price_category, model_policy, model_policy_state, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_to_request, model_switch_to_result, mode_set_request, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_reject, permission_decision_request, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_allow_all_request, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_allow_all_request, permissions_set_allow_all_source, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_list, plugin_list_result, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, poll_spawned_sessions_result, provider_config, provider_config_azure, provider_config_type, provider_config_wire_api, provider_endpoint, provider_endpoint_type, provider_endpoint_wire_api, provider_get_endpoint_request, provider_session_token, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, queued_command_handled, queued_command_not_handled, queued_command_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_most_recent_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, sandbox_config, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, schedule_entry, schedule_list, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_mode, send_request, send_result, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_auth_status, session_bulk_delete_result, session_capability, session_context, session_context_host_type, session_enrich_metadata_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_close_request, sessions_close_result, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_poll_spawned_sessions_event, sessions_poll_spawned_sessions_request, sessions_prune_old_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_working_directory_context, session_working_directory_context_host_type, shell_cancel_user_requested_request, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_kill_request, shell_kill_result, shell_kill_signal, shutdown_request, skill, skill_list, skills_config_set_disabled_skills_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_text_result, subagent_settings_entry, subagent_settings_entry_context_tier, task_agent_info, task_agent_progress, task_execution_mode, task_info, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, tool, tool_list, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_diff_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspace_summary_host_type, workspaces_workspace_details_host_type, session_context_info, subagent_settings, task_progress, workspace_summary) + return RPC(abort_request, abort_result, account_get_quota_request, account_get_quota_result, account_quota_snapshot, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, allow_all_permission_set_result, allow_all_permission_state, api_key_auth_info, auth_info, auth_info_type, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_instance_availability, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_session_context, command_list, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, configure_session_extensions_params, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_filter_mode, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, discovered_canvas, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_compact_context_window, history_compact_request, history_compact_result, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instructions_discover_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, local_session_metadata_value, log_request, log_result, lsp_initialize_request, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_filtered_server, mcp_host_state, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_register_external_client_request, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_restart_server_request, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_config, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_stdio, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_tools, mcp_unregister_external_client_request, memory_configuration, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, model, model_billing, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_picker_category, model_picker_price_category, model_policy, model_policy_state, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_to_request, model_switch_to_result, mode_set_request, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_reject, permission_decision_request, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_allow_all_request, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_allow_all_request, permissions_set_allow_all_source, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_list, plugin_list_result, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, poll_spawned_sessions_result, provider_config, provider_config_azure, provider_config_type, provider_config_wire_api, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, queued_command_handled, queued_command_not_handled, queued_command_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_most_recent_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, sandbox_config, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, schedule_entry, schedule_list, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_mode, send_request, send_result, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_auth_status, session_bulk_delete_result, session_capability, session_context, session_context_host_type, session_enrich_metadata_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_close_request, sessions_close_result, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_poll_spawned_sessions_event, sessions_poll_spawned_sessions_request, sessions_prune_old_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_working_directory_context, session_working_directory_context_host_type, shell_cancel_user_requested_request, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_kill_request, shell_kill_result, shell_kill_signal, shutdown_request, skill, skill_list, skills_config_set_disabled_skills_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_text_result, task_agent_info, task_agent_progress, task_execution_mode, task_info, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, tool, tool_list, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, usage_get_metrics_result, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_diff_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspace_summary_host_type, workspaces_workspace_details_host_type, session_context_info, task_progress, workspace_summary) def to_dict(self) -> dict: result: dict = {} @@ -21451,13 +21202,8 @@ def to_dict(self) -> dict: result["PollSpawnedSessionsResult"] = to_class(PollSpawnedSessionsResult, self.poll_spawned_sessions_result) result["ProviderConfig"] = to_class(ProviderConfig, self.provider_config) result["ProviderConfigAzure"] = to_class(ProviderConfigAzure, self.provider_config_azure) - result["ProviderConfigType"] = to_enum(ProviderType, self.provider_config_type) - result["ProviderConfigWireApi"] = to_enum(ProviderWireAPI, self.provider_config_wire_api) - result["ProviderEndpoint"] = to_class(ProviderEndpoint, self.provider_endpoint) - result["ProviderEndpointType"] = to_enum(ProviderType, self.provider_endpoint_type) - result["ProviderEndpointWireApi"] = to_enum(ProviderWireAPI, self.provider_endpoint_wire_api) - result["ProviderGetEndpointRequest"] = to_class(ProviderGetEndpointRequest, self.provider_get_endpoint_request) - result["ProviderSessionToken"] = to_class(ProviderSessionToken, self.provider_session_token) + result["ProviderConfigType"] = to_enum(ProviderConfigType, self.provider_config_type) + result["ProviderConfigWireApi"] = to_enum(ProviderConfigWireAPI, self.provider_config_wire_api) result["PushAttachment"] = (self.push_attachment).to_dict() result["PushAttachmentBlob"] = to_class(PushAttachmentBlob, self.push_attachment_blob) result["PushAttachmentDirectory"] = to_class(PushAttachmentDirectory, self.push_attachment_directory) @@ -21667,8 +21413,6 @@ def to_dict(self) -> dict: result["SlashCommandSelectSubcommandOption"] = to_class(SlashCommandSelectSubcommandOption, self.slash_command_select_subcommand_option) result["SlashCommandSelectSubcommandResult"] = to_class(SlashCommandSelectSubcommandResult, self.slash_command_select_subcommand_result) result["SlashCommandTextResult"] = to_class(SlashCommandTextResult, self.slash_command_text_result) - result["SubagentSettingsEntry"] = to_class(SubagentSettingsEntry, self.subagent_settings_entry) - result["SubagentSettingsEntryContextTier"] = to_enum(SubagentSettingsEntryContextTier, self.subagent_settings_entry_context_tier) result["TaskAgentInfo"] = to_class(TaskAgentInfo, self.task_agent_info) result["TaskAgentProgress"] = to_class(TaskAgentProgress, self.task_agent_progress) result["TaskExecutionMode"] = to_enum(TaskExecutionMode, self.task_execution_mode) @@ -21702,7 +21446,6 @@ def to_dict(self) -> dict: result["ToolsGetCurrentMetadataResult"] = to_class(ToolsGetCurrentMetadataResult, self.tools_get_current_metadata_result) result["ToolsInitializeAndValidateResult"] = to_class(ToolsInitializeAndValidateResult, self.tools_initialize_and_validate_result) result["ToolsListRequest"] = to_class(ToolsListRequest, self.tools_list_request) - result["ToolsUpdateSubagentSettingsResult"] = to_class(ToolsUpdateSubagentSettingsResult, self.tools_update_subagent_settings_result) result["UIAutoModeSwitchResponse"] = to_enum(UIAutoModeSwitchResponse, self.ui_auto_mode_switch_response) result["UIElicitationArrayAnyOfField"] = to_class(UIElicitationArrayAnyOfField, self.ui_elicitation_array_any_of_field) result["UIElicitationArrayAnyOfFieldItems"] = to_class(UIElicitationArrayAnyOfFieldItems, self.ui_elicitation_array_any_of_field_items) @@ -21740,7 +21483,6 @@ def to_dict(self) -> dict: result["UIUnregisterDirectAutoModeSwitchHandlerRequest"] = to_class(UIUnregisterDirectAutoModeSwitchHandlerRequest, self.ui_unregister_direct_auto_mode_switch_handler_request) result["UIUnregisterDirectAutoModeSwitchHandlerResult"] = to_class(UIUnregisterDirectAutoModeSwitchHandlerResult, self.ui_unregister_direct_auto_mode_switch_handler_result) result["UIUserInputResponse"] = to_class(UIUserInputResponse, self.ui_user_input_response) - result["UpdateSubagentSettingsRequest"] = to_class(UpdateSubagentSettingsRequest, self.update_subagent_settings_request) result["UsageGetMetricsResult"] = to_class(UsageGetMetricsResult, self.usage_get_metrics_result) result["UsageMetricsCodeChanges"] = to_class(UsageMetricsCodeChanges, self.usage_metrics_code_changes) result["UsageMetricsModelMetric"] = to_class(UsageMetricsModelMetric, self.usage_metrics_model_metric) @@ -21769,7 +21511,6 @@ def to_dict(self) -> dict: result["WorkspaceSummaryHostType"] = to_enum(HostType, self.workspace_summary_host_type) result["WorkspacesWorkspaceDetailsHostType"] = to_enum(HostType, self.workspaces_workspace_details_host_type) result["SessionContextInfo"] = from_union([lambda x: to_class(SessionContextInfo, x), from_none], self.session_context_info) - result["SubagentSettings"] = from_union([lambda x: to_class(SubagentSettings, x), from_none], self.subagent_settings) result["TaskProgress"] = from_union([lambda x: to_class(TaskProgress, x), from_none], self.task_progress) result["WorkspaceSummary"] = from_union([lambda x: to_class(WorkspaceSummary, x), from_none], self.workspace_summary) return result @@ -22015,10 +21756,6 @@ def _load_TaskInfo(obj: Any) -> "TaskInfo": PermissionsConfigureAdditionalContentExclusionPolicyScope = AdditionalContentExclusionPolicyScope PermissionsSetAllowAllSource = PermissionsSetAAllSource PermissionsSetApproveAllSource = PermissionsSetAAllSource -ProviderConfigType = ProviderType -ProviderConfigWireApi = ProviderWireAPI -ProviderEndpointType = ProviderType -ProviderEndpointWireApi = ProviderWireAPI RemoteSessionMetadataTaskType = TaskType SessionContextHostType = HostType SessionMcpAppsCallToolResult = dict @@ -22995,19 +22732,6 @@ async def reload(self, params: PluginsReloadRequest | None = None, *, timeout: f await self._client.request("session.plugins.reload", params_dict, **_timeout_kwargs(timeout)) -# Experimental: this API group is experimental and may change or be removed. -class ProviderApi: - def __init__(self, client: "JsonRpcClient", session_id: str): - self._client = client - self._session_id = session_id - - async def get_endpoint(self, params: ProviderGetEndpointRequest | None = None, *, timeout: float | None = None) -> ProviderEndpoint: - "Returns the provider endpoint and credentials the session is currently configured to talk to, so the caller can make inference calls directly against the same backend the session uses.\n\nArgs:\n params: Optional model identifier to scope the endpoint snapshot to.\n\nReturns:\n A snapshot of the provider endpoint the session is currently configured to talk to." - params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} if params is not None else {} - params_dict["sessionId"] = self._session_id - return ProviderEndpoint.from_dict(await self._client.request("session.provider.getEndpoint", params_dict, **_timeout_kwargs(timeout))) - - # Experimental: this API group is experimental and may change or be removed. class OptionsApi: def __init__(self, client: "JsonRpcClient", session_id: str): @@ -23087,12 +22811,6 @@ async def get_current_metadata(self, *, timeout: float | None = None) -> ToolsGe "Returns lightweight metadata for the session's currently initialized tools.\n\nReturns:\n Current lightweight tool metadata snapshot for the session." return ToolsGetCurrentMetadataResult.from_dict(await self._client.request("session.tools.getCurrentMetadata", {"sessionId": self._session_id}, **_timeout_kwargs(timeout))) - async def update_subagent_settings(self, params: UpdateSubagentSettingsRequest, *, timeout: float | None = None) -> ToolsUpdateSubagentSettingsResult: - "Updates the current session's live subagent settings after user settings change. The persisted user settings remain the source of truth for future sessions.\n\nArgs:\n params: Subagent settings to apply to the current session\n\nReturns:\n Empty result after applying subagent settings" - params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} - params_dict["sessionId"] = self._session_id - return ToolsUpdateSubagentSettingsResult.from_dict(await self._client.request("session.tools.updateSubagentSettings", params_dict, **_timeout_kwargs(timeout))) - # Experimental: this API group is experimental and may change or be removed. class CommandsApi: @@ -23593,7 +23311,6 @@ def __init__(self, client: "JsonRpcClient", session_id: str): self.skills = SkillsApi(client, session_id) self.mcp = McpApi(client, session_id) self.plugins = PluginsApi(client, session_id) - self.provider = ProviderApi(client, session_id) self.options = OptionsApi(client, session_id) self.lsp = LspApi(client, session_id) self.extensions = ExtensionsApi(client, session_id) @@ -24348,18 +24065,10 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "PluginsUninstallRequest", "PluginsUpdateRequest", "PollSpawnedSessionsResult", - "ProviderApi", "ProviderConfig", "ProviderConfigAzure", "ProviderConfigType", - "ProviderConfigWireApi", - "ProviderEndpoint", - "ProviderEndpointType", - "ProviderEndpointWireApi", - "ProviderGetEndpointRequest", - "ProviderSessionToken", - "ProviderType", - "ProviderWireAPI", + "ProviderConfigWireAPI", "PurpleSource", "PushAttachment", "PushAttachmentBlob", @@ -24619,9 +24328,6 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "SlashCommandSelectSubcommandResultKind", "SlashCommandTextResult", "StickySource", - "SubagentSettings", - "SubagentSettingsEntry", - "SubagentSettingsEntryContextTier", "TaskAgentInfo", "TaskAgentInfoType", "TaskAgentProgress", @@ -24668,7 +24374,6 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "ToolsGetCurrentMetadataResult", "ToolsInitializeAndValidateResult", "ToolsListRequest", - "ToolsUpdateSubagentSettingsResult", "UIAutoModeSwitchResponse", "UIElicitationArrayAnyOfField", "UIElicitationArrayAnyOfFieldItems", @@ -24710,7 +24415,6 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "UIUnregisterDirectAutoModeSwitchHandlerResult", "UIUserInputResponse", "UiApi", - "UpdateSubagentSettingsRequest", "UsageApi", "UsageGetMetricsResult", "UsageMetricsCodeChanges", diff --git a/python/e2e/test_session_todos_changed_e2e.py b/python/e2e/test_session_todos_changed_e2e.py new file mode 100644 index 000000000..b16008431 --- /dev/null +++ b/python/e2e/test_session_todos_changed_e2e.py @@ -0,0 +1,51 @@ +"""E2E coverage for session.todos_changed and SQL todo dependency reads.""" + +from __future__ import annotations + +import pytest + +from copilot.session import PermissionHandler + +from .testharness import E2ETestContext + +pytestmark = pytest.mark.asyncio(loop_scope="module") + + +PROMPT = """Use the sql tool to execute exactly these statements, in order, with no extra rows: +1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending'); +2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done'); +3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha'); +Then stop. Do not insert any other rows or create any other tables.""" + + +def _event_type_value(event) -> str: + return getattr(event.type, "value", event.type) + + +class TestSessionTodosChanged: + async def test_fires_session_todos_changed_and_exposes_rows_and_dependencies( + self, ctx: E2ETestContext + ): + async with await ctx.client.create_session( + on_permission_request=PermissionHandler.approve_all, + ) as session: + events = [] + unsubscribe = session.on(events.append) + try: + await session.send_and_wait(PROMPT, timeout=120.0) + finally: + unsubscribe() + + todos_events = [ + event for event in events if _event_type_value(event) == "session.todos_changed" + ] + assert len(todos_events) >= 1 + + result = await session.rpc.plan.read_sql_todos_with_dependencies() + ids = sorted(row.id for row in result.rows if row.id) + assert ids == ["alpha", "beta"] + + assert any( + dependency.todo_id == "beta" and dependency.depends_on == "alpha" + for dependency in result.dependencies + ) \ No newline at end of file diff --git a/rust/tests/e2e.rs b/rust/tests/e2e.rs index 40bb5adb7..a1dd36ca6 100644 --- a/rust/tests/e2e.rs +++ b/rust/tests/e2e.rs @@ -105,6 +105,8 @@ mod session_fs; mod session_fs_sqlite; #[path = "e2e/session_lifecycle.rs"] mod session_lifecycle; +#[path = "e2e/session_todos_changed.rs"] +mod session_todos_changed; #[path = "e2e/skills.rs"] mod skills; #[path = "e2e/streaming_fidelity.rs"] diff --git a/rust/tests/e2e/session_todos_changed.rs b/rust/tests/e2e/session_todos_changed.rs new file mode 100644 index 000000000..114f5162a --- /dev/null +++ b/rust/tests/e2e/session_todos_changed.rs @@ -0,0 +1,86 @@ +use github_copilot_sdk::session_events::SessionEventType; +use serde::Deserialize; +use serde_json::json; + +use super::support::{wait_for_event, with_e2e_context}; + +const PROMPT: &str = concat!( + "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n", + "1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n", + "2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n", + "3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n", + "Then stop. Do not insert any other rows or create any other tables." +); + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct PlanReadSqlTodosWithDependenciesResult { + rows: Vec, + dependencies: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct PlanTodo { + id: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct PlanTodoDependency { + todo_id: String, + depends_on: String, +} + +#[tokio::test] +async fn fires_session_todos_changed_and_exposes_rows_and_dependencies() { + with_e2e_context( + "session_todos_changed", + "fires_session_todos_changed_and_exposes_rows_and_dependencies", + |ctx| { + Box::pin(async move { + ctx.set_default_copilot_user(); + let client = ctx.start_client().await; + let session = client + .create_session(ctx.approve_all_session_config()) + .await + .expect("create session"); + + let todos_changed = wait_for_event(session.subscribe(), "todos changed", |event| { + event.parsed_type() == SessionEventType::Unknown + && event.event_type == "session.todos_changed" + }); + + session.send_and_wait(PROMPT).await.expect("send"); + todos_changed.await; + + let value = session + .client() + .call( + "session.plan.readSqlTodosWithDependencies", + Some(json!({ "sessionId": session.id() })), + ) + .await + .expect("read SQL todos with dependencies"); + let result: PlanReadSqlTodosWithDependenciesResult = + serde_json::from_value(value).expect("deserialize todos with dependencies"); + + let mut ids: Vec = + result.rows.into_iter().filter_map(|row| row.id).collect(); + ids.sort(); + assert_eq!(ids, ["alpha", "beta"]); + assert!( + result + .dependencies + .iter() + .any(|dependency| dependency.todo_id == "beta" + && dependency.depends_on == "alpha") + ); + + session.disconnect().await.expect("disconnect session"); + client.stop().await.expect("stop client"); + }) + }, + ) + .await; +} diff --git a/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml b/test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows_and_dependencies.yaml similarity index 100% rename from test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows___dependencies.yaml rename to test/snapshots/session_todos_changed/fires_session_todos_changed_and_exposes_rows_and_dependencies.yaml From 031ea1e8d0bbfc28003bafbe1e7d51a879aecd5c Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Fri, 12 Jun 2026 12:52:33 +0100 Subject: [PATCH 04/22] Add Java E2E coverage for session.todos_changed (WIP) Adds the generated Java bindings for SessionTodosChangedEvent, PlanSqlTodoDependency, and SessionPlan.readSqlTodosWithDependencies, plus a Java E2E test mirroring the other 5 SDK languages. Status: the test currently fails locally - the runtime's session.todos_changed event is not reaching the Java listener even though the same scenario passes in Node/.NET/Go/Python/Rust against the identical CAPI snapshot. Needs follow-up investigation; pushed as-is so reviewers can see the full 6-language surface. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../copilot/SessionTodosChangedTest.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 java/src/test/java/com/github/copilot/SessionTodosChangedTest.java diff --git a/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java b/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java new file mode 100644 index 000000000..b0dd2fd46 --- /dev/null +++ b/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java @@ -0,0 +1,79 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +package com.github.copilot; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.github.copilot.generated.SessionEvent; +import com.github.copilot.generated.SessionTodosChangedEvent; +import com.github.copilot.generated.rpc.PlanSqlTodoDependency; +import com.github.copilot.rpc.MessageOptions; +import com.github.copilot.rpc.PermissionHandler; +import com.github.copilot.rpc.SessionConfig; + +public class SessionTodosChangedTest { + + private static E2ETestContext ctx; + + @BeforeAll + static void setup() throws Exception { + ctx = E2ETestContext.create(); + } + + @AfterAll + static void teardown() throws Exception { + if (ctx != null) { + ctx.close(); + } + } + + @Test + void firesSessionTodosChangedAndExposesRowsAndDependencies() throws Exception { + ctx.configureForTest("session_todos_changed", + "fires_session_todos_changed_and_exposes_rows_and_dependencies"); + + try (CopilotClient client = ctx.createClient()) { + CopilotSession session = client + .createSession(new SessionConfig().setOnPermissionRequest(PermissionHandler.APPROVE_ALL)).get(); + + List events = Collections.synchronizedList(new ArrayList<>()); + session.on(events::add); + + session.sendAndWait(new MessageOptions().setPrompt( + "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + + "1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + + "2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + + "3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" + + "Then stop. Do not insert any other rows or create any other tables.")) + .get(120, TimeUnit.SECONDS); + + assertTrue(events.stream().anyMatch(SessionTodosChangedEvent.class::isInstance), + "Should have received at least one session.todos_changed event"); + + var result = session.getRpc().plan.readSqlTodosWithDependencies().get(15, TimeUnit.SECONDS); + assertEquals(2, result.rows().size()); + var ids = result.rows().stream().map(row -> row.id()).filter(id -> id != null).sorted().toList(); + + assertEquals(List.of("alpha", "beta"), ids); + assertTrue(result.dependencies().stream().anyMatch(SessionTodosChangedTest::isBetaDependsOnAlpha), + "Should contain beta -> alpha dependency"); + + session.close(); + } + } + + private static boolean isBetaDependsOnAlpha(PlanSqlTodoDependency dependency) { + return "beta".equals(dependency.todoId()) && "alpha".equals(dependency.dependsOn()); + } +} From 9ffba9007cb8523fedd8e008004b8a8f25a46208 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 11:37:53 +0100 Subject: [PATCH 05/22] Regenerate RPC bindings against @github/copilot 1.0.62 Re-running codegen against the published 1.0.62 schema picks up new provider and subagent settings APIs that were missing from the rebased generated files. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- go/rpc/zrpc.go | 657 +++++++++++++++++++++----------- nodejs/src/generated/rpc.ts | 201 +++++++++- python/copilot/generated/rpc.py | 346 +++++++++++++++-- 3 files changed, 948 insertions(+), 256 deletions(-) diff --git a/go/rpc/zrpc.go b/go/rpc/zrpc.go index a2e78b0e5..583ed3c58 100644 --- a/go/rpc/zrpc.go +++ b/go/rpc/zrpc.go @@ -1290,13 +1290,15 @@ type ExecuteCommandResult struct { // Schema for the `Extension` type. // Experimental: Extension is part of an experimental API and may change or be removed. type Extension struct { - // Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper') + // Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper', + // 'plugin:my-plugin:my-ext') ID string `json:"id"` // Extension name (directory name) Name string `json:"name"` // Process ID if the extension is running Pid *int64 `json:"pid,omitempty"` - // Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/) + // Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin + // (installed plugin), or session (session-state//extensions/) Source ExtensionSource `json:"source"` // Current status: running, disabled, failed, or starting Status ExtensionStatus `json:"status"` @@ -4585,6 +4587,52 @@ type ProviderConfigAzure struct { APIVersion *string `json:"apiVersion,omitempty"` } +// A snapshot of the provider endpoint the session is currently configured to talk to. +// Experimental: ProviderEndpoint is part of an experimental API and may change or be +// removed. +type ProviderEndpoint struct { + // A credential the caller should use with this endpoint. Omitted only when the endpoint + // accepts unauthenticated requests. + APIKey *string `json:"apiKey,omitempty"` + // Base URL to pass to the LLM client library. + BaseURL string `json:"baseUrl"` + // HTTP headers the caller must include on every outbound request. + Headers map[string]string `json:"headers"` + // Short-lived, rotating credential the caller must send on every request, in addition to + // `apiKey` if one is present. Omitted when the endpoint does not require one. + SessionToken *ProviderSessionToken `json:"sessionToken,omitempty"` + // Provider family. Matches the `type` field of a BYOK provider config. + Type ProviderEndpointType `json:"type"` + // Wire API to be used, when required for the provider type. + WireAPI *ProviderEndpointWireAPI `json:"wireApi,omitempty"` +} + +// Optional model identifier to scope the endpoint snapshot to. +// Experimental: ProviderGetEndpointRequest is part of an experimental API and may change or +// be removed. +type ProviderGetEndpointRequest struct { + // Model identifier the caller intends to use against the returned endpoint. Used to pick + // the correct wire shape. Omit to use whichever model the session is currently using. + ModelID *string `json:"modelId,omitempty"` +} + +// Short-lived, rotating credential the caller must send on every request, in addition to +// `apiKey` if one is present. Omitted when the endpoint does not require one. +// Experimental: ProviderSessionToken is part of an experimental API and may change or be +// removed. +type ProviderSessionToken struct { + // When the token expires, if known. Callers should refresh by calling `getEndpoint` again + // before this time, or reactively on any 401/403 response from `baseUrl`. + ExpiresAt *time.Time `json:"expiresAt,omitempty"` + // HTTP header name the token must be sent under. + Header string `json:"header"` + // The model the token is bound to, when applicable. When set, the token is only valid for + // requests against this model. + Model *string `json:"model,omitempty"` + // The short-lived token value. + Token string `json:"token"` +} + // Schema for the `PushAttachment` type. // Experimental: PushAttachment is part of an experimental API and may change or be removed. type PushAttachment interface { @@ -6041,6 +6089,13 @@ type SessionOpenOptions struct { EventsLogDirectory *string `json:"eventsLogDirectory,omitempty"` // Denylist of tool names. ExcludedTools []string `json:"excludedTools,omitzero"` + // ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the + // Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When + // supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and + // ExP-backed flags wait for it. When absent the session does not block on ExP. + // Internal: ExpAssignments is part of the SDK's internal API surface and is not intended + // for external use. + ExpAssignments any `json:"expAssignments,omitempty"` // Feature-flag values resolved by the host. FeatureFlags map[string]bool `json:"featureFlags,omitzero"` // Installed plugins visible to the session. @@ -7250,6 +7305,28 @@ type SlashCommandSelectSubcommandOption struct { Name string `json:"name"` } +// Configured per-agent subagent overrides +// Experimental: SubagentSettings is part of an experimental API and may change or be +// removed. +type SubagentSettings struct { + // Per-agent settings keyed by subagent agent_type + Agents map[string]SubagentSettingsEntry `json:"agents,omitzero"` + // Names of subagents the user has turned off; they cannot be dispatched + DisabledSubagents []string `json:"disabledSubagents,omitzero"` +} + +// Subagent model, reasoning effort, and context tier settings +// Experimental: SubagentSettingsEntry is part of an experimental API and may change or be +// removed. +type SubagentSettingsEntry struct { + // Context tier override for matching subagents + ContextTier *SubagentSettingsEntryContextTier `json:"contextTier,omitempty"` + // Reasoning effort override for matching subagents + EffortLevel *string `json:"effortLevel,omitempty"` + // Model override for matching subagents + Model *string `json:"model,omitempty"` +} + // Schema for the `TaskInfo` type. // Experimental: TaskInfo is part of an experimental API and may change or be removed. type TaskInfo interface { @@ -7616,6 +7693,12 @@ type ToolsListRequest struct { Model *string `json:"model,omitempty"` } +// Empty result after applying subagent settings +// Experimental: ToolsUpdateSubagentSettingsResult is part of an experimental API and may +// change or be removed. +type ToolsUpdateSubagentSettingsResult struct { +} + // Schema applied to each item in the array. // Experimental: UIElicitationArrayAnyOfFieldItems is part of an experimental API and may // change or be removed. @@ -8049,6 +8132,14 @@ type UIUserInputResponse struct { WasFreeform bool `json:"wasFreeform"` } +// Subagent settings to apply to the current session +// Experimental: UpdateSubagentSettingsRequest is part of an experimental API and may change +// or be removed. +type UpdateSubagentSettingsRequest struct { + // Subagent settings to apply, or null to clear the live session override + Subagents *SubagentSettings `json:"subagents,omitempty"` +} + // Accumulated session usage metrics, including premium request cost, token counts, model // breakdown, and code-change totals. // Experimental: UsageGetMetricsResult is part of an experimental API and may change or be @@ -8797,13 +8888,19 @@ const ( EventsCursorStatusOk EventsCursorStatus = "ok" ) -// Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/) +// Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin +// (installed plugin), or session (session-state//extensions/) // Experimental: ExtensionSource is part of an experimental API and may change or be removed. type ExtensionSource string const ( + // Extension contributed by an installed plugin. + ExtensionSourcePlugin ExtensionSource = "plugin" // Extension discovered from the current project's .github/extensions directory. ExtensionSourceProject ExtensionSource = "project" + // Extension discovered from the current session's state directory (loaded only for this + // session). + ExtensionSourceSession ExtensionSource = "session" // Extension discovered from the user's ~/.copilot/extensions directory. ExtensionSourceUser ExtensionSource = "user" ) @@ -9416,6 +9513,32 @@ const ( ProviderConfigWireAPIResponses ProviderConfigWireAPI = "responses" ) +// Provider family. Matches the `type` field of a BYOK provider config. +// Experimental: ProviderEndpointType is part of an experimental API and may change or be +// removed. +type ProviderEndpointType string + +const ( + // Anthropic endpoint (use the Anthropic client library). + ProviderEndpointTypeAnthropic ProviderEndpointType = "anthropic" + // Azure OpenAI endpoint (use the OpenAI client library with the Azure base URL). + ProviderEndpointTypeAzure ProviderEndpointType = "azure" + // OpenAI-compatible endpoint (use the OpenAI client library). + ProviderEndpointTypeOpenai ProviderEndpointType = "openai" +) + +// Wire API to be used, when required for the provider type. +// Experimental: ProviderEndpointWireAPI is part of an experimental API and may change or be +// removed. +type ProviderEndpointWireAPI string + +const ( + // Classic chat-completions request shape. + ProviderEndpointWireAPICompletions ProviderEndpointWireAPI = "completions" + // Newer responses request shape. + ProviderEndpointWireAPIResponses ProviderEndpointWireAPI = "responses" +) + // Type of GitHub reference // Experimental: PushAttachmentGitHubReferenceType is part of an experimental API and may // change or be removed. @@ -9891,6 +10014,20 @@ const ( SlashCommandKindSkill SlashCommandKind = "skill" ) +// Context tier override for matching subagents +// Experimental: SubagentSettingsEntryContextTier is part of an experimental API and may +// change or be removed. +type SubagentSettingsEntryContextTier string + +const ( + // Use the model's default context window. + SubagentSettingsEntryContextTierDefault SubagentSettingsEntryContextTier = "default" + // Inherit the parent session's effective context tier at dispatch time. + SubagentSettingsEntryContextTierInherit SubagentSettingsEntryContextTier = "inherit" + // Pin the subagent to the long-context tier when supported. + SubagentSettingsEntryContextTierLongContext SubagentSettingsEntryContextTier = "long_context" +) + // Whether task execution is synchronously awaited or managed in the background // Experimental: TaskExecutionMode is part of an experimental API and may change or be // removed. @@ -10129,7 +10266,7 @@ type ServerAccountAPI serverAPI // // Returns: Quota usage snapshots for the resolved user, keyed by quota type. func (a *ServerAccountAPI) GetQuota(ctx context.Context, params *AccountGetQuotaRequest) (*AccountGetQuotaResult, error) { - raw, err := a.client.Request("account.getQuota", params) + raw, err := a.client.Request(ctx, "account.getQuota", params) if err != nil { return nil, err } @@ -10155,7 +10292,7 @@ type ServerAgentRegistryAPI serverAPI // // Returns: Outcome of an agentRegistry.spawn call. func (a *ServerAgentRegistryAPI) Spawn(ctx context.Context, params *AgentRegistrySpawnRequest) (AgentRegistrySpawnResult, error) { - raw, err := a.client.Request("agentRegistry.spawn", params) + raw, err := a.client.Request(ctx, "agentRegistry.spawn", params) if err != nil { return nil, err } @@ -10177,7 +10314,7 @@ type ServerAgentsAPI serverAPI // // Returns: Agents discovered across user, project, plugin, and remote sources. func (a *ServerAgentsAPI) Discover(ctx context.Context, params *AgentsDiscoverRequest) (*ServerAgentList, error) { - raw, err := a.client.Request("agents.discover", params) + raw, err := a.client.Request(ctx, "agents.discover", params) if err != nil { return nil, err } @@ -10200,7 +10337,7 @@ type ServerInstructionsAPI serverAPI // // Returns: Instruction sources discovered across user, repository, and plugin sources. func (a *ServerInstructionsAPI) Discover(ctx context.Context, params *InstructionsDiscoverRequest) (*ServerInstructionSourceList, error) { - raw, err := a.client.Request("instructions.discover", params) + raw, err := a.client.Request(ctx, "instructions.discover", params) if err != nil { return nil, err } @@ -10221,7 +10358,7 @@ type ServerMCPAPI serverAPI // // Returns: MCP servers discovered from user, workspace, plugin, and built-in sources. func (a *ServerMCPAPI) Discover(ctx context.Context, params *MCPDiscoverRequest) (*MCPDiscoverResult, error) { - raw, err := a.client.Request("mcp.discover", params) + raw, err := a.client.Request(ctx, "mcp.discover", params) if err != nil { return nil, err } @@ -10240,7 +10377,7 @@ type ServerMCPConfigAPI serverAPI // // Parameters: MCP server name and configuration to add to user configuration. func (a *ServerMCPConfigAPI) Add(ctx context.Context, params *MCPConfigAddRequest) (*MCPConfigAddResult, error) { - raw, err := a.client.Request("mcp.config.add", params) + raw, err := a.client.Request(ctx, "mcp.config.add", params) if err != nil { return nil, err } @@ -10257,7 +10394,7 @@ func (a *ServerMCPConfigAPI) Add(ctx context.Context, params *MCPConfigAddReques // // Parameters: MCP server names to disable for new sessions. func (a *ServerMCPConfigAPI) Disable(ctx context.Context, params *MCPConfigDisableRequest) (*MCPConfigDisableResult, error) { - raw, err := a.client.Request("mcp.config.disable", params) + raw, err := a.client.Request(ctx, "mcp.config.disable", params) if err != nil { return nil, err } @@ -10274,7 +10411,7 @@ func (a *ServerMCPConfigAPI) Disable(ctx context.Context, params *MCPConfigDisab // // Parameters: MCP server names to enable for new sessions. func (a *ServerMCPConfigAPI) Enable(ctx context.Context, params *MCPConfigEnableRequest) (*MCPConfigEnableResult, error) { - raw, err := a.client.Request("mcp.config.enable", params) + raw, err := a.client.Request(ctx, "mcp.config.enable", params) if err != nil { return nil, err } @@ -10291,7 +10428,7 @@ func (a *ServerMCPConfigAPI) Enable(ctx context.Context, params *MCPConfigEnable // // Returns: User-configured MCP servers, keyed by server name. func (a *ServerMCPConfigAPI) List(ctx context.Context) (*MCPConfigList, error) { - raw, err := a.client.Request("mcp.config.list", nil) + raw, err := a.client.Request(ctx, "mcp.config.list", nil) if err != nil { return nil, err } @@ -10307,7 +10444,7 @@ func (a *ServerMCPConfigAPI) List(ctx context.Context) (*MCPConfigList, error) { // // RPC method: mcp.config.reload. func (a *ServerMCPConfigAPI) Reload(ctx context.Context) (*MCPConfigReloadResult, error) { - raw, err := a.client.Request("mcp.config.reload", nil) + raw, err := a.client.Request(ctx, "mcp.config.reload", nil) if err != nil { return nil, err } @@ -10324,7 +10461,7 @@ func (a *ServerMCPConfigAPI) Reload(ctx context.Context) (*MCPConfigReloadResult // // Parameters: MCP server name to remove from user configuration. func (a *ServerMCPConfigAPI) Remove(ctx context.Context, params *MCPConfigRemoveRequest) (*MCPConfigRemoveResult, error) { - raw, err := a.client.Request("mcp.config.remove", params) + raw, err := a.client.Request(ctx, "mcp.config.remove", params) if err != nil { return nil, err } @@ -10341,7 +10478,7 @@ func (a *ServerMCPConfigAPI) Remove(ctx context.Context, params *MCPConfigRemove // // Parameters: MCP server name and replacement configuration to write to user configuration. func (a *ServerMCPConfigAPI) Update(ctx context.Context, params *MCPConfigUpdateRequest) (*MCPConfigUpdateResult, error) { - raw, err := a.client.Request("mcp.config.update", params) + raw, err := a.client.Request(ctx, "mcp.config.update", params) if err != nil { return nil, err } @@ -10368,7 +10505,7 @@ type ServerModelsAPI serverAPI // Returns: List of Copilot models available to the resolved user, including capabilities // and billing metadata. func (a *ServerModelsAPI) List(ctx context.Context, params *ModelsListRequest) (*ModelList, error) { - raw, err := a.client.Request("models.list", params) + raw, err := a.client.Request(ctx, "models.list", params) if err != nil { return nil, err } @@ -10388,7 +10525,7 @@ type ServerPluginsAPI serverAPI // // Parameters: Plugin names (or specs) to disable. func (a *ServerPluginsAPI) Disable(ctx context.Context, params *PluginsDisableRequest) (*PluginsDisableResult, error) { - raw, err := a.client.Request("plugins.disable", params) + raw, err := a.client.Request(ctx, "plugins.disable", params) if err != nil { return nil, err } @@ -10405,7 +10542,7 @@ func (a *ServerPluginsAPI) Disable(ctx context.Context, params *PluginsDisableRe // // Parameters: Plugin names (or specs) to enable. func (a *ServerPluginsAPI) Enable(ctx context.Context, params *PluginsEnableRequest) (*PluginsEnableResult, error) { - raw, err := a.client.Request("plugins.enable", params) + raw, err := a.client.Request(ctx, "plugins.enable", params) if err != nil { return nil, err } @@ -10424,7 +10561,7 @@ func (a *ServerPluginsAPI) Enable(ctx context.Context, params *PluginsEnableRequ // // Returns: Result of installing a plugin. func (a *ServerPluginsAPI) Install(ctx context.Context, params *PluginsInstallRequest) (*PluginInstallResult, error) { - raw, err := a.client.Request("plugins.install", params) + raw, err := a.client.Request(ctx, "plugins.install", params) if err != nil { return nil, err } @@ -10441,7 +10578,7 @@ func (a *ServerPluginsAPI) Install(ctx context.Context, params *PluginsInstallRe // // Returns: Plugins installed in user/global state. func (a *ServerPluginsAPI) List(ctx context.Context) (*PluginListResult, error) { - raw, err := a.client.Request("plugins.list", nil) + raw, err := a.client.Request(ctx, "plugins.list", nil) if err != nil { return nil, err } @@ -10458,7 +10595,7 @@ func (a *ServerPluginsAPI) List(ctx context.Context) (*PluginListResult, error) // // Parameters: Name (or spec) of the plugin to uninstall. func (a *ServerPluginsAPI) Uninstall(ctx context.Context, params *PluginsUninstallRequest) (*PluginsUninstallResult, error) { - raw, err := a.client.Request("plugins.uninstall", params) + raw, err := a.client.Request(ctx, "plugins.uninstall", params) if err != nil { return nil, err } @@ -10477,7 +10614,7 @@ func (a *ServerPluginsAPI) Uninstall(ctx context.Context, params *PluginsUninsta // // Returns: Result of updating a single plugin. func (a *ServerPluginsAPI) Update(ctx context.Context, params *PluginsUpdateRequest) (*PluginUpdateResult, error) { - raw, err := a.client.Request("plugins.update", params) + raw, err := a.client.Request(ctx, "plugins.update", params) if err != nil { return nil, err } @@ -10494,7 +10631,7 @@ func (a *ServerPluginsAPI) Update(ctx context.Context, params *PluginsUpdateRequ // // Returns: Result of updating all installed plugins. func (a *ServerPluginsAPI) UpdateAll(ctx context.Context) (*PluginUpdateAllResult, error) { - raw, err := a.client.Request("plugins.updateAll", nil) + raw, err := a.client.Request(ctx, "plugins.updateAll", nil) if err != nil { return nil, err } @@ -10517,7 +10654,7 @@ type ServerPluginsMarketplacesAPI serverAPI // // Returns: Result of registering a new marketplace. func (a *ServerPluginsMarketplacesAPI) Add(ctx context.Context, params *PluginsMarketplacesAddRequest) (*MarketplaceAddResult, error) { - raw, err := a.client.Request("plugins.marketplaces.add", params) + raw, err := a.client.Request(ctx, "plugins.marketplaces.add", params) if err != nil { return nil, err } @@ -10536,7 +10673,7 @@ func (a *ServerPluginsMarketplacesAPI) Add(ctx context.Context, params *PluginsM // // Returns: Plugins advertised by the marketplace. func (a *ServerPluginsMarketplacesAPI) Browse(ctx context.Context, params *PluginsMarketplacesBrowseRequest) (*MarketplaceBrowseResult, error) { - raw, err := a.client.Request("plugins.marketplaces.browse", params) + raw, err := a.client.Request(ctx, "plugins.marketplaces.browse", params) if err != nil { return nil, err } @@ -10553,7 +10690,7 @@ func (a *ServerPluginsMarketplacesAPI) Browse(ctx context.Context, params *Plugi // // Returns: All registered marketplaces, including built-in defaults. func (a *ServerPluginsMarketplacesAPI) List(ctx context.Context) (*MarketplaceListResult, error) { - raw, err := a.client.Request("plugins.marketplaces.list", nil) + raw, err := a.client.Request(ctx, "plugins.marketplaces.list", nil) if err != nil { return nil, err } @@ -10572,7 +10709,7 @@ func (a *ServerPluginsMarketplacesAPI) List(ctx context.Context) (*MarketplaceLi // // Returns: Result of refreshing one or more marketplace catalogs. func (a *ServerPluginsMarketplacesAPI) Refresh(ctx context.Context, params *PluginsMarketplacesRefreshRequest) (*MarketplaceRefreshResult, error) { - raw, err := a.client.Request("plugins.marketplaces.refresh", params) + raw, err := a.client.Request(ctx, "plugins.marketplaces.refresh", params) if err != nil { return nil, err } @@ -10593,7 +10730,7 @@ func (a *ServerPluginsMarketplacesAPI) Refresh(ctx context.Context, params *Plug // // Returns: Outcome of the remove attempt, including dependent-plugin info when applicable. func (a *ServerPluginsMarketplacesAPI) Remove(ctx context.Context, params *PluginsMarketplacesRemoveRequest) (*MarketplaceRemoveResult, error) { - raw, err := a.client.Request("plugins.marketplaces.remove", params) + raw, err := a.client.Request(ctx, "plugins.marketplaces.remove", params) if err != nil { return nil, err } @@ -10616,7 +10753,7 @@ type ServerRuntimeAPI serverAPI // // RPC method: runtime.shutdown. func (a *ServerRuntimeAPI) Shutdown(ctx context.Context) (*RuntimeShutdownResult, error) { - raw, err := a.client.Request("runtime.shutdown", nil) + raw, err := a.client.Request(ctx, "runtime.shutdown", nil) if err != nil { return nil, err } @@ -10638,7 +10775,7 @@ type ServerSecretsAPI serverAPI // // Returns: Confirmation that the secret values were registered. func (a *ServerSecretsAPI) AddFilterValues(ctx context.Context, params *SecretsAddFilterValuesRequest) (*SecretsAddFilterValuesResult, error) { - raw, err := a.client.Request("secrets.addFilterValues", params) + raw, err := a.client.Request(ctx, "secrets.addFilterValues", params) if err != nil { return nil, err } @@ -10661,7 +10798,7 @@ type ServerSessionFSAPI serverAPI // Returns: Indicates whether the calling client was registered as the session filesystem // provider. func (a *ServerSessionFSAPI) SetProvider(ctx context.Context, params *SessionFSSetProviderRequest) (*SessionFSSetProviderResult, error) { - raw, err := a.client.Request("sessionFs.setProvider", params) + raw, err := a.client.Request(ctx, "sessionFs.setProvider", params) if err != nil { return nil, err } @@ -10684,7 +10821,7 @@ type ServerSessionsAPI serverAPI // // Returns: Map of sessionId -> bytes freed by removing the session's workspace directory. func (a *ServerSessionsAPI) BulkDelete(ctx context.Context, params *SessionsBulkDeleteRequest) (*SessionBulkDeleteResult, error) { - raw, err := a.client.Request("sessions.bulkDelete", params) + raw, err := a.client.Request(ctx, "sessions.bulkDelete", params) if err != nil { return nil, err } @@ -10704,7 +10841,7 @@ func (a *ServerSessionsAPI) BulkDelete(ctx context.Context, params *SessionsBulk // // Returns: Session IDs from the input set that are currently in use by another process. func (a *ServerSessionsAPI) CheckInUse(ctx context.Context, params *SessionsCheckInUseRequest) (*SessionsCheckInUseResult, error) { - raw, err := a.client.Request("sessions.checkInUse", params) + raw, err := a.client.Request(ctx, "sessions.checkInUse", params) if err != nil { return nil, err } @@ -10726,7 +10863,7 @@ func (a *ServerSessionsAPI) CheckInUse(ctx context.Context, params *SessionsChec // in-use lock, disposes the active session. Idempotent: succeeds even if the session is not // currently active. func (a *ServerSessionsAPI) Close(ctx context.Context, params *SessionsCloseRequest) (*SessionsCloseResult, error) { - raw, err := a.client.Request("sessions.close", params) + raw, err := a.client.Request(ctx, "sessions.close", params) if err != nil { return nil, err } @@ -10745,7 +10882,7 @@ func (a *ServerSessionsAPI) Close(ctx context.Context, params *SessionsCloseRequ // // Returns: Remote session connection result. func (a *ServerSessionsAPI) Connect(ctx context.Context, params *ConnectRemoteSessionParams) (*RemoteSessionConnectionResult, error) { - raw, err := a.client.Request("sessions.connect", params) + raw, err := a.client.Request(ctx, "sessions.connect", params) if err != nil { return nil, err } @@ -10766,7 +10903,7 @@ func (a *ServerSessionsAPI) Connect(ctx context.Context, params *ConnectRemoteSe // Returns: The enriched metadata records, with summary and context fields backfilled where // available. Sessions confirmed empty and unnamed are omitted. func (a *ServerSessionsAPI) EnrichMetadata(ctx context.Context, params *SessionsEnrichMetadataRequest) (*SessionEnrichMetadataResult, error) { - raw, err := a.client.Request("sessions.enrichMetadata", params) + raw, err := a.client.Request(ctx, "sessions.enrichMetadata", params) if err != nil { return nil, err } @@ -10786,7 +10923,7 @@ func (a *ServerSessionsAPI) EnrichMetadata(ctx context.Context, params *Sessions // // Returns: Session ID matching the prefix, omitted when no unique match exists. func (a *ServerSessionsAPI) FindByPrefix(ctx context.Context, params *SessionsFindByPrefixRequest) (*SessionsFindByPrefixResult, error) { - raw, err := a.client.Request("sessions.findByPrefix", params) + raw, err := a.client.Request(ctx, "sessions.findByPrefix", params) if err != nil { return nil, err } @@ -10805,7 +10942,7 @@ func (a *ServerSessionsAPI) FindByPrefix(ctx context.Context, params *SessionsFi // // Returns: ID of the local session bound to the given GitHub task, or omitted when none. func (a *ServerSessionsAPI) FindByTaskId(ctx context.Context, params *SessionsFindByTaskIDRequest) (*SessionsFindByTaskIDResult, error) { - raw, err := a.client.Request("sessions.findByTaskId", params) + raw, err := a.client.Request(ctx, "sessions.findByTaskId", params) if err != nil { return nil, err } @@ -10825,7 +10962,7 @@ func (a *ServerSessionsAPI) FindByTaskId(ctx context.Context, params *SessionsFi // // Returns: Identifier and optional friendly name assigned to the newly forked session. func (a *ServerSessionsAPI) Fork(ctx context.Context, params *SessionsForkRequest) (*SessionsForkResult, error) { - raw, err := a.client.Request("sessions.fork", params) + raw, err := a.client.Request(ctx, "sessions.fork", params) if err != nil { return nil, err } @@ -10846,7 +10983,7 @@ func (a *ServerSessionsAPI) Fork(ctx context.Context, params *SessionsForkReques // Returns: Most-relevant session ID for the supplied context, or omitted when no sessions // exist. func (a *ServerSessionsAPI) GetLastForContext(ctx context.Context, params *SessionsGetLastForContextRequest) (*SessionsGetLastForContextResult, error) { - raw, err := a.client.Request("sessions.getLastForContext", params) + raw, err := a.client.Request(ctx, "sessions.getLastForContext", params) if err != nil { return nil, err } @@ -10864,7 +11001,7 @@ func (a *ServerSessionsAPI) GetLastForContext(ctx context.Context, params *Sessi // // Returns: Wrapper for the singleton's current status. func (a *ServerSessionsAPI) GetRemoteControlStatus(ctx context.Context) (*RemoteControlStatusResult, error) { - raw, err := a.client.Request("sessions.getRemoteControlStatus", nil) + raw, err := a.client.Request(ctx, "sessions.getRemoteControlStatus", nil) if err != nil { return nil, err } @@ -10881,7 +11018,7 @@ func (a *ServerSessionsAPI) GetRemoteControlStatus(ctx context.Context) (*Remote // // Returns: Map of sessionId -> on-disk size in bytes for each session's workspace directory. func (a *ServerSessionsAPI) GetSizes(ctx context.Context) (*SessionSizes, error) { - raw, err := a.client.Request("sessions.getSizes", nil) + raw, err := a.client.Request(ctx, "sessions.getSizes", nil) if err != nil { return nil, err } @@ -10904,7 +11041,7 @@ func (a *ServerSessionsAPI) GetSizes(ctx context.Context) (*SessionSizes, error) // // Returns: Sessions matching the filter, ordered most-recently-modified first. func (a *ServerSessionsAPI) List(ctx context.Context, params *SessionsListRequest) (*SessionList, error) { - raw, err := a.client.Request("sessions.list", params) + raw, err := a.client.Request(ctx, "sessions.list", params) if err != nil { return nil, err } @@ -10924,7 +11061,7 @@ func (a *ServerSessionsAPI) List(ctx context.Context, params *SessionsListReques // // Returns: Queued repo-level startup prompts and the total hook command count after loading. func (a *ServerSessionsAPI) LoadDeferredRepoHooks(ctx context.Context, params *SessionsLoadDeferredRepoHooksRequest) (*SessionLoadDeferredRepoHooksResult, error) { - raw, err := a.client.Request("sessions.loadDeferredRepoHooks", params) + raw, err := a.client.Request(ctx, "sessions.loadDeferredRepoHooks", params) if err != nil { return nil, err } @@ -10944,7 +11081,7 @@ func (a *ServerSessionsAPI) LoadDeferredRepoHooks(ctx context.Context, params *S // // Returns: Result of opening a session. func (a *ServerSessionsAPI) Open(ctx context.Context, params *SessionOpenParams) (*SessionOpenResult, error) { - raw, err := a.client.Request("sessions.open", params) + raw, err := a.client.Request(ctx, "sessions.open", params) if err != nil { return nil, err } @@ -10966,7 +11103,7 @@ func (a *ServerSessionsAPI) Open(ctx context.Context, params *SessionOpenParams) // Returns: Outcome of the prune operation: deleted IDs, dry-run candidates, skipped IDs, // total bytes freed, and the dry-run flag. func (a *ServerSessionsAPI) PruneOld(ctx context.Context, params *SessionsPruneOldRequest) (*SessionPruneResult, error) { - raw, err := a.client.Request("sessions.pruneOld", params) + raw, err := a.client.Request(ctx, "sessions.pruneOld", params) if err != nil { return nil, err } @@ -10986,7 +11123,7 @@ func (a *ServerSessionsAPI) PruneOld(ctx context.Context, params *SessionsPruneO // Returns: Release the in-use lock held by this process for the given session. No-op when // this process does not currently hold a lock for the session. func (a *ServerSessionsAPI) ReleaseLock(ctx context.Context, params *SessionsReleaseLockRequest) (*SessionsReleaseLockResult, error) { - raw, err := a.client.Request("sessions.releaseLock", params) + raw, err := a.client.Request(ctx, "sessions.releaseLock", params) if err != nil { return nil, err } @@ -11008,7 +11145,7 @@ func (a *ServerSessionsAPI) ReleaseLock(ctx context.Context, params *SessionsRel // session. Call after installing or removing plugins so their hooks take effect // immediately. No-op when no active session matches the given sessionId. func (a *ServerSessionsAPI) ReloadPluginHooks(ctx context.Context, params *SessionsReloadPluginHooksRequest) (*SessionsReloadPluginHooksResult, error) { - raw, err := a.client.Request("sessions.reloadPluginHooks", params) + raw, err := a.client.Request(ctx, "sessions.reloadPluginHooks", params) if err != nil { return nil, err } @@ -11028,7 +11165,7 @@ func (a *ServerSessionsAPI) ReloadPluginHooks(ctx context.Context, params *Sessi // Returns: Flush a session's pending events to disk. No-op when no writer exists for the // session (e.g., already closed). func (a *ServerSessionsAPI) Save(ctx context.Context, params *SessionsSaveRequest) (*SessionsSaveResult, error) { - raw, err := a.client.Request("sessions.save", params) + raw, err := a.client.Request(ctx, "sessions.save", params) if err != nil { return nil, err } @@ -11051,7 +11188,7 @@ func (a *ServerSessionsAPI) Save(ctx context.Context, params *SessionsSaveReques // subsequent hook reloads see the new set; already-running sessions keep their existing // hook installation until the next reload. func (a *ServerSessionsAPI) SetAdditionalPlugins(ctx context.Context, params *SessionsSetAdditionalPluginsRequest) (*SessionsSetAdditionalPluginsResult, error) { - raw, err := a.client.Request("sessions.setAdditionalPlugins", params) + raw, err := a.client.Request(ctx, "sessions.setAdditionalPlugins", params) if err != nil { return nil, err } @@ -11073,7 +11210,7 @@ func (a *ServerSessionsAPI) SetAdditionalPlugins(ctx context.Context, params *Se // // Returns: Wrapper for the singleton's current status. func (a *ServerSessionsAPI) SetRemoteControlSteering(ctx context.Context, params *SessionsSetRemoteControlSteeringRequest) (*RemoteControlStatusResult, error) { - raw, err := a.client.Request("sessions.setRemoteControlSteering", params) + raw, err := a.client.Request(ctx, "sessions.setRemoteControlSteering", params) if err != nil { return nil, err } @@ -11095,7 +11232,7 @@ func (a *ServerSessionsAPI) SetRemoteControlSteering(ctx context.Context, params // // Returns: Wrapper for the singleton's current status. func (a *ServerSessionsAPI) StartRemoteControl(ctx context.Context, params *SessionsStartRemoteControlRequest) (*RemoteControlStatusResult, error) { - raw, err := a.client.Request("sessions.startRemoteControl", params) + raw, err := a.client.Request(ctx, "sessions.startRemoteControl", params) if err != nil { return nil, err } @@ -11117,7 +11254,7 @@ func (a *ServerSessionsAPI) StartRemoteControl(ctx context.Context, params *Sess // // Returns: Outcome of a stopRemoteControl call. func (a *ServerSessionsAPI) StopRemoteControl(ctx context.Context, params *SessionsStopRemoteControlRequest) (*RemoteControlStopResult, error) { - raw, err := a.client.Request("sessions.stopRemoteControl", params) + raw, err := a.client.Request(ctx, "sessions.stopRemoteControl", params) if err != nil { return nil, err } @@ -11140,7 +11277,7 @@ func (a *ServerSessionsAPI) StopRemoteControl(ctx context.Context, params *Sessi // // Returns: Outcome of a transferRemoteControl call. func (a *ServerSessionsAPI) TransferRemoteControl(ctx context.Context, params *SessionsTransferRemoteControlRequest) (*RemoteControlTransferResult, error) { - raw, err := a.client.Request("sessions.transferRemoteControl", params) + raw, err := a.client.Request(ctx, "sessions.transferRemoteControl", params) if err != nil { return nil, err } @@ -11162,7 +11299,7 @@ type ServerSkillsAPI serverAPI // // Returns: Skills discovered across global and project sources. func (a *ServerSkillsAPI) Discover(ctx context.Context, params *SkillsDiscoverRequest) (*ServerSkillList, error) { - raw, err := a.client.Request("skills.discover", params) + raw, err := a.client.Request(ctx, "skills.discover", params) if err != nil { return nil, err } @@ -11182,7 +11319,7 @@ type ServerSkillsConfigAPI serverAPI // Parameters: Skill names to mark as disabled in global configuration, replacing any // previous list. func (a *ServerSkillsConfigAPI) SetDisabledSkills(ctx context.Context, params *SkillsConfigSetDisabledSkillsRequest) (*SkillsConfigSetDisabledSkillsResult, error) { - raw, err := a.client.Request("skills.config.setDisabledSkills", params) + raw, err := a.client.Request(ctx, "skills.config.setDisabledSkills", params) if err != nil { return nil, err } @@ -11209,7 +11346,7 @@ type ServerToolsAPI serverAPI // Returns: Built-in tools available for the requested model, with their parameters and // instructions. func (a *ServerToolsAPI) List(ctx context.Context, params *ToolsListRequest) (*ToolList, error) { - raw, err := a.client.Request("tools.list", params) + raw, err := a.client.Request(ctx, "tools.list", params) if err != nil { return nil, err } @@ -11229,7 +11366,7 @@ type ServerUserSettingsAPI serverAPI // // RPC method: user.settings.reload. func (a *ServerUserSettingsAPI) Reload(ctx context.Context) (*UserSettingsReloadResult, error) { - raw, err := a.client.Request("user.settings.reload", nil) + raw, err := a.client.Request(ctx, "user.settings.reload", nil) if err != nil { return nil, err } @@ -11274,7 +11411,7 @@ type ServerRPC struct { // Returns: Server liveness response, including the echoed message, current server // timestamp, and protocol version. func (a *ServerRPC) Ping(ctx context.Context, params *PingRequest) (*PingResult, error) { - raw, err := a.common.client.Request("ping", params) + raw, err := a.common.client.Request(ctx, "ping", params) if err != nil { return nil, err } @@ -11327,7 +11464,7 @@ type InternalServerSessionsAPI internalServerAPI // Internal: ConfigureSessionExtensions is part of the SDK's internal handshake/plumbing; // external callers should not use it. func (a *InternalServerSessionsAPI) ConfigureSessionExtensions(ctx context.Context, params *ConfigureSessionExtensionsParams) (*SessionsConfigureSessionExtensionsResult, error) { - raw, err := a.client.Request("sessions.configureSessionExtensions", params) + raw, err := a.client.Request(ctx, "sessions.configureSessionExtensions", params) if err != nil { return nil, err } @@ -11353,7 +11490,7 @@ func (a *InternalServerSessionsAPI) ConfigureSessionExtensions(ctx context.Conte // Internal: GetBoardEntryCount is part of the SDK's internal handshake/plumbing; external // callers should not use it. func (a *InternalServerSessionsAPI) GetBoardEntryCount(ctx context.Context, params *SessionsGetBoardEntryCountRequest) (*SessionsGetBoardEntryCountResult, error) { - raw, err := a.client.Request("sessions.getBoardEntryCount", params) + raw, err := a.client.Request(ctx, "sessions.getBoardEntryCount", params) if err != nil { return nil, err } @@ -11378,7 +11515,7 @@ func (a *InternalServerSessionsAPI) GetBoardEntryCount(ctx context.Context, para // Internal: GetEventFilePath is part of the SDK's internal handshake/plumbing; external // callers should not use it. func (a *InternalServerSessionsAPI) GetEventFilePath(ctx context.Context, params *SessionsGetEventFilePathRequest) (*SessionsGetEventFilePathResult, error) { - raw, err := a.client.Request("sessions.getEventFilePath", params) + raw, err := a.client.Request(ctx, "sessions.getEventFilePath", params) if err != nil { return nil, err } @@ -11404,7 +11541,7 @@ func (a *InternalServerSessionsAPI) GetEventFilePath(ctx context.Context, params // Internal: GetPersistedRemoteSteerable is part of the SDK's internal handshake/plumbing; // external callers should not use it. func (a *InternalServerSessionsAPI) GetPersistedRemoteSteerable(ctx context.Context, params *SessionsGetPersistedRemoteSteerableRequest) (*SessionsGetPersistedRemoteSteerableResult, error) { - raw, err := a.client.Request("sessions.getPersistedRemoteSteerable", params) + raw, err := a.client.Request(ctx, "sessions.getPersistedRemoteSteerable", params) if err != nil { return nil, err } @@ -11431,7 +11568,7 @@ func (a *InternalServerSessionsAPI) GetPersistedRemoteSteerable(ctx context.Cont // Internal: PollSpawnedSessions is part of the SDK's internal handshake/plumbing; external // callers should not use it. func (a *InternalServerSessionsAPI) PollSpawnedSessions(ctx context.Context, params *SessionsPollSpawnedSessionsRequest) (*PollSpawnedSessionsResult, error) { - raw, err := a.client.Request("sessions.pollSpawnedSessions", params) + raw, err := a.client.Request(ctx, "sessions.pollSpawnedSessions", params) if err != nil { return nil, err } @@ -11459,7 +11596,7 @@ func (a *InternalServerSessionsAPI) PollSpawnedSessions(ctx context.Context, par // Internal: RegisterExtensionToolsOnSession is part of the SDK's internal // handshake/plumbing; external callers should not use it. func (a *InternalServerSessionsAPI) RegisterExtensionToolsOnSession(ctx context.Context, params *RegisterExtensionToolsParams) (*RegisterExtensionToolsResult, error) { - raw, err := a.client.Request("sessions.registerExtensionToolsOnSession", params) + raw, err := a.client.Request(ctx, "sessions.registerExtensionToolsOnSession", params) if err != nil { return nil, err } @@ -11494,7 +11631,7 @@ type InternalServerRPC struct { // Internal: Connect is part of the SDK's internal handshake/plumbing; external callers // should not use it. func (a *InternalServerRPC) Connect(ctx context.Context, params *ConnectRequest) (*ConnectResult, error) { - raw, err := a.common.client.Request("connect", params) + raw, err := a.common.client.Request(ctx, "connect", params) if err != nil { return nil, err } @@ -11525,7 +11662,7 @@ type AgentAPI sessionAPI // RPC method: session.agent.deselect. func (a *AgentAPI) Deselect(ctx context.Context) (*SessionAgentDeselectResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.agent.deselect", req) + raw, err := a.client.Request(ctx, "session.agent.deselect", req) if err != nil { return nil, err } @@ -11543,7 +11680,7 @@ func (a *AgentAPI) Deselect(ctx context.Context) (*SessionAgentDeselectResult, e // Returns: The currently selected custom agent, or null when using the default agent. func (a *AgentAPI) GetCurrent(ctx context.Context) (*AgentGetCurrentResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.agent.getCurrent", req) + raw, err := a.client.Request(ctx, "session.agent.getCurrent", req) if err != nil { return nil, err } @@ -11561,7 +11698,7 @@ func (a *AgentAPI) GetCurrent(ctx context.Context) (*AgentGetCurrentResult, erro // Returns: Custom agents available to the session. func (a *AgentAPI) List(ctx context.Context) (*AgentList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.agent.list", req) + raw, err := a.client.Request(ctx, "session.agent.list", req) if err != nil { return nil, err } @@ -11579,7 +11716,7 @@ func (a *AgentAPI) List(ctx context.Context) (*AgentList, error) { // Returns: Custom agents available to the session after reloading definitions from disk. func (a *AgentAPI) Reload(ctx context.Context) (*AgentReloadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.agent.reload", req) + raw, err := a.client.Request(ctx, "session.agent.reload", req) if err != nil { return nil, err } @@ -11602,7 +11739,7 @@ func (a *AgentAPI) Select(ctx context.Context, params *AgentSelectRequest) (*Age if params != nil { req["name"] = params.Name } - raw, err := a.client.Request("session.agent.select", req) + raw, err := a.client.Request(ctx, "session.agent.select", req) if err != nil { return nil, err } @@ -11623,7 +11760,7 @@ type AuthAPI sessionAPI // Returns: Authentication status and account metadata for the session. func (a *AuthAPI) GetStatus(ctx context.Context) (*SessionAuthStatus, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.auth.getStatus", req) + raw, err := a.client.Request(ctx, "session.auth.getStatus", req) if err != nil { return nil, err } @@ -11650,7 +11787,7 @@ func (a *AuthAPI) SetCredentials(ctx context.Context, params *SessionSetCredenti req["credentials"] = params.Credentials } } - raw, err := a.client.Request("session.auth.setCredentials", req) + raw, err := a.client.Request(ctx, "session.auth.setCredentials", req) if err != nil { return nil, err } @@ -11674,7 +11811,7 @@ func (a *CanvasAPI) Close(ctx context.Context, params *CanvasCloseRequest) (*Ses if params != nil { req["instanceId"] = params.InstanceID } - raw, err := a.client.Request("session.canvas.close", req) + raw, err := a.client.Request(ctx, "session.canvas.close", req) if err != nil { return nil, err } @@ -11692,7 +11829,7 @@ func (a *CanvasAPI) Close(ctx context.Context, params *CanvasCloseRequest) (*Ses // Returns: Declared canvases available in this session. func (a *CanvasAPI) List(ctx context.Context) (*CanvasList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.canvas.list", req) + raw, err := a.client.Request(ctx, "session.canvas.list", req) if err != nil { return nil, err } @@ -11710,7 +11847,7 @@ func (a *CanvasAPI) List(ctx context.Context) (*CanvasList, error) { // Returns: Live open-canvas snapshot. func (a *CanvasAPI) ListOpen(ctx context.Context) (*CanvasListOpenResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.canvas.listOpen", req) + raw, err := a.client.Request(ctx, "session.canvas.listOpen", req) if err != nil { return nil, err } @@ -11740,7 +11877,7 @@ func (a *CanvasAPI) Open(ctx context.Context, params *CanvasOpenRequest) (*OpenC } req["instanceId"] = params.InstanceID } - raw, err := a.client.Request("session.canvas.open", req) + raw, err := a.client.Request(ctx, "session.canvas.open", req) if err != nil { return nil, err } @@ -11770,7 +11907,7 @@ func (a *CanvasActionAPI) Invoke(ctx context.Context, params *CanvasActionInvoke } req["instanceId"] = params.InstanceID } - raw, err := a.client.Request("session.canvas.action.invoke", req) + raw, err := a.client.Request(ctx, "session.canvas.action.invoke", req) if err != nil { return nil, err } @@ -11801,7 +11938,7 @@ func (a *CommandsAPI) Enqueue(ctx context.Context, params *EnqueueCommandParams) if params != nil { req["command"] = params.Command } - raw, err := a.client.Request("session.commands.enqueue", req) + raw, err := a.client.Request(ctx, "session.commands.enqueue", req) if err != nil { return nil, err } @@ -11825,7 +11962,7 @@ func (a *CommandsAPI) Execute(ctx context.Context, params *ExecuteCommandParams) req["args"] = params.Args req["commandName"] = params.CommandName } - raw, err := a.client.Request("session.commands.execute", req) + raw, err := a.client.Request(ctx, "session.commands.execute", req) if err != nil { return nil, err } @@ -11851,7 +11988,7 @@ func (a *CommandsAPI) HandlePendingCommand(ctx context.Context, params *Commands } req["requestId"] = params.RequestID } - raw, err := a.client.Request("session.commands.handlePendingCommand", req) + raw, err := a.client.Request(ctx, "session.commands.handlePendingCommand", req) if err != nil { return nil, err } @@ -11878,7 +12015,7 @@ func (a *CommandsAPI) Invoke(ctx context.Context, params *CommandsInvokeRequest) } req["name"] = params.Name } - raw, err := a.client.Request("session.commands.invoke", req) + raw, err := a.client.Request(ctx, "session.commands.invoke", req) if err != nil { return nil, err } @@ -11914,7 +12051,7 @@ func (a *CommandsAPI) List(ctx context.Context, params ...*CommandsListRequest) req["includeSkills"] = *requestParams.IncludeSkills } } - raw, err := a.client.Request("session.commands.list", req) + raw, err := a.client.Request(ctx, "session.commands.list", req) if err != nil { return nil, err } @@ -11940,7 +12077,7 @@ func (a *CommandsAPI) RespondToQueuedCommand(ctx context.Context, params *Comman req["requestId"] = params.RequestID req["result"] = params.Result } - raw, err := a.client.Request("session.commands.respondToQueuedCommand", req) + raw, err := a.client.Request(ctx, "session.commands.respondToQueuedCommand", req) if err != nil { return nil, err } @@ -11982,7 +12119,7 @@ func (a *EventLogAPI) Read(ctx context.Context, params *EventLogReadRequest) (*E req["waitMs"] = *params.WaitMs } } - raw, err := a.client.Request("session.eventLog.read", req) + raw, err := a.client.Request(ctx, "session.eventLog.read", req) if err != nil { return nil, err } @@ -12005,7 +12142,7 @@ func (a *EventLogAPI) RegisterInterest(ctx context.Context, params *RegisterEven if params != nil { req["eventType"] = params.EventType } - raw, err := a.client.Request("session.eventLog.registerInterest", req) + raw, err := a.client.Request(ctx, "session.eventLog.registerInterest", req) if err != nil { return nil, err } @@ -12028,7 +12165,7 @@ func (a *EventLogAPI) ReleaseInterest(ctx context.Context, params *ReleaseEventI if params != nil { req["handle"] = params.Handle } - raw, err := a.client.Request("session.eventLog.releaseInterest", req) + raw, err := a.client.Request(ctx, "session.eventLog.releaseInterest", req) if err != nil { return nil, err } @@ -12049,7 +12186,7 @@ func (a *EventLogAPI) ReleaseInterest(ctx context.Context, params *ReleaseEventI // cursor on a long-lived session). func (a *EventLogAPI) Tail(ctx context.Context) (*EventLogTailResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.eventLog.tail", req) + raw, err := a.client.Request(ctx, "session.eventLog.tail", req) if err != nil { return nil, err } @@ -12073,7 +12210,7 @@ func (a *ExtensionsAPI) Disable(ctx context.Context, params *ExtensionsDisableRe if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.extensions.disable", req) + raw, err := a.client.Request(ctx, "session.extensions.disable", req) if err != nil { return nil, err } @@ -12094,7 +12231,7 @@ func (a *ExtensionsAPI) Enable(ctx context.Context, params *ExtensionsEnableRequ if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.extensions.enable", req) + raw, err := a.client.Request(ctx, "session.extensions.enable", req) if err != nil { return nil, err } @@ -12112,7 +12249,7 @@ func (a *ExtensionsAPI) Enable(ctx context.Context, params *ExtensionsEnableRequ // Returns: Extensions discovered for the session, with their current status. func (a *ExtensionsAPI) List(ctx context.Context) (*ExtensionList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.extensions.list", req) + raw, err := a.client.Request(ctx, "session.extensions.list", req) if err != nil { return nil, err } @@ -12128,7 +12265,7 @@ func (a *ExtensionsAPI) List(ctx context.Context) (*ExtensionList, error) { // RPC method: session.extensions.reload. func (a *ExtensionsAPI) Reload(ctx context.Context) (*SessionExtensionsReloadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.extensions.reload", req) + raw, err := a.client.Request(ctx, "session.extensions.reload", req) if err != nil { return nil, err } @@ -12154,7 +12291,7 @@ func (a *ExtensionsAPI) SendAttachmentsToMessage(ctx context.Context, params *Se req["instanceId"] = *params.InstanceID } } - raw, err := a.client.Request("session.extensions.sendAttachmentsToMessage", req) + raw, err := a.client.Request(ctx, "session.extensions.sendAttachmentsToMessage", req) if err != nil { return nil, err } @@ -12182,7 +12319,7 @@ func (a *FleetAPI) Start(ctx context.Context, params *FleetStartRequest) (*Fleet req["prompt"] = *params.Prompt } } - raw, err := a.client.Request("session.fleet.start", req) + raw, err := a.client.Request(ctx, "session.fleet.start", req) if err != nil { return nil, err } @@ -12203,7 +12340,7 @@ type HistoryAPI sessionAPI // Returns: Indicates whether an in-progress manual compaction was aborted. func (a *HistoryAPI) AbortManualCompaction(ctx context.Context) (*HistoryAbortManualCompactionResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.history.abortManualCompaction", req) + raw, err := a.client.Request(ctx, "session.history.abortManualCompaction", req) if err != nil { return nil, err } @@ -12222,7 +12359,7 @@ func (a *HistoryAPI) AbortManualCompaction(ctx context.Context) (*HistoryAbortMa // Returns: Indicates whether an in-progress background compaction was cancelled. func (a *HistoryAPI) CancelBackgroundCompaction(ctx context.Context) (*HistoryCancelBackgroundCompactionResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.history.cancelBackgroundCompaction", req) + raw, err := a.client.Request(ctx, "session.history.cancelBackgroundCompaction", req) if err != nil { return nil, err } @@ -12252,7 +12389,7 @@ func (a *HistoryAPI) Compact(ctx context.Context, params ...*HistoryCompactReque req["customInstructions"] = *requestParams.CustomInstructions } } - raw, err := a.client.Request("session.history.compact", req) + raw, err := a.client.Request(ctx, "session.history.compact", req) if err != nil { return nil, err } @@ -12271,7 +12408,7 @@ func (a *HistoryAPI) Compact(ctx context.Context, params ...*HistoryCompactReque // Returns: Markdown summary of the conversation context (empty when not available). func (a *HistoryAPI) SummarizeForHandoff(ctx context.Context) (*HistorySummarizeForHandoffResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.history.summarizeForHandoff", req) + raw, err := a.client.Request(ctx, "session.history.summarizeForHandoff", req) if err != nil { return nil, err } @@ -12295,7 +12432,7 @@ func (a *HistoryAPI) Truncate(ctx context.Context, params *HistoryTruncateReques if params != nil { req["eventId"] = params.EventID } - raw, err := a.client.Request("session.history.truncate", req) + raw, err := a.client.Request(ctx, "session.history.truncate", req) if err != nil { return nil, err } @@ -12316,7 +12453,7 @@ type InstructionsAPI sessionAPI // Returns: Instruction sources loaded for the session, in merge order. func (a *InstructionsAPI) GetSources(ctx context.Context) (*InstructionsGetSourcesResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.instructions.getSources", req) + raw, err := a.client.Request(ctx, "session.instructions.getSources", req) if err != nil { return nil, err } @@ -12348,7 +12485,7 @@ func (a *LspAPI) Initialize(ctx context.Context, params *LspInitializeRequest) ( req["workingDirectory"] = *params.WorkingDirectory } } - raw, err := a.client.Request("session.lsp.initialize", req) + raw, err := a.client.Request(ctx, "session.lsp.initialize", req) if err != nil { return nil, err } @@ -12375,7 +12512,7 @@ func (a *MCPAPI) CancelSamplingExecution(ctx context.Context, params *MCPCancelS if params != nil { req["requestId"] = params.RequestID } - raw, err := a.client.Request("session.mcp.cancelSamplingExecution", req) + raw, err := a.client.Request(ctx, "session.mcp.cancelSamplingExecution", req) if err != nil { return nil, err } @@ -12396,7 +12533,7 @@ func (a *MCPAPI) Disable(ctx context.Context, params *MCPDisableRequest) (*Sessi if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.disable", req) + raw, err := a.client.Request(ctx, "session.mcp.disable", req) if err != nil { return nil, err } @@ -12417,7 +12554,7 @@ func (a *MCPAPI) Enable(ctx context.Context, params *MCPEnableRequest) (*Session if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.enable", req) + raw, err := a.client.Request(ctx, "session.mcp.enable", req) if err != nil { return nil, err } @@ -12445,7 +12582,7 @@ func (a *MCPAPI) ExecuteSampling(ctx context.Context, params *MCPExecuteSampling req["requestId"] = params.RequestID req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.executeSampling", req) + raw, err := a.client.Request(ctx, "session.mcp.executeSampling", req) if err != nil { return nil, err } @@ -12469,7 +12606,7 @@ func (a *MCPAPI) IsServerRunning(ctx context.Context, params *MCPIsServerRunning if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.isServerRunning", req) + raw, err := a.client.Request(ctx, "session.mcp.isServerRunning", req) if err != nil { return nil, err } @@ -12491,7 +12628,7 @@ func (a *MCPAPI) IsServerRunning(ctx context.Context, params *MCPIsServerRunning // host-level state. func (a *MCPAPI) List(ctx context.Context) (*MCPServerList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.mcp.list", req) + raw, err := a.client.Request(ctx, "session.mcp.list", req) if err != nil { return nil, err } @@ -12515,7 +12652,7 @@ func (a *MCPAPI) ListTools(ctx context.Context, params *MCPListToolsRequest) (*M if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.listTools", req) + raw, err := a.client.Request(ctx, "session.mcp.listTools", req) if err != nil { return nil, err } @@ -12531,7 +12668,7 @@ func (a *MCPAPI) ListTools(ctx context.Context, params *MCPListToolsRequest) (*M // RPC method: session.mcp.reload. func (a *MCPAPI) Reload(ctx context.Context) (*SessionMCPReloadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.mcp.reload", req) + raw, err := a.client.Request(ctx, "session.mcp.reload", req) if err != nil { return nil, err } @@ -12550,7 +12687,7 @@ func (a *MCPAPI) Reload(ctx context.Context) (*SessionMCPReloadResult, error) { // nothing to remove). func (a *MCPAPI) RemoveGitHub(ctx context.Context) (*MCPRemoveGitHubResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.mcp.removeGitHub", req) + raw, err := a.client.Request(ctx, "session.mcp.removeGitHub", req) if err != nil { return nil, err } @@ -12575,7 +12712,7 @@ func (a *MCPAPI) SetEnvValueMode(ctx context.Context, params *MCPSetEnvValueMode if params != nil { req["mode"] = params.Mode } - raw, err := a.client.Request("session.mcp.setEnvValueMode", req) + raw, err := a.client.Request(ctx, "session.mcp.setEnvValueMode", req) if err != nil { return nil, err } @@ -12596,7 +12733,7 @@ func (a *MCPAPI) StopServer(ctx context.Context, params *MCPStopServerRequest) ( if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.stopServer", req) + raw, err := a.client.Request(ctx, "session.mcp.stopServer", req) if err != nil { return nil, err } @@ -12629,7 +12766,7 @@ func (a *MCPAppsAPI) CallTool(ctx context.Context, params *MCPAppsCallToolReques req["serverName"] = params.ServerName req["toolName"] = params.ToolName } - raw, err := a.client.Request("session.mcp.apps.callTool", req) + raw, err := a.client.Request(ctx, "session.mcp.apps.callTool", req) if err != nil { return nil, err } @@ -12653,7 +12790,7 @@ func (a *MCPAppsAPI) Diagnose(ctx context.Context, params *MCPAppsDiagnoseReques if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.apps.diagnose", req) + raw, err := a.client.Request(ctx, "session.mcp.apps.diagnose", req) if err != nil { return nil, err } @@ -12671,7 +12808,7 @@ func (a *MCPAppsAPI) Diagnose(ctx context.Context, params *MCPAppsDiagnoseReques // Returns: Current host context advertised to MCP App guests. func (a *MCPAppsAPI) GetHostContext(ctx context.Context) (*MCPAppsHostContext, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.mcp.apps.getHostContext", req) + raw, err := a.client.Request(ctx, "session.mcp.apps.getHostContext", req) if err != nil { return nil, err } @@ -12697,7 +12834,7 @@ func (a *MCPAppsAPI) ListTools(ctx context.Context, params *MCPAppsListToolsRequ req["originServerName"] = params.OriginServerName req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.apps.listTools", req) + raw, err := a.client.Request(ctx, "session.mcp.apps.listTools", req) if err != nil { return nil, err } @@ -12722,7 +12859,7 @@ func (a *MCPAppsAPI) ReadResource(ctx context.Context, params *MCPAppsReadResour req["serverName"] = params.ServerName req["uri"] = params.URI } - raw, err := a.client.Request("session.mcp.apps.readResource", req) + raw, err := a.client.Request(ctx, "session.mcp.apps.readResource", req) if err != nil { return nil, err } @@ -12744,7 +12881,7 @@ func (a *MCPAppsAPI) SetHostContext(ctx context.Context, params *MCPAppsSetHostC if params != nil { req["context"] = params.Context } - raw, err := a.client.Request("session.mcp.apps.setHostContext", req) + raw, err := a.client.Request(ctx, "session.mcp.apps.setHostContext", req) if err != nil { return nil, err } @@ -12786,7 +12923,7 @@ func (a *MCPOauthAPI) Login(ctx context.Context, params *MCPOauthLoginRequest) ( } req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.oauth.login", req) + raw, err := a.client.Request(ctx, "session.mcp.oauth.login", req) if err != nil { return nil, err } @@ -12812,7 +12949,7 @@ type MetadataAPI sessionAPI // Returns: Current activity flags for the session. func (a *MetadataAPI) Activity(ctx context.Context) (*SessionActivity, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.metadata.activity", req) + raw, err := a.client.Request(ctx, "session.metadata.activity", req) if err != nil { return nil, err } @@ -12841,7 +12978,7 @@ func (a *MetadataAPI) ContextInfo(ctx context.Context, params *MetadataContextIn req["selectedModel"] = *params.SelectedModel } } - raw, err := a.client.Request("session.metadata.contextInfo", req) + raw, err := a.client.Request(ctx, "session.metadata.contextInfo", req) if err != nil { return nil, err } @@ -12861,7 +12998,7 @@ func (a *MetadataAPI) ContextInfo(ctx context.Context, params *MetadataContextIn // continuation. func (a *MetadataAPI) IsProcessing(ctx context.Context) (*MetadataIsProcessingResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.metadata.isProcessing", req) + raw, err := a.client.Request(ctx, "session.metadata.isProcessing", req) if err != nil { return nil, err } @@ -12888,7 +13025,7 @@ func (a *MetadataAPI) RecomputeContextTokens(ctx context.Context, params *Metada if params != nil { req["modelId"] = params.ModelID } - raw, err := a.client.Request("session.metadata.recomputeContextTokens", req) + raw, err := a.client.Request(ctx, "session.metadata.recomputeContextTokens", req) if err != nil { return nil, err } @@ -12915,7 +13052,7 @@ func (a *MetadataAPI) RecordContextChange(ctx context.Context, params *MetadataR if params != nil { req["context"] = params.Context } - raw, err := a.client.Request("session.metadata.recordContextChange", req) + raw, err := a.client.Request(ctx, "session.metadata.recordContextChange", req) if err != nil { return nil, err } @@ -12941,7 +13078,7 @@ func (a *MetadataAPI) SetWorkingDirectory(ctx context.Context, params *MetadataS if params != nil { req["workingDirectory"] = params.WorkingDirectory } - raw, err := a.client.Request("session.metadata.setWorkingDirectory", req) + raw, err := a.client.Request(ctx, "session.metadata.setWorkingDirectory", req) if err != nil { return nil, err } @@ -12960,7 +13097,7 @@ func (a *MetadataAPI) SetWorkingDirectory(ctx context.Context, params *MetadataS // Returns: Point-in-time snapshot of slow-changing session identifier and state fields func (a *MetadataAPI) Snapshot(ctx context.Context) (*SessionMetadataSnapshot, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.metadata.snapshot", req) + raw, err := a.client.Request(ctx, "session.metadata.snapshot", req) if err != nil { return nil, err } @@ -12981,7 +13118,7 @@ type ModeAPI sessionAPI // Returns: The session mode the agent is operating in func (a *ModeAPI) Get(ctx context.Context) (*SessionMode, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.mode.get", req) + raw, err := a.client.Request(ctx, "session.mode.get", req) if err != nil { return nil, err } @@ -13002,7 +13139,7 @@ func (a *ModeAPI) Set(ctx context.Context, params *ModeSetRequest) (*SessionMode if params != nil { req["mode"] = params.Mode } - raw, err := a.client.Request("session.mode.set", req) + raw, err := a.client.Request(ctx, "session.mode.set", req) if err != nil { return nil, err } @@ -13025,7 +13162,7 @@ type ModelAPI sessionAPI // journal on resume. func (a *ModelAPI) GetCurrent(ctx context.Context) (*CurrentModel, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.model.getCurrent", req) + raw, err := a.client.Request(ctx, "session.model.getCurrent", req) if err != nil { return nil, err } @@ -13056,7 +13193,7 @@ func (a *ModelAPI) List(ctx context.Context, params ...*ModelListRequest) (*Sess req["skipCache"] = *requestParams.SkipCache } } - raw, err := a.client.Request("session.model.list", req) + raw, err := a.client.Request(ctx, "session.model.list", req) if err != nil { return nil, err } @@ -13082,7 +13219,7 @@ func (a *ModelAPI) SetReasoningEffort(ctx context.Context, params *ModelSetReaso if params != nil { req["reasoningEffort"] = params.ReasoningEffort } - raw, err := a.client.Request("session.model.setReasoningEffort", req) + raw, err := a.client.Request(ctx, "session.model.setReasoningEffort", req) if err != nil { return nil, err } @@ -13118,7 +13255,7 @@ func (a *ModelAPI) SwitchTo(ctx context.Context, params *ModelSwitchToRequest) ( req["reasoningSummary"] = *params.ReasoningSummary } } - raw, err := a.client.Request("session.model.switchTo", req) + raw, err := a.client.Request(ctx, "session.model.switchTo", req) if err != nil { return nil, err } @@ -13139,7 +13276,7 @@ type NameAPI sessionAPI // Returns: The session's friendly name, or null when not yet set. func (a *NameAPI) Get(ctx context.Context) (*NameGetResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.name.get", req) + raw, err := a.client.Request(ctx, "session.name.get", req) if err != nil { return nil, err } @@ -13160,7 +13297,7 @@ func (a *NameAPI) Set(ctx context.Context, params *NameSetRequest) (*SessionName if params != nil { req["name"] = params.Name } - raw, err := a.client.Request("session.name.set", req) + raw, err := a.client.Request(ctx, "session.name.set", req) if err != nil { return nil, err } @@ -13185,7 +13322,7 @@ func (a *NameAPI) SetAuto(ctx context.Context, params *NameSetAutoRequest) (*Nam if params != nil { req["summary"] = params.Summary } - raw, err := a.client.Request("session.name.setAuto", req) + raw, err := a.client.Request(ctx, "session.name.setAuto", req) if err != nil { return nil, err } @@ -13354,7 +13491,7 @@ func (a *OptionsAPI) Update(ctx context.Context, params *SessionUpdateOptionsPar req["workingDirectory"] = *params.WorkingDirectory } } - raw, err := a.client.Request("session.options.update", req) + raw, err := a.client.Request(ctx, "session.options.update", req) if err != nil { return nil, err } @@ -13399,7 +13536,7 @@ func (a *PermissionsAPI) Configure(ctx context.Context, params *PermissionsConfi req["urls"] = *params.URLs } } - raw, err := a.client.Request("session.permissions.configure", req) + raw, err := a.client.Request(ctx, "session.permissions.configure", req) if err != nil { return nil, err } @@ -13418,7 +13555,7 @@ func (a *PermissionsAPI) Configure(ctx context.Context, params *PermissionsConfi // Returns: Current full allow-all permission state. func (a *PermissionsAPI) GetAllowAll(ctx context.Context) (*AllowAllPermissionState, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.permissions.getAllowAll", req) + raw, err := a.client.Request(ctx, "session.permissions.getAllowAll", req) if err != nil { return nil, err } @@ -13444,7 +13581,7 @@ func (a *PermissionsAPI) HandlePendingPermissionRequest(ctx context.Context, par req["requestId"] = params.RequestID req["result"] = params.Result } - raw, err := a.client.Request("session.permissions.handlePendingPermissionRequest", req) + raw, err := a.client.Request(ctx, "session.permissions.handlePendingPermissionRequest", req) if err != nil { return nil, err } @@ -13477,7 +13614,7 @@ func (a *PermissionsAPI) ModifyRules(ctx context.Context, params *PermissionsMod } req["scope"] = params.Scope } - raw, err := a.client.Request("session.permissions.modifyRules", req) + raw, err := a.client.Request(ctx, "session.permissions.modifyRules", req) if err != nil { return nil, err } @@ -13502,7 +13639,7 @@ func (a *PermissionsAPI) NotifyPromptShown(ctx context.Context, params *Permissi if params != nil { req["message"] = params.Message } - raw, err := a.client.Request("session.permissions.notifyPromptShown", req) + raw, err := a.client.Request(ctx, "session.permissions.notifyPromptShown", req) if err != nil { return nil, err } @@ -13521,7 +13658,7 @@ func (a *PermissionsAPI) NotifyPromptShown(ctx context.Context, params *Permissi // Returns: List of pending permission requests reconstructed from event history. func (a *PermissionsAPI) PendingRequests(ctx context.Context) (*PendingPermissionRequestList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.permissions.pendingRequests", req) + raw, err := a.client.Request(ctx, "session.permissions.pendingRequests", req) if err != nil { return nil, err } @@ -13539,7 +13676,7 @@ func (a *PermissionsAPI) PendingRequests(ctx context.Context) (*PendingPermissio // Returns: Indicates whether the operation succeeded. func (a *PermissionsAPI) ResetSessionApprovals(ctx context.Context) (*PermissionsResetSessionApprovalsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.permissions.resetSessionApprovals", req) + raw, err := a.client.Request(ctx, "session.permissions.resetSessionApprovals", req) if err != nil { return nil, err } @@ -13571,7 +13708,7 @@ func (a *PermissionsAPI) SetAllowAll(ctx context.Context, params *PermissionsSet req["source"] = *params.Source } } - raw, err := a.client.Request("session.permissions.setAllowAll", req) + raw, err := a.client.Request(ctx, "session.permissions.setAllowAll", req) if err != nil { return nil, err } @@ -13599,7 +13736,7 @@ func (a *PermissionsAPI) SetApproveAll(ctx context.Context, params *PermissionsS req["source"] = *params.Source } } - raw, err := a.client.Request("session.permissions.setApproveAll", req) + raw, err := a.client.Request(ctx, "session.permissions.setApproveAll", req) if err != nil { return nil, err } @@ -13623,7 +13760,7 @@ func (a *PermissionsAPI) SetRequired(ctx context.Context, params *PermissionsSet if params != nil { req["required"] = params.Required } - raw, err := a.client.Request("session.permissions.setRequired", req) + raw, err := a.client.Request(ctx, "session.permissions.setRequired", req) if err != nil { return nil, err } @@ -13650,7 +13787,7 @@ func (a *PermissionsFolderTrustAPI) AddTrusted(ctx context.Context, params *Fold if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.permissions.folderTrust.addTrusted", req) + raw, err := a.client.Request(ctx, "session.permissions.folderTrust.addTrusted", req) if err != nil { return nil, err } @@ -13673,7 +13810,7 @@ func (a *PermissionsFolderTrustAPI) IsTrusted(ctx context.Context, params *Folde if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.permissions.folderTrust.isTrusted", req) + raw, err := a.client.Request(ctx, "session.permissions.folderTrust.isTrusted", req) if err != nil { return nil, err } @@ -13707,7 +13844,7 @@ func (a *PermissionsLocationsAPI) AddToolApproval(ctx context.Context, params *P req["approval"] = params.Approval req["locationKey"] = params.LocationKey } - raw, err := a.client.Request("session.permissions.locations.addToolApproval", req) + raw, err := a.client.Request(ctx, "session.permissions.locations.addToolApproval", req) if err != nil { return nil, err } @@ -13731,7 +13868,7 @@ func (a *PermissionsLocationsAPI) Apply(ctx context.Context, params *PermissionL if params != nil { req["workingDirectory"] = params.WorkingDirectory } - raw, err := a.client.Request("session.permissions.locations.apply", req) + raw, err := a.client.Request(ctx, "session.permissions.locations.apply", req) if err != nil { return nil, err } @@ -13754,7 +13891,7 @@ func (a *PermissionsLocationsAPI) Resolve(ctx context.Context, params *Permissio if params != nil { req["workingDirectory"] = params.WorkingDirectory } - raw, err := a.client.Request("session.permissions.locations.resolve", req) + raw, err := a.client.Request(ctx, "session.permissions.locations.resolve", req) if err != nil { return nil, err } @@ -13786,7 +13923,7 @@ func (a *PermissionsPathsAPI) Add(ctx context.Context, params *PermissionPathsAd if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.permissions.paths.add", req) + raw, err := a.client.Request(ctx, "session.permissions.paths.add", req) if err != nil { return nil, err } @@ -13810,7 +13947,7 @@ func (a *PermissionsPathsAPI) IsPathWithinAllowedDirectories(ctx context.Context if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.permissions.paths.isPathWithinAllowedDirectories", req) + raw, err := a.client.Request(ctx, "session.permissions.paths.isPathWithinAllowedDirectories", req) if err != nil { return nil, err } @@ -13834,7 +13971,7 @@ func (a *PermissionsPathsAPI) IsPathWithinWorkspace(ctx context.Context, params if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.permissions.paths.isPathWithinWorkspace", req) + raw, err := a.client.Request(ctx, "session.permissions.paths.isPathWithinWorkspace", req) if err != nil { return nil, err } @@ -13852,7 +13989,7 @@ func (a *PermissionsPathsAPI) IsPathWithinWorkspace(ctx context.Context, params // Returns: Snapshot of the session's allow-listed directories and primary working directory. func (a *PermissionsPathsAPI) List(ctx context.Context) (*PermissionPathsList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.permissions.paths.list", req) + raw, err := a.client.Request(ctx, "session.permissions.paths.list", req) if err != nil { return nil, err } @@ -13876,7 +14013,7 @@ func (a *PermissionsPathsAPI) UpdatePrimary(ctx context.Context, params *Permiss if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.permissions.paths.updatePrimary", req) + raw, err := a.client.Request(ctx, "session.permissions.paths.updatePrimary", req) if err != nil { return nil, err } @@ -13908,7 +14045,7 @@ func (a *PermissionsURLsAPI) SetUnrestrictedMode(ctx context.Context, params *Pe if params != nil { req["enabled"] = params.Enabled } - raw, err := a.client.Request("session.permissions.urls.setUnrestrictedMode", req) + raw, err := a.client.Request(ctx, "session.permissions.urls.setUnrestrictedMode", req) if err != nil { return nil, err } @@ -13932,7 +14069,7 @@ type PlanAPI sessionAPI // RPC method: session.plan.delete. func (a *PlanAPI) Delete(ctx context.Context) (*SessionPlanDeleteResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.plan.delete", req) + raw, err := a.client.Request(ctx, "session.plan.delete", req) if err != nil { return nil, err } @@ -13950,7 +14087,7 @@ func (a *PlanAPI) Delete(ctx context.Context) (*SessionPlanDeleteResult, error) // Returns: Existence, contents, and resolved path of the session plan file. func (a *PlanAPI) Read(ctx context.Context) (*PlanReadResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.plan.read", req) + raw, err := a.client.Request(ctx, "session.plan.read", req) if err != nil { return nil, err } @@ -13969,7 +14106,7 @@ func (a *PlanAPI) Read(ctx context.Context) (*PlanReadResult, error) { // available. func (a *PlanAPI) ReadSqlTodos(ctx context.Context) (*PlanReadSQLTodosResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.plan.readSqlTodos", req) + raw, err := a.client.Request(ctx, "session.plan.readSqlTodos", req) if err != nil { return nil, err } @@ -13991,7 +14128,7 @@ func (a *PlanAPI) ReadSqlTodos(ctx context.Context) (*PlanReadSQLTodosResult, er // Returns: Todo rows + dependency edges read from the session SQL database. func (a *PlanAPI) ReadSqlTodosWithDependencies(ctx context.Context) (*PlanReadSQLTodosWithDependenciesResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.plan.readSqlTodosWithDependencies", req) + raw, err := a.client.Request(ctx, "session.plan.readSqlTodosWithDependencies", req) if err != nil { return nil, err } @@ -14012,7 +14149,7 @@ func (a *PlanAPI) Update(ctx context.Context, params *PlanUpdateRequest) (*Sessi if params != nil { req["content"] = params.Content } - raw, err := a.client.Request("session.plan.update", req) + raw, err := a.client.Request(ctx, "session.plan.update", req) if err != nil { return nil, err } @@ -14033,7 +14170,7 @@ type PluginsAPI sessionAPI // Returns: Plugins installed for the session, with their enabled state and version metadata. func (a *PluginsAPI) List(ctx context.Context) (*PluginList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.plugins.list", req) + raw, err := a.client.Request(ctx, "session.plugins.list", req) if err != nil { return nil, err } @@ -14070,7 +14207,7 @@ func (a *PluginsAPI) Reload(ctx context.Context, params ...*PluginsReloadRequest req["reloadMcp"] = *requestParams.ReloadMCP } } - raw, err := a.client.Request("session.plugins.reload", req) + raw, err := a.client.Request(ctx, "session.plugins.reload", req) if err != nil { return nil, err } @@ -14081,6 +14218,41 @@ func (a *PluginsAPI) Reload(ctx context.Context, params ...*PluginsReloadRequest return &result, nil } +// Experimental: ProviderAPI contains experimental APIs that may change or be removed. +type ProviderAPI sessionAPI + +// GetEndpoint returns the provider endpoint and credentials the session is currently +// configured to talk to, so the caller can make inference calls directly against the same +// backend the session uses. +// +// RPC method: session.provider.getEndpoint. +// +// Parameters: Optional model identifier to scope the endpoint snapshot to. +// +// Returns: A snapshot of the provider endpoint the session is currently configured to talk +// to. +func (a *ProviderAPI) GetEndpoint(ctx context.Context, params ...*ProviderGetEndpointRequest) (*ProviderEndpoint, error) { + var requestParams *ProviderGetEndpointRequest + if len(params) > 0 { + requestParams = params[0] + } + req := map[string]any{"sessionId": a.sessionID} + if requestParams != nil { + if requestParams.ModelID != nil { + req["modelId"] = *requestParams.ModelID + } + } + raw, err := a.client.Request(ctx, "session.provider.getEndpoint", req) + if err != nil { + return nil, err + } + var result ProviderEndpoint + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + // Experimental: QueueAPI contains experimental APIs that may change or be removed. type QueueAPI sessionAPI @@ -14089,7 +14261,7 @@ type QueueAPI sessionAPI // RPC method: session.queue.clear. func (a *QueueAPI) Clear(ctx context.Context) (*SessionQueueClearResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.queue.clear", req) + raw, err := a.client.Request(ctx, "session.queue.clear", req) if err != nil { return nil, err } @@ -14108,7 +14280,7 @@ func (a *QueueAPI) Clear(ctx context.Context) (*SessionQueueClearResult, error) // Returns: Snapshot of the session's pending queued items and immediate-steering messages. func (a *QueueAPI) PendingItems(ctx context.Context) (*QueuePendingItemsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.queue.pendingItems", req) + raw, err := a.client.Request(ctx, "session.queue.pendingItems", req) if err != nil { return nil, err } @@ -14126,7 +14298,7 @@ func (a *QueueAPI) PendingItems(ctx context.Context) (*QueuePendingItemsResult, // Returns: Indicates whether a user-facing pending item was removed. func (a *QueueAPI) RemoveMostRecent(ctx context.Context) (*QueueRemoveMostRecentResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.queue.removeMostRecent", req) + raw, err := a.client.Request(ctx, "session.queue.removeMostRecent", req) if err != nil { return nil, err } @@ -14145,7 +14317,7 @@ type RemoteAPI sessionAPI // RPC method: session.remote.disable. func (a *RemoteAPI) Disable(ctx context.Context) (*SessionRemoteDisableResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.remote.disable", req) + raw, err := a.client.Request(ctx, "session.remote.disable", req) if err != nil { return nil, err } @@ -14172,7 +14344,7 @@ func (a *RemoteAPI) Enable(ctx context.Context, params *RemoteEnableRequest) (*R req["mode"] = *params.Mode } } - raw, err := a.client.Request("session.remote.enable", req) + raw, err := a.client.Request(ctx, "session.remote.enable", req) if err != nil { return nil, err } @@ -14199,7 +14371,7 @@ func (a *RemoteAPI) NotifySteerableChanged(ctx context.Context, params *RemoteNo if params != nil { req["remoteSteerable"] = params.RemoteSteerable } - raw, err := a.client.Request("session.remote.notifySteerableChanged", req) + raw, err := a.client.Request(ctx, "session.remote.notifySteerableChanged", req) if err != nil { return nil, err } @@ -14220,7 +14392,7 @@ type ScheduleAPI sessionAPI // Returns: Snapshot of the currently active recurring prompts for this session. func (a *ScheduleAPI) List(ctx context.Context) (*ScheduleList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.schedule.list", req) + raw, err := a.client.Request(ctx, "session.schedule.list", req) if err != nil { return nil, err } @@ -14244,7 +14416,7 @@ func (a *ScheduleAPI) Stop(ctx context.Context, params *ScheduleStopRequest) (*S if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.schedule.stop", req) + raw, err := a.client.Request(ctx, "session.schedule.stop", req) if err != nil { return nil, err } @@ -14270,7 +14442,7 @@ func (a *ShellAPI) CancelUserRequested(ctx context.Context, params *ShellCancelU if params != nil { req["requestId"] = params.RequestID } - raw, err := a.client.Request("session.shell.cancelUserRequested", req) + raw, err := a.client.Request(ctx, "session.shell.cancelUserRequested", req) if err != nil { return nil, err } @@ -14301,7 +14473,7 @@ func (a *ShellAPI) Exec(ctx context.Context, params *ShellExecRequest) (*ShellEx req["timeout"] = *params.Timeout } } - raw, err := a.client.Request("session.shell.exec", req) + raw, err := a.client.Request(ctx, "session.shell.exec", req) if err != nil { return nil, err } @@ -14325,7 +14497,7 @@ func (a *ShellAPI) ExecuteUserRequested(ctx context.Context, params *ShellExecut req["command"] = params.Command req["requestId"] = params.RequestID } - raw, err := a.client.Request("session.shell.executeUserRequested", req) + raw, err := a.client.Request(ctx, "session.shell.executeUserRequested", req) if err != nil { return nil, err } @@ -14353,7 +14525,7 @@ func (a *ShellAPI) Kill(ctx context.Context, params *ShellKillRequest) (*ShellKi req["signal"] = *params.Signal } } - raw, err := a.client.Request("session.shell.kill", req) + raw, err := a.client.Request(ctx, "session.shell.kill", req) if err != nil { return nil, err } @@ -14377,7 +14549,7 @@ func (a *SkillsAPI) Disable(ctx context.Context, params *SkillsDisableRequest) ( if params != nil { req["name"] = params.Name } - raw, err := a.client.Request("session.skills.disable", req) + raw, err := a.client.Request(ctx, "session.skills.disable", req) if err != nil { return nil, err } @@ -14398,7 +14570,7 @@ func (a *SkillsAPI) Enable(ctx context.Context, params *SkillsEnableRequest) (*S if params != nil { req["name"] = params.Name } - raw, err := a.client.Request("session.skills.enable", req) + raw, err := a.client.Request(ctx, "session.skills.enable", req) if err != nil { return nil, err } @@ -14414,7 +14586,7 @@ func (a *SkillsAPI) Enable(ctx context.Context, params *SkillsEnableRequest) (*S // RPC method: session.skills.ensureLoaded. func (a *SkillsAPI) EnsureLoaded(ctx context.Context) (*SessionSkillsEnsureLoadedResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.skills.ensureLoaded", req) + raw, err := a.client.Request(ctx, "session.skills.ensureLoaded", req) if err != nil { return nil, err } @@ -14433,7 +14605,7 @@ func (a *SkillsAPI) EnsureLoaded(ctx context.Context) (*SessionSkillsEnsureLoade // last). func (a *SkillsAPI) GetInvoked(ctx context.Context) (*SkillsGetInvokedResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.skills.getInvoked", req) + raw, err := a.client.Request(ctx, "session.skills.getInvoked", req) if err != nil { return nil, err } @@ -14451,7 +14623,7 @@ func (a *SkillsAPI) GetInvoked(ctx context.Context) (*SkillsGetInvokedResult, er // Returns: Skills available to the session, with their enabled state. func (a *SkillsAPI) List(ctx context.Context) (*SkillList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.skills.list", req) + raw, err := a.client.Request(ctx, "session.skills.list", req) if err != nil { return nil, err } @@ -14470,7 +14642,7 @@ func (a *SkillsAPI) List(ctx context.Context) (*SkillList, error) { // separate lists. func (a *SkillsAPI) Reload(ctx context.Context) (*SkillsLoadDiagnostics, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.skills.reload", req) + raw, err := a.client.Request(ctx, "session.skills.reload", req) if err != nil { return nil, err } @@ -14496,7 +14668,7 @@ func (a *TasksAPI) Cancel(ctx context.Context, params *TasksCancelRequest) (*Tas if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.tasks.cancel", req) + raw, err := a.client.Request(ctx, "session.tasks.cancel", req) if err != nil { return nil, err } @@ -14515,7 +14687,7 @@ func (a *TasksAPI) Cancel(ctx context.Context, params *TasksCancelRequest) (*Tas // Returns: The first sync-waiting task that can currently be promoted to background mode. func (a *TasksAPI) GetCurrentPromotable(ctx context.Context) (*TasksGetCurrentPromotableResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tasks.getCurrentPromotable", req) + raw, err := a.client.Request(ctx, "session.tasks.getCurrentPromotable", req) if err != nil { return nil, err } @@ -14538,7 +14710,7 @@ func (a *TasksAPI) GetProgress(ctx context.Context, params *TasksGetProgressRequ if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.tasks.getProgress", req) + raw, err := a.client.Request(ctx, "session.tasks.getProgress", req) if err != nil { return nil, err } @@ -14556,7 +14728,7 @@ func (a *TasksAPI) GetProgress(ctx context.Context, params *TasksGetProgressRequ // Returns: Background tasks currently tracked by the session. func (a *TasksAPI) List(ctx context.Context) (*TaskList, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tasks.list", req) + raw, err := a.client.Request(ctx, "session.tasks.list", req) if err != nil { return nil, err } @@ -14576,7 +14748,7 @@ func (a *TasksAPI) List(ctx context.Context) (*TaskList, error) { // task was waiting. func (a *TasksAPI) PromoteCurrentToBackground(ctx context.Context) (*TasksPromoteCurrentToBackgroundResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tasks.promoteCurrentToBackground", req) + raw, err := a.client.Request(ctx, "session.tasks.promoteCurrentToBackground", req) if err != nil { return nil, err } @@ -14600,7 +14772,7 @@ func (a *TasksAPI) PromoteToBackground(ctx context.Context, params *TasksPromote if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.tasks.promoteToBackground", req) + raw, err := a.client.Request(ctx, "session.tasks.promoteToBackground", req) if err != nil { return nil, err } @@ -14619,7 +14791,7 @@ func (a *TasksAPI) PromoteToBackground(ctx context.Context, params *TasksPromote // after a long pause to pick up exit/output state for shells running outside the agent loop. func (a *TasksAPI) Refresh(ctx context.Context) (*TasksRefreshResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tasks.refresh", req) + raw, err := a.client.Request(ctx, "session.tasks.refresh", req) if err != nil { return nil, err } @@ -14643,7 +14815,7 @@ func (a *TasksAPI) Remove(ctx context.Context, params *TasksRemoveRequest) (*Tas if params != nil { req["id"] = params.ID } - raw, err := a.client.Request("session.tasks.remove", req) + raw, err := a.client.Request(ctx, "session.tasks.remove", req) if err != nil { return nil, err } @@ -14672,7 +14844,7 @@ func (a *TasksAPI) SendMessage(ctx context.Context, params *TasksSendMessageRequ req["id"] = params.ID req["message"] = params.Message } - raw, err := a.client.Request("session.tasks.sendMessage", req) + raw, err := a.client.Request(ctx, "session.tasks.sendMessage", req) if err != nil { return nil, err } @@ -14704,7 +14876,7 @@ func (a *TasksAPI) StartAgent(ctx context.Context, params *TasksStartAgentReques req["name"] = params.Name req["prompt"] = params.Prompt } - raw, err := a.client.Request("session.tasks.startAgent", req) + raw, err := a.client.Request(ctx, "session.tasks.startAgent", req) if err != nil { return nil, err } @@ -14725,7 +14897,7 @@ func (a *TasksAPI) StartAgent(ctx context.Context, params *TasksStartAgentReques // COPILOT_TASK_WAIT_TIMEOUT_SECONDS). func (a *TasksAPI) WaitForPending(ctx context.Context) (*TasksWaitForPendingResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tasks.waitForPending", req) + raw, err := a.client.Request(ctx, "session.tasks.waitForPending", req) if err != nil { return nil, err } @@ -14747,7 +14919,7 @@ type TelemetryAPI sessionAPI // Returns: Telemetry engagement ID for the session, when available. func (a *TelemetryAPI) GetEngagementId(ctx context.Context) (*SessionTelemetryEngagement, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.telemetry.getEngagementId", req) + raw, err := a.client.Request(ctx, "session.telemetry.getEngagementId", req) if err != nil { return nil, err } @@ -14770,7 +14942,7 @@ func (a *TelemetryAPI) SetFeatureOverrides(ctx context.Context, params *Telemetr if params != nil { req["features"] = params.Features } - raw, err := a.client.Request("session.telemetry.setFeatureOverrides", req) + raw, err := a.client.Request(ctx, "session.telemetry.setFeatureOverrides", req) if err != nil { return nil, err } @@ -14792,7 +14964,7 @@ type ToolsAPI sessionAPI // Returns: Current lightweight tool metadata snapshot for the session. func (a *ToolsAPI) GetCurrentMetadata(ctx context.Context) (*ToolsGetCurrentMetadataResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tools.getCurrentMetadata", req) + raw, err := a.client.Request(ctx, "session.tools.getCurrentMetadata", req) if err != nil { return nil, err } @@ -14822,7 +14994,7 @@ func (a *ToolsAPI) HandlePendingToolCall(ctx context.Context, params *HandlePend req["result"] = params.Result } } - raw, err := a.client.Request("session.tools.handlePendingToolCall", req) + raw, err := a.client.Request(ctx, "session.tools.handlePendingToolCall", req) if err != nil { return nil, err } @@ -14844,7 +15016,7 @@ func (a *ToolsAPI) HandlePendingToolCall(ctx context.Context, params *HandlePend // validation. func (a *ToolsAPI) InitializeAndValidate(ctx context.Context) (*ToolsInitializeAndValidateResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.tools.initializeAndValidate", req) + raw, err := a.client.Request(ctx, "session.tools.initializeAndValidate", req) if err != nil { return nil, err } @@ -14855,6 +15027,33 @@ func (a *ToolsAPI) InitializeAndValidate(ctx context.Context) (*ToolsInitializeA return &result, nil } +// UpdateSubagentSettings updates the current session's live subagent settings after user +// settings change. The persisted user settings remain the source of truth for future +// sessions. +// +// RPC method: session.tools.updateSubagentSettings. +// +// Parameters: Subagent settings to apply to the current session +// +// Returns: Empty result after applying subagent settings +func (a *ToolsAPI) UpdateSubagentSettings(ctx context.Context, params *UpdateSubagentSettingsRequest) (*ToolsUpdateSubagentSettingsResult, error) { + req := map[string]any{"sessionId": a.sessionID} + if params != nil { + if params.Subagents != nil { + req["subagents"] = *params.Subagents + } + } + raw, err := a.client.Request(ctx, "session.tools.updateSubagentSettings", req) + if err != nil { + return nil, err + } + var result ToolsUpdateSubagentSettingsResult + if err := json.Unmarshal(raw, &result); err != nil { + return nil, err + } + return &result, nil +} + // Experimental: UIAPI contains experimental APIs that may change or be removed. type UIAPI sessionAPI @@ -14872,7 +15071,7 @@ func (a *UIAPI) Elicitation(ctx context.Context, params *UIElicitationRequest) ( req["message"] = params.Message req["requestedSchema"] = params.RequestedSchema } - raw, err := a.client.Request("session.ui.elicitation", req) + raw, err := a.client.Request(ctx, "session.ui.elicitation", req) if err != nil { return nil, err } @@ -14902,7 +15101,7 @@ func (a *UIAPI) EphemeralQuery(ctx context.Context, params *UIEphemeralQueryRequ } req["question"] = params.Question } - raw, err := a.client.Request("session.ui.ephemeralQuery", req) + raw, err := a.client.Request(ctx, "session.ui.ephemeralQuery", req) if err != nil { return nil, err } @@ -14928,7 +15127,7 @@ func (a *UIAPI) HandlePendingAutoModeSwitch(ctx context.Context, params *UIHandl req["requestId"] = params.RequestID req["response"] = params.Response } - raw, err := a.client.Request("session.ui.handlePendingAutoModeSwitch", req) + raw, err := a.client.Request(ctx, "session.ui.handlePendingAutoModeSwitch", req) if err != nil { return nil, err } @@ -14954,7 +15153,7 @@ func (a *UIAPI) HandlePendingElicitation(ctx context.Context, params *UIHandlePe req["requestId"] = params.RequestID req["result"] = params.Result } - raw, err := a.client.Request("session.ui.handlePendingElicitation", req) + raw, err := a.client.Request(ctx, "session.ui.handlePendingElicitation", req) if err != nil { return nil, err } @@ -14980,7 +15179,7 @@ func (a *UIAPI) HandlePendingExitPlanMode(ctx context.Context, params *UIHandleP req["requestId"] = params.RequestID req["response"] = params.Response } - raw, err := a.client.Request("session.ui.handlePendingExitPlanMode", req) + raw, err := a.client.Request(ctx, "session.ui.handlePendingExitPlanMode", req) if err != nil { return nil, err } @@ -15008,7 +15207,7 @@ func (a *UIAPI) HandlePendingSampling(ctx context.Context, params *UIHandlePendi req["response"] = *params.Response } } - raw, err := a.client.Request("session.ui.handlePendingSampling", req) + raw, err := a.client.Request(ctx, "session.ui.handlePendingSampling", req) if err != nil { return nil, err } @@ -15033,7 +15232,7 @@ func (a *UIAPI) HandlePendingUserInput(ctx context.Context, params *UIHandlePend req["requestId"] = params.RequestID req["response"] = params.Response } - raw, err := a.client.Request("session.ui.handlePendingUserInput", req) + raw, err := a.client.Request(ctx, "session.ui.handlePendingUserInput", req) if err != nil { return nil, err } @@ -15055,7 +15254,7 @@ func (a *UIAPI) HandlePendingUserInput(ctx context.Context, params *UIHandlePend // client doesn't race the in-process handler for the same requestId). func (a *UIAPI) RegisterDirectAutoModeSwitchHandler(ctx context.Context) (*UIRegisterDirectAutoModeSwitchHandlerResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.ui.registerDirectAutoModeSwitchHandler", req) + raw, err := a.client.Request(ctx, "session.ui.registerDirectAutoModeSwitchHandler", req) if err != nil { return nil, err } @@ -15081,7 +15280,7 @@ func (a *UIAPI) UnregisterDirectAutoModeSwitchHandler(ctx context.Context, param if params != nil { req["handle"] = params.Handle } - raw, err := a.client.Request("session.ui.unregisterDirectAutoModeSwitchHandler", req) + raw, err := a.client.Request(ctx, "session.ui.unregisterDirectAutoModeSwitchHandler", req) if err != nil { return nil, err } @@ -15103,7 +15302,7 @@ type UsageAPI sessionAPI // model breakdown, and code-change totals. func (a *UsageAPI) GetMetrics(ctx context.Context) (*UsageGetMetricsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.usage.getMetrics", req) + raw, err := a.client.Request(ctx, "session.usage.getMetrics", req) if err != nil { return nil, err } @@ -15128,7 +15327,7 @@ func (a *WorkspacesAPI) CreateFile(ctx context.Context, params *WorkspacesCreate req["content"] = params.Content req["path"] = params.Path } - raw, err := a.client.Request("session.workspaces.createFile", req) + raw, err := a.client.Request(ctx, "session.workspaces.createFile", req) if err != nil { return nil, err } @@ -15151,7 +15350,7 @@ func (a *WorkspacesAPI) Diff(ctx context.Context, params *WorkspacesDiffRequest) if params != nil { req["mode"] = params.Mode } - raw, err := a.client.Request("session.workspaces.diff", req) + raw, err := a.client.Request(ctx, "session.workspaces.diff", req) if err != nil { return nil, err } @@ -15170,7 +15369,7 @@ func (a *WorkspacesAPI) Diff(ctx context.Context, params *WorkspacesDiffRequest) // path when available. func (a *WorkspacesAPI) GetWorkspace(ctx context.Context) (*WorkspacesGetWorkspaceResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.workspaces.getWorkspace", req) + raw, err := a.client.Request(ctx, "session.workspaces.getWorkspace", req) if err != nil { return nil, err } @@ -15189,7 +15388,7 @@ func (a *WorkspacesAPI) GetWorkspace(ctx context.Context) (*WorkspacesGetWorkspa // enabled. func (a *WorkspacesAPI) ListCheckpoints(ctx context.Context) (*WorkspacesListCheckpointsResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.workspaces.listCheckpoints", req) + raw, err := a.client.Request(ctx, "session.workspaces.listCheckpoints", req) if err != nil { return nil, err } @@ -15207,7 +15406,7 @@ func (a *WorkspacesAPI) ListCheckpoints(ctx context.Context) (*WorkspacesListChe // Returns: Relative paths of files stored in the session workspace files directory. func (a *WorkspacesAPI) ListFiles(ctx context.Context) (*WorkspacesListFilesResult, error) { req := map[string]any{"sessionId": a.sessionID} - raw, err := a.client.Request("session.workspaces.listFiles", req) + raw, err := a.client.Request(ctx, "session.workspaces.listFiles", req) if err != nil { return nil, err } @@ -15231,7 +15430,7 @@ func (a *WorkspacesAPI) ReadCheckpoint(ctx context.Context, params *WorkspacesRe if params != nil { req["number"] = params.Number } - raw, err := a.client.Request("session.workspaces.readCheckpoint", req) + raw, err := a.client.Request(ctx, "session.workspaces.readCheckpoint", req) if err != nil { return nil, err } @@ -15254,7 +15453,7 @@ func (a *WorkspacesAPI) ReadFile(ctx context.Context, params *WorkspacesReadFile if params != nil { req["path"] = params.Path } - raw, err := a.client.Request("session.workspaces.readFile", req) + raw, err := a.client.Request(ctx, "session.workspaces.readFile", req) if err != nil { return nil, err } @@ -15277,7 +15476,7 @@ func (a *WorkspacesAPI) SaveLargePaste(ctx context.Context, params *WorkspacesSa if params != nil { req["content"] = params.Content } - raw, err := a.client.Request("session.workspaces.saveLargePaste", req) + raw, err := a.client.Request(ctx, "session.workspaces.saveLargePaste", req) if err != nil { return nil, err } @@ -15312,6 +15511,7 @@ type SessionRPC struct { Permissions *PermissionsAPI Plan *PlanAPI Plugins *PluginsAPI + Provider *ProviderAPI Queue *QueueAPI Remote *RemoteAPI Schedule *ScheduleAPI @@ -15341,7 +15541,7 @@ func (a *SessionRPC) Abort(ctx context.Context, params *AbortRequest) (*AbortRes req["reason"] = *params.Reason } } - raw, err := a.common.client.Request("session.abort", req) + raw, err := a.common.client.Request(ctx, "session.abort", req) if err != nil { return nil, err } @@ -15381,7 +15581,7 @@ func (a *SessionRPC) Log(ctx context.Context, params *LogRequest) (*LogResult, e req["url"] = *params.URL } } - raw, err := a.common.client.Request("session.log", req) + raw, err := a.common.client.Request(ctx, "session.log", req) if err != nil { return nil, err } @@ -15441,7 +15641,7 @@ func (a *SessionRPC) Send(ctx context.Context, params *SendRequest) (*SendResult req["wait"] = *params.Wait } } - raw, err := a.common.client.Request("session.send", req) + raw, err := a.common.client.Request(ctx, "session.send", req) if err != nil { return nil, err } @@ -15471,7 +15671,7 @@ func (a *SessionRPC) Shutdown(ctx context.Context, params *ShutdownRequest) (*Se req["type"] = *params.Type } } - raw, err := a.common.client.Request("session.shutdown", req) + raw, err := a.common.client.Request(ctx, "session.shutdown", req) if err != nil { return nil, err } @@ -15489,7 +15689,7 @@ func (a *SessionRPC) Shutdown(ctx context.Context, params *ShutdownRequest) (*Se // versions. func (a *SessionRPC) Suspend(ctx context.Context) (*SessionSuspendResult, error) { req := map[string]any{"sessionId": a.common.sessionID} - raw, err := a.common.client.Request("session.suspend", req) + raw, err := a.common.client.Request(ctx, "session.suspend", req) if err != nil { return nil, err } @@ -15522,6 +15722,7 @@ func NewSessionRPC(client *jsonrpc2.Client, sessionID string) *SessionRPC { r.Permissions = (*PermissionsAPI)(&r.common) r.Plan = (*PlanAPI)(&r.common) r.Plugins = (*PluginsAPI)(&r.common) + r.Provider = (*ProviderAPI)(&r.common) r.Queue = (*QueueAPI)(&r.common) r.Remote = (*RemoteAPI)(&r.common) r.Schedule = (*ScheduleAPI)(&r.common) @@ -15559,7 +15760,7 @@ func (a *InternalMCPAPI) ConfigureGitHub(ctx context.Context, params *MCPConfigu if params != nil { req["authInfo"] = params.AuthInfo } - raw, err := a.client.Request("session.mcp.configureGitHub", req) + raw, err := a.client.Request(ctx, "session.mcp.configureGitHub", req) if err != nil { return nil, err } @@ -15590,7 +15791,7 @@ func (a *InternalMCPAPI) RegisterExternalClient(ctx context.Context, params *MCP req["serverName"] = params.ServerName req["transport"] = params.Transport } - raw, err := a.client.Request("session.mcp.registerExternalClient", req) + raw, err := a.client.Request(ctx, "session.mcp.registerExternalClient", req) if err != nil { return nil, err } @@ -15616,7 +15817,7 @@ func (a *InternalMCPAPI) ReloadWithConfig(ctx context.Context, params *MCPReload if params != nil { req["config"] = params.Config } - raw, err := a.client.Request("session.mcp.reloadWithConfig", req) + raw, err := a.client.Request(ctx, "session.mcp.reloadWithConfig", req) if err != nil { return nil, err } @@ -15640,7 +15841,7 @@ func (a *InternalMCPAPI) RestartServer(ctx context.Context, params *MCPRestartSe req["config"] = params.Config req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.restartServer", req) + raw, err := a.client.Request(ctx, "session.mcp.restartServer", req) if err != nil { return nil, err } @@ -15664,7 +15865,7 @@ func (a *InternalMCPAPI) StartServer(ctx context.Context, params *MCPStartServer req["config"] = params.Config req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.startServer", req) + raw, err := a.client.Request(ctx, "session.mcp.startServer", req) if err != nil { return nil, err } @@ -15692,7 +15893,7 @@ func (a *InternalMCPAPI) UnregisterExternalClient(ctx context.Context, params *M if params != nil { req["serverName"] = params.ServerName } - raw, err := a.client.Request("session.mcp.unregisterExternalClient", req) + raw, err := a.client.Request(ctx, "session.mcp.unregisterExternalClient", req) if err != nil { return nil, err } @@ -15727,7 +15928,7 @@ func (a *InternalMCPOauthAPI) Respond(ctx context.Context, params *MCPOauthRespo } req["requestId"] = params.RequestID } - raw, err := a.client.Request("session.mcp.oauth.respond", req) + raw, err := a.client.Request(ctx, "session.mcp.oauth.respond", req) if err != nil { return nil, err } diff --git a/nodejs/src/generated/rpc.ts b/nodejs/src/generated/rpc.ts index 34d07abc4..1ef280abf 100644 --- a/nodejs/src/generated/rpc.ts +++ b/nodejs/src/generated/rpc.ts @@ -313,7 +313,7 @@ export type EventsCursorStatus = /** The cursor referred to history that is no longer available. */ | "expired"; /** - * Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/) + * Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin (installed plugin), or session (session-state//extensions/) * * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema * via the `definition` "ExtensionSource". @@ -323,7 +323,11 @@ export type ExtensionSource = /** Extension discovered from the current project's .github/extensions directory. */ | "project" /** Extension discovered from the user's ~/.copilot/extensions directory. */ - | "user"; + | "user" + /** Extension contributed by an installed plugin. */ + | "plugin" + /** Extension discovered from the current session's state directory (loaded only for this session). */ + | "session"; /** * Current status: running, disabled, failed, or starting * @@ -1011,6 +1015,32 @@ export type ProviderConfigWireApi = | "completions" /** OpenAI Responses API wire format. */ | "responses"; +/** + * Provider family. Matches the `type` field of a BYOK provider config. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ProviderEndpointType". + */ +/** @experimental */ +export type ProviderEndpointType = + /** OpenAI-compatible endpoint (use the OpenAI client library). */ + | "openai" + /** Azure OpenAI endpoint (use the OpenAI client library with the Azure base URL). */ + | "azure" + /** Anthropic endpoint (use the Anthropic client library). */ + | "anthropic"; +/** + * Wire API to be used, when required for the provider type. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ProviderEndpointWireApi". + */ +/** @experimental */ +export type ProviderEndpointWireApi = + /** Classic chat-completions request shape. */ + | "completions" + /** Newer responses request shape. */ + | "responses"; /** * Schema for the `PushAttachment` type. * @@ -1429,6 +1459,39 @@ export type SlashCommandInvocationResult = | SlashCommandAgentPromptResult | SlashCommandCompletedResult | SlashCommandSelectSubcommandResult; +/** + * Subagent settings to apply, or null to clear the live session override + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "SubagentSettings". + */ +/** @experimental */ +export type SubagentSettings = { + /** + * Per-agent settings keyed by subagent agent_type + */ + agents?: { + [k: string]: SubagentSettingsEntry | undefined; + }; + /** + * Names of subagents the user has turned off; they cannot be dispatched + */ + disabledSubagents?: string[]; +} | null; +/** + * Context tier override for matching subagents + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "SubagentSettingsEntryContextTier". + */ +/** @experimental */ +export type SubagentSettingsEntryContextTier = + /** Inherit the parent session's effective context tier at dispatch time. */ + | "inherit" + /** Use the model's default context window. */ + | "default" + /** Pin the subagent to the long-context tier when supported. */ + | "long_context"; /** * Current lifecycle status of the task * @@ -3342,7 +3405,7 @@ export interface ExecuteCommandResult { /** @experimental */ export interface Extension { /** - * Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper') + * Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper', 'plugin:my-plugin:my-ext') */ id: string; /** @@ -7860,6 +7923,70 @@ export interface ProviderConfigAzure { */ apiVersion?: string; } +/** + * A snapshot of the provider endpoint the session is currently configured to talk to. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ProviderEndpoint". + */ +/** @experimental */ +export interface ProviderEndpoint { + type: ProviderEndpointType; + wireApi?: ProviderEndpointWireApi; + /** + * Base URL to pass to the LLM client library. + */ + baseUrl: string; + /** + * A credential the caller should use with this endpoint. Omitted only when the endpoint accepts unauthenticated requests. + */ + apiKey?: string; + /** + * HTTP headers the caller must include on every outbound request. + */ + headers: { + [k: string]: string | undefined; + }; + sessionToken?: ProviderSessionToken; +} +/** + * Short-lived, rotating credential the caller must send on every request, in addition to `apiKey` if one is present. Omitted when the endpoint does not require one. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ProviderSessionToken". + */ +/** @experimental */ +export interface ProviderSessionToken { + /** + * The short-lived token value. + */ + token: string; + /** + * HTTP header name the token must be sent under. + */ + header: string; + /** + * The model the token is bound to, when applicable. When set, the token is only valid for requests against this model. + */ + model?: string; + /** + * When the token expires, if known. Callers should refresh by calling `getEndpoint` again before this time, or reactively on any 401/403 response from `baseUrl`. + */ + expiresAt?: string; +} +/** + * Optional model identifier to scope the endpoint snapshot to. + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ProviderGetEndpointRequest". + */ +/** @experimental */ +export interface ProviderGetEndpointRequest { + /** + * Model identifier the caller intends to use against the returned endpoint. Used to pick the correct wire shape. Omit to use whichever model the session is currently using. + */ + modelId?: string; +} /** * File attachment * @@ -9649,6 +9776,14 @@ export interface SessionOpenOptions { * Stable integration identifier for analytics. */ integrationId?: string; + /** + * ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and ExP-backed flags wait for it. When absent the session does not block on ExP. + * + * @internal + */ + expAssignments?: { + [k: string]: unknown | undefined; + }; /** * Feature-flag values resolved by the host. */ @@ -11182,6 +11317,24 @@ export interface SlashCommandSelectSubcommandOption { */ group?: string; } +/** + * Subagent model, reasoning effort, and context tier settings + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "SubagentSettingsEntry". + */ +/** @experimental */ +export interface SubagentSettingsEntry { + /** + * Model override for matching subagents + */ + model?: string; + /** + * Reasoning effort override for matching subagents + */ + effortLevel?: string; + contextTier?: SubagentSettingsEntryContextTier; +} /** * Schema for the `TaskAgentInfo` type. * @@ -11691,6 +11844,14 @@ export interface ToolsListRequest { */ model?: string; } +/** + * Empty result after applying subagent settings + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "ToolsUpdateSubagentSettingsResult". + */ +/** @experimental */ +export interface ToolsUpdateSubagentSettingsResult {} /** * Multi-select string field where each option pairs a value with a display label. * @@ -12258,6 +12419,19 @@ export interface UIUnregisterDirectAutoModeSwitchHandlerResult { */ unregistered: boolean; } +/** + * Subagent settings to apply to the current session + * + * This interface was referenced by `_RpcSchemaRoot`'s JSON-Schema + * via the `definition` "UpdateSubagentSettingsRequest". + */ +/** @experimental */ +export interface UpdateSubagentSettingsRequest { + /** + * Subagent settings to apply, or null to clear the live session override + */ + subagents?: SubagentSettings | null; +} /** * Accumulated session usage metrics, including premium request cost, token counts, model breakdown, and code-change totals. * @@ -13970,6 +14144,18 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin connection.sendRequest("session.plugins.reload", { sessionId, ...params }), }, /** @experimental */ + provider: { + /** + * Returns the provider endpoint and credentials the session is currently configured to talk to, so the caller can make inference calls directly against the same backend the session uses. + * + * @param params Optional model identifier to scope the endpoint snapshot to. + * + * @returns A snapshot of the provider endpoint the session is currently configured to talk to. + */ + getEndpoint: async (params?: ProviderGetEndpointRequest): Promise => + connection.sendRequest("session.provider.getEndpoint", { sessionId, ...params }), + }, + /** @experimental */ options: { /** * Patches the genuinely-mutable subset of session options. @@ -14052,6 +14238,15 @@ export function createSessionRpc(connection: MessageConnection, sessionId: strin */ getCurrentMetadata: async (): Promise => connection.sendRequest("session.tools.getCurrentMetadata", { sessionId }), + /** + * Updates the current session's live subagent settings after user settings change. The persisted user settings remain the source of truth for future sessions. + * + * @param params Subagent settings to apply to the current session + * + * @returns Empty result after applying subagent settings + */ + updateSubagentSettings: async (params: UpdateSubagentSettingsRequest): Promise => + connection.sendRequest("session.tools.updateSubagentSettings", { sessionId, ...params }), }, /** @experimental */ commands: { diff --git a/python/copilot/generated/rpc.py b/python/copilot/generated/rpc.py index c78238056..ec00eefb5 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/generated/rpc.py @@ -1333,9 +1333,12 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. class ExtensionSource(Enum): - """Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/)""" - + """Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin + (installed plugin), or session (session-state//extensions/) + """ + PLUGIN = "plugin" PROJECT = "project" + SESSION = "session" USER = "user" # Experimental: this type is part of an experimental API and may change or be removed. @@ -4639,20 +4642,64 @@ def to_dict(self) -> dict: return result # Experimental: this type is part of an experimental API and may change or be removed. -class ProviderConfigType(Enum): - """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs.""" +class ProviderType(Enum): + """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs. + Provider family. Matches the `type` field of a BYOK provider config. + """ ANTHROPIC = "anthropic" AZURE = "azure" OPENAI = "openai" # Experimental: this type is part of an experimental API and may change or be removed. -class ProviderConfigWireAPI(Enum): - """Wire API format (openai/azure only). Defaults to "completions".""" +class ProviderWireAPI(Enum): + """Wire API format (openai/azure only). Defaults to "completions". + Wire API to be used, when required for the provider type. + """ COMPLETIONS = "completions" RESPONSES = "responses" +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProviderSessionToken: + """Short-lived, rotating credential the caller must send on every request, in addition to + `apiKey` if one is present. Omitted when the endpoint does not require one. + """ + header: str + """HTTP header name the token must be sent under.""" + + token: str + """The short-lived token value.""" + + expires_at: datetime | None = None + """When the token expires, if known. Callers should refresh by calling `getEndpoint` again + before this time, or reactively on any 401/403 response from `baseUrl`. + """ + model: str | None = None + """The model the token is bound to, when applicable. When set, the token is only valid for + requests against this model. + """ + + @staticmethod + def from_dict(obj: Any) -> 'ProviderSessionToken': + assert isinstance(obj, dict) + header = from_str(obj.get("header")) + token = from_str(obj.get("token")) + expires_at = from_union([from_datetime, from_none], obj.get("expiresAt")) + model = from_union([from_str, from_none], obj.get("model")) + return ProviderSessionToken(header, token, expires_at, model) + + def to_dict(self) -> dict: + result: dict = {} + result["header"] = from_str(self.header) + result["token"] = from_str(self.token) + if self.expires_at is not None: + result["expiresAt"] = from_union([lambda x: x.isoformat(), from_none], self.expires_at) + if self.model is not None: + result["model"] = from_union([from_str, from_none], self.model) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class PushAttachmentFileLineRange: @@ -7356,6 +7403,14 @@ def to_dict(self) -> dict: class SlashCommandSelectSubcommandResultKind(Enum): SELECT_SUBCOMMAND = "select-subcommand" +# Experimental: this type is part of an experimental API and may change or be removed. +class SubagentSettingsEntryContextTier(Enum): + """Context tier override for matching subagents""" + + DEFAULT = "default" + INHERIT = "inherit" + LONG_CONTEXT = "long_context" + # Experimental: this type is part of an experimental API and may change or be removed. class TaskExecutionMode(Enum): """Whether task execution is synchronously awaited or managed in the background""" @@ -7868,6 +7923,19 @@ def to_dict(self) -> dict: result["model"] = from_union([from_str, from_none], self.model) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ToolsUpdateSubagentSettingsResult: + """Empty result after applying subagent settings""" + @staticmethod + def from_dict(obj: Any) -> 'ToolsUpdateSubagentSettingsResult': + assert isinstance(obj, dict) + return ToolsUpdateSubagentSettingsResult() + + def to_dict(self) -> dict: + result: dict = {} + return result + # Experimental: this type is part of an experimental API and may change or be removed. class UIAutoModeSwitchResponse(Enum): """User's choice for auto-mode switching: yes (allow this turn), yes_always (allow + persist @@ -9170,14 +9238,16 @@ class Extension: """Schema for the `Extension` type.""" id: str - """Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper')""" - + """Source-qualified ID (e.g., 'project:my-ext', 'user:auth-helper', + 'plugin:my-plugin:my-ext') + """ name: str """Extension name (directory name)""" source: ExtensionSource - """Discovery source: project (.github/extensions/) or user (~/.copilot/extensions/)""" - + """Discovery source: project (.github/extensions/), user (~/.copilot/extensions/), plugin + (installed plugin), or session (session-state//extensions/) + """ status: ExtensionStatus """Current status: running, disabled, failed, or starting""" @@ -12299,10 +12369,10 @@ class ProviderConfig: """Well-known model ID used for capability lookup. When set, agent behavior config and token limits are inferred from this model. """ - type: ProviderConfigType | None = None + type: ProviderType | None = None """Provider type. Defaults to "openai" for generic OpenAI-compatible APIs.""" - wire_api: ProviderConfigWireAPI | None = None + wire_api: ProviderWireAPI | None = None """Wire API format (openai/azure only). Defaults to "completions".""" wire_model: str | None = None @@ -12322,8 +12392,8 @@ def from_dict(obj: Any) -> 'ProviderConfig': max_output_tokens = from_union([from_float, from_none], obj.get("maxOutputTokens")) max_prompt_tokens = from_union([from_float, from_none], obj.get("maxPromptTokens")) model_id = from_union([from_str, from_none], obj.get("modelId")) - type = from_union([ProviderConfigType, from_none], obj.get("type")) - wire_api = from_union([ProviderConfigWireAPI, from_none], obj.get("wireApi")) + type = from_union([ProviderType, from_none], obj.get("type")) + wire_api = from_union([ProviderWireAPI, from_none], obj.get("wireApi")) wire_model = from_union([from_str, from_none], obj.get("wireModel")) return ProviderConfig(base_url, api_key, azure, bearer_token, headers, max_context_window_tokens, max_output_tokens, max_prompt_tokens, model_id, type, wire_api, wire_model) @@ -12347,13 +12417,62 @@ def to_dict(self) -> dict: if self.model_id is not None: result["modelId"] = from_union([from_str, from_none], self.model_id) if self.type is not None: - result["type"] = from_union([lambda x: to_enum(ProviderConfigType, x), from_none], self.type) + result["type"] = from_union([lambda x: to_enum(ProviderType, x), from_none], self.type) if self.wire_api is not None: - result["wireApi"] = from_union([lambda x: to_enum(ProviderConfigWireAPI, x), from_none], self.wire_api) + result["wireApi"] = from_union([lambda x: to_enum(ProviderWireAPI, x), from_none], self.wire_api) if self.wire_model is not None: result["wireModel"] = from_union([from_str, from_none], self.wire_model) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProviderEndpoint: + """A snapshot of the provider endpoint the session is currently configured to talk to.""" + + base_url: str + """Base URL to pass to the LLM client library.""" + + headers: dict[str, str] + """HTTP headers the caller must include on every outbound request.""" + + type: ProviderType + """Provider family. Matches the `type` field of a BYOK provider config.""" + + api_key: str | None = None + """A credential the caller should use with this endpoint. Omitted only when the endpoint + accepts unauthenticated requests. + """ + session_token: ProviderSessionToken | None = None + """Short-lived, rotating credential the caller must send on every request, in addition to + `apiKey` if one is present. Omitted when the endpoint does not require one. + """ + wire_api: ProviderWireAPI | None = None + """Wire API to be used, when required for the provider type.""" + + @staticmethod + def from_dict(obj: Any) -> 'ProviderEndpoint': + assert isinstance(obj, dict) + base_url = from_str(obj.get("baseUrl")) + headers = from_dict(from_str, obj.get("headers")) + type = ProviderType(obj.get("type")) + api_key = from_union([from_str, from_none], obj.get("apiKey")) + session_token = from_union([ProviderSessionToken.from_dict, from_none], obj.get("sessionToken")) + wire_api = from_union([ProviderWireAPI, from_none], obj.get("wireApi")) + return ProviderEndpoint(base_url, headers, type, api_key, session_token, wire_api) + + def to_dict(self) -> dict: + result: dict = {} + result["baseUrl"] = from_str(self.base_url) + result["headers"] = from_dict(from_str, self.headers) + result["type"] = to_enum(ProviderType, self.type) + if self.api_key is not None: + result["apiKey"] = from_union([from_str, from_none], self.api_key) + if self.session_token is not None: + result["sessionToken"] = from_union([lambda x: to_class(ProviderSessionToken, x), from_none], self.session_token) + if self.wire_api is not None: + result["wireApi"] = from_union([lambda x: to_enum(ProviderWireAPI, x), from_none], self.wire_api) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class PushAttachmentSelectionDetails: @@ -17815,6 +17934,13 @@ class SessionOpenOptions: excluded_tools: list[str] | None = None """Denylist of tool names.""" + # Internal: this field is an internal SDK API and is not part of the public surface. + exp_assignments: Any = None + """ExP assignment ('flight') data injected by an SDK integrator, in the same JSON shape the + Copilot CLI fetches from the experimentation service (CopilotExpAssignmentResponse). When + supplied this is fed into the FeatureFlagService exactly like CLI-fetched assignments and + ExP-backed flags wait for it. When absent the session does not block on ExP. + """ feature_flags: dict[str, bool] | None = None """Feature-flag values resolved by the host.""" @@ -17921,6 +18047,7 @@ def from_dict(obj: Any) -> 'SessionOpenOptions': env_value_mode = from_union([MCPSetEnvValueModeDetails, from_none], obj.get("envValueMode")) events_log_directory = from_union([from_str, from_none], obj.get("eventsLogDirectory")) excluded_tools = from_union([lambda x: from_list(from_str, x), from_none], obj.get("excludedTools")) + exp_assignments = obj.get("expAssignments") feature_flags = from_union([lambda x: from_dict(from_bool, x), from_none], obj.get("featureFlags")) installed_plugins = from_union([lambda x: from_list(InstalledPlugin.from_dict, x), from_none], obj.get("installedPlugins")) integration_id = from_union([from_str, from_none], obj.get("integrationId")) @@ -17948,7 +18075,7 @@ def from_dict(obj: Any) -> 'SessionOpenOptions': trajectory_file = from_union([from_str, from_none], obj.get("trajectoryFile")) working_directory = from_union([from_str, from_none], obj.get("workingDirectory")) working_directory_context = from_union([SessionContext.from_dict, from_none], obj.get("workingDirectoryContext")) - return SessionOpenOptions(additional_content_exclusion_policies, agent_context, ask_user_disabled, auth_info, available_tools, client_kind, client_name, coauthor_enabled, config_dir, continue_on_auto_mode, copilot_url, custom_agents_local_only, detached_from_spawning_parent_engagement_id, detached_from_spawning_parent_session_id, disabled_instruction_sources, disabled_skills, enable_on_demand_instruction_discovery, enable_script_safety, enable_streaming, env_value_mode, events_log_directory, excluded_tools, feature_flags, installed_plugins, integration_id, is_experimental_mode, log_interactive_shells, lsp_client_name, memory, model, model_capabilities_overrides, name, provider, reasoning_effort, reasoning_summary, remote_defaulted_on, remote_exporting, remote_steerable, running_in_interactive_mode, sandbox_config, session_capabilities, session_id, shell_init_profile, shell_process_flags, skill_directories, skip_custom_instructions, trajectory_file, working_directory, working_directory_context) + return SessionOpenOptions(additional_content_exclusion_policies, agent_context, ask_user_disabled, auth_info, available_tools, client_kind, client_name, coauthor_enabled, config_dir, continue_on_auto_mode, copilot_url, custom_agents_local_only, detached_from_spawning_parent_engagement_id, detached_from_spawning_parent_session_id, disabled_instruction_sources, disabled_skills, enable_on_demand_instruction_discovery, enable_script_safety, enable_streaming, env_value_mode, events_log_directory, excluded_tools, exp_assignments, feature_flags, installed_plugins, integration_id, is_experimental_mode, log_interactive_shells, lsp_client_name, memory, model, model_capabilities_overrides, name, provider, reasoning_effort, reasoning_summary, remote_defaulted_on, remote_exporting, remote_steerable, running_in_interactive_mode, sandbox_config, session_capabilities, session_id, shell_init_profile, shell_process_flags, skill_directories, skip_custom_instructions, trajectory_file, working_directory, working_directory_context) def to_dict(self) -> dict: result: dict = {} @@ -17996,6 +18123,8 @@ def to_dict(self) -> dict: result["eventsLogDirectory"] = from_union([from_str, from_none], self.events_log_directory) if self.excluded_tools is not None: result["excludedTools"] = from_union([lambda x: from_list(from_str, x), from_none], self.excluded_tools) + if self.exp_assignments is not None: + result["expAssignments"] = self.exp_assignments if self.feature_flags is not None: result["featureFlags"] = from_union([lambda x: from_dict(from_bool, x), from_none], self.feature_flags) if self.installed_plugins is not None: @@ -19190,6 +19319,28 @@ def to_dict(self) -> dict: result["source"] = from_union([lambda x: to_enum(PermissionsSetAAllSource, x), from_none], self.source) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class ProviderGetEndpointRequest: + """Optional model identifier to scope the endpoint snapshot to.""" + + model_id: str | None = None + """Model identifier the caller intends to use against the returned endpoint. Used to pick + the correct wire shape. Omit to use whichever model the session is currently using. + """ + + @staticmethod + def from_dict(obj: Any) -> 'ProviderGetEndpointRequest': + assert isinstance(obj, dict) + model_id = from_union([from_str, from_none], obj.get("modelId")) + return ProviderGetEndpointRequest(model_id) + + def to_dict(self) -> dict: + result: dict = {} + if self.model_id is not None: + result["modelId"] = from_union([from_str, from_none], self.model_id) + return result + # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass @@ -19310,6 +19461,64 @@ def to_dict(self) -> dict: result["taskType"] = from_union([lambda x: to_enum(TaskType, x), from_none], self.task_type) return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SubagentSettingsEntry: + """Subagent model, reasoning effort, and context tier settings""" + + context_tier: SubagentSettingsEntryContextTier | None = None + """Context tier override for matching subagents""" + + effort_level: str | None = None + """Reasoning effort override for matching subagents""" + + model: str | None = None + """Model override for matching subagents""" + + @staticmethod + def from_dict(obj: Any) -> 'SubagentSettingsEntry': + assert isinstance(obj, dict) + context_tier = from_union([SubagentSettingsEntryContextTier, from_none], obj.get("contextTier")) + effort_level = from_union([from_str, from_none], obj.get("effortLevel")) + model = from_union([from_str, from_none], obj.get("model")) + return SubagentSettingsEntry(context_tier, effort_level, model) + + def to_dict(self) -> dict: + result: dict = {} + if self.context_tier is not None: + result["contextTier"] = from_union([lambda x: to_enum(SubagentSettingsEntryContextTier, x), from_none], self.context_tier) + if self.effort_level is not None: + result["effortLevel"] = from_union([from_str, from_none], self.effort_level) + if self.model is not None: + result["model"] = from_union([from_str, from_none], self.model) + return result + +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class SubagentSettings: + """Configured per-agent subagent overrides""" + + agents: dict[str, SubagentSettingsEntry] | None = None + """Per-agent settings keyed by subagent agent_type""" + + disabled_subagents: list[str] | None = None + """Names of subagents the user has turned off; they cannot be dispatched""" + + @staticmethod + def from_dict(obj: Any) -> 'SubagentSettings': + assert isinstance(obj, dict) + agents = from_union([lambda x: from_dict(SubagentSettingsEntry.from_dict, x), from_none], obj.get("agents")) + disabled_subagents = from_union([lambda x: from_list(from_str, x), from_none], obj.get("disabledSubagents")) + return SubagentSettings(agents, disabled_subagents) + + def to_dict(self) -> dict: + result: dict = {} + if self.agents is not None: + result["agents"] = from_union([lambda x: from_dict(lambda x: to_class(SubagentSettingsEntry, x), x), from_none], self.agents) + if self.disabled_subagents is not None: + result["disabledSubagents"] = from_union([lambda x: from_list(from_str, x), from_none], self.disabled_subagents) + return result + # Experimental: this type is part of an experimental API and may change or be removed. @dataclass class ToolsGetCurrentMetadataResult: @@ -19367,6 +19576,26 @@ def to_dict(self) -> dict: result["onChunk"] = self.on_chunk return result +# Experimental: this type is part of an experimental API and may change or be removed. +@dataclass +class UpdateSubagentSettingsRequest: + """Subagent settings to apply to the current session""" + + subagents: SubagentSettings | None = None + """Subagent settings to apply, or null to clear the live session override""" + + @staticmethod + def from_dict(obj: Any) -> 'UpdateSubagentSettingsRequest': + assert isinstance(obj, dict) + subagents = from_union([SubagentSettings.from_dict, from_none], obj.get("subagents")) + return UpdateSubagentSettingsRequest(subagents) + + def to_dict(self) -> dict: + result: dict = {} + if self.subagents is not None: + result["subagents"] = from_union([lambda x: to_class(SubagentSettings, x), from_none], self.subagents) + return result + @dataclass class RPC: abort_request: AbortRequest @@ -19770,8 +19999,13 @@ class RPC: poll_spawned_sessions_result: PollSpawnedSessionsResult provider_config: ProviderConfig provider_config_azure: ProviderConfigAzure - provider_config_type: ProviderConfigType - provider_config_wire_api: ProviderConfigWireAPI + provider_config_type: ProviderType + provider_config_wire_api: ProviderWireAPI + provider_endpoint: ProviderEndpoint + provider_endpoint_type: ProviderType + provider_endpoint_wire_api: ProviderWireAPI + provider_get_endpoint_request: ProviderGetEndpointRequest + provider_session_token: ProviderSessionToken push_attachment: PushAttachment push_attachment_blob: PushAttachmentBlob push_attachment_directory: PushAttachmentDirectory @@ -19981,6 +20215,8 @@ class RPC: slash_command_select_subcommand_option: SlashCommandSelectSubcommandOption slash_command_select_subcommand_result: SlashCommandSelectSubcommandResult slash_command_text_result: SlashCommandTextResult + subagent_settings_entry: SubagentSettingsEntry + subagent_settings_entry_context_tier: SubagentSettingsEntryContextTier task_agent_info: TaskAgentInfo task_agent_progress: TaskAgentProgress task_execution_mode: TaskExecutionMode @@ -20014,6 +20250,7 @@ class RPC: tools_get_current_metadata_result: ToolsGetCurrentMetadataResult tools_initialize_and_validate_result: ToolsInitializeAndValidateResult tools_list_request: ToolsListRequest + tools_update_subagent_settings_result: ToolsUpdateSubagentSettingsResult ui_auto_mode_switch_response: UIAutoModeSwitchResponse ui_elicitation_array_any_of_field: UIElicitationArrayAnyOfField ui_elicitation_array_any_of_field_items: UIElicitationArrayAnyOfFieldItems @@ -20051,6 +20288,7 @@ class RPC: ui_unregister_direct_auto_mode_switch_handler_request: UIUnregisterDirectAutoModeSwitchHandlerRequest ui_unregister_direct_auto_mode_switch_handler_result: UIUnregisterDirectAutoModeSwitchHandlerResult ui_user_input_response: UIUserInputResponse + update_subagent_settings_request: UpdateSubagentSettingsRequest usage_get_metrics_result: UsageGetMetricsResult usage_metrics_code_changes: UsageMetricsCodeChanges usage_metrics_model_metric: UsageMetricsModelMetric @@ -20079,6 +20317,7 @@ class RPC: workspace_summary_host_type: HostType workspaces_workspace_details_host_type: HostType session_context_info: SessionContextInfo | None = None + subagent_settings: SubagentSettings | None = None task_progress: TaskProgress | None = None workspace_summary: WorkspaceSummary | None = None @@ -20486,8 +20725,13 @@ def from_dict(obj: Any) -> 'RPC': poll_spawned_sessions_result = PollSpawnedSessionsResult.from_dict(obj.get("PollSpawnedSessionsResult")) provider_config = ProviderConfig.from_dict(obj.get("ProviderConfig")) provider_config_azure = ProviderConfigAzure.from_dict(obj.get("ProviderConfigAzure")) - provider_config_type = ProviderConfigType(obj.get("ProviderConfigType")) - provider_config_wire_api = ProviderConfigWireAPI(obj.get("ProviderConfigWireApi")) + provider_config_type = ProviderType(obj.get("ProviderConfigType")) + provider_config_wire_api = ProviderWireAPI(obj.get("ProviderConfigWireApi")) + provider_endpoint = ProviderEndpoint.from_dict(obj.get("ProviderEndpoint")) + provider_endpoint_type = ProviderType(obj.get("ProviderEndpointType")) + provider_endpoint_wire_api = ProviderWireAPI(obj.get("ProviderEndpointWireApi")) + provider_get_endpoint_request = ProviderGetEndpointRequest.from_dict(obj.get("ProviderGetEndpointRequest")) + provider_session_token = ProviderSessionToken.from_dict(obj.get("ProviderSessionToken")) push_attachment = _load_PushAttachment(obj.get("PushAttachment")) push_attachment_blob = PushAttachmentBlob.from_dict(obj.get("PushAttachmentBlob")) push_attachment_directory = PushAttachmentDirectory.from_dict(obj.get("PushAttachmentDirectory")) @@ -20697,6 +20941,8 @@ def from_dict(obj: Any) -> 'RPC': slash_command_select_subcommand_option = SlashCommandSelectSubcommandOption.from_dict(obj.get("SlashCommandSelectSubcommandOption")) slash_command_select_subcommand_result = SlashCommandSelectSubcommandResult.from_dict(obj.get("SlashCommandSelectSubcommandResult")) slash_command_text_result = SlashCommandTextResult.from_dict(obj.get("SlashCommandTextResult")) + subagent_settings_entry = SubagentSettingsEntry.from_dict(obj.get("SubagentSettingsEntry")) + subagent_settings_entry_context_tier = SubagentSettingsEntryContextTier(obj.get("SubagentSettingsEntryContextTier")) task_agent_info = TaskAgentInfo.from_dict(obj.get("TaskAgentInfo")) task_agent_progress = TaskAgentProgress.from_dict(obj.get("TaskAgentProgress")) task_execution_mode = TaskExecutionMode(obj.get("TaskExecutionMode")) @@ -20730,6 +20976,7 @@ def from_dict(obj: Any) -> 'RPC': tools_get_current_metadata_result = ToolsGetCurrentMetadataResult.from_dict(obj.get("ToolsGetCurrentMetadataResult")) tools_initialize_and_validate_result = ToolsInitializeAndValidateResult.from_dict(obj.get("ToolsInitializeAndValidateResult")) tools_list_request = ToolsListRequest.from_dict(obj.get("ToolsListRequest")) + tools_update_subagent_settings_result = ToolsUpdateSubagentSettingsResult.from_dict(obj.get("ToolsUpdateSubagentSettingsResult")) ui_auto_mode_switch_response = UIAutoModeSwitchResponse(obj.get("UIAutoModeSwitchResponse")) ui_elicitation_array_any_of_field = UIElicitationArrayAnyOfField.from_dict(obj.get("UIElicitationArrayAnyOfField")) ui_elicitation_array_any_of_field_items = UIElicitationArrayAnyOfFieldItems.from_dict(obj.get("UIElicitationArrayAnyOfFieldItems")) @@ -20767,6 +21014,7 @@ def from_dict(obj: Any) -> 'RPC': ui_unregister_direct_auto_mode_switch_handler_request = UIUnregisterDirectAutoModeSwitchHandlerRequest.from_dict(obj.get("UIUnregisterDirectAutoModeSwitchHandlerRequest")) ui_unregister_direct_auto_mode_switch_handler_result = UIUnregisterDirectAutoModeSwitchHandlerResult.from_dict(obj.get("UIUnregisterDirectAutoModeSwitchHandlerResult")) ui_user_input_response = UIUserInputResponse.from_dict(obj.get("UIUserInputResponse")) + update_subagent_settings_request = UpdateSubagentSettingsRequest.from_dict(obj.get("UpdateSubagentSettingsRequest")) usage_get_metrics_result = UsageGetMetricsResult.from_dict(obj.get("UsageGetMetricsResult")) usage_metrics_code_changes = UsageMetricsCodeChanges.from_dict(obj.get("UsageMetricsCodeChanges")) usage_metrics_model_metric = UsageMetricsModelMetric.from_dict(obj.get("UsageMetricsModelMetric")) @@ -20795,9 +21043,10 @@ def from_dict(obj: Any) -> 'RPC': workspace_summary_host_type = HostType(obj.get("WorkspaceSummaryHostType")) workspaces_workspace_details_host_type = HostType(obj.get("WorkspacesWorkspaceDetailsHostType")) session_context_info = from_union([SessionContextInfo.from_dict, from_none], obj.get("SessionContextInfo")) + subagent_settings = from_union([SubagentSettings.from_dict, from_none], obj.get("SubagentSettings")) task_progress = from_union([TaskProgress.from_dict, from_none], obj.get("TaskProgress")) workspace_summary = from_union([WorkspaceSummary.from_dict, from_none], obj.get("WorkspaceSummary")) - return RPC(abort_request, abort_result, account_get_quota_request, account_get_quota_result, account_quota_snapshot, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, allow_all_permission_set_result, allow_all_permission_state, api_key_auth_info, auth_info, auth_info_type, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_instance_availability, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_session_context, command_list, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, configure_session_extensions_params, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_filter_mode, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, discovered_canvas, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_compact_context_window, history_compact_request, history_compact_result, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instructions_discover_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, local_session_metadata_value, log_request, log_result, lsp_initialize_request, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_filtered_server, mcp_host_state, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_register_external_client_request, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_restart_server_request, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_config, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_stdio, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_tools, mcp_unregister_external_client_request, memory_configuration, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, model, model_billing, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_picker_category, model_picker_price_category, model_policy, model_policy_state, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_to_request, model_switch_to_result, mode_set_request, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_reject, permission_decision_request, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_allow_all_request, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_allow_all_request, permissions_set_allow_all_source, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_list, plugin_list_result, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, poll_spawned_sessions_result, provider_config, provider_config_azure, provider_config_type, provider_config_wire_api, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, queued_command_handled, queued_command_not_handled, queued_command_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_most_recent_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, sandbox_config, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, schedule_entry, schedule_list, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_mode, send_request, send_result, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_auth_status, session_bulk_delete_result, session_capability, session_context, session_context_host_type, session_enrich_metadata_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_close_request, sessions_close_result, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_poll_spawned_sessions_event, sessions_poll_spawned_sessions_request, sessions_prune_old_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_working_directory_context, session_working_directory_context_host_type, shell_cancel_user_requested_request, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_kill_request, shell_kill_result, shell_kill_signal, shutdown_request, skill, skill_list, skills_config_set_disabled_skills_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_text_result, task_agent_info, task_agent_progress, task_execution_mode, task_info, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, tool, tool_list, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, usage_get_metrics_result, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_diff_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspace_summary_host_type, workspaces_workspace_details_host_type, session_context_info, task_progress, workspace_summary) + return RPC(abort_request, abort_result, account_get_quota_request, account_get_quota_result, account_quota_snapshot, agent_get_current_result, agent_info, agent_info_source, agent_list, agent_registry_live_target_entry, agent_registry_live_target_entry_attention_kind, agent_registry_live_target_entry_kind, agent_registry_live_target_entry_last_terminal_event, agent_registry_live_target_entry_status, agent_registry_log_capture, agent_registry_log_capture_open_error_reason, agent_registry_spawn_error, agent_registry_spawn_permission_mode, agent_registry_spawn_registry_timeout, agent_registry_spawn_request, agent_registry_spawn_result, agent_registry_spawn_spawned, agent_registry_spawn_validation_error, agent_registry_spawn_validation_error_field, agent_registry_spawn_validation_error_reason, agent_reload_result, agents_discover_request, agent_select_request, agent_select_result, allow_all_permission_set_result, allow_all_permission_state, api_key_auth_info, auth_info, auth_info_type, cancel_user_requested_shell_command_result, canvas_action, canvas_action_invoke_request, canvas_action_invoke_result, canvas_close_request, canvas_host_context, canvas_host_context_capabilities, canvas_instance_availability, canvas_json_schema, canvas_list, canvas_list_open_result, canvas_open_request, canvas_provider_close_request, canvas_provider_invoke_action_request, canvas_provider_open_request, canvas_provider_open_result, canvas_session_context, command_list, commands_handle_pending_command_request, commands_handle_pending_command_result, commands_invoke_request, commands_list_request, commands_respond_to_queued_command_request, commands_respond_to_queued_command_result, configure_session_extensions_params, connected_remote_session_metadata, connected_remote_session_metadata_kind, connected_remote_session_metadata_repository, connect_remote_session_params, connect_request, connect_result, content_filter_mode, copilot_api_token_auth_info, copilot_user_response, copilot_user_response_endpoints, copilot_user_response_quota_snapshots, copilot_user_response_quota_snapshots_chat, copilot_user_response_quota_snapshots_completions, copilot_user_response_quota_snapshots_premium_interactions, current_model, current_tool_metadata, discovered_canvas, discovered_mcp_server, discovered_mcp_server_type, enqueue_command_params, enqueue_command_result, env_auth_info, event_log_read_request, event_log_release_interest_result, event_log_tail_result, event_log_types, events_agent_scope, events_cursor_status, events_read_result, execute_command_params, execute_command_result, extension, extension_context_push_input, extension_list, extensions_disable_request, extensions_enable_request, extension_source, extension_status, external_tool_result, external_tool_text_result_for_llm, external_tool_text_result_for_llm_binary_results_for_llm, external_tool_text_result_for_llm_binary_results_for_llm_type, external_tool_text_result_for_llm_content, external_tool_text_result_for_llm_content_audio, external_tool_text_result_for_llm_content_image, external_tool_text_result_for_llm_content_resource, external_tool_text_result_for_llm_content_resource_details, external_tool_text_result_for_llm_content_resource_link, external_tool_text_result_for_llm_content_resource_link_icon, external_tool_text_result_for_llm_content_resource_link_icon_theme, external_tool_text_result_for_llm_content_terminal, external_tool_text_result_for_llm_content_text, filter_mapping, fleet_start_request, fleet_start_result, folder_trust_add_params, folder_trust_check_params, folder_trust_check_result, gh_cli_auth_info, handle_pending_tool_call_request, handle_pending_tool_call_result, history_abort_manual_compaction_result, history_cancel_background_compaction_result, history_compact_context_window, history_compact_request, history_compact_result, history_summarize_for_handoff_result, history_truncate_request, history_truncate_result, hmac_auth_info, installed_plugin, installed_plugin_info, installed_plugin_source, installed_plugin_source_git_hub, installed_plugin_source_local, installed_plugin_source_url, instructions_discover_request, instructions_get_sources_result, instruction_source, instruction_source_location, instruction_source_type, local_session_metadata_value, log_request, log_result, lsp_initialize_request, marketplace_add_result, marketplace_browse_result, marketplace_info, marketplace_list_result, marketplace_plugin_info, marketplace_refresh_entry, marketplace_refresh_result, marketplace_remove_result, mcp_allowed_server, mcp_apps_call_tool_request, mcp_apps_diagnose_capability, mcp_apps_diagnose_request, mcp_apps_diagnose_result, mcp_apps_diagnose_server, mcp_apps_host_context, mcp_apps_host_context_details, mcp_apps_host_context_details_available_display_mode, mcp_apps_host_context_details_display_mode, mcp_apps_host_context_details_platform, mcp_apps_host_context_details_theme, mcp_apps_list_tools_request, mcp_apps_list_tools_result, mcp_apps_read_resource_request, mcp_apps_read_resource_result, mcp_apps_resource_content, mcp_apps_set_host_context_details, mcp_apps_set_host_context_details_available_display_mode, mcp_apps_set_host_context_details_display_mode, mcp_apps_set_host_context_details_platform, mcp_apps_set_host_context_details_theme, mcp_apps_set_host_context_request, mcp_cancel_sampling_execution_params, mcp_cancel_sampling_execution_result, mcp_config_add_request, mcp_config_disable_request, mcp_config_enable_request, mcp_config_list, mcp_config_remove_request, mcp_config_update_request, mcp_configure_git_hub_request, mcp_configure_git_hub_result, mcp_disable_request, mcp_discover_request, mcp_discover_result, mcp_enable_request, mcp_execute_sampling_params, mcp_execute_sampling_request, mcp_execute_sampling_result, mcp_filtered_server, mcp_host_state, mcp_is_server_running_request, mcp_is_server_running_result, mcp_list_tools_request, mcp_list_tools_result, mcp_oauth_login_request, mcp_oauth_login_result, mcp_oauth_respond_request, mcp_oauth_respond_result, mcp_register_external_client_request, mcp_reload_with_config_request, mcp_remove_git_hub_result, mcp_restart_server_request, mcp_sampling_execution_action, mcp_sampling_execution_result, mcp_server, mcp_server_auth_config, mcp_server_auth_config_redirect_port, mcp_server_config, mcp_server_config_http, mcp_server_config_http_oauth_grant_type, mcp_server_config_http_type, mcp_server_config_stdio, mcp_server_failure_info, mcp_server_list, mcp_server_needs_auth_info, mcp_set_env_value_mode_details, mcp_set_env_value_mode_params, mcp_set_env_value_mode_result, mcp_start_server_request, mcp_start_servers_result, mcp_stop_server_request, mcp_tools, mcp_unregister_external_client_request, memory_configuration, metadata_context_info_request, metadata_context_info_result, metadata_is_processing_result, metadata_recompute_context_tokens_request, metadata_recompute_context_tokens_result, metadata_record_context_change_request, metadata_record_context_change_result, metadata_set_working_directory_request, metadata_set_working_directory_result, metadata_snapshot_current_mode, metadata_snapshot_remote_metadata, metadata_snapshot_remote_metadata_repository, metadata_snapshot_remote_metadata_task_type, model, model_billing, model_billing_token_prices, model_billing_token_prices_long_context, model_capabilities, model_capabilities_limits, model_capabilities_limits_vision, model_capabilities_override, model_capabilities_override_limits, model_capabilities_override_limits_vision, model_capabilities_override_supports, model_capabilities_supports, model_list, model_list_request, model_picker_category, model_picker_price_category, model_policy, model_policy_state, model_set_reasoning_effort_request, model_set_reasoning_effort_result, models_list_request, model_switch_to_request, model_switch_to_result, mode_set_request, name_get_result, name_set_auto_request, name_set_auto_result, name_set_request, open_canvas_instance, options_update_additional_content_exclusion_policy, options_update_additional_content_exclusion_policy_rule, options_update_additional_content_exclusion_policy_rule_source, options_update_additional_content_exclusion_policy_scope, options_update_context_tier, options_update_env_value_mode, options_update_reasoning_summary, options_update_tool_filter_precedence, pending_permission_request, pending_permission_request_list, permission_decision, permission_decision_approved, permission_decision_approved_for_location, permission_decision_approved_for_session, permission_decision_approve_for_location, permission_decision_approve_for_location_approval, permission_decision_approve_for_location_approval_commands, permission_decision_approve_for_location_approval_custom_tool, permission_decision_approve_for_location_approval_extension_management, permission_decision_approve_for_location_approval_extension_permission_access, permission_decision_approve_for_location_approval_mcp, permission_decision_approve_for_location_approval_mcp_sampling, permission_decision_approve_for_location_approval_memory, permission_decision_approve_for_location_approval_read, permission_decision_approve_for_location_approval_write, permission_decision_approve_for_session, permission_decision_approve_for_session_approval, permission_decision_approve_for_session_approval_commands, permission_decision_approve_for_session_approval_custom_tool, permission_decision_approve_for_session_approval_extension_management, permission_decision_approve_for_session_approval_extension_permission_access, permission_decision_approve_for_session_approval_mcp, permission_decision_approve_for_session_approval_mcp_sampling, permission_decision_approve_for_session_approval_memory, permission_decision_approve_for_session_approval_read, permission_decision_approve_for_session_approval_write, permission_decision_approve_once, permission_decision_approve_permanently, permission_decision_cancelled, permission_decision_denied_by_content_exclusion_policy, permission_decision_denied_by_permission_request_hook, permission_decision_denied_by_rules, permission_decision_denied_interactively_by_user, permission_decision_denied_no_approval_rule_and_could_not_request_from_user, permission_decision_reject, permission_decision_request, permission_decision_user_not_available, permission_location_add_tool_approval_params, permission_location_apply_params, permission_location_apply_result, permission_location_resolve_params, permission_location_resolve_result, permission_location_type, permission_paths_add_params, permission_paths_allowed_check_params, permission_paths_allowed_check_result, permission_paths_config, permission_paths_list, permission_paths_update_primary_params, permission_paths_workspace_check_params, permission_paths_workspace_check_result, permission_prompt_shown_notification, permission_request_result, permission_rules_set, permissions_configure_additional_content_exclusion_policy, permissions_configure_additional_content_exclusion_policy_rule, permissions_configure_additional_content_exclusion_policy_rule_source, permissions_configure_additional_content_exclusion_policy_scope, permissions_configure_params, permissions_configure_result, permissions_folder_trust_add_trusted_result, permissions_get_allow_all_request, permissions_locations_add_tool_approval_details, permissions_locations_add_tool_approval_details_commands, permissions_locations_add_tool_approval_details_custom_tool, permissions_locations_add_tool_approval_details_extension_management, permissions_locations_add_tool_approval_details_extension_permission_access, permissions_locations_add_tool_approval_details_mcp, permissions_locations_add_tool_approval_details_mcp_sampling, permissions_locations_add_tool_approval_details_memory, permissions_locations_add_tool_approval_details_read, permissions_locations_add_tool_approval_details_write, permissions_locations_add_tool_approval_result, permissions_modify_rules_params, permissions_modify_rules_result, permissions_modify_rules_scope, permissions_notify_prompt_shown_result, permissions_paths_add_result, permissions_paths_list_request, permissions_paths_update_primary_result, permissions_pending_requests_request, permissions_reset_session_approvals_request, permissions_reset_session_approvals_result, permissions_set_allow_all_request, permissions_set_allow_all_source, permissions_set_approve_all_request, permissions_set_approve_all_result, permissions_set_approve_all_source, permissions_set_required_request, permissions_set_required_result, permissions_urls_set_unrestricted_mode_result, permission_urls_config, permission_urls_set_unrestricted_mode_params, ping_request, ping_result, plan_read_result, plan_read_sql_todos_result, plan_read_sql_todos_with_dependencies_result, plan_sql_todo_dependency, plan_sql_todos_row, plan_update_request, plugin, plugin_install_result, plugin_list, plugin_list_result, plugins_disable_request, plugins_enable_request, plugins_install_request, plugins_marketplaces_add_request, plugins_marketplaces_browse_request, plugins_marketplaces_refresh_request, plugins_marketplaces_remove_request, plugins_reload_request, plugins_uninstall_request, plugins_update_request, plugin_update_all_entry, plugin_update_all_result, plugin_update_result, poll_spawned_sessions_result, provider_config, provider_config_azure, provider_config_type, provider_config_wire_api, provider_endpoint, provider_endpoint_type, provider_endpoint_wire_api, provider_get_endpoint_request, provider_session_token, push_attachment, push_attachment_blob, push_attachment_directory, push_attachment_file, push_attachment_file_line_range, push_attachment_git_hub_reference, push_attachment_git_hub_reference_type, push_attachment_selection, push_attachment_selection_details, push_attachment_selection_details_end, push_attachment_selection_details_start, queued_command_handled, queued_command_not_handled, queued_command_result, queue_pending_items, queue_pending_items_kind, queue_pending_items_result, queue_remove_most_recent_result, register_event_interest_params, register_event_interest_result, register_extension_tools_params, register_extension_tools_result, release_event_interest_params, remote_control_config, remote_control_config_existing_mc_session, remote_control_status, remote_control_status_active, remote_control_status_connecting, remote_control_status_error, remote_control_status_off, remote_control_status_result, remote_control_stop_result, remote_control_transfer_result, remote_enable_request, remote_enable_result, remote_notify_steerable_changed_request, remote_notify_steerable_changed_result, remote_session_connection_result, remote_session_metadata_repository, remote_session_metadata_task_type, remote_session_metadata_value, remote_session_mode, remote_session_repository, sandbox_config, sandbox_config_user_policy, sandbox_config_user_policy_experimental, sandbox_config_user_policy_experimental_seatbelt, sandbox_config_user_policy_filesystem, sandbox_config_user_policy_network, schedule_entry, schedule_list, schedule_stop_request, schedule_stop_result, secrets_add_filter_values_request, secrets_add_filter_values_result, send_agent_mode, send_attachments_to_message_params, send_mode, send_request, send_result, server_agent_list, server_instruction_source_list, server_skill, server_skill_list, session_activity, session_auth_status, session_bulk_delete_result, session_capability, session_context, session_context_host_type, session_enrich_metadata_result, session_fs_append_file_request, session_fs_error, session_fs_error_code, session_fs_exists_request, session_fs_exists_result, session_fs_mkdir_request, session_fs_readdir_request, session_fs_readdir_result, session_fs_readdir_with_types_entry, session_fs_readdir_with_types_entry_type, session_fs_readdir_with_types_request, session_fs_readdir_with_types_result, session_fs_read_file_request, session_fs_read_file_result, session_fs_rename_request, session_fs_rm_request, session_fs_set_provider_capabilities, session_fs_set_provider_conventions, session_fs_set_provider_request, session_fs_set_provider_result, session_fs_sqlite_exists_request, session_fs_sqlite_exists_result, session_fs_sqlite_query_request, session_fs_sqlite_query_result, session_fs_sqlite_query_type, session_fs_stat_request, session_fs_stat_result, session_fs_write_file_request, session_installed_plugin, session_installed_plugin_source, session_installed_plugin_source_git_hub, session_installed_plugin_source_local, session_installed_plugin_source_url, session_list, session_list_entry, session_list_filter, session_load_deferred_repo_hooks_result, session_log_level, session_mcp_apps_call_tool_result, session_metadata_snapshot, session_mode, session_model_list, session_open_options, session_open_options_additional_content_exclusion_policy, session_open_options_additional_content_exclusion_policy_rule, session_open_options_additional_content_exclusion_policy_rule_source, session_open_options_additional_content_exclusion_policy_scope, session_open_options_env_value_mode, session_open_options_reasoning_summary, session_open_params, session_open_result, session_prune_result, sessions_bulk_delete_request, sessions_check_in_use_request, sessions_check_in_use_result, sessions_close_request, sessions_close_result, sessions_enrich_metadata_request, session_set_credentials_params, session_set_credentials_result, sessions_find_by_prefix_request, sessions_find_by_prefix_result, sessions_find_by_task_id_request, sessions_find_by_task_id_result, sessions_fork_request, sessions_fork_result, sessions_get_board_entry_count_request, sessions_get_board_entry_count_result, sessions_get_event_file_path_request, sessions_get_event_file_path_result, sessions_get_last_for_context_request, sessions_get_last_for_context_result, sessions_get_persisted_remote_steerable_request, sessions_get_persisted_remote_steerable_result, session_sizes, sessions_list_request, sessions_load_deferred_repo_hooks_request, sessions_open_attach, sessions_open_cloud, sessions_open_create, sessions_open_handoff, sessions_open_handoff_task_type, sessions_open_progress, sessions_open_progress_status, sessions_open_progress_step, sessions_open_remote, sessions_open_resume, sessions_open_resume_last, sessions_open_status, session_source, sessions_poll_spawned_sessions_event, sessions_poll_spawned_sessions_request, sessions_prune_old_request, sessions_register_extension_tools_on_session_options, sessions_release_lock_request, sessions_release_lock_result, sessions_reload_plugin_hooks_request, sessions_reload_plugin_hooks_result, sessions_save_request, sessions_save_result, sessions_set_additional_plugins_request, sessions_set_additional_plugins_result, sessions_set_remote_control_steering_request, sessions_start_remote_control_request, sessions_stop_remote_control_request, sessions_transfer_remote_control_request, session_telemetry_engagement, session_update_options_params, session_update_options_result, session_working_directory_context, session_working_directory_context_host_type, shell_cancel_user_requested_request, shell_exec_request, shell_exec_result, shell_execute_user_requested_request, shell_kill_request, shell_kill_result, shell_kill_signal, shutdown_request, skill, skill_list, skills_config_set_disabled_skills_request, skills_disable_request, skills_discover_request, skills_enable_request, skills_get_invoked_result, skills_invoked_skill, skills_load_diagnostics, slash_command_agent_prompt_result, slash_command_completed_result, slash_command_info, slash_command_input, slash_command_input_completion, slash_command_invocation_result, slash_command_kind, slash_command_select_subcommand_option, slash_command_select_subcommand_result, slash_command_text_result, subagent_settings_entry, subagent_settings_entry_context_tier, task_agent_info, task_agent_progress, task_execution_mode, task_info, task_list, task_progress_line, tasks_cancel_request, tasks_cancel_result, tasks_get_current_promotable_result, tasks_get_progress_request, tasks_get_progress_result, task_shell_info, task_shell_info_attachment_mode, task_shell_progress, tasks_promote_current_to_background_result, tasks_promote_to_background_request, tasks_promote_to_background_result, tasks_refresh_result, tasks_remove_request, tasks_remove_result, tasks_send_message_request, tasks_send_message_result, tasks_start_agent_request, tasks_start_agent_result, task_status, tasks_wait_for_pending_result, telemetry_set_feature_overrides_request, token_auth_info, tool, tool_list, tools_get_current_metadata_result, tools_initialize_and_validate_result, tools_list_request, tools_update_subagent_settings_result, ui_auto_mode_switch_response, ui_elicitation_array_any_of_field, ui_elicitation_array_any_of_field_items, ui_elicitation_array_any_of_field_items_any_of, ui_elicitation_array_enum_field, ui_elicitation_array_enum_field_items, ui_elicitation_field_value, ui_elicitation_request, ui_elicitation_response, ui_elicitation_response_action, ui_elicitation_response_content, ui_elicitation_result, ui_elicitation_schema, ui_elicitation_schema_property, ui_elicitation_schema_property_boolean, ui_elicitation_schema_property_number, ui_elicitation_schema_property_number_type, ui_elicitation_schema_property_string, ui_elicitation_schema_property_string_format, ui_elicitation_string_enum_field, ui_elicitation_string_one_of_field, ui_elicitation_string_one_of_field_one_of, ui_ephemeral_query_request, ui_ephemeral_query_result, ui_exit_plan_mode_action, ui_exit_plan_mode_response, ui_handle_pending_auto_mode_switch_request, ui_handle_pending_elicitation_request, ui_handle_pending_exit_plan_mode_request, ui_handle_pending_result, ui_handle_pending_sampling_request, ui_handle_pending_sampling_response, ui_handle_pending_user_input_request, ui_register_direct_auto_mode_switch_handler_result, ui_unregister_direct_auto_mode_switch_handler_request, ui_unregister_direct_auto_mode_switch_handler_result, ui_user_input_response, update_subagent_settings_request, usage_get_metrics_result, usage_metrics_code_changes, usage_metrics_model_metric, usage_metrics_model_metric_requests, usage_metrics_model_metric_token_detail, usage_metrics_model_metric_usage, usage_metrics_token_detail, user_auth_info, user_requested_shell_command_result, workspace_diff_file_change, workspace_diff_file_change_type, workspace_diff_mode, workspace_diff_result, workspaces_checkpoints, workspaces_create_file_request, workspaces_diff_request, workspaces_get_workspace_result, workspaces_list_checkpoints_result, workspaces_list_files_result, workspaces_read_checkpoint_request, workspaces_read_checkpoint_result, workspaces_read_file_request, workspaces_read_file_result, workspaces_save_large_paste_request, workspaces_save_large_paste_result, workspace_summary_host_type, workspaces_workspace_details_host_type, session_context_info, subagent_settings, task_progress, workspace_summary) def to_dict(self) -> dict: result: dict = {} @@ -21202,8 +21451,13 @@ def to_dict(self) -> dict: result["PollSpawnedSessionsResult"] = to_class(PollSpawnedSessionsResult, self.poll_spawned_sessions_result) result["ProviderConfig"] = to_class(ProviderConfig, self.provider_config) result["ProviderConfigAzure"] = to_class(ProviderConfigAzure, self.provider_config_azure) - result["ProviderConfigType"] = to_enum(ProviderConfigType, self.provider_config_type) - result["ProviderConfigWireApi"] = to_enum(ProviderConfigWireAPI, self.provider_config_wire_api) + result["ProviderConfigType"] = to_enum(ProviderType, self.provider_config_type) + result["ProviderConfigWireApi"] = to_enum(ProviderWireAPI, self.provider_config_wire_api) + result["ProviderEndpoint"] = to_class(ProviderEndpoint, self.provider_endpoint) + result["ProviderEndpointType"] = to_enum(ProviderType, self.provider_endpoint_type) + result["ProviderEndpointWireApi"] = to_enum(ProviderWireAPI, self.provider_endpoint_wire_api) + result["ProviderGetEndpointRequest"] = to_class(ProviderGetEndpointRequest, self.provider_get_endpoint_request) + result["ProviderSessionToken"] = to_class(ProviderSessionToken, self.provider_session_token) result["PushAttachment"] = (self.push_attachment).to_dict() result["PushAttachmentBlob"] = to_class(PushAttachmentBlob, self.push_attachment_blob) result["PushAttachmentDirectory"] = to_class(PushAttachmentDirectory, self.push_attachment_directory) @@ -21413,6 +21667,8 @@ def to_dict(self) -> dict: result["SlashCommandSelectSubcommandOption"] = to_class(SlashCommandSelectSubcommandOption, self.slash_command_select_subcommand_option) result["SlashCommandSelectSubcommandResult"] = to_class(SlashCommandSelectSubcommandResult, self.slash_command_select_subcommand_result) result["SlashCommandTextResult"] = to_class(SlashCommandTextResult, self.slash_command_text_result) + result["SubagentSettingsEntry"] = to_class(SubagentSettingsEntry, self.subagent_settings_entry) + result["SubagentSettingsEntryContextTier"] = to_enum(SubagentSettingsEntryContextTier, self.subagent_settings_entry_context_tier) result["TaskAgentInfo"] = to_class(TaskAgentInfo, self.task_agent_info) result["TaskAgentProgress"] = to_class(TaskAgentProgress, self.task_agent_progress) result["TaskExecutionMode"] = to_enum(TaskExecutionMode, self.task_execution_mode) @@ -21446,6 +21702,7 @@ def to_dict(self) -> dict: result["ToolsGetCurrentMetadataResult"] = to_class(ToolsGetCurrentMetadataResult, self.tools_get_current_metadata_result) result["ToolsInitializeAndValidateResult"] = to_class(ToolsInitializeAndValidateResult, self.tools_initialize_and_validate_result) result["ToolsListRequest"] = to_class(ToolsListRequest, self.tools_list_request) + result["ToolsUpdateSubagentSettingsResult"] = to_class(ToolsUpdateSubagentSettingsResult, self.tools_update_subagent_settings_result) result["UIAutoModeSwitchResponse"] = to_enum(UIAutoModeSwitchResponse, self.ui_auto_mode_switch_response) result["UIElicitationArrayAnyOfField"] = to_class(UIElicitationArrayAnyOfField, self.ui_elicitation_array_any_of_field) result["UIElicitationArrayAnyOfFieldItems"] = to_class(UIElicitationArrayAnyOfFieldItems, self.ui_elicitation_array_any_of_field_items) @@ -21483,6 +21740,7 @@ def to_dict(self) -> dict: result["UIUnregisterDirectAutoModeSwitchHandlerRequest"] = to_class(UIUnregisterDirectAutoModeSwitchHandlerRequest, self.ui_unregister_direct_auto_mode_switch_handler_request) result["UIUnregisterDirectAutoModeSwitchHandlerResult"] = to_class(UIUnregisterDirectAutoModeSwitchHandlerResult, self.ui_unregister_direct_auto_mode_switch_handler_result) result["UIUserInputResponse"] = to_class(UIUserInputResponse, self.ui_user_input_response) + result["UpdateSubagentSettingsRequest"] = to_class(UpdateSubagentSettingsRequest, self.update_subagent_settings_request) result["UsageGetMetricsResult"] = to_class(UsageGetMetricsResult, self.usage_get_metrics_result) result["UsageMetricsCodeChanges"] = to_class(UsageMetricsCodeChanges, self.usage_metrics_code_changes) result["UsageMetricsModelMetric"] = to_class(UsageMetricsModelMetric, self.usage_metrics_model_metric) @@ -21511,6 +21769,7 @@ def to_dict(self) -> dict: result["WorkspaceSummaryHostType"] = to_enum(HostType, self.workspace_summary_host_type) result["WorkspacesWorkspaceDetailsHostType"] = to_enum(HostType, self.workspaces_workspace_details_host_type) result["SessionContextInfo"] = from_union([lambda x: to_class(SessionContextInfo, x), from_none], self.session_context_info) + result["SubagentSettings"] = from_union([lambda x: to_class(SubagentSettings, x), from_none], self.subagent_settings) result["TaskProgress"] = from_union([lambda x: to_class(TaskProgress, x), from_none], self.task_progress) result["WorkspaceSummary"] = from_union([lambda x: to_class(WorkspaceSummary, x), from_none], self.workspace_summary) return result @@ -21756,6 +22015,10 @@ def _load_TaskInfo(obj: Any) -> "TaskInfo": PermissionsConfigureAdditionalContentExclusionPolicyScope = AdditionalContentExclusionPolicyScope PermissionsSetAllowAllSource = PermissionsSetAAllSource PermissionsSetApproveAllSource = PermissionsSetAAllSource +ProviderConfigType = ProviderType +ProviderConfigWireApi = ProviderWireAPI +ProviderEndpointType = ProviderType +ProviderEndpointWireApi = ProviderWireAPI RemoteSessionMetadataTaskType = TaskType SessionContextHostType = HostType SessionMcpAppsCallToolResult = dict @@ -22732,6 +22995,19 @@ async def reload(self, params: PluginsReloadRequest | None = None, *, timeout: f await self._client.request("session.plugins.reload", params_dict, **_timeout_kwargs(timeout)) +# Experimental: this API group is experimental and may change or be removed. +class ProviderApi: + def __init__(self, client: "JsonRpcClient", session_id: str): + self._client = client + self._session_id = session_id + + async def get_endpoint(self, params: ProviderGetEndpointRequest | None = None, *, timeout: float | None = None) -> ProviderEndpoint: + "Returns the provider endpoint and credentials the session is currently configured to talk to, so the caller can make inference calls directly against the same backend the session uses.\n\nArgs:\n params: Optional model identifier to scope the endpoint snapshot to.\n\nReturns:\n A snapshot of the provider endpoint the session is currently configured to talk to." + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} if params is not None else {} + params_dict["sessionId"] = self._session_id + return ProviderEndpoint.from_dict(await self._client.request("session.provider.getEndpoint", params_dict, **_timeout_kwargs(timeout))) + + # Experimental: this API group is experimental and may change or be removed. class OptionsApi: def __init__(self, client: "JsonRpcClient", session_id: str): @@ -22811,6 +23087,12 @@ async def get_current_metadata(self, *, timeout: float | None = None) -> ToolsGe "Returns lightweight metadata for the session's currently initialized tools.\n\nReturns:\n Current lightweight tool metadata snapshot for the session." return ToolsGetCurrentMetadataResult.from_dict(await self._client.request("session.tools.getCurrentMetadata", {"sessionId": self._session_id}, **_timeout_kwargs(timeout))) + async def update_subagent_settings(self, params: UpdateSubagentSettingsRequest, *, timeout: float | None = None) -> ToolsUpdateSubagentSettingsResult: + "Updates the current session's live subagent settings after user settings change. The persisted user settings remain the source of truth for future sessions.\n\nArgs:\n params: Subagent settings to apply to the current session\n\nReturns:\n Empty result after applying subagent settings" + params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} + params_dict["sessionId"] = self._session_id + return ToolsUpdateSubagentSettingsResult.from_dict(await self._client.request("session.tools.updateSubagentSettings", params_dict, **_timeout_kwargs(timeout))) + # Experimental: this API group is experimental and may change or be removed. class CommandsApi: @@ -23311,6 +23593,7 @@ def __init__(self, client: "JsonRpcClient", session_id: str): self.skills = SkillsApi(client, session_id) self.mcp = McpApi(client, session_id) self.plugins = PluginsApi(client, session_id) + self.provider = ProviderApi(client, session_id) self.options = OptionsApi(client, session_id) self.lsp = LspApi(client, session_id) self.extensions = ExtensionsApi(client, session_id) @@ -24065,10 +24348,18 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "PluginsUninstallRequest", "PluginsUpdateRequest", "PollSpawnedSessionsResult", + "ProviderApi", "ProviderConfig", "ProviderConfigAzure", "ProviderConfigType", - "ProviderConfigWireAPI", + "ProviderConfigWireApi", + "ProviderEndpoint", + "ProviderEndpointType", + "ProviderEndpointWireApi", + "ProviderGetEndpointRequest", + "ProviderSessionToken", + "ProviderType", + "ProviderWireAPI", "PurpleSource", "PushAttachment", "PushAttachmentBlob", @@ -24328,6 +24619,9 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "SlashCommandSelectSubcommandResultKind", "SlashCommandTextResult", "StickySource", + "SubagentSettings", + "SubagentSettingsEntry", + "SubagentSettingsEntryContextTier", "TaskAgentInfo", "TaskAgentInfoType", "TaskAgentProgress", @@ -24374,6 +24668,7 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "ToolsGetCurrentMetadataResult", "ToolsInitializeAndValidateResult", "ToolsListRequest", + "ToolsUpdateSubagentSettingsResult", "UIAutoModeSwitchResponse", "UIElicitationArrayAnyOfField", "UIElicitationArrayAnyOfFieldItems", @@ -24415,6 +24710,7 @@ async def handle_canvas_action_invoke(params: dict) -> dict | None: "UIUnregisterDirectAutoModeSwitchHandlerResult", "UIUserInputResponse", "UiApi", + "UpdateSubagentSettingsRequest", "UsageApi", "UsageGetMetricsResult", "UsageMetricsCodeChanges", From 762a2e1aa04a7c57110aa93447de69ff9f1ea77a Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 11:39:36 +0100 Subject: [PATCH 06/22] Apply prettier formatting to session_todos_changed e2e test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/test/e2e/session_todos_changed.e2e.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nodejs/test/e2e/session_todos_changed.e2e.test.ts b/nodejs/test/e2e/session_todos_changed.e2e.test.ts index bb4608ca0..852b10a5a 100644 --- a/nodejs/test/e2e/session_todos_changed.e2e.test.ts +++ b/nodejs/test/e2e/session_todos_changed.e2e.test.ts @@ -46,7 +46,10 @@ describe("Todos changed event + readSqlTodosWithDependencies", async () => { expect(todosEvents.length).toBeGreaterThanOrEqual(1); const result = await session.rpc.plan.readSqlTodosWithDependencies(); - const ids = result.rows.map((r) => r.id).filter((x): x is string => !!x).sort(); + const ids = result.rows + .map((r) => r.id) + .filter((x): x is string => !!x) + .sort(); expect(ids).toEqual(["alpha", "beta"]); const edge = result.dependencies.find( From 9f3a8ee24ff4d8b0654a3b6089e4c6f6ed767d24 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 11:42:09 +0100 Subject: [PATCH 07/22] Apply ruff format to session_todos_changed python e2e test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- python/e2e/test_session_todos_changed_e2e.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/e2e/test_session_todos_changed_e2e.py b/python/e2e/test_session_todos_changed_e2e.py index b16008431..a8e1512c0 100644 --- a/python/e2e/test_session_todos_changed_e2e.py +++ b/python/e2e/test_session_todos_changed_e2e.py @@ -48,4 +48,4 @@ async def test_fires_session_todos_changed_and_exposes_rows_and_dependencies( assert any( dependency.todo_id == "beta" and dependency.depends_on == "alpha" for dependency in result.dependencies - ) \ No newline at end of file + ) From 9221e06a4ee2a862c591efdd4c86b214e2b073b3 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 11:47:24 +0100 Subject: [PATCH 08/22] Apply Java spotless formatting to SessionTodosChangedTest Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../java/com/github/copilot/SessionTodosChangedTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java b/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java index b0dd2fd46..182c77ac2 100644 --- a/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java +++ b/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java @@ -40,8 +40,7 @@ static void teardown() throws Exception { @Test void firesSessionTodosChangedAndExposesRowsAndDependencies() throws Exception { - ctx.configureForTest("session_todos_changed", - "fires_session_todos_changed_and_exposes_rows_and_dependencies"); + ctx.configureForTest("session_todos_changed", "fires_session_todos_changed_and_exposes_rows_and_dependencies"); try (CopilotClient client = ctx.createClient()) { CopilotSession session = client @@ -50,8 +49,8 @@ void firesSessionTodosChangedAndExposesRowsAndDependencies() throws Exception { List events = Collections.synchronizedList(new ArrayList<>()); session.on(events::add); - session.sendAndWait(new MessageOptions().setPrompt( - "Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + session.sendAndWait(new MessageOptions() + .setPrompt("Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" + "1. INSERT INTO todos (id, title, status) VALUES ('alpha', 'First todo', 'pending');\n" + "2. INSERT INTO todos (id, title, status) VALUES ('beta', 'Second todo', 'done');\n" + "3. INSERT INTO todo_deps (todo_id, depends_on) VALUES ('beta', 'alpha');\n" From 7b3e35ab1c053b2752497f299020546f63cae0dc Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:00:35 +0100 Subject: [PATCH 09/22] Fix .NET test to use OrderBy for net472 compatibility .Order() is .NET 7+ only; net472 needs .OrderBy(x => x, comparer). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dotnet/test/E2E/SessionTodosChangedE2ETests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/test/E2E/SessionTodosChangedE2ETests.cs b/dotnet/test/E2E/SessionTodosChangedE2ETests.cs index 1954e72ab..32d4c0121 100644 --- a/dotnet/test/E2E/SessionTodosChangedE2ETests.cs +++ b/dotnet/test/E2E/SessionTodosChangedE2ETests.cs @@ -43,7 +43,7 @@ await session.SendAndWaitAsync(new MessageOptions var ids = result.Rows .Select(row => row.Id) .OfType() - .Order(StringComparer.Ordinal) + .OrderBy(id => id, StringComparer.Ordinal) .ToArray(); Assert.Equal(ExpectedTodoIds, ids); From ab07a04242183c27da35f82c55ecb69c9a05e96b Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:01:51 +0100 Subject: [PATCH 10/22] Fix Rust e2e to use SessionTodosChanged variant now that codegen recognizes it After regenerating against @github/copilot 1.0.62, the SessionEvent enum now has a SessionTodosChanged variant. The earlier predicate matched parsed_type() == Unknown which no longer holds. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- rust/tests/e2e/session_todos_changed.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rust/tests/e2e/session_todos_changed.rs b/rust/tests/e2e/session_todos_changed.rs index 114f5162a..4455a3e9f 100644 --- a/rust/tests/e2e/session_todos_changed.rs +++ b/rust/tests/e2e/session_todos_changed.rs @@ -47,8 +47,7 @@ async fn fires_session_todos_changed_and_exposes_rows_and_dependencies() { .expect("create session"); let todos_changed = wait_for_event(session.subscribe(), "todos changed", |event| { - event.parsed_type() == SessionEventType::Unknown - && event.event_type == "session.todos_changed" + event.parsed_type() == SessionEventType::SessionTodosChanged }); session.send_and_wait(PROMPT).await.expect("send"); From 001f6f474826c99ac82fa8a46683212640484eb6 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:10:55 +0100 Subject: [PATCH 11/22] Fix model switchTo e2e assertion to match runtime behavior The test asserted that getCurrent() after a switchTo returns the original model, which contradicts switchTo's contract (it calls session.setSelectedModel and persists). The runtime in main now returns the live model consistently, exposing the bad assertion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/test/e2e/rpc_session_state.e2e.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 295f60340..6ac0fbf8c 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -65,7 +65,7 @@ describe("Session-scoped RPC", async () => { const after = await session.rpc.model.getCurrent(); expect(result.modelId).toBe("gpt-4.1"); - expect(after.modelId).toBe(before.modelId); + expect(after.modelId).toBe("gpt-4.1"); await session.disconnect(); }); From c07cfb893dcff05278e40bd97ac3fc1beacc76a4 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:11:55 +0100 Subject: [PATCH 12/22] Revert "Fix model switchTo e2e assertion to match runtime behavior" This reverts commit 001f6f474826c99ac82fa8a46683212640484eb6. --- nodejs/test/e2e/rpc_session_state.e2e.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 6ac0fbf8c..295f60340 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -65,7 +65,7 @@ describe("Session-scoped RPC", async () => { const after = await session.rpc.model.getCurrent(); expect(result.modelId).toBe("gpt-4.1"); - expect(after.modelId).toBe("gpt-4.1"); + expect(after.modelId).toBe(before.modelId); await session.disconnect(); }); From 5245dddf2ff52d52b592f0fd6addb5802086675f Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:13:27 +0100 Subject: [PATCH 13/22] Make model switchTo e2e wait for the switch to take effect The previous assertion expected getCurrent() after switchTo to still return the original model, which is wrong: switchTo should persist. The test passed flakily because there's a race between switchTo resolving and getCurrent observing the new model. Poll getCurrent until it reflects the switch, then assert the new model. This expresses the desired behavior unambiguously and removes the race. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/test/e2e/rpc_session_state.e2e.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 295f60340..9eaadef46 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -62,10 +62,14 @@ describe("Session-scoped RPC", async () => { modelId: "gpt-4.1", reasoningEffort: "high", }); + await waitForCondition( + async () => (await session.rpc.model.getCurrent()).modelId === "gpt-4.1", + { timeoutMessage: "session.model.getCurrent did not reflect switchTo" } + ); const after = await session.rpc.model.getCurrent(); expect(result.modelId).toBe("gpt-4.1"); - expect(after.modelId).toBe(before.modelId); + expect(after.modelId).toBe("gpt-4.1"); await session.disconnect(); }); From f58c9557d9d55853f53b7bf3573b321b8c8afe18 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:16:04 +0100 Subject: [PATCH 14/22] Tighten model switchTo e2e to assert the switch takes effect (5s poll) Previously, the cross-language assertions hedged or asserted the old behavior (after == before) under the assumption that switchTo was a non-mutating override resolution. The runtime now persists, so: - Python: was strict 'after == before', failed deterministically. - Node: was strict 'after == before', flaked by platform speed. - .NET / Go: lenient 'after == new || after == before', passed either way but masked the bug. Update all four to poll getCurrent for up to 5s and then assert getCurrent reflects the new model. Rust and Java already only check the switchTo result and need no change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dotnet/test/E2E/RpcSessionStateE2ETests.cs | 14 +++++++++++--- go/internal/e2e/rpc_session_state_e2e_test.go | 18 +++++++++++++----- nodejs/test/e2e/rpc_session_state.e2e.test.ts | 5 ++++- python/e2e/test_rpc_session_state_e2e.py | 16 +++++++++++----- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/dotnet/test/E2E/RpcSessionStateE2ETests.cs b/dotnet/test/E2E/RpcSessionStateE2ETests.cs index 41c08cbd1..a28ad7351 100644 --- a/dotnet/test/E2E/RpcSessionStateE2ETests.cs +++ b/dotnet/test/E2E/RpcSessionStateE2ETests.cs @@ -41,10 +41,18 @@ public async Task Should_Call_Session_Rpc_Model_SwitchTo() Assert.Equal("claude-sonnet-4.5", before.ModelId); var result = await session.Rpc.Model.SwitchToAsync(modelId: "gpt-4.1", reasoningEffort: "high"); - var after = await session.Rpc.Model.GetCurrentAsync(); - Assert.Equal("gpt-4.1", result.ModelId); - Assert.True(after.ModelId is "gpt-4.1" || after.ModelId == before.ModelId, $"Unexpected current model after switch: {after.ModelId}"); + + var deadline = DateTime.UtcNow.AddSeconds(5); + CurrentModel after; + do + { + after = await session.Rpc.Model.GetCurrentAsync(); + if (after.ModelId == "gpt-4.1") break; + await Task.Delay(100); + } while (DateTime.UtcNow < deadline); + + Assert.Equal("gpt-4.1", after.ModelId); } [Fact] diff --git a/go/internal/e2e/rpc_session_state_e2e_test.go b/go/internal/e2e/rpc_session_state_e2e_test.go index f6698f082..4b723b3e8 100644 --- a/go/internal/e2e/rpc_session_state_e2e_test.go +++ b/go/internal/e2e/rpc_session_state_e2e_test.go @@ -70,12 +70,20 @@ func TestRPCSessionStateE2E(t *testing.T) { if result.ModelID == nil || *result.ModelID != "gpt-4.1" { t.Fatalf("Expected switch result model gpt-4.1, got %+v", result) } - after, err := session.RPC.Model.GetCurrent(t.Context()) - if err != nil { - t.Fatalf("Model.GetCurrent after switch failed: %v", err) + var after *rpc.CurrentModel + deadline := time.Now().Add(5 * time.Second) + for time.Now().Before(deadline) { + after, err = session.RPC.Model.GetCurrent(t.Context()) + if err != nil { + t.Fatalf("Model.GetCurrent after switch failed: %v", err) + } + if after.ModelID != nil && *after.ModelID == "gpt-4.1" { + break + } + time.Sleep(100 * time.Millisecond) } - if after.ModelID == nil || (*after.ModelID != "gpt-4.1" && *after.ModelID != *before.ModelID) { - t.Fatalf("Unexpected current model after switch; before=%q after=%+v", *before.ModelID, after) + if after.ModelID == nil || *after.ModelID != "gpt-4.1" { + t.Fatalf("Model.GetCurrent did not reflect SwitchTo; before=%q after=%+v", *before.ModelID, after) } }) diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 9eaadef46..2043691a2 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -64,7 +64,10 @@ describe("Session-scoped RPC", async () => { }); await waitForCondition( async () => (await session.rpc.model.getCurrent()).modelId === "gpt-4.1", - { timeoutMessage: "session.model.getCurrent did not reflect switchTo" } + { + timeoutMs: 5_000, + timeoutMessage: "session.model.getCurrent did not reflect switchTo", + } ); const after = await session.rpc.model.getCurrent(); diff --git a/python/e2e/test_rpc_session_state_e2e.py b/python/e2e/test_rpc_session_state_e2e.py index 192111684..9d41372d9 100644 --- a/python/e2e/test_rpc_session_state_e2e.py +++ b/python/e2e/test_rpc_session_state_e2e.py @@ -123,12 +123,18 @@ async def test_should_call_session_rpc_model_switch_to(self, ctx: E2ETestContext result = await session.rpc.model.switch_to( ModelSwitchToRequest(model_id="gpt-4.1", reasoning_effort="high") ) - after = await session.rpc.model.get_current() - assert result.model_id == "gpt-4.1" - # Python's current RPC surface resolves the requested override but does - # not mutate the live session model selection. - assert after.model_id == before.model_id + + deadline = time.monotonic() + 5 + while time.monotonic() < deadline: + after = await session.rpc.model.get_current() + if after.model_id == "gpt-4.1": + break + await asyncio.sleep(0.1) + else: + pytest.fail("session.rpc.model.get_current did not reflect switch_to") + + assert after.model_id == "gpt-4.1" finally: await session.disconnect() From 3d3d4393ab18992271b86fb92dbe8dde31584775 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 12:50:03 +0100 Subject: [PATCH 15/22] Use typed Rust RPC API for session_todos_changed E2E test Drops local duplicate struct definitions and the untyped session.client().call() in favor of the generated session.rpc().plan().read_sql_todos_with_dependencies() method, matching the pattern used by all other SDK E2E tests and the adjacent rpc_session_state_extras.rs:168. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- rust/tests/e2e/session_todos_changed.rs | 34 +++---------------------- 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/rust/tests/e2e/session_todos_changed.rs b/rust/tests/e2e/session_todos_changed.rs index 4455a3e9f..ef73a92dd 100644 --- a/rust/tests/e2e/session_todos_changed.rs +++ b/rust/tests/e2e/session_todos_changed.rs @@ -1,6 +1,4 @@ use github_copilot_sdk::session_events::SessionEventType; -use serde::Deserialize; -use serde_json::json; use super::support::{wait_for_event, with_e2e_context}; @@ -12,26 +10,6 @@ const PROMPT: &str = concat!( "Then stop. Do not insert any other rows or create any other tables." ); -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -struct PlanReadSqlTodosWithDependenciesResult { - rows: Vec, - dependencies: Vec, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -struct PlanTodo { - id: Option, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -struct PlanTodoDependency { - todo_id: String, - depends_on: String, -} - #[tokio::test] async fn fires_session_todos_changed_and_exposes_rows_and_dependencies() { with_e2e_context( @@ -53,16 +31,12 @@ async fn fires_session_todos_changed_and_exposes_rows_and_dependencies() { session.send_and_wait(PROMPT).await.expect("send"); todos_changed.await; - let value = session - .client() - .call( - "session.plan.readSqlTodosWithDependencies", - Some(json!({ "sessionId": session.id() })), - ) + let result = session + .rpc() + .plan() + .read_sql_todos_with_dependencies() .await .expect("read SQL todos with dependencies"); - let result: PlanReadSqlTodosWithDependenciesResult = - serde_json::from_value(value).expect("deserialize todos with dependencies"); let mut ids: Vec = result.rows.into_iter().filter_map(|row| row.id).collect(); From b5772fef68fe62ce3da2ca53a764760d3cc1d033 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 13:29:00 +0100 Subject: [PATCH 16/22] Use gpt-5.4 in model switchto E2E tests The runtime's EXCLUDED_MODELS_LIST (models_catalog.rs) now excludes gpt-4.1, so model resolution silently falls back to claude-sonnet-4.5 on the post-switch tool revalidation pass. Switching the tests to a current SUPPORTED_MODEL (gpt-5.4) makes them reliable across Node, Python, .NET, and Go, and lets us drop the 5s polling workaround that hid (but did not fix) the issue. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dotnet/test/E2E/RpcSessionStateE2ETests.cs | 16 ++++---------- go/internal/e2e/rpc_session_state_e2e_test.go | 22 ++++++------------- nodejs/test/e2e/rpc_session_state.e2e.test.ts | 13 +++-------- python/e2e/test_rpc_session_state_e2e.py | 16 ++++---------- ...hould_call_session_rpc_model_switchto.yaml | 1 + 5 files changed, 19 insertions(+), 49 deletions(-) diff --git a/dotnet/test/E2E/RpcSessionStateE2ETests.cs b/dotnet/test/E2E/RpcSessionStateE2ETests.cs index a28ad7351..0c0a71245 100644 --- a/dotnet/test/E2E/RpcSessionStateE2ETests.cs +++ b/dotnet/test/E2E/RpcSessionStateE2ETests.cs @@ -40,19 +40,11 @@ public async Task Should_Call_Session_Rpc_Model_SwitchTo() var before = await session.Rpc.Model.GetCurrentAsync(); Assert.Equal("claude-sonnet-4.5", before.ModelId); - var result = await session.Rpc.Model.SwitchToAsync(modelId: "gpt-4.1", reasoningEffort: "high"); - Assert.Equal("gpt-4.1", result.ModelId); + var result = await session.Rpc.Model.SwitchToAsync(modelId: "gpt-5.4", reasoningEffort: "high"); + Assert.Equal("gpt-5.4", result.ModelId); - var deadline = DateTime.UtcNow.AddSeconds(5); - CurrentModel after; - do - { - after = await session.Rpc.Model.GetCurrentAsync(); - if (after.ModelId == "gpt-4.1") break; - await Task.Delay(100); - } while (DateTime.UtcNow < deadline); - - Assert.Equal("gpt-4.1", after.ModelId); + var after = await session.Rpc.Model.GetCurrentAsync(); + Assert.Equal("gpt-5.4", after.ModelId); } [Fact] diff --git a/go/internal/e2e/rpc_session_state_e2e_test.go b/go/internal/e2e/rpc_session_state_e2e_test.go index 4b723b3e8..737c2805a 100644 --- a/go/internal/e2e/rpc_session_state_e2e_test.go +++ b/go/internal/e2e/rpc_session_state_e2e_test.go @@ -61,28 +61,20 @@ func TestRPCSessionStateE2E(t *testing.T) { reasoningEffort := "high" result, err := session.RPC.Model.SwitchTo(t.Context(), &rpc.ModelSwitchToRequest{ - ModelID: "gpt-4.1", + ModelID: "gpt-5.4", ReasoningEffort: &reasoningEffort, }) if err != nil { t.Fatalf("Model.SwitchTo failed: %v", err) } - if result.ModelID == nil || *result.ModelID != "gpt-4.1" { - t.Fatalf("Expected switch result model gpt-4.1, got %+v", result) + if result.ModelID == nil || *result.ModelID != "gpt-5.4" { + t.Fatalf("Expected switch result model gpt-5.4, got %+v", result) } - var after *rpc.CurrentModel - deadline := time.Now().Add(5 * time.Second) - for time.Now().Before(deadline) { - after, err = session.RPC.Model.GetCurrent(t.Context()) - if err != nil { - t.Fatalf("Model.GetCurrent after switch failed: %v", err) - } - if after.ModelID != nil && *after.ModelID == "gpt-4.1" { - break - } - time.Sleep(100 * time.Millisecond) + after, err := session.RPC.Model.GetCurrent(t.Context()) + if err != nil { + t.Fatalf("Model.GetCurrent after switch failed: %v", err) } - if after.ModelID == nil || *after.ModelID != "gpt-4.1" { + if after.ModelID == nil || *after.ModelID != "gpt-5.4" { t.Fatalf("Model.GetCurrent did not reflect SwitchTo; before=%q after=%+v", *before.ModelID, after) } }) diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 2043691a2..66aff3658 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -59,20 +59,13 @@ describe("Session-scoped RPC", async () => { expect(before.modelId).toBeTruthy(); const result = await session.rpc.model.switchTo({ - modelId: "gpt-4.1", + modelId: "gpt-5.4", reasoningEffort: "high", }); - await waitForCondition( - async () => (await session.rpc.model.getCurrent()).modelId === "gpt-4.1", - { - timeoutMs: 5_000, - timeoutMessage: "session.model.getCurrent did not reflect switchTo", - } - ); const after = await session.rpc.model.getCurrent(); - expect(result.modelId).toBe("gpt-4.1"); - expect(after.modelId).toBe("gpt-4.1"); + expect(result.modelId).toBe("gpt-5.4"); + expect(after.modelId).toBe("gpt-5.4"); await session.disconnect(); }); diff --git a/python/e2e/test_rpc_session_state_e2e.py b/python/e2e/test_rpc_session_state_e2e.py index 9d41372d9..b41e39b3b 100644 --- a/python/e2e/test_rpc_session_state_e2e.py +++ b/python/e2e/test_rpc_session_state_e2e.py @@ -121,20 +121,12 @@ async def test_should_call_session_rpc_model_switch_to(self, ctx: E2ETestContext assert before.model_id result = await session.rpc.model.switch_to( - ModelSwitchToRequest(model_id="gpt-4.1", reasoning_effort="high") + ModelSwitchToRequest(model_id="gpt-5.4", reasoning_effort="high") ) - assert result.model_id == "gpt-4.1" + assert result.model_id == "gpt-5.4" - deadline = time.monotonic() + 5 - while time.monotonic() < deadline: - after = await session.rpc.model.get_current() - if after.model_id == "gpt-4.1": - break - await asyncio.sleep(0.1) - else: - pytest.fail("session.rpc.model.get_current did not reflect switch_to") - - assert after.model_id == "gpt-4.1" + after = await session.rpc.model.get_current() + assert after.model_id == "gpt-5.4" finally: await session.disconnect() diff --git a/test/snapshots/rpc_session_state/should_call_session_rpc_model_switchto.yaml b/test/snapshots/rpc_session_state/should_call_session_rpc_model_switchto.yaml index 056351ddb..b276b6a39 100644 --- a/test/snapshots/rpc_session_state/should_call_session_rpc_model_switchto.yaml +++ b/test/snapshots/rpc_session_state/should_call_session_rpc_model_switchto.yaml @@ -1,3 +1,4 @@ models: - claude-sonnet-4.5 + - gpt-5.4 conversations: [] From f1460dd3bc21b46abbefccf469f1014ffba0e406 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 13:33:11 +0100 Subject: [PATCH 17/22] Use active event-wait pattern in todos_changed E2E tests Replaces the post-hoc events.filter() pattern with the existing getNextEventOfType helper (Node/Python) and a CompletableFuture event subscription (Java). This matches the pattern used by Go/.NET/Rust and removes a race window where the event could arrive after sendAndWait resolves but before the assertion is checked. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../copilot/SessionTodosChangedTest.java | 17 ++++++------- .../e2e/session_todos_changed.e2e.test.ts | 11 ++++----- python/e2e/test_session_todos_changed_e2e.py | 24 +++++++------------ 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java b/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java index 182c77ac2..0f3831889 100644 --- a/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java +++ b/java/src/test/java/com/github/copilot/SessionTodosChangedTest.java @@ -6,16 +6,13 @@ import static org.junit.jupiter.api.Assertions.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import com.github.copilot.generated.SessionEvent; import com.github.copilot.generated.SessionTodosChangedEvent; import com.github.copilot.generated.rpc.PlanSqlTodoDependency; import com.github.copilot.rpc.MessageOptions; @@ -46,8 +43,12 @@ void firesSessionTodosChangedAndExposesRowsAndDependencies() throws Exception { CopilotSession session = client .createSession(new SessionConfig().setOnPermissionRequest(PermissionHandler.APPROVE_ALL)).get(); - List events = Collections.synchronizedList(new ArrayList<>()); - session.on(events::add); + CompletableFuture todosChanged = new CompletableFuture<>(); + session.on(event -> { + if (event instanceof SessionTodosChangedEvent todosEvent && !todosChanged.isDone()) { + todosChanged.complete(todosEvent); + } + }); session.sendAndWait(new MessageOptions() .setPrompt("Use the sql tool to execute exactly these statements, in order, with no extra rows:\n" @@ -57,14 +58,14 @@ void firesSessionTodosChangedAndExposesRowsAndDependencies() throws Exception { + "Then stop. Do not insert any other rows or create any other tables.")) .get(120, TimeUnit.SECONDS); - assertTrue(events.stream().anyMatch(SessionTodosChangedEvent.class::isInstance), + assertNotNull(todosChanged.get(15, TimeUnit.SECONDS), "Should have received at least one session.todos_changed event"); var result = session.getRpc().plan.readSqlTodosWithDependencies().get(15, TimeUnit.SECONDS); assertEquals(2, result.rows().size()); var ids = result.rows().stream().map(row -> row.id()).filter(id -> id != null).sorted().toList(); - assertEquals(List.of("alpha", "beta"), ids); + assertEquals(java.util.List.of("alpha", "beta"), ids); assertTrue(result.dependencies().stream().anyMatch(SessionTodosChangedTest::isBetaDependsOnAlpha), "Should contain beta -> alpha dependency"); diff --git a/nodejs/test/e2e/session_todos_changed.e2e.test.ts b/nodejs/test/e2e/session_todos_changed.e2e.test.ts index 852b10a5a..ea4973826 100644 --- a/nodejs/test/e2e/session_todos_changed.e2e.test.ts +++ b/nodejs/test/e2e/session_todos_changed.e2e.test.ts @@ -6,8 +6,9 @@ import fs, { realpathSync } from "node:fs"; import os from "node:os"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; -import { approveAll, type SessionEvent } from "../../src/index.js"; +import { approveAll } from "../../src/index.js"; import { createSdkTestContext } from "./harness/sdkTestContext.js"; +import { getNextEventOfType } from "./harness/sdkTestHelper.js"; /** * E2E coverage for the runtime's `session.todos_changed` event and @@ -28,10 +29,7 @@ describe("Todos changed event + readSqlTodosWithDependencies", async () => { async () => { const session = await client.createSession({ onPermissionRequest: approveAll }); - const events: SessionEvent[] = []; - session.on((event) => { - events.push(event); - }); + const todosChanged = getNextEventOfType(session, "session.todos_changed"); await session.sendAndWait({ prompt: @@ -42,8 +40,7 @@ describe("Todos changed event + readSqlTodosWithDependencies", async () => { "Then stop. Do not insert any other rows or create any other tables.", }); - const todosEvents = events.filter((e) => e.type === "session.todos_changed"); - expect(todosEvents.length).toBeGreaterThanOrEqual(1); + await todosChanged; const result = await session.rpc.plan.readSqlTodosWithDependencies(); const ids = result.rows diff --git a/python/e2e/test_session_todos_changed_e2e.py b/python/e2e/test_session_todos_changed_e2e.py index a8e1512c0..9a76a5f92 100644 --- a/python/e2e/test_session_todos_changed_e2e.py +++ b/python/e2e/test_session_todos_changed_e2e.py @@ -2,11 +2,13 @@ from __future__ import annotations +import asyncio + import pytest from copilot.session import PermissionHandler -from .testharness import E2ETestContext +from .testharness import E2ETestContext, get_next_event_of_type pytestmark = pytest.mark.asyncio(loop_scope="module") @@ -18,10 +20,6 @@ Then stop. Do not insert any other rows or create any other tables.""" -def _event_type_value(event) -> str: - return getattr(event.type, "value", event.type) - - class TestSessionTodosChanged: async def test_fires_session_todos_changed_and_exposes_rows_and_dependencies( self, ctx: E2ETestContext @@ -29,17 +27,11 @@ async def test_fires_session_todos_changed_and_exposes_rows_and_dependencies( async with await ctx.client.create_session( on_permission_request=PermissionHandler.approve_all, ) as session: - events = [] - unsubscribe = session.on(events.append) - try: - await session.send_and_wait(PROMPT, timeout=120.0) - finally: - unsubscribe() - - todos_events = [ - event for event in events if _event_type_value(event) == "session.todos_changed" - ] - assert len(todos_events) >= 1 + todos_changed = asyncio.create_task( + get_next_event_of_type(session, "session.todos_changed", timeout=120.0) + ) + await session.send_and_wait(PROMPT, timeout=120.0) + await todos_changed result = await session.rpc.plan.read_sql_todos_with_dependencies() ids = sorted(row.id for row in result.rows if row.id) From c50207aef08d9bff3586f9f4e55dc570f1282f25 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 13:42:34 +0100 Subject: [PATCH 18/22] Add gpt-5.4 to getcurrent snapshot to avoid cross-test model cache contamination Both tests in rpc_session_state.e2e.test.ts share one long-lived CLI subprocess (one client created at describe scope). The runtime caches the /models response from whichever test calls it first. When 'getcurrent' ran first with a single-model snapshot, that response was cached; then 'switchto' would accept gpt-5.4 synchronously but the background tool-revalidation triggered by the model_change event saw only claude-sonnet-4.5 in the cached list, rejected gpt-5.4, and silently reverted _selectedModel. Listing both models in the getcurrent snapshot keeps the cached list compatible with switchto. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../should_call_session_rpc_model_getcurrent.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml b/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml index 056351ddb..b276b6a39 100644 --- a/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml +++ b/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml @@ -1,3 +1,4 @@ models: - claude-sonnet-4.5 + - gpt-5.4 conversations: [] From 0e3d686175381d899d6000d3fc833b6ab80ed085 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 13:44:32 +0100 Subject: [PATCH 19/22] Document why getcurrent snapshot lists gpt-5.4 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../should_call_session_rpc_model_getcurrent.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml b/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml index b276b6a39..d2d1370b7 100644 --- a/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml +++ b/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml @@ -1,3 +1,11 @@ +# gpt-5.4 is listed here only because this is the first test in +# rpc_session_state.e2e.test.ts to create a session. The runtime caches +# /models per (auth, base_url) for 30 minutes (see capi_client.rs +# LIST_MODELS_CACHE), so the first snapshot's models are reused by every +# subsequent test sharing the same client. The "should call session rpc +# model switchto" test needs gpt-5.4 in that cached list to validate. +# If you reorder the tests, move this comment + entry to whichever test +# now runs first. models: - claude-sonnet-4.5 - gpt-5.4 From ebb2a90fb00e2558a83dbe968f027ebd0f9bb7af Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 13:47:17 +0100 Subject: [PATCH 20/22] Isolate model switchTo test in its own SDK context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The runtime caches /models per (auth, base_url) for 30 minutes (capi_client.rs LIST_MODELS_CACHE). Tests in rpc_session_state.e2e.test.ts share one CLI subprocess and proxy URL, so the first snapshot's models list is reused by every later test. The switchTo test needs a model the other tests don't list, so polluting every other snapshot would be fragile (ordering-dependent). Instead, wrap the switchTo test in a nested describe with its own createSdkTestContext, which spawns a dedicated subprocess and proxy → its own cache key → its snapshot's models list is authoritative. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/test/e2e/rpc_session_state.e2e.test.ts | 44 ++++++++++++------- ...uld_call_session_rpc_model_getcurrent.yaml | 9 ---- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/nodejs/test/e2e/rpc_session_state.e2e.test.ts b/nodejs/test/e2e/rpc_session_state.e2e.test.ts index 66aff3658..d1a628a0d 100644 --- a/nodejs/test/e2e/rpc_session_state.e2e.test.ts +++ b/nodejs/test/e2e/rpc_session_state.e2e.test.ts @@ -49,25 +49,39 @@ describe("Session-scoped RPC", async () => { await session.disconnect(); }); - it("should call session rpc model switchto", async () => { - const session = await client.createSession({ - onPermissionRequest: approveAll, - model: "claude-sonnet-4.5", - }); + // The runtime caches the /models response per (auth, base_url) for 30 + // minutes (see capi_client.rs LIST_MODELS_CACHE), so within a single + // describe — where all tests share one CLI subprocess and proxy URL — + // the cache is primed by whichever test creates a session first. That + // makes any test which calls switchTo to a model not present in the + // first snapshot's models list fail silently (the runtime accepts the + // switch synchronously, then tool revalidation refetches the cached + // list, doesn't see the model, and reverts _selectedModel). Wrapping + // switchTo in its own describe gives it a dedicated subprocess + proxy + // → its own cache entry, so its snapshot's models list is authoritative. + describe("model switchTo (isolated to avoid models cache contamination)", async () => { + const { copilotClient: switchClient } = await createSdkTestContext(); + + it("should call session rpc model switchto", async () => { + const session = await switchClient.createSession({ + onPermissionRequest: approveAll, + model: "claude-sonnet-4.5", + }); - const before = await session.rpc.model.getCurrent(); - expect(before.modelId).toBeTruthy(); + const before = await session.rpc.model.getCurrent(); + expect(before.modelId).toBeTruthy(); - const result = await session.rpc.model.switchTo({ - modelId: "gpt-5.4", - reasoningEffort: "high", - }); - const after = await session.rpc.model.getCurrent(); + const result = await session.rpc.model.switchTo({ + modelId: "gpt-5.4", + reasoningEffort: "high", + }); + const after = await session.rpc.model.getCurrent(); - expect(result.modelId).toBe("gpt-5.4"); - expect(after.modelId).toBe("gpt-5.4"); + expect(result.modelId).toBe("gpt-5.4"); + expect(after.modelId).toBe("gpt-5.4"); - await session.disconnect(); + await session.disconnect(); + }); }); it("should shutdown session with routine type", async () => { diff --git a/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml b/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml index d2d1370b7..056351ddb 100644 --- a/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml +++ b/test/snapshots/rpc_session_state/should_call_session_rpc_model_getcurrent.yaml @@ -1,12 +1,3 @@ -# gpt-5.4 is listed here only because this is the first test in -# rpc_session_state.e2e.test.ts to create a session. The runtime caches -# /models per (auth, base_url) for 30 minutes (see capi_client.rs -# LIST_MODELS_CACHE), so the first snapshot's models are reused by every -# subsequent test sharing the same client. The "should call session rpc -# model switchto" test needs gpt-5.4 in that cached list to validate. -# If you reorder the tests, move this comment + entry to whichever test -# now runs first. models: - claude-sonnet-4.5 - - gpt-5.4 conversations: [] From aa99b005aa08cabcca2b93a57f2f39dcda63365a Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 13:53:59 +0100 Subject: [PATCH 21/22] Isolate model switchTo e2e in Go/Python/.NET; tighten Rust assertions Same fix as Node (commit ebb2a90f): the runtime caches /models per (auth, base_url) for 30 minutes (capi_client.rs LIST_MODELS_CACHE). Tests that share a CLI subprocess inherit the first snapshot's cached models list, so a later switchTo to a model the first snapshot doesn't list silently reverts to the cached default. - Go: switchTo subtest builds its own TestContext + client + ConfigureForTest -> own proxy URL -> own cache entry. - Python: switchTo test instantiates an isolated E2ETestContext (setup/teardown) so it gets its own subprocess and proxy. - .NET: switchTo test bypasses the class fixture and builds its own E2ETestContext + client. - Rust: each test already has its own with_e2e_context, so no isolation needed. Tightened the assertion to mirror the other SDKs: switch to gpt-5.4 and verify both the switch result and the post-switch getCurrent. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dotnet/test/E2E/RpcSessionStateE2ETests.cs | 17 +++++++- go/internal/e2e/rpc_session_state_e2e_test.go | 16 +++++++- python/e2e/test_rpc_session_state_e2e.py | 41 +++++++++++++------ rust/tests/e2e/rpc_session_state.rs | 24 +++++++++-- 4 files changed, 79 insertions(+), 19 deletions(-) diff --git a/dotnet/test/E2E/RpcSessionStateE2ETests.cs b/dotnet/test/E2E/RpcSessionStateE2ETests.cs index 0c0a71245..9701c5ea2 100644 --- a/dotnet/test/E2E/RpcSessionStateE2ETests.cs +++ b/dotnet/test/E2E/RpcSessionStateE2ETests.cs @@ -35,7 +35,22 @@ public async Task Should_Call_Session_Rpc_Model_GetCurrent() [Fact] public async Task Should_Call_Session_Rpc_Model_SwitchTo() { - await using var session = await CreateSessionAsync(new SessionConfig { Model = "claude-sonnet-4.5" }); + // The runtime caches /models per (auth, base_url) for 30 minutes (see + // capi_client.rs LIST_MODELS_CACHE). Tests in this class share one CLI + // subprocess and proxy URL via E2ETestFixture, so the first snapshot's + // models list is reused by every later test. SwitchTo needs gpt-5.4 in + // the cache; rather than poisoning every other snapshot we spin up an + // isolated context with its own proxy → its own (auth, base_url) cache + // key. + await using var isolatedCtx = await E2ETestContext.CreateAsync(); + await isolatedCtx.ConfigureForTestAsync("rpc_session_state", nameof(Should_Call_Session_Rpc_Model_SwitchTo)); + var isolatedClient = isolatedCtx.CreateClient(); + + await using var session = await isolatedClient.CreateSessionAsync(new SessionConfig + { + Model = "claude-sonnet-4.5", + OnPermissionRequest = PermissionHandler.ApproveAll, + }); var before = await session.Rpc.Model.GetCurrentAsync(); Assert.Equal("claude-sonnet-4.5", before.ModelId); diff --git a/go/internal/e2e/rpc_session_state_e2e_test.go b/go/internal/e2e/rpc_session_state_e2e_test.go index 737c2805a..9b28471ba 100644 --- a/go/internal/e2e/rpc_session_state_e2e_test.go +++ b/go/internal/e2e/rpc_session_state_e2e_test.go @@ -42,8 +42,22 @@ func TestRPCSessionStateE2E(t *testing.T) { } }) + // The runtime caches /models per (auth, base_url) for 30 minutes (see + // capi_client.rs LIST_MODELS_CACHE). Within this test function all subtests + // share one CLI subprocess and proxy URL, so the first subtest's snapshot + // models list is reused by every later one. SwitchTo needs gpt-5.4 in the + // cache; rather than poison every other snapshot we give this subtest its + // own dedicated client + proxy → its own cache entry. t.Run("should call session rpc model switchTo", func(t *testing.T) { - session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{ + switchCtx := testharness.NewTestContext(t) + switchClient := switchCtx.NewClient() + t.Cleanup(func() { switchClient.ForceStop() }) + if err := switchClient.Start(t.Context()); err != nil { + t.Fatalf("Failed to start switch client: %v", err) + } + switchCtx.ConfigureForTest(t) + + session, err := switchClient.CreateSession(t.Context(), &copilot.SessionConfig{ Model: "claude-sonnet-4.5", OnPermissionRequest: copilot.PermissionHandler.ApproveAll, }) diff --git a/python/e2e/test_rpc_session_state_e2e.py b/python/e2e/test_rpc_session_state_e2e.py index b41e39b3b..246ffd80c 100644 --- a/python/e2e/test_rpc_session_state_e2e.py +++ b/python/e2e/test_rpc_session_state_e2e.py @@ -112,23 +112,38 @@ async def test_should_call_session_rpc_model_get_current(self, ctx: E2ETestConte await session.disconnect() async def test_should_call_session_rpc_model_switch_to(self, ctx: E2ETestContext): - session = await ctx.client.create_session( - on_permission_request=PermissionHandler.approve_all, - model="claude-sonnet-4.5", - ) + # The runtime caches /models per (auth, base_url) for 30 minutes (see + # capi_client.rs LIST_MODELS_CACHE). Tests in this class share one CLI + # subprocess and proxy URL via the module-scoped `ctx` fixture, so the + # first snapshot's models list is reused by every later test. switch_to + # needs gpt-5.4 in the cache; rather than poisoning every other snapshot + # we spin up an isolated context with its own subprocess and proxy → its + # own (auth, base_url) cache key. + isolated_ctx = E2ETestContext() + await isolated_ctx.setup() try: - before = await session.rpc.model.get_current() - assert before.model_id - - result = await session.rpc.model.switch_to( - ModelSwitchToRequest(model_id="gpt-5.4", reasoning_effort="high") + await isolated_ctx.configure_for_test( + "rpc_session_state", "should_call_session_rpc_model_switch_to" + ) + session = await isolated_ctx.client.create_session( + on_permission_request=PermissionHandler.approve_all, + model="claude-sonnet-4.5", ) - assert result.model_id == "gpt-5.4" + try: + before = await session.rpc.model.get_current() + assert before.model_id + + result = await session.rpc.model.switch_to( + ModelSwitchToRequest(model_id="gpt-5.4", reasoning_effort="high") + ) + assert result.model_id == "gpt-5.4" - after = await session.rpc.model.get_current() - assert after.model_id == "gpt-5.4" + after = await session.rpc.model.get_current() + assert after.model_id == "gpt-5.4" + finally: + await session.disconnect() finally: - await session.disconnect() + await isolated_ctx.teardown() async def test_should_get_and_set_session_mode(self, ctx: E2ETestContext): session = await ctx.client.create_session( diff --git a/rust/tests/e2e/rpc_session_state.rs b/rust/tests/e2e/rpc_session_state.rs index 865a90744..8b68aeb3a 100644 --- a/rust/tests/e2e/rpc_session_state.rs +++ b/rust/tests/e2e/rpc_session_state.rs @@ -63,23 +63,39 @@ async fn should_call_session_rpc_model_switchto() { ctx.set_default_copilot_user(); let client = ctx.start_client().await; let session = client - .create_session(ctx.approve_all_session_config()) + .create_session(ctx.approve_all_session_config().with_model(MODEL_ID)) .await .expect("create session"); + let before = session + .rpc() + .model() + .get_current() + .await + .expect("get current model before switch"); + assert!(before.model_id.is_some(), "expected a model before switch"); + let switched = session .rpc() .model() .switch_to(ModelSwitchToRequest { - model_id: MODEL_ID.to_string(), - reasoning_effort: Some("none".to_string()), + model_id: "gpt-5.4".to_string(), + reasoning_effort: Some("high".to_string()), model_capabilities: None, reasoning_summary: None, ..Default::default() }) .await .expect("switch model"); - assert_eq!(switched.model_id.as_deref(), Some(MODEL_ID)); + assert_eq!(switched.model_id.as_deref(), Some("gpt-5.4")); + + let after = session + .rpc() + .model() + .get_current() + .await + .expect("get current model after switch"); + assert_eq!(after.model_id.as_deref(), Some("gpt-5.4")); session.disconnect().await.expect("disconnect session"); client.stop().await.expect("stop client"); From fa47e5bc0d273eae58761414159a868335362425 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 15 Jun 2026 14:05:20 +0100 Subject: [PATCH 22/22] Rename Python switch_to test to switchto so it finds the shared snapshot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sanitization of test_should_call_session_rpc_model_switch_to produces should_call_session_rpc_model_switch_to (with underscore), but the shared snapshot file is should_call_session_rpc_model_switchto.yaml (no underscore — matches Node/Go naming). The autouse fixture pointed the proxy at a non-existent file → /models fell back to the default single-model list, the runtime cached that, switchTo to gpt-5.4 was filtered out, and _selectedModel silently reverted. Renaming the test method makes sanitization produce the matching filename. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- python/e2e/test_rpc_session_state_e2e.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/e2e/test_rpc_session_state_e2e.py b/python/e2e/test_rpc_session_state_e2e.py index 246ffd80c..7bd94679d 100644 --- a/python/e2e/test_rpc_session_state_e2e.py +++ b/python/e2e/test_rpc_session_state_e2e.py @@ -111,7 +111,7 @@ async def test_should_call_session_rpc_model_get_current(self, ctx: E2ETestConte finally: await session.disconnect() - async def test_should_call_session_rpc_model_switch_to(self, ctx: E2ETestContext): + async def test_should_call_session_rpc_model_switchto(self, ctx: E2ETestContext): # The runtime caches /models per (auth, base_url) for 30 minutes (see # capi_client.rs LIST_MODELS_CACHE). Tests in this class share one CLI # subprocess and proxy URL via the module-scoped `ctx` fixture, so the @@ -123,7 +123,7 @@ async def test_should_call_session_rpc_model_switch_to(self, ctx: E2ETestContext await isolated_ctx.setup() try: await isolated_ctx.configure_for_test( - "rpc_session_state", "should_call_session_rpc_model_switch_to" + "rpc_session_state", "should_call_session_rpc_model_switchto" ) session = await isolated_ctx.client.create_session( on_permission_request=PermissionHandler.approve_all,