Skip to content

Commit 7373264

Browse files
committed
Make Rust managed bypass modes forward compatible
Replace the closed enum with an open string field and retain well-known policies as public constants. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e98a14a6-7ad4-4cb6-b808-e56547701c19
1 parent 2a386ac commit 7373264

2 files changed

Lines changed: 24 additions & 23 deletions

File tree

rust/src/types.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,16 +1760,14 @@ pub struct CopilotExpAssignmentResponse {
17601760
pub assignment_context: String,
17611761
}
17621762

1763-
/// Controls whether bypass-permissions mode is available in a managed session.
1764-
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
1765-
#[serde(rename_all = "lowercase")]
1766-
#[non_exhaustive]
1767-
pub enum DisableBypassPermissionsMode {
1768-
/// Turn off bypass-permissions mode.
1769-
Disable,
1763+
/// Well-known managed bypass-permissions policies.
1764+
pub struct DisableBypassPermissionsModes;
1765+
1766+
impl DisableBypassPermissionsModes {
1767+
/// Turn off bypass-permissions mode entirely.
1768+
pub const DISABLE: &'static str = "disable";
17701769
/// Permit automatic bypass but block full allow-all.
1771-
#[serde(rename = "allow-auto-only")]
1772-
AllowAutoOnly,
1770+
pub const ALLOW_AUTO_ONLY: &'static str = "allow-auto-only";
17731771
}
17741772

17751773
/// Permission rules injected as a managed-settings layer at session bootstrap.
@@ -1784,10 +1782,11 @@ pub enum DisableBypassPermissionsMode {
17841782
#[serde(rename_all = "camelCase")]
17851783
#[non_exhaustive]
17861784
pub struct ManagedSettingsPermissions {
1787-
/// Restricts bypass-permissions mode for the session. Serialized as
1788-
/// `disableBypassPermissionsMode`.
1785+
/// Restricts bypass-permissions mode for the session. See
1786+
/// [`DisableBypassPermissionsModes`] for well-known values. Unknown values
1787+
/// are forwarded so newer runtime policies fail closed.
17891788
#[serde(default, skip_serializing_if = "Option::is_none")]
1790-
pub disable_bypass_permissions_mode: Option<DisableBypassPermissionsMode>,
1789+
pub disable_bypass_permissions_mode: Option<String>,
17911790
/// Tool-permission patterns that are always denied.
17921791
#[serde(default, skip_serializing_if = "Option::is_none")]
17931792
pub deny: Option<Vec<String>>,
@@ -1801,11 +1800,8 @@ pub struct ManagedSettingsPermissions {
18011800

18021801
impl ManagedSettingsPermissions {
18031802
/// Sets the bypass-permissions policy for this managed layer.
1804-
pub fn with_disable_bypass_permissions_mode(
1805-
mut self,
1806-
value: DisableBypassPermissionsMode,
1807-
) -> Self {
1808-
self.disable_bypass_permissions_mode = Some(value);
1803+
pub fn with_disable_bypass_permissions_mode(mut self, value: impl Into<String>) -> Self {
1804+
self.disable_bypass_permissions_mode = Some(value.into());
18091805
self
18101806
}
18111807

rust/tests/session_test.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use github_copilot_sdk::session_events::{
2222
};
2323
use github_copilot_sdk::types::{
2424
CanvasProviderIdentity, CloudSessionOptions, CloudSessionRepository, CommandContext,
25-
CommandDefinition, CommandHandler, DeliveryMode, DisableBypassPermissionsMode,
25+
CommandDefinition, CommandHandler, DeliveryMode, DisableBypassPermissionsModes,
2626
ElicitationRequest, ElicitationResult, ExitPlanModeData, ExtensionInfo, ManagedSettings,
2727
ManagedSettingsPermissions, MessageOptions, PermissionDecisionContext,
2828
PermissionDecisionOutcome, PermissionDecisionSource, PermissionDecisionSurface, RequestId,
@@ -790,13 +790,18 @@ async fn create_session_sends_canvas_wire_fields() {
790790

791791
#[test]
792792
fn managed_bypass_permissions_modes_use_wire_values() {
793+
let known = ManagedSettingsPermissions::default()
794+
.with_disable_bypass_permissions_mode(DisableBypassPermissionsModes::ALLOW_AUTO_ONLY);
793795
assert_eq!(
794-
serde_json::to_value(DisableBypassPermissionsMode::Disable).unwrap(),
795-
serde_json::json!("disable")
796+
serde_json::to_value(known).unwrap()["disableBypassPermissionsMode"],
797+
"allow-auto-only"
796798
);
799+
800+
let future = ManagedSettingsPermissions::default()
801+
.with_disable_bypass_permissions_mode("future-fail-closed-mode");
797802
assert_eq!(
798-
serde_json::to_value(DisableBypassPermissionsMode::AllowAutoOnly).unwrap(),
799-
serde_json::json!("allow-auto-only")
803+
serde_json::to_value(future).unwrap()["disableBypassPermissionsMode"],
804+
"future-fail-closed-mode"
800805
);
801806
}
802807

@@ -808,7 +813,7 @@ async fn create_and_resume_send_managed_settings_permissions() {
808813

809814
let managed = ManagedSettings::default().with_permissions(
810815
ManagedSettingsPermissions::default()
811-
.with_disable_bypass_permissions_mode(DisableBypassPermissionsMode::AllowAutoOnly)
816+
.with_disable_bypass_permissions_mode(DisableBypassPermissionsModes::ALLOW_AUTO_ONLY)
812817
.with_deny(vec!["shell(rm*)".to_string()])
813818
.with_ask(vec!["write".to_string()])
814819
.with_allow(vec![]),

0 commit comments

Comments
 (0)