@@ -608,6 +816,38 @@ pub struct AgentSelectResult {
pub agent: AgentInfo,
}
+/// Indicates whether the operation succeeded and reports the post-mutation state.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct AllowAllPermissionSetResult {
+ /// Authoritative allow-all state after the mutation
+ pub enabled: bool,
+ /// Whether the operation succeeded
+ pub success: bool,
+}
+
+/// Current full allow-all permission state.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct AllowAllPermissionState {
+ /// Whether full allow-all permissions are currently active
+ pub enabled: bool,
+}
+
/// Schema for the `CopilotUserResponseEndpoints` type.
///
///
@@ -1112,6 +1352,22 @@ pub struct CanvasOpenRequest {
pub instance_id: String,
}
+/// Session context supplied by the runtime.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct CanvasSessionContext {
+ /// Active session working directory, when known.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub working_directory: Option
,
+}
+
/// Canvas close parameters sent to the provider.
///
///
@@ -1134,6 +1390,9 @@ pub struct CanvasProviderCloseRequest {
/// Host context supplied by the runtime.
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option
,
+ /// Session context supplied by the runtime.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub session: Option,
}
/// Canvas action invocation parameters sent to the provider.
@@ -1163,6 +1422,9 @@ pub struct CanvasProviderInvokeActionRequest {
/// Host context supplied by the runtime.
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option,
+ /// Session context supplied by the runtime.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub session: Option,
}
/// Canvas open parameters sent to the provider.
@@ -1190,6 +1452,9 @@ pub struct CanvasProviderOpenRequest {
/// Host context supplied by the runtime.
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option,
+ /// Session context supplied by the runtime.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub session: Option,
}
/// Canvas open result returned by the provider.
@@ -4986,6 +5251,18 @@ pub struct PermissionsFolderTrustAddTrustedResult {
pub success: bool,
}
+/// No parameters.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct PermissionsGetAllowAllRequest {}
+
/// Indicates whether the operation succeeded.
///
///
@@ -5136,6 +5413,21 @@ pub struct PermissionsResetSessionApprovalsResult {
pub success: bool,
}
+/// Whether to enable full allow-all permissions for the session.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct PermissionsSetAllowAllRequest {
+ /// Whether to enable full allow-all permissions
+ pub enabled: bool,
+}
+
/// Allow-all toggle for tool permission requests, with an optional telemetry source.
///
///
@@ -6004,9 +6296,15 @@ pub struct SessionContextInfo {
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionMetadata {
+ /// Runtime client name that created/last resumed this session
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub client_name: Option
,
/// Schema for the `SessionContext` type.
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option,
+ /// True for detached maintenance sessions that should be hidden from normal resume lists.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub is_detached: Option,
/// True for remote (GitHub) sessions; false for local
pub is_remote: bool,
/// GitHub task ID, when this local session is bound to one. Only present for local sessions exported to remote control.
@@ -6648,6 +6946,9 @@ pub struct SessionMetadataSnapshotWorkspace {
pub struct SessionMetadataSnapshot {
/// True when the session was detected to be in use by another process at construction time. Local consumers may surface a confirmation prompt before fully attaching. Always false for new sessions.
pub already_in_use: bool,
+ /// Runtime client name associated with the session (telemetry identifier).
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub client_name: Option,
/// The current agent mode for this session (e.g., 'interactive', 'plan', 'autopilot')
pub current_mode: MetadataSnapshotCurrentMode,
/// User-provided name supplied at session construction (via `--name`), if any. Immutable after construction.
@@ -7028,7 +7329,7 @@ pub struct SessionSizes {
pub sizes: HashMap,
}
-/// Optional metadata-load limit and context filter applied to the returned sessions.
+/// Optional metadata-load limit and filters applied to the returned sessions.
///
///
///
@@ -7042,6 +7343,9 @@ pub struct SessionsListRequest {
/// Optional filter applied to the returned sessions
#[serde(skip_serializing_if = "Option::is_none")]
pub filter: Option
,
+ /// When true, include detached maintenance sessions. Defaults to false for user-facing session lists.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub include_detached: Option,
/// When provided, only the first N sessions (sorted by modification time, newest first) load full metadata; remaining sessions return basic info only. Use 0 to return only basic info for every session.
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata_limit: Option,
@@ -9046,6 +9350,8 @@ pub struct WorkspacesGetWorkspaceResultWorkspace {
skip_serializing_if = "Option::is_none"
)]
pub chronicle_sync_dismissed: Option,
+ #[serde(rename = "client_name", skip_serializing_if = "Option::is_none")]
+ pub client_name: Option,
#[serde(rename = "created_at", skip_serializing_if = "Option::is_none")]
pub created_at: Option,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -9850,6 +10156,8 @@ pub struct SessionWorkspacesGetWorkspaceResultWorkspace {
skip_serializing_if = "Option::is_none"
)]
pub chronicle_sync_dismissed: Option,
+ #[serde(rename = "client_name", skip_serializing_if = "Option::is_none")]
+ pub client_name: Option,
#[serde(rename = "created_at", skip_serializing_if = "Option::is_none")]
pub created_at: Option,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -11174,6 +11482,38 @@ pub struct SessionPermissionsSetApproveAllResult {
pub success: bool,
}
+/// Indicates whether the operation succeeded and reports the post-mutation state.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct SessionPermissionsSetAllowAllResult {
+ /// Authoritative allow-all state after the mutation
+ pub enabled: bool,
+ /// Whether the operation succeeded
+ pub success: bool,
+}
+
+/// Current full allow-all permission state.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct SessionPermissionsGetAllowAllResult {
+ /// Whether full allow-all permissions are currently active
+ pub enabled: bool,
+}
+
/// Indicates whether the operation succeeded.
///
///
@@ -11488,6 +11828,9 @@ pub struct SessionMetadataSnapshotResultWorkspace {
pub struct SessionMetadataSnapshotResult {
/// True when the session was detected to be in use by another process at construction time. Local consumers may surface a confirmation prompt before fully attaching. Always false for new sessions.
pub already_in_use: bool,
+ /// Runtime client name associated with the session (telemetry identifier).
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub client_name: Option
,
/// The current agent mode for this session (e.g., 'interactive', 'plan', 'autopilot')
pub current_mode: MetadataSnapshotCurrentMode,
/// User-provided name supplied at session construction (via `--name`), if any. Immutable after construction.
@@ -12196,6 +12539,270 @@ pub enum AgentInfoSource {
Unknown,
}
+/// Kind of attention required when status === "attention". Meaningful only when status === "attention".
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistryLiveTargetEntryAttentionKind {
+ /// Session is blocked on an unrecoverable error
+ #[serde(rename = "error")]
+ Error,
+ /// Session is waiting for a tool-permission decision
+ #[serde(rename = "permission")]
+ Permission,
+ /// Session is waiting for the user to approve or reject a plan
+ #[serde(rename = "exit_plan")]
+ ExitPlan,
+ /// Session is waiting on an elicitation prompt
+ #[serde(rename = "elicitation")]
+ Elicitation,
+ /// Session is waiting for free-form user input
+ #[serde(rename = "user_input")]
+ UserInput,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Process kind tag for the registry entry
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistryLiveTargetEntryKind {
+ /// Interactive Copilot CLI exposing a UI server (legacy/normal CLI process)
+ #[serde(rename = "ui-server")]
+ UiServer,
+ /// Headless `--server --managed-server` child spawned by a controller
+ #[serde(rename = "managed-server")]
+ ManagedServer,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// How the most recent turn ended (clean vs aborted). Lets the renderer distinguish done from done_cancelled.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistryLiveTargetEntryLastTerminalEvent {
+ /// Last turn ended cleanly (model returned a final assistant message)
+ #[serde(rename = "turn_end")]
+ TurnEnd,
+ /// Last turn was aborted (e.g. user interrupted)
+ #[serde(rename = "abort")]
+ Abort,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Coarse lifecycle status of the foreground session
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistryLiveTargetEntryStatus {
+ /// Session is actively processing a turn
+ #[serde(rename = "working")]
+ Working,
+ /// Session is idle, waiting for input
+ #[serde(rename = "waiting")]
+ Waiting,
+ /// Last turn completed successfully
+ #[serde(rename = "done")]
+ Done,
+ /// Session needs user attention (see attentionKind for the specific reason)
+ #[serde(rename = "attention")]
+ Attention,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Categorized reason for log-open failure
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistryLogCaptureOpenErrorReason {
+ /// Filesystem permission denied opening the log file
+ #[serde(rename = "permission")]
+ Permission,
+ /// No space left on device
+ #[serde(rename = "disk_full")]
+ DiskFull,
+ /// Other / uncategorized open failure
+ #[serde(rename = "other")]
+ Other,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Discriminator: child_process.spawn itself failed
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnErrorKind {
+ #[serde(rename = "spawn-error")]
+ #[default]
+ SpawnError,
+}
+
+/// Permission posture for the new session. 'yolo' requires the controller-local session to currently be in allow-all mode.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnPermissionMode {
+ /// Standard permission posture (prompts for each request)
+ #[serde(rename = "default")]
+ Default,
+ /// Full allow-all (requires the controller-local session to currently be in allow-all mode)
+ #[serde(rename = "yolo")]
+ Yolo,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Discriminator: spawn succeeded but child never registered
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnRegistryTimeoutKind {
+ #[serde(rename = "registry-timeout")]
+ #[default]
+ RegistryTimeout,
+}
+
+/// Discriminator: managed-server child spawned successfully
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnSpawnedKind {
+ #[serde(rename = "spawned")]
+ #[default]
+ Spawned,
+}
+
+/// Which parameter field was invalid. Omitted when the rejection is not field-specific.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnValidationErrorField {
+ /// The cwd parameter
+ #[serde(rename = "cwd")]
+ Cwd,
+ /// The session name parameter
+ #[serde(rename = "name")]
+ Name,
+ /// The agentName parameter
+ #[serde(rename = "agentName")]
+ AgentName,
+ /// The model parameter
+ #[serde(rename = "model")]
+ Model,
+ /// The permissionMode parameter
+ #[serde(rename = "permissionMode")]
+ PermissionMode,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Discriminator: synchronous pre-validation rejected the request
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnValidationErrorKind {
+ #[serde(rename = "validation-error")]
+ #[default]
+ ValidationError,
+}
+
+/// Categorized reason for the rejection. Low-cardinality enum so telemetry can aggregate by reason without leaking raw paths or agent/model names.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AgentRegistrySpawnValidationErrorReason {
+ /// Provided cwd does not exist on disk
+ #[serde(rename = "cwd-not-found")]
+ CwdNotFound,
+ /// Provided cwd exists but is not a directory
+ #[serde(rename = "cwd-not-directory")]
+ CwdNotDirectory,
+ /// Session name failed validateSessionName
+ #[serde(rename = "invalid-name")]
+ InvalidName,
+ /// Requested agent name was not found in builtin or custom agents
+ #[serde(rename = "unknown-agent")]
+ UnknownAgent,
+ /// Requested model is not available to this session
+ #[serde(rename = "unknown-model")]
+ UnknownModel,
+ /// Caller asked for permissionMode='yolo' but the controller is not currently in allow-all mode
+ #[serde(rename = "yolo-not-allowed")]
+ YoloNotAllowed,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Outcome of an agentRegistry.spawn call.
+///
+///
+///
+/// **Experimental.** This type is part of an experimental wire-protocol surface
+/// and may change or be removed in future SDK or CLI releases.
+///
+///
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(untagged)]
+pub enum AgentRegistrySpawnResult {
+ Spawned(AgentRegistrySpawnSpawned),
+ SpawnError(AgentRegistrySpawnError),
+ RegistryTimeout(AgentRegistrySpawnRegistryTimeout),
+ ValidationError(AgentRegistrySpawnValidationError),
+}
+
/// API-key authentication for non-GitHub LLM providers (e.g. when running BYOM-style).
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum ApiKeyAuthInfoType {
diff --git a/rust/src/generated/rpc.rs b/rust/src/generated/rpc.rs
index c0c793fe0..e89722ff9 100644
--- a/rust/src/generated/rpc.rs
+++ b/rust/src/generated/rpc.rs
@@ -27,6 +27,13 @@ impl<'a> ClientRpc<'a> {
}
}
+ /// `agentRegistry.*` sub-namespace.
+ pub fn agent_registry(&self) -> ClientRpcAgentRegistry<'a> {
+ ClientRpcAgentRegistry {
+ client: self.client,
+ }
+ }
+
/// `mcp.*` sub-namespace.
pub fn mcp(&self) -> ClientRpcMcp<'a> {
ClientRpcMcp {
@@ -164,6 +171,45 @@ impl<'a> ClientRpcAccount<'a> {
}
}
+/// `agentRegistry.*` RPCs.
+#[derive(Clone, Copy)]
+pub struct ClientRpcAgentRegistry<'a> {
+ pub(crate) client: &'a Client,
+}
+
+impl<'a> ClientRpcAgentRegistry<'a> {
+ /// Spawns a managed-server child with the supplied configuration and returns a discriminated-union result. The caller (typically the CLI controller) is responsible for attaching to the spawned child and sending any follow-up prompt. When the controller-local spawn gate is closed the server returns JSON-RPC MethodNotFound.
+ ///
+ /// Wire method: `agentRegistry.spawn`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - Inputs to spawn a managed-server child via the controller's spawn delegate.
+ ///
+ /// # Returns
+ ///
+ /// Outcome of an agentRegistry.spawn call.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn spawn(
+ &self,
+ params: AgentRegistrySpawnRequest,
+ ) -> Result {
+ let wire_params = serde_json::to_value(params)?;
+ let _value = self
+ .client
+ .call(rpc_methods::AGENTREGISTRY_SPAWN, Some(wire_params))
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+}
+
/// `mcp.*` RPCs.
#[derive(Clone, Copy)]
pub struct ClientRpcMcp<'a> {
@@ -505,7 +551,7 @@ impl<'a> ClientRpcSessions<'a> {
///
/// # Parameters
///
- /// * `params` - Optional metadata-load limit and context filter applied to the returned sessions.
+ /// * `params` - Optional metadata-load limit and filters applied to the returned sessions.
///
/// # Returns
///
@@ -3743,6 +3789,70 @@ impl<'a> SessionRpcPermissions<'a> {
Ok(serde_json::from_value(_value)?)
}
+ /// Enables or disables full allow-all permissions (tools, paths, and URLs) for the session. Used by attach-mode clients (e.g. LocalRpcSession's `/allow-all` forwarder) to flip the target session's permission state. Unlike `setApproveAll`, this swaps in the unrestricted path and URL managers and emits `session.permissions_changed` on transition. The result returns the authoritative post-mutation state so callers can update their local mirrors without racing the `session.permissions_changed` notification on the same wire.
+ ///
+ /// Wire method: `session.permissions.setAllowAll`.
+ ///
+ /// # Parameters
+ ///
+ /// * `params` - Whether to enable full allow-all permissions for the session.
+ ///
+ /// # Returns
+ ///
+ /// Indicates whether the operation succeeded and reports the post-mutation state.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn set_allow_all(
+ &self,
+ params: PermissionsSetAllowAllRequest,
+ ) -> Result {
+ let mut wire_params = serde_json::to_value(params)?;
+ wire_params["sessionId"] = serde_json::Value::String(self.session.id().to_string());
+ let _value = self
+ .session
+ .client()
+ .call(
+ rpc_methods::SESSION_PERMISSIONS_SETALLOWALL,
+ Some(wire_params),
+ )
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+
+ /// Returns whether full allow-all permissions are currently active for the session.
+ ///
+ /// Wire method: `session.permissions.getAllowAll`.
+ ///
+ /// # Returns
+ ///
+ /// Current full allow-all permission state.
+ ///
+ ///
+ ///
+ /// **Experimental.** This API is part of an experimental wire-protocol surface
+ /// and may change or be removed in future SDK or CLI releases. Pin both the
+ /// SDK and CLI versions if your code depends on it.
+ ///
+ ///
+ pub async fn get_allow_all(&self) -> Result {
+ let wire_params = serde_json::json!({ "sessionId": self.session.id() });
+ let _value = self
+ .session
+ .client()
+ .call(
+ rpc_methods::SESSION_PERMISSIONS_GETALLOWALL,
+ Some(wire_params),
+ )
+ .await?;
+ Ok(serde_json::from_value(_value)?)
+ }
+
/// Adds or removes session-scoped or location-scoped permission rules.
///
/// Wire method: `session.permissions.modifyRules`.
diff --git a/rust/src/generated/session_events.rs b/rust/src/generated/session_events.rs
index 6605ecbde..ea9fdbecd 100644
--- a/rust/src/generated/session_events.rs
+++ b/rust/src/generated/session_events.rs
@@ -25,6 +25,8 @@ pub enum SessionEventType {
SessionScheduleCreated,
#[serde(rename = "session.schedule_cancelled")]
SessionScheduleCancelled,
+ #[serde(rename = "session.autopilot_objective_changed")]
+ SessionAutopilotObjectiveChanged,
#[serde(rename = "session.info")]
SessionInfo,
#[serde(rename = "session.warning")]
@@ -33,6 +35,8 @@ pub enum SessionEventType {
SessionModelChange,
#[serde(rename = "session.mode_changed")]
SessionModeChanged,
+ #[serde(rename = "session.permissions_changed")]
+ SessionPermissionsChanged,
#[serde(rename = "session.plan_changed")]
SessionPlanChanged,
#[serde(rename = "session.workspace_file_changed")]
@@ -109,6 +113,8 @@ pub enum SessionEventType {
HookStart,
#[serde(rename = "hook.end")]
HookEnd,
+ #[serde(rename = "hook.progress")]
+ HookProgress,
#[serde(rename = "system.message")]
SystemMessage,
#[serde(rename = "system.notification")]
@@ -205,6 +211,8 @@ pub enum SessionEventData {
SessionScheduleCreated(SessionScheduleCreatedData),
#[serde(rename = "session.schedule_cancelled")]
SessionScheduleCancelled(SessionScheduleCancelledData),
+ #[serde(rename = "session.autopilot_objective_changed")]
+ SessionAutopilotObjectiveChanged(SessionAutopilotObjectiveChangedData),
#[serde(rename = "session.info")]
SessionInfo(SessionInfoData),
#[serde(rename = "session.warning")]
@@ -213,6 +221,8 @@ pub enum SessionEventData {
SessionModelChange(SessionModelChangeData),
#[serde(rename = "session.mode_changed")]
SessionModeChanged(SessionModeChangedData),
+ #[serde(rename = "session.permissions_changed")]
+ SessionPermissionsChanged(SessionPermissionsChangedData),
#[serde(rename = "session.plan_changed")]
SessionPlanChanged(SessionPlanChangedData),
#[serde(rename = "session.workspace_file_changed")]
@@ -289,6 +299,8 @@ pub enum SessionEventData {
HookStart(HookStartData),
#[serde(rename = "hook.end")]
HookEnd(HookEndData),
+ #[serde(rename = "hook.progress")]
+ HookProgress(HookProgressData),
#[serde(rename = "system.message")]
SystemMessage(SystemMessageData),
#[serde(rename = "system.notification")]
@@ -568,6 +580,20 @@ pub struct SessionScheduleCancelledData {
pub id: i64,
}
+/// Session event "session.autopilot_objective_changed". Autopilot objective state file operation details indicating what changed
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct SessionAutopilotObjectiveChangedData {
+ /// Current autopilot objective id, if one exists
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub id: Option,
+ /// The type of operation performed on the autopilot objective state file
+ pub operation: AutopilotObjectiveChangedOperation,
+ /// Current autopilot objective status, if one exists
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub status: Option,
+}
+
/// Session event "session.info". Informational message for timeline display with categorization
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -636,6 +662,16 @@ pub struct SessionModeChangedData {
pub previous_mode: SessionMode,
}
+/// Session event "session.permissions_changed". Permissions change details carrying the aggregate allow-all boolean transition.
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct SessionPermissionsChangedData {
+ /// Aggregate allow-all flag after the change
+ pub allow_all_permissions: bool,
+ /// Aggregate allow-all flag before the change
+ pub previous_allow_all_permissions: bool,
+}
+
/// Session event "session.plan_changed". Plan file operation details indicating what changed
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -1462,6 +1498,9 @@ pub struct ToolExecutionStartData {
/// Arguments passed to the tool
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option,
+ /// When true, the tool output should be displayed expanded (verbatim) in the CLI timeline
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub display_verbatim: Option,
/// Name of the MCP server hosting this tool, when the tool is an MCP tool
#[serde(skip_serializing_if = "Option::is_none")]
pub mcp_server_name: Option,
@@ -1989,6 +2028,14 @@ pub struct HookEndData {
pub success: bool,
}
+/// Session event "hook.progress". Ephemeral progress update from a running hook process
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct HookProgressData {
+ /// Human-readable progress message from the hook process
+ pub message: String,
+}
+
/// Metadata about the prompt template and its construction
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -2844,6 +2891,9 @@ pub struct ExternalToolRequestedData {
/// W3C Trace Context tracestate header for the execute_tool span
#[serde(skip_serializing_if = "Option::is_none")]
pub tracestate: Option,
+ /// Active session working directory, when known.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub working_directory: Option,
}
/// Session event "external_tool.completed". External tool completion notification signaling UI dismissal
@@ -3296,6 +3346,45 @@ pub enum ReasoningSummary {
Unknown,
}
+/// The type of operation performed on the autopilot objective state file
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AutopilotObjectiveChangedOperation {
+ /// Autopilot objective state file was created for a new objective.
+ #[serde(rename = "create")]
+ Create,
+ /// Autopilot objective state file was updated for an existing objective.
+ #[serde(rename = "update")]
+ Update,
+ /// Autopilot objective state file was deleted or cleared.
+ #[serde(rename = "delete")]
+ Delete,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
+/// Current autopilot objective status, if one exists
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+pub enum AutopilotObjectiveChangedStatus {
+ /// Objective is active and can drive autopilot continuations.
+ #[serde(rename = "active")]
+ Active,
+ /// Objective is paused and will not drive autopilot continuations.
+ #[serde(rename = "paused")]
+ Paused,
+ /// Legacy objective state indicating the previous continuation cap was reached.
+ #[serde(rename = "cap_reached")]
+ CapReached,
+ /// Objective was completed by the agent.
+ #[serde(rename = "completed")]
+ Completed,
+ /// Unknown variant for forward compatibility.
+ #[default]
+ #[serde(other)]
+ Unknown,
+}
+
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum SessionModelChangeDataContextTier {
/// Default context tier with standard context window size.
diff --git a/test/harness/package-lock.json b/test/harness/package-lock.json
index d4360b22a..903a12d1a 100644
--- a/test/harness/package-lock.json
+++ b/test/harness/package-lock.json
@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
- "@github/copilot": "^1.0.55-1",
+ "@github/copilot": "^1.0.55-4",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",
@@ -464,9 +464,9 @@
}
},
"node_modules/@github/copilot": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.55-1.tgz",
- "integrity": "sha512-P8uFRbbKWyImqPWaHub8dCt2R4f/GWjY/4xyf3uyHs5wZfSPLzh9DvagAA2ryQjuGHsgCZeDscUkJoYW+yn2UA==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.55-4.tgz",
+ "integrity": "sha512-998fK3QIrajrUV94l8piSjDD8wnOGosCWE/0YBKoyOhvlqAKAN0smmgizu4unj8fGZKaX1uBNT+qOrxAS9tY/g==",
"dev": true,
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
@@ -476,20 +476,20 @@
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "1.0.55-1",
- "@github/copilot-darwin-x64": "1.0.55-1",
- "@github/copilot-linux-arm64": "1.0.55-1",
- "@github/copilot-linux-x64": "1.0.55-1",
- "@github/copilot-linuxmusl-arm64": "1.0.55-1",
- "@github/copilot-linuxmusl-x64": "1.0.55-1",
- "@github/copilot-win32-arm64": "1.0.55-1",
- "@github/copilot-win32-x64": "1.0.55-1"
+ "@github/copilot-darwin-arm64": "1.0.55-4",
+ "@github/copilot-darwin-x64": "1.0.55-4",
+ "@github/copilot-linux-arm64": "1.0.55-4",
+ "@github/copilot-linux-x64": "1.0.55-4",
+ "@github/copilot-linuxmusl-arm64": "1.0.55-4",
+ "@github/copilot-linuxmusl-x64": "1.0.55-4",
+ "@github/copilot-win32-arm64": "1.0.55-4",
+ "@github/copilot-win32-x64": "1.0.55-4"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.55-1.tgz",
- "integrity": "sha512-0z5P/FZZ7OIJbcs+WWIwkCcY7+sRGxmL80GTvT6x0QiJdJLqLlvwcX/Pfhomp4NxwEYBAK3I51F8I8A3GacjuQ==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.55-4.tgz",
+ "integrity": "sha512-byEpmUpmFnVfDNONaseG/hKBqQWnyRElViu1d+MpoupzOHlfo8/O2ZA7Fq8RkkqrXcCipjhUDBNavdl7j6EbrA==",
"cpu": [
"arm64"
],
@@ -504,9 +504,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.55-1.tgz",
- "integrity": "sha512-334+JCBb0iqg7omB2szc+/Ii2xkq81HKaer+mTaXj+1kHUGtfZacmzejwvutl6CxKTuZ8E9BcozP65KEYLBbwQ==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.55-4.tgz",
+ "integrity": "sha512-4/+tldImEu4tLo9x+wiY/7pnOLlJ8GkgUG23izMqIQ1I9otM85irfIrtNHy/bvvT+RQ/HYikNlGv00H2nhIuhw==",
"cpu": [
"x64"
],
@@ -521,9 +521,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.55-1.tgz",
- "integrity": "sha512-UTZuNCWzEaeqjhEyz+BUPNECPy5b6KKnym60q9x9dZw1ufqQSxKdhu02p62x53PA1fd4l6N8FRdhoHOOhKfEkQ==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.55-4.tgz",
+ "integrity": "sha512-LwDvphIUMs94HShErbDu0foeasqi/IqIUDo4azWqUFrAp4n4jsiH3MBpC8UwvlSBJSSsND3zGxMrCD/fptqWjA==",
"cpu": [
"arm64"
],
@@ -538,9 +538,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.55-1.tgz",
- "integrity": "sha512-IwKgCrSXy7zeQlGgf8tZue8eaM/TcxVxXvpijXUTY0F9KXldzO0xv3WAgh5540ALH+jwkLI85UuPq5aoVCBuCA==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.55-4.tgz",
+ "integrity": "sha512-lp8Ae3V/8hB6HuUdWGrdm8au+HyfkFzrvf/rxk7YJe+zkq4D0O+WLi/7JbG8oZ5spQhzSyac/9gUu830nQu2WA==",
"cpu": [
"x64"
],
@@ -555,9 +555,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-arm64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.55-1.tgz",
- "integrity": "sha512-3Uu9JOYU9zmr5dcYBQZHwXF1JpzVPZXpBau0khLd6OFZkA6al1D2miNmw4nO/WoT0IfheW6EhYUBN1WuthmXTw==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.55-4.tgz",
+ "integrity": "sha512-4xJCXKHw9OZba+1ysUNxcdkRXK4Mf6s8VA9klcCAnY4bSvkTDVNQVGQuonxjvLGjagyORLymINbKRg6GnrKK/Q==",
"cpu": [
"arm64"
],
@@ -572,9 +572,9 @@
}
},
"node_modules/@github/copilot-linuxmusl-x64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.55-1.tgz",
- "integrity": "sha512-0szVr6ejslqi6O+Rbmx5ETRTEMFpGv9A9qiK3E0XuzE4uXSPyPad/wOSSE2yat7YEqUVU8J/HIUKU9TpBpiWbA==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.55-4.tgz",
+ "integrity": "sha512-z3U6LsXcBssAeolWNlcw+nUm3cSKHvYDSGynvdYVORaEMNN/qemx4ICRAFNfTVRmP+t/3IWtTpCtHm2U7pSO9A==",
"cpu": [
"x64"
],
@@ -589,9 +589,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.55-1.tgz",
- "integrity": "sha512-h0LXoTv7cT8J/RVuocWbwd5+VYbxJk5/s7EsMXn+FR6m8ZqYZdBjYMAyDe9v/HcCyAPY0xLYRKt6k3Jb17Upag==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.55-4.tgz",
+ "integrity": "sha512-j2kqG0c2JJvOZS2O5E/Ye8F6htA7o7UHpJ55vH6USfzColL0YI51yrP3fZVrDC0nhhtfLnVBK6Q0nv+riZnaew==",
"cpu": [
"arm64"
],
@@ -606,9 +606,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "1.0.55-1",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.55-1.tgz",
- "integrity": "sha512-lxaRdPd5NZaC5YyMOTt2uTV34fQyuClg71JAYoKVZ1w7Dc6E+f7+WMM3L67ZieornfgG80h4QMNtfpVpCVgpAQ==",
+ "version": "1.0.55-4",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.55-4.tgz",
+ "integrity": "sha512-4za8pRAEO6z9SOPP3IYVpZHn4yvPtjAMH17XKYEVYFHTZ+NNHjzYYfyqwhZfJlGgvOOkuh3kYbNWms5a2DW/Jg==",
"cpu": [
"x64"
],
diff --git a/test/harness/package.json b/test/harness/package.json
index 548fcb575..3b1c589fe 100644
--- a/test/harness/package.json
+++ b/test/harness/package.json
@@ -11,7 +11,7 @@
"test": "vitest run"
},
"devDependencies": {
- "@github/copilot": "^1.0.55-1",
+ "@github/copilot": "^1.0.55-4",
"@modelcontextprotocol/sdk": "^1.26.0",
"@types/node": "^25.3.3",
"@types/node-forge": "^1.3.14",
From b67ecc4cb4195cb635944b5cfc0170716fec913b Mon Sep 17 00:00:00 2001
From: Stephen Toub
Date: Wed, 27 May 2026 09:41:33 -0400
Subject: [PATCH 2/2] Fix Rust schema update tests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
rust/src/canvas.rs | 3 +++
rust/tests/e2e/rpc_server.rs | 3 +++
2 files changed, 6 insertions(+)
diff --git a/rust/src/canvas.rs b/rust/src/canvas.rs
index 15cbb031d..2d5b5b035 100644
--- a/rust/src/canvas.rs
+++ b/rust/src/canvas.rs
@@ -185,6 +185,7 @@ mod tests {
instance_id: "echo-1".to_string(),
input: Some(json!({ "x": 1 })),
host: None,
+ session: None,
})
.await
.unwrap();
@@ -206,6 +207,7 @@ mod tests {
action_name: "shout".to_string(),
input: Some(json!("hi")),
host: None,
+ session: None,
})
.await
.unwrap();
@@ -240,6 +242,7 @@ mod tests {
action_name: "anything".to_string(),
input: Some(Value::Null),
host: None,
+ session: None,
})
.await
.unwrap_err();
diff --git a/rust/tests/e2e/rpc_server.rs b/rust/tests/e2e/rpc_server.rs
index d89d69458..1e5b817bf 100644
--- a/rust/tests/e2e/rpc_server.rs
+++ b/rust/tests/e2e/rpc_server.rs
@@ -326,6 +326,7 @@ async fn should_list_find_and_inspect_persisted_session_state() {
git_root: None,
repository: None,
}),
+ include_detached: None,
metadata_limit: Some(10),
})
.await
@@ -423,6 +424,7 @@ async fn should_enrich_basic_session_metadata() {
.expect("create session");
let session_id = session.id().clone();
let metadata = SessionMetadata {
+ client_name: None,
context: Some(SessionContext {
branch: None,
cwd: ctx.work_dir().display().to_string(),
@@ -430,6 +432,7 @@ async fn should_enrich_basic_session_metadata() {
host_type: None,
repository: None,
}),
+ is_detached: None,
is_remote: false,
mc_task_id: None,
modified_time: "2026-01-01T00:00:00.000Z".to_string(),