diff --git a/code-rs/app-server-protocol/src/protocol/common.rs b/code-rs/app-server-protocol/src/protocol/common.rs index 87716e0c9a5..57e9eec9bf9 100644 --- a/code-rs/app-server-protocol/src/protocol/common.rs +++ b/code-rs/app-server-protocol/src/protocol/common.rs @@ -794,6 +794,16 @@ client_request_definitions! { serialization: global("config"), response: v2::ExperimentalFeatureEnablementSetResponse, }, + RemoteControlStatusRead => "remoteControl/status/read" { + params: v2::RemoteControlStatusReadParams, + serialization: global_shared_read("config"), + response: v2::RemoteControlStatusReadResponse, + }, + RemoteControlEnable => "remoteControl/enable" { + params: v2::RemoteControlEnableParams, + serialization: global("config"), + response: v2::RemoteControlEnableResponse, + }, #[experimental("collaborationMode/list")] /// Lists collaboration mode presets. CollaborationModeList => "collaborationMode/list" { @@ -2610,6 +2620,36 @@ mod tests { Ok(()) } + #[test] + fn serialize_remote_control_startup_requests() -> Result<()> { + let status_read = ClientRequest::RemoteControlStatusRead { + request_id: RequestId::Integer(9), + params: v2::RemoteControlStatusReadParams::default(), + }; + assert_eq!( + json!({ + "method": "remoteControl/status/read", + "id": 9, + "params": {} + }), + serde_json::to_value(&status_read)?, + ); + + let enable = ClientRequest::RemoteControlEnable { + request_id: RequestId::Integer(10), + params: v2::RemoteControlEnableParams::default(), + }; + assert_eq!( + json!({ + "method": "remoteControl/enable", + "id": 10, + "params": {} + }), + serde_json::to_value(&enable)?, + ); + Ok(()) + } + #[test] fn serialize_thread_background_terminals_clean() -> Result<()> { let request = ClientRequest::ThreadBackgroundTerminalsClean { diff --git a/code-rs/app-server-protocol/src/protocol/v2/plugin.rs b/code-rs/app-server-protocol/src/protocol/v2/plugin.rs index 6f425b4a6a0..9d2c1e79bdb 100644 --- a/code-rs/app-server-protocol/src/protocol/v2/plugin.rs +++ b/code-rs/app-server-protocol/src/protocol/v2/plugin.rs @@ -137,6 +137,10 @@ pub enum PluginListMarketplaceKind { #[serde(rename = "shared-with-me")] #[ts(rename = "shared-with-me")] SharedWithMe, + /// Legacy Desktop catalog filter accepted for startup compatibility. + #[serde(rename = "vertical")] + #[ts(rename = "vertical")] + Vertical, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)] diff --git a/code-rs/app-server-protocol/src/protocol/v2/remote_control.rs b/code-rs/app-server-protocol/src/protocol/v2/remote_control.rs index 7d6383f4680..145d0e8b0b6 100644 --- a/code-rs/app-server-protocol/src/protocol/v2/remote_control.rs +++ b/code-rs/app-server-protocol/src/protocol/v2/remote_control.rs @@ -3,6 +3,32 @@ use serde::Deserialize; use serde::Serialize; use ts_rs::TS; +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export_to = "v2/")] +pub struct RemoteControlStatusReadParams {} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export_to = "v2/")] +pub struct RemoteControlStatusReadResponse { + pub status: RemoteControlConnectionStatus, + pub environment_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export_to = "v2/")] +pub struct RemoteControlEnableParams {} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export_to = "v2/")] +pub struct RemoteControlEnableResponse { + pub status: RemoteControlConnectionStatus, + pub environment_id: Option, +} + /// Current remote-control connection status and environment id exposed to clients. #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] #[serde(rename_all = "camelCase")] diff --git a/code-rs/app-server-protocol/src/protocol/v2/tests.rs b/code-rs/app-server-protocol/src/protocol/v2/tests.rs index da0ad2c10e0..25422ff3b4a 100644 --- a/code-rs/app-server-protocol/src/protocol/v2/tests.rs +++ b/code-rs/app-server-protocol/src/protocol/v2/tests.rs @@ -2727,6 +2727,7 @@ fn plugin_list_params_serializes_marketplace_kind_filter() { PluginListMarketplaceKind::Local, PluginListMarketplaceKind::WorkspaceDirectory, PluginListMarketplaceKind::SharedWithMe, + PluginListMarketplaceKind::Vertical, ]), }) .unwrap(), @@ -2736,11 +2737,27 @@ fn plugin_list_params_serializes_marketplace_kind_filter() { "local", "workspace-directory", "shared-with-me", + "vertical", ], }), ); } +#[test] +fn plugin_list_params_deserializes_vertical_marketplace_kind() { + assert_eq!( + serde_json::from_value::(json!({ + "cwds": null, + "marketplaceKinds": ["vertical"], + })) + .unwrap(), + PluginListParams { + cwds: None, + marketplace_kinds: Some(vec![PluginListMarketplaceKind::Vertical]), + }, + ); +} + #[test] fn plugin_read_params_serialization_uses_install_source_fields() { let marketplace_path = if cfg!(windows) { diff --git a/code-rs/app-server/src/message_processor.rs b/code-rs/app-server/src/message_processor.rs index 7006c403431..dbeb498bdb3 100644 --- a/code-rs/app-server/src/message_processor.rs +++ b/code-rs/app-server/src/message_processor.rs @@ -54,6 +54,9 @@ use codex_app_server_protocol::JSONRPCErrorError; use codex_app_server_protocol::JSONRPCNotification; use codex_app_server_protocol::JSONRPCRequest; use codex_app_server_protocol::JSONRPCResponse; +use codex_app_server_protocol::RemoteControlConnectionStatus; +use codex_app_server_protocol::RemoteControlEnableResponse; +use codex_app_server_protocol::RemoteControlStatusReadResponse; use codex_app_server_protocol::ServerRequestPayload; use codex_app_server_protocol::experimental_required_message; use codex_arg0::Arg0DispatchPaths; @@ -1082,6 +1085,18 @@ impl MessageProcessor { .experimental_feature_list(params) .await } + ClientRequest::RemoteControlStatusRead { .. } => Ok(Some(RemoteControlStatusReadResponse { + status: RemoteControlConnectionStatus::Disabled, + environment_id: None, + } + .into())), + // Desktop probes remote control during startup. Keep this as a harmless + // compatibility response until Every Code wires a real remote-control backend. + ClientRequest::RemoteControlEnable { .. } => Ok(Some(RemoteControlEnableResponse { + status: RemoteControlConnectionStatus::Disabled, + environment_id: None, + } + .into())), ClientRequest::CollaborationModeList { params, .. } => { self.catalog_processor.collaboration_mode_list(params).await } diff --git a/code-rs/app-server/src/request_processors/config_processor.rs b/code-rs/app-server/src/request_processors/config_processor.rs index cda2bbe61d8..6978bec925f 100644 --- a/code-rs/app-server/src/request_processors/config_processor.rs +++ b/code-rs/app-server/src/request_processors/config_processor.rs @@ -53,6 +53,7 @@ const SUPPORTED_EXPERIMENTAL_FEATURE_ENABLEMENT: &[&str] = &[ "apps", "memories", "plugins", + "remote_plugin", "remote_control", "tool_search", "tool_suggest",